diff --git a/.changeset/famous-deers-sell.md b/.changeset/famous-deers-sell.md new file mode 100644 index 000000000..898f9eee3 --- /dev/null +++ b/.changeset/famous-deers-sell.md @@ -0,0 +1,6 @@ +--- +'@status-im/status-network': patch +'hub': patch +--- + +add wallet connect diff --git a/.changeset/pretty-wasps-build.md b/.changeset/pretty-wasps-build.md new file mode 100644 index 000000000..f53d86883 --- /dev/null +++ b/.changeset/pretty-wasps-build.md @@ -0,0 +1,62 @@ +--- +'@status-im/components': patch +'hub': major +--- + +### Staking & Vault Management System + +- **New Hooks:** + + - Staking functionality with multiplier points tracking + - Vault locking mechanisms + - Token approval and withdrawal flows + - Account vaults management + - Faucet integration for testing + - Emergency mode functionality + +- **User Experience:** + - Lock status indicators in vault selection UI + - Improved table overflow handling + - Enhanced slider configuration for vault lockup periods + +### UI Components + +- **New Modals:** + + - Withdraw modal for vault withdrawals + - Lock configuration modal for vault locking + - Compound modal for compounding rewards + - Promo modal for staking page + - Action status component (formerly progress dialog) + +- **UI Improvements:** + - New icons added + - Enhanced vault table components + - Better modal state management + +### Authentication & Web3 Integration + +- **SIWE Integration:** + - Sign-In With Ethereum (SIWE) for wallet authentication + - ConnectKit integration for wallet connection + - Wagmi configuration and providers setup + +### State Management & Data Fetching + +- **Dependencies Added:** + - `@tanstack/react-query` for server state management + - `react-table` for table data management + - Improved overall state management patterns + +### Emergency Features + +- Emergency mode functionality for vault operations +- Enhanced safety controls for vault lockup periods + +## Refactoring & Maintenance + +### Code Quality Improvements + +- Simplified vault table action handlers +- Removed unnecessary onClick logic for modal state management +- Renamed progress dialog to action status component for clarity diff --git a/.npmrc b/.npmrc index 798eb5648..f54ec269c 100644 --- a/.npmrc +++ b/.npmrc @@ -17,4 +17,4 @@ engine-strict=true ignore-workspace-root-check=true ; https://pnpm.io/npmrc#node-options ; why: https://github.com/vercel/next.js/discussions/70423 -node-options=--network-family-autoselection-attempt-timeout=500 \ No newline at end of file +# node-options=--network-family-autoselection-attempt-timeout=500 \ No newline at end of file diff --git a/apps/api/package.json b/apps/api/package.json index 654bb640e..c17744c3d 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -17,22 +17,23 @@ "dependencies": { "@status-im/wallet": "workspace:*", "@trpc/client": "10.45.2", - "@trpc/server": "10.45.2", "@trpc/next": "10.45.2", + "@trpc/server": "10.45.2", + "next": "15.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "next": "15.3.0", "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5", + "@eslint/eslintrc": "^3.1.0", + "@next/eslint-plugin-next": "15.3.0", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", "eslint-config-next": "15.3.0", - "@eslint/eslintrc": "^3", - "globals": "^15.12.0" + "globals": "^15.12.0", + "typescript": "^5.6.2" }, "engines": { "node": "20.x" diff --git a/apps/hub/package.json b/apps/hub/package.json index bffe62278..f50d45453 100644 --- a/apps/hub/package.json +++ b/apps/hub/package.json @@ -14,28 +14,43 @@ "clean": "rimraf .next .vercel/output node_modules" }, "dependencies": { + "@hookform/devtools": "^4.3.1", + "@hookform/resolvers": "^3.1.1", + "@radix-ui/react-dialog": "^1.1.1", "@status-im/colors": "workspace:*", - "@status-im/icons": "workspace:*", "@status-im/components": "workspace:*", + "@status-im/icons": "workspace:*", "@status-im/status-network": "workspace:*", + "@status-im/wallet": "workspace:*", + "@tanstack/react-query": "5.66.0", + "@tanstack/react-table": "^8.21.3", "@vercel/analytics": "^1.5.0", + "connectkit": "^1.9.0", + "connectkit-next-siwe": "^0.3.0", + "cookie": "^1.0.2", "cva": "1.0.0-beta.1", "framer-motion": "^12.0.6", - "next": "15.1.6", + "iron-session": "^8.0.4", + "next": "15.3.0", "next-mdx-remote": "^5.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "pino-pretty": "^13.1.1", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-hook-form": "^7.45.1", "rehype-slug": "^6.0.0", + "siwe": "^2.3.2", "ts-pattern": "^5.6.2", - "zod": "^3.24.1" + "viem": "^2.21.1", + "wagmi": "2.15.2", + "zod": "^3.21.4" }, "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "^4.3.1", "@next/eslint-plugin-next": "15.3.0", "@status-im/eslint-config": "workspace:*", - "@ianvs/prettier-plugin-sort-imports": "^4.3.1", "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", + "@types/react": "19.1.0", + "@types/react-dom": "19.1.0", "eslint-config-next": "15.1.6", "eslint-plugin-tailwindcss": "^3.17.4", "lint-staged": "^15.4.3", diff --git a/apps/hub/postcss.config.mjs b/apps/hub/postcss.config.mjs index 1a69fd2a4..0dc456ad9 100644 --- a/apps/hub/postcss.config.mjs +++ b/apps/hub/postcss.config.mjs @@ -3,6 +3,6 @@ const config = { plugins: { tailwindcss: {}, }, -}; +} -export default config; +export default config diff --git a/apps/hub/public/modal/bg-gradient.png b/apps/hub/public/modal/bg-gradient.png new file mode 100644 index 000000000..f00944338 Binary files /dev/null and b/apps/hub/public/modal/bg-gradient.png differ diff --git a/apps/hub/public/modal/connector-1.png b/apps/hub/public/modal/connector-1.png new file mode 100644 index 000000000..c3b181104 Binary files /dev/null and b/apps/hub/public/modal/connector-1.png differ diff --git a/apps/hub/public/modal/connector-2.png b/apps/hub/public/modal/connector-2.png new file mode 100644 index 000000000..5e5f515f4 Binary files /dev/null and b/apps/hub/public/modal/connector-2.png differ diff --git a/apps/hub/public/modal/dragon.png b/apps/hub/public/modal/dragon.png new file mode 100644 index 000000000..d168ed178 Binary files /dev/null and b/apps/hub/public/modal/dragon.png differ diff --git a/apps/hub/public/piggy-bank.png b/apps/hub/public/piggy-bank.png new file mode 100644 index 000000000..68bd09bf5 Binary files /dev/null and b/apps/hub/public/piggy-bank.png differ diff --git a/apps/hub/src/app/_components/connect-button.tsx b/apps/hub/src/app/_components/connect-button.tsx new file mode 100644 index 000000000..dfa6a5c04 --- /dev/null +++ b/apps/hub/src/app/_components/connect-button.tsx @@ -0,0 +1,47 @@ +'use client' + +import { Button, ShortenAddress } from '@status-im/status-network/components' +import { ConnectKitButton } from 'connectkit' + +import type { ComponentProps } from 'react' + +type Props = { + size?: ComponentProps['size'] + label?: string + className?: string + /** If true, shows the label instead of the shortened address when connected */ + alwaysShowLabel?: boolean +} + +const ConnectButton = (props: Props) => { + const { + size = '32', + label = 'Connect wallet', + className, + alwaysShowLabel = false, + } = props + + return ( + + {({ show, isConnected, address }) => { + return ( + + ) + }} + + ) +} + +export { ConnectButton } +export type { Props as ConnectButtonProps } diff --git a/apps/hub/src/app/_components/emergency-bar.tsx b/apps/hub/src/app/_components/emergency-bar.tsx new file mode 100644 index 000000000..bb06dc246 --- /dev/null +++ b/apps/hub/src/app/_components/emergency-bar.tsx @@ -0,0 +1,32 @@ +import { AlertIcon } from '@status-im/icons/20' +import { ButtonLink } from '@status-im/status-network/components' + +const EmergencyBar = () => { + return ( +
+
+

+ Contracts have been compromised. +

+ } + href="/stake" + > + Withdraw funds + + {/* } + href="https://status.im/blog/contracts-compromised" + > + Learn More + */} +
+
+ ) +} + +export { EmergencyBar } diff --git a/apps/hub/src/app/_components/hub-layout.tsx b/apps/hub/src/app/_components/hub-layout.tsx index f198a6486..ea962d5b2 100644 --- a/apps/hub/src/app/_components/hub-layout.tsx +++ b/apps/hub/src/app/_components/hub-layout.tsx @@ -2,7 +2,10 @@ import { useState } from 'react' import { Divider, Footer } from '@status-im/status-network/components' +import { useReadContract } from 'wagmi' +import { STAKING_MANAGER } from '../_constants/address' +import { EmergencyBar } from './emergency-bar' import { Sidebar } from './sidebar' import { TopBar } from './top-bar' @@ -12,6 +15,14 @@ interface HubLayoutProps { export function HubLayout({ children }: HubLayoutProps) { const [sidebarOpen, setSidebarOpen] = useState(false) + const { data: emergencyModeEnabled } = useReadContract({ + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'emergencyModeEnabled', + query: { + refetchInterval: 30000, + }, + }) return (
@@ -20,6 +31,7 @@ export function HubLayout({ children }: HubLayoutProps) { {/* Main Content Area */}
+ {Boolean(emergencyModeEnabled) && }
{/* Sidebar */} setSidebarOpen(false)} /> diff --git a/apps/hub/src/app/_components/icons/close-icon.tsx b/apps/hub/src/app/_components/icons/close-icon.tsx new file mode 100644 index 000000000..bfc2c617a --- /dev/null +++ b/apps/hub/src/app/_components/icons/close-icon.tsx @@ -0,0 +1,20 @@ +import type { SVGProps } from 'react' + +const CloseIcon = (props: SVGProps) => ( + + + +) +export default CloseIcon diff --git a/apps/hub/src/app/_components/icons/index.ts b/apps/hub/src/app/_components/icons/index.ts index eba9c7c31..fbde49ee3 100644 --- a/apps/hub/src/app/_components/icons/index.ts +++ b/apps/hub/src/app/_components/icons/index.ts @@ -1,5 +1,6 @@ // Custom Figma icons exported directly from design export { default as BridgeIcon } from './bridge-icon' +export { default as CloseIcon } from './close-icon' export { default as DepositIcon } from './deposit-icon' export { default as DiscoverIcon } from './discover-icon' export { default as DocsIcon } from './docs-icon' @@ -12,8 +13,12 @@ export { default as LaunchIcon } from './launch-icon' export { default as MintIcon } from './mint-icon' export { default as PercentIcon } from './percent-icon' export { default as PlusIcon } from './plus-icon' +export { default as ProcessingIcon } from './processing-icon' +export { default as RejectIcon } from './reject-icon' export { default as SettingsIcon } from './settings-icon' +export { default as SNTIcon } from './snt-icon' export { default as StakeIcon } from './stake-icon' export { default as SubmitAppIcon } from './submit-app-icon' export { default as SwapIcon } from './swap-icon' export { default as TwitterIcon } from './twitter-icon' +export { default as VaultIcon } from './vault-icon' diff --git a/apps/hub/src/app/_components/icons/launch-icon.tsx b/apps/hub/src/app/_components/icons/launch-icon.tsx index 676cf2863..18e105759 100644 --- a/apps/hub/src/app/_components/icons/launch-icon.tsx +++ b/apps/hub/src/app/_components/icons/launch-icon.tsx @@ -1,52 +1,27 @@ -export default function LaunchIcon({ - className = '', - ...props -}: React.SVGProps) { - return ( - - - - - - - - - - - - - - ) -} +import type { SVGProps } from 'react' + +const LaunchIcon = (props: SVGProps) => ( + + + + +) +export default LaunchIcon diff --git a/apps/hub/src/app/_components/icons/processing-icon.tsx b/apps/hub/src/app/_components/icons/processing-icon.tsx new file mode 100644 index 000000000..279c229ff --- /dev/null +++ b/apps/hub/src/app/_components/icons/processing-icon.tsx @@ -0,0 +1,34 @@ +import type { SVGProps } from 'react' + +const ProcessingIcon = ({ ...props }: SVGProps) => ( + + + + + +) +export default ProcessingIcon diff --git a/apps/hub/src/app/_components/icons/reject-icon.tsx b/apps/hub/src/app/_components/icons/reject-icon.tsx new file mode 100644 index 000000000..9f2d22c41 --- /dev/null +++ b/apps/hub/src/app/_components/icons/reject-icon.tsx @@ -0,0 +1,27 @@ +import type { SVGProps } from 'react' + +const RejectIcon = (props: SVGProps) => ( + + + + + + + + + + +) +export default RejectIcon diff --git a/apps/hub/src/app/_components/icons/snt-icon.tsx b/apps/hub/src/app/_components/icons/snt-icon.tsx new file mode 100644 index 000000000..acc29acbb --- /dev/null +++ b/apps/hub/src/app/_components/icons/snt-icon.tsx @@ -0,0 +1,22 @@ +import Image from 'next/image' + +export default function SNTIcon() { + return ( +
+ SNT + Karma +
+ ) +} diff --git a/apps/hub/src/app/_components/icons/vault-icon.tsx b/apps/hub/src/app/_components/icons/vault-icon.tsx new file mode 100644 index 000000000..8f3eebf8e --- /dev/null +++ b/apps/hub/src/app/_components/icons/vault-icon.tsx @@ -0,0 +1,32 @@ +import type { SVGProps } from 'react' + +export default function VaultIcon({ + className, + ...props +}: SVGProps) { + return ( + + + + + ) +} diff --git a/apps/hub/src/app/_components/stake/action-status-dialog.tsx b/apps/hub/src/app/_components/stake/action-status-dialog.tsx new file mode 100644 index 000000000..f20f46969 --- /dev/null +++ b/apps/hub/src/app/_components/stake/action-status-dialog.tsx @@ -0,0 +1,91 @@ +import * as Dialog from '@radix-ui/react-dialog' +import { CloseIcon } from '@status-im/icons/20' +import { match } from 'ts-pattern' + +import { ProcessingIcon, RejectIcon, VaultIcon } from '../icons' +import { type ActionStatusState } from './types/action-status' + +type Props = { + open: boolean + onClose: () => void + title?: string + description?: string + children?: React.ReactNode + state?: ActionStatusState + showCloseButton?: boolean + content?: React.ReactNode +} + +const ActionStatusDialog = (props: Props) => { + const { + open, + onClose, + title, + description, + children, + state = 'pending', + showCloseButton = true, + content, + } = props + + const handleOpenChange = (nextOpen: boolean) => { + if (!nextOpen && showCloseButton) { + onClose() + } + } + + const mapIconToState = (state: ActionStatusState) => { + return match(state) + .with('pending', () => ) + .with('processing', () => ) + .with('error', () => ) + .with('success', () => ) + .otherwise(() => null) + } + + return ( + + {children} + + + + +
+
+ {showCloseButton && ( + + + + )} + {content ? ( +
{content}
+ ) : ( +
+ {mapIconToState(state)} + +

+ {title} +

+
+ {description && ( + + + {description} + + + )} +
+ )} +
+ + + + ) +} + +export { ActionStatusDialog } diff --git a/apps/hub/src/app/_components/stake/compound-status-content.tsx b/apps/hub/src/app/_components/stake/compound-status-content.tsx new file mode 100644 index 000000000..9f6a3c093 --- /dev/null +++ b/apps/hub/src/app/_components/stake/compound-status-content.tsx @@ -0,0 +1,93 @@ +import * as Dialog from '@radix-ui/react-dialog' +import { InfoIcon } from '@status-im/icons/16' +import { formatUnits } from 'viem' + +import { LaunchIcon } from '~components/icons' +import { useMultiplierPointsBalance } from '~hooks/useMultiplierPoints' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useWeightedBoost } from '~hooks/useWeightedBoost' +import { formatSNT } from '~utils/currency' + +import { SNT_TOKEN } from '../../_constants' + +export const CompoundStatusContent = () => { + const { data: vaults } = useStakingVaults() + const weightedBoost = useWeightedBoost(vaults) + const { data: multiplierPointsData } = useMultiplierPointsBalance() + + const earnRateWithBoost = Math.floor(weightedBoost.totalStaked * 0.05) + const earnRateWithoutBoost = Math.floor(weightedBoost.totalStaked * 0.05) + + return ( + <> +
+ +
+ +
+
+ +

+ {`Ready to compound ${formatSNT( + formatUnits( + multiplierPointsData?.totalUncompounded ?? 0n, + SNT_TOKEN.decimals + ) + )} points`} +

+
+ +

+ Please sign the message in your wallet. +

+
+
+ +
+
+

+ Total compounded +

+

+ {`${formatSNT( + formatUnits( + multiplierPointsData?.totalMpRedeemed ?? 0n, + SNT_TOKEN.decimals + ) + )} points`} +

+
+ +
+

+ Your earn rate at {weightedBoost.formatted} boost +

+

+ {earnRateWithBoost} Karma / day +

+
+ +
+

+ Equivalent at x0.00 boost +

+

+ {earnRateWithoutBoost} Karma / day +

+
+
+ +
+
+ +
+

+ Boost the rate at which you receive Karma. More points you compound, + the higher your rate. The longer you lock your vault, the higher + your boost, and the faster you accumulate Karma. +

+
+
+ + ) +} diff --git a/apps/hub/src/app/_components/stake/hooks/use-action-status-content.tsx b/apps/hub/src/app/_components/stake/hooks/use-action-status-content.tsx new file mode 100644 index 000000000..2ee39f0cf --- /dev/null +++ b/apps/hub/src/app/_components/stake/hooks/use-action-status-content.tsx @@ -0,0 +1,170 @@ +import { match } from 'ts-pattern' + +import { type VaultState } from '~hooks/useVaultStateMachine' +import { formatSNT } from '~utils/currency' + +import { CompoundStatusContent } from '../compound-status-content' +import { type ActionStatusContent } from '../types/action-status' + +/** + * Hook to generate action status dialog content based on vault state + * Maps vault state machine states to user-facing dialog content + */ +export function useActionStatusContent( + state: VaultState +): ActionStatusContent | null { + return ( + match(state) + // SIWE flow + .with({ type: 'siwe', step: 'initialize' }, () => ({ + title: 'Sign in', + description: 'Please sign the message in your wallet.', + state: 'pending', + showCloseButton: true, + })) + .with({ type: 'siwe', step: 'processing' }, () => ({ + title: 'Signing in', + description: 'Wait a moment.', + state: 'processing', + showCloseButton: true, + })) + .with({ type: 'siwe', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Create Vault flow + .with({ type: 'createVault', step: 'initialize' }, () => ({ + title: 'Ready to create new vault', + description: 'Please sign the message in your wallet.', + state: 'pending', + showCloseButton: true, + })) + .with({ type: 'createVault', step: 'processing' }, () => ({ + title: 'Creating new vault', + description: 'Wait a moment.', + state: 'processing', + showCloseButton: true, + })) + .with({ type: 'createVault', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Increase Allowance flow + .with({ type: 'increaseAllowance', step: 'initialize' }, () => ({ + title: 'Increase token allowance', + description: 'Please sign the message in your wallet.', + state: 'pending', + showCloseButton: false, + })) + .with({ type: 'increaseAllowance', step: 'processing' }, () => ({ + title: 'Increasing token allowance', + description: 'Wait a moment.', + state: 'processing', + showCloseButton: false, + })) + .with({ type: 'increaseAllowance', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Staking flow + .with( + { + type: 'staking', + step: 'initialize', + }, + state => ({ + title: `Ready to stake ${formatSNT(state.amount ?? 0, { includeSymbol: true })}`, + description: 'Please sign the message in your wallet.', + state: 'pending', + showCloseButton: true, + }) + ) + + .with({ type: 'staking', step: 'processing' }, state => ({ + title: `Staking ${formatSNT(state.amount ?? 0, { includeSymbol: true })}`, + description: 'Wait a moment...', + state: 'processing', + showCloseButton: false, + })) + .with({ type: 'staking', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Withdraw flow (goes directly to processing, no initialize step) + .with({ type: 'withdraw', step: 'processing' }, state => ({ + title: `Withdrawing ${formatSNT(state.amount ?? 0, { includeSymbol: true })}`, + description: 'Wait a moment...', + state: 'processing', + showCloseButton: false, + })) + .with({ type: 'withdraw', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Lock flow + .with({ type: 'lock', step: 'initialize' }, () => ({ + title: 'Ready to lock vault', + description: 'Please sign the message in your wallet.', + state: 'pending', + showCloseButton: true, + })) + .with({ type: 'lock', step: 'processing' }, () => ({ + title: 'Locking vault', + description: 'Wait a moment...', + state: 'processing', + showCloseButton: false, + })) + .with({ type: 'lock', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // compound flow + .with({ type: 'compound', step: 'initialize' }, () => ({ + state: 'pending', + showCloseButton: true, + content: , + })) + .with({ type: 'compound', step: 'processing' }, state => ({ + title: `Compounding ${formatSNT(state.amount ?? 0)} points`, + description: 'Wait a moment...', + state: 'processing', + showCloseButton: false, + })) + .with({ type: 'compound', step: 'rejected' }, () => ({ + title: 'Request was rejected', + description: 'Request was rejected by user', + state: 'error', + showCloseButton: true, + })) + + // Success + .with({ type: 'success' }, () => ({ + title: 'Success!', + description: 'Your transaction completed successfully', + state: 'success', + showCloseButton: true, + })) + + // Idle - no dialog + .with({ type: 'idle' }, () => null) + .exhaustive() + ) +} diff --git a/apps/hub/src/app/_components/stake/promo-modal.tsx b/apps/hub/src/app/_components/stake/promo-modal.tsx new file mode 100644 index 000000000..932f509b0 --- /dev/null +++ b/apps/hub/src/app/_components/stake/promo-modal.tsx @@ -0,0 +1,123 @@ +'use client' + +import * as Dialog from '@radix-ui/react-dialog' +import { Tag } from '@status-im/components' +import { CloseIcon, ExternalIcon } from '@status-im/icons/20' +import { Button, ButtonLink } from '@status-im/status-network/components' +import { ConnectKitButton } from 'connectkit' +import Image from 'next/image' + +type Props = { + open: boolean + onClose: () => void + children: React.ReactNode +} + +const PromoModal = (props: Props) => { + const { open, onClose, children } = props + + const handleOpenChange = (nextOpen: boolean) => { + if (!nextOpen) { + onClose() + } + } + + return ( + + {children} + + + + +
+ + + +
+
+
+ +
+
+ + +
+ +

+ Connect to +
+ Status Network +

+
+ + +

+ Use Status L2 features in Chrome with the safety and + control of Status. +

+
+
+ +
+ + Install Status Wallet Connector + + + + + {({ show, isConnected }) => ( + + )} + +
+
+ +
+ Status Wallet Connector + Status Wallet Connector + Dragon +
+
+
+ + + + ) +} + +export { PromoModal } diff --git a/apps/hub/src/app/_components/stake/types/action-status.ts b/apps/hub/src/app/_components/stake/types/action-status.ts new file mode 100644 index 000000000..3605399fa --- /dev/null +++ b/apps/hub/src/app/_components/stake/types/action-status.ts @@ -0,0 +1,19 @@ +/** + * Represents the current state of an action status dialog + */ +export type ActionStatusState = + | 'pending' // Waiting for user action (sign, approve) + | 'processing' // Transaction in progress + | 'error' // Failed/rejected + | 'success' // Completed successfully + +/** + * Content configuration for action status dialog + */ +export interface ActionStatusContent { + state: ActionStatusState + title?: string + description?: string + showCloseButton?: boolean + content?: React.ReactNode +} diff --git a/apps/hub/src/app/_components/top-bar.tsx b/apps/hub/src/app/_components/top-bar.tsx index 7e947e768..21c63a24a 100644 --- a/apps/hub/src/app/_components/top-bar.tsx +++ b/apps/hub/src/app/_components/top-bar.tsx @@ -2,12 +2,11 @@ import { Button, IconButton, Tag } from '@status-im/components' import { SettingsIcon } from '@status-im/icons/20' -import { - Button as ButtonPrimary, - Link, -} from '@status-im/status-network/components' +import { Link } from '@status-im/status-network/components' import Image from 'next/image' +import { ConnectButton } from './connect-button' + interface TopBarProps { onMenuToggle: () => void } @@ -64,7 +63,7 @@ export function TopBar({ onMenuToggle }: TopBarProps) {
{/* Connect Wallet Button */} - Connect Wallet + {/* Settings Button */} } /> diff --git a/apps/hub/src/app/_components/vault-select.tsx b/apps/hub/src/app/_components/vault-select.tsx new file mode 100644 index 000000000..51728f087 --- /dev/null +++ b/apps/hub/src/app/_components/vault-select.tsx @@ -0,0 +1,188 @@ +'use client' + +import { useState } from 'react' + +import { DropdownMenu } from '@status-im/components' +import { + AddSmallIcon, + DropdownIcon, + LockedIcon, + UnlockedIcon, +} from '@status-im/icons/20' + +import { formatSNT } from '~utils/currency' +import { isVaultLocked } from '~utils/vault' + +import type { StakingVault } from '~hooks/useStakingVaults' + +// ============================================================================ +// Types +// ============================================================================ + +interface VaultSelectProps { + /** + * List of available vaults to select from + */ + vaults: StakingVault[] + /** + * Currently selected vault address + */ + value: string + /** + * Callback when vault selection changes + */ + onChange: (vaultAddress: string) => void + /** + * Whether the select is disabled + * @default false + */ + disabled?: boolean + /** + * Placeholder text when no vault is selected + * @default "Add new vault" + */ + placeholder?: string +} + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Gets display label for a vault option + */ +function getVaultLabel(vault: StakingVault, index: number): string { + const stakedAmount = vault.data?.stakedBalance + ? formatSNT(vault.data.stakedBalance) + : '0' + + // Format: #1 - 0xd233...34c4, 100,000,000 SNT + const shortAddress = `${vault.address.slice(0, 6)}...${vault.address.slice(-4)}` + return `#${index + 1} - ${shortAddress}, ${stakedAmount} SNT` +} + +// ============================================================================ +// Component +// ============================================================================ + +/** + * Vault selection dropdown component + * + * Displays a list of user vaults with their staked balances. + * Allows selecting a vault or creating a new one. + * + * @example + * ```tsx + * function StakeForm() { + * const { data: vaults } = useAccountVaults() + * const [selectedVault, setSelectedVault] = useState('') + * + * return ( + * + * ) + * } + * ``` + */ +export function VaultSelect({ + vaults, + value, + onChange, + disabled = false, + placeholder = 'Add new vault', +}: VaultSelectProps) { + const [open, setOpen] = useState(false) + + // Find the selected vault to display its label + const selectedVault = vaults.find(vault => vault.address === value) + const selectedIndex = vaults.findIndex(vault => vault.address === value) + + const isLocked = isVaultLocked(selectedVault?.data?.lockUntil) + + const displayLabel = + selectedVault && selectedIndex !== -1 + ? getVaultLabel(selectedVault, selectedIndex) + : placeholder + + // If no vaults exist, show the "New vault" option (disabled) + const hasVaults = vaults.length > 0 + + const trigger = ( + + ) + + const content = ( + + } + label={placeholder} + selected={!value} + onSelect={() => { + onChange('') + setOpen(false) + }} + /> + {hasVaults ? ( + <> + {vaults.map((vault, index) => { + const isLocked = isVaultLocked(vault.data?.lockUntil) + + return ( + + ) : ( + + ) + } + label={getVaultLabel(vault, index)} + selected={vault.address === value} + onSelect={() => { + onChange(vault.address) + setOpen(false) + }} + /> + ) + })} + + ) : null} + + ) + + return ( + + {trigger} + {content} + + ) +} diff --git a/apps/hub/src/app/_components/vaults/modals/base-vault-modal.tsx b/apps/hub/src/app/_components/vaults/modals/base-vault-modal.tsx new file mode 100644 index 000000000..34e9e653e --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/base-vault-modal.tsx @@ -0,0 +1,72 @@ +'use client' + +import * as Dialog from '@radix-ui/react-dialog' +import { CloseIcon } from '@status-im/icons/20' + +import type { ReactNode } from 'react' + +interface BaseVaultModalProps { + open?: boolean + onOpenChange?: (open: boolean) => void + onClose: () => void + title: string + description: string + children?: ReactNode + trigger?: ReactNode +} + +/** + * Base modal component for vault-related actions. + * Provides consistent dialog wrapper with close button, overlay, and styling. + */ +export function BaseVaultModal(props: BaseVaultModalProps) { + const { open, onOpenChange, onClose, title, description, children, trigger } = + props + + const handleOpenChange = (nextOpen: boolean) => { + if (onOpenChange) { + onOpenChange(nextOpen) + } + if (!nextOpen) { + onClose() + } + } + + return ( + + {trigger && {trigger}} + + + +
+ + + + +
+ +
+ + {title} + +
+
+ +
+ {description} +
+
+
+ + {children} +
+
+
+
+ ) +} diff --git a/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/constants.ts b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/constants.ts new file mode 100644 index 000000000..7e93676e1 --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/constants.ts @@ -0,0 +1,33 @@ +/** + * Time conversion constants for vault locking calculations + */ +export const TIME_CONSTANTS = { + SECONDS_PER_MINUTE: 60, + MINUTES_PER_HOUR: 60, + HOURS_PER_DAY: 24, + DAYS_PER_YEAR: 365, +} as const + +/** + * Calculated time conversion values + */ +export const SECONDS_PER_DAY = + TIME_CONSTANTS.SECONDS_PER_MINUTE * + TIME_CONSTANTS.MINUTES_PER_HOUR * + TIME_CONSTANTS.HOURS_PER_DAY + +export const MILLISECONDS_PER_DAY = SECONDS_PER_DAY * 1000 + +/** + * Date formatting constants + */ +export const DATE_FORMAT = { + PAD_LENGTH: 2, + PAD_CHAR: '0', + SEPARATOR: '/', +} as const + +export const DEFAULT_LOCK_PERIOD = { + INITIAL_YEARS: '0.25', + INITIAL_DAYS: '90', +} as const diff --git a/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/index.tsx b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/index.tsx new file mode 100644 index 000000000..ccd635b4d --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/index.tsx @@ -0,0 +1,120 @@ +'use client' + +import { useReadContract } from 'wagmi' + +import { vaultAbi } from '~constants/contracts' +import { useLockVault } from '~hooks/useLockVault' + +import { BaseVaultModal } from '../base-vault-modal' +import { DEFAULT_LOCK_PERIOD } from './constants' +import { LockVaultForm } from './lock-vault-form' + +import type { HTMLAttributes } from 'react' +import type { Address } from 'viem' + +type ActionButton = HTMLAttributes & { + label: string + disabled?: boolean +} + +interface LockVaultModalProps { + open?: boolean + onOpenChange?: (open: boolean) => void + onClose: () => void + vaultAddress: Address + title: string + description: string + children?: React.ReactNode + initialYears?: string + initialDays?: string + infoMessage?: string + errorMessage?: string | null + onValidate?: (years: string, days: string) => string | null + actions: [ActionButton, ActionButton] +} + +/** + * Modal for locking vault to earn multiplier boost + */ +export function LockVaultModal(props: LockVaultModalProps) { + const { + open, + onOpenChange, + onClose, + children, + title, + vaultAddress, + description, + infoMessage, + errorMessage, + onValidate, + actions, + } = props + + const { mutate: lockVault } = useLockVault(vaultAddress) + + const { data: lockUntil } = useReadContract({ + abi: vaultAbi, + address: vaultAddress, + functionName: 'lockUntil', + }) as { data: bigint } + + // Calculate initial values based on current lockUntil for extensions + // Only consider it "extending" if the vault is currently locked (lockUntil > now) + const now = BigInt(Math.floor(Date.now() / 1000)) + const isExtending = lockUntil && lockUntil > now + const calculatedInitialDays = isExtending + ? Math.ceil((Number(lockUntil) - Math.floor(Date.now() / 1000)) / 86400) + : undefined + const calculatedInitialYears = calculatedInitialDays + ? (calculatedInitialDays / 365).toFixed(2) + : undefined + + // Use calculated values for extensions, props for new locks + const finalInitialDays = isExtending + ? String(calculatedInitialDays) + : DEFAULT_LOCK_PERIOD.INITIAL_DAYS + const finalInitialYears = isExtending + ? calculatedInitialYears + : DEFAULT_LOCK_PERIOD.INITIAL_YEARS + + /** + * Handle the submit of the lock vault form + * + * @param lockPeriodInSeconds - The increased lock duration in seconds + * The smart contract handles all calculations internally via _calculateLock + */ + const handleSubmit = (lockPeriodInSeconds: bigint) => { + // Always pass the duration in seconds + // The smart contract's _calculateLock function handles: + // - Calculating delta MP + // - Calculating new lock end time (max(currentLockEnd, now) + increasedLockSeconds) + // - Validation (min/max periods, MP overflow checks) + lockVault({ + lockPeriodInSeconds, + }) + } + + return ( + + + + ) +} diff --git a/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-duration-slider.tsx b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-duration-slider.tsx new file mode 100644 index 000000000..c1c2ccf34 --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-duration-slider.tsx @@ -0,0 +1,46 @@ +'use client' + +interface SliderConfig { + minLabel: string + maxLabel: string + minDays: number + maxDays: number +} + +interface LockDurationSliderProps { + sliderConfig: SliderConfig + value: number + onChange: (value: number) => void +} + +/** + * Slider component for selecting vault lock duration + */ +export function LockDurationSlider(props: LockDurationSliderProps) { + const { sliderConfig, value, onChange } = props + + const handleSliderChange = (e: React.ChangeEvent) => { + const inputDays = parseFloat(e.target.value) + onChange(inputDays) + } + + return ( +
+
+ +
+
+ {sliderConfig.minLabel} + {sliderConfig.maxLabel} +
+
+ ) +} diff --git a/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-vault-form.tsx b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-vault-form.tsx new file mode 100644 index 000000000..5b555b7ef --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/lock-vault-modal/lock-vault-form.tsx @@ -0,0 +1,357 @@ +'use client' + +import { useEffect, useMemo, useState } from 'react' + +import { zodResolver } from '@hookform/resolvers/zod' +import { ContextTag, Input } from '@status-im/components' +import { InfoIcon } from '@status-im/icons/16' +import { IncorrectIcon } from '@status-im/icons/20' +import { Button } from '@status-im/status-network/components' +import { useForm } from 'react-hook-form' +import { z } from 'zod' + +import { useSliderConfig } from '~hooks/useSliderConfig' + +import { DATE_FORMAT, DEFAULT_LOCK_PERIOD, SECONDS_PER_DAY } from './constants' +import { LockDurationSlider } from './lock-duration-slider' + +import type { HTMLAttributes } from 'react' + +const DAYS_PER_YEAR = 365 + +type ActionButton = HTMLAttributes & { + label: string + disabled?: boolean +} + +const createFormSchema = () => { + return z.object({ + years: z.string(), + days: z.string(), + }) +} + +type FormValues = z.infer> + +interface LockVaultFormProps { + onSubmit: (lockPeriodInSeconds: bigint) => void + onClose: () => void + actions: [ActionButton, ActionButton] + initialYears?: string + initialDays?: string + infoMessage?: string + errorMessage?: string | null + onValidate?: (years: string, days: string) => string | null + /** Current lockUntil timestamp (for vault extensions) */ + currentLockUntil?: bigint +} + +/** + * Form component for vault lock configuration + */ +export function LockVaultForm(props: LockVaultFormProps) { + const { + initialYears, + initialDays, + infoMessage = 'Boost the rate at which you receive Karma. The longer you lock your vault, the higher your boost, and the faster you accumulate Karma. You can add more SNT at any time, but withdrawing your SNT is only possible once the vault unlocks.', + errorMessage: externalErrorMessage, + onValidate, + onSubmit, + onClose, + actions, + currentLockUntil, + } = props + + const [closeAction, submitAction] = actions + + const { watch, setValue, handleSubmit } = useForm({ + resolver: zodResolver(createFormSchema()), + defaultValues: { + years: initialYears || DEFAULT_LOCK_PERIOD.INITIAL_YEARS, + days: initialDays || DEFAULT_LOCK_PERIOD.INITIAL_DAYS, + }, + }) + + const { data: sliderConfigQuery } = useSliderConfig() + + const sliderConfig = useMemo(() => { + const minSeconds = sliderConfigQuery?.min || 7776000 // fallback: 90 days in seconds + const maxSeconds = sliderConfigQuery?.max || 126144000 // fallback: 4 years in seconds + + const minDays = Math.round(minSeconds / SECONDS_PER_DAY) + const maxDays = Math.round(maxSeconds / SECONDS_PER_DAY) + + const minYears = minDays / DAYS_PER_YEAR + const maxYears = maxDays / DAYS_PER_YEAR + + const minLabel = + minYears < 1 ? `${minDays} days` : `${minYears.toFixed(1)} years` + const maxLabel = + maxYears < 1 ? `${maxDays} days` : `${Math.round(maxYears)} years` + + return { + minLabel, + maxLabel, + minDays, + maxDays, + initialPosition: 50, + } + }, [sliderConfigQuery]) + + const years = watch('years') + const days = watch('days') + + const initialSliderValue = + parseInt(initialYears || DEFAULT_LOCK_PERIOD.INITIAL_YEARS) * + DAYS_PER_YEAR + + parseInt(initialDays || DEFAULT_LOCK_PERIOD.INITIAL_DAYS) + + const [sliderValue, setSliderValue] = useState(initialSliderValue) + + const calculateUnlockDate = (totalDays: number): string => { + const totalSeconds = totalDays * SECONDS_PER_DAY + // Always calculate from today for consistent UX + const unlockTimestamp = Math.floor(Date.now() / 1000) + totalSeconds + + // Convert to Date for display (multiply by 1000 for milliseconds) + const unlockDate = new Date(unlockTimestamp * 1000) + + const day = String(unlockDate.getDate()).padStart( + DATE_FORMAT.PAD_LENGTH, + DATE_FORMAT.PAD_CHAR + ) + const month = String(unlockDate.getMonth() + 1).padStart( + DATE_FORMAT.PAD_LENGTH, + DATE_FORMAT.PAD_CHAR + ) + const year = unlockDate.getFullYear() + + return `${day}${DATE_FORMAT.SEPARATOR}${month}${DATE_FORMAT.SEPARATOR}${year}` + } + + const calculatedUnlockDate = useMemo(() => { + const daysValue = parseInt( + days || initialDays || DEFAULT_LOCK_PERIOD.INITIAL_DAYS + ) + return calculateUnlockDate(daysValue) + }, [days, initialDays]) + + useEffect(() => { + const daysValue = parseInt(days || DEFAULT_LOCK_PERIOD.INITIAL_DAYS) + if (!isNaN(daysValue) && daysValue !== sliderValue) { + setSliderValue(daysValue) + } + }, [days, sliderValue]) + + const handleVaultLockOrExtend = async (data: FormValues) => { + const totalDays = parseInt(data.days || DEFAULT_LOCK_PERIOD.INITIAL_DAYS) + const userDesiredTotalLockSeconds = BigInt(totalDays * SECONDS_PER_DAY) + const isExtending = currentLockUntil && currentLockUntil > 0n + + let increasedLockSeconds: bigint + + if (isExtending) { + // When extending: calculate how much additional time to add + // to reach the user's desired total lock time from now + const now = BigInt(Math.floor(Date.now() / 1000)) + const currentRemainingSeconds = + currentLockUntil > now ? currentLockUntil - now : 0n + + // If user wants total lock of X seconds from now, and vault currently locked for Y seconds from now, + // we need to add (X - Y) seconds + increasedLockSeconds = + userDesiredTotalLockSeconds - currentRemainingSeconds + + // Ensure we're adding at least some time (can't decrease lock) + if (increasedLockSeconds < 0n) { + increasedLockSeconds = 0n + } + } else { + // New lock: just use the duration as-is + increasedLockSeconds = userDesiredTotalLockSeconds + } + + onClose() + onSubmit(increasedLockSeconds) + } + + const handleSliderChange = (inputDays: number) => { + setSliderValue(inputDays) + + const yearsValue = (inputDays / DAYS_PER_YEAR).toFixed(2) + + setValue('years', yearsValue) + setValue('days', Math.round(inputDays).toString()) + } + + const handleYearsChange = (value: string) => { + setValue('years', value) + + const yearsValue = parseFloat(value || '0') + if (!isNaN(yearsValue)) { + const totalDays = Math.round(yearsValue * DAYS_PER_YEAR) + const clampedDays = Math.max( + sliderConfig.minDays, + Math.min(totalDays, sliderConfig.maxDays) + ) + + setSliderValue(clampedDays) + setValue('days', clampedDays.toString()) + } + } + + const handleDaysChange = (value: string) => { + setValue('days', value) + + const inputDays = parseInt(value || DEFAULT_LOCK_PERIOD.INITIAL_DAYS) + if (!isNaN(inputDays)) { + const clampedDays = Math.max( + sliderConfig.minDays, + Math.min(inputDays, sliderConfig.maxDays) + ) + + setSliderValue(clampedDays) + setValue('years', (clampedDays / DAYS_PER_YEAR).toFixed(2)) + } + } + + const getValidationError = (): string | null => { + const yearsValue = parseFloat(years || DEFAULT_LOCK_PERIOD.INITIAL_YEARS) + const daysValue = parseInt(days || DEFAULT_LOCK_PERIOD.INITIAL_DAYS) + + if (daysValue > 0 && daysValue < sliderConfig.minDays) { + return `Minimum lock time is ${sliderConfig.minLabel}` + } + + if (daysValue > sliderConfig.maxDays) { + return `Maximum lock time is ${sliderConfig.maxLabel}` + } + + const minYears = sliderConfig.minDays / DAYS_PER_YEAR + if (yearsValue > 0 && yearsValue < minYears) { + return `Minimum lock time is ${sliderConfig.minLabel}` + } + + const maxYears = sliderConfig.maxDays / DAYS_PER_YEAR + if (yearsValue > maxYears) { + return `Maximum lock time is ${sliderConfig.maxLabel}` + } + + return null + } + + const builtInError = getValidationError() + const customError = onValidate ? onValidate(years, days) : null + const errorMessage = customError || builtInError + const displayError = externalErrorMessage || errorMessage + const hasError = Boolean(displayError) + + return ( +
+ + +
+
+ +
+ + or + +
+ +
+
+ + {hasError && ( +
+
+
+
+ +
+
+
+ {displayError} +
+
+
+ )} + +
+
+
+ Boost: +
+ + {/* TODO: calculate boost */} + x2.5 + +
+
+
+ Unlock: +
+ + {calculatedUnlockDate} + +
+
+ +
+
+
+
+ +
+
+
+ {infoMessage} +
+
+
+ +
+
+ + +
+
+ + ) +} diff --git a/apps/hub/src/app/_components/vaults/modals/withdraw-vault-modal.tsx b/apps/hub/src/app/_components/vaults/modals/withdraw-vault-modal.tsx new file mode 100644 index 000000000..8b260667c --- /dev/null +++ b/apps/hub/src/app/_components/vaults/modals/withdraw-vault-modal.tsx @@ -0,0 +1,129 @@ +'use client' + +import { useCallback } from 'react' + +import * as Dialog from '@radix-ui/react-dialog' +import { InfoIcon } from '@status-im/icons/12' +import { Button } from '@status-im/status-network/components' +import { useAccount } from 'wagmi' + +import { useVaultEmergencyExit } from '~hooks/useVaultEmergencyExit' + +import { BaseVaultModal } from './base-vault-modal' + +import type { Address } from 'viem' + +interface WithdrawVaultModalProps { + onClose: () => void + vaultAddress: Address + amountWei: bigint + open?: boolean + onOpenChange?: (open: boolean) => void + children?: React.ReactNode +} + +/** + * Modal for emergency withdrawal from vault + */ +export function WithdrawVaultModal(props: WithdrawVaultModalProps) { + const { onClose, vaultAddress, amountWei, open, onOpenChange, children } = + props + + const { address } = useAccount() + const { mutate: emergencyExit } = useVaultEmergencyExit() + + const handleVaultWithdrawal = useCallback(() => { + if (!address) { + console.error('No address found - wallet not connected') + return + } + + emergencyExit({ + amountWei, + vaultAddress, + onSigned: () => { + onClose() + }, + }) + }, [address, amountWei, onClose, vaultAddress, emergencyExit]) + + return ( + +
+
+
+
+

+ Withdraw to +

+
+
+
+

+ {address} +

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

+ Your funds will sent directly to your connected wallet. +

+
+ +
+
+
+
+ +
+
+ + + + +
+
+
+ ) +} diff --git a/apps/hub/src/app/_components/vaults/table-columns.tsx b/apps/hub/src/app/_components/vaults/table-columns.tsx new file mode 100644 index 000000000..02f37a72f --- /dev/null +++ b/apps/hub/src/app/_components/vaults/table-columns.tsx @@ -0,0 +1,358 @@ +import { AlertIcon, TimeIcon } from '@status-im/icons/12' +import { LockedIcon, UnlockedIcon } from '@status-im/icons/20' +import { Button } from '@status-im/status-network/components' +import { createColumnHelper } from '@tanstack/react-table' +import { formatUnits } from 'viem' + +import { SNT_TOKEN } from '~constants/index' +import { type StakingVault } from '~hooks/useStakingVaults' +import { shortenAddress } from '~utils/address' +import { formatSNT } from '~utils/currency' +import { calculateDaysUntilUnlock, isVaultLocked } from '~utils/vault' + +import { LockVaultModal } from './modals/lock-vault-modal' +import { WithdrawVaultModal } from './modals/withdraw-vault-modal' + +interface TableColumnsProps { + vaults: StakingVault[] | undefined + openModalVaultId: string | null + setOpenModalVaultId: (vaultId: string | null) => void + emergencyModeEnabled: unknown + isConnected: boolean +} + +// Calculate total staked across all vaults +const calculateTotalStaked = ( + vaults: StakingVault[], + emergencyMode: boolean +): bigint => { + return vaults.reduce( + (acc, vault) => + acc + + (emergencyMode + ? vault.data?.depositedBalance || 0n + : vault.data?.stakedBalance || 0n), + BigInt(0) + ) +} + +// Calculate total karma across all vaults +const calculateTotalKarma = (vaults: StakingVault[]): bigint => { + return vaults.reduce( + (acc, vault) => acc + (vault.data?.rewardsAccrued || 0n), + BigInt(0) + ) +} + +// Cache current time to avoid calling Date.now() on every cell render +const getCurrentTimestamp = (): bigint => { + return BigInt(Math.floor(Date.now() / 1000)) +} + +// Validation function for lock time - extracted to avoid recreating on every render +const validateLockTime = (_: string, days: string): string | null => { + const totalDays = parseInt(days || '0') + // TODO: read this from the contract + return totalDays > 1460 ? 'Maximum lock time is 4 years' : null +} + +// Modal action configurations - static, never change +const EXTEND_LOCK_ACTIONS: [{ label: string }, { label: string }] = [ + { label: 'Cancel' }, + { label: 'Extend lock' }, +] + +const LOCK_VAULT_ACTIONS: [{ label: string }, { label: string }] = [ + { label: "Don't lock" }, + { label: 'Lock' }, +] + +const LOCK_INFO_MESSAGE = + 'Boost the rate at which you receive Karma. The longer you lock your vault, the higher your boost, and the faster you accumulate Karma. You can add more SNT at any time, but withdrawing your SNT is only possible once the vault unlocks.' as const + +export const createVaultTableColumns = ({ + vaults = [], + openModalVaultId, + setOpenModalVaultId, + emergencyModeEnabled, + // isConnected, +}: TableColumnsProps) => { + // Calculate totals and current time once per column creation + const totalStaked = calculateTotalStaked( + vaults, + Boolean(emergencyModeEnabled) + ) + const totalKarma = calculateTotalKarma(vaults) + const currentTimestamp = getCurrentTimestamp() + const columnHelper = createColumnHelper() + + return [ + columnHelper.accessor('address', { + id: 'vault', + header: 'Vault', + cell: ({ row }) => { + return ( + + #{Number(row.index) + 1} + + ) + }, + footer: () => { + return ( + Total + ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('address', { + header: 'Address', + cell: ({ row }) => { + return ( + + {shortenAddress(row.original.address)} + + ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('data.stakedBalance', { + header: emergencyModeEnabled ? 'Vault balance' : 'Staked', + cell: ({ row }) => { + const balance = emergencyModeEnabled + ? row.original.data?.depositedBalance + : row.original.data?.stakedBalance + return ( +
+ + {formatSNT(balance || 0n)} + SNT + +
+ ) + }, + footer: () => { + return ( + + {formatSNT(totalStaked)} + SNT + + ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('data.lockUntil', { + header: 'Unlocks in', + cell: ({ row }) => { + const isLocked = isVaultLocked(row.original.data?.lockUntil) + const daysUntilUnlock = isLocked + ? calculateDaysUntilUnlock(row.original.data?.lockUntil) + : null + + if (!daysUntilUnlock) { + return null + } + + return ( +
+ + {daysUntilUnlock} + d + +
+ ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('data.maxMP', { + header: 'Boost', + cell: ({ row }) => { + const stakedBalance = row.original.data?.stakedBalance || 0n + const maxMP = row.original.data?.maxMP || 0n + const mpAccrued = row.original.data?.mpAccrued || 0n + + const potentialBoost = + stakedBalance > 0n && maxMP > mpAccrued + ? (maxMP - mpAccrued) / stakedBalance + : undefined + + // Calculate boost directly instead of recalculating for all vaults + // Boost = (mpAccrued / stakedBalance) + 1 (base multiplier) + const currentBoost = + stakedBalance > 0n + ? Number(formatUnits(mpAccrued, SNT_TOKEN.decimals)) / + Number(formatUnits(stakedBalance, SNT_TOKEN.decimals)) + + 1 + : 1 + + return ( +
+ + x{currentBoost.toFixed(2)} + + {potentialBoost && ( + + x{formatSNT(formatUnits(potentialBoost, SNT_TOKEN.decimals))} if + locked + + )} +
+ ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('data.rewardsAccrued', { + header: 'Karma', + cell: ({ row }) => { + const karma = Number(row.original.data?.rewardsAccrued) / 1e18 + return ( +
+ + {formatSNT(karma)} + KARMA + +
+ ) + }, + footer: () => { + return ( + + {formatSNT(totalKarma)} + KARMA + + ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.accessor('data.lockUntil', { + id: 'state', + header: 'State', + cell: ({ row }) => { + const isLocked = isVaultLocked(row.original.data?.lockUntil) + + return ( +
+ {isLocked ? ( + + ) : ( + + )} + + {isLocked ? 'Locked' : 'Open'} + +
+ ) + }, + meta: { + headerClassName: 'text-left', + cellClassName: 'text-left', + }, + }), + columnHelper.display({ + id: 'actions', + header: 'Actions', + cell: ({ row }) => { + const withdrawModalId = `withdraw-${row.original.address}` + const lockModalId = `lock-${row.original.address}` + const isWithdrawModalOpen = openModalVaultId === withdrawModalId + const isLockModalOpen = openModalVaultId === lockModalId + + // Use cached timestamp instead of calling Date.now() on every render + const isLocked = row.original?.data?.lockUntil + ? row.original.data.lockUntil > currentTimestamp + : false + + return ( +
+ {Boolean(emergencyModeEnabled) && ( + + setOpenModalVaultId(open ? withdrawModalId : null) + } + onClose={() => setOpenModalVaultId(null)} + vaultAddress={row.original.address} + amountWei={row.original.data?.depositedBalance || 0n} + > + + + )} + {isLocked ? ( + + setOpenModalVaultId(open ? lockModalId : null) + } + vaultAddress={row.original.address} + title="Extend lock time" + initialYears="2" + initialDays="732" + description="Extending lock time increasing Karma boost" + actions={EXTEND_LOCK_ACTIONS} + onClose={() => setOpenModalVaultId(null)} + infoMessage={LOCK_INFO_MESSAGE} + > + + + ) : ( + + setOpenModalVaultId(open ? lockModalId : null) + } + vaultAddress={row.original.address} + title="Do you want to lock the vault?" + description="Lock this vault to receive more Karma" + actions={LOCK_VAULT_ACTIONS} + onClose={() => setOpenModalVaultId(null)} + infoMessage={LOCK_INFO_MESSAGE} + onValidate={validateLockTime} + > + + + )} +
+ ) + }, + meta: { + headerClassName: 'text-center', + cellClassName: 'text-right', + }, + }), + ] +} diff --git a/apps/hub/src/app/_components/vaults/vaults-table.tsx b/apps/hub/src/app/_components/vaults/vaults-table.tsx new file mode 100644 index 000000000..8402abb55 --- /dev/null +++ b/apps/hub/src/app/_components/vaults/vaults-table.tsx @@ -0,0 +1,221 @@ +'use client' + +import { useCallback, useMemo, useState } from 'react' + +import { AddCircleIcon } from '@status-im/icons/12' +import { Button } from '@status-im/status-network/components' +import { + flexRender, + getCoreRowModel, + useReactTable, +} from '@tanstack/react-table' +import { useAccount, useReadContract } from 'wagmi' + +import { STAKING_MANAGER } from '~constants/address' +import { useCreateVault } from '~hooks/useCreateVault' +import { type StakingVault, useStakingVaults } from '~hooks/useStakingVaults' + +import { createVaultTableColumns } from './table-columns' + +interface VaultColumnMeta { + headerClassName?: string + cellClassName?: string + footerClassName?: string +} + +/** + * Gets the appropriate CSS class for table cell/header based on meta + */ +function getCellClassName( + meta: VaultColumnMeta | undefined, + defaultClassName = 'text-left' +): string { + return meta?.cellClassName || defaultClassName +} + +function getHeaderClassName( + meta: VaultColumnMeta | undefined, + defaultClassName = 'text-left' +): string { + return meta?.headerClassName || defaultClassName +} + +// ============================================================================ +// Sub-components +// ============================================================================ + +interface TableProps { + table: ReturnType> +} + +// Simple table components - TanStack Table handles optimization via getCoreRowModel +function TableHeader({ table }: TableProps) { + return ( + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map(header => ( + + + {flexRender( + header.column.columnDef.header, + header.getContext() + )} + + + ))} + + ))} + + ) +} + +function TableBody({ table }: TableProps) { + return ( + + {table.getRowModel().rows.map(row => ( + + {row.getVisibleCells().map(cell => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ))} + + ) +} + +function TableFooter({ table }: TableProps) { + return ( + + {table.getFooterGroups().map(footerGroup => ( + + {footerGroup.headers.map(header => ( + + {header.column.columnDef.footer + ? flexRender( + header.column.columnDef.footer, + header.getContext() + ) + : null} + + ))} + + ))} + + ) +} + +// ============================================================================ +// Main Component +// ============================================================================ + +export function VaultsTable() { + const [openModalVaultId, setOpenModalVaultId] = useState(null) + const { data: vaultDataList } = useStakingVaults() + const { isConnected } = useAccount() + const { mutate: createVault } = useCreateVault() + + const { data: emergencyModeEnabled } = useReadContract({ + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'emergencyModeEnabled', + query: { + refetchInterval: 30000, + }, + }) + + // Stable callback reference prevents column recreation on every render + const handleSetOpenModalVaultId = useCallback( + (vaultId: string | null) => setOpenModalVaultId(vaultId), + [] + ) + + // Memoize columns to prevent recreation unless dependencies change + const columns = useMemo( + () => + createVaultTableColumns({ + vaults: vaultDataList, + openModalVaultId, + setOpenModalVaultId: handleSetOpenModalVaultId, + emergencyModeEnabled, + isConnected, + }), + [ + vaultDataList, + openModalVaultId, + handleSetOpenModalVaultId, + emergencyModeEnabled, + isConnected, + ] + ) + + // Initialize TanStack Table + const table = useReactTable({ + data: vaultDataList || [], + columns, + getCoreRowModel: getCoreRowModel(), + }) + + return ( +
+
+

+ My vaults +

+ {isConnected && ( + + )} +
+ +
+ {!isConnected ? ( +
+
+

+ Connect your wallet to view your vaults +

+
+
+ ) : vaultDataList && vaultDataList.length === 0 ? ( +
+
+

No vaults found

+

+ Click "Add vault" to create your first vault +

+
+
+ ) : ( +
+
+ + + + +
+
+
+ )} +
+
+ ) +} diff --git a/apps/hub/src/app/_constants/address.ts b/apps/hub/src/app/_constants/address.ts new file mode 100644 index 000000000..20a81cee3 --- /dev/null +++ b/apps/hub/src/app/_constants/address.ts @@ -0,0 +1,31 @@ +import { + faucetAbi, + stakingManagerAbi, + tokenAbi, + vaultFactoryAbi, +} from './contracts' + +import type { Abi, Address } from 'viem' + +export const STAKING_MANAGER = { + address: '0x5cDf1646E4c1D21eE94DED1DA8da3Ca450dc96D1' as Address, + abi: stakingManagerAbi as Abi, +} as const + +export const VAULT_FACTORY = { + address: '0xddDcd43a0B0dA865decf3e4Ae71FbBE3e2DfFF14' as Address, + abi: vaultFactoryAbi as Abi, +} as const + +export const SNT_TOKEN = { + address: '0x1C3Ac2a186c6149Ae7Cb4D716eBbD0766E4f898a' as Address, + name: 'Status Test Token', + symbol: 'STT', + decimals: 18, + abi: tokenAbi as Abi, +} as const + +export const FAUCET = { + address: '0x4Fb609F4a457f47B41D35Dd060447271F000120A' as Address, + abi: faucetAbi as Abi, +} as const diff --git a/apps/hub/src/app/_constants/chain.ts b/apps/hub/src/app/_constants/chain.ts new file mode 100644 index 000000000..0d218fdbc --- /dev/null +++ b/apps/hub/src/app/_constants/chain.ts @@ -0,0 +1,46 @@ +import { getDefaultConfig } from 'connectkit' +import { createConfig, http } from 'wagmi' + +import type { Chain } from 'wagmi/chains' + +export const statusNetworkTestnet: Chain = { + id: 1660990954, + name: 'Status Network Testnet', + nativeCurrency: { + decimals: 18, + name: 'Ether', + symbol: 'ETH', + }, + rpcUrls: { + default: { + http: ['https://public.sepolia.rpc.status.network'], + }, + public: { + http: ['https://public.sepolia.rpc.status.network'], + }, + }, + blockExplorers: { + default: { + name: 'Status Explorer', + url: 'https://sepoliascan.status.network', + }, + }, +} + +export const getDefaultWagmiConfig = () => { + return getDefaultConfig({ + chains: [statusNetworkTestnet], + transports: { + [statusNetworkTestnet.id]: http(), + }, + enableFamily: false, + // TODO: move to env + walletConnectProjectId: '7ab664eee6a734b14327cdf4678a3431', + appName: 'Status Hub', + appDescription: 'Status Network DeFi Dashboard', + appUrl: 'https://status.app', + appIcon: 'https://status.app/icon.png', + }) +} + +export const wagmiConfig = createConfig(getDefaultWagmiConfig()) diff --git a/apps/hub/src/app/_constants/contracts/faucet.ts b/apps/hub/src/app/_constants/contracts/faucet.ts new file mode 100644 index 000000000..36184e86a --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/faucet.ts @@ -0,0 +1,48 @@ +export const faucetAbi = [ + { + inputs: [{ internalType: 'address', name: '_token', type: 'address' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { inputs: [], name: 'DailyLimitExceeded', type: 'error' }, + { inputs: [], name: 'InvalidAddress', type: 'error' }, + { inputs: [], name: 'InvalidAmount', type: 'error' }, + { + inputs: [], + name: 'DAILY_LIMIT', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'accountDailyRequests', + outputs: [{ internalType: 'uint256', name: 'amount', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'accountResetTime', + outputs: [{ internalType: 'uint256', name: 'time', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + { internalType: 'address', name: 'receiver', type: 'address' }, + ], + name: 'requestTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'token', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, +] diff --git a/apps/hub/src/app/_constants/contracts/index.ts b/apps/hub/src/app/_constants/contracts/index.ts new file mode 100644 index 000000000..4af6b2a90 --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/index.ts @@ -0,0 +1,5 @@ +export { faucetAbi } from './faucet' +export { stakingManagerAbi } from './stakingManagerAbi' +export { tokenAbi } from './tokenAbi' +export { vaultAbi } from './vaultAbi' +export { vaultFactoryAbi } from './vaultFactoryAbi' diff --git a/apps/hub/src/app/_constants/contracts/stakingManagerAbi.ts b/apps/hub/src/app/_constants/contracts/stakingManagerAbi.ts new file mode 100644 index 000000000..51e592803 --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/stakingManagerAbi.ts @@ -0,0 +1,992 @@ +export const stakingManagerAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + { inputs: [], name: 'StakeManager__AmountCannotBeZero', type: 'error' }, + { inputs: [], name: 'StakeManager__DurationCannotBeZero', type: 'error' }, + { inputs: [], name: 'StakeManager__EmergencyModeEnabled', type: 'error' }, + { inputs: [], name: 'StakeManager__FundsLocked', type: 'error' }, + { inputs: [], name: 'StakeManager__InsufficientBalance', type: 'error' }, + { inputs: [], name: 'StakeManager__InvalidVault', type: 'error' }, + { inputs: [], name: 'StakeManager__MigrationTargetHasFunds', type: 'error' }, + { inputs: [], name: 'StakeManager__RewardPeriodNotEnded', type: 'error' }, + { inputs: [], name: 'StakeManager__RewardTransferFailed', type: 'error' }, + { inputs: [], name: 'StakeManager__Unauthorized', type: 'error' }, + { inputs: [], name: 'StakeManager__VaultAlreadyRegistered', type: 'error' }, + { inputs: [], name: 'StakeManager__VaultNotRegistered', type: 'error' }, + { inputs: [], name: 'StakeMath__AbsoluteMaxMPOverflow', type: 'error' }, + { inputs: [], name: 'StakeMath__FundsLocked', type: 'error' }, + { inputs: [], name: 'StakeMath__InsufficientBalance', type: 'error' }, + { inputs: [], name: 'StakeMath__InvalidAmount', type: 'error' }, + { inputs: [], name: 'StakeMath__InvalidLockingPeriod', type: 'error' }, + { + inputs: [], + name: 'TrustedCodehashAccess__UnauthorizedCodehash', + type: 'error', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'previousAdmin', + type: 'address', + }, + { + indexed: false, + internalType: 'address', + name: 'newAdmin', + type: 'address', + }, + ], + name: 'AdminChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'beacon', + type: 'address', + }, + ], + name: 'BeaconUpgraded', + type: 'event', + }, + { anonymous: false, inputs: [], name: 'EmergencyModeEnabled', type: 'event' }, + { + anonymous: false, + inputs: [ + { indexed: false, internalType: 'uint8', name: 'version', type: 'uint8' }, + ], + name: 'Initialized', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'lockPeriod', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'lockUntil', + type: 'uint256', + }, + ], + name: 'Locked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'Paused', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'duration', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'startTime', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'endTime', + type: 'uint256', + }, + ], + name: 'RewardSet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'RewardsRedeemed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'supplier', + type: 'address', + }, + ], + name: 'RewardsSupplierSet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'bytes32', + name: 'previousAdminRole', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'newAdminRole', + type: 'bytes32', + }, + ], + name: 'RoleAdminChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleGranted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleRevoked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'lockTime', + type: 'uint256', + }, + ], + name: 'StakeMathTest', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'lockPeriod', + type: 'uint256', + }, + ], + name: 'Staked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'codehash', + type: 'bytes32', + }, + { indexed: false, internalType: 'bool', name: 'trusted', type: 'bool' }, + ], + name: 'TrustedCodehashUpdated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'Unpaused', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Unstaked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'implementation', + type: 'address', + }, + ], + name: 'Upgraded', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + ], + name: 'VaultLeft', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + ], + name: 'VaultMigrated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'VaultRegistered', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'rewardsAccrued', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'mpAccrued', + type: 'uint256', + }, + ], + name: 'VaultUpdated', + type: 'event', + }, + { + inputs: [], + name: 'ACCRUE_RATE', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'DEFAULT_ADMIN_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'GUARDIAN_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MAX_BALANCE', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MAX_LOCKUP_PERIOD', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MAX_MULTIPLIER', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MIN_BALANCE', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MIN_LOCKUP_PERIOD', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MP_APY', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MP_MPY', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MP_MPY_ABSOLUTE', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'REWARD_TOKEN', + outputs: [{ internalType: 'contract IERC20', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'SCALE_FACTOR', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'STAKING_TOKEN', + outputs: [{ internalType: 'contract IERC20', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'YEAR', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_initialOwner', type: 'address' }, + ], + name: '__TrustedCodehashAccess_init', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'emergencyModeEnabled', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'enableEmergencyMode', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'getAccountTotalMaxMP', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'getAccountTotalStakedBalance', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'getAccountVaults', + outputs: [{ internalType: 'address[]', name: '', type: 'address[]' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }], + name: 'getRoleAdmin', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'getVault', + outputs: [ + { + components: [ + { internalType: 'uint256', name: 'stakedBalance', type: 'uint256' }, + { internalType: 'uint256', name: 'rewardIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'mpAccrued', type: 'uint256' }, + { internalType: 'uint256', name: 'maxMP', type: 'uint256' }, + { + internalType: 'uint256', + name: 'lastMPUpdateTime', + type: 'uint256', + }, + { internalType: 'uint256', name: 'rewardsAccrued', type: 'uint256' }, + ], + internalType: 'struct StakeManager.VaultData', + name: '', + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'grantRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'hasRole', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_owner', type: 'address' }, + { internalType: 'address', name: '_stakingToken', type: 'address' }, + { internalType: 'address', name: '_rewardToken', type: 'address' }, + ], + name: 'initialize', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes32', name: '_codehash', type: 'bytes32' }], + name: 'isTrustedCodehash', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastMPUpdatedTime', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastRewardIndex', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastRewardTime', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'leave', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: 'lockPeriod', type: 'uint256' }, + { internalType: 'uint256', name: 'currentLockUntil', type: 'uint256' }, + ], + name: 'lock', + outputs: [ + { internalType: 'uint256', name: 'newLockUntil', type: 'uint256' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'migrateTo', type: 'address' }], + name: 'migrateToVault', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'mpAccruedOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'mpBalanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'mpBalanceOfAccount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'pause', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'paused', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'proxiableUUID', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'redeemRewards', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'registerVault', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'renounceRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'revokeRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'rewardAmount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardEndTime', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardStartTime', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'rewardsBalanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'rewardsBalanceOfAccount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardsSupplier', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + { internalType: 'uint256', name: 'duration', type: 'uint256' }, + ], + name: 'setReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_rewardsSupplier', type: 'address' }, + ], + name: 'setRewardsSupplier', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: '_codehash', type: 'bytes32' }, + { internalType: 'bool', name: '_trusted', type: 'bool' }, + ], + name: 'setTrustedCodehash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + { internalType: 'uint256', name: 'lockPeriod', type: 'uint256' }, + { internalType: 'uint256', name: 'currentLockUntil', type: 'uint256' }, + ], + name: 'stake', + outputs: [ + { internalType: 'uint256', name: 'newLockUntil', type: 'uint256' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'stakedBalanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }], + name: 'supportsInterface', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalMP', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalMPAccrued', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalMPStaked', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalMaxMP', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalRewardsAccrued', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalRewardsSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalShares', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalStaked', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'unpause', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'amount', type: 'uint256' }], + name: 'unstake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'updateAccount', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'updateGlobalState', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'updateVault', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'newImplementation', type: 'address' }, + ], + name: 'upgradeTo', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'newImplementation', type: 'address' }, + { internalType: 'bytes', name: 'data', type: 'bytes' }, + ], + name: 'upgradeToAndCall', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'vault', type: 'address' }], + name: 'vaultData', + outputs: [ + { internalType: 'uint256', name: 'stakedBalance', type: 'uint256' }, + { internalType: 'uint256', name: 'rewardIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'mpAccrued', type: 'uint256' }, + { internalType: 'uint256', name: 'maxMP', type: 'uint256' }, + { internalType: 'uint256', name: 'lastMPUpdateTime', type: 'uint256' }, + { internalType: 'uint256', name: 'rewardsAccrued', type: 'uint256' }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'vault', type: 'address' }], + name: 'vaultOwners', + outputs: [{ internalType: 'address', name: 'owner', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'vaultAddress', type: 'address' }, + ], + name: 'vaultShares', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'uint256', name: '', type: 'uint256' }, + ], + name: 'vaults', + outputs: [{ internalType: 'address', name: 'vault', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, +] diff --git a/apps/hub/src/app/_constants/contracts/tokenAbi.ts b/apps/hub/src/app/_constants/contracts/tokenAbi.ts new file mode 100644 index 000000000..fa5ea247d --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/tokenAbi.ts @@ -0,0 +1,60 @@ +export const tokenAbi = [ + { + inputs: [{ internalType: 'address', name: '_owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_spender', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_owner', type: 'address' }, + { internalType: 'address', name: '_spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ internalType: 'uint256', name: 'remaining', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const diff --git a/apps/hub/src/app/_constants/contracts/vaultAbi.ts b/apps/hub/src/app/_constants/contracts/vaultAbi.ts new file mode 100644 index 000000000..f9b8cb975 --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/vaultAbi.ts @@ -0,0 +1,258 @@ +import type { Abi } from 'viem' + +export const vaultAbi: Abi = [ + { + inputs: [ + { internalType: 'contract IERC20', name: 'token', type: 'address' }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { inputs: [], name: 'StakeVault__FundsLocked', type: 'error' }, + { inputs: [], name: 'StakeVault__InvalidDestinationAddress', type: 'error' }, + { inputs: [], name: 'StakeVault__MigrationFailed', type: 'error' }, + { inputs: [], name: 'StakeVault__NotAllowedToExit', type: 'error' }, + { inputs: [], name: 'StakeVault__NotAllowedToLeave', type: 'error' }, + { inputs: [], name: 'StakeVault__NotAuthorized', type: 'error' }, + { inputs: [], name: 'StakeVault__NotEnoughAvailableBalance', type: 'error' }, + { + inputs: [], + name: 'StakeVault__StakeManagerImplementationNotTrusted', + type: 'error', + }, + { inputs: [], name: 'StakeVault__StakingFailed', type: 'error' }, + { inputs: [], name: 'StakeVault__UnstakingFailed', type: 'error' }, + { inputs: [], name: 'StakeVault__WithdrawFromVaultFailed', type: 'error' }, + { + anonymous: false, + inputs: [ + { indexed: false, internalType: 'uint8', name: 'version', type: 'uint8' }, + ], + name: 'Initialized', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'previousOwner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'OwnershipTransferred', + type: 'event', + }, + { + inputs: [], + name: 'STAKING_TOKEN', + outputs: [{ internalType: 'contract IERC20', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'amountStaked', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'contract IERC20', name: '_token', type: 'address' }, + ], + name: 'availableWithdraw', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_destination', type: 'address' }, + ], + name: 'emergencyExit', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_owner', type: 'address' }, + { internalType: 'address', name: '_stakeManager', type: 'address' }, + ], + name: 'initialize', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_destination', type: 'address' }, + ], + name: 'leave', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_seconds', type: 'uint256' }], + name: 'lock', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'lockUntil', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'migrateTo', type: 'address' }], + name: 'migrateToVault', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'owner', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'register', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'renounceOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_seconds', type: 'uint256' }, + { internalType: 'address', name: '_from', type: 'address' }, + ], + name: 'stake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_seconds', type: 'uint256' }, + ], + name: 'stake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'stakeManager', + outputs: [ + { + internalType: 'contract IStakeManagerProxy', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'stakeManagerImplementationAddress', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }], + name: 'transferOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'stakeManagerAddress', type: 'address' }, + ], + name: 'trustStakeManager', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_amount', type: 'uint256' }], + name: 'unstake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'address', name: '_destination', type: 'address' }, + ], + name: 'unstake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_lockUntil', type: 'uint256' }], + name: 'updateLockUntil', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'contract IERC20', name: '_token', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'address', name: '_destination', type: 'address' }, + ], + name: 'withdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'contract IERC20', name: '_token', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + ], + name: 'withdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'address', name: '_destination', type: 'address' }, + ], + name: 'withdrawFromVault', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] diff --git a/apps/hub/src/app/_constants/contracts/vaultFactoryAbi.ts b/apps/hub/src/app/_constants/contracts/vaultFactoryAbi.ts new file mode 100644 index 000000000..7648ad0a3 --- /dev/null +++ b/apps/hub/src/app/_constants/contracts/vaultFactoryAbi.ts @@ -0,0 +1,150 @@ +export const vaultFactoryAbi = [ + { + inputs: [ + { internalType: 'address', name: '_owner', type: 'address' }, + { internalType: 'address', name: '_stakeManager', type: 'address' }, + { + internalType: 'address', + name: '_vaultImplementation', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'VaultFactory__InvalidStakeManagerAddress', + type: 'error', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'previousOwner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'OwnershipTransferred', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'newStakeManagerAddress', + type: 'address', + }, + ], + name: 'StakeManagerAddressChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'vault', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'VaultCreated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'newVaultImplementation', + type: 'address', + }, + ], + name: 'VaultImplementationChanged', + type: 'event', + }, + { + inputs: [], + name: 'createVault', + outputs: [ + { internalType: 'contract StakeVault', name: 'clone', type: 'address' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'owner', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'renounceOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_stakeManager', type: 'address' }, + ], + name: 'setStakeManager', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_vaultImplementation', + type: 'address', + }, + ], + name: 'setVaultImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'stakeManager', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }], + name: 'transferOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'vaultImplementation', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, +] diff --git a/apps/hub/src/app/_constants/index.ts b/apps/hub/src/app/_constants/index.ts new file mode 100644 index 000000000..6b4627b25 --- /dev/null +++ b/apps/hub/src/app/_constants/index.ts @@ -0,0 +1,2 @@ +export * from './address' +export * from './chain' diff --git a/apps/hub/src/app/_constants/session.ts b/apps/hub/src/app/_constants/session.ts new file mode 100644 index 000000000..d83d586e8 --- /dev/null +++ b/apps/hub/src/app/_constants/session.ts @@ -0,0 +1,24 @@ +type SessionConfig = { + cookieName: string + cookieOptions: { + httpOnly: boolean + secure: boolean + sameSite: 'lax' | 'strict' | 'none' + maxAge: number + path: string + } + password: string +} + +export const sessionConfig: SessionConfig = { + cookieName: 'status-hub-siwe', + cookieOptions: { + httpOnly: true, + secure: false, + sameSite: 'lax', + maxAge: 60 * 60, + path: '/', + }, + password: + 'complex_password_at_least_32_characters_long_replace_in_production_env', +} diff --git a/apps/hub/src/app/_constants/siwe.ts b/apps/hub/src/app/_constants/siwe.ts new file mode 100644 index 000000000..5b1f1dc29 --- /dev/null +++ b/apps/hub/src/app/_constants/siwe.ts @@ -0,0 +1,32 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck +import { + configureClientSIWE, + configureServerSideSIWE, +} from 'connectkit-next-siwe' + +import { getDefaultWagmiConfig } from './chain' +import { sessionConfig } from './session' + +const wagmiConfig = getDefaultWagmiConfig() + +/** + * Server-side SIWE configuration + * This handles signature verification and session management on the server + */ +export const siweServer = configureServerSideSIWE({ + config: { + chains: wagmiConfig.chains, + transports: wagmiConfig.transports, + }, + session: sessionConfig, +}) + +/** + * Client-side SIWE configuration + * This handles the authentication flow on the client + */ +export const siweClient = configureClientSIWE({ + apiRoutePrefix: '/api/siwe', + statement: 'Sign in with Ethereum to access Status Hub.', +}) diff --git a/apps/hub/src/app/_hooks/useApproveToken.ts b/apps/hub/src/app/_hooks/useApproveToken.ts new file mode 100644 index 000000000..8973b2945 --- /dev/null +++ b/apps/hub/src/app/_hooks/useApproveToken.ts @@ -0,0 +1,175 @@ +import { useToast } from '@status-im/components' +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { type Address, parseUnits, zeroAddress } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { SNT_TOKEN } from '~constants/index' +import { useVaultStateContext } from '~hooks/useVaultStateContext' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Parameters for token approval + */ +export interface ApproveTokenParams { + /** Amount of tokens to approve (in token units, not wei) */ + amount: string + /** Address of the spender (vault) to approve tokens for */ + spenderAddress: Address +} + +/** + * Return type for useApproveToken hook + */ +export type UseApproveTokenReturn = UseMutationResult< + void, + Error, + ApproveTokenParams, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY = 'approve-token' as const + +const TRANSACTION_CONFIG = { + CONFIRMATION_BLOCKS: 1, +} as const + +// ============================================================================ +// Hook +// ============================================================================ + +/** + * Mutation hook to approve SNT tokens for a spender (typically a vault) + * + * **Approval Process:** + * 1. Validates wallet connection and parameters + * 2. Converts amount to wei + * 3. Calls ERC20 approve function + * 4. Waits for transaction confirmation + * 5. Updates state machine with approval status + * + * @returns Mutation result with approval function and status + * + * @throws {Error} When wallet is not connected + * @throws {Error} When spender address is invalid + * @throws {Error} When amount is invalid or zero + * @throws {Error} When transaction is reverted + * + * @example + * Basic usage + * ```tsx + * function ApproveButton() { + * const { mutate: approveToken, isPending } = useApproveToken() + * + * const handleApprove = () => { + * approveToken({ + * amount: '100', + * spenderAddress: vaultAddress + * }) + * } + * + * return ( + * + * ) + * } + * ``` + * + * @example + * With callbacks + * ```tsx + * approveToken( + * { amount: '100', spenderAddress: vaultAddress }, + * { + * onSuccess: (txHash) => { + * console.log('Approved! Transaction:', txHash) + * }, + * onError: (error) => { + * console.error('Approval failed:', error) + * }, + * } + * ) + * ``` + */ +export function useApproveToken(): UseApproveTokenReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const { send: sendVaultEvent } = useVaultStateContext() + const toast = useToast() + + return useMutation({ + mutationKey: [MUTATION_KEY, address], + mutationFn: async ({ + amount, + spenderAddress, + }: ApproveTokenParams): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Validate spender address + if (!spenderAddress || spenderAddress === zeroAddress) { + throw new Error('Invalid spender address provided') + } + + // Validate amount + if (!amount || parseFloat(amount) <= 0) { + throw new Error('Amount must be greater than 0') + } + + // Convert amount to wei + const amountWei = parseUnits(amount, SNT_TOKEN.decimals) + + // Notify state machine of approval start + sendVaultEvent({ + type: 'START_INCREASE_ALLOWANCE', + amount, + }) + + try { + // Execute approval transaction + const hash = await writeContractAsync({ + address: SNT_TOKEN.address, + abi: SNT_TOKEN.abi, + functionName: 'approve', + args: [spenderAddress, amountWei], + }) + + // Transaction submitted, notify state machine + sendVaultEvent({ type: 'SIGN' }) + + // Wait for confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: TRANSACTION_CONFIG.CONFIRMATION_BLOCKS, + }) + + // Check for revert + if (status === 'reverted') { + throw new Error('Transaction was reverted') + } + + // Approval successful, notify state machine + sendVaultEvent({ type: 'COMPLETE', amount }) + toast.positive('Token Allowance has been increased') + } catch (error) { + // Handle approval failure + console.error('Failed to approve tokens:', error) + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useCompoundMultiplierPoints.ts b/apps/hub/src/app/_hooks/useCompoundMultiplierPoints.ts new file mode 100644 index 000000000..0e627f3eb --- /dev/null +++ b/apps/hub/src/app/_hooks/useCompoundMultiplierPoints.ts @@ -0,0 +1,170 @@ +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { formatUnits, zeroAddress } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { + SNT_TOKEN, + STAKING_MANAGER, + statusNetworkTestnet, +} from '~constants/index' +import { useMultiplierPointsBalance } from '~hooks/useMultiplierPoints' + +import { useVaultStateContext } from './useVaultStateContext' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Return type for the useCompoundMultiplierPoints mutation hook + */ +export type UseCompoundMultiplierPointsReturn = UseMutationResult< + void, + Error, + void, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY = 'compound-multiplier-points' as const + +const TRANSACTION_CONFIG = { + CONFIRMATION_BLOCKS: 1, +} as const + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to compound multiplier points (MP) for the connected account + * + * **Compounding Process:** + * Calls StakingManager.updateAccount() which: + * - Updates global state (reward index, MP accrual) + * - Calculates new MP accrued since last update + * - Updates the account's reward index + * - Compounds rewards based on current MP balance + * - Emits AccountUpdated event + * + * @returns Mutation result with mutate function to trigger compounding + * + * @throws {Error} When wallet is not connected + * @throws {Error} When account address is invalid + * @throws {Error} When transaction is reverted + * + * @example + * Basic usage + * ```tsx + * function CompoundButton() { + * const { mutate: compound, isPending } = useCompoundMultiplierPoints() + * + * return ( + * + * ) + * } + * ``` + * + * @example + * With success/error handling + * ```tsx + * function CompoundManager() { + * const { mutate: compound, isPending } = useCompoundMultiplierPoints() + * + * const handleCompound = () => { + * compound(undefined, { + * onSuccess: (txHash) => { + * toast.success(`Compounded! Tx: ${txHash}`) + * }, + * onError: (error) => { + * toast.error(`Failed to compound: ${error.message}`) + * }, + * }) + * } + * + * return ( + * + * ) + * } + * ``` + */ +export function useCompoundMultiplierPoints(): UseCompoundMultiplierPointsReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const { data: mpBalance, refetch: refetchMultiplierPoints } = + useMultiplierPointsBalance() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + + return useMutation({ + mutationKey: [MUTATION_KEY, address], + mutationFn: async (): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Validate account address + if (address === zeroAddress) { + throw new Error('Invalid account address provided') + } + + // Get the current MP balance to show in the dialog + const formattedAmount = formatUnits( + mpBalance?.totalUncompounded || 0n, + SNT_TOKEN.decimals + ) + + sendVaultEvent({ + type: 'START_COMPOUND', + amount: formattedAmount, + }) + + // Execute compound transaction via updateAccount + const hash = await writeContractAsync({ + chain: statusNetworkTestnet, + account: address, + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'updateAccount', + args: [address], + }) + + // Signal user to sign transaction + sendVaultEvent({ type: 'SIGN' }) + + // Wait for transaction confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: TRANSACTION_CONFIG.CONFIRMATION_BLOCKS, + }) + + // Check if transaction was reverted + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + }, + onSuccess: () => { + resetVault() + // Refetch account vaults to update UI with new compounded values + refetchMultiplierPoints() + }, + onError: () => { + sendVaultEvent({ type: 'REJECT' }) + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useCreateVault.ts b/apps/hub/src/app/_hooks/useCreateVault.ts new file mode 100644 index 000000000..e5d7725fa --- /dev/null +++ b/apps/hub/src/app/_hooks/useCreateVault.ts @@ -0,0 +1,186 @@ +import { useToast } from '@status-im/components' +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { type Address, type Hash } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { VAULT_FACTORY } from '~constants/index' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useVaultStateContext } from '~hooks/useVaultStateContext' +import { shortenAddress } from '~utils/address' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Return type for the useCreateVault hook + */ +export type UseCreateVaultReturn = UseMutationResult + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY = 'create-vault' as const + +const DEFAULT_DELAY = 100 as const + +const TRANSACTION_CONFIG = { + CONFIRMATION_BLOCKS: 1, +} as const + +// Event signature for VaultCreated(address indexed vault, address indexed owner) +const VAULT_CREATED_EVENT_SIGNATURE = + '0x5d9c31ffa0fecffd7cf379989a3c7af252f0335e0d2a1320b55245912c781f53' as const + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Extracts the vault address from VaultCreated event logs + */ +function extractVaultAddressFromLogs( + logs: Array<{ address: Address; topics: readonly string[] }> +): Address { + const vaultCreatedLog = logs.find(log => { + // Check if this log is from the vault factory contract + if (log.address.toLowerCase() !== VAULT_FACTORY.address.toLowerCase()) { + return false + } + + // Check if this is the VaultCreated event + return log.topics[0] === VAULT_CREATED_EVENT_SIGNATURE + }) + + if (!vaultCreatedLog || !vaultCreatedLog.topics[1]) { + throw new Error('VaultCreated event not found in transaction logs') + } + + // The vault address is the first indexed parameter (topics[1]) + // Remove the padding from the address (first 24 bytes) + const paddedAddress = vaultCreatedLog.topics[1] as `0x${string}` + return `0x${paddedAddress.slice(26)}` as Address +} + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to create a new staking vault + * + * **Creation Process:** + * 1. Calls VaultFactory.createVault() + * 2. Waits for transaction confirmation + * 3. Extracts the new vault address from event logs + * 4. Updates state machine and refetches vaults + * 5. Shows success toast notification + * + * @returns Mutation result with mutate function to trigger vault creation + * + * @throws {Error} When wallet is not connected + * @throws {Error} When transaction is reverted + * @throws {Error} When vault address cannot be extracted + * + * @example + * Basic usage + * ```tsx + * function CreateVaultButton() { + * const { mutate: createVault, isPending } = useCreateVault() + * + * return ( + * + * ) + * } + * ``` + * + * @example + * With success handling + * ```tsx + * const { mutate: createVault } = useCreateVault() + * + * createVault(undefined, { + * onSuccess: (txHash) => { + * console.log('Vault created! Transaction:', txHash) + * }, + * onError: (error) => { + * console.error('Failed to create vault:', error) + * }, + * }) + * ``` + */ +export function useCreateVault(): UseCreateVaultReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const { refetch: refetchStakingVaults } = useStakingVaults() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + const config = useConfig() + const toast = useToast() + + return useMutation({ + mutationKey: [MUTATION_KEY, address], + mutationFn: async (): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Notify state machine of vault creation start + sendVaultEvent({ type: 'START_CREATE_VAULT' }) + + try { + // Execute vault creation transaction + const hash = await writeContractAsync({ + address: VAULT_FACTORY.address, + abi: VAULT_FACTORY.abi, + functionName: 'createVault', + }) + + // Transaction submitted, notify state machine + sendVaultEvent({ type: 'SIGN' }) + + // Wait for transaction confirmation and get logs + const { status, logs } = await waitForTransactionReceipt(config, { + hash, + confirmations: TRANSACTION_CONFIG.CONFIRMATION_BLOCKS, + }) + + // Check for transaction revert + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + + // Extract the newly created vault address from logs + const deployedVaultAddress = extractVaultAddressFromLogs(logs) + + // Show success toast + toast.positive( + `Vault ${shortenAddress(deployedVaultAddress)} has been created` + ) + + // Small delay to ensure toast is rendered before state reset + await new Promise(resolve => setTimeout(resolve, DEFAULT_DELAY)) + + // Reset state machine and refetch vaults + resetVault() + await refetchStakingVaults() + + return hash + } catch (error) { + // Transaction failed or user rejected + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useExchangeRate.ts b/apps/hub/src/app/_hooks/useExchangeRate.ts new file mode 100644 index 000000000..a59a68441 --- /dev/null +++ b/apps/hub/src/app/_hooks/useExchangeRate.ts @@ -0,0 +1,144 @@ +import { useQuery } from '@tanstack/react-query' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Exchange rate data for SNT/USDT pair + */ +export interface ExchangeRateData { + /** Exchange rate price (SNT in USDT) */ + price: number + /** Timestamp when the rate was fetched */ + timestamp: number +} + +/** + * Options for exchange rate query configuration + */ +export interface UseExchangeRateOptions { + /** + * Enable or disable the query + * @default true + */ + enabled?: boolean + /** + * Refetch interval in milliseconds + * @default 60000 (1 minute) + */ + refetchInterval?: number + /** + * Time in milliseconds until data is considered stale + * @default 30000 (30 seconds) + */ + staleTime?: number +} + +/** + * Return type for useExchangeRate hook + */ +export type UseExchangeRateReturn = ReturnType + +// ============================================================================ +// Constants +// ============================================================================ + +const QUERY_KEY_PREFIX = 'exchangeRate' +const BINANCE_API_URL = + 'https://api.binance.com/api/v3/ticker/price?symbol=SNTUSDT' +const DEFAULT_REFETCH_INTERVAL = 60_000 // 1 minute +const DEFAULT_STALE_TIME = 30_000 // 30 seconds + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Fetches the current SNT/USDT exchange rate from Binance + * + * @returns Exchange rate data with price and timestamp + * @throws Error if the API request fails or returns invalid data + */ +async function fetchExchangeRate(): Promise { + const response = await fetch(BINANCE_API_URL) + + if (!response.ok) { + throw new Error( + `Failed to fetch exchange rate: ${response.status} ${response.statusText}` + ) + } + + const data = await response.json() + + if (!data.price) { + throw new Error('Invalid response from Binance API: missing price') + } + + const price = parseFloat(data.price) + + if (isNaN(price)) { + throw new Error(`Invalid price value: ${data.price}`) + } + + return { + price, + timestamp: Date.now(), + } +} + +// ============================================================================ +// Hook +// ============================================================================ + +/** + * Hook to fetch and cache the current SNT/USDT exchange rate + * + * Automatically refetches the rate at regular intervals to keep data fresh. + * Provides loading, error, and success states via React Query. + * + * @param options - Query configuration options + * @returns React Query result with exchange rate data + * + * @example + * ```tsx + * function PriceDisplay() { + * const { data, isLoading, error } = useExchangeRate() + * + * if (isLoading) return
Loading price...
+ * if (error) return
Failed to load price
+ * + * return
1 SNT = ${data.price.toFixed(6)} USDT
+ * } + * ``` + * + * @example + * ```tsx + * // Custom refetch interval + * function LivePrice() { + * const { data } = useExchangeRate({ + * refetchInterval: 30000, // Refetch every 30 seconds + * }) + * + * return
${data?.price.toFixed(6)}
+ * } + * ``` + */ +export function useExchangeRate(options: UseExchangeRateOptions = {}) { + const { + enabled = true, + refetchInterval = DEFAULT_REFETCH_INTERVAL, + staleTime = DEFAULT_STALE_TIME, + } = options + + return useQuery({ + queryKey: [QUERY_KEY_PREFIX] as const, + queryFn: fetchExchangeRate, + enabled, + refetchInterval, + staleTime, + retry: 3, + retryDelay: attemptIndex => + Math.min(1000 * 2 ** attemptIndex, DEFAULT_STALE_TIME), + }) +} diff --git a/apps/hub/src/app/_hooks/useFaucet.ts b/apps/hub/src/app/_hooks/useFaucet.ts new file mode 100644 index 000000000..c23ffa171 --- /dev/null +++ b/apps/hub/src/app/_hooks/useFaucet.ts @@ -0,0 +1,250 @@ +import { + useMutation, + type UseMutationResult, + useQuery, + useQueryClient, + type UseQueryResult, +} from '@tanstack/react-query' +import { useAccount, useChainId, useConfig, useWriteContract } from 'wagmi' +import { readContracts } from 'wagmi/actions' + +import { FAUCET, statusNetworkTestnet } from '~constants/index' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Faucet data returned from contract queries + */ +export interface FaucetData { + /** Daily token request limit for each account */ + dailyLimit: bigint + /** Number of requests made by the account today */ + accountDailyRequests: bigint + /** Unix timestamp when the account's daily limit resets */ + accountResetTime: bigint +} + +/** + * Derived faucet state information + */ +export interface FaucetState extends FaucetData { + /** Whether the account can claim tokens (hasn't hit daily limit) */ + canClaim: boolean + /** Number of requests remaining for the account today */ + remainingRequests: bigint + /** Whether the account has used the faucet today */ + hasUsedFaucet: boolean + /** Amount of tokens actually used today */ + actualUsedToday: bigint + /** Amount of tokens remaining for the account today */ + remainingAmount: bigint +} + +/** + * Options for the faucet query hook + */ +export interface UseFaucetQueryOptions { + /** Whether to enable the query. Defaults to when address is available */ + enabled?: boolean + /** Refetch interval in milliseconds */ + refetchInterval?: number +} + +export interface UseFaucetMutationOptions { + amount?: bigint +} + +// ============================================================================ +// Constants +// ============================================================================ + +const QUERY_KEY_PREFIX = 'faucet' as const +const DEFAULT_REFETCH_INTERVAL = 30_000 // 30 seconds + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to request tokens from the faucet + * + * @returns Mutation result with requestTokens function + * + * @throws {Error} When wallet is not connected + * + * @example + * ```tsx + * function FaucetButton() { + * const { mutate: requestTokens, isPending } = useFaucetMutation() + * + * return ( + * + * ) + * } + * ``` + */ +export function useFaucetMutation(): UseMutationResult< + void, + Error, + UseFaucetMutationOptions, + unknown +> { + const { address } = useAccount() + const { writeContract } = useWriteContract() + const chainId = useChainId() + const queryClient = useQueryClient() + const { refetch: refetchFaucetQuery } = useFaucetQuery() + + return useMutation({ + mutationKey: [QUERY_KEY_PREFIX, 'request', address], + mutationFn: async ({ amount }: UseFaucetMutationOptions) => { + if (!address) { + throw new Error('Wallet not connected') + } + + return writeContract({ + chain: statusNetworkTestnet, + account: address, + address: FAUCET.address, + abi: FAUCET.abi, + functionName: 'requestTokens', + args: [amount ?? 0n, address], + }) + }, + onSuccess: () => { + refetchFaucetQuery() + // Invalidate faucet query to refetch updated data + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY_PREFIX, address, chainId], + }) + }, + onError: error => { + console.error('Failed to request tokens:', error) + }, + }) +} + +// ============================================================================ +// Query Hook +// ============================================================================ + +/** + * Query hook to fetch faucet data for the connected account + * + * Fetches: + * - Daily token request limit + * - Number of requests made by the account today + * - Reset time for the account's daily limit + * + * @param options - Query configuration options + * @returns Query result with faucet state data + * + * @example + * ```tsx + * function FaucetInfo() { + * const { data, isLoading } = useFaucetQuery() + * + * if (isLoading) return + * if (!data) return null + * + * return ( + *
+ *

Requests remaining: {data.remainingRequests.toString()}

+ *

Can request: {data.canRequest ? 'Yes' : 'No'}

+ *
+ * ) + * } + * ``` + */ +export function useFaucetQuery( + options?: UseFaucetQueryOptions +): UseQueryResult { + const config = useConfig() + const { address } = useAccount() + const chainId = useChainId() + + return useQuery({ + queryKey: [QUERY_KEY_PREFIX, address, chainId] as const, + queryFn: async (): Promise => { + if (!address) { + throw new Error('Wallet not connected') + } + + const results = await readContracts(config, { + contracts: [ + { + chainId, + address: FAUCET.address, + abi: FAUCET.abi, + functionName: 'DAILY_LIMIT', + }, + { + chainId, + address: FAUCET.address, + abi: FAUCET.abi, + functionName: 'accountDailyRequests', + args: [address], + }, + { + chainId, + address: FAUCET.address, + abi: FAUCET.abi, + functionName: 'accountResetTime', + args: [address], + }, + ], + }) + + // Extract results with proper error handling + const [dailyLimitResult, requestsResult, resetTimeResult] = results + + if (dailyLimitResult.status === 'failure') { + throw new Error('Failed to fetch daily limit') + } + if (requestsResult.status === 'failure') { + throw new Error('Failed to fetch account requests') + } + if (resetTimeResult.status === 'failure') { + throw new Error('Failed to fetch reset time') + } + + // Type-safe extraction of results + const dailyLimit = dailyLimitResult.result as bigint + const accountDailyRequests = requestsResult.result as bigint + const accountResetTime = resetTimeResult.result as bigint + + // Calculate derived state + const remainingRequests = + dailyLimit > accountDailyRequests + ? dailyLimit - accountDailyRequests + : 0n + + const now = Math.floor(Date.now() / 1000) + + // const remainingRequests = dailyLimit > accountDailyRequests + const remainingAmount = + accountResetTime <= now ? dailyLimit : dailyLimit - accountDailyRequests + const actualUsedToday = + accountResetTime <= now ? 0n : accountDailyRequests + const hasUsedFaucet = actualUsedToday > 0n + const canClaim = remainingAmount > 0n + + return { + dailyLimit, + accountDailyRequests, + accountResetTime, + hasUsedFaucet, + actualUsedToday, + remainingAmount, + remainingRequests, + canClaim, + } + }, + enabled: options?.enabled ?? !!address, + refetchInterval: options?.refetchInterval ?? DEFAULT_REFETCH_INTERVAL, + }) +} diff --git a/apps/hub/src/app/_hooks/useLockVault.ts b/apps/hub/src/app/_hooks/useLockVault.ts new file mode 100644 index 000000000..bf2a346d6 --- /dev/null +++ b/apps/hub/src/app/_hooks/useLockVault.ts @@ -0,0 +1,209 @@ +import { useToast } from '@status-im/components' +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { type Address, type Hash } from 'viem' +import { useAccount, useConfig, useReadContract, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { vaultAbi } from '~constants/contracts' +import { statusNetworkTestnet } from '~constants/index' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useVaultStateContext } from '~hooks/useVaultStateContext' +import { shortenAddress } from '~utils/address' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Parameters for locking a vault + */ +export interface LockVaultParams { + /** + * Increased lock duration in seconds + * The smart contract's _calculateLock handles all calculations: + * - New lock end = max(currentLockEnd, now) + increasedLockSeconds + * - Delta MP calculation + * - Validation (min/max periods, MP overflow) + */ + lockPeriodInSeconds: bigint +} + +/** + * Return type for the useLockVault hook + */ +export type UseLockVaultReturn = UseMutationResult< + Hash, + Error, + LockVaultParams, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY = 'lock-vault' as const + +const TRANSACTION_CONFIG = { + CONFIRMATION_BLOCKS: 1, +} as const + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Generates a success toast message based on the lock operation performed + * + * @param vaultAddress - The vault address that was locked/extended + * @param wasAlreadyLocked - True if extending an existing lock, false if creating a new lock + * @returns Formatted success message for the toast notification + */ +const formatLockSuccessMessage = ( + vaultAddress: Address, + wasAlreadyLocked: boolean +): string => { + if (wasAlreadyLocked) { + return 'Lock time extended successfully' + } + + return `Vault ${shortenAddress(vaultAddress)} has been locked` +} + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to lock or extend a staking vault's lock period + * + * **Locking Process:** + * Locks a vault for a specified duration to increase the boost multiplier. + * The longer the lock period, the higher the multiplier (max 9x). + * + * **How it works:** + * - Always pass the increased lock duration in seconds + * - The smart contract's `_calculateLock` function handles all calculations internally: + * - New lock end = max(currentLockEnd, now) + increasedLockSeconds + * - Delta MP = _bonusMP(balance, increasedLockSeconds) + * - Validation (min/max periods, MP overflow checks) + * + * **Process Flow:** + * 1. Validates wallet connection and lock period + * 2. Sends START_LOCK event to state machine + * 3. Calls `Vault.lock(increasedLockSeconds)` - contract handles the rest + * 4. Waits for transaction confirmation + * 5. Updates state machine and refetches vaults + * 6. Shows success toast notification + * + * @returns Mutation result with mutate function to trigger vault lock + * + * @throws {Error} When wallet is not connected + * @throws {Error} When lock period is invalid (zero or negative) + * @throws {Error} When transaction is reverted + * + * @example + * Locking or extending a vault for 30 days + * ```tsx + * function LockButton({ vaultAddress }: Props) { + * const { mutate: lockVault, isPending } = useLockVault(vaultAddress) + * + * const handleLock = () => { + * const thirtyDaysInSeconds = BigInt(30 * 24 * 60 * 60) + * lockVault({ + * lockPeriodInSeconds: thirtyDaysInSeconds, + * }) + * } + * + * return ( + * + * ) + * } + * ``` + */ +export function useLockVault(vaultAddress: Address): UseLockVaultReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + const { refetch: refetchStakingVaults } = useStakingVaults() + const toast = useToast() + + // Read current lockUntil to determine if vault is already locked + const { data: currentLockUntil } = useReadContract({ + abi: vaultAbi, + address: vaultAddress, + functionName: 'lockUntil', + }) as { data: bigint | undefined } + + return useMutation({ + mutationKey: [MUTATION_KEY, vaultAddress, address], + mutationFn: async ({ + lockPeriodInSeconds, + }: LockVaultParams): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Validate lock period + if (lockPeriodInSeconds <= 0n) { + throw new Error('Lock period must be greater than 0') + } + + // Notify state machine of lock start + sendVaultEvent({ type: 'START_LOCK' }) + + try { + // Call Vault.lock with the increased lock duration in seconds + // The smart contract's _calculateLock handles all the math + const hash = await writeContractAsync({ + chain: statusNetworkTestnet, + account: address, + address: vaultAddress, + abi: vaultAbi, + functionName: 'lock', + args: [lockPeriodInSeconds], + }) + + // Transaction submitted, notify state machine + sendVaultEvent({ type: 'SIGN' }) + + // Wait for transaction confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: TRANSACTION_CONFIG.CONFIRMATION_BLOCKS, + }) + + // Check for transaction revert + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + + // Check if vault was already locked before this transaction + const wasAlreadyLocked = currentLockUntil && currentLockUntil > 0n + + // Show success toast + toast.positive( + formatLockSuccessMessage(vaultAddress, !!wasAlreadyLocked) + ) + + // Reset state machine and refetch vaults + resetVault() + await refetchStakingVaults() + + return hash + } catch (error) { + console.error('Failed to lock vault:', error) + // Transaction failed or user rejected + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useMultiplierPoints.ts b/apps/hub/src/app/_hooks/useMultiplierPoints.ts new file mode 100644 index 000000000..c8c7acd07 --- /dev/null +++ b/apps/hub/src/app/_hooks/useMultiplierPoints.ts @@ -0,0 +1,217 @@ +import { useQuery, type UseQueryResult } from '@tanstack/react-query' +import { type Address } from 'viem' +import { useAccount, useChainId, useConfig } from 'wagmi' +import { readContract } from 'wagmi/actions' + +import { STAKING_MANAGER } from '~constants/index' +import { type StakingVault, useStakingVaults } from '~hooks/useStakingVaults' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Result data for multiplier points balance query + */ +export interface MultiplierPointsData { + /** Map of vault addresses to their current MP balances */ + vaultBalances: Record + /** Total uncompounded MP across all vaults */ + totalUncompounded: bigint + /** Total multiplier points redeemed by a user */ + totalMpRedeemed: bigint +} + +/** + * Return type for the useMultiplierPointsBalance query hook + */ +export type UseMultiplierPointsBalanceReturn = + UseQueryResult + +// ============================================================================ +// Constants +// ============================================================================ + +const QUERY_KEYS = { + MULTIPLIER_POINTS: 'multiplier-points-balance', +} as const + +const DEFAULT_MP_DATA: MultiplierPointsData = { + vaultBalances: {}, + totalUncompounded: 0n, + totalMpRedeemed: 0n, +} + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Fetches the multiplier points balance for a specific vault + */ +async function fetchVaultMpBalance( + config: ReturnType, + vaultAddress: Address +): Promise { + const result = (await readContract(config, { + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'mpBalanceOf', + args: [vaultAddress], + })) as bigint + + return result +} + +/** + * Calculates total uncompounded MP by comparing vault balances with staked amounts + */ +function calculateTotalUncompounded( + vaultBalances: Record, + vaults: StakingVault[] +): bigint { + return vaults.reduce((total, vault) => { + const currentBalance = vaultBalances[vault.address] ?? 0n + const stakedAmount = vault.data?.mpAccrued ?? 0n + const uncompounded = + currentBalance > stakedAmount ? currentBalance - stakedAmount : 0n + return total + uncompounded + }, 0n) +} + +/** + * Fetches the total multiplier points redeemed by a user + */ +async function fetchMpBalanceOfAccount( + config: ReturnType, + chainId: number, + address: Address +): Promise { + try { + const result = (await readContract(config, { + chainId, + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'mpBalanceOfAccount', + args: [address], + })) as bigint + + return result + } catch (error) { + console.error( + `Failed to fetch account MP redeemed for ${address}:`, + error instanceof Error ? error.message : String(error) + ) + return 0n + } +} + +// ============================================================================ +// Query Hook +// ============================================================================ + +/** + * Query hook to fetch multiplier points balances across all vaults + * + * **Data Retrieved:** + * - Individual vault MP balances + * - Total uncompounded MP (difference between current balance and staked amount) + * + * @returns Query result with MP balance data + * + * @example + * Basic usage + * ```tsx + * function MultiplierPointsDisplay() { + * const { data, isLoading, error } = useMultiplierPointsBalance() + * + * if (isLoading) return
Loading...
+ * if (error) return
Error: {error.message}
+ * + * return ( + *
+ *

Total Uncompounded: {data?.totalUncompounded.toString()}

+ *

Vaults: {Object.keys(data?.vaultBalances ?? {}).length}

+ *
+ * ) + * } + * ``` + * + * @example + * With formatted display + * ```tsx + * function CompoundInfo() { + * const { data } = useMultiplierPointsBalance() + * const hasUncompounded = (data?.totalUncompounded ?? 0n) > 0n + * + * return ( + *
+ * {hasUncompounded ? ( + *

{formatSNT(data.totalUncompounded)} points ready to compound

+ * ) : ( + *

No points ready to compound

+ * )} + *
+ * ) + * } + * ``` + */ +export function useMultiplierPointsBalance(): UseMultiplierPointsBalanceReturn { + const { address } = useAccount() + const config = useConfig() + const chainId = useChainId() + const { data: vaults } = useStakingVaults() + + return useQuery({ + queryKey: [QUERY_KEYS.MULTIPLIER_POINTS, address, vaults?.length], + queryFn: async (): Promise => { + if (!vaults || vaults.length === 0 || !address || !chainId) { + return DEFAULT_MP_DATA + } + + try { + const vaultAddresses = vaults.map(vault => vault.address) + + // Fetch all MP balances in parallel + const balances = await Promise.all( + vaultAddresses.map(vaultAddress => + fetchVaultMpBalance(config, vaultAddress) + ) + ) + + // Map addresses to balances + const vaultBalances = vaultAddresses.reduce( + (acc, vaultAddress, index) => { + acc[vaultAddress] = balances[index] + return acc + }, + {} as Record + ) + + const totalMpRedeemed = await fetchMpBalanceOfAccount( + config, + chainId, + address + ) + + // Calculate total uncompounded MPs + const totalUncompounded = calculateTotalUncompounded( + vaultBalances, + vaults + ) + + return { + vaultBalances, + totalUncompounded, + totalMpRedeemed, + } + } catch (error) { + console.error('Failed to fetch multiplier points balances:', error) + return DEFAULT_MP_DATA + } + }, + enabled: !!address && !!vaults && vaults.length > 0, + staleTime: 30_000, // Consider data fresh for 30 seconds + refetchInterval: 60_000, // Refetch every 60 seconds + }) +} diff --git a/apps/hub/src/app/_hooks/useSliderConfig.ts b/apps/hub/src/app/_hooks/useSliderConfig.ts new file mode 100644 index 000000000..7ff08f2d9 --- /dev/null +++ b/apps/hub/src/app/_hooks/useSliderConfig.ts @@ -0,0 +1,134 @@ +import { useQuery, type UseQueryResult } from '@tanstack/react-query' +import { useConfig } from 'wagmi' +import { readContract } from 'wagmi/actions' + +import { STAKING_MANAGER } from '~constants/index' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Slider configuration for lockup periods + */ +export interface SliderConfig { + /** Minimum lockup period in seconds */ + min: number + /** Maximum lockup period in seconds */ + max: number +} + +/** + * Return type for the useSliderConfig hook + */ +export type UseSliderConfigReturn = UseQueryResult + +// ============================================================================ +// Constants +// ============================================================================ + +const QUERY_KEY_PREFIX = 'slider-config' as const +const STALE_TIME = 5 * 60 * 1000 // 5 minutes +const CACHE_TIME = 10 * 60 * 1000 // 10 minutes + +// ============================================================================ +// Query Hook +// ============================================================================ + +/** + * Query hook to fetch slider configuration for vault lockup periods + * + * Retrieves MIN_LOCKUP_PERIOD and MAX_LOCKUP_PERIOD from the staking manager + * contract to configure the lockup period slider UI component. + * + * @returns Query result with slider configuration data + * + * @throws {Error} When contract read fails + * @throws {Error} When contract returns invalid values + * + * @example + * Basic usage + * ```tsx + * function LockupSlider() { + * const { data: config, isLoading } = useSliderConfig() + * + * if (isLoading) return
Loading...
+ * if (!config) return
Failed to load config
+ * + * return ( + * + * ) + * } + * ``` + * + * @example + * With error handling + * ```tsx + * function LockupConfig() { + * const { data: config, isLoading, isError, error } = useSliderConfig() + * + * if (isLoading) return + * if (isError) return + * + * return ( + *
+ *

Min: {config.min} seconds

+ *

Max: {config.max} seconds

+ *
+ * ) + * } + * ``` + */ +export function useSliderConfig(): UseSliderConfigReturn { + const config = useConfig() + + return useQuery({ + queryKey: [QUERY_KEY_PREFIX], + queryFn: async (): Promise => { + try { + // Fetch minimum lockup period + const minLockupPeriod = await readContract(config, { + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'MIN_LOCKUP_PERIOD', + }) + + // Fetch maximum lockup period + const maxLockupPeriod = await readContract(config, { + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'MAX_LOCKUP_PERIOD', + }) + + // Validate results + if ( + typeof minLockupPeriod !== 'bigint' || + typeof maxLockupPeriod !== 'bigint' + ) { + throw new Error('Invalid lockup period values returned from contract') + } + + // Ensure min is less than max + if (minLockupPeriod >= maxLockupPeriod) { + throw new Error( + 'Minimum lockup period must be less than maximum lockup period' + ) + } + + return { + min: Number(minLockupPeriod), + max: Number(maxLockupPeriod), + } + } catch (error) { + throw new Error( + `Failed to fetch slider configuration: ${error instanceof Error ? error.message : 'Unknown error'}` + ) + } + }, + staleTime: STALE_TIME, + gcTime: CACHE_TIME, + }) +} diff --git a/apps/hub/src/app/_hooks/useStakingVaults.ts b/apps/hub/src/app/_hooks/useStakingVaults.ts new file mode 100644 index 000000000..f3ed3b542 --- /dev/null +++ b/apps/hub/src/app/_hooks/useStakingVaults.ts @@ -0,0 +1,282 @@ +import { useQuery, type UseQueryResult } from '@tanstack/react-query' +import { type Address } from 'viem' +import { useAccount, useChainId, useConfig } from 'wagmi' +import { readContract, readContracts } from 'wagmi/actions' + +import { vaultAbi } from '~constants/contracts' +import { SNT_TOKEN, STAKING_MANAGER } from '~constants/index' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Vault data structure returned from the StakingManager contract + * Maps directly to the VaultData struct in the smart contract + */ +export interface StakingVaultData { + /** Total amount of tokens staked in the vault */ + stakedBalance: bigint + /** Current reward index for calculating accrued rewards */ + rewardIndex: bigint + /** Amount of multiplier points (MP) accrued over time */ + mpAccrued: bigint + /** Maximum multiplier points achievable based on stake and lock period */ + maxMP: bigint + /** Timestamp of the last MP update */ + lastMPUpdateTime: bigint + /** Timestamp when the vault unlocks (0 if not locked) */ + lockUntil: bigint + /** Total rewards accrued and available for claiming */ + rewardsAccrued: bigint + /** Actual token balance in the vault (from availableWithdraw) - reliable in emergency mode */ + depositedBalance: bigint +} + +/** + * Vault with its address and associated data + */ +export interface StakingVault { + /** The vault contract address */ + address: Address + /** Vault data from the contract, or null if fetch failed */ + data: StakingVaultData | null +} + +/** + * Configuration options for the useStakingVaults hook + */ +export interface UseStakingVaultsOptions { + /** Whether to enable the query. Defaults to true when wallet is connected */ + enabled?: boolean + /** Cache duration in milliseconds. Default: 10000ms (10 seconds) */ + staleTime?: number + /** Auto-refetch interval in milliseconds. Default: disabled */ + refetchInterval?: number +} + +/** + * Return type for the useStakingVaults hook + */ +export type UseStakingVaultsReturn = UseQueryResult + +// ============================================================================ +// Constants +// ============================================================================ + +const QUERY_KEY = 'staking-vaults' as const + +const CACHE_CONFIG = { + DEFAULT_STALE_TIME: 10_000, // 10 seconds +} as const + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Fetches vault addresses for a given account from the StakingManager contract + */ +async function fetchAccountVaultAddresses( + config: ReturnType, + chainId: number, + accountAddress: Address +): Promise { + const addresses = (await readContract(config, { + chainId, + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'getAccountVaults', + args: [accountAddress], + })) as Address[] + + return addresses +} + +/** + * Fetches vault data for a specific vault address with error handling + */ +async function fetchVaultData( + config: ReturnType, + chainId: number, + vaultAddress: Address +): Promise { + try { + const results = await readContracts(config, { + contracts: [ + { + chainId, + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'getVault', + args: [vaultAddress], + }, + { + chainId, + address: vaultAddress, + abi: vaultAbi, + functionName: 'lockUntil', + args: [], + }, + { + chainId, + address: SNT_TOKEN.address, + abi: SNT_TOKEN.abi, + functionName: 'balanceOf', + args: [vaultAddress], + }, + ], + }) + + // Check if all contract calls succeeded + const [vaultResult, lockUntilResult, depositedBalanceResult] = results + + if ( + vaultResult.status !== 'success' || + lockUntilResult.status !== 'success' || + depositedBalanceResult.status !== 'success' + ) { + console.error( + `Failed to fetch vault data for ${vaultAddress}:`, + vaultResult.status !== 'success' + ? vaultResult.error + : lockUntilResult.status !== 'success' + ? lockUntilResult.error + : depositedBalanceResult.error + ) + return null + } + + // Extract the actual data from successful results + const vaultData = vaultResult.result as Omit< + StakingVaultData, + 'lockUntil' | 'depositedBalance' + > + const lockUntil = lockUntilResult.result as bigint + const depositedBalance = depositedBalanceResult.result as bigint + + return { + ...vaultData, + lockUntil, + depositedBalance, + } + } catch (error) { + // Log error for debugging but don't throw - allows partial results + console.error( + `Failed to fetch vault data for ${vaultAddress}:`, + error instanceof Error ? error.message : String(error) + ) + return null + } +} + +/** + * Enriches a vault address with its data + */ +async function enrichVaultWithData( + config: ReturnType, + chainId: number, + vaultAddress: Address +): Promise { + const data = await fetchVaultData(config, chainId, vaultAddress) + return { address: vaultAddress, data } +} + +// ============================================================================ +// Hook +// ============================================================================ + +/** + * Query hook to fetch all staking vaults owned by the connected account + * + * **Features:** + * - Fetches vault addresses from StakingManager contract + * - Enriches each address with detailed vault data in parallel + * - Graceful error handling - failed vaults return with `data: null` + * - Automatic refetching and caching via React Query + * - Network-aware caching (includes chainId in query key) + * + * **Performance:** + * - Parallel fetching of vault data using Promise.all + * - Configurable cache duration via staleTime option + * - Optional auto-refetch via refetchInterval + * + * @param options - Configuration options for query behavior + * @returns React Query result with vault data + * + * @example + * Basic usage + * ```tsx + * function VaultsList() { + * const { data: vaults, isLoading, error } = useStakingVaults() + * + * if (isLoading) return + * if (error) return + * + * return ( + *
+ * {vaults?.map((vault) => + * vault.data ? ( + * + * ) : ( + * + * ) + * )} + *
+ * ) + * } + * ``` + * + * @example + * With custom options + * ```tsx + * const { data: vaults, refetch } = useStakingVaults({ + * enabled: isConnected, + * staleTime: 30_000, // 30 seconds + * refetchInterval: 60_000, // 1 minute + * }) + * ``` + * + * @example + * Filtering vaults with data + * ```tsx + * const { data: vaults } = useStakingVaults() + * const validVaults = vaults?.filter((v) => v.data !== null) ?? [] + * ``` + */ +export function useStakingVaults( + options?: UseStakingVaultsOptions +): UseStakingVaultsReturn { + const { address } = useAccount() + const config = useConfig() + const chainId = useChainId() + + return useQuery({ + queryKey: [QUERY_KEY, address, chainId], + queryFn: async (): Promise => { + // Guard: Return empty array if no wallet is connected + if (!address) { + return [] + } + + // Step 1: Fetch all vault addresses for the account + const vaultAddresses = await fetchAccountVaultAddresses( + config, + chainId, + address + ) + + // Step 2: Fetch detailed data for each vault in parallel + const vaults = await Promise.all( + vaultAddresses.map(vaultAddress => + enrichVaultWithData(config, chainId, vaultAddress) + ) + ) + + return vaults + }, + enabled: options?.enabled ?? !!address, + staleTime: options?.staleTime ?? CACHE_CONFIG.DEFAULT_STALE_TIME, + refetchInterval: options?.refetchInterval, + }) +} diff --git a/apps/hub/src/app/_hooks/useVaultEmergencyExit.ts b/apps/hub/src/app/_hooks/useVaultEmergencyExit.ts new file mode 100644 index 000000000..1229dcd46 --- /dev/null +++ b/apps/hub/src/app/_hooks/useVaultEmergencyExit.ts @@ -0,0 +1,165 @@ +import { + useMutation, + type UseMutationResult, + useQueryClient, +} from '@tanstack/react-query' +import { type Address, formatUnits } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { vaultAbi } from '~constants/contracts' +import { SNT_TOKEN, statusNetworkTestnet } from '~constants/index' +import { useVaultStateContext } from '~hooks/useVaultStateContext' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Parameters for emergency exit from a vault + */ +export interface EmergencyExitParams { + /** Amount being withdrawn (for display purposes only) */ + amountWei: bigint + /** Vault address */ + vaultAddress: Address + /** Optional callback called immediately after user signs transaction */ + onSigned?: () => void +} + +/** + * Return type for the useVaultEmergencyExit hook + */ +export type UseVaultEmergencyExitReturn = UseMutationResult< + void, + Error, + EmergencyExitParams, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY_PREFIX = 'vault-emergency-exit' as const +const CONFIRMATION_BLOCKS = 1 + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook for emergency exit from a vault + * + * Performs emergency withdrawal from a vault contract when emergency mode is enabled. + * This withdraws ALL staked tokens from the vault to the connected wallet address. + * Manages the state machine transitions for the withdrawal process. + * + * **Process Flow:** + * 1. Validates wallet connection + * 2. Calls vault.emergencyExit(address) and waits for user to sign + * 3. After signing, sends START_WITHDRAW event → Goes directly to processing state + * 4. Calls onSigned callback (typically to close modal) + * 5. Waits for transaction confirmation + * 6. On success: Refetches data and resets state machine + * 7. On error: Sends REJECT event → Shows rejected state + * + * **Important:** emergencyExit withdraws ALL funds from the vault regardless of + * the amountWei parameter. The amount is only used for display purposes in the UI. + * + * @returns Mutation result with mutate function to trigger emergency withdrawal + * + * @throws {Error} When wallet is not connected + * @throws {Error} When transaction is reverted + * + * @example + * Basic usage with modal closing after sign + * ```tsx + * function EmergencyWithdrawModal({ vaultAddress, stakedAmount, onClose }: Props) { + * const { mutate: emergencyExit } = useVaultEmergencyExit() + * + * const handleEmergencyExit = () => { + * emergencyExit({ + * amountWei: stakedAmount, + * vaultAddress, + * onSigned: () => { + * // Close modal after user signs in wallet + * onClose() + * } + * }) + * } + * + * return + * } + * ``` + */ +export function useVaultEmergencyExit(): UseVaultEmergencyExitReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const queryClient = useQueryClient() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + + return useMutation({ + mutationKey: [MUTATION_KEY_PREFIX, address], + mutationFn: async ({ + amountWei, + vaultAddress, + onSigned, + }: EmergencyExitParams): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Send START_WITHDRAW event first to transition state machine to processing + sendVaultEvent({ + type: 'START_WITHDRAW', + amount: formatUnits(amountWei, SNT_TOKEN.decimals), + }) + + // Close the modal immediately so the status dialog can show + onSigned?.() + + try { + // Execute emergency exit transaction + // emergencyExit withdraws ALL funds to the specified destination address + const hash = await writeContractAsync({ + chain: statusNetworkTestnet, + account: address, + address: vaultAddress, + abi: vaultAbi, + functionName: 'emergencyExit', + args: [address], + }) + + // Wait for transaction confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: CONFIRMATION_BLOCKS, + }) + + // Check if transaction was reverted + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + + // Transaction successful, invalidate cache to force fresh data from blockchain + await queryClient.invalidateQueries({ + queryKey: ['staking-vaults'], + }) + await queryClient.invalidateQueries({ + queryKey: ['multiplier-points-balance'], + }) + resetVault() + } catch (error) { + // Transaction failed or user rejected + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useVaultStateContext.tsx b/apps/hub/src/app/_hooks/useVaultStateContext.tsx new file mode 100644 index 000000000..4153dbcf4 --- /dev/null +++ b/apps/hub/src/app/_hooks/useVaultStateContext.tsx @@ -0,0 +1,39 @@ +'use client' + +import { createContext, useContext } from 'react' + +import { useVaultStateMachine } from '~hooks/useVaultStateMachine' + +import type { VaultEvent, VaultState } from '~hooks/useVaultStateMachine' + +type VaultStateContextType = { + state: VaultState + send: (event: VaultEvent) => void + reset: () => void +} + +const VaultStateContext = createContext(null) + +export const VaultStateProvider = ({ + children, +}: { + children: React.ReactNode +}) => { + const stateMachine = useVaultStateMachine() + + return ( + + {children} + + ) +} + +export const useVaultStateContext = () => { + const context = useContext(VaultStateContext) + if (!context) { + throw new Error( + 'useVaultStateContext must be used within VaultStateProvider' + ) + } + return context +} diff --git a/apps/hub/src/app/_hooks/useVaultStateMachine.ts b/apps/hub/src/app/_hooks/useVaultStateMachine.ts new file mode 100644 index 000000000..211dc97bc --- /dev/null +++ b/apps/hub/src/app/_hooks/useVaultStateMachine.ts @@ -0,0 +1,354 @@ +import { useCallback, useState } from 'react' + +import { match } from 'ts-pattern' + +// State definitions +export type VaultState = + | { type: 'idle' } + | { type: 'siwe'; step: 'initialize' | 'processing' | 'rejected' } + | { type: 'createVault'; step: 'initialize' | 'processing' | 'rejected' } + | { + type: 'increaseAllowance' + step: 'initialize' | 'processing' | 'rejected' + amount?: string + } + | { + type: 'staking' + step: 'initialize' | 'processing' | 'rejected' + amount?: string + } + | { + type: 'withdraw' + step: 'processing' | 'rejected' + amount?: string + } + | { + type: 'lock' + step: 'initialize' | 'processing' | 'rejected' + } + | { + type: 'compound' + step: 'initialize' | 'processing' | 'rejected' + amount?: string + } + | { type: 'success' } + +// Event definitions +export type VaultEvent = + | { type: 'START_SIWE' } + | { type: 'START_CREATE_VAULT' } + | { type: 'START_INCREASE_ALLOWANCE'; amount?: string } + | { type: 'SIGN' } + | { type: 'REJECT' } + | { type: 'PROCESS'; amount?: string } + | { type: 'COMPLETE'; amount?: string } + | { type: 'READY_TO_STAKE' } + | { type: 'START_STAKING'; amount?: string } + | { type: 'START_WITHDRAW'; amount?: string } + | { type: 'START_LOCK' } + | { type: 'START_COMPOUND'; amount?: string } + | { type: 'RESET' } + +// Transition function +function transition(state: VaultState, event: VaultEvent): VaultState { + return ( + match<[VaultState, VaultEvent], VaultState>([state, event]) + .with([{ type: 'idle' }, { type: 'START_SIWE' }], () => ({ + type: 'siwe', + step: 'initialize', + })) + .with([{ type: 'idle' }, { type: 'START_CREATE_VAULT' }], () => ({ + type: 'createVault', + step: 'initialize', + })) + .with( + [{ type: 'idle' }, { type: 'START_INCREASE_ALLOWANCE' }], + ([, event]) => ({ + type: 'increaseAllowance', + step: 'initialize', + amount: event.amount, + }) + ) + .with([{ type: 'idle' }, { type: 'START_STAKING' }], ([, event]) => ({ + type: 'staking', + step: 'initialize', + amount: event.amount, + })) + .with([{ type: 'idle' }, { type: 'START_COMPOUND' }], ([, event]) => ({ + type: 'compound', + step: 'initialize', + amount: event.amount, + })) + + // SIWE flow + .with([{ type: 'siwe', step: 'initialize' }, { type: 'SIGN' }], () => ({ + type: 'siwe', + step: 'processing', + })) + .with([{ type: 'siwe', step: 'initialize' }, { type: 'REJECT' }], () => ({ + type: 'siwe', + step: 'rejected', + })) + .with( + [{ type: 'siwe', step: 'processing' }, { type: 'COMPLETE' }], + () => ({ + type: 'success', + }) + ) + .with([{ type: 'siwe', step: 'processing' }, { type: 'REJECT' }], () => ({ + type: 'siwe', + step: 'rejected', + })) + .with([{ type: 'siwe', step: 'processing' }, { type: 'RESET' }], () => ({ + type: 'idle', + })) + .with([{ type: 'siwe', step: 'rejected' }, { type: 'RESET' }], () => ({ + type: 'idle', + })) + + // Create Vault flow + .with( + [{ type: 'createVault', step: 'initialize' }, { type: 'SIGN' }], + () => ({ + type: 'createVault', + step: 'processing', + }) + ) + .with( + [{ type: 'createVault', step: 'initialize' }, { type: 'REJECT' }], + () => ({ + type: 'createVault', + step: 'rejected', + }) + ) + .with( + [{ type: 'createVault', step: 'processing' }, { type: 'REJECT' }], + () => ({ + type: 'createVault', + step: 'rejected', + }) + ) + .with( + [{ type: 'createVault', step: 'processing' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + .with( + [{ type: 'createVault', step: 'rejected' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + + // Increase Allowance flow + .with( + [{ type: 'increaseAllowance', step: 'initialize' }, { type: 'SIGN' }], + ([state]) => ({ + type: 'increaseAllowance', + step: 'processing', + amount: state.amount, + }) + ) + .with( + [{ type: 'increaseAllowance', step: 'initialize' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'increaseAllowance', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [ + { type: 'increaseAllowance', step: 'processing' }, + { type: 'COMPLETE' }, + ], + ([state, event]) => ({ + type: 'staking', + step: 'initialize', + amount: event.amount || state.amount || '0', + }) + ) + .with( + [{ type: 'increaseAllowance', step: 'processing' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'increaseAllowance', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [ + { type: 'increaseAllowance', step: 'rejected' }, + { type: 'START_INCREASE_ALLOWANCE' }, + ], + ([state, event]) => ({ + type: 'increaseAllowance', + step: 'initialize', + amount: event.amount || state.amount, + }) + ) + .with( + [{ type: 'increaseAllowance', step: 'rejected' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + + // Staking flow + .with( + [{ type: 'staking', step: 'initialize' }, { type: 'SIGN' }], + ([state]) => ({ + type: 'staking', + step: 'processing', + amount: state.amount, + }) + ) + .with( + [{ type: 'staking', step: 'processing' }, { type: 'COMPLETE' }], + () => ({ type: 'success' }) + ) + .with( + [{ type: 'staking', step: 'processing' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'staking', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [{ type: 'staking', step: 'processing' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + .with( + [{ type: 'staking', step: 'rejected' }, { type: 'START_STAKING' }], + ([state, event]) => ({ + type: 'staking', + step: 'initialize', + amount: event.amount || state.amount, + }) + ) + .with([{ type: 'staking', step: 'rejected' }, { type: 'RESET' }], () => ({ + type: 'idle', + })) + + // Withdraw flow - goes directly to processing when started + .with([{ type: 'idle' }, { type: 'START_WITHDRAW' }], ([, event]) => ({ + type: 'withdraw', + step: 'processing', + amount: event.amount, + })) + .with( + [{ type: 'withdraw', step: 'processing' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + .with( + [{ type: 'withdraw', step: 'processing' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'withdraw', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [{ type: 'withdraw', step: 'rejected' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + + // Lock flow + .with([{ type: 'idle' }, { type: 'START_LOCK' }], () => ({ + type: 'lock', + step: 'initialize', + })) + .with([{ type: 'lock', step: 'initialize' }, { type: 'SIGN' }], () => ({ + type: 'lock', + step: 'processing', + })) + .with([{ type: 'lock', step: 'initialize' }, { type: 'REJECT' }], () => ({ + type: 'lock', + step: 'rejected', + })) + .with([{ type: 'lock', step: 'processing' }, { type: 'REJECT' }], () => ({ + type: 'lock', + step: 'rejected', + })) + .with([{ type: 'lock', step: 'processing' }, { type: 'RESET' }], () => ({ + type: 'idle', + })) + .with( + [{ type: 'lock', step: 'rejected' }, { type: 'START_LOCK' }], + () => ({ + type: 'lock', + step: 'initialize', + }) + ) + .with([{ type: 'lock', step: 'rejected' }, { type: 'RESET' }], () => ({ + type: 'idle', + })) + + // compound flow + .with( + [{ type: 'compound', step: 'initialize' }, { type: 'SIGN' }], + ([state]) => ({ + type: 'compound', + step: 'processing', + amount: state.amount, + }) + ) + .with( + [{ type: 'compound', step: 'initialize' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'compound', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [{ type: 'compound', step: 'processing' }, { type: 'COMPLETE' }], + () => ({ type: 'success' }) + ) + .with( + [{ type: 'compound', step: 'processing' }, { type: 'REJECT' }], + ([state]) => ({ + type: 'compound', + step: 'rejected', + amount: state.amount, + }) + ) + .with( + [{ type: 'compound', step: 'processing' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + .with( + [{ type: 'compound', step: 'rejected' }, { type: 'START_COMPOUND' }], + ([state, event]) => ({ + type: 'compound', + step: 'initialize', + amount: event.amount || state.amount, + }) + ) + .with( + [{ type: 'compound', step: 'rejected' }, { type: 'RESET' }], + () => ({ type: 'idle' }) + ) + + // Reset from success + .with([{ type: 'success' }, { type: 'RESET' }], () => ({ type: 'idle' })) + + // Fallback + .otherwise(() => state) + ) +} + +// Hook +export function useVaultStateMachine() { + const [state, setState] = useState({ type: 'idle' }) + + const send = useCallback((event: VaultEvent) => { + setState(currentState => transition(currentState, event)) + }, []) + + const reset = useCallback(() => { + send({ type: 'RESET' }) + }, [send]) + + return { + state, + send, + reset, + } +} diff --git a/apps/hub/src/app/_hooks/useVaultTokenStake.ts b/apps/hub/src/app/_hooks/useVaultTokenStake.ts new file mode 100644 index 000000000..654c14775 --- /dev/null +++ b/apps/hub/src/app/_hooks/useVaultTokenStake.ts @@ -0,0 +1,171 @@ +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { type Address, formatUnits } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { vaultAbi } from '~constants/contracts' +import { SNT_TOKEN, statusNetworkTestnet } from '~constants/index' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useVaultStateContext } from '~hooks/useVaultStateContext' + +import { useMultiplierPointsBalance } from './useMultiplierPoints' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Parameters for staking to a vault + */ +export interface StakeParams { + /** Amount to stake in wei */ + amountWei: bigint + /** Lock period in seconds (0 for no lock) */ + lockPeriod: bigint + /** Vault address */ + vaultAddress: Address +} + +/** + * Return type for the useVaultStake hook + */ +export type UseVaultStakeReturn = UseMutationResult< + void, + Error, + StakeParams, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY_PREFIX = 'vault-stake' as const +const CONFIRMATION_BLOCKS = 1 + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to stake tokens to a vault + * + * Stakes tokens to the StakingManager contract with an optional lock period. + * Manages the state machine transitions for the staking process. + * + * @returns Mutation result with mutate function to trigger staking + * + * @throws {Error} When wallet is not connected + * @throws {Error} When transaction is reverted + * + * @example + * Basic usage + * ```tsx + * function StakeButton({ amount, lockPeriod }: { amount: bigint, lockPeriod: bigint }) { + * const { mutate: stake, isPending } = useVaultStake() + * + * return ( + * + * ) + * } + * ``` + * + * @example + * With success/error handling + * ```tsx + * function StakeManager() { + * const { mutate: stake, isPending } = useVaultStake() + * + * const handleStake = (amount: bigint, lockPeriod: bigint) => { + * stake( + * { amountWei: amount, lockPeriod }, + * { + * onSuccess: (txHash) => { + * console.log('Staked successfully! Transaction:', txHash) + * }, + * onError: (error) => { + * console.error('Failed to stake:', error) + * }, + * } + * ) + * } + * + * return + * } + * ``` + */ +export function useVaultTokenStake(): UseVaultStakeReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + const { refetch: refetchStakingVaults } = useStakingVaults() + const { refetch: refetchMultiplierPoints } = useMultiplierPointsBalance() + + return useMutation({ + mutationKey: [MUTATION_KEY_PREFIX, address], + mutationFn: async ({ + amountWei, + lockPeriod, + vaultAddress, + }: StakeParams): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Validate amount + if (amountWei <= 0n) { + throw new Error('Amount must be greater than 0') + } + + // Send state machine event to start staking + sendVaultEvent({ + type: 'START_STAKING', + amount: formatUnits(amountWei, SNT_TOKEN.decimals), + }) + + try { + // Execute staking transaction + const hash = await writeContractAsync({ + chain: statusNetworkTestnet, + account: address, + address: vaultAddress, + abi: vaultAbi, + functionName: 'stake', + args: [amountWei, lockPeriod], + }) + + // Transaction submitted successfully, transition to processing + sendVaultEvent({ type: 'SIGN' }) + + // Wait for transaction confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: CONFIRMATION_BLOCKS, + }) + + // Check if transaction was reverted + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + + // Transaction successful, refetch data and close dialog + await Promise.all([refetchStakingVaults(), refetchMultiplierPoints()]) + resetVault() + } catch (error) { + // Transaction failed or user rejected + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useVaultWithdraw.ts b/apps/hub/src/app/_hooks/useVaultWithdraw.ts new file mode 100644 index 000000000..cd9f46235 --- /dev/null +++ b/apps/hub/src/app/_hooks/useVaultWithdraw.ts @@ -0,0 +1,160 @@ +import { useMutation, type UseMutationResult } from '@tanstack/react-query' +import { type Address, formatUnits } from 'viem' +import { useAccount, useConfig, useWriteContract } from 'wagmi' +import { waitForTransactionReceipt } from 'wagmi/actions' + +import { vaultAbi } from '~constants/contracts' +import { SNT_TOKEN, statusNetworkTestnet } from '~constants/index' +import { useMultiplierPointsBalance } from '~hooks/useMultiplierPoints' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useVaultStateContext } from '~hooks/useVaultStateContext' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Parameters for withdrawing from a vault + */ +export interface WithdrawParams { + /** Amount to withdraw in wei */ + amountWei: bigint + /** Vault address */ + vaultAddress: Address + /** Optional callback called immediately after user signs transaction */ + onSigned?: () => void +} + +/** + * Return type for the useVaultWithdraw hook + */ +export type UseVaultWithdrawReturn = UseMutationResult< + void, + Error, + WithdrawParams, + unknown +> + +// ============================================================================ +// Constants +// ============================================================================ + +const MUTATION_KEY_PREFIX = 'vault-withdraw' as const +const CONFIRMATION_BLOCKS = 1 + +// ============================================================================ +// Mutation Hook +// ============================================================================ + +/** + * Mutation hook to withdraw tokens from a vault + * + * Withdraws (unstakes) tokens from a vault contract. + * Manages the state machine transitions for the withdrawal process. + * + * **Process Flow:** + * 1. Validates wallet connection and amount + * 2. Calls vault.withdraw() and waits for user to sign + * 3. After signing, sends START_WITHDRAW event → Goes directly to processing state + * 4. Calls onSigned callback (typically to close modal) + * 5. Waits for transaction confirmation + * 6. On success: Refetches data and resets state machine + * 7. On error: Sends REJECT event → Shows rejected state + * + * @returns Mutation result with mutate function to trigger withdrawal + * + * @throws {Error} When wallet is not connected + * @throws {Error} When amount is invalid + * @throws {Error} When transaction is reverted + * + * @example + * Basic usage with modal closing after sign + * ```tsx + * function WithdrawModal({ amount, vaultAddress, onClose }: Props) { + * const { mutate: withdraw } = useVaultWithdraw() + * + * const handleWithdraw = () => { + * withdraw({ + * amountWei: amount, + * vaultAddress, + * onSigned: () => { + * // Close modal after user signs in wallet + * onClose() + * } + * }) + * } + * + * return + * } + * ``` + */ +export function useVaultWithdraw(): UseVaultWithdrawReturn { + const { address } = useAccount() + const { writeContractAsync } = useWriteContract() + const config = useConfig() + const { send: sendVaultEvent, reset: resetVault } = useVaultStateContext() + const { refetch: refetchStakingVaults } = useStakingVaults() + const { refetch: refetchMultiplierPoints } = useMultiplierPointsBalance() + + return useMutation({ + mutationKey: [MUTATION_KEY_PREFIX, address], + mutationFn: async ({ + amountWei, + vaultAddress, + onSigned, + }: WithdrawParams): Promise => { + // Validate wallet connection + if (!address) { + throw new Error( + 'Wallet not connected. Please connect your wallet first.' + ) + } + + // Validate amount + if (amountWei <= 0n) { + throw new Error('Amount must be greater than 0') + } + + try { + // Execute withdrawal transaction + const hash = await writeContractAsync({ + chain: statusNetworkTestnet, + account: address, + address: vaultAddress, + abi: vaultAbi, + functionName: 'withdraw', + args: [SNT_TOKEN.address, amountWei], + }) + + // Transaction submitted successfully, send START_WITHDRAW event to show processing state + sendVaultEvent({ + type: 'START_WITHDRAW', + amount: formatUnits(amountWei, SNT_TOKEN.decimals), + }) + + // Call onSigned callback to close the modal + onSigned?.() + + // Wait for transaction confirmation + const { status } = await waitForTransactionReceipt(config, { + hash, + confirmations: CONFIRMATION_BLOCKS, + }) + + // Check if transaction was reverted + if (status === 'reverted') { + sendVaultEvent({ type: 'REJECT' }) + throw new Error('Transaction was reverted') + } + + // Transaction successful, refetch data and close dialog + await Promise.all([refetchStakingVaults(), refetchMultiplierPoints()]) + resetVault() + } catch (error) { + // Transaction failed or user rejected + sendVaultEvent({ type: 'REJECT' }) + throw error + } + }, + }) +} diff --git a/apps/hub/src/app/_hooks/useWeightedBoost.ts b/apps/hub/src/app/_hooks/useWeightedBoost.ts new file mode 100644 index 000000000..424bf5ec5 --- /dev/null +++ b/apps/hub/src/app/_hooks/useWeightedBoost.ts @@ -0,0 +1,174 @@ +import { useMemo } from 'react' + +import { formatUnits } from 'viem' + +import { SNT_TOKEN } from '~constants/index' +import { type StakingVault } from '~hooks/useStakingVaults' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Weighted boost calculation result + */ +export interface WeightedBoost { + /** Weighted aggregate boost multiplier as a number */ + value: number + /** Formatted boost multiplier (e.g., "1.25") */ + formatted: string + /** Total staked amount across all vaults */ + totalStaked: number + /** Whether any vaults have stake */ + hasStake: boolean +} + +// ============================================================================ +// Constants +// ============================================================================ + +const BASE_BOOST = 1.0 +const DEFAULT_DECIMALS = 2 + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Converts bigint token amount to number using formatUnits + * + * @param value - The bigint value to convert + * @param decimals - Number of decimals for the token + * @returns Numeric representation + */ +function toTokenAmount(value: bigint, decimals: number): number { + return Number(formatUnits(value, decimals)) +} + +/** + * Calculates the boost multiplier for a single vault + * + * Boost formula: (MP / Staked) + 1 + * + * @param stakedBalance - Amount of tokens staked in the vault + * @param mpAccrued - Multiplier points accrued + * @param decimals - Token decimals + * @returns Boost multiplier for the vault + */ +function calculateVaultBoost( + stakedBalance: bigint, + mpAccrued: bigint, + decimals: number +): number { + const staked = toTokenAmount(stakedBalance, decimals) + const mp = toTokenAmount(mpAccrued, decimals) + + if (staked === 0) return BASE_BOOST + + return mp / staked + BASE_BOOST +} + +/** + * Calculates weighted aggregate boost across all vaults + * + * The weighted boost is calculated as: + * Sum(Boost_i * Staked_i) / Sum(Staked_i) + * + * Where: + * - Boost_i = (MP_i / Staked_i) + 1 + * - Staked_i = staked balance in vault i + * + * @param vaults - Array of vaults with their data + * @param decimals - Token decimals + * @returns Weighted boost calculation result + */ +function calculateWeightedBoost( + vaults: StakingVault[], + decimals: number +): WeightedBoost { + let totalWeightedBoost = 0 + let totalStaked = 0 + + // Calculate weighted sum across all vaults + for (const vault of vaults) { + // Skip vaults with no data or no stake + if (!vault.data || vault.data.stakedBalance === 0n) { + continue + } + + const vaultStaked = toTokenAmount(vault.data.stakedBalance, decimals) + const vaultBoost = calculateVaultBoost( + vault.data.stakedBalance, + vault.data.mpAccrued, + decimals + ) + + totalWeightedBoost += vaultBoost * vaultStaked + totalStaked += vaultStaked + } + + // Handle no stake case + if (totalStaked === 0) { + return { + value: BASE_BOOST, + formatted: BASE_BOOST.toFixed(DEFAULT_DECIMALS), + totalStaked: 0, + hasStake: false, + } + } + + // Calculate weighted average + const weightedAverage = totalWeightedBoost / totalStaked + + return { + value: weightedAverage, + formatted: `x${weightedAverage.toFixed(DEFAULT_DECIMALS)}`, + totalStaked, + hasStake: true, + } +} + +// ============================================================================ +// Hook +// ============================================================================ + +/** + * Hook to calculate weighted aggregate boost across all user vaults + * + * The weighted boost rewards long-term staking by calculating a weighted + * average of individual vault boosts based on their staked amounts. + * + * @param vaults - Array of user vaults with their data + * @returns Weighted boost calculation result + * + * @example + * ```tsx + * function BoostDisplay() { + * const { data: vaults } = useStakingVaults() + * const boost = useWeightedBoost(vaults) + * + * return ( + *
+ *

Weighted Boost: x{boost.formatted}

+ *

Total Staked: {boost.totalStaked} SNT

+ *
+ * ) + * } + * ``` + */ +export function useWeightedBoost( + vaults: StakingVault[] | undefined +): WeightedBoost { + return useMemo(() => { + if (!vaults || vaults.length === 0) { + return { + value: BASE_BOOST, + formatted: BASE_BOOST.toFixed(DEFAULT_DECIMALS), + totalStaked: 0, + hasStake: false, + } + } + + return calculateWeightedBoost(vaults, SNT_TOKEN.decimals) + }, [vaults]) +} diff --git a/apps/hub/src/app/_providers/index.tsx b/apps/hub/src/app/_providers/index.tsx new file mode 100644 index 000000000..d8824e5c2 --- /dev/null +++ b/apps/hub/src/app/_providers/index.tsx @@ -0,0 +1,57 @@ +'use client' + +import { ToastContainer } from '@status-im/components' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { ConnectKitProvider } from 'connectkit' +import { WagmiProvider } from 'wagmi' + +import { wagmiConfig } from '../_constants' +import { VaultStateProvider } from '../_hooks/useVaultStateContext' +import { SiweProvider } from './siwe-provider' +import { VaultProvider } from './vault-provider' + +interface ProvidersProps { + children: React.ReactNode +} + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + retryOnMount: false, + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }, + }, +}) + +/** + * Application Providers + * + * Provider hierarchy (order matters): + * 1. WagmiProvider - Blockchain connection & wallet state + * 2. QueryClientProvider - React Query for data fetching + * 3. SiweProvider - SIWE authentication + * 4. ConnectKitProvider - Wallet connection UI + * 5. VaultStateProvider - Vault operation state machine + * 6. VaultProvider - Vault-specific features + */ +export function Providers({ children }: ProvidersProps) { + return ( + + + + + + + {children} + + + + + + + + ) +} diff --git a/apps/hub/src/app/_providers/siwe-provider.tsx b/apps/hub/src/app/_providers/siwe-provider.tsx new file mode 100644 index 000000000..50b65c2a9 --- /dev/null +++ b/apps/hub/src/app/_providers/siwe-provider.tsx @@ -0,0 +1,34 @@ +'use client' +import { useRouter } from 'next/navigation' +import { useDisconnect } from 'wagmi' + +import { siweClient } from '../_constants/siwe' + +interface SiweProviderProps { + children: React.ReactNode +} + +export const SiweProvider = ({ children }: SiweProviderProps) => { + const router = useRouter() + const { disconnect } = useDisconnect() + + return ( + { + router.refresh() + }} + onSignOut={() => { + disconnect() + router.refresh() + }} + > + {children} + + ) +} diff --git a/apps/hub/src/app/_providers/vault-provider.tsx b/apps/hub/src/app/_providers/vault-provider.tsx new file mode 100644 index 000000000..db8a5788a --- /dev/null +++ b/apps/hub/src/app/_providers/vault-provider.tsx @@ -0,0 +1,39 @@ +'use client' + +import { useEffect } from 'react' + +import { ActionStatusDialog } from '../_components/stake/action-status-dialog' +import { useActionStatusContent } from '../_components/stake/hooks/use-action-status-content' +import { useVaultStateContext } from '../_hooks/useVaultStateContext' + +export const VaultProvider = ({ children }: { children: React.ReactNode }) => { + const { state: vaultState, reset: resetVault } = useVaultStateContext() + const dialogContent = useActionStatusContent(vaultState) + + // Only render dialog in DOM if state is not idle + const shouldRenderDialog = + vaultState.type !== 'idle' && dialogContent !== null + + useEffect(() => { + if (vaultState.type === 'withdraw' && vaultState.step === 'rejected') { + const timeout = setTimeout(() => { + resetVault() + }, 2000) + return () => clearTimeout(timeout) + } + }, [vaultState, resetVault]) + + return ( + <> + {children} + + {shouldRenderDialog ? ( + + ) : null} + + ) +} diff --git a/apps/hub/src/app/api/siwe/logout/route.ts b/apps/hub/src/app/api/siwe/logout/route.ts new file mode 100644 index 000000000..a342753ad --- /dev/null +++ b/apps/hub/src/app/api/siwe/logout/route.ts @@ -0,0 +1,124 @@ +import { cookies } from 'next/headers' +import { NextResponse } from 'next/server' + +import { sessionConfig } from '~constants/session' +import { getSession } from '~utils/session' + +/** + * @api {get} /api/siwe/logout Logout + * @apiName Logout + * @apiGroup SIWE + * + * @apiDescription + * Terminates the current SIWE authentication session by destroying session data + * and removing the session cookie. This endpoint securely logs the user out by: + * - Clearing all session data (address, chainId, nonce) + * - Removing the session cookie from the browser + * - Invalidating the encrypted session seal + * + * **Security:** + * - Session destruction is immediate and irreversible + * - Cookie is cleared with maxAge: 0 to ensure browser deletion + * - No data persists after logout + * + * **Use Cases:** + * - User clicks "Disconnect" or "Logout" button + * - Session expiration or invalidation + * - Account switching (logout before new auth) + * - Security-related forced logout + * + * **Flow:** + * 1. Client sends GET request to /api/siwe/logout + * 2. Server retrieves current session from cookie + * 3. Server destroys session data + * 4. Server removes session cookie (sets maxAge: 0) + * 5. Client receives success confirmation + * 6. Client typically disconnects wallet and refreshes UI + * + * @apiSuccess {Boolean} success True if logout succeeded + * @apiSuccess {String} message Success message + * + * @apiSuccessExample {json} Success Response (200): + * { + * "success": true, + * "message": "Logged out successfully" + * } + * + * @apiError (500) {Object} error Server error + * @apiError (500) {String} error.error Error message + * @apiError (500) {String} error.details Detailed error information + * + * @apiErrorExample {json} Logout Failed (500): + * { + * "error": "Failed to logout", + * "details": "Session destruction failed" + * } + * + * @apiExample {curl} cURL Example: + * curl -X GET https://status.app/api/siwe/logout \ + * --cookie "status-hub-siwe=..." + * + * @apiExample {javascript} JavaScript Example: + * const response = await fetch('/api/siwe/logout', { + * credentials: 'include' + * }) + * const result = await response.json() + * + * if (result.success) { + * console.log('Logged out successfully') + * // Disconnect wallet, redirect, etc. + * } + * + * @apiExample {javascript} React Example: + * function LogoutButton() { + * const { disconnect } = useDisconnect() + * const router = useRouter() + * + * const handleLogout = async () => { + * try { + * await fetch('/api/siwe/logout') + * disconnect() // Disconnect wallet + * router.push('/') // Redirect to home + * } catch (error) { + * console.error('Logout failed:', error) + * } + * } + * + * return + * } + */ +export async function GET() { + try { + const cookieStore = await cookies() + const session = await getSession(cookieStore) + + // Clear session data + session.destroy() + + // Delete cookie using Next.js cookies API + cookieStore.set({ + name: sessionConfig.cookieName, + value: '', + ...sessionConfig.cookieOptions, + maxAge: 0, + }) + + return NextResponse.json({ + success: true, + message: 'Logged out successfully', + }) + } catch (error) { + console.error('[SIWE Logout] Logout error:', error) + + const errorMessage = + error instanceof Error ? error.message : 'Unknown error occurred' + + return NextResponse.json( + { + error: 'Failed to logout', + details: errorMessage, + }, + { status: 500 } + ) + } +} diff --git a/apps/hub/src/app/api/siwe/nonce/route.ts b/apps/hub/src/app/api/siwe/nonce/route.ts new file mode 100644 index 000000000..16b558de1 --- /dev/null +++ b/apps/hub/src/app/api/siwe/nonce/route.ts @@ -0,0 +1,91 @@ +import { cookies } from 'next/headers' +import { NextResponse } from 'next/server' +import { generateNonce } from 'siwe' + +import { sessionConfig } from '~constants/session' +import { getSession } from '~utils/session' + +/** + * @api {get} /api/siwe/nonce Get Nonce + * @apiName GetNonce + * @apiGroup SIWE + * + * @apiDescription + * Generates a cryptographically secure random nonce for SIWE message signing. + * The nonce is stored in the session and must be included in the SIWE message + * that the user signs. This prevents replay attacks by ensuring each signature + * request is unique. + * + * **Flow:** + * 1. Client requests nonce from this endpoint + * 2. Server generates nonce and stores in session cookie + * 3. Client includes nonce in SIWE message + * 4. Client sends signed message to /api/siwe/verify + * + * **Idempotency:** + * If a nonce already exists in the session, it will be returned without + * generating a new one. This prevents multiple nonces per session. + * + * @apiSuccess {String} nonce Cryptographically secure random nonce + * + * @apiSuccessExample {text} Success Response (200): + * "a1b2c3d4e5f6g7h8" + * + * @apiError (500) {Object} error Error details + * @apiError (500) {String} error.error Error message + * @apiError (500) {String} error.details Detailed error information + * + * @apiErrorExample {json} Error Response (500): + * { + * "error": "Failed to generate nonce", + * "details": "Session encryption failed" + * } + * + * @apiExample {curl} cURL Example: + * curl -X GET https://status.app/api/siwe/nonce + * + * @apiExample {javascript} JavaScript Example: + * const response = await fetch('/api/siwe/nonce') + * const nonce = await response.text() + */ +export async function GET() { + try { + const cookieStore = await cookies() + const session = await getSession(cookieStore) + + // Generate new nonce if one doesn't exist + if (!session.nonce) { + session.nonce = generateNonce() + + // Seal session and set cookie with nonce + const seal = await session.getSeal() + cookieStore.set({ + name: sessionConfig.cookieName, + value: seal, + ...sessionConfig.cookieOptions, + }) + } + + // Return nonce as plain text (ConnectKit expects text/plain) + return new Response(session.nonce, { + status: 200, + headers: { + 'Content-Type': 'text/plain; charset=utf-8', + 'Cache-Control': 'no-store, must-revalidate', + }, + }) + } catch (error) { + console.error('[SIWE Nonce] Error generating nonce:', error) + + const errorMessage = + error instanceof Error ? error.message : 'Unknown error occurred' + + return NextResponse.json( + { + error: 'Failed to generate nonce', + details: errorMessage, + }, + { status: 500 } + ) + } +} diff --git a/apps/hub/src/app/api/siwe/session/route.ts b/apps/hub/src/app/api/siwe/session/route.ts new file mode 100644 index 000000000..382714cff --- /dev/null +++ b/apps/hub/src/app/api/siwe/session/route.ts @@ -0,0 +1,115 @@ +import { NextResponse } from 'next/server' + +import { getReadonlySession, isValidSIWESession } from '~utils/session' + +import type { NextRequest } from 'next/server' + +/** + * @api {get} /api/siwe/session Get Session + * @apiName GetSession + * @apiGroup SIWE + * + * @apiDescription + * Retrieves the current SIWE authentication session data. This endpoint checks + * for an existing authenticated session and returns the user's Ethereum address, + * chain ID, and authentication status. No authentication required - returns null + * values if not authenticated. + * + * **Use Cases:** + * - Check if user is currently authenticated + * - Get authenticated user's wallet address + * - Determine which chain the user authenticated on + * - Conditional UI rendering based on auth status + * + * **Session Storage:** + * Session data is stored in an encrypted iron-session cookie, which is + * automatically included in the request by the browser. + * + * **Authentication Flow:** + * 1. Browser automatically sends session cookie with request + * 2. Server decrypts and validates session cookie + * 3. Returns session data if valid, null values if not authenticated + * + * @apiSuccess {String|null} address Ethereum address of authenticated user (null if not authenticated) + * @apiSuccess {Number|null} chainId Chain ID the user authenticated on (null if not authenticated) + * @apiSuccess {Boolean} isAuthenticated True if user has valid SIWE session + * + * @apiSuccessExample {json} Authenticated Response (200): + * { + * "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb4", + * "chainId": 1660990954, + * "isAuthenticated": true + * } + * + * @apiSuccessExample {json} Unauthenticated Response (200): + * { + * "address": null, + * "chainId": null, + * "isAuthenticated": false + * } + * + * @apiError (500) {Object} error Server error + * @apiError (500) {String} error.error Error message + * @apiError (500) {String} error.details Detailed error information + * + * @apiErrorExample {json} Session Retrieval Failed (500): + * { + * "error": "Failed to retrieve session", + * "details": "Session decryption failed" + * } + * + * @apiExample {curl} cURL Example: + * curl -X GET https://status.app/api/siwe/session \ + * --cookie "status-hub-siwe=..." + * + * @apiExample {javascript} JavaScript Example: + * // Fetch automatically includes cookies + * const response = await fetch('/api/siwe/session', { + * credentials: 'include' + * }) + * const session = await response.json() + * + * if (session.isAuthenticated) { + * console.log(`Authenticated as ${session.address}`) + * } else { + * console.log('Not authenticated') + * } + * + * @apiExample {javascript} React Hook Example: + * function useSession() { + * const [session, setSession] = useState(null) + * + * useEffect(() => { + * fetch('/api/siwe/session') + * .then(res => res.json()) + * .then(setSession) + * }, []) + * + * return session + * } + */ +export async function GET(request: NextRequest) { + try { + const session = await getReadonlySession(request.cookies) + + // Return session data (may have undefined values if not authenticated) + return NextResponse.json({ + address: session.address ?? null, + chainId: session.chainId ?? null, + isAuthenticated: isValidSIWESession(session), + }) + } catch (error) { + console.error('[SIWE Session] Session retrieval error:', error) + + const errorMessage = + error instanceof Error ? error.message : 'Unknown error occurred' + + return NextResponse.json( + { + error: 'Failed to retrieve session', + details: errorMessage, + }, + { status: 500 } + ) + } +} diff --git a/apps/hub/src/app/api/siwe/verify/route.ts b/apps/hub/src/app/api/siwe/verify/route.ts new file mode 100644 index 000000000..5270c066b --- /dev/null +++ b/apps/hub/src/app/api/siwe/verify/route.ts @@ -0,0 +1,160 @@ +import { cookies } from 'next/headers' +import { NextResponse } from 'next/server' +import { SiweMessage } from 'siwe' + +import { sessionConfig } from '~constants/session' +import { getSession } from '~utils/session' + +import type { NextRequest } from 'next/server' + +/** + * @api {post} /api/siwe/verify Verify Signature + * @apiName VerifySignature + * @apiGroup SIWE + * + * @apiDescription + * Verifies a SIWE (Sign-In with Ethereum) signature and creates an authenticated + * session. This endpoint validates the cryptographic signature against the SIWE + * message, checks the nonce matches the session, and stores the authenticated + * address in the session. + * + * **Security:** + * - Validates signature cryptographically using secp256k1 + * - Checks nonce matches to prevent replay attacks + * - Verifies message hasn't expired + * - Ensures domain and chain ID are correct + * + * **Flow:** + * 1. Client gets nonce from /api/siwe/nonce + * 2. Client creates SIWE message with nonce + * 3. User signs message in wallet + * 4. Client sends message + signature to this endpoint + * 5. Server verifies and creates authenticated session + * + * @apiParam {String} message The SIWE message that was signed + * @apiParam {String} signature The hex-encoded signature (0x...) + * + * @apiParamExample {json} Request Body: + * { + * "message": "status.app wants you to sign in with your Ethereum account:\n0x...", + * "signature": "0xabc123..." + * } + * + * @apiSuccess {Boolean} success True if verification succeeded + * @apiSuccess {String} address Ethereum address that was authenticated + * @apiSuccess {Number} chainId Chain ID the user authenticated on + * + * @apiSuccessExample {json} Success Response (200): + * { + * "success": true, + * "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb4", + * "chainId": 1660990954 + * } + * + * @apiError (400) {Object} error Validation error + * @apiError (400) {String} error.error Error message + * + * @apiError (500) {Object} error Server error + * @apiError (500) {String} error.error Error message + * @apiError (500) {String} error.details Detailed error information + * + * @apiErrorExample {json} Missing Fields (400): + * { + * "error": "Missing message or signature" + * } + * + * @apiErrorExample {json} Invalid Nonce (400): + * { + * "error": "Invalid nonce. Nonce does not match session." + * } + * + * @apiErrorExample {json} Verification Failed (500): + * { + * "error": "Signature verification failed", + * "details": "Signature does not match address" + * } + * + * @apiExample {curl} cURL Example: + * curl -X POST https://status.app/api/siwe/verify \ + * -H "Content-Type: application/json" \ + * -d '{"message": "...", "signature": "0x..."}' + * + * @apiExample {javascript} JavaScript Example: + * const response = await fetch('/api/siwe/verify', { + * method: 'POST', + * headers: { 'Content-Type': 'application/json' }, + * body: JSON.stringify({ message, signature }) + * }) + * const data = await response.json() + */ +export async function POST(request: NextRequest) { + try { + const cookieStore = await cookies() + const session = await getSession(cookieStore) + + // Parse and validate request body + const body = await request.json() + const { message, signature } = body + + if (!message || !signature) { + return NextResponse.json( + { error: 'Missing message or signature' }, + { status: 400 } + ) + } + + // Verify nonce exists in session + if (!session.nonce) { + return NextResponse.json( + { error: 'No nonce in session. Request a nonce first.' }, + { status: 400 } + ) + } + + // Verify the SIWE message signature + const siweMessage = new SiweMessage(message) + const fields = await siweMessage.verify({ signature }) + + // Validate nonce matches session (prevents replay attacks) + if (fields.data.nonce !== session.nonce) { + return NextResponse.json( + { error: 'Invalid nonce. Nonce does not match session.' }, + { status: 400 } + ) + } + + // Store authenticated address and chain ID in session + session.address = fields.data.address + session.chainId = fields.data.chainId + + // Clear nonce after successful verification (prevents reuse) + delete session.nonce + + // Seal and persist session + const seal = await session.getSeal() + cookieStore.set({ + name: sessionConfig.cookieName, + value: seal, + ...sessionConfig.cookieOptions, + }) + + return NextResponse.json({ + success: true, + address: fields.data.address, + chainId: fields.data.chainId, + }) + } catch (error) { + console.error('[SIWE Verify] Signature verification error:', error) + + const errorMessage = + error instanceof Error ? error.message : 'Unknown error occurred' + + return NextResponse.json( + { + error: 'Signature verification failed', + details: errorMessage, + }, + { status: 500 } + ) + } +} diff --git a/apps/hub/src/app/layout.tsx b/apps/hub/src/app/layout.tsx index 1064253d0..928a215eb 100644 --- a/apps/hub/src/app/layout.tsx +++ b/apps/hub/src/app/layout.tsx @@ -2,6 +2,8 @@ import './globals.css' import { Inter } from 'next/font/google' +import { Providers } from './_providers' + import type { Metadata } from 'next' const inter = Inter({ @@ -22,7 +24,9 @@ export default function RootLayout({ }) { return ( - {children} + + {children} + ) } diff --git a/apps/hub/src/app/stake/page.tsx b/apps/hub/src/app/stake/page.tsx index 51cfa71fe..8e4ad0272 100644 --- a/apps/hub/src/app/stake/page.tsx +++ b/apps/hub/src/app/stake/page.tsx @@ -1,105 +1,519 @@ 'use client' +import { useMemo, useState } from 'react' + +import { zodResolver } from '@hookform/resolvers/zod' +import { Tooltip } from '@status-im/components' +import { + DropdownIcon, + ExternalIcon, + InfoIcon, + PlaceholderIcon, +} from '@status-im/icons/20' +import { Button, ButtonLink } from '@status-im/status-network/components' +import Image from 'next/image' +import { useForm, useWatch } from 'react-hook-form' +import { match } from 'ts-pattern' +import { formatUnits, parseUnits } from 'viem' +import { useAccount, useBalance, useConfig, useReadContract } from 'wagmi' +import { readContract } from 'wagmi/actions' +import { z } from 'zod' + +import { ConnectButton } from '~components/connect-button' import { HubLayout } from '~components/hub-layout' +import { LaunchIcon, SNTIcon } from '~components/icons' +import { PromoModal } from '~components/stake/promo-modal' +import { VaultSelect } from '~components/vault-select' +import { + SNT_TOKEN, + STAKING_MANAGER, + statusNetworkTestnet, +} from '~constants/index' +import { useApproveToken } from '~hooks/useApproveToken' +import { useCompoundMultiplierPoints } from '~hooks/useCompoundMultiplierPoints' +import { useCreateVault } from '~hooks/useCreateVault' +import { useExchangeRate } from '~hooks/useExchangeRate' +import { useFaucetMutation, useFaucetQuery } from '~hooks/useFaucet' +import { useMultiplierPointsBalance } from '~hooks/useMultiplierPoints' +import { useStakingVaults } from '~hooks/useStakingVaults' +import { useVaultStateContext } from '~hooks/useVaultStateContext' +import { useVaultTokenStake } from '~hooks/useVaultTokenStake' +import { useWeightedBoost } from '~hooks/useWeightedBoost' +import { formatCurrency, formatSNT } from '~utils/currency' + +import { VaultsTable } from '../_components/vaults/vaults-table' + +import type { Address } from 'viem' + +const createStakeFormSchema = () => { + return z.object({ + amount: z.string(), + vault: z.string(), + }) +} + +type FormValues = z.infer> + +type ConnectionStatus = 'uninstalled' | 'disconnected' | 'connected' export default function StakePage() { + const [isPromoModalOpen, setIsPromoModalOpen] = useState(false) + + const { isConnected, address } = useAccount() + const config = useConfig() + const { mutate: compoundMultiplierPoints } = useCompoundMultiplierPoints() + const { data: multiplierPointsData } = useMultiplierPointsBalance() + + const { mutate: claimTokens, isPending: isClaimingTokens } = + useFaucetMutation() + const { data: faucetData } = useFaucetQuery() + const { data: vaults, refetch: refetchStakingVaults } = useStakingVaults() + const weightedBoost = useWeightedBoost(vaults) + const { data: exchangeRate } = useExchangeRate() + + const { data: emergencyModeEnabled } = useReadContract({ + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'emergencyModeEnabled', + query: { + refetchInterval: 30000, + }, + }) + + const form = useForm({ + resolver: zodResolver(createStakeFormSchema()), + mode: 'onChange', + defaultValues: { + amount: '', + vault: '', + }, + }) + + const { data: balance } = useBalance({ + chainId: statusNetworkTestnet.id, + scopeKey: 'balance', + address, + token: SNT_TOKEN.address, + query: { + enabled: isConnected, + }, + }) + + const { data: totalStaked } = useReadContract({ + address: STAKING_MANAGER.address, + abi: STAKING_MANAGER.abi, + functionName: 'totalStaked', + }) as { data: bigint } + + const { mutate: createVault } = useCreateVault() + const { mutate: approveToken } = useApproveToken() + const { mutate: stakeVault } = useVaultTokenStake() + + // State machine for vault operations + const { send: sendVaultEvent } = useVaultStateContext() + + const status: ConnectionStatus = useMemo(() => { + if (isConnected) return 'connected' + return isPromoModalOpen ? 'uninstalled' : 'disconnected' + }, [isConnected, isPromoModalOpen]) + + // Watch the amount field for changes + const amountValue = useWatch({ + control: form.control, + name: 'amount', + defaultValue: '', + }) + + const amountInUSD = useMemo(() => { + const amountInputNumber = parseFloat(amountValue || '0') + if (exchangeRate && !isNaN(amountInputNumber)) { + return amountInputNumber * exchangeRate.price + } + return 0 + }, [amountValue, exchangeRate]) + + const { + isDisabled: isDisabledMultiplierPoints, + message: messageMultiplierPoints, + } = useMemo(() => { + const totalUncompounded = multiplierPointsData?.totalUncompounded ?? 0n + const hasUncompoundedPoints = totalUncompounded > 0n + const formattedAmount = formatSNT( + formatUnits(totalUncompounded, SNT_TOKEN.decimals), + { + decimals: SNT_TOKEN.decimals, + } + ) + + return { + isDisabled: !hasUncompoundedPoints || !isConnected, + message: hasUncompoundedPoints + ? `${formattedAmount} points are ready to compound` + : 'No points available to compound.', + } + }, [multiplierPointsData, isConnected]) + + const hasReachedDailyLimit = useMemo(() => { + if (!faucetData) return false + + const currentTimestamp = BigInt(Math.floor(Date.now() / 1000)) + const isWithinResetWindow = faucetData.accountResetTime > currentTimestamp + const hasExceededLimit = + faucetData.accountDailyRequests >= faucetData.dailyLimit + + return hasExceededLimit && isWithinResetWindow + }, [faucetData]) + + const handleSubmit = async (data: FormValues) => { + if (!data.amount || !data.vault || !address) return + + try { + const amountWei = parseUnits(data.amount, SNT_TOKEN.decimals) + + // Check current allowance + const currentAllowance = (await readContract(config, { + address: SNT_TOKEN.address, + abi: SNT_TOKEN.abi, + functionName: 'allowance', + args: [address, data.vault as Address], + })) as bigint + + // Transition to increase allowance if not enough allowance + if (amountWei >= currentAllowance) { + approveToken( + { + amount: data.amount, + spenderAddress: data.vault as Address, + }, + { + onSuccess: () => { + // After approval completes, proceed to staking + stakeVault({ + amountWei, + lockPeriod: 0n, + vaultAddress: data.vault as Address, + }) + }, + onError: error => { + throw error + }, + } + ) + } else { + // Allowance already sufficient, go straight to staking + stakeVault({ + amountWei, + lockPeriod: 0n, + vaultAddress: data.vault as Address, + }) + } + } catch { + sendVaultEvent({ type: 'REJECT' }) + } finally { + form.reset() + refetchStakingVaults() + } + } + return ( -
- {/* Hero Section */} -
-

- Staking is good for karma -

-

- Stake SNT to increase your Karma and unlock gasless transactions +

+
+

Stake SNT, receive good Karma

+

+ Stake SNT to increase your Karma, unlock more gasless transactions + and increase your power over the network

-
- - {/* Main Content */} -
-
-
-
- {/* Amount to Stake */} -
-
) } + +const InfoTooltip = () => ( + + + The longer SNT is staked or locked in vaults, the higher this + multiplier goes. This rewards long term believers. The maximum + multiplier is x9. + + + + Learn more + + +
+ } + > + + +) diff --git a/apps/hub/src/utils/address.ts b/apps/hub/src/utils/address.ts new file mode 100644 index 000000000..d8d0330da --- /dev/null +++ b/apps/hub/src/utils/address.ts @@ -0,0 +1,3 @@ +export const shortenAddress = (address: string) => { + return `${address.slice(0, 6)}...${address.slice(-4)}` +} diff --git a/apps/hub/src/utils/currency.ts b/apps/hub/src/utils/currency.ts new file mode 100644 index 000000000..18a00036d --- /dev/null +++ b/apps/hub/src/utils/currency.ts @@ -0,0 +1,389 @@ +import { formatUnits, parseUnits } from 'viem' + +// ============================================================================ +// Types +// ============================================================================ + +export interface FormatTokenOptions { + /** + * Number of decimal places to display + * @default 2 + */ + decimals?: number + /** + * Minimum number of decimal places + * @default decimals value + */ + minimumFractionDigits?: number + /** + * Maximum number of decimal places + * @default decimals value + */ + maximumFractionDigits?: number + /** + * Whether to include the token symbol + * @default false + */ + includeSymbol?: boolean + /** + * Locale for number formatting + * @default 'en-US' + */ + locale?: string + /** + * Whether to use compact notation (K, M, B) + * @default false + */ + compact?: boolean + /** + * Whether to round down instead of rounding to nearest + * @default false + */ + roundDown?: boolean + /** + * Number of decimals for the token (used for bigint conversion) + * @default 18 + */ + tokenDecimals?: number +} + +// ============================================================================ +// Constants +// ============================================================================ + +const DEFAULT_LOCALE = 'en-US' +const DEFAULT_DISPLAY_DECIMALS = 2 +const DEFAULT_TOKEN_DECIMALS = 18 +const COMPACT_THRESHOLD = 1_000_000 + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Convert bigint to number using viem's formatUnits for precision + * + * @param value - The bigint value to convert + * @param decimals - Number of decimals for the token + * @returns Numeric representation of the token amount + */ +function bigIntToNumber( + value: bigint, + decimals: number = DEFAULT_TOKEN_DECIMALS +): number { + // Use viem's formatUnits for proper decimal handling + const formatted = formatUnits(value, decimals) + return Number(formatted) +} + +/** + * Converts various input types to a numeric value + * + * @param amount - The amount to convert (bigint, number, or string) + * @param tokenDecimals - Number of decimals for bigint conversion + * @returns Numeric representation of the amount + */ +function toNumericAmount( + amount: number | bigint | string, + tokenDecimals: number +): number { + if (typeof amount === 'bigint') { + return bigIntToNumber(amount, tokenDecimals) + } + + if (typeof amount === 'string') { + return Number(amount) + } + + return amount +} + +/** + * Applies rounding down to a numeric value + * + * @param value - The value to round + * @param decimals - Number of decimal places to preserve + * @returns Rounded down value + */ +function roundDownToDecimals(value: number, decimals: number): number { + const factor = 10 ** decimals + return Math.floor(value * factor) / factor +} + +// ============================================================================ +// Core Formatting Functions +// ============================================================================ + +/** + * Format a token amount with proper decimal handling using viem utilities + * + * @param amount - Token amount (supports bigint, number, or string) + * @param token - Token symbol (e.g., 'SNT', 'ETH') + * @param options - Formatting options + * @returns Formatted token amount string + * + * @example + * ```ts + * formatTokenAmount(1234567890000000000n, 'SNT', { tokenDecimals: 18 }) + * // => "1.23" + * + * formatTokenAmount(1500, 'SNT', { includeSymbol: true, compact: true }) + * // => "1.5K SNT" + * ``` + */ +export function formatTokenAmount( + amount: number | bigint | string, + token: string, + options: FormatTokenOptions = {} +): string { + const { + decimals = DEFAULT_DISPLAY_DECIMALS, + minimumFractionDigits = decimals, + maximumFractionDigits = decimals, + includeSymbol = false, + locale = DEFAULT_LOCALE, + compact = false, + roundDown = false, + tokenDecimals = DEFAULT_TOKEN_DECIMALS, + } = options + + // Convert to numeric value + let numericAmount = toNumericAmount(amount, tokenDecimals) + + // Apply rounding down if requested + if (roundDown) { + numericAmount = roundDownToDecimals(numericAmount, maximumFractionDigits) + } + + // Format using Intl.NumberFormat + const formatter = new Intl.NumberFormat(locale, { + minimumFractionDigits, + maximumFractionDigits, + notation: compact ? 'compact' : 'standard', + compactDisplay: compact ? 'short' : undefined, + }) + + const formatted = formatter.format(numericAmount) + + return includeSymbol ? `${formatted} ${token}` : formatted +} + +// ============================================================================ +// Token-Specific Formatters +// ============================================================================ + +/** + * Format SNT (Status Network Token) amount + * + * @param amount - Token amount in wei (bigint) or display units (number/string) + * @param options - Formatting options + * @returns Formatted SNT amount + * + * @example + * ```ts + * formatSNT(1234567890000000000n) // => "1.23" + * formatSNT(100, { includeSymbol: true }) // => "100.00 SNT" + * ``` + */ +export function formatSNT( + amount: number | bigint | string, + options: Omit = {} +): string { + return formatTokenAmount(amount, 'SNT', { + ...options, + tokenDecimals: DEFAULT_TOKEN_DECIMALS, // SNT has 18 decimals + }) +} + +/** + * Format KARMA token amount + * + * @param amount - Token amount + * @param options - Formatting options + * @returns Formatted KARMA amount + */ +export function formatKarma( + amount: number | bigint | string, + options: Omit = {} +): string { + return formatTokenAmount(amount, 'KARMA', { + ...options, + tokenDecimals: 0, // KARMA values are already in display units + }) +} + +/** + * Format ETH (Ether) amount + * + * @param amount - ETH amount in wei (bigint) or display units (number/string) + * @param options - Formatting options + * @returns Formatted ETH amount + * + * @example + * ```ts + * formatETH(1000000000000000000n) // => "1.0000" + * formatETH(0.123456789, { decimals: 6 }) // => "0.123457" + * ``` + */ +export function formatETH( + amount: number | bigint | string, + options: Omit = {} +): string { + return formatTokenAmount(amount, 'ETH', { + decimals: 4, // Default to 4 decimals for ETH + ...options, + tokenDecimals: DEFAULT_TOKEN_DECIMALS, // ETH has 18 decimals + }) +} + +/** + * Format stablecoin amount (USDC, USDT, DAI) + * + * @param amount - Stablecoin amount in smallest unit (bigint) or display units (number/string) + * @param token - Stablecoin symbol + * @param options - Formatting options + * @returns Formatted stablecoin amount + * + * @example + * ```ts + * formatStablecoin(1000000n, 'USDC') // => "1.00" (USDC has 6 decimals) + * formatStablecoin(1000000000000000000n, 'DAI') // => "1.00" (DAI has 18 decimals) + * ``` + */ +export function formatStablecoin( + amount: number | bigint | string, + token: 'USDC' | 'USDT' | 'DAI', + options: Omit = {} +): string { + // USDC and USDT typically have 6 decimals, DAI has 18 + const decimals = token === 'DAI' ? DEFAULT_TOKEN_DECIMALS : 6 + + return formatTokenAmount(amount, token, { + ...options, + tokenDecimals: decimals, + }) +} + +/** + * Format a currency value for display in UI + * Uses Intl.NumberFormat with USD currency by default + * Automatically handles large numbers with compact notation + * + * @param amount - Currency amount + * @param options - Formatting options + * @returns Formatted currency string + * + * @example + * ```ts + * formatCurrency(1234567) // => "$1.23M" + * formatCurrency(999) // => "$999.00" + * formatCurrency(1500000n, { tokenDecimals: 18 }) // => "$0.00" + * formatCurrency(100, { currency: 'EUR' }) // => "€100.00" + * ``` + */ +export function formatCurrency( + amount: number | bigint | string, + options: FormatTokenOptions & { currency?: string } = {} +): string { + const { + currency = 'USD', + tokenDecimals = 0, // Default to 0 for currency values (already in display units) + locale = DEFAULT_LOCALE, + decimals = DEFAULT_DISPLAY_DECIMALS, + ...rest + } = options + + const numericAmount = toNumericAmount(amount, tokenDecimals) + + // Auto-enable compact notation for large numbers (>= 1M) + const shouldCompact = + rest.compact !== false && Math.abs(numericAmount) >= COMPACT_THRESHOLD + + const formatter = new Intl.NumberFormat(locale, { + style: 'currency', + currency, + minimumFractionDigits: rest.minimumFractionDigits ?? decimals, + maximumFractionDigits: rest.maximumFractionDigits ?? decimals, + notation: shouldCompact ? 'compact' : 'standard', + compactDisplay: 'short', + }) + + return formatter.format(numericAmount) +} + +// ============================================================================ +// Parsing Functions +// ============================================================================ + +/** + * Compact notation multipliers + */ +const COMPACT_MULTIPLIERS: Record = { + K: 1_000, + M: 1_000_000, + B: 1_000_000_000, + T: 1_000_000_000_000, +} as const + +/** + * Parse a formatted token string back to a number + * + * Handles: + * - Comma-separated numbers (1,234.56) + * - Compact notation (1.5K, 2M, 3.5B) + * - Token symbols (100 SNT) + * + * @param formattedAmount - The formatted string to parse + * @param token - Optional token symbol to remove from the string + * @returns Numeric value + * + * @example + * ```ts + * parseTokenAmount('1,234.56') // => 1234.56 + * parseTokenAmount('1.5K') // => 1500 + * parseTokenAmount('100 SNT', 'SNT') // => 100 + * ``` + */ +export function parseTokenAmount( + formattedAmount: string, + token?: string +): number { + // Remove token symbol if present + let cleaned = formattedAmount + if (token) { + cleaned = cleaned.replace(token, '').trim() + } + + // Remove commas and spaces + cleaned = cleaned.replace(/[,\s]/g, '') + + // Handle compact notation (K, M, B, T) + const compactMatch = cleaned.match(/^([\d.]+)([KMBT])$/i) + if (compactMatch) { + const [, numStr, suffix] = compactMatch + const multiplier = COMPACT_MULTIPLIERS[suffix.toUpperCase()] ?? 1 + return Number(numStr) * multiplier + } + + return Number(cleaned) +} + +/** + * Parse a user input amount and convert to wei (bigint) using viem's parseUnits + * + * @param amount - User input amount (e.g., "1.5", "100") + * @param decimals - Number of decimals for the token + * @returns Amount in wei as bigint + * + * @example + * ```ts + * parseToWei('1.5', 18) // => 1500000000000000000n + * parseToWei('100', 6) // => 100000000n (for USDC) + * ``` + */ +export function parseToWei( + amount: string, + decimals: number = DEFAULT_TOKEN_DECIMALS +): bigint { + return parseUnits(amount, decimals) +} diff --git a/apps/hub/src/utils/session.ts b/apps/hub/src/utils/session.ts new file mode 100644 index 000000000..e95e7438c --- /dev/null +++ b/apps/hub/src/utils/session.ts @@ -0,0 +1,224 @@ +import { sealData, unsealData } from 'iron-session' + +import { sessionConfig } from '../app/_constants/session' + +import type { IronSession } from 'iron-session' +import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies' +import type { + RequestCookies, + ResponseCookies, +} from 'next/dist/server/web/spec-extension/cookies' + +// ============================================================================ +// Types +// ============================================================================ + +/** + * Map of password IDs to password strings for iron-session + * Allows password rotation by using multiple passwords with different IDs + */ +type PasswordsMap = Record + +/** + * Password can be a single string or a map for rotation + */ +type Password = string | PasswordsMap + +/** + * SIWE Session Data + * Extends IronSession with SIWE-specific fields + */ +export interface SIWESessionData extends IronSession { + /** Unique nonce for SIWE message */ + nonce?: string + /** Ethereum address of authenticated user */ + address?: string + /** Chain ID the user authenticated on */ + chainId?: number +} + +/** + * Session with utility methods + * Combines session data with helper functions for sealing and destroying + */ +export interface NextSIWESession extends SIWESessionData { + /** Get sealed session string for cookie storage */ + getSeal: () => Promise + /** Clear session data and cookie */ + destroy: () => void + /** Save session data (iron-session compatibility) */ + save: () => Promise + /** Update session (iron-session compatibility) */ + updateConfig: (newSessionOptions: unknown) => void +} + +/** + * Readonly session without modification methods + */ +export type ReadonlyNextSIWESession = Omit< + NextSIWESession, + 'getSeal' | 'destroy' +> + +/** + * Supported cookie types from Next.js + */ +type CookieStore = ReadonlyRequestCookies | RequestCookies | ResponseCookies + +/** + * Writable cookie types (excludes readonly) + */ +type WritableCookieStore = RequestCookies | ResponseCookies + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/** + * Normalize password to map format for iron-session + * Single strings are converted to { 1: password } + * + * @param password - Password string or map + * @returns Password map for iron-session + */ +function normalizePasswordToMap(password: Password): PasswordsMap { + return typeof password === 'string' ? { 1: password } : password +} + +// ============================================================================ +// Session Functions +// ============================================================================ + +/** + * Get a readonly session from cookies + * Does not provide methods to modify or persist the session + * + * @param cookies - Cookie store from Next.js request + * @returns Promise resolving to readonly session data + * + * @example + * ```typescript + * import { cookies } from 'next/headers' + * + * const session = await getReadonlySession(cookies()) + * console.log(session.address) // "0x123..." + * ``` + */ +export async function getReadonlySession( + cookies: CookieStore +): Promise { + const passwordsAsMap = normalizePasswordToMap(sessionConfig.password) + const sealFromCookies = cookies.get(sessionConfig.cookieName) + + // If no cookie exists, return empty session + if (!sealFromCookies?.value) { + return {} as ReadonlyNextSIWESession + } + + try { + // Unseal the session data from the cookie + const session = await unsealData(sealFromCookies.value, { + password: passwordsAsMap, + }) + + return session as ReadonlyNextSIWESession + } catch (error) { + // If unsealing fails (corrupted cookie, wrong password, etc.), return empty + console.error('Failed to unseal session:', error) + return {} as ReadonlyNextSIWESession + } +} + +/** + * Get a full session with modification methods + * Provides getSeal() and destroy() methods for persisting/clearing session + * + * @param cookies - Writable cookie store from Next.js request + * @returns Promise resolving to session with utility methods + * + * @example + * ```typescript + * import { cookies } from 'next/headers' + * + * const session = await getSession(cookies()) + * session.address = '0x123...' + * const seal = await session.getSeal() + * cookies().set(cookieName, seal) + * ``` + */ +export async function getSession( + cookies: WritableCookieStore +): Promise { + const passwordsAsMap = normalizePasswordToMap(sessionConfig.password) + const readonlySession = await getReadonlySession(cookies) + + // Create a mutable copy of the session + const session = { ...readonlySession } as NextSIWESession + + // Add getSeal method to seal and return session data + Object.defineProperty(session, 'getSeal', { + enumerable: false, // Don't include in Object.keys() + writable: false, + value: async function getSeal(): Promise { + const seal = await sealData(session, { + password: passwordsAsMap, + }) + + return seal + }, + }) + + // Add destroy method to clear session + Object.defineProperty(session, 'destroy', { + enumerable: false, // Don't include in Object.keys() + writable: false, + value: function destroy(): void { + // Clear all session data + const keys = Object.keys(session) as Array + keys.forEach(key => { + if (key !== 'getSeal' && key !== 'destroy') { + delete session[key] + } + }) + + // Clear the cookie + cookies.set({ + name: sessionConfig.cookieName, + value: '', + maxAge: 0, + path: sessionConfig.cookieOptions.path, + }) + }, + }) + + return session +} + +// ============================================================================ +// Utility Functions +// ============================================================================ + +/** + * Check if a session is authenticated + * A session is considered authenticated if it has an address + * + * @param session - Session to check + * @returns True if session has an address + */ +export function isAuthenticated( + session: Partial +): session is Required> { + return Boolean(session.address) +} + +/** + * Validate session has required SIWE fields + * + * @param session - Session to validate + * @returns True if session has address and chainId + */ +export function isValidSIWESession( + session: Partial +): session is Required> { + return Boolean(session.address && session.chainId) +} diff --git a/apps/hub/src/utils/vault.ts b/apps/hub/src/utils/vault.ts new file mode 100644 index 000000000..f37b4fc5b --- /dev/null +++ b/apps/hub/src/utils/vault.ts @@ -0,0 +1,55 @@ +import { type Address, formatUnits } from 'viem' + +import { SNT_TOKEN } from '~constants/index' + +import type { StakingVault } from '~hooks/useStakingVaults' + +/** + * Calculates the boost multiplier for a vault + * + * @param vaults - The list of vaults + * @param vaultAddress - The address of the vault + * @returns The boost multiplier for the vault + */ +export function calculateVaultBoost( + vaults: StakingVault[], + vaultAddress: Address +): string { + const account = vaults.find(vault => vault.address === vaultAddress) + if (!account || account.data?.stakedBalance === 0n) return '1.00' + const vaultStaked = Number( + formatUnits(account.data?.stakedBalance || 0n, SNT_TOKEN.decimals) + ) + const vaultMp = Number( + formatUnits(account.data?.mpAccrued || 0n, SNT_TOKEN.decimals) + ) + // Add 1 to reflect the boost (base multiplier is 1x) + const boost = vaultMp / vaultStaked + 1 + return boost.toFixed(2) +} + +/** + * Checks if a vault is locked based on the lockUntil timestamp + * + * @param lockUntil - The lockUntil timestamp in seconds + * @returns True if the vault is locked, false otherwise + */ +export function isVaultLocked(lockUntil: bigint | undefined) { + if (!lockUntil) return false + const now = Math.floor(Date.now() / 1000) + const lockUntilTimestamp = Number(lockUntil) + return lockUntilTimestamp > now +} + +/** + * Calculates the number of days until a vault unlocks + * + * @param lockUntil - The lockUntil timestamp in seconds + * @returns The number of days until the vault unlocks, or null if the vault is not locked + */ +export function calculateDaysUntilUnlock(lockUntil: bigint | undefined) { + if (!lockUntil) return null + const now = Math.floor(Date.now() / 1000) + const lockUntilTimestamp = Number(lockUntil) + return Math.ceil((lockUntilTimestamp - now) / 86400) +} diff --git a/apps/hub/tsconfig.json b/apps/hub/tsconfig.json index 505a9f1b6..aac604240 100644 --- a/apps/hub/tsconfig.json +++ b/apps/hub/tsconfig.json @@ -30,6 +30,9 @@ "baseUrl": ".", "paths": { "~components/*": ["./src/app/_components/*"], + "~hooks/*": ["./src/app/_hooks/*"], + "~constants/*": ["./src/app/_constants/*"], + "~utils/*": ["./src/utils/*"], "~/*": ["./src/*"] } }, diff --git a/apps/hub/vercel.json b/apps/hub/vercel.json index 6677bf96c..270db0a42 100644 --- a/apps/hub/vercel.json +++ b/apps/hub/vercel.json @@ -1,6 +1,6 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "ignoreCommand": "git diff --quiet HEAD^ HEAD ../../{patches,package.json,turbo.json} ../../packages/{colors,icons} ./", + "ignoreCommand": "git diff --quiet HEAD^ HEAD ../../{patches,package.json,turbo.json} ../../packages/{colors,icons,components,wallet,status-network} ./", "installCommand": "pnpm install --dir ../../ --frozen-lockfile", "buildCommand": "turbo run build --cwd ../../ --filter=./apps/hub..." } diff --git a/package.json b/package.json index 7fd9d7b7b..69338502e 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,6 @@ "packages/wallet", "packages/status-network", "apps/hub", - "apps/status.app", - "apps/status.network", "apps/connector", "apps/portfolio", "apps/wallet", @@ -24,7 +22,7 @@ "preinstall": "npx only-allow pnpm", "prepare": "husky install", "test": "turbo run test --filter=@status-im/* --filter=./apps/* -- --run", - "dev": "turbo run dev dev:next dev:content --filter=@status-im/* --filter=./apps/*", + "dev": "turbo run dev --filter=@status-im/* --filter=./apps/*", "build": "turbo run build --filter=@status-im/* --filter=./apps/*", "lint": "turbo run lint --filter=@status-im/* --filter=./apps/*", "typecheck": "turbo run typecheck", @@ -34,9 +32,6 @@ "devtools": "react-devtools" }, "resolutions": { - "@types/react": "19.1.0", - "@types/react-dom": "19.1.1", - "zod": "3.23.8", "vite": "6.3.5", "vitest": "3.1.4", "vite-node": "3.1.4", @@ -46,6 +41,7 @@ }, "devDependencies": { "@changesets/cli": "^2.26.2", + "@ianvs/prettier-plugin-sort-imports": "^4.1.1", "@status-im/eslint-config": "workspace:*", "@tsconfig/strictest": "^2.0.0", "@types/prettier": "^2.7.2", @@ -56,9 +52,7 @@ "lint-staged": "^15.2.10", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.6", - "react": "^18.3.1", "react-devtools": "^6.1.5", - "react-dom": "^18.3.1", "rimraf": "^4.4.1", "turbo": "^2.5.6", "typescript": "^5.6.2", @@ -79,8 +73,7 @@ "it-length-prefixed@9.0.3": "patches/it-length-prefixed@9.0.3.patch", "arctic@1.2.0": "patches/arctic@1.2.0.patch", "tinykeys@3.0.0": "patches/tinykeys@3.0.0.patch", - "oslo@1.0.1": "patches/oslo@1.0.1.patch", - "@trpc/server@11.1.0": "patches/@trpc__server@11.1.0.patch" + "oslo@1.0.1": "patches/oslo@1.0.1.patch" } } } diff --git a/packages/components/src/button/button.tsx b/packages/components/src/button/button.tsx index b8d427983..1c6f4a196 100644 --- a/packages/components/src/button/button.tsx +++ b/packages/components/src/button/button.tsx @@ -28,7 +28,7 @@ type Props = { } ) -type ButtonProps = Prettify< +export type ButtonProps = Prettify< Omit, 'children'> & { href?: never } > diff --git a/packages/components/src/button/index.tsx b/packages/components/src/button/index.tsx index db783b104..616ddf04b 100644 --- a/packages/components/src/button/index.tsx +++ b/packages/components/src/button/index.tsx @@ -1 +1,2 @@ +export type { ButtonProps } from './button' export { Button } from './button' diff --git a/packages/components/src/toast/toast.tsx b/packages/components/src/toast/toast.tsx index 2e44675fd..a22f03e14 100644 --- a/packages/components/src/toast/toast.tsx +++ b/packages/components/src/toast/toast.tsx @@ -46,9 +46,11 @@ const Toast = (props: Props, ref: React.Ref) => { )} - - - + {onAction && ( + + + + )} ) } diff --git a/packages/status-network/package.json b/packages/status-network/package.json index 4435b3a43..3016f28b9 100644 --- a/packages/status-network/package.json +++ b/packages/status-network/package.json @@ -61,6 +61,7 @@ "@status-im/colors": "workspace:*", "@status-im/components": "workspace:*", "@status-im/icons": "workspace:*", + "connectkit": "^1.9.0", "cva": "^1.0.0-beta.1", "framer-motion": "^12.0.6", "next": "15.1.6", diff --git a/packages/status-network/src/components/button-link/index.tsx b/packages/status-network/src/components/button-link/index.tsx index 7fd09ee08..8d2c9d4b6 100644 --- a/packages/status-network/src/components/button-link/index.tsx +++ b/packages/status-network/src/components/button-link/index.tsx @@ -9,7 +9,7 @@ type Props = { active?: boolean icon?: React.ReactNode iconBefore?: React.ReactNode - size?: '32' | '40' + size?: '24' | '32' | '40' } & React.ComponentProps const buttonStyles = cva({ @@ -35,6 +35,7 @@ const buttonStyles = cva({ false: '', }, size: { + '24': 'h-6 rounded-8 py-[3px]', '32': 'h-8 rounded-10 py-[5px]', '40': 'h-10 rounded-12 py-[9px]', }, @@ -54,6 +55,9 @@ const buttonStyles = cva({ { size: '32', withIcon: true, className: 'pl-3 pr-2' }, { size: '40', withIconBefore: true, className: 'pl-3 pr-4' }, { size: '32', withIconBefore: true, className: 'pl-2 pr-3' }, + { size: '24', withIcon: false, className: 'px-2' }, + { size: '24', withIcon: true, className: 'pl-2 pr-[6px]' }, + { size: '24', withIconBefore: true, className: 'pl-[6px] pr-2' }, ], }) diff --git a/packages/status-network/src/components/button/index.tsx b/packages/status-network/src/components/button/index.tsx index 21a8de0df..7345ce618 100644 --- a/packages/status-network/src/components/button/index.tsx +++ b/packages/status-network/src/components/button/index.tsx @@ -3,17 +3,17 @@ import { forwardRef } from 'react' import { cva, cx } from 'cva' type Props = { - variant?: 'primary' | 'secondary' | 'white' + variant?: 'primary' | 'secondary' | 'white' | 'outline' | 'danger' backdropFilter?: boolean children?: React.ReactNode active?: boolean icon?: React.ReactNode iconBefore?: React.ReactNode - size?: '32' | '40' + size?: '24' | '32' | '40' } & React.ComponentProps<'button'> const buttonStyles = cva({ - base: 'inline-flex w-fit cursor-pointer select-none items-center gap-1 border text-15 font-500 transition-all disabled:cursor-default disabled:opacity-[0.3]', + base: 'inline-flex w-fit cursor-pointer select-none items-center gap-1 border font-500 transition-all disabled:cursor-default disabled:opacity-[0.3]', variants: { variant: { primary: @@ -22,6 +22,10 @@ const buttonStyles = cva({ 'border-white-10 bg-white-5 text-white-100 hover:border-white-20 hover:bg-white-10', white: 'border-neutral-30 bg-white-100 text-dark-100 hover:border-neutral-40 hover:bg-white-80', + outline: + 'pressed:border-neutral-50 border border-neutral-30 text-neutral-100 hover:border-neutral-40 disabled:border-neutral-20', + danger: + 'bg-danger-50 text-white-100 hover:bg-danger-60 disabled:opacity-[0.3]', }, withIcon: { true: '', @@ -32,8 +36,9 @@ const buttonStyles = cva({ false: '', }, size: { - '32': 'h-8 rounded-10 py-[5px]', - '40': 'h-10 rounded-12 py-[9px]', + '24': 'h-6 rounded-8 py-[3px] text-13', + '32': 'h-8 rounded-10 py-[5px] text-15', + '40': 'h-10 rounded-12 py-[9px] text-15', }, backdropFilter: { true: 'backdrop-blur-[20px]', @@ -51,6 +56,9 @@ const buttonStyles = cva({ { size: '32', withIcon: true, className: 'pl-3 pr-2' }, { size: '40', withIconBefore: true, className: 'pl-3 pr-4' }, { size: '32', withIconBefore: true, className: 'pl-2 pr-3' }, + { size: '24', withIcon: false, className: 'px-2' }, + { size: '24', withIcon: true, className: 'pl-2 pr-[6px]' }, + { size: '24', withIconBefore: true, className: 'pl-[6px] pr-2' }, ], }) diff --git a/packages/status-network/src/components/index.tsx b/packages/status-network/src/components/index.ts similarity index 80% rename from packages/status-network/src/components/index.tsx rename to packages/status-network/src/components/index.ts index 6162922b9..e1bccf778 100644 --- a/packages/status-network/src/components/index.tsx +++ b/packages/status-network/src/components/index.ts @@ -4,3 +4,4 @@ export { GameCard } from './cards' export { Divider } from './divider' export { Footer } from './footer' export { Link } from './link' +export { ShortenAddress } from './shorten-address' diff --git a/packages/status-network/src/components/shorten-address/index.tsx b/packages/status-network/src/components/shorten-address/index.tsx new file mode 100644 index 000000000..e033ad1a0 --- /dev/null +++ b/packages/status-network/src/components/shorten-address/index.tsx @@ -0,0 +1,19 @@ +type Props = { + address: string +} + +export const shortenAddress = (address: string) => { + const prefix = address.slice(0, 5) + const suffix = address.slice(-4) + + return `${prefix}...${suffix}` +} + +const ShortenAddress = ({ address }: Props) => { + const shortenedAddress = shortenAddress(address) + + return shortenedAddress +} + +export { ShortenAddress } +export type { Props as ShortenAddressProps } diff --git a/packages/status-network/tailwind.config.ts b/packages/status-network/tailwind.config.ts index 73a3e96e0..a913d3e0b 100644 --- a/packages/status-network/tailwind.config.ts +++ b/packages/status-network/tailwind.config.ts @@ -90,6 +90,10 @@ export default { sky: 'rgba(25, 146, 215, 1)', sea: 'rgba(61, 150, 165, 1)', yellow: 'rgba(246, 176, 60, 1)', + danger: { + 50: 'rgba(255, 125, 70, 1)', + 60: 'rgba(255, 125, 70, 0.6)', + }, neutral: { '10': 'rgba(240, 242, 245, 1)', '20': 'rgba(231, 234, 238, 1)', diff --git a/packages/status-network/vite.config.ts b/packages/status-network/vite.config.ts index bd490ccc1..5b8394b8a 100644 --- a/packages/status-network/vite.config.ts +++ b/packages/status-network/vite.config.ts @@ -16,7 +16,7 @@ export default defineConfig(({ mode }) => { target: 'es2020', lib: { entry: { - 'components/index': './src/components/index.tsx', + 'components/index': './src/components/index.ts', 'config/index': './src/config/index.ts', 'tailwind.config': './tailwind.config.ts', 'hooks/index': './src/hooks/index.ts', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b37dba14..9cf7ef8cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,9 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 - zod: 3.23.8 vite: 6.3.5 vitest: 3.1.4 vite-node: 3.1.4 @@ -22,9 +19,6 @@ patchedDependencies: '@libp2p/bootstrap@9.0.10': hash: 2qjq4t2g7sxtbtzajj7gkmqb5q path: patches/@libp2p__bootstrap@9.0.10.patch - '@trpc/server@11.1.0': - hash: j772m5gatolhdil2x65xum5qqi - path: patches/@trpc__server@11.1.0.patch arctic@1.2.0: hash: np2mbzzdnalh3n27syyoxx3zu4 path: patches/arctic@1.2.0.patch @@ -45,6 +39,9 @@ importers: '@changesets/cli': specifier: ^2.26.2 version: 2.26.2 + '@ianvs/prettier-plugin-sort-imports': + specifier: ^4.1.1 + version: 4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3) '@status-im/eslint-config': specifier: workspace:* version: link:packages/eslint-config @@ -55,10 +52,10 @@ importers: specifier: ^2.7.2 version: 2.7.2 '@types/react': - specifier: 19.1.0 + specifier: ^19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19.1.1 version: 19.1.1(@types/react@19.1.0) eslint: specifier: ^9.14.0 @@ -71,19 +68,13 @@ importers: version: 15.2.10 prettier: specifier: ^3.3.3 - version: 3.3.3 + version: 3.5.3 prettier-plugin-tailwindcss: specifier: ^0.6.6 - version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.3.3))(prettier@3.3.3) - react: - specifier: ^18.3.1 - version: 18.3.1 + version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3))(prettier@3.5.3) react-devtools: specifier: ^6.1.5 version: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) rimraf: specifier: ^4.4.1 version: 4.4.1 @@ -113,7 +104,7 @@ importers: version: 10.45.2(@trpc/server@10.45.2) '@trpc/next': specifier: 10.45.2 - version: 10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 10.45.2(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@trpc/server': specifier: 10.45.2 version: 10.45.2 @@ -127,20 +118,23 @@ importers: specifier: ^19.0.0 version: 19.1.0(react@19.1.0) zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@eslint/eslintrc': - specifier: ^3 + specifier: ^3.1.0 version: 3.1.0 + '@next/eslint-plugin-next': + specifier: 15.3.0 + version: 15.3.0 '@types/node': specifier: ^20 version: 20.11.5 '@types/react': - specifier: 19.1.0 + specifier: ^19 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19 version: 19.1.1(@types/react@19.1.0) eslint: specifier: ^9 @@ -152,7 +146,7 @@ importers: specifier: ^15.12.0 version: 15.12.0 typescript: - specifier: ^5 + specifier: ^5.6.2 version: 5.8.3 apps/connector: @@ -165,10 +159,10 @@ importers: version: 1.12.0(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.1.1 - version: 2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@status-im/colors': specifier: workspace:* version: link:../../packages/colors @@ -191,8 +185,8 @@ importers: specifier: ^5.2.0 version: 5.3.1 zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@ianvs/prettier-plugin-sort-imports': specifier: 4.1.1 @@ -213,11 +207,11 @@ importers: specifier: 20.11.5 version: 20.11.5 '@types/react': - specifier: 19.1.0 - version: 19.1.0 + specifier: 18.2.48 + version: 18.2.48 '@types/react-dom': - specifier: 19.1.1 - version: 19.1.1(@types/react@19.1.0) + specifier: 18.2.18 + version: 18.2.18 autoprefixer: specifier: ^10.4.19 version: 10.4.20(postcss@8.4.47) @@ -251,6 +245,15 @@ importers: apps/hub: dependencies: + '@hookform/devtools': + specifier: ^4.3.1 + version: 4.4.0(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@hookform/resolvers': + specifier: ^3.1.1 + version: 3.10.0(react-hook-form@7.64.0(react@19.1.0)) + '@radix-ui/react-dialog': + specifier: ^1.1.1 + version: 1.1.13(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@status-im/colors': specifier: workspace:* version: link:../../packages/colors @@ -263,36 +266,72 @@ importers: '@status-im/status-network': specifier: workspace:* version: link:../../packages/status-network + '@status-im/wallet': + specifier: workspace:* + version: link:../../packages/wallet + '@tanstack/react-query': + specifier: 5.66.0 + version: 5.66.0(react@19.1.0) + '@tanstack/react-table': + specifier: ^8.21.3 + version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4) + version: 1.5.0(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4) + connectkit: + specifier: ^1.9.0 + version: 1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.66.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + connectkit-next-siwe: + specifier: ^0.3.0 + version: 0.3.0(connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.66.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)))(express@4.20.0)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + cookie: + specifier: ^1.0.2 + version: 1.0.2 cva: specifier: 1.0.0-beta.1 version: 1.0.0-beta.1(typescript@5.8.3) framer-motion: specifier: ^12.0.6 version: 12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + iron-session: + specifier: ^8.0.4 + version: 8.0.4 next: - specifier: 15.1.6 - version: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) + specifier: 15.3.0 + version: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) next-mdx-remote: specifier: ^5.0.0 version: 5.0.0(@types/react@19.1.0)(acorn@8.14.1)(react@19.1.0) + pino-pretty: + specifier: ^13.1.1 + version: 13.1.1 react: - specifier: ^19.0.0 + specifier: 19.1.0 version: 19.1.0 react-dom: - specifier: ^19.0.0 + specifier: 19.1.0 version: 19.1.0(react@19.1.0) + react-hook-form: + specifier: ^7.45.1 + version: 7.64.0(react@19.1.0) rehype-slug: specifier: ^6.0.0 version: 6.0.0 + siwe: + specifier: ^2.3.2 + version: 2.3.2(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ts-pattern: specifier: ^5.6.2 version: 5.7.1 + viem: + specifier: ^2.21.1 + version: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: + specifier: 2.15.2 + version: 2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.21.4 + version: 3.25.76 devDependencies: '@ianvs/prettier-plugin-sort-imports': specifier: ^4.3.1 @@ -310,8 +349,8 @@ importers: specifier: 19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 - version: 19.1.1(@types/react@19.1.0) + specifier: 19.1.0 + version: 19.1.0(@types/react@19.1.0) eslint-config-next: specifier: 15.1.6 version: 15.1.6(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3) @@ -374,28 +413,28 @@ importers: version: 20.1.2 '@radix-ui/react-accordion': specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-alert-dialog': specifier: ^1.1.1 - version: 1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.13(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-dialog': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-dropdown-menu': specifier: ^2.1.4 - version: 2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 2.1.14(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-navigation-menu': specifier: 1.2.0 - version: 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-popover': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-switch': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-tooltip': specifier: ^1.1.1 - version: 1.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@react-spring/core': specifier: ^9.7.5 version: 9.7.5(react@19.1.0) @@ -500,7 +539,7 @@ importers: version: 0.6.1 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.29.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)) + version: 1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.29.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76)) contentlayer: specifier: ^0.3.4 version: 0.3.4(esbuild@0.19.12) @@ -524,7 +563,7 @@ importers: version: 0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0))(zod@3.25.76) emoji-datasource-twitter: specifier: ^15.1.2 version: 15.1.2 @@ -572,7 +611,7 @@ importers: version: 1.7.1 prettier-plugin-tailwindcss: specifier: ^0.6.6 - version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.3.3))(prettier@3.3.3) + version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3))(prettier@3.5.3) qrcode.react: specifier: ^3.1.0 version: 3.2.0(react@19.1.0) @@ -635,17 +674,17 @@ importers: version: 5.0.1 viem: specifier: ^2.21.1 - version: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) wagmi: specifier: ^2.12.8 - version: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76) zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@1stg/remark-preset': specifier: ^2.0.0 - version: 2.0.0(prettier@3.3.3) + version: 2.0.0(prettier@3.5.3) '@contentlayer/core': specifier: ^0.3.4 version: 0.3.4(esbuild@0.19.12) @@ -713,8 +752,8 @@ importers: specifier: 19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 - version: 19.1.1(@types/react@19.1.0) + specifier: 19.1.0 + version: 19.1.0(@types/react@19.1.0) '@types/tryghost__content-api': specifier: ^1.3.11 version: 1.3.17 @@ -750,7 +789,7 @@ importers: version: 2.3.4(eslint@9.14.0(jiti@2.4.2)) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2))(prettier@3.3.3) + version: 4.2.1(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2))(prettier@3.5.3) eslint-plugin-tailwindcss: specifier: ^3.17.4 version: 3.17.5(tailwindcss@3.4.11) @@ -784,598 +823,6 @@ importers: postcss: specifier: ^8.4.21 version: 8.4.47 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - react-easy-emoji: - specifier: ^1.8.1 - version: 1.8.1(@types/react@19.1.0)(react@19.1.0) - rehype: - specifier: ^12.0.1 - version: 12.0.1 - rehype-format: - specifier: ^4.0.1 - version: 4.0.1 - rehype-parse: - specifier: ^8.0.4 - version: 8.0.5 - rehype-pretty-code: - specifier: 0.10.2 - version: 0.10.2(shiki@0.14.7) - rehype-raw: - specifier: ^6.1.1 - version: 6.1.1 - rehype-react: - specifier: ^7.2.0 - version: 7.2.0(@types/react@19.1.0) - rehype-slug: - specifier: ^5.1.0 - version: 5.1.0 - rehype-stringify: - specifier: ^9.0.3 - version: 9.0.4 - remark: - specifier: ^14.0.3 - version: 14.0.3 - remark-breaks: - specifier: ^3.0.3 - version: 3.0.3 - remark-cli: - specifier: ^11.0.0 - version: 11.0.0 - remark-directive: - specifier: ^2.0.1 - version: 2.0.1 - remark-frontmatter: - specifier: ^4.0.1 - version: 4.0.1 - remark-gfm-v3: - specifier: npm:remark-gfm@3.0.1 - version: remark-gfm@3.0.1 - remark-gfm-v4: - specifier: npm:remark-gfm@4.0.0 - version: remark-gfm@4.0.0 - remark-github-beta-blockquote-admonitions: - specifier: ^1.1.0 - version: 1.1.1 - remark-lint: - specifier: 9.1.2 - version: 9.1.2 - remark-lint-emphasis-marker: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-file-extension: - specifier: ^2.1.2 - version: 2.1.2 - remark-lint-list-item-indent: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-maximum-line-length: - specifier: ^3.1.3 - version: 3.1.3 - remark-lint-no-consecutive-blank-lines: - specifier: ^4.1.3 - version: 4.1.3 - remark-lint-no-undefined-references: - specifier: ^5.0.0 - version: 5.0.2 - remark-lint-ordered-list-marker-value: - specifier: ^3.1.2 - version: 3.1.2 - remark-mdx: - specifier: ^2.3.0 - version: 2.3.0 - remark-parse: - specifier: ^10.0.2 - version: 10.0.2 - remark-preset-lint-consistent: - specifier: ^5.1.2 - version: 5.1.2 - remark-preset-lint-markdown-style-guide: - specifier: ^5.1.3 - version: 5.1.3 - remark-preset-lint-recommended: - specifier: ^6.1.3 - version: 6.1.3 - remark-preset-prettier: - specifier: ^2.0.1 - version: 2.0.2(prettier@3.3.3) - remark-preset-wooorm: - specifier: ^9.1.0 - version: 9.1.0 - remark-prettier: - specifier: ^2.0.0 - version: 2.0.0(prettier@3.3.3) - remark-rehype: - specifier: ^10.1.0 - version: 10.1.0 - remark-retext: - specifier: ^5.0.1 - version: 5.0.1 - remark-stringify: - specifier: ^10.0.3 - version: 10.0.3 - remark-validate-links: - specifier: ^12.1.1 - version: 12.1.1 - retext-contractions: - specifier: ^5.2.0 - version: 5.2.0 - retext-english: - specifier: ^4.1.0 - version: 4.1.0 - retext-preset-wooorm: - specifier: ^4.1.0 - version: 4.1.0 - retext-quotes: - specifier: ^5.2.0 - version: 5.2.0 - retext-sentence-spacing: - specifier: ^5.2.0 - version: 5.2.0 - rimraf: - specifier: ^4.4.1 - version: 4.4.1 - shiki: - specifier: ^0.14.2 - version: 0.14.7 - strip-markdown: - specifier: ^5.0.1 - version: 5.0.1 - tailwind-scrollbar-utilities: - specifier: ^0.2.0 - version: 0.2.0 - tailwindcss: - specifier: ^3.4.11 - version: 3.4.11 - tailwindcss-animate: - specifier: ^1.0.5 - version: 1.0.7(tailwindcss@3.4.11) - tailwindcss-react-aria-components: - specifier: ^1.1.5 - version: 1.1.5(tailwindcss@3.4.11) - tsx: - specifier: ^4.11.0 - version: 4.19.4 - typescript: - specifier: ^5.6.2 - version: 5.8.3 - unist-util-visit: - specifier: ^4.1.2 - version: 4.1.2 - vfile: - specifier: ^5.3.7 - version: 5.3.7 - - apps/status.app: - dependencies: - '@date-fns/utc': - specifier: ^1.2.0 - version: 1.2.0 - '@dnd-kit/core': - specifier: ^6.1.0 - version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@dnd-kit/modifiers': - specifier: ^7.0.0 - version: 7.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) - '@dnd-kit/sortable': - specifier: ^8.0.0 - version: 8.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) - '@dnd-kit/utilities': - specifier: ^3.2.2 - version: 3.2.2(react@19.1.0) - '@headlessui/react': - specifier: ^1.7.15 - version: 1.7.19(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@hookform/devtools': - specifier: ^4.3.1 - version: 4.4.0(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@hookform/resolvers': - specifier: ^3.1.1 - version: 3.10.0(react-hook-form@7.58.1(react@19.1.0)) - '@mdx-js/react': - specifier: ^2.3.0 - version: 2.3.0(react@19.1.0) - '@octokit/rest': - specifier: ^20.0.2 - version: 20.1.2 - '@radix-ui/react-accordion': - specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-alert-dialog': - specifier: ^1.1.1 - version: 1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': - specifier: ^1.1.1 - version: 1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-navigation-menu': - specifier: 1.2.0 - version: 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popover': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tooltip': - specifier: ^1.1.1 - version: 1.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-spring/core': - specifier: ^9.7.5 - version: 9.7.5(react@19.1.0) - '@react-spring/shared': - specifier: ^9.7.5 - version: 9.7.5(react@19.1.0) - '@react-spring/types': - specifier: ^9.7.5 - version: 9.7.5 - '@react-spring/web': - specifier: ^9.7.5 - version: 9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@scure/base': - specifier: ^1.1.1 - version: 1.2.5 - '@status-im/colors': - specifier: workspace:* - version: link:../../packages/colors - '@status-im/components': - specifier: workspace:* - version: link:../../packages/components - '@status-im/icons': - specifier: workspace:* - version: link:../../packages/icons - '@status-im/js': - specifier: workspace:* - version: link:../../packages/status-js - '@tanstack/query-core': - specifier: 5.29.0 - version: 5.29.0 - '@tanstack/react-query': - specifier: 5.29.0 - version: 5.29.0(react@19.1.0) - '@tanstack/react-query-devtools': - specifier: 5.29.0 - version: 5.29.0(@tanstack/react-query@5.29.0(react@19.1.0))(react@19.1.0) - '@trpc/react-query': - specifier: 11.1.0 - version: 11.1.0(@tanstack/react-query@5.29.0(react@19.1.0))(@trpc/client@11.1.0(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@trpc/server': - specifier: 11.1.0 - version: 11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3) - '@tryghost/content-api': - specifier: ^1.11.13 - version: 1.11.22 - '@types/title': - specifier: ^3.4.3 - version: 3.4.3 - '@vercel/analytics': - specifier: ^1.2.2 - version: 1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4) - '@vercel/postgres': - specifier: ^0.8.0 - version: 0.8.0 - '@vercel/toolbar': - specifier: ^0.1.5 - version: 0.1.36(@vercel/analytics@1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1)) - '@visx/axis': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/curve': - specifier: ^3.0.0 - version: 3.12.0 - '@visx/event': - specifier: ^3.0.0 - version: 3.12.0 - '@visx/glyph': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/gradient': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/grid': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/group': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/responsive': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/scale': - specifier: ^3.0.0 - version: 3.12.0 - '@visx/shape': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/text': - specifier: ^3.0.0 - version: 3.12.0(react@19.1.0) - '@visx/tooltip': - specifier: ^3.0.0 - version: 3.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@visx/visx': - specifier: ^3.0.0 - version: 3.12.0(@react-spring/web@9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - arctic: - specifier: 1.2.0 - version: 1.2.0(patch_hash=np2mbzzdnalh3n27syyoxx3zu4) - class-variance-authority: - specifier: ^0.6.0 - version: 0.6.1 - contentlayer: - specifier: ^0.3.4 - version: 0.3.4(esbuild@0.25.4) - csstype: - specifier: ^3.1.3 - version: 3.1.3 - d3-array: - specifier: ^3.2.3 - version: 3.2.4 - d3-scale: - specifier: ^4.0.2 - version: 4.0.2 - d3-time-format: - specifier: ^4.1.0 - version: 4.1.0 - date-fns: - specifier: ^3.6.0 - version: 3.6.0 - drizzle-orm: - specifier: ^0.31.0 - version: 0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0))(zod@3.23.8) - emoji-datasource-twitter: - specifier: ^15.1.2 - version: 15.1.2 - fast-xml-parser: - specifier: ^5.2.2 - version: 5.2.5 - github-slugger: - specifier: ^2.0.0 - version: 2.0.0 - google-auth-library: - specifier: ^9.0.0 - version: 9.15.1 - google-spreadsheet: - specifier: ^4.1.0 - version: 4.1.4(google-auth-library@9.15.1) - graphql: - specifier: ^16.7.1 - version: 16.11.0 - graphql-request: - specifier: ^6.1.0 - version: 6.1.0(graphql@16.11.0) - highlight-words-core: - specifier: ^1.2.2 - version: 1.2.3 - inspx: - specifier: ^0.0.1-alpha.6 - version: 0.0.1-alpha.6(react@19.1.0) - match-sorter: - specifier: ^6.3.4 - version: 6.4.0 - minisearch: - specifier: ^6.1.0 - version: 6.3.0 - next: - specifier: 15.2.4 - version: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - next-contentlayer: - specifier: ^0.3.4 - version: 0.3.4(contentlayer@0.3.4(esbuild@0.25.4))(esbuild@0.25.4)(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - next-mdx-remote: - specifier: ^5.0.0 - version: 5.0.0(@types/react@19.1.0)(acorn@8.14.1)(react@19.1.0) - oslo: - specifier: 1.0.1 - version: 1.0.1(patch_hash=d3ggqvlr26vmqrkdyyommjkaeu) - parallax-controller: - specifier: ^1.7.1 - version: 1.7.1 - prettier-plugin-tailwindcss: - specifier: ^0.6.6 - version: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3))(prettier@3.5.3) - qrcode.react: - specifier: ^3.1.0 - version: 3.2.0(react@19.1.0) - react: - specifier: 19.1.0 - version: 19.1.0 - react-children-utilities: - specifier: ^2.9.0 - version: 2.10.0(react@19.1.0) - react-day-picker: - specifier: ^8.7.1 - version: 8.7.1(date-fns@3.6.0)(react@19.1.0) - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) - react-hook-form: - specifier: ^7.45.1 - version: 7.58.1(react@19.1.0) - react-remove-scroll: - specifier: ^2.5.5 - version: 2.6.3(@types/react@19.1.0)(react@19.1.0) - react-scroll-parallax: - specifier: ^3.4.5 - version: 3.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-swipeable: - specifier: ^7.0.1 - version: 7.0.2(react@19.1.0) - remark-comment: - specifier: ^1.0.0 - version: 1.0.0 - server-only: - specifier: ^0.0.1 - version: 0.0.1 - superjson: - specifier: ^2.2.1 - version: 2.2.2 - tailwind-merge: - specifier: ^1.14.0 - version: 1.14.0 - tinykeys: - specifier: ^3.0.0 - version: 3.0.0(patch_hash=ssxuc2csdbrmhbk3t5ueg5cnse) - title: - specifier: ^3.5.3 - version: 3.5.3 - ts-pattern: - specifier: ^5.3.1 - version: 5.7.1 - type-fest: - specifier: ^4.18.2 - version: 4.41.0 - unified: - specifier: ^10.1.2 - version: 10.1.2 - vfile-matter: - specifier: ^5.0.0 - version: 5.0.1 - zod: - specifier: 3.23.8 - version: 3.23.8 - devDependencies: - '@1stg/remark-preset': - specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) - '@contentlayer/core': - specifier: ^0.3.4 - version: 0.3.4(esbuild@0.25.4) - '@contentlayer/source-files': - specifier: ^0.3.4 - version: 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': - specifier: ^0.3.4 - version: 0.3.4 - '@eslint/eslintrc': - specifier: ^3.1.0 - version: 3.1.0 - '@graphql-codegen/cli': - specifier: 5.0.2 - version: 5.0.2(@parcel/watcher@2.4.1)(@types/node@22.7.5)(bufferutil@4.0.9)(enquirer@2.3.6)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-codegen/import-types-preset': - specifier: 3.0.0 - version: 3.0.0(graphql@16.11.0) - '@graphql-codegen/typescript': - specifier: 4.0.6 - version: 4.0.6(graphql@16.11.0) - '@graphql-codegen/typescript-operations': - specifier: 4.2.0 - version: 4.2.0(graphql@16.11.0) - '@graphql-codegen/typescript-react-query': - specifier: 6.1.0 - version: 6.1.0(graphql@16.11.0) - '@mdx-js/mdx': - specifier: ^2.3.0 - version: 2.3.0 - '@next/env': - specifier: 15.2.4 - version: 15.2.4 - '@next/eslint-plugin-next': - specifier: 15.2.4 - version: 15.2.4 - '@status-im/eslint-config': - specifier: workspace:* - version: link:../../packages/eslint-config - '@tailwindcss/typography': - specifier: ^0.5.15 - version: 0.5.15(tailwindcss@3.4.11) - '@types/d3-array': - specifier: ^3.0.4 - version: 3.2.1 - '@types/d3-scale': - specifier: ^4.0.8 - version: 4.0.9 - '@types/d3-time-format': - specifier: ^4.0.0 - version: 4.0.3 - '@types/highlight-words-core': - specifier: ^1.2.1 - version: 1.2.3 - '@types/mdx': - specifier: ^2.0.5 - version: 2.0.13 - '@types/node': - specifier: ^22.5.5 - version: 22.7.5 - '@types/prettier': - specifier: ^3.0.0 - version: 3.0.0 - '@types/react': - specifier: 19.1.0 - version: 19.1.0 - '@types/react-dom': - specifier: 19.1.1 - version: 19.1.1(@types/react@19.1.0) - '@types/tryghost__content-api': - specifier: ^1.3.11 - version: 1.3.17 - '@types/unist': - specifier: ^2.0.6 - version: 2.0.11 - '@vcarl/remark-headings': - specifier: ^0.1.0 - version: 0.1.0 - autoprefixer: - specifier: ^10.4.14 - version: 10.4.20(postcss@8.5.3) - dotenv: - specifier: ^16.4.5 - version: 16.5.0 - drizzle-kit: - specifier: ^0.22.2 - version: 0.22.8 - eslint: - specifier: ^9.14.0 - version: 9.14.0(jiti@2.4.2) - eslint-config-next: - specifier: 15.2.4 - version: 15.2.4(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3) - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.14.0(jiti@2.4.2)) - eslint-mdx: - specifier: ^2.1.0 - version: 2.3.4(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-mdx: - specifier: ^2.1.0 - version: 2.3.4(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2))(prettier@3.5.3) - eslint-plugin-tailwindcss: - specifier: ^3.17.4 - version: 3.17.5(tailwindcss@3.4.11) - globals: - specifier: ^15.12.0 - version: 15.12.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - knip: - specifier: ^5.30.2 - version: 5.55.1(@types/node@22.7.5)(typescript@5.8.3) - lint-staged: - specifier: ^13.2.0 - version: 13.3.0(enquirer@2.3.6) - mdast: - specifier: ^3.0.0 - version: 3.0.0 - mdast-util-to-string: - specifier: ^3.2.0 - version: 3.2.0 - mdx-bundler: - specifier: ^9.2.1 - version: 9.2.1(esbuild@0.25.4) - nanoid: - specifier: ^5.0.8 - version: 5.1.5 - next-sitemap: - specifier: ^4.2.3 - version: 4.2.3(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)) - postcss: - specifier: ^8.4.21 - version: 8.5.3 prettier: specifier: ^3.3.3 version: 3.5.3 @@ -1539,91 +986,6 @@ importers: specifier: ^5.3.7 version: 5.3.7 - apps/status.network: - dependencies: - '@status-im/colors': - specifier: workspace:* - version: link:../../packages/colors - '@status-im/icons': - specifier: workspace:* - version: link:../../packages/icons - '@vercel/analytics': - specifier: ^1.5.0 - version: 1.5.0(next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4) - cva: - specifier: 1.0.0-beta.1 - version: 1.0.0-beta.1(typescript@5.8.3) - framer-motion: - specifier: ^12.0.6 - version: 12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.1.1(react@19.1.0))(react@19.1.0) - next: - specifier: 15.1.6 - version: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4) - next-mdx-remote: - specifier: ^5.0.0 - version: 5.0.0(@types/react@19.1.0)(acorn@8.14.1)(react@19.1.0) - react: - specifier: ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^19.0.0 - version: 19.1.1(react@19.1.0) - rehype-slug: - specifier: ^6.0.0 - version: 6.0.0 - ts-pattern: - specifier: ^5.6.2 - version: 5.7.1 - zod: - specifier: 3.23.8 - version: 3.23.8 - devDependencies: - '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.3.1 - version: 4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3) - '@types/node': - specifier: ^20 - version: 20.11.5 - '@types/react': - specifier: 19.1.0 - version: 19.1.0 - '@types/react-dom': - specifier: 19.1.1 - version: 19.1.1(@types/react@19.1.0) - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-config-next: - specifier: 15.1.6 - version: 15.1.6(eslint@8.57.1)(typescript@5.8.3) - eslint-plugin-tailwindcss: - specifier: ^3.17.4 - version: 3.17.5(tailwindcss@3.4.11) - husky: - specifier: ^9.1.7 - version: 9.1.7 - lint-staged: - specifier: ^15.4.3 - version: 15.5.2 - postcss: - specifier: ^8.5.1 - version: 8.5.3 - prettier: - specifier: ^3.4.2 - version: 3.5.3 - prettier-plugin-tailwindcss: - specifier: ^0.6.11 - version: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3))(prettier@3.5.3) - tailwindcss: - specifier: ^3.4.11 - version: 3.4.11 - typescript: - specifier: ^5.7.3 - version: 5.8.3 - typescript-eslint: - specifier: ^8.22.0 - version: 8.40.0(eslint@8.57.1)(typescript@5.8.3) - apps/wallet: dependencies: '@cardano-sdk/core': @@ -1738,8 +1100,8 @@ importers: specifier: ^0.23.0 version: 0.23.0(rollup@4.40.2)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1)) zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@ianvs/prettier-plugin-sort-imports': specifier: 4.1.1 @@ -1760,10 +1122,10 @@ importers: specifier: ^0.0.280 version: 0.0.280 '@types/react': - specifier: 19.1.0 + specifier: ^19.0.1 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19.0.2 version: 19.1.1(@types/react@19.1.0) '@vitejs/plugin-react': specifier: ^4.3.4 @@ -1932,10 +1294,10 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@types/react': - specifier: 19.1.0 + specifier: ^19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19.1.1 version: 19.1.1(@types/react@19.1.0) '@vitejs/plugin-react-swc': specifier: ^3.7.0 @@ -2104,8 +1466,8 @@ importers: specifier: ^11.0.1 version: 11.0.1 zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@bufbuild/protoc-gen-es': specifier: 1.4.2 @@ -2131,6 +1493,9 @@ importers: '@status-im/icons': specifier: workspace:* version: link:../icons + connectkit: + specifier: ^1.9.0 + version: 1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.90.2(react@19.1.0))(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) cva: specifier: ^1.0.0-beta.1 version: 1.0.0-beta.1(typescript@5.8.3) @@ -2139,13 +1504,13 @@ importers: version: 12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.1.1(react@19.1.0))(react@19.1.0) next: specifier: 15.1.6 - version: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4) + version: 15.1.6(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4) ts-pattern: specifier: ^5.3.1 version: 5.7.1 zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 devDependencies: '@hookform/devtools': specifier: ^4.3.1 @@ -2157,10 +1522,10 @@ importers: specifier: ^20 version: 20.11.5 '@types/react': - specifier: 19.1.0 + specifier: ^19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19.1.1 version: 19.1.1(@types/react@19.1.0) '@vitejs/plugin-react-swc': specifier: ^3.7.0 @@ -2254,7 +1619,7 @@ importers: version: link:../icons '@trpc/react-query': specifier: 10.45.2 - version: 10.45.2(@tanstack/react-query@5.75.5(react@18.3.1))(@trpc/client@11.1.0(@trpc/server@10.45.2)(typescript@5.8.3))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 10.45.2(@tanstack/react-query@5.90.2(react@18.3.1))(@trpc/client@11.1.0(@trpc/server@10.45.2)(typescript@5.8.3))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: 10.45.2 version: 10.45.2 @@ -2340,8 +1705,8 @@ importers: specifier: ^5.3.1 version: 5.3.1 zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: ^3.23.8 + version: 3.25.76 zustand: specifier: ^4.3.7 version: 4.3.7(react@18.3.1) @@ -2362,10 +1727,10 @@ importers: specifier: ^4.0.0 version: 4.0.3 '@types/react': - specifier: 19.1.0 + specifier: ^19.1.0 version: 19.1.0 '@types/react-dom': - specifier: 19.1.1 + specifier: ^19.1.1 version: 19.1.1(@types/react@19.1.0) '@vitejs/plugin-react-swc': specifier: ^3.7.0 @@ -2537,10 +1902,6 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -3811,12 +3172,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.2.0': - resolution: {integrity: sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3841,18 +3196,10 @@ packages: resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.14.0': resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4281,19 +3628,10 @@ packages: resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} @@ -4787,7 +4125,7 @@ packages: '@mdx-js/react@3.0.1': resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '>=16' react: '>=16' '@metamask/eth-json-rpc-provider@1.0.1': @@ -4943,18 +4281,12 @@ packages: '@next/env@15.1.6': resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} - '@next/env@15.2.4': - resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} - '@next/env@15.3.0': resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} '@next/eslint-plugin-next@15.1.6': resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} - '@next/eslint-plugin-next@15.2.4': - resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==} - '@next/eslint-plugin-next@15.3.0': resolution: {integrity: sha512-511UUcpWw5GWTyKfzW58U2F/bYJyjLE9e3SlnGK/zSXq7RqLlqFO8B9bitJjumLpj317fycC96KZ2RZsjGNfBw==} @@ -4964,12 +4296,6 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.2.4': - resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@15.3.0': resolution: {integrity: sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==} engines: {node: '>= 10'} @@ -4982,12 +4308,6 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.2.4': - resolution: {integrity: sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@15.3.0': resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} engines: {node: '>= 10'} @@ -5000,12 +4320,6 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.2.4': - resolution: {integrity: sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-gnu@15.3.0': resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} engines: {node: '>= 10'} @@ -5018,12 +4332,6 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.4': - resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-musl@15.3.0': resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} engines: {node: '>= 10'} @@ -5036,12 +4344,6 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.4': - resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-gnu@15.3.0': resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} engines: {node: '>= 10'} @@ -5054,12 +4356,6 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.4': - resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-musl@15.3.0': resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} engines: {node: '>= 10'} @@ -5072,12 +4368,6 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.2.4': - resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@15.3.0': resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} engines: {node: '>= 10'} @@ -5090,12 +4380,6 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.2.4': - resolution: {integrity: sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@15.3.0': resolution: {integrity: sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==} engines: {node: '>= 10'} @@ -6543,8 +5827,8 @@ packages: '@radix-ui/react-accordion@1.2.0': resolution: {integrity: sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6556,8 +5840,8 @@ packages: '@radix-ui/react-alert-dialog@1.1.13': resolution: {integrity: sha512-/uPs78OwxGxslYOG5TKeUsv9fZC0vo376cXSADdKirTmsLJU2au6L3n34c3p6W26rFDDDze/hwy4fYeNd0qdGA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6569,8 +5853,8 @@ packages: '@radix-ui/react-arrow@1.1.0': resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6582,8 +5866,8 @@ packages: '@radix-ui/react-arrow@1.1.6': resolution: {integrity: sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6595,8 +5879,8 @@ packages: '@radix-ui/react-checkbox@1.1.1': resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6608,8 +5892,8 @@ packages: '@radix-ui/react-collapsible@1.1.0': resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6621,8 +5905,8 @@ packages: '@radix-ui/react-collection@1.1.0': resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6634,8 +5918,8 @@ packages: '@radix-ui/react-collection@1.1.6': resolution: {integrity: sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6647,7 +5931,7 @@ packages: '@radix-ui/react-compose-refs@1.1.0': resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6656,7 +5940,7 @@ packages: '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6665,7 +5949,7 @@ packages: '@radix-ui/react-context@1.1.0': resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6674,7 +5958,7 @@ packages: '@radix-ui/react-context@1.1.2': resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6683,8 +5967,8 @@ packages: '@radix-ui/react-dialog@1.1.1': resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6696,8 +5980,8 @@ packages: '@radix-ui/react-dialog@1.1.13': resolution: {integrity: sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6709,7 +5993,7 @@ packages: '@radix-ui/react-direction@1.1.0': resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6718,7 +6002,7 @@ packages: '@radix-ui/react-direction@1.1.1': resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6727,8 +6011,8 @@ packages: '@radix-ui/react-dismissable-layer@1.1.0': resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6740,8 +6024,8 @@ packages: '@radix-ui/react-dismissable-layer@1.1.9': resolution: {integrity: sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6753,8 +6037,8 @@ packages: '@radix-ui/react-dropdown-menu@2.1.1': resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6766,8 +6050,8 @@ packages: '@radix-ui/react-dropdown-menu@2.1.14': resolution: {integrity: sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6779,7 +6063,7 @@ packages: '@radix-ui/react-focus-guards@1.1.0': resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6788,7 +6072,7 @@ packages: '@radix-ui/react-focus-guards@1.1.2': resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6797,8 +6081,8 @@ packages: '@radix-ui/react-focus-scope@1.1.0': resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6810,8 +6094,8 @@ packages: '@radix-ui/react-focus-scope@1.1.6': resolution: {integrity: sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6823,7 +6107,7 @@ packages: '@radix-ui/react-id@1.1.0': resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6832,7 +6116,7 @@ packages: '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -6841,8 +6125,8 @@ packages: '@radix-ui/react-menu@2.1.1': resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6854,8 +6138,8 @@ packages: '@radix-ui/react-menu@2.1.14': resolution: {integrity: sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6867,8 +6151,8 @@ packages: '@radix-ui/react-navigation-menu@1.2.0': resolution: {integrity: sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6880,8 +6164,8 @@ packages: '@radix-ui/react-popover@1.1.1': resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6893,8 +6177,8 @@ packages: '@radix-ui/react-popper@1.2.0': resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6906,8 +6190,8 @@ packages: '@radix-ui/react-popper@1.2.6': resolution: {integrity: sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6919,8 +6203,8 @@ packages: '@radix-ui/react-portal@1.1.1': resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6932,8 +6216,8 @@ packages: '@radix-ui/react-portal@1.1.8': resolution: {integrity: sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6945,8 +6229,8 @@ packages: '@radix-ui/react-presence@1.1.0': resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6958,8 +6242,8 @@ packages: '@radix-ui/react-presence@1.1.4': resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6971,8 +6255,8 @@ packages: '@radix-ui/react-primitive@2.0.0': resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6984,8 +6268,8 @@ packages: '@radix-ui/react-primitive@2.1.2': resolution: {integrity: sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -6997,8 +6281,8 @@ packages: '@radix-ui/react-roving-focus@1.1.0': resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7010,8 +6294,8 @@ packages: '@radix-ui/react-roving-focus@1.1.9': resolution: {integrity: sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7023,7 +6307,7 @@ packages: '@radix-ui/react-slot@1.1.0': resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7032,7 +6316,7 @@ packages: '@radix-ui/react-slot@1.2.2': resolution: {integrity: sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7041,8 +6325,8 @@ packages: '@radix-ui/react-switch@1.1.0': resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7054,8 +6338,8 @@ packages: '@radix-ui/react-tabs@1.1.0': resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7067,8 +6351,8 @@ packages: '@radix-ui/react-toast@1.2.1': resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7080,8 +6364,8 @@ packages: '@radix-ui/react-toggle-group@1.1.0': resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7093,8 +6377,8 @@ packages: '@radix-ui/react-toggle@1.1.0': resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7106,8 +6390,8 @@ packages: '@radix-ui/react-tooltip@1.1.2': resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -7119,7 +6403,7 @@ packages: '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7128,7 +6412,7 @@ packages: '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7137,7 +6421,7 @@ packages: '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7146,7 +6430,7 @@ packages: '@radix-ui/react-use-controllable-state@1.2.2': resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7155,7 +6439,7 @@ packages: '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7164,7 +6448,7 @@ packages: '@radix-ui/react-use-escape-keydown@1.1.0': resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7173,7 +6457,7 @@ packages: '@radix-ui/react-use-escape-keydown@1.1.1': resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7182,7 +6466,7 @@ packages: '@radix-ui/react-use-layout-effect@1.1.0': resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7191,7 +6475,7 @@ packages: '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7200,7 +6484,7 @@ packages: '@radix-ui/react-use-previous@1.1.0': resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7209,7 +6493,7 @@ packages: '@radix-ui/react-use-rect@1.1.0': resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7218,7 +6502,7 @@ packages: '@radix-ui/react-use-rect@1.1.1': resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7227,7 +6511,7 @@ packages: '@radix-ui/react-use-size@1.1.0': resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7236,7 +6520,7 @@ packages: '@radix-ui/react-use-size@1.1.1': resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7245,8 +6529,8 @@ packages: '@radix-ui/react-visually-hidden@1.1.0': resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} peerDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1 + '@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: @@ -8025,6 +7309,21 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@spruceid/siwe-parser@2.1.2': + resolution: {integrity: sha512-d/r3S1LwJyMaRAKQ0awmo9whfXeE88Qt00vRj91q5uv5ATtWIQEGJ67Yr5eSZw5zp1/fZCXZYuEckt8lSkereQ==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + '@storybook/addon-actions@8.3.0': resolution: {integrity: sha512-HvAc3fW979JVw8CSKXZMouvgrJ2BNLNWaUB8jNokQb3Us00P6igVKLwg/pBV8GBgDr5Ng4pHYqi/ZH+xzEYFFw==} peerDependencies: @@ -8545,9 +7844,15 @@ packages: '@tanstack/query-core@5.29.0': resolution: {integrity: sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww==} + '@tanstack/query-core@5.66.0': + resolution: {integrity: sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw==} + '@tanstack/query-core@5.75.5': resolution: {integrity: sha512-kPDOxtoMn2Ycycb76Givx2fi+2pzo98F9ifHL/NFiahEDpDwSVW6o12PRuQ0lQnBOunhRG5etatAhQij91M3MQ==} + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} + '@tanstack/query-devtools@5.28.10': resolution: {integrity: sha512-5UN629fKa5/1K/2Pd26gaU7epxRrYiT1gy+V+pW5K6hnf1DeUKK3pANSb2eHKlecjIKIhTwyF7k9XdyE2gREvQ==} @@ -8571,11 +7876,21 @@ packages: peerDependencies: react: ^18.0.0 + '@tanstack/react-query@5.66.0': + resolution: {integrity: sha512-z3sYixFQJe8hndFnXgWu7C79ctL+pI0KAelYyW+khaNJ1m22lWrhJU2QrsTcRKMuVPtoZvfBYrTStIdKo+x0Xw==} + peerDependencies: + react: ^18 || ^19 + '@tanstack/react-query@5.75.5': resolution: {integrity: sha512-QrLCJe40BgBVlWdAdf2ZEVJ0cISOuEy/HKupId1aTKU6gPJZVhSvZpH+Si7csRflCJphzlQ77Yx6gUxGW9o0XQ==} peerDependencies: react: ^18 || ^19 + '@tanstack/react-query@5.90.2': + resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} + peerDependencies: + react: ^18 || ^19 + '@tanstack/react-router-devtools@1.120.2': resolution: {integrity: sha512-89qY5pKdIN6r5G0pHP92mLvorzd7rUlHjvCkjNYOyYduxGQ8a703Y7Fp/RqXibwhjvZcet6BR2IrEhIqg9Yjhw==} engines: {node: '>=12'} @@ -8597,6 +7912,13 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + '@tanstack/react-virtual@3.13.8': resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} peerDependencies: @@ -8668,6 +7990,10 @@ packages: '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + '@tanstack/virtual-core@3.13.8': resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} @@ -8797,11 +8123,6 @@ packages: '@trpc/server@10.45.2': resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} - '@trpc/server@11.1.0': - resolution: {integrity: sha512-uAJ7ikejeujVkf53XFJ/0W8nr7bDjul+Szk5Rsepq97Hb/WS1RkRXdyX4KqAyCE9b1vDFCJVJwSxiIZdRtbTZQ==} - peerDependencies: - typescript: '>=5.7.2' - '@trustwallet/wallet-core@4.3.6': resolution: {integrity: sha512-X+n2CzDhIfUtnQtqqM3Su6XmBdzUijMu8uQEnA9yQWfOv7d33LfaQ9vNbzvpFk4I52K7n6AWLaylM1unuIuTJQ==} @@ -8818,6 +8139,9 @@ packages: '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -8863,6 +8187,15 @@ packages: '@types/connect@3.4.35': resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/content-disposition@0.5.9': + resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} + + '@types/cookie@0.5.4': + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} + + '@types/cookies@0.9.1': + resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} + '@types/d3-array@3.0.3': resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} @@ -8947,9 +8280,6 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -8992,9 +8322,15 @@ packages: '@types/highlight-words-core@1.2.3': resolution: {integrity: sha512-PWNU/NR0CaYEsK38mcCTyDzeS2TlEGK9kRhRMz1i86jVAe836ZlA3gl6QYpu+CG6IpfNKTgWpEnJuRededvC0g==} + '@types/http-assert@1.5.6': + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/is-ci@3.0.0': resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} @@ -9019,9 +8355,18 @@ packages: '@types/jsonfile@6.1.1': resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.15.0': + resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/lodash@4.14.191': resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} @@ -9098,16 +8443,30 @@ packages: resolution: {integrity: sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==} deprecated: This is a stub types definition. prettier provides its own type definitions, so you do not need this installed. + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qs@6.9.7': resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} '@types/range-parser@1.2.4': resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@types/react-dom@18.2.18': + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + + '@types/react-dom@19.1.0': + resolution: {integrity: sha512-21E2zejNNRtjG4hKIyJz4aWswGEcNFTgttA0bZIRGjj1HA/tbSUxIJnIcYbn98pwJck0cS1bsQhn6eaKqbcFWw==} + peerDependencies: + '@types/react': ^19.0.0 + '@types/react-dom@19.1.1': resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^19.0.0 + + '@types/react@18.2.48': + resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} '@types/react@19.1.0': resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} @@ -9121,6 +8480,9 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/scheduler@0.26.0': + resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} + '@types/semver@7.5.0': resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} @@ -9861,7 +9223,7 @@ packages: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: typescript: '>=5.0.4' - zod: 3.23.8 + zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: optional: true @@ -9995,6 +9357,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apg-js@4.4.0: + resolution: {integrity: sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==} + arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} @@ -10675,10 +10040,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -10930,6 +10291,16 @@ packages: resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} engines: {node: '>=18'} + connectkit-next-siwe@0.3.0: + resolution: {integrity: sha512-zUvx1kROpTGJgNst/yzBatQcU1E3pONJvfAcELk1W52B26WJZ5s5ym/hqMBINhT2zVZYV0XKwEexEzfFQey2Yw==} + engines: {node: '>=12.4'} + peerDependencies: + connectkit: '>=1.2.0' + next: '>=12.x' + react: 17.x || 18.x + react-dom: 17.x || 18.x + viem: '>=2.13.3' + connectkit@1.9.0: resolution: {integrity: sha512-bkqg8zK35pWWG2q8xeo41J1mnBP8D2ffOd/ItB12aad9QZZU20SlEeiQM9iYfRyl0JAH1tqIDlZbXajqZBFfDw==} engines: {node: '>=12.4'} @@ -10986,10 +10357,22 @@ packages: resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} engines: {node: '>= 0.6'} + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} @@ -11254,6 +10637,9 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -11600,7 +10986,7 @@ packages: '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' - '@types/react': 19.1.0 + '@types/react': '>=18' '@types/sql.js': '*' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' @@ -11678,7 +11064,7 @@ packages: resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} peerDependencies: drizzle-orm: '>=0.23.13' - zod: 3.23.8 + zod: '*' dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} @@ -11952,15 +11338,6 @@ packages: typescript: optional: true - eslint-config-next@15.2.4: - resolution: {integrity: sha512-v4gYjd4eYIme8qzaJItpR5MMBXJ0/YV07u7eb50kEnlEmX7yhOjdUdzz70v4fiINYRjLf8X8TbogF0k7wlz6sA==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - eslint-config-next@15.3.0: resolution: {integrity: sha512-+Z3M1W9MnJjX3W4vI9CHfKlEyhTWOUHvc5dB89FyRnzPsUkJlLWZOi8+1pInuVcSztSM4MwBFB0hIHf4Rbwu4g==} peerDependencies: @@ -12107,36 +11484,18 @@ packages: peerDependencies: tailwindcss: ^3.4.0 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - 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} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@9.14.0: resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -12361,6 +11720,9 @@ packages: resolution: {integrity: sha512-k8GtQHi4pJoRQ1gVDFQno+/FVkowo/ehiz/aCj9O/D7HRWb1sSFzNrw+iPVU8QlWtH+jNwbuN+dDVg3QkS56DQ==} engines: {node: '>=8.0.0'} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -12407,10 +11769,6 @@ packages: fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} - hasBin: true - fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -12466,10 +11824,6 @@ packages: resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} engines: {node: '>=14'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -12520,10 +11874,6 @@ packages: engines: {node: '>=18'} hasBin: true - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -13137,6 +12487,9 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -13265,11 +12618,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -13453,6 +12801,27 @@ packages: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} + iron-session@6.3.1: + resolution: {integrity: sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A==} + engines: {node: '>=12'} + peerDependencies: + express: '>=4' + koa: '>=2' + next: '>=10' + peerDependenciesMeta: + express: + optional: true + koa: + optional: true + next: + optional: true + + iron-session@8.0.4: + resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==} + + iron-webcrypto@0.2.8: + resolution: {integrity: sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA==} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -13696,10 +13065,6 @@ packages: resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} engines: {node: '>=0.10.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -15348,27 +14713,6 @@ packages: sass: optional: true - next@15.2.4: - resolution: {integrity: sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==} - 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 - next@15.3.0: resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -16107,6 +15451,10 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-pretty@13.1.1: + resolution: {integrity: sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==} + hasBin: true + pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} @@ -16422,11 +15770,6 @@ packages: engines: {node: '>=14'} hasBin: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - prettier@3.5.3: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} @@ -16701,7 +16044,7 @@ packages: react-easy-emoji@1.8.1: resolution: {integrity: sha512-wAf2x+cjwtOlLfXnjc0J3k5B2PDZdoxd1BjtfKr5tq2AL7t2ygvByJQWgFOyN28xg3qe8EKBM6pKxGP+qrGWuQ==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '>=0.14.0' react: '>=0.14.27' peerDependenciesMeta: '@types/react': @@ -16733,6 +16076,12 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 + react-hook-form@7.64.0: + resolution: {integrity: sha512-fnN+vvTiMLnRqKNTVhDysdrUay0kUUAymQnFIznmgDvapjveUWOOPqMNzPg+A+0yf9DuE2h6xzBjN1s+Qx8wcg==} + 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==} @@ -16762,7 +16111,7 @@ packages: resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -16772,7 +16121,7 @@ packages: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': @@ -16782,7 +16131,7 @@ packages: resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -16792,7 +16141,7 @@ packages: resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -16819,7 +16168,7 @@ packages: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -16829,7 +16178,7 @@ packages: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -16999,7 +16348,7 @@ packages: rehype-react@7.2.0: resolution: {integrity: sha512-MHYyCHka+3TtzBMKtcuvVOBAbI1HrfoYA+XH9m7/rlrQQATCPwtJnPdkxKKcIGF8vc9mxqQja9r9f+FHItQeWg==} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '>=17' rehype-react@8.0.0: resolution: {integrity: sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==} @@ -17437,11 +16786,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@4.4.1: resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} engines: {node: '>=14'} @@ -17549,6 +16893,9 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -17713,6 +17060,11 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + siwe@2.3.2: + resolution: {integrity: sha512-aSf+6+Latyttbj5nMu6GF3doMfv2UYj83hhwZgUF20ky6fTS83uVhkQABdIVnEuS8y1bBdk7p6ltb9SmlhTTlA==} + peerDependencies: + ethers: ^5.6.8 || ^6.0.8 + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -18010,15 +17362,16 @@ packages: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} strip-markdown@5.0.1: resolution: {integrity: sha512-IvoKZrXtWAnlEjRfDlT3yRtGRvpX3RSg+nwAHONmshpSCoxgjZV2xX9ZYvEmwupmYobJtws9oDdTwLUu/5PoMQ==} - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} @@ -18894,7 +18247,7 @@ packages: resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -18904,7 +18257,7 @@ packages: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -18920,7 +18273,7 @@ packages: resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -18930,7 +18283,7 @@ packages: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -19001,6 +18354,9 @@ packages: engines: {node: '>=8'} hasBin: true + valid-url@1.0.9: + resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -19008,7 +18364,7 @@ packages: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '>=16.8' react: '>=16.8' peerDependenciesMeta: '@types/react': @@ -19534,10 +18890,13 @@ packages: resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: 3.23.8 + zod: ^3.24.4 + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zustand@4.3.7: resolution: {integrity: sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ==} @@ -19555,7 +18914,7 @@ packages: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} engines: {node: '>=12.20.0'} peerDependencies: - '@types/react': 19.1.0 + '@types/react': '>=18.0.0' immer: '>=9.0.6' react: '>=18.0.0' use-sync-external-store: '>=1.2.0' @@ -19579,22 +18938,6 @@ snapshots: defu: 6.1.4 many-keys-map: 2.0.1 - '@1stg/remark-preset@2.0.0(prettier@3.3.3)': - dependencies: - remark-frontmatter: 4.0.1 - remark-gfm: 3.0.1 - remark-lint: 9.1.2 - remark-lint-no-duplicate-headings: 3.1.2 - remark-lint-no-duplicate-headings-in-section: 3.1.2 - remark-preset-lint-consistent: 5.1.2 - remark-preset-lint-markdown-style-guide: 5.1.3 - remark-preset-lint-recommended: 6.1.3 - remark-preset-prettier: 2.0.2(prettier@3.3.3) - remark-validate-links: 12.1.1 - transitivePeerDependencies: - - prettier - - supports-color - '@1stg/remark-preset@2.0.0(prettier@3.5.3)': dependencies: remark-frontmatter: 4.0.1 @@ -19758,7 +19101,7 @@ snapshots: '@babel/traverse': 7.27.1(supports-color@5.5.0) '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -19767,7 +19110,7 @@ snapshots: '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -19820,13 +19163,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': - dependencies: - '@babel/traverse': 7.27.1(supports-color@5.5.0) - '@babel/types': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': dependencies: '@babel/traverse': 7.27.1(supports-color@5.5.0) @@ -20144,10 +19480,10 @@ snapshots: '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/types': 7.27.1 debug: 4.3.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -20567,18 +19903,6 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer/cli@0.3.4(esbuild@0.25.4)': - dependencies: - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': 0.3.4 - clipanion: 3.2.1(typanion@3.14.0) - typanion: 3.14.0 - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - '@contentlayer/client@0.3.4(esbuild@0.19.12)': dependencies: '@contentlayer/core': 0.3.4(esbuild@0.19.12) @@ -20588,15 +19912,6 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer/client@0.3.4(esbuild@0.25.4)': - dependencies: - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - '@contentlayer/core@0.3.4(esbuild@0.19.12)': dependencies: '@contentlayer/utils': 0.3.4 @@ -20617,26 +19932,6 @@ snapshots: - '@effect-ts/otel-node' - supports-color - '@contentlayer/core@0.3.4(esbuild@0.25.4)': - dependencies: - '@contentlayer/utils': 0.3.4 - camel-case: 4.1.2 - comment-json: 4.2.5 - gray-matter: 4.0.3 - mdx-bundler: 9.2.1(esbuild@0.25.4) - rehype-stringify: 9.0.4 - remark-frontmatter: 4.0.1 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - source-map-support: 0.5.21 - type-fest: 3.13.1 - unified: 10.1.2 - optionalDependencies: - esbuild: 0.25.4 - transitivePeerDependencies: - - '@effect-ts/otel-node' - - supports-color - '@contentlayer/source-files@0.3.4(esbuild@0.19.12)': dependencies: '@contentlayer/core': 0.3.4(esbuild@0.19.12) @@ -20649,26 +19944,7 @@ snapshots: ts-pattern: 4.3.0 unified: 10.1.2 yaml: 2.5.1 - zod: 3.23.8 - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - - '@contentlayer/source-files@0.3.4(esbuild@0.25.4)': - dependencies: - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': 0.3.4 - chokidar: 3.6.0 - fast-glob: 3.3.2 - gray-matter: 4.0.3 - imagescript: 1.3.0 - micromatch: 4.0.8 - ts-pattern: 4.3.0 - unified: 10.1.2 - yaml: 2.5.1 - zod: 3.23.8 + zod: 3.25.76 transitivePeerDependencies: - '@effect-ts/otel-node' - esbuild @@ -20686,17 +19962,6 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer/source-remote-files@0.3.4(esbuild@0.25.4)': - dependencies: - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - '@contentlayer/source-files': 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': 0.3.4 - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - '@contentlayer/utils@0.3.4': dependencies: '@effect-ts/core': 0.60.5 @@ -21015,16 +20280,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@esbuild-plugins/node-resolve@0.1.4(esbuild@0.25.4)': - dependencies: - '@types/resolve': 1.20.4 - debug: 4.4.0 - esbuild: 0.25.4 - escape-string-regexp: 4.0.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - '@esbuild/aix-ppc64@0.19.12': optional: true @@ -21307,21 +20562,11 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.2.0(eslint@9.14.0(jiti@2.4.2))': - dependencies: - eslint: 9.14.0(jiti@2.4.2) - eslint-visitor-keys: 3.4.1 - '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0(jiti@2.4.2))': dependencies: eslint: 9.14.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.14.0(jiti@2.4.2))': dependencies: eslint: 9.14.0(jiti@2.4.2) @@ -21332,31 +20577,17 @@ snapshots: '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/core@0.7.0': {} - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.20.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.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -21367,8 +20598,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - '@eslint/js@9.14.0': {} '@eslint/object-schema@2.1.4': {} @@ -21547,58 +20776,6 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.4.1)(@types/node@22.7.5)(bufferutil@4.0.9)(enquirer@2.3.6)(graphql@16.11.0)(utf-8-validate@6.0.3)': - dependencies: - '@babel/generator': 7.27.1 - '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - '@graphql-codegen/client-preset': 4.8.1(graphql@16.11.0) - '@graphql-codegen/core': 4.0.2(graphql@16.11.0) - '@graphql-codegen/plugin-helpers': 5.1.0(graphql@16.11.0) - '@graphql-tools/apollo-engine-loader': 8.0.20(graphql@16.11.0) - '@graphql-tools/code-file-loader': 8.1.20(graphql@16.11.0) - '@graphql-tools/git-loader': 8.0.24(graphql@16.11.0) - '@graphql-tools/github-loader': 8.0.20(@types/node@22.7.5)(graphql@16.11.0) - '@graphql-tools/graphql-file-loader': 8.0.19(graphql@16.11.0) - '@graphql-tools/json-file-loader': 8.0.18(graphql@16.11.0) - '@graphql-tools/load': 8.1.0(graphql@16.11.0) - '@graphql-tools/prisma-loader': 8.0.17(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/url-loader': 8.0.31(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@whatwg-node/fetch': 0.8.8 - chalk: 4.1.2 - cosmiconfig: 8.1.3 - debounce: 1.2.1 - detect-indent: 6.1.0 - graphql: 16.11.0 - graphql-config: 5.1.5(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - inquirer: 8.2.6 - is-glob: 4.0.3 - jiti: 1.21.6 - json-to-pretty-yaml: 1.2.2 - listr2: 4.0.5(enquirer@2.3.6) - log-symbols: 4.1.0 - micromatch: 4.0.8 - shell-quote: 1.8.2 - string-env-interpolation: 1.0.1 - ts-log: 2.2.7 - tslib: 2.8.1 - yaml: 2.8.1 - yargs: 17.7.2 - optionalDependencies: - '@parcel/watcher': 2.4.1 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - cosmiconfig-toml-loader - - encoding - - enquirer - - graphql-sock - - supports-color - - uWebSockets.js - - utf-8-validate - '@graphql-codegen/client-preset@4.8.1(graphql@16.11.0)': dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -21871,22 +21048,6 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/executor-graphql-ws@2.0.5(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3)': - dependencies: - '@graphql-tools/executor-common': 0.0.4(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@whatwg-node/disposablestack': 0.0.6 - graphql: 16.11.0 - graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - isomorphic-ws: 5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - tslib: 2.8.1 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - '@fastify/websocket' - - bufferutil - - uWebSockets.js - - utf-8-validate - '@graphql-tools/executor-http@1.3.3(@types/node@22.7.5)(graphql@16.11.0)': dependencies: '@graphql-hive/signal': 1.0.0 @@ -21914,18 +21075,6 @@ snapshots: - bufferutil - utf-8-validate - '@graphql-tools/executor-legacy-ws@1.1.17(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3)': - dependencies: - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@types/ws': 8.5.8 - graphql: 16.11.0 - isomorphic-ws: 5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - tslib: 2.8.1 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@graphql-tools/executor@1.4.7(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 10.8.6(graphql@16.11.0) @@ -22051,34 +21200,6 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/prisma-loader@8.0.17(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3)': - dependencies: - '@graphql-tools/url-loader': 8.0.31(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@types/js-yaml': 4.0.9 - '@whatwg-node/fetch': 0.10.6 - chalk: 4.1.2 - debug: 4.4.0 - dotenv: 16.5.0 - graphql: 16.11.0 - graphql-request: 6.1.0(graphql@16.11.0) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - jose: 5.10.0 - js-yaml: 4.1.0 - lodash: 4.17.21 - scuid: 1.1.0 - tslib: 2.8.1 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - encoding - - supports-color - - uWebSockets.js - - utf-8-validate - '@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.11.0)': dependencies: '@ardatan/relay-compiler': 12.0.0(graphql@16.11.0) @@ -22127,28 +21248,6 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/url-loader@8.0.31(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3)': - dependencies: - '@graphql-tools/executor-graphql-ws': 2.0.5(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/executor-http': 1.3.3(@types/node@22.7.5)(graphql@16.11.0) - '@graphql-tools/executor-legacy-ws': 1.1.17(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@graphql-tools/wrap': 10.0.35(graphql@16.11.0) - '@types/ws': 8.5.8 - '@whatwg-node/fetch': 0.10.6 - '@whatwg-node/promise-helpers': 1.3.1 - graphql: 16.11.0 - isomorphic-ws: 5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - sync-fetch: 0.6.0-2 - tslib: 2.8.1 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - uWebSockets.js - - utf-8-validate - '@graphql-tools/utils@10.8.6(graphql@16.11.0)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) @@ -22257,9 +21356,9 @@ snapshots: dependencies: react-hook-form: 7.58.1(react@18.3.1) - '@hookform/resolvers@3.10.0(react-hook-form@7.58.1(react@19.1.0))': + '@hookform/resolvers@3.10.0(react-hook-form@7.64.0(react@19.1.0))': dependencies: - react-hook-form: 7.58.1(react@19.1.0) + react-hook-form: 7.64.0(react@19.1.0) '@humanfs/core@0.19.1': {} @@ -22268,49 +21367,25 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.0': {} '@ianvs/prettier-plugin-sort-imports@4.1.1(@vue/compiler-sfc@3.3.4)(prettier@3.2.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - prettier: 3.2.4 - semver: 7.6.3 - optionalDependencies: - '@vue/compiler-sfc': 3.3.4 - transitivePeerDependencies: - - supports-color - - '@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.3.3)': - dependencies: + '@babel/core': 7.27.1 '@babel/generator': 7.27.1 '@babel/parser': 7.27.2 '@babel/traverse': 7.27.1(supports-color@5.5.0) '@babel/types': 7.27.1 - prettier: 3.3.3 + prettier: 3.2.4 semver: 7.7.1 optionalDependencies: '@vue/compiler-sfc': 3.3.4 transitivePeerDependencies: - supports-color - optional: true '@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3)': dependencies: @@ -22875,15 +21950,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/esbuild@2.3.0(esbuild@0.25.4)': - dependencies: - '@mdx-js/mdx': 2.3.0 - esbuild: 0.25.4 - node-fetch: 3.3.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -22972,10 +22038,10 @@ snapshots: '@types/react': 19.1.0 react: 19.1.0 - '@mdx-js/react@3.0.1(@types/react@19.1.0)(react@18.3.1)': + '@mdx-js/react@3.0.1(@types/react@18.2.48)(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.0 + '@types/react': 18.2.48 react: 18.3.1 '@mdx-js/react@3.0.1(@types/react@19.1.0)(react@19.1.0)': @@ -23069,6 +22135,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@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: + 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 + '@metamask/sdk-install-modal-web@0.32.0': dependencies: '@paulmillr/qr': 0.2.1 @@ -23100,6 +22181,33 @@ snapshots: - supports-color - utf-8-validate + '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.27.1 + '@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 + '@metamask/superstruct@3.2.1': {} '@metamask/utils@5.0.2': @@ -23255,18 +22363,12 @@ snapshots: '@next/env@15.1.6': {} - '@next/env@15.2.4': {} - '@next/env@15.3.0': {} '@next/eslint-plugin-next@15.1.6': dependencies: fast-glob: 3.3.1 - '@next/eslint-plugin-next@15.2.4': - dependencies: - fast-glob: 3.3.1 - '@next/eslint-plugin-next@15.3.0': dependencies: fast-glob: 3.3.1 @@ -23274,72 +22376,48 @@ snapshots: '@next/swc-darwin-arm64@15.1.6': optional: true - '@next/swc-darwin-arm64@15.2.4': - optional: true - '@next/swc-darwin-arm64@15.3.0': optional: true '@next/swc-darwin-x64@15.1.6': optional: true - '@next/swc-darwin-x64@15.2.4': - optional: true - '@next/swc-darwin-x64@15.3.0': optional: true '@next/swc-linux-arm64-gnu@15.1.6': optional: true - '@next/swc-linux-arm64-gnu@15.2.4': - optional: true - '@next/swc-linux-arm64-gnu@15.3.0': optional: true '@next/swc-linux-arm64-musl@15.1.6': optional: true - '@next/swc-linux-arm64-musl@15.2.4': - optional: true - '@next/swc-linux-arm64-musl@15.3.0': optional: true '@next/swc-linux-x64-gnu@15.1.6': optional: true - '@next/swc-linux-x64-gnu@15.2.4': - optional: true - '@next/swc-linux-x64-gnu@15.3.0': optional: true '@next/swc-linux-x64-musl@15.1.6': optional: true - '@next/swc-linux-x64-musl@15.2.4': - optional: true - '@next/swc-linux-x64-musl@15.3.0': optional: true '@next/swc-win32-arm64-msvc@15.1.6': optional: true - '@next/swc-win32-arm64-msvc@15.2.4': - optional: true - '@next/swc-win32-arm64-msvc@15.3.0': optional: true '@next/swc-win32-x64-msvc@15.1.6': optional: true - '@next/swc-win32-x64-msvc@15.2.4': - optional: true - '@next/swc-win32-x64-msvc@15.3.0': optional: true @@ -25113,6 +24191,23 @@ snapshots: '@radix-ui/primitive@1.1.2': {} + '@radix-ui/react-accordion@1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-accordion@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -25130,22 +24225,19 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-accordion@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-alert-dialog@1.1.13(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-alert-dialog@1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25161,28 +24253,23 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-alert-dialog@1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 - '@radix-ui/react-arrow@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-arrow@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25193,14 +24280,14 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-arrow@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-arrow@1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-arrow@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25211,15 +24298,6 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-arrow@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-checkbox@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -25236,6 +24314,22 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -25252,33 +24346,29 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-collapsible@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.48)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-collection@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-collection@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25292,17 +24382,17 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-collection@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-collection@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25316,23 +24406,11 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-collection@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-compose-refs@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-compose-refs@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -25358,11 +24436,11 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-context@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-context@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-context@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -25388,6 +24466,28 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 + '@radix-ui/react-dialog@1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.1.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.5.7(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-dialog@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -25432,6 +24532,28 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-dialog@1.1.13(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-dialog@1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -25454,33 +24576,11 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-dialog@1.1.13(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) - aria-hidden: 1.2.4 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-direction@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-direction@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-direction@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -25506,18 +24606,31 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25545,6 +24658,19 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -25558,33 +24684,20 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25601,6 +24714,21 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-dropdown-menu@2.1.14(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-menu': 2.1.14(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-dropdown-menu@2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -25616,26 +24744,11 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-dropdown-menu@2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-menu': 2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-focus-guards@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-focus-guards@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -25661,16 +24774,27 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25694,6 +24818,17 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@18.3.1) @@ -25705,23 +24840,12 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-id@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-id@1.1.0(@types/react@19.1.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-id@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -25751,31 +24875,31 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-menu@2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) - aria-hidden: 1.1.3 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) + aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.7(@types/react@19.1.0)(react@18.2.0) + react-remove-scroll: 2.5.7(@types/react@18.2.48)(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 '@radix-ui/react-menu@2.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25795,7 +24919,7 @@ snapshots: '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.3.1) - aria-hidden: 1.1.3 + aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.5.7(@types/react@19.1.0)(react@18.3.1) @@ -25803,6 +24927,32 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-menu@2.1.14(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-menu@2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -25829,53 +24979,50 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-menu@2.1.14(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-navigation-menu@1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) - aria-hidden: 1.2.4 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.6.3(@types/react@19.1.0)(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) - '@radix-ui/react-navigation-menu@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-popover@1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + aria-hidden: 1.1.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.5.7(@types/react@19.1.0)(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-popover@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25900,46 +25047,41 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-popover@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) - aria-hidden: 1.1.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.5.7(@types/react@19.1.0)(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-popper@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.48)(react@18.2.0) '@radix-ui/rect': 1.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/rect': 1.1.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-popper@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25959,23 +25101,23 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-popper@1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-popper@1.2.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/rect': 1.1.0 + '@radix-ui/react-arrow': 1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/rect': 1.1.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-popper@1.2.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -25995,33 +25137,25 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-popper@1.2.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/rect': 1.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.48)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 - '@radix-ui/react-portal@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-portal@1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -26043,6 +25177,16 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-portal@1.1.8(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-portal@1.1.8(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -26053,25 +25197,25 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-portal@1.1.8(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.48)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 - '@radix-ui/react-presence@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-presence@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -26093,6 +25237,16 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@18.3.1) @@ -26103,24 +25257,23 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.48)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -26140,40 +25293,40 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) - '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.0)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -26192,6 +25345,23 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-roving-focus@1.1.9(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-roving-focus@1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -26209,29 +25379,12 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-roving-focus@1.1.9(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-slot@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-slot@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-slot@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26261,20 +25414,35 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-switch@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-previous': 1.1.0(@types/react@19.1.0)(react@18.2.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.2.48)(react@18.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.48 + '@types/react-dom': 18.2.18 + + '@radix-ui/react-switch@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) '@radix-ui/react-switch@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -26291,21 +25459,6 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-switch@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-tabs@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -26368,6 +25521,26 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.0 + '@types/react-dom': 19.1.0(@types/react@19.1.0) + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -26388,31 +25561,11 @@ snapshots: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) - '@radix-ui/react-tooltip@1.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.0)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) - - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26438,12 +25591,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26489,12 +25642,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26524,11 +25677,11 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26554,11 +25707,11 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-previous@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-previous@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26572,12 +25725,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-rect@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-rect@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26607,12 +25760,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-use-size@1.1.0(@types/react@19.1.0)(react@18.2.0)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.2.48)(react@18.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.0)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 '@radix-ui/react-use-size@1.1.0(@types/react@19.1.0)(react@18.3.1)': dependencies: @@ -26642,20 +25795,20 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.0(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.1.0 - '@types/react-dom': 19.1.1(@types/react@19.1.0) + '@types/react-dom': 19.1.0(@types/react@19.1.0) - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 19.1.0 '@types/react-dom': 19.1.1(@types/react@19.1.0) @@ -26723,7 +25876,7 @@ snapshots: '@swc/helpers': 0.5.15 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) '@react-aria/color@3.0.0-rc.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -27664,24 +26817,91 @@ snapshots: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@reown/appkit-common@1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@reown/appkit-common@1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@reown/appkit-controllers@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3) - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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 + + '@reown/appkit-controllers@1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -27713,12 +26933,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.23.8)': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3) lit: 3.1.0 transitivePeerDependencies: @@ -27749,10 +26969,46 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 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' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3) lit: 3.1.0 qrcode: 1.5.3 @@ -27783,16 +27039,87 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.23.8)': + '@reown/appkit-ui@1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.1.0 + qrcode: 1.5.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 + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.3 '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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 + + '@reown/appkit-utils@1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -27822,29 +27149,81 @@ snapshots: '@reown/appkit-wallet@1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.22.4) '@reown/appkit-polyfills': 1.7.3 '@walletconnect/logger': 2.1.2 - zod: 3.23.8 + zod: 3.22.4 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@reown/appkit@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-scaffold-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.23.8) - '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.23.8) + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) + '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3) '@walletconnect/types': 2.19.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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 + + '@reown/appkit@1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) + '@reown/appkit-ui': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.0)(react@19.1.0))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@19.1.0)(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -27962,9 +27341,9 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -27972,10 +27351,30 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -28042,6 +27441,26 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@spruceid/siwe-parser@2.1.2': + dependencies: + '@noble/hashes': 1.8.0 + apg-js: 4.4.0 + uri-js: 4.4.1 + valid-url: 1.0.9 + + '@stablelib/binary@1.0.1': + dependencies: + '@stablelib/int': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/wipe@1.0.1': {} + '@storybook/addon-actions@8.3.0(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 @@ -28078,12 +27497,12 @@ snapshots: '@storybook/addon-docs@8.3.0(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3))': dependencies: - '@mdx-js/react': 3.0.1(@types/react@19.1.0)(react@18.3.1) + '@mdx-js/react': 3.0.1(@types/react@18.2.48)(react@18.3.1) '@storybook/blocks': 8.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)) '@storybook/csf-plugin': 8.3.0(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)) '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 8.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - '@types/react': 19.1.0 + '@types/react': 18.2.48 fs-extra: 11.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -28331,9 +27750,9 @@ snapshots: dependencies: storybook: 8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3) - '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.25.2)': dependencies: @@ -28343,61 +27762,69 @@ snapshots: dependencies: '@babel/core': 7.25.2 + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.27.1 '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@svgr/babel-preset@6.5.1(@babel/core@7.25.2)': + '@svgr/babel-preset@6.5.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.25.2 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.25.2) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.25.2) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.25.2) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.25.2) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.25.2) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.25.2) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.25.2) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.25.2) + '@babel/core': 7.27.1 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.27.1) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.1) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.1) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.27.1) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.27.1) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.27.1) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.27.1) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.27.1) '@svgr/babel-preset@8.1.0(@babel/core@7.25.2)': dependencies: @@ -28428,8 +27855,8 @@ snapshots: '@svgr/core@6.5.1': dependencies: - '@babel/core': 7.25.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.25.2) + '@babel/core': 7.27.1 + '@svgr/babel-preset': 6.5.1(@babel/core@7.27.1) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -28458,8 +27885,8 @@ snapshots: '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': dependencies: - '@babel/core': 7.25.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.25.2) + '@babel/core': 7.27.1 + '@svgr/babel-preset': 6.5.1(@babel/core@7.27.1) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -28623,8 +28050,12 @@ snapshots: '@tanstack/query-core@5.29.0': {} + '@tanstack/query-core@5.66.0': {} + '@tanstack/query-core@5.75.5': {} + '@tanstack/query-core@5.90.2': {} + '@tanstack/query-devtools@5.28.10': {} '@tanstack/query-devtools@5.74.7': {} @@ -28646,16 +28077,26 @@ snapshots: '@tanstack/query-core': 5.29.0 react: 19.1.0 - '@tanstack/react-query@5.75.5(react@18.3.1)': + '@tanstack/react-query@5.66.0(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.75.5 - react: 18.3.1 + '@tanstack/query-core': 5.66.0 + react: 19.1.0 '@tanstack/react-query@5.75.5(react@19.1.0)': dependencies: '@tanstack/query-core': 5.75.5 react: 19.1.0 + '@tanstack/react-query@5.90.2(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.90.2 + react: 18.3.1 + + '@tanstack/react-query@5.90.2(react@19.1.0)': + dependencies: + '@tanstack/query-core': 5.90.2 + react: 19.1.0 + '@tanstack/react-router-devtools@1.120.2(@tanstack/react-router@1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.119.0)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)': dependencies: '@tanstack/react-router': 1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -28686,6 +28127,12 @@ snapshots: react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.5.0(react@19.1.0) + '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/table-core': 8.21.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + '@tanstack/react-virtual@3.13.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/virtual-core': 3.13.8 @@ -28727,7 +28174,7 @@ snapshots: '@tanstack/virtual-file-routes': 1.115.0 prettier: 3.5.3 tsx: 4.19.4 - zod: 3.23.8 + zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -28749,7 +28196,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.2 - zod: 3.23.8 + zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1) @@ -28765,6 +28212,8 @@ snapshots: '@tanstack/store@0.7.0': {} + '@tanstack/table-core@8.21.3': {} + '@tanstack/virtual-core@3.13.8': {} '@tanstack/virtual-file-routes@1.115.0': {} @@ -28884,41 +28333,27 @@ snapshots: '@trpc/server': 10.45.2 typescript: 5.8.3 - '@trpc/client@11.1.0(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - '@trpc/server': 11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3) - typescript: 5.8.3 - - '@trpc/next@10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@trpc/next@10.45.2(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/react-query': 5.75.5(react@19.1.0) + '@tanstack/react-query': 5.90.2(react@19.1.0) '@trpc/client': 10.45.2(@trpc/server@10.45.2) - '@trpc/react-query': 11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + '@trpc/react-query': 11.1.0(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@trpc/server': 10.45.2 next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@trpc/react-query@10.45.2(@tanstack/react-query@5.75.5(react@18.3.1))(@trpc/client@11.1.0(@trpc/server@10.45.2)(typescript@5.8.3))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@10.45.2(@tanstack/react-query@5.90.2(react@18.3.1))(@trpc/client@11.1.0(@trpc/server@10.45.2)(typescript@5.8.3))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.75.5(react@18.3.1) + '@tanstack/react-query': 5.90.2(react@18.3.1) '@trpc/client': 11.1.0(@trpc/server@10.45.2)(typescript@5.8.3) '@trpc/server': 10.45.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@trpc/react-query@11.1.0(@tanstack/react-query@5.29.0(react@19.1.0))(@trpc/client@11.1.0(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': + '@trpc/react-query@11.1.0(@tanstack/react-query@5.90.2(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': dependencies: - '@tanstack/react-query': 5.29.0(react@19.1.0) - '@trpc/client': 11.1.0(@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3))(typescript@5.8.3) - '@trpc/server': 11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - typescript: 5.8.3 - - '@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': - dependencies: - '@tanstack/react-query': 5.75.5(react@19.1.0) + '@tanstack/react-query': 5.90.2(react@19.1.0) '@trpc/client': 10.45.2(@trpc/server@10.45.2) '@trpc/server': 10.45.2 react: 19.1.0 @@ -28927,10 +28362,6 @@ snapshots: '@trpc/server@10.45.2': {} - '@trpc/server@11.1.0(patch_hash=j772m5gatolhdil2x65xum5qqi)(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - '@trustwallet/wallet-core@4.3.6': dependencies: protobufjs: 7.2.5 @@ -28950,6 +28381,10 @@ snapshots: tslib: 2.8.1 optional: true + '@types/accepts@1.3.7': + dependencies: + '@types/node': 20.11.5 + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.7 @@ -29020,6 +28455,17 @@ snapshots: dependencies: '@types/node': 20.11.5 + '@types/content-disposition@0.5.9': {} + + '@types/cookie@0.5.4': {} + + '@types/cookies@0.9.1': + dependencies: + '@types/connect': 3.4.35 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 20.11.5 + '@types/d3-array@3.0.3': {} '@types/d3-array@3.2.1': {} @@ -29096,8 +28542,6 @@ snapshots: '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} - '@types/estree@1.0.7': {} '@types/express-serve-static-core@4.19.5': @@ -29148,8 +28592,12 @@ snapshots: '@types/highlight-words-core@1.2.3': {} + '@types/http-assert@1.5.6': {} + '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.5': {} + '@types/is-ci@3.0.0': dependencies: ci-info: 3.8.0 @@ -29170,10 +28618,27 @@ snapshots: dependencies: '@types/node': 20.11.5 + '@types/keygrip@1.0.6': {} + '@types/keyv@3.1.4': dependencies: '@types/node': 20.11.5 + '@types/koa-compose@3.2.8': + dependencies: + '@types/koa': 2.15.0 + + '@types/koa@2.15.0': + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.9 + '@types/cookies': 0.9.1 + '@types/http-assert': 1.5.6 + '@types/http-errors': 2.0.5 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 20.11.5 + '@types/lodash@4.14.191': {} '@types/mdast@3.0.15': @@ -29242,14 +28707,30 @@ snapshots: dependencies: prettier: 3.5.3 + '@types/prop-types@15.7.15': {} + '@types/qs@6.9.7': {} '@types/range-parser@1.2.4': {} + '@types/react-dom@18.2.18': + dependencies: + '@types/react': 19.1.0 + + '@types/react-dom@19.1.0(@types/react@19.1.0)': + dependencies: + '@types/react': 19.1.0 + '@types/react-dom@19.1.1(@types/react@19.1.0)': dependencies: '@types/react': 19.1.0 + '@types/react@18.2.48': + dependencies: + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.26.0 + csstype: 3.1.3 + '@types/react@19.1.0': dependencies: csstype: 3.1.3 @@ -29262,6 +28743,8 @@ snapshots: '@types/retry@0.12.2': {} + '@types/scheduler@0.26.0': {} + '@types/semver@7.5.0': {} '@types/send@0.17.4': @@ -29321,23 +28804,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -29368,18 +28834,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.40.0 - debug: 4.4.0 - eslint: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.40.0 @@ -29427,18 +28881,6 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.0 - eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.40.0 @@ -29497,17 +28939,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - eslint: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.14.0(jiti@2.4.2)) @@ -29549,27 +28980,6 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.5.0(next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4)': - optionalDependencies: - next: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - svelte: 4.2.2 - vue: 3.3.4 - - '@vercel/analytics@1.5.0(next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4)': - optionalDependencies: - next: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - svelte: 4.2.2 - vue: 3.3.4 - - '@vercel/analytics@1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4)': - optionalDependencies: - next: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - svelte: 4.2.2 - vue: 3.3.4 - '@vercel/analytics@1.5.0(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4)': optionalDependencies: next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) @@ -29577,25 +28987,6 @@ snapshots: svelte: 4.2.2 vue: 3.3.4 - '@vercel/microfrontends@1.1.0(@vercel/analytics@1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1))': - dependencies: - ajv: 8.17.1 - commander: 12.1.0 - cookie: 0.4.0 - fast-glob: 3.3.3 - http-proxy: 1.18.1 - jsonc-parser: 3.3.1 - nanoid: 3.3.11 - path-to-regexp: 6.2.1 - optionalDependencies: - '@vercel/analytics': 1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4) - next: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - vite: 6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1) - transitivePeerDependencies: - - debug - '@vercel/microfrontends@1.1.0(@vercel/analytics@1.5.0(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1))': dependencies: ajv: 8.17.1 @@ -29622,28 +29013,6 @@ snapshots: utf-8-validate: 6.0.3 ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@vercel/toolbar@0.1.36(@vercel/analytics@1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1))': - dependencies: - '@tinyhttp/app': 1.3.0 - '@vercel/microfrontends': 1.1.0(@vercel/analytics@1.5.0(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1)) - chokidar: 3.6.0 - execa: 5.1.1 - fast-glob: 3.3.2 - find-up: 5.0.0 - get-port: 5.1.1 - jsonc-parser: 3.3.1 - strip-ansi: 6.0.1 - optionalDependencies: - next: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - vite: 6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1) - transitivePeerDependencies: - - '@sveltejs/kit' - - '@vercel/analytics' - - '@vercel/speed-insights' - - debug - - react-dom - '@vercel/toolbar@0.1.36(@vercel/analytics@1.5.0(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react@19.1.0)(svelte@4.2.2)(vue@3.3.4))(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1))': dependencies: '@tinyhttp/app': 1.3.0 @@ -30272,16 +29641,55 @@ snapshots: '@vue/shared@3.3.4': {} - '@wagmi/connectors@5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)))(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)))(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)) - '@walletconnect/ethereum-provider': 2.20.0(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@wagmi/core': 2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.20.0(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + optionalDependencies: + typescript: 5.8.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/connectors@5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + 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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.20.0(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30311,11 +29719,11 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))': + '@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) zustand: 5.0.0(@types/react@19.1.0)(react@19.1.0)(use-sync-external-store@1.4.0(react@19.1.0)) optionalDependencies: '@tanstack/query-core': 5.29.0 @@ -30326,6 +29734,21 @@ snapshots: - react - use-sync-external-store + '@wagmi/core@2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.1.0)(react@19.1.0)(use-sync-external-store@1.4.0(react@19.1.0)) + optionalDependencies: + '@tanstack/query-core': 5.90.2 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@waku/core@0.0.26(@multiformats/multiaddr@12.2.0)(libp2p@0.46.18)': dependencies: '@noble/hashes': 1.8.0 @@ -30458,7 +29881,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@walletconnect/core@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/core@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -30472,7 +29895,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -30501,25 +29924,437 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + 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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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/core@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + 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.8)(utf-8-validate@6.0.3) + '@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.20.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@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/core@2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + 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.20.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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.20.0(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@walletconnect/types': 2.20.0 + '@walletconnect/universal-provider': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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/ethereum-provider@2.20.0(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.20.0 + '@walletconnect/universal-provider': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + 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.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@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/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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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 + + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + 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 + + '@walletconnect/sign-client@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@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.20.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + 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 + + '@walletconnect/sign-client@2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: + '@walletconnect/core': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 '@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.8)(utf-8-validate@6.0.3) - '@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.20.0 - '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.33.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 - uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -30544,22 +30379,17 @@ snapshots: - utf-8-validate - zod - '@walletconnect/environment@1.0.1': + '@walletconnect/time@1.0.2': dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.20.0(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/types@2.19.2': dependencies: - '@reown/appkit': 1.7.3(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@walletconnect/types': 2.20.0 - '@walletconnect/universal-provider': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -30573,73 +30403,22 @@ snapshots: - '@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': + '@walletconnect/types@2.20.0': 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/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 - - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.8)(utf-8-validate@6.0.3)': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.3) - 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' @@ -30651,6 +30430,7 @@ snapshots: - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -30659,37 +30439,19 @@ snapshots: - ioredis - uploadthing - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@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/time': 1.0.2 + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -30709,22 +30471,26 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/sign-client@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@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/time': 1.0.2 - '@walletconnect/types': 2.20.0 - '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -30744,23 +30510,26 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.19.2': + '@walletconnect/universal-provider@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@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.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + '@walletconnect/types': 2.20.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -30778,17 +30547,28 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/types@2.20.0': + '@walletconnect/universal-provider@2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@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.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.20.0 + '@walletconnect/utils': 2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -30806,24 +30586,34 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/utils@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': 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 + '@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/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + '@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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - es-toolkit: 1.33.0 - events: 3.3.0 + '@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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -30842,27 +30632,31 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/universal-provider@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': 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 + '@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/logger': 2.1.2 - '@walletconnect/sign-client': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - '@walletconnect/types': 2.20.0 - '@walletconnect/utils': 2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - es-toolkit: 1.33.0 - events: 3.3.0 + '@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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -30881,14 +30675,13 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/utils@2.19.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/utils@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -30899,14 +30692,14 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 + '@walletconnect/types': 2.20.0 '@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.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.23.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -30931,7 +30724,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.20.0(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@walletconnect/utils@2.20.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -30949,7 +30742,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -31065,10 +30858,15 @@ snapshots: abbrev@2.0.0: {} - abitype@1.0.8(typescript@5.8.3)(zod@3.23.8): + abitype@1.0.8(typescript@5.8.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.8.3 + zod: 3.22.4 + + abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): optionalDependencies: typescript: 5.8.3 - zod: 3.23.8 + zod: 3.25.76 abortable-iterator@5.0.1: dependencies: @@ -31182,6 +30980,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + apg-js@4.4.0: {} + arch@2.2.0: {} arctic@1.2.0(patch_hash=np2mbzzdnalh3n27syyoxx3zu4): @@ -31472,6 +31272,18 @@ snapshots: - '@babel/core' - supports-color + babel-plugin-styled-components@2.1.4(@babel/core@7.27.1)(styled-components@5.3.11(@babel/core@7.27.1)(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.27.1)(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} babel-preset-fbjs@3.4.0(@babel/core@7.27.1): @@ -32085,10 +31897,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.1: - dependencies: - readdirp: 4.0.2 - chokidar@4.0.3: dependencies: readdirp: 4.0.2 @@ -32335,12 +32143,24 @@ snapshots: graceful-fs: 4.2.11 xdg-basedir: 5.1.0 - connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.29.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)): + connectkit-next-siwe@0.3.0(connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.66.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)))(express@4.20.0)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)): + dependencies: + connectkit: 1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.66.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + iron-session: 6.3.1(express@4.20.0)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)) + next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - express + - koa + + connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.29.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76)): dependencies: '@tanstack/react-query': 5.29.0(react@19.1.0) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)) + family: 0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76)) framer-motion: 6.5.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) qrcode: 1.5.4 react: 19.1.0 @@ -32349,8 +32169,48 @@ snapshots: react-use-measure: 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.27.1)(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - wagmi: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@babel/core' + - react-is + + connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.66.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@tanstack/react-query': 5.66.0(react@19.1.0) + buffer: 6.0.3 + detect-browser: 5.3.0 + family: 0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + framer-motion: 6.5.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + qrcode: 1.5.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-transition-state: 1.1.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-use-measure: 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.27.1)(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@babel/core' + - react-is + + connectkit@1.9.0(@babel/core@7.27.1)(@tanstack/react-query@5.90.2(react@19.1.0))(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@tanstack/react-query': 5.90.2(react@19.1.0) + buffer: 6.0.3 + detect-browser: 5.3.0 + family: 0.1.1(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + framer-motion: 6.5.1(react-dom@19.1.1(react@19.1.0))(react@19.1.0) + qrcode: 1.5.4 + react: 19.1.0 + react-dom: 19.1.1(react@19.1.0) + react-transition-state: 1.1.5(react-dom@19.1.1(react@19.1.0))(react@19.1.0) + react-use-measure: 2.1.7(react-dom@19.1.1(react@19.1.0))(react@19.1.0) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.27.1)(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@babel/core' - react-is @@ -32389,20 +32249,6 @@ snapshots: - markdown-wasm - supports-color - contentlayer@0.3.4(esbuild@0.25.4): - dependencies: - '@contentlayer/cli': 0.3.4(esbuild@0.25.4) - '@contentlayer/client': 0.3.4(esbuild@0.25.4) - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - '@contentlayer/source-files': 0.3.4(esbuild@0.25.4) - '@contentlayer/source-remote-files': 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': 0.3.4 - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -32413,8 +32259,14 @@ snapshots: cookie@0.4.0: {} + cookie@0.5.0: {} + cookie@0.6.0: {} + cookie@0.7.2: {} + + cookie@1.0.2: {} + copy-anything@2.0.6: dependencies: is-what: 3.14.1 @@ -32739,6 +32591,8 @@ snapshots: date-fns@3.6.0: {} + dateformat@4.6.3: {} + dayjs@1.11.13: {} debounce@1.2.1: {} @@ -33050,10 +32904,10 @@ snapshots: '@vercel/postgres': 0.8.0 react: 19.1.0 - drizzle-zod@0.5.1(drizzle-orm@0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0))(zod@3.23.8): + drizzle-zod@0.5.1(drizzle-orm@0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0))(zod@3.25.76): dependencies: drizzle-orm: 0.31.4(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.9.0)(@types/pg@8.6.6)(@types/react@19.1.0)(@vercel/postgres@0.8.0)(react@19.1.0) - zod: 3.23.8 + zod: 3.25.76 dset@3.1.4: {} @@ -33139,6 +32993,18 @@ snapshots: - supports-color - utf-8-validate + 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.17.1: @@ -33513,26 +33379,6 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.1.6(eslint@8.57.1)(typescript@5.8.3): - dependencies: - '@next/eslint-plugin-next': 15.1.6 - '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - eslint-config-next@15.1.6(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.1.6 @@ -33553,26 +33399,6 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@15.2.4(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3): - dependencies: - '@next/eslint-plugin-next': 15.2.4 - '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.14.0(jiti@2.4.2) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.2(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0(jiti@2.4.2)) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - eslint-config-next@15.3.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.3.0 @@ -33611,7 +33437,7 @@ snapshots: debug: 4.3.7(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 9.14.0(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -33624,32 +33450,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@5.5.0) - enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 - optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 9.14.0(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -33682,7 +33489,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: @@ -33693,18 +33500,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: @@ -33732,7 +33528,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.14.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -33750,35 +33546,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - string.prototype.trimend: 1.0.8 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 @@ -33790,7 +33557,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.14.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.14.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -33808,25 +33575,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.2 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 @@ -33867,14 +33615,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2))(prettier@3.3.3): - dependencies: - eslint: 9.14.0(jiti@2.4.2) - prettier: 3.3.3 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.4.2)))(eslint@9.14.0(jiti@2.4.2))(prettier@3.5.3): dependencies: eslint: 9.14.0(jiti@2.4.2) @@ -33892,36 +33632,10 @@ snapshots: optionalDependencies: eslint-config-prettier: 9.1.0(eslint@9.14.0(jiti@2.4.2)) - eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react-hooks@5.0.0(eslint@9.14.0(jiti@2.4.2)): dependencies: eslint: 9.14.0(jiti@2.4.2) - eslint-plugin-react@7.37.2(eslint@8.57.1): - dependencies: - 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.1.0 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.3 - 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.14.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 @@ -33960,70 +33674,18 @@ snapshots: postcss: 8.5.3 tailwindcss: 3.4.11 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@3.4.1: {} - eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} - eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.4.0 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - eslint@9.14.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.2.0(eslint@9.14.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.14.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.7.0 @@ -34033,15 +33695,15 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.0 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 + eslint-visitor-keys: 4.2.1 espree: 10.3.0 esquery: 1.5.0 esutils: 2.0.3 @@ -34049,7 +33711,7 @@ snapshots: file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.2.4 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 @@ -34065,9 +33727,9 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: @@ -34379,7 +34041,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 - webextension-polyfill: 0.10.0 + webextension-polyfill: 0.12.0 external-editor@3.1.0: dependencies: @@ -34397,17 +34059,33 @@ snapshots: transitivePeerDependencies: - supports-color - family@0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)): + family@0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76)): optionalDependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) - wagmi: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76) + + family@0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + + family@0.1.1(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.1(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) fast-check@3.16.0: dependencies: pure-rand: 6.0.4 + fast-copy@3.0.2: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -34458,10 +34136,6 @@ snapshots: dependencies: punycode: 1.4.1 - fast-xml-parser@5.2.5: - dependencies: - strnum: 2.1.1 - fastest-levenshtein@1.0.16: {} fastq@1.17.1: @@ -34527,10 +34201,6 @@ snapshots: escape-string-regexp: 5.0.0 is-unicode-supported: 1.3.0 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -34593,12 +34263,6 @@ snapshots: minimist: 1.2.8 xml2js: 0.6.2 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.1 @@ -34679,6 +34343,19 @@ snapshots: optionalDependencies: '@emotion/is-prop-valid': 0.8.8 + framer-motion@6.5.1(react-dom@19.1.1(react@19.1.0))(react@19.1.0): + dependencies: + '@motionone/dom': 10.12.0 + framesync: 6.0.1 + hey-listen: 1.0.8 + popmotion: 11.0.3 + react: 19.1.0 + react-dom: 19.1.1(react@19.1.0) + style-value-types: 5.0.0 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + framesync@6.0.1: dependencies: tslib: 2.8.1 @@ -35096,27 +34773,6 @@ snapshots: - uWebSockets.js - utf-8-validate - graphql-config@5.1.5(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3): - dependencies: - '@graphql-tools/graphql-file-loader': 8.0.19(graphql@16.11.0) - '@graphql-tools/json-file-loader': 8.0.18(graphql@16.11.0) - '@graphql-tools/load': 8.1.0(graphql@16.11.0) - '@graphql-tools/merge': 9.0.24(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.31(@types/node@22.7.5)(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@6.0.3) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - cosmiconfig: 8.1.3 - graphql: 16.11.0 - jiti: 2.4.2 - minimatch: 9.0.5 - string-env-interpolation: 1.0.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - uWebSockets.js - - utf-8-validate - graphql-import-macro@1.0.0: dependencies: graphql: 15.9.0 @@ -35140,12 +34796,6 @@ snapshots: optionalDependencies: ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) - graphql-ws@6.0.4(graphql@16.11.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)): - dependencies: - graphql: 16.11.0 - optionalDependencies: - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - graphql@15.9.0: {} graphql@16.11.0: {} @@ -35453,6 +35103,8 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 + help-me@5.0.0: {} + hey-listen@1.0.8: {} hi-base32@0.5.1: {} @@ -35570,8 +35222,6 @@ snapshots: human-signals@5.0.0: {} - husky@8.0.3: {} - husky@9.1.7: {} i@0.3.7: {} @@ -35745,6 +35395,29 @@ snapshots: ipaddr.js@2.1.0: {} + iron-session@6.3.1(express@4.20.0)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)): + dependencies: + '@peculiar/webcrypto': 1.5.0 + '@types/cookie': 0.5.4 + '@types/express': 4.17.21 + '@types/koa': 2.15.0 + '@types/node': 17.0.45 + cookie: 0.5.0 + iron-webcrypto: 0.2.8 + optionalDependencies: + express: 4.20.0 + next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) + + iron-session@8.0.4: + dependencies: + cookie: 0.7.2 + iron-webcrypto: 1.2.1 + uncrypto: 0.1.3 + + iron-webcrypto@0.2.8: + dependencies: + buffer: 6.0.3 + iron-webcrypto@1.2.1: {} is-absolute-url@4.0.1: {} @@ -35944,8 +35617,6 @@ snapshots: dependencies: path-is-inside: 1.0.2 - is-path-inside@3.0.3: {} - is-path-inside@4.0.0: {} is-plain-obj@1.1.0: {} @@ -36099,18 +35770,22 @@ snapshots: dependencies: ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) - isomorphic-ws@5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)): - dependencies: - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - isows@1.0.6(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): dependencies: ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + 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.8)(utf-8-validate@6.0.3)): dependencies: ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + 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) + it-all@3.0.4: {} it-batched-bytes@2.0.4: @@ -36385,8 +36060,8 @@ snapshots: smol-toml: 1.3.4 strip-json-comments: 5.0.1 typescript: 5.8.3 - zod: 3.23.8 - zod-validation-error: 3.4.1(zod@3.23.8) + zod: 3.25.76 + zod-validation-error: 3.4.1(zod@3.25.76) ky@1.8.1: {} @@ -37378,21 +37053,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdx-bundler@9.2.1(esbuild@0.25.4): - dependencies: - '@babel/runtime': 7.22.5 - '@esbuild-plugins/node-resolve': 0.1.4(esbuild@0.25.4) - '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@mdx-js/esbuild': 2.3.0(esbuild@0.25.4) - esbuild: 0.25.4 - gray-matter: 4.0.3 - remark-frontmatter: 4.0.1 - remark-mdx-frontmatter: 1.1.1 - uuid: 8.3.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - media-typer@0.3.0: {} memfs-browser@3.5.10302: @@ -38216,20 +37876,6 @@ snapshots: - markdown-wasm - supports-color - next-contentlayer@0.3.4(contentlayer@0.3.4(esbuild@0.25.4))(esbuild@0.25.4)(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@contentlayer/core': 0.3.4(esbuild@0.25.4) - '@contentlayer/utils': 0.3.4 - contentlayer: 0.3.4(esbuild@0.25.4) - next: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - transitivePeerDependencies: - - '@effect-ts/otel-node' - - esbuild - - markdown-wasm - - supports-color - next-mdx-remote@5.0.0(@types/react@19.1.0)(acorn@8.14.0)(react@19.1.0): dependencies: '@babel/code-frame': 7.27.1 @@ -38258,14 +37904,6 @@ snapshots: - acorn - supports-color - next-sitemap@4.2.3(next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)): - dependencies: - '@corex/deepmerge': 4.0.43 - '@next/env': 13.5.11 - fast-glob: 3.3.2 - minimist: 1.2.8 - next: 15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - next-sitemap@4.2.3(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)): dependencies: '@corex/deepmerge': 4.0.43 @@ -38274,34 +37912,7 @@ snapshots: minimist: 1.2.8 next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4) - next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4): - dependencies: - '@next/env': 15.1.6 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001717 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.6(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 15.1.6 - '@next/swc-darwin-x64': 15.1.6 - '@next/swc-linux-arm64-gnu': 15.1.6 - '@next/swc-linux-arm64-musl': 15.1.6 - '@next/swc-linux-x64-gnu': 15.1.6 - '@next/swc-linux-x64-musl': 15.1.6 - '@next/swc-win32-arm64-msvc': 15.1.6 - '@next/swc-win32-x64-msvc': 15.1.6 - '@opentelemetry/api': 1.9.0 - sass: 1.80.4 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4): + next@15.1.6(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4): dependencies: '@next/env': 15.1.6 '@swc/counter': 0.1.3 @@ -38310,7 +37921,7 @@ snapshots: caniuse-lite: 1.0.30001717 postcss: 8.4.31 react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react-dom: 19.1.1(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.27.1)(react@19.1.0) optionalDependencies: '@next/swc-darwin-arm64': 15.1.6 @@ -38328,7 +37939,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(sass@1.80.4): + next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4): dependencies: '@next/env': 15.1.6 '@swc/counter': 0.1.3 @@ -38336,9 +37947,9 @@ snapshots: busboy: 1.6.0 caniuse-lite: 1.0.30001717 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.1(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.27.1)(react@19.1.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 15.1.6 '@next/swc-darwin-x64': 15.1.6 @@ -38355,33 +37966,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.2.4(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4): - dependencies: - '@next/env': 15.2.4 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001717 - postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.27.1)(react@19.1.0) - optionalDependencies: - '@next/swc-darwin-arm64': 15.2.4 - '@next/swc-darwin-x64': 15.2.4 - '@next/swc-linux-arm64-gnu': 15.2.4 - '@next/swc-linux-arm64-musl': 15.2.4 - '@next/swc-linux-x64-gnu': 15.2.4 - '@next/swc-linux-x64-musl': 15.2.4 - '@next/swc-win32-arm64-msvc': 15.2.4 - '@next/swc-win32-x64-msvc': 15.2.4 - '@opentelemetry/api': 1.9.0 - sass: 1.80.4 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4): dependencies: '@next/env': 15.3.0 @@ -38787,28 +38371,42 @@ snapshots: outdent@0.5.0: {} - ox@0.6.7(typescript@5.8.3)(zod@3.23.8): + ox@0.6.7(typescript@5.8.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.9.0 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.23.8) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.6.9(typescript@5.8.3)(zod@3.23.8): + ox@0.6.9(typescript@5.8.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.9.0 '@noble/hashes': 1.8.0 - '@scure/bip32': 1.6.2 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.23.8) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -39122,6 +38720,22 @@ snapshots: dependencies: split2: 4.2.0 + pino-pretty@13.1.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.2 + secure-json-parse: 4.1.0 + sonic-boom: 4.2.0 + strip-json-comments: 5.0.3 + pino-std-serializers@4.0.0: {} pino-std-serializers@7.0.0: {} @@ -39429,12 +39043,6 @@ snapshots: optionalDependencies: '@ianvs/prettier-plugin-sort-imports': 4.1.1(@vue/compiler-sfc@3.3.4)(prettier@3.2.4) - prettier-plugin-tailwindcss@0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.3.3))(prettier@3.3.3): - dependencies: - prettier: 3.3.3 - optionalDependencies: - '@ianvs/prettier-plugin-sort-imports': 4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.3.3) - prettier-plugin-tailwindcss@0.6.6(@ianvs/prettier-plugin-sort-imports@4.6.2(@vue/compiler-sfc@3.3.4)(prettier@3.5.3))(prettier@3.5.3): dependencies: prettier: 3.5.3 @@ -39445,8 +39053,6 @@ snapshots: prettier@3.2.4: {} - prettier@3.3.3: {} - prettier@3.5.3: {} pretty-format@27.5.1: @@ -39564,7 +39170,7 @@ snapshots: open: 9.1.0 ora: 6.3.1 prompts: 2.4.2 - zod: 3.23.8 + zod: 3.25.76 transitivePeerDependencies: - supports-color @@ -39863,7 +39469,7 @@ snapshots: dependencies: react: 18.3.1 - react-hook-form@7.58.1(react@19.1.0): + react-hook-form@7.64.0(react@19.1.0): dependencies: react: 19.1.0 @@ -39881,13 +39487,13 @@ snapshots: react-refresh@0.9.0: {} - react-remove-scroll-bar@2.3.6(@types/react@19.1.0)(react@18.2.0): + react-remove-scroll-bar@2.3.6(@types/react@18.2.48)(react@18.2.0): dependencies: react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@19.1.0)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 react-remove-scroll-bar@2.3.6(@types/react@19.1.0)(react@18.3.1): dependencies: @@ -39921,16 +39527,16 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - react-remove-scroll@2.5.7(@types/react@19.1.0)(react@18.2.0): + react-remove-scroll@2.5.7(@types/react@18.2.48)(react@18.2.0): dependencies: react: 18.2.0 - react-remove-scroll-bar: 2.3.6(@types/react@19.1.0)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@19.1.0)(react@18.2.0) + react-remove-scroll-bar: 2.3.6(@types/react@18.2.48)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0) tslib: 2.7.0 - use-callback-ref: 1.3.0(@types/react@19.1.0)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@19.1.0)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.48)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.48)(react@18.2.0) optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 react-remove-scroll@2.5.7(@types/react@19.1.0)(react@18.3.1): dependencies: @@ -40021,14 +39627,14 @@ snapshots: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - react-style-singleton@2.2.1(@types/react@19.1.0)(react@18.2.0): + react-style-singleton@2.2.1(@types/react@18.2.48)(react@18.2.0): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 react-style-singleton@2.2.1(@types/react@19.1.0)(react@18.3.1): dependencies: @@ -40077,6 +39683,11 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + react-transition-state@1.1.5(react-dom@19.1.1(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.1(react@19.1.0) + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -40089,6 +39700,12 @@ snapshots: optionalDependencies: react-dom: 19.1.0(react@19.1.0) + react-use-measure@2.1.7(react-dom@19.1.1(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + optionalDependencies: + react-dom: 19.1.1(react@19.1.0) + react@18.2.0: dependencies: loose-envify: 1.4.0 @@ -41179,10 +40796,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-preset-prettier@2.0.2(prettier@3.3.3): - dependencies: - prettier: 3.3.3 - remark-preset-prettier@2.0.2(prettier@3.5.3): dependencies: prettier: 3.5.3 @@ -41250,15 +40863,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-prettier@2.0.0(prettier@3.3.3): - dependencies: - '@types/mdast': 3.0.15 - '@types/prettier': 2.7.2 - mdast-util-to-markdown: 1.5.0 - prettier: 3.3.3 - prettier-linter-helpers: 1.0.0 - vfile-location: 4.1.0 - remark-prettier@2.0.0(prettier@3.5.3): dependencies: '@types/mdast': 3.0.15 @@ -41502,10 +41106,6 @@ snapshots: rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rimraf@4.4.1: dependencies: glob: 9.2.1 @@ -41619,7 +41219,7 @@ snapshots: sass@1.80.4: dependencies: '@parcel/watcher': 2.4.1 - chokidar: 4.0.1 + chokidar: 4.0.3 immutable: 4.3.7 source-map-js: 1.2.1 @@ -41640,6 +41240,8 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + secure-json-parse@4.1.0: {} + semver-compare@1.0.0: optional: true @@ -41880,6 +41482,14 @@ snapshots: sisteransi@1.0.5: {} + siwe@2.3.2(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + '@spruceid/siwe-parser': 2.1.2 + '@stablelib/random': 1.0.2 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + uri-js: 4.4.1 + valid-url: 1.0.9 + slash@3.0.0: {} slice-ansi@3.0.0: @@ -41931,6 +41541,17 @@ snapshots: - supports-color - utf-8-validate + 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 @@ -42214,6 +41835,8 @@ snapshots: strip-json-comments@5.0.1: {} + strip-json-comments@5.0.3: {} + strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 @@ -42224,8 +41847,6 @@ snapshots: '@types/unist': 2.0.11 unified: 10.1.2 - strnum@2.1.1: {} - stubborn-fs@1.2.5: {} style-to-js@1.1.16: @@ -42247,7 +41868,7 @@ snapshots: styled-components@5.3.11(@babel/core@7.27.1)(react-dom@19.1.0(react@19.1.0))(react-is@18.1.0)(react@19.1.0): dependencies: - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/traverse': 7.27.1(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 @@ -42263,6 +41884,24 @@ snapshots: transitivePeerDependencies: - '@babel/core' + styled-components@5.3.11(@babel/core@7.27.1)(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0): + dependencies: + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/traverse': 7.27.1(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.27.1)(styled-components@5.3.11(@babel/core@7.27.1)(react-dom@19.1.1(react@19.1.0))(react-is@18.1.0)(react@19.1.0))(supports-color@5.5.0) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 19.1.0 + react-dom: 19.1.1(react@19.1.0) + react-is: 18.1.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + styled-jsx@5.1.6(@babel/core@7.27.1)(react@19.1.0): dependencies: client-only: 0.0.1 @@ -42321,7 +41960,7 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 acorn: 8.14.1 - aria-query: 5.3.0 + aria-query: 5.3.2 axobject-query: 3.2.4 code-red: 1.0.4 css-tree: 2.3.1 @@ -42792,17 +42431,6 @@ snapshots: - eslint - supports-color - typescript-eslint@8.40.0(eslint@8.57.1)(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - typescript-eslint@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.14.0(jiti@2.4.2))(typescript@5.8.3) @@ -42876,7 +42504,7 @@ snapshots: dependencies: '@types/text-table': 0.2.5 camelcase: 7.0.1 - chalk: 5.6.0 + chalk: 5.3.0 chokidar: 3.6.0 fault: 2.0.1 json5: 2.2.3 @@ -43243,12 +42871,12 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.0(@types/react@19.1.0)(react@18.2.0): + use-callback-ref@1.3.0(@types/react@18.2.48)(react@18.2.0): dependencies: react: 18.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 use-callback-ref@1.3.0(@types/react@19.1.0)(react@18.3.1): dependencies: @@ -43290,13 +42918,13 @@ snapshots: dequal: 2.0.3 react: 19.1.0 - use-sidecar@1.1.2(@types/react@19.1.0)(react@18.2.0): + use-sidecar@1.1.2(@types/react@18.2.48)(react@18.2.0): dependencies: detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.0 + '@types/react': 18.2.48 use-sidecar@1.1.2(@types/react@19.1.0)(react@18.3.1): dependencies: @@ -43342,6 +42970,10 @@ snapshots: dependencies: react: 19.1.0 + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + use-sync-external-store@1.5.0(react@19.1.0): dependencies: react: 19.1.0 @@ -43389,6 +43021,8 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 + valid-url@1.0.9: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.1.1 @@ -43467,15 +43101,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@2.23.2(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76): 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.8.3)(zod@3.23.8) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - ox: 0.6.7(typescript@5.8.3)(zod@3.23.8) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.76) ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) optionalDependencies: typescript: 5.8.3 @@ -43484,15 +43118,32 @@ snapshots: - utf-8-validate - zod - viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + 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.8.3)(zod@3.25.76) + isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.22.4): 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.23.8) + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) isows: 1.0.6(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - ox: 0.6.9(typescript@5.8.3)(zod@3.23.8) + ox: 0.6.9(typescript@5.8.3)(zod@3.22.4) ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) optionalDependencies: typescript: 5.8.3 @@ -43501,6 +43152,57 @@ snapshots: - utf-8-validate - zod + viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76): + 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.25.76) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): + 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.22.4) + 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.22.4) + 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 + + viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + 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.25.76) + 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.25.76) + 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.4(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -43632,14 +43334,90 @@ snapshots: '@vue/server-renderer': 3.3.4(vue@3.3.4) '@vue/shared': 3.3.4 - wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8): + wagmi@2.15.2(@tanstack/query-core@5.29.0)(@tanstack/react-query@5.29.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.29.0(react@19.1.0) - '@wagmi/connectors': 5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)))(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8)) + '@wagmi/connectors': 5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)))(bufferutil@4.0.8)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@6.0.3)(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.17.1(@tanstack/query-core@5.29.0)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76)) react: 19.1.0 use-sync-external-store: 1.4.0(react@19.1.0) - viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.29.1(bufferutil@4.0.8)(typescript@5.8.3)(utf-8-validate@6.0.3)(zod@3.25.76) + optionalDependencies: + typescript: 5.8.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 + + wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.66.0(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.66.0(react@19.1.0) + '@wagmi/connectors': 5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.1.0 + use-sync-external-store: 1.4.0(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.8.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 + + wagmi@2.15.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.0))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.90.2(react@19.1.0) + '@wagmi/connectors': 5.8.1(@types/react@19.1.0)(@wagmi/core@2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.17.1(@tanstack/query-core@5.90.2)(@types/react@19.1.0)(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.1.0))(viem@2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.1.0 + use-sync-external-store: 1.4.0(react@19.1.0) + viem: 2.29.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -43932,6 +43710,11 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 6.0.3 + 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.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 @@ -44117,11 +43900,13 @@ snapshots: async: 3.2.6 jszip: 3.10.1 - zod-validation-error@3.4.1(zod@3.23.8): + zod-validation-error@3.4.1(zod@3.25.76): dependencies: - zod: 3.23.8 + zod: 3.25.76 + + zod@3.22.4: {} - zod@3.23.8: {} + zod@3.25.76: {} zustand@4.3.7(react@18.3.1): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e149d3937..79f791a9d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,8 +7,8 @@ packages: - 'packages/status-network' - 'packages/wallet' - 'apps/hub' - - 'apps/status.app' - - 'apps/status.network' + # - 'apps/status.app' + # - 'apps/status.network' - 'apps/connector' - 'apps/portfolio' - 'apps/wallet' diff --git a/tsconfig.base.json b/tsconfig.base.json index 4d579f690..8ec95bc19 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -45,7 +45,9 @@ "@status-im/wallet": ["./packages/wallet/src"], "@status-im/wallet/*": ["./packages/wallet/src/*"], "@status-im/status-js": ["./packages/status-js/src"], - "@status-im/status-js/*": ["./packages/status-js/src/*"] + "@status-im/status-js/*": ["./packages/status-js/src/*"], + "@status-im/status-network": ["./packages/status-network/src"], + "@status-im/status-network/*": ["./packages/status-network/src/*"] // "@status-im/eslint-config": ["./packages/eslint-config/src"], // "@status-im/eslint-config/*": ["./packages/eslint-config/src/*"] } diff --git a/turbo.json b/turbo.json index 61193319a..3c417c780 100644 --- a/turbo.json +++ b/turbo.json @@ -1,6 +1,5 @@ { "$schema": "https://turbo.build/schema.v2.json", - "extends": ["//"], "globalPassThroughEnv": ["PORT"], "concurrency": "15", "tasks": {