diff --git a/AGENTS.md b/AGENTS.md index eaed9a1a91..e4dedc126e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -51,6 +51,7 @@ If `npm run test` fails due to low coverage on a modified file, write meaningful - Use TypeScript and React functional components with hooks. - Follow existing code style and naming conventions. +- Adhere to clean code standards as measured by SonarQube. - Place tests in `__tests__` directories or alongside components as `ComponentName.test.tsx`. - Mock external dependencies and APIs in tests. diff --git a/__tests__/components/auth/SeizeConnectContext.test.tsx b/__tests__/components/auth/SeizeConnectContext.test.tsx index ed7703c80a..918be2d0a6 100644 --- a/__tests__/components/auth/SeizeConnectContext.test.tsx +++ b/__tests__/components/auth/SeizeConnectContext.test.tsx @@ -1,4 +1,13 @@ +import { + AuthenticationError, + SeizeConnectProvider, + useSeizeConnectContext, + WalletConnectionError, + WalletDisconnectionError, +} from "@/components/auth/SeizeConnectContext"; import { publicEnv } from "@/config/env"; +import * as authUtils from "@/services/auth/auth.utils"; +import { WalletInitializationError } from "@/src/errors/wallet"; import { fireEvent, render, @@ -9,15 +18,6 @@ import { import userEvent from "@testing-library/user-event"; import React from "react"; import { act } from "react-dom/test-utils"; -import { - AuthenticationError, - SeizeConnectProvider, - useSeizeConnectContext, - WalletConnectionError, - WalletDisconnectionError, -} from "@/components/auth/SeizeConnectContext"; -import * as authUtils from "@/services/auth/auth.utils"; -import { WalletInitializationError } from "@/src/errors/wallet"; // Mock the Reown AppKit hooks jest.mock("@reown/appkit/react", () => ({ @@ -48,7 +48,6 @@ jest.mock("viem", () => ({ // Mock auth utils jest.mock("@/services/auth/auth.utils", () => ({ - migrateCookiesToLocalStorage: jest.fn(), getWalletAddress: jest.fn(() => null), removeAuthJwt: jest.fn(), })); diff --git a/__tests__/components/common/DateAccordion.test.tsx b/__tests__/components/common/DateAccordion.test.tsx index 510a4a6641..d6828f171e 100644 --- a/__tests__/components/common/DateAccordion.test.tsx +++ b/__tests__/components/common/DateAccordion.test.tsx @@ -1,40 +1,57 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; +import { fireEvent, render, screen } from "@testing-library/react"; -jest.mock('framer-motion', () => ({ +jest.mock("framer-motion", () => ({ motion: { div: ({ children, ...props }: any) =>
{children}
, }, AnimatePresence: ({ children }: any) =>
{children}
, })); -jest.mock('@fortawesome/react-fontawesome', () => ({ +jest.mock("@fortawesome/react-fontawesome", () => ({ FontAwesomeIcon: () => , })); -import DateAccordion from '@/components/common/DateAccordion'; +import DateAccordion from "@/components/common/DateAccordion"; -describe('DateAccordion', () => { - it('shows collapsed content when not expanded and triggers toggle', () => { +describe("DateAccordion", () => { + it("shows collapsed content when not expanded, exposes aria attributes, and triggers toggle", () => { const toggle = jest.fn(); render( - info}> + info}>
); - expect(screen.getByText('info')).toBeInTheDocument(); - expect(screen.queryByTestId('child')).not.toBeInTheDocument(); - fireEvent.click(screen.getByText('Title')); + expect(screen.getByText("info")).toBeInTheDocument(); + expect(screen.queryByTestId("child")).not.toBeInTheDocument(); + const button = screen.getByRole("button", { name: /Title/ }); + expect(button).toHaveAttribute("aria-expanded", "false"); + expect(button).toHaveAttribute("aria-controls"); + fireEvent.click(button); expect(toggle).toHaveBeenCalled(); }); - it('renders children when expanded', () => { + it("renders children when expanded and links aria-controls to the content region", () => { render( - {}} collapsedContent={info}> + {}} + collapsedContent={info}>
); - expect(screen.getByTestId('child')).toBeInTheDocument(); - expect(screen.queryByText('info')).not.toBeInTheDocument(); + const button = screen.getByRole("button", { name: /Title/ }); + expect(button).toHaveAttribute("aria-expanded", "true"); + const controls = button.getAttribute("aria-controls"); + expect(controls).toBeTruthy(); + expect(screen.getByTestId("child")).toBeInTheDocument(); + expect(screen.queryByText("info")).not.toBeInTheDocument(); + const region = controls ? document.getElementById(controls) : null; + expect(region).toBeInTheDocument(); + expect(region).toContainElement(screen.getByTestId("child")); }); }); diff --git a/__tests__/components/common/FallbackImage.test.tsx b/__tests__/components/common/FallbackImage.test.tsx new file mode 100644 index 0000000000..6f2ba31b45 --- /dev/null +++ b/__tests__/components/common/FallbackImage.test.tsx @@ -0,0 +1,62 @@ +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; + +import { FallbackImage } from "../../../components/common/FallbackImage"; + +describe("FallbackImage", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + it("falls back without logging to the console", async () => { + const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); + const onPrimaryError = jest.fn(); + + render( + + ); + + const image = screen.getByRole("img", { name: "fallback example" }); + expect(image).toHaveAttribute("src", "primary.gif"); + + fireEvent.error(image); + + await waitFor(() => { + expect(image).toHaveAttribute("src", "fallback.gif"); + }); + + expect(onPrimaryError).toHaveBeenCalledTimes(1); + expect(errorSpy).not.toHaveBeenCalled(); + }); + + it("calls onError when both primary and fallback fail", async () => { + const onPrimaryError = jest.fn(); + const onError = jest.fn(); + + render( + + ); + + const image = screen.getByRole("img", { name: "fallback example" }); + + fireEvent.error(image); + await waitFor(() => { + expect(image).toHaveAttribute("src", "fallback.gif"); + }); + + fireEvent.error(image); + + expect(onPrimaryError).toHaveBeenCalledTimes(1); + expect(onError).toHaveBeenCalledTimes(1); + }); +}); diff --git a/__tests__/components/header/HeaderSearchModal.test.tsx b/__tests__/components/header/HeaderSearchModal.test.tsx index c8db091a9f..07b37d4c36 100644 --- a/__tests__/components/header/HeaderSearchModal.test.tsx +++ b/__tests__/components/header/HeaderSearchModal.test.tsx @@ -49,10 +49,13 @@ jest.mock( (...args: any[]) => useLocalPreference(...args) ); -jest.mock( - "@/components/header/header-search/HeaderSearchModalItem", - () => (props: any) =>
{JSON.stringify(props)}
-); +jest.mock("@/components/header/header-search/HeaderSearchModalItem", () => { + const MockHeaderSearchModalItem = (props: any) => ( +
{JSON.stringify(props)}
+ ); + MockHeaderSearchModalItem.displayName = "MockHeaderSearchModalItem"; + return MockHeaderSearchModalItem; +}); const profile = { handle: "alice", wallet: "0x1", display: "Alice", level: 1 }; @@ -137,6 +140,15 @@ describe("HeaderSearchModal", () => { jest.clearAllMocks(); }); + it("associates the search input with an accessible label", () => { + setup(); + expect( + screen.getByRole("textbox", { + name: "Search", + }) + ).toBeInTheDocument(); + }); + it("calls onClose when escape is pressed", () => { const { onClose } = setup(); escapeCb(); @@ -145,7 +157,7 @@ describe("HeaderSearchModal", () => { it("renders search results when query returns items", () => { setup(); - const input = screen.getByRole("textbox"); + const input = screen.getByRole("textbox", { name: "Search" }); fireEvent.change(input, { target: { value: "abc" } }); expect(screen.getByTestId("item")).toBeInTheDocument(); }); @@ -158,7 +170,7 @@ describe("HeaderSearchModal", () => { it("navigates on enter key", () => { const { push } = setup(); - const input = screen.getByRole("textbox"); + const input = screen.getByRole("textbox", { name: "Search" }); fireEvent.change(input, { target: { value: "alice" } }); enterCb(); expect(push).toHaveBeenCalled(); @@ -188,7 +200,7 @@ describe("HeaderSearchModal", () => { }, }); - const input = screen.getByRole("textbox"); + const input = screen.getByRole("textbox", { name: "Search" }); fireEvent.change(input, { target: { value: "alice" } }); expect( @@ -197,7 +209,9 @@ describe("HeaderSearchModal", () => { ) ).toBeInTheDocument(); - const retryButton = await screen.findByRole("button", { name: /try again/i }); + const retryButton = await screen.findByRole("button", { + name: /try again/i, + }); fireEvent.click(retryButton); expect(profilesRefetch).toHaveBeenCalled(); diff --git a/__tests__/components/header/share/HeaderShare.test.tsx b/__tests__/components/header/share/HeaderShare.test.tsx index 0d939b8c55..6bae986b57 100644 --- a/__tests__/components/header/share/HeaderShare.test.tsx +++ b/__tests__/components/header/share/HeaderShare.test.tsx @@ -105,7 +105,6 @@ const mockAuthUtils = { getRefreshToken: jest.fn(() => null), getWalletAddress: jest.fn(() => null), getWalletRole: jest.fn(() => null), - migrateCookiesToLocalStorage: jest.fn(), removeAuthJwt: jest.fn(), }; @@ -115,8 +114,6 @@ require("@/services/auth/auth.utils").getWalletAddress = mockAuthUtils.getWalletAddress; require("@/services/auth/auth.utils").getWalletRole = mockAuthUtils.getWalletRole; -require("@/services/auth/auth.utils").migrateCookiesToLocalStorage = - mockAuthUtils.migrateCookiesToLocalStorage; require("@/services/auth/auth.utils").removeAuthJwt = mockAuthUtils.removeAuthJwt; diff --git a/__tests__/services/auth.utils.test.ts b/__tests__/services/auth.utils.test.ts index 0e90abac1f..b5d3bfa64d 100644 --- a/__tests__/services/auth.utils.test.ts +++ b/__tests__/services/auth.utils.test.ts @@ -1,15 +1,14 @@ -import Cookies from "js-cookie"; -import { jwtDecode } from "jwt-decode"; import { safeLocalStorage } from "@/helpers/safeLocalStorage"; import { getAuthJwt, getStagingAuth, getWalletAddress, - migrateCookiesToLocalStorage, removeAuthJwt, setAuthJwt, syncWalletRoleWithServer, } from "@/services/auth/auth.utils"; +import Cookies from "js-cookie"; +import { jwtDecode } from "jwt-decode"; jest.mock("js-cookie", () => ({ get: jest.fn(), @@ -64,9 +63,7 @@ describe("auth.utils", () => { expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( "6529-wallet-role" ); - expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( - "auth-role-addr" - ); + expect(safeLocalStorage.removeItem).toHaveBeenCalledWith("auth-role-addr"); }); it("syncWalletRoleWithServer stores server role", () => { @@ -86,9 +83,7 @@ describe("auth.utils", () => { expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( "6529-wallet-role" ); - expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( - "auth-role-0xabc" - ); + expect(safeLocalStorage.removeItem).toHaveBeenCalledWith("auth-role-0xabc"); }); it("getAuthJwt prefers dev mode", () => { @@ -110,29 +105,6 @@ describe("auth.utils", () => { expect(getStagingAuth()).toBe("e"); }); - it("migrateCookiesToLocalStorage moves and removes cookies", () => { - (Cookies.get as jest.Mock) - .mockReturnValueOnce("addr") - .mockReturnValueOnce("refresh") - .mockReturnValueOnce("role"); - migrateCookiesToLocalStorage(); - expect(safeLocalStorage.setItem).toHaveBeenCalledWith( - "6529-wallet-address", - "addr" - ); - expect(Cookies.remove).toHaveBeenCalledWith("wallet-address"); - expect(safeLocalStorage.setItem).toHaveBeenCalledWith( - "6529-wallet-refresh-token", - "refresh" - ); - expect(Cookies.remove).toHaveBeenCalledWith("wallet-refresh-token"); - expect(safeLocalStorage.setItem).toHaveBeenCalledWith( - "6529-wallet-role", - "role" - ); - expect(Cookies.remove).toHaveBeenCalledWith("wallet-role"); - }); - it("getWalletAddress respects dev mode and storage", () => { const { publicEnv } = require("@/config/env"); publicEnv.USE_DEV_AUTH = "true"; @@ -159,8 +131,6 @@ describe("auth.utils", () => { expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( "6529-wallet-role" ); - expect(safeLocalStorage.removeItem).toHaveBeenCalledWith( - "auth-role-addr" - ); + expect(safeLocalStorage.removeItem).toHaveBeenCalledWith("auth-role-addr"); }); }); diff --git a/components/auth/SeizeConnectContext.tsx b/components/auth/SeizeConnectContext.tsx index aba209625c..70783bacc0 100644 --- a/components/auth/SeizeConnectContext.tsx +++ b/components/auth/SeizeConnectContext.tsx @@ -6,25 +6,26 @@ import React, { useContext, useEffect, useMemo, - useState, useRef, + useState, } from "react"; -import { - migrateCookiesToLocalStorage, - getWalletAddress, - removeAuthJwt, -} from "@/services/auth/auth.utils"; +import { getWalletAddress, removeAuthJwt } from "@/services/auth/auth.utils"; import { WalletInitializationError } from "@/src/errors/wallet"; -import { useAppKit, useAppKitAccount, useAppKitState, useDisconnect } from "@reown/appkit/react"; -import { isAddress, getAddress } from "viem"; import { SecurityEventType } from "@/src/types/security"; import { - logSecurityEvent, - logError, createConnectionEventContext, - createValidationEventContext + createValidationEventContext, + logError, + logSecurityEvent, } from "@/src/utils/security-logger"; +import { + useAppKit, + useAppKitAccount, + useAppKitState, + useDisconnect, +} from "@reown/appkit/react"; +import { getAddress, isAddress } from "viem"; import { WalletErrorBoundary } from "./error-boundary"; // Custom error types for better error handling @@ -35,7 +36,7 @@ export class WalletConnectionError extends Error { public readonly code?: string ) { super(message); - this.name = 'WalletConnectionError'; + this.name = "WalletConnectionError"; } } @@ -46,17 +47,14 @@ export class WalletDisconnectionError extends Error { public readonly code?: string ) { super(message); - this.name = 'WalletDisconnectionError'; + this.name = "WalletDisconnectionError"; } } export class AuthenticationError extends Error { - constructor( - message: string, - public readonly cause?: unknown - ) { + constructor(message: string, public readonly cause?: unknown) { super(message); - this.name = 'AuthenticationError'; + this.name = "AuthenticationError"; } } @@ -76,13 +74,13 @@ interface SeizeConnectContextType { /** Opens the wallet connection modal */ seizeConnect: () => void; - /** + /** * Disconnects the current wallet connection * @throws {WalletDisconnectionError} When disconnection fails */ seizeDisconnect: () => Promise; - /** + /** * Disconnects wallet and clears authentication state * @param reconnect - Whether to automatically reopen connection modal after logout * @throws {WalletDisconnectionError} When disconnection fails @@ -90,7 +88,7 @@ interface SeizeConnectContextType { */ seizeDisconnectAndLogout: (reconnect?: boolean) => Promise; - /** + /** * Manually set the connected address (for internal use) * @param address - The wallet address to set as connected */ @@ -106,7 +104,12 @@ interface SeizeConnectContextType { isAuthenticated: boolean; /** Current connection state for better timing control */ - connectionState: 'initializing' | 'disconnected' | 'connecting' | 'connected' | 'error'; + connectionState: + | "initializing" + | "disconnected" + | "connecting" + | "connected" + | "error"; /** Unified wallet state machine for advanced consumers */ walletState: WalletState; @@ -128,9 +131,10 @@ const createWalletError = ( operation: string, originalError: unknown ): WalletConnectionError | WalletDisconnectionError => { - const message = originalError instanceof Error - ? originalError.message - : `Unknown error during ${operation}`; + const message = + originalError instanceof Error + ? originalError.message + : `Unknown error during ${operation}`; return new ErrorClass( `Failed to ${operation}: ${message}`, @@ -145,22 +149,24 @@ interface AddressValidationResult { normalizedAddress?: string; errorContext?: { length: number; - format: 'hex_prefixed' | 'other'; + format: "hex_prefixed" | "other"; debugAddress: string; }; } const isCapacitorPlatform = (): boolean => { - return typeof window !== 'undefined' && Boolean(window.Capacitor?.isNativePlatform?.()); + return !!globalThis.window?.Capacitor?.isNativePlatform?.(); }; -const validateStoredAddress = (storedAddress: string): AddressValidationResult => { +const validateStoredAddress = ( + storedAddress: string +): AddressValidationResult => { // Capacitor-specific validation (more lenient) if (isCapacitorPlatform()) { - if (storedAddress.startsWith('0x') && storedAddress.length === 42) { + if (storedAddress.startsWith("0x") && storedAddress.length === 42) { return { isValid: true, - normalizedAddress: storedAddress.toLowerCase() + normalizedAddress: storedAddress.toLowerCase(), }; } } @@ -169,47 +175,49 @@ const validateStoredAddress = (storedAddress: string): AddressValidationResult = if (isAddress(storedAddress)) { return { isValid: true, - normalizedAddress: getAddress(storedAddress) // checksummed format + normalizedAddress: getAddress(storedAddress), // checksummed format }; } // Invalid address - prepare error context const addressLength = storedAddress.length; - const addressFormat = storedAddress.startsWith('0x') ? 'hex_prefixed' : 'other'; - const debugAddress = storedAddress.length >= 10 - ? storedAddress.slice(0, 10) + '...' - : storedAddress; + const addressFormat = storedAddress.startsWith("0x") + ? "hex_prefixed" + : "other"; + const debugAddress = + storedAddress.length >= 10 + ? storedAddress.slice(0, 10) + "..." + : storedAddress; return { isValid: false, errorContext: { length: addressLength, format: addressFormat, - debugAddress - } + debugAddress, + }, }; }; // Unified Wallet State Machine - eliminates multiple state variables and inconsistencies type WalletState = - | { status: 'initializing' } - | { status: 'error'; error: Error } - | { status: 'disconnected' } - | { status: 'connecting' } - | { status: 'connected'; address: string }; - + | { status: "initializing" } + | { status: "error"; error: Error } + | { status: "disconnected" } + | { status: "connecting" } + | { status: "connected"; address: string }; // Initialization error handling utility const handleInitializationError = ( error: unknown, - errorContext?: AddressValidationResult['errorContext'] + errorContext?: AddressValidationResult["errorContext"] ): WalletInitializationError => { if (errorContext) { // Invalid address error logSecurityEvent( SecurityEventType.INVALID_ADDRESS_DETECTED, createValidationEventContext( - 'wallet_initialization', + "wallet_initialization", false, errorContext.length, errorContext.format @@ -220,30 +228,35 @@ const handleInitializationError = ( try { removeAuthJwt(); } catch (cleanupError) { - logError('auth_cleanup_during_init', new Error(`Failed to clear invalid auth state: ${cleanupError}`)); + logError( + "auth_cleanup_during_init", + new Error(`Failed to clear invalid auth state: ${cleanupError}`) + ); } const initError = new WalletInitializationError( - 'Invalid wallet address found in storage during initialization. This indicates potential data corruption or security breach.', + "Invalid wallet address found in storage during initialization. This indicates potential data corruption or security breach.", undefined, errorContext.debugAddress ); - logError('wallet_initialization', initError); + logError("wallet_initialization", initError); return initError; } // Unexpected error const initError = new WalletInitializationError( - 'Unexpected error during wallet initialization', + "Unexpected error during wallet initialization", error ); - logError('wallet_initialization', initError); + logError("wallet_initialization", initError); return initError; }; // Consolidated wallet state management hook with unified state machine const useConsolidatedWalletState = () => { - const [walletState, setWalletState] = useState({ status: 'initializing' }); + const [walletState, setWalletState] = useState({ + status: "initializing", + }); useEffect(() => { const initializeWallet = async () => { @@ -253,7 +266,7 @@ const useConsolidatedWalletState = () => { // Step 2: Handle no stored address (legitimate case) if (!storedAddress) { - setWalletState({ status: 'disconnected' }); + setWalletState({ status: "disconnected" }); return; } @@ -263,19 +276,21 @@ const useConsolidatedWalletState = () => { if (validationResult.isValid && validationResult.normalizedAddress) { // Step 4: Success - set connected state with valid address setWalletState({ - status: 'connected', - address: validationResult.normalizedAddress + status: "connected", + address: validationResult.normalizedAddress, }); } else { // Step 4: Error - handle invalid address - const error = handleInitializationError(undefined, validationResult.errorContext); - setWalletState({ status: 'error', error }); + const error = handleInitializationError( + undefined, + validationResult.errorContext + ); + setWalletState({ status: "error", error }); } - } catch (error) { // Step 4: Error - handle unexpected errors const initError = handleInitializationError(error); - setWalletState({ status: 'error', error: initError }); + setWalletState({ status: "error", error: initError }); } }; @@ -284,26 +299,28 @@ const useConsolidatedWalletState = () => { // State transition methods const setConnecting = useCallback(() => { - setWalletState({ status: 'connecting' }); + setWalletState({ status: "connecting" }); }, []); const setConnected = useCallback((address: string) => { - setWalletState({ status: 'connected', address }); + setWalletState({ status: "connected", address }); }, []); const setDisconnected = useCallback(() => { - setWalletState({ status: 'disconnected' }); + setWalletState({ status: "disconnected" }); }, []); const setError = useCallback((error: Error) => { - setWalletState({ status: 'error', error }); + setWalletState({ status: "error", error }); }, []); // Computed properties for backward compatibility - const connectedAddress = walletState.status === 'connected' ? walletState.address : undefined; - const hasInitializationError = walletState.status === 'error'; - const initializationError = walletState.status === 'error' ? walletState.error : undefined; - const isInitialized = walletState.status !== 'initializing'; + const connectedAddress = + walletState.status === "connected" ? walletState.address : undefined; + const hasInitializationError = walletState.status === "error"; + const initializationError = + walletState.status === "error" ? walletState.error : undefined; + const isInitialized = walletState.status !== "initializing"; return { walletState, @@ -315,11 +332,10 @@ const useConsolidatedWalletState = () => { // Backward compatibility properties hasInitializationError, initializationError, - isInitialized + isInitialized, }; }; - export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ children, }) => { @@ -328,7 +344,6 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ const { open } = useAppKit(); const state = useAppKitState(); - // Use consolidated wallet state management const { walletState, @@ -338,14 +353,10 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ setDisconnected, hasInitializationError, initializationError, - isInitialized + isInitialized, } = useConsolidatedWalletState(); const debounceTimeoutRef = useRef(null); - useEffect(() => { - migrateCookiesToLocalStorage(); - }, []); - useEffect(() => { // Wait for initialization to complete before processing account changes if (!isInitialized) { @@ -365,7 +376,9 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ const checksummedAddress = getAddress(account.address); // Only update if not already connected with same address - const isAlreadyConnected = walletState.status === 'connected' && walletState.address === checksummedAddress; + const isAlreadyConnected = + walletState.status === "connected" && + walletState.address === checksummedAddress; if (!isAlreadyConnected) { setConnected(checksummedAddress); } @@ -375,10 +388,10 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ logSecurityEvent( SecurityEventType.INVALID_ADDRESS_DETECTED, createValidationEventContext( - 'wallet_provider', + "wallet_provider", false, addressStr?.length || 0, - addressStr?.startsWith('0x') ? 'hex_prefixed' : 'other' + addressStr?.startsWith("0x") ? "hex_prefixed" : "other" ) ); @@ -388,18 +401,20 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ const storedAddress = getWalletAddress(); if (storedAddress && isAddress(storedAddress)) { const checksummedAddress = getAddress(storedAddress); - const isAlreadyConnected = walletState.status === 'connected' && walletState.address === checksummedAddress; + const isAlreadyConnected = + walletState.status === "connected" && + walletState.address === checksummedAddress; if (!isAlreadyConnected) { setConnected(checksummedAddress); } - } else if (walletState.status !== 'disconnected') { + } else if (walletState.status !== "disconnected") { setDisconnected(); } - } else if (account.status === 'connecting') { - if (walletState.status !== 'connecting') { + } else if (account.status === "connecting") { + if (walletState.status !== "connecting") { setConnecting(); } - } else if (walletState.status !== 'disconnected') { + } else if (walletState.status !== "disconnected") { setDisconnected(); } }, 50); // Small delay to debounce rapid changes @@ -410,14 +425,23 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ clearTimeout(debounceTimeoutRef.current); } }; - }, [account.address, account.isConnected, account.status, isInitialized, walletState, setConnected, setDisconnected, setConnecting]); + }, [ + account.address, + account.isConnected, + account.status, + isInitialized, + walletState, + setConnected, + setDisconnected, + setConnecting, + ]); const seizeConnect = useCallback((): void => { try { // Log connection attempt for security monitoring logSecurityEvent( SecurityEventType.WALLET_CONNECTION_ATTEMPT, - createConnectionEventContext('seizeConnect') + createConnectionEventContext("seizeConnect") ); open({ view: "Connect" }); @@ -425,14 +449,14 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ // Log successful modal opening logSecurityEvent( SecurityEventType.WALLET_MODAL_OPENED, - createConnectionEventContext('seizeConnect') + createConnectionEventContext("seizeConnect") ); } catch (error) { const connectionError = new WalletConnectionError( - 'Failed to open wallet connection modal', + "Failed to open wallet connection modal", error ); - logError('seizeConnect', connectionError); + logError("seizeConnect", connectionError); throw connectionError; } }, [open]); @@ -443,10 +467,10 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ } catch (error: unknown) { const walletError = createWalletError( WalletDisconnectionError, - 'disconnect wallet', + "disconnect wallet", error ); - logError('seizeDisconnect', walletError); + logError("seizeDisconnect", walletError); throw walletError; } }, [disconnect]); @@ -459,14 +483,14 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ } catch (error: unknown) { const walletError = createWalletError( WalletDisconnectionError, - 'disconnect wallet during logout', + "disconnect wallet during logout", error ); - logError('seizeDisconnectAndLogout', walletError); + logError("seizeDisconnectAndLogout", walletError); // SECURITY: Throw AuthenticationError to prevent auth bypass throw new AuthenticationError( - 'Cannot complete logout: wallet disconnection failed. User may still have active wallet connection.', + "Cannot complete logout: wallet disconnection failed. User may still have active wallet connection.", walletError ); } @@ -483,94 +507,104 @@ export const SeizeConnectProvider: React.FC<{ children: React.ReactNode }> = ({ try { logSecurityEvent( SecurityEventType.WALLET_CONNECTION_ATTEMPT, - createConnectionEventContext('seizeDisconnectAndLogout_reconnect') + createConnectionEventContext( + "seizeDisconnectAndLogout_reconnect" + ) ); open({ view: "Connect" }); } catch (openError) { - console.error('Failed to reopen wallet connection after logout:', openError); + logError( + "seizeDisconnectAndLogout_reconnect", + openError instanceof Error + ? openError + : new Error( + `Failed to reopen wallet connection: ${openError}` + ) + ); } }, 100); } } catch (error: unknown) { const authError = new AuthenticationError( - 'Failed to clear authentication state after successful wallet disconnect', + "Failed to clear authentication state after successful wallet disconnect", error ); - logError('seizeDisconnectAndLogout', authError); + logError("seizeDisconnectAndLogout", authError); throw authError; } }, [disconnect, open, setDisconnected] // FIXED: Use unified state transition ); - const seizeAcceptConnection = useCallback((address: string): void => { - // Extract diagnostic data before validation check - const addressLength = address.length; - const addressFormat = address.startsWith('0x') ? 'hex_prefixed' : 'other'; + const seizeAcceptConnection = useCallback( + (address: string): void => { + // Extract diagnostic data before validation check + const addressLength = address.length; + const addressFormat = address.startsWith("0x") ? "hex_prefixed" : "other"; + + if (!isAddress(address)) { + // Log security event with NO address data + logSecurityEvent( + SecurityEventType.INVALID_ADDRESS_DETECTED, + createValidationEventContext( + "seizeAcceptConnection", + false, + addressLength, + addressFormat + ) + ); - if (!isAddress(address)) { - // Log security event with NO address data - logSecurityEvent( - SecurityEventType.INVALID_ADDRESS_DETECTED, - createValidationEventContext( - 'seizeAcceptConnection', - false, - addressLength, - addressFormat - ) - ); + const error = new AuthenticationError( + "Invalid Ethereum address format. Address must be a valid EIP-55 checksummed format." + ); + logError("seizeAcceptConnection", error); + throw error; + } - const error = new AuthenticationError( - 'Invalid Ethereum address format. Address must be a valid EIP-55 checksummed format.' + // Log successful address validation with NO address data + logSecurityEvent( + SecurityEventType.ADDRESS_VALIDATION_SUCCESS, + createValidationEventContext("seizeAcceptConnection", true) ); - logError('seizeAcceptConnection', error); - throw error; - } - - // Log successful address validation with NO address data - logSecurityEvent( - SecurityEventType.ADDRESS_VALIDATION_SUCCESS, - createValidationEventContext( - 'seizeAcceptConnection', - true - ) - ); - - // Normalize address to checksummed format for consistency - const checksummedAddress = getAddress(address); - setConnected(checksummedAddress); - }, [setConnected]); - - const contextValue = useMemo((): SeizeConnectContextType => ({ - address: connectedAddress, - walletName: undefined, - walletIcon: undefined, - isSafeWallet: false, - seizeConnect, - seizeDisconnect, - seizeDisconnectAndLogout, - seizeAcceptConnection, - seizeConnectOpen: state.open, - isConnected: account.isConnected, - isAuthenticated: !!connectedAddress, - connectionState: walletState.status, // Unified state machine - walletState, // Expose unified state for advanced consumers - hasInitializationError, - initializationError, - }), [ - connectedAddress, - seizeConnect, - seizeDisconnect, - seizeDisconnectAndLogout, - seizeAcceptConnection, - state.open, - account.isConnected, - walletState, - hasInitializationError, - initializationError, - ]); + // Normalize address to checksummed format for consistency + const checksummedAddress = getAddress(address); + setConnected(checksummedAddress); + }, + [setConnected] + ); + const contextValue = useMemo( + (): SeizeConnectContextType => ({ + address: connectedAddress, + walletName: undefined, + walletIcon: undefined, + isSafeWallet: false, + seizeConnect, + seizeDisconnect, + seizeDisconnectAndLogout, + seizeAcceptConnection, + seizeConnectOpen: state.open, + isConnected: account.isConnected, + isAuthenticated: !!connectedAddress, + connectionState: walletState.status, // Unified state machine + walletState, // Expose unified state for advanced consumers + hasInitializationError, + initializationError, + }), + [ + connectedAddress, + seizeConnect, + seizeDisconnect, + seizeDisconnectAndLogout, + seizeAcceptConnection, + state.open, + account.isConnected, + walletState, + hasInitializationError, + initializationError, + ] + ); return ( @@ -589,4 +623,4 @@ export const useSeizeConnectContext = (): SeizeConnectContextType => { ); } return context; -}; \ No newline at end of file +}; diff --git a/components/common/DateAccordion.tsx b/components/common/DateAccordion.tsx index 3b15d1611b..1ac4fb4a38 100644 --- a/components/common/DateAccordion.tsx +++ b/components/common/DateAccordion.tsx @@ -1,6 +1,7 @@ -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronDown } from "@fortawesome/free-solid-svg-icons"; -import { motion, AnimatePresence } from "framer-motion"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { AnimatePresence, motion } from "framer-motion"; +import { useId } from "react"; interface DateAccordionProps { readonly title: React.ReactNode; @@ -19,27 +20,31 @@ export default function DateAccordion({ children, showChevron = true, }: DateAccordionProps) { + const contentId = useId(); + return ( -
+
+ {isExpanded && ( @@ -61,7 +66,7 @@ export default function DateAccordion({ animate={{ height: "auto", opacity: 1 }} exit={{ height: 0, opacity: 0 }} transition={{ duration: 0.3, ease: [0.04, 0.62, 0.23, 0.98] }} - > + id={contentId}> {children}
)} diff --git a/components/common/FallbackImage.tsx b/components/common/FallbackImage.tsx index 659b625371..f195196011 100644 --- a/components/common/FallbackImage.tsx +++ b/components/common/FallbackImage.tsx @@ -1,14 +1,23 @@ -"use client" +"use client"; import React from "react"; type FallbackImageProps = React.ImgHTMLAttributes & { - primarySrc: string; // try first (your downscaled gif) - fallbackSrc: string; // use if primary fails (your original gif) + readonly primarySrc: string; + readonly fallbackSrc: string; + readonly onPrimaryError?: ( + event: React.SyntheticEvent + ) => void; }; -export const FallbackImage = React.forwardRef( - ({ primarySrc, fallbackSrc, alt = "", onError, ...rest }, ref) => { +export const FallbackImage = React.forwardRef< + HTMLImageElement, + FallbackImageProps +>( + ( + { primarySrc, fallbackSrc, alt = "", onError, onPrimaryError, ...rest }, + ref + ) => { const [src, setSrc] = React.useState(primarySrc); const [usedFallback, setUsedFallback] = React.useState(false); @@ -20,7 +29,7 @@ export const FallbackImage = React.forwardRef) => { if (!usedFallback) { - console.log(`[FallbackImage] Primary failed: ${primarySrc}, falling back to: ${fallbackSrc}`); + onPrimaryError?.(e); setSrc(fallbackSrc); setUsedFallback(true); } else { @@ -42,4 +51,4 @@ export const FallbackImage = React.forwardRef e.stopPropagation()} onTouchEnd={(e) => e.stopPropagation()} - onTouchMove={(e) => e.stopPropagation()} - > + onTouchMove={(e) => e.stopPropagation()}>
setIsZoomed(e.state.scale > 1)} - > + onZoom={(e) => setIsZoomed(e.state.scale > 1)}> {({ resetTransform }) => (
@@ -142,12 +137,10 @@ function DropListItemContentMediaImage({ if (e.key === "Enter" || e.key === " ") { e.stopPropagation(); } - }} - > + }}> + contentClass="tw-w-full tw-h-full tw-flex tw-items-center tw-justify-center"> Full size drop media + aria-label="Reset"> e.stopPropagation()} data-tooltip-id={`open-browser-${src}`} className={modalButtonClasses} - aria-label="Open image in new tab" - > + aria-label="Open image in new tab"> @@ -190,8 +181,7 @@ function DropListItemContentMediaImage({ onClick={handleFullScreen} data-tooltip-id="full-screen" className="tw-flex tw-items-center tw-justify-center tw-border-0 tw-text-iron-50 tw-bg-iron-800 desktop-hover:hover:tw-bg-iron-700 tw-rounded-full tw-size-10 tw-flex-shrink-0 tw-backdrop-blur-sm tw-transition-all tw-duration-300 tw-ease-out" - aria-label="Full screen" - > + aria-label="Full screen"> )} @@ -204,8 +194,7 @@ function DropListItemContentMediaImage({ }} data-tooltip-id="view-drop-details" className="tw-flex tw-items-center tw-justify-center tw-border-0 tw-text-iron-50 tw-bg-iron-800 desktop-hover:hover:tw-bg-iron-700 tw-rounded-full tw-size-10 tw-flex-shrink-0 tw-backdrop-blur-sm tw-transition-all tw-duration-300 tw-ease-out" - aria-label="View drop details" - > + aria-label="View drop details"> )} @@ -214,16 +203,14 @@ function DropListItemContentMediaImage({ onClick={handleCloseModal} data-tooltip-id="close-modal" className={modalButtonClasses} - aria-label="Close modal" - > + aria-label="Close modal">
diff --git a/components/header/header-search/HeaderSearchModal.tsx b/components/header/header-search/HeaderSearchModal.tsx index 9d4f6f2170..019a5bb963 100644 --- a/components/header/header-search/HeaderSearchModal.tsx +++ b/components/header/header-search/HeaderSearchModal.tsx @@ -1,26 +1,26 @@ "use client"; +import { TabToggle } from "@/components/common/TabToggle"; +import { QueryKey } from "@/components/react-query-wrapper/ReactQueryWrapper"; +import { UserPageTabType } from "@/components/user/layout/UserPageTabs"; +import { CommunityMemberMinimal } from "@/entities/IProfile"; +import type { ApiWave } from "@/generated/models/ApiWave"; +import { getRandomObjectId } from "@/helpers/AllowlistToolHelpers"; +import { getProfileTargetRoute } from "@/helpers/Helpers"; +import useLocalPreference from "@/hooks/useLocalPreference"; +import { useWaves } from "@/hooks/useWaves"; +import { commonApiFetch } from "@/services/api/common-api"; +import { ChevronLeftIcon, XMarkIcon } from "@heroicons/react/24/outline"; import { useQuery } from "@tanstack/react-query"; import FocusTrap from "focus-trap-react"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; import { useClickAway, useDebounce, useKeyPressEvent } from "react-use"; -import { CommunityMemberMinimal } from "@/entities/IProfile"; -import { commonApiFetch } from "@/services/api/common-api"; import HeaderSearchModalItem, { - NFTSearchResult, HeaderSearchModalItemType, + NFTSearchResult, } from "./HeaderSearchModalItem"; -import { useRouter, usePathname, useSearchParams } from "next/navigation"; -import { getRandomObjectId } from "@/helpers/AllowlistToolHelpers"; -import { getProfileTargetRoute } from "@/helpers/Helpers"; -import { UserPageTabType } from "@/components/user/layout/UserPageTabs"; -import { createPortal } from "react-dom"; -import { QueryKey } from "@/components/react-query-wrapper/ReactQueryWrapper"; -import type { ApiWave } from "@/generated/models/ApiWave"; -import { useWaves } from "@/hooks/useWaves"; -import useLocalPreference from "@/hooks/useLocalPreference"; -import { TabToggle } from "@/components/common/TabToggle"; -import { ChevronLeftIcon, XMarkIcon } from "@heroicons/react/24/outline"; enum STATE { INITIAL = "INITIAL", @@ -337,7 +337,11 @@ export default function HeaderSearchModal({ clipRule="evenodd" /> + + className="tw-h-72 tw-scroll-py-2 tw-px-4 tw-py-2 tw-overflow-y-auto tw-scrollbar-thin tw-scrollbar-thumb-iron-500 tw-scrollbar-track-iron-800 desktop-hover:hover:tw-scrollbar-thumb-iron-300 tw-text-sm tw-text-iron-200"> {renderItems(getCurrentItems())}
)} @@ -382,8 +385,7 @@ export default function HeaderSearchModal({
+ className="tw-h-72 tw-flex tw-items-center tw-justify-center">

Loading...

@@ -393,21 +395,20 @@ export default function HeaderSearchModal({
-

No results found

+ className="tw-h-72 tw-flex tw-items-center tw-justify-center"> +

+ No results found +

)} {state === STATE.ERROR && (
+ className="tw-h-72 tw-flex tw-flex-col tw-items-center tw-justify-center tw-gap-3 tw-px-4 tw-text-center">

+ aria-live="polite"> Something went wrong while searching. Please try again.

@@ -437,8 +437,7 @@ export default function HeaderSearchModal({
+ className="tw-h-72 tw-flex tw-items-center tw-justify-center">

Search for NFTs (by ID or name), Profiles and Waves

diff --git a/package-lock.json b/package-lock.json index fd53de1b00..aa5563e91a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3240,6 +3240,8 @@ }, "node_modules/@msgpack/msgpack": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz", + "integrity": "sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==", "license": "ISC", "engines": { "node": ">= 18" @@ -3926,53 +3928,53 @@ } }, "node_modules/@reown/appkit": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.8.tgz", - "integrity": "sha512-2p6XhBjHRjePSEoaZ5ndsMkIIhiS8lyriQI+BWSn3Y3ed3Kd1Ykd7AKOQVgZXQKcFDfyA//vohWlI90GDaVk8g==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.9.tgz", + "integrity": "sha512-e3N2DAzf3Xv3jnoD8IsUo0/Yfwuhk7npwJBe1+9rDJIRwgPsyYcCLD4gKPDFC5IUIfOLqK7YtGOh9oPEUnIWpw==", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-pay": "1.8.8", - "@reown/appkit-polyfills": "1.8.8", - "@reown/appkit-scaffold-ui": "1.8.8", - "@reown/appkit-ui": "1.8.8", - "@reown/appkit-utils": "1.8.8", - "@reown/appkit-wallet": "1.8.8", - "@walletconnect/universal-provider": "2.21.7", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-pay": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@reown/appkit-scaffold-ui": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "@walletconnect/universal-provider": "2.21.9", "bs58": "6.0.0", "semver": "7.7.2", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" }, "optionalDependencies": { "@lit/react": "1.0.8" } }, "node_modules/@reown/appkit-adapter-wagmi": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-adapter-wagmi/-/appkit-adapter-wagmi-1.8.8.tgz", - "integrity": "sha512-sV4/Os7Cg3DriqmQFtvYil6Ffvh6WsQ5v8rK6plLEQisBednhM4Bm2PrzSXRZCtUF8WBFosP9C+9SPvUfOx7vg==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-adapter-wagmi/-/appkit-adapter-wagmi-1.8.9.tgz", + "integrity": "sha512-d9EgFL4S8AD6hXmYZ+v/iCwMw0hGw4HlHWCVW2a5qv9NWVht8MQeE2Iq0OF8OMrYin8q7TQXW39MWQjOfsyH2A==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit": "1.8.8", - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-polyfills": "1.8.8", - "@reown/appkit-scaffold-ui": "1.8.8", - "@reown/appkit-utils": "1.8.8", - "@reown/appkit-wallet": "1.8.8", - "@walletconnect/universal-provider": "2.21.7", + "@reown/appkit": "1.8.9", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@reown/appkit-scaffold-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "@walletconnect/universal-provider": "2.21.9", "valtio": "2.1.7" }, "optionalDependencies": { "@wagmi/connectors": ">=5.9.9" }, "peerDependencies": { - "@wagmi/core": ">=2.20.3", - "viem": ">=2.37.1", - "wagmi": ">=2.16.9" + "@wagmi/core": ">=2.21.2", + "viem": ">=2.37.9", + "wagmi": ">=2.17.5" } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@noble/ciphers": { @@ -3988,9 +3990,9 @@ } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -4030,10 +4032,10 @@ } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/core": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", - "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -4046,39 +4048,39 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.39.3", "events": "3.3.0", "uint8arrays": "3.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.20.8" } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/sign-client": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", - "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@walletconnect/core": "2.21.7", + "@walletconnect/core": "2.21.9", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "events": "3.3.0" } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/types": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", - "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -4089,10 +4091,10 @@ } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/universal-provider": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", - "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -4101,22 +4103,22 @@ "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.7", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "es-toolkit": "1.39.3", "events": "3.3.0" } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/utils": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", - "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@msgpack/msgpack": "3.1.2", "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.2", + "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@scure/base": "1.2.6", "@walletconnect/jsonrpc-utils": "1.0.8", @@ -4125,21 +4127,20 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", + "@walletconnect/types": "2.21.9", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "blakejs": "1.2.1", "bs58": "6.0.0", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.1", - "viem": "2.31.0" + "viem": "2.36.0" } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", - "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", "funding": [ { "type": "github", @@ -4148,14 +4149,14 @@ ], "license": "MIT", "dependencies": { - "@noble/curves": "1.9.1", + "@noble/curves": "1.9.6", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.0.8", "isows": "1.0.7", - "ox": "0.7.1", - "ws": "8.18.2" + "ox": "0.9.1", + "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -4167,9 +4168,9 @@ } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -4218,36 +4219,6 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, - "node_modules/@reown/appkit-adapter-wagmi/node_modules/ox": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", - "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -4258,9 +4229,9 @@ } }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4279,27 +4250,27 @@ } }, "node_modules/@reown/appkit-common": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.8.tgz", - "integrity": "sha512-hXvgiPMy9wDPSPlcaX5Gn75WUeWH3LEKmZYHjwX9ayY07s6NDAdkoOkBTgOp8w5LN1UXsf7+A8/TnD4eGsa5Ew==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", - "viem": ">=2.37.2" + "viem": ">=2.37.9" } }, "node_modules/@reown/appkit-controllers": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.8.tgz", - "integrity": "sha512-d0VvdtSlhWOAVeCmcYcbsMTGiFGa3BEOd5LtTb/jZqM4PFQp5XZODlpztGz1/c7KjWm9s7VSt0OaxQOLNUyjHg==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.9.tgz", + "integrity": "sha512-/8hgFAgiYCTDG3gSxJr8hXy6GnO28UxN8JOXFUEi5gOODy7d3+3Jwm+7OEghf7hGKrShDedibsXdXKdX1PUT+g==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-wallet": "1.8.8", - "@walletconnect/universal-provider": "2.21.7", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "@walletconnect/universal-provider": "2.21.9", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" } }, "node_modules/@reown/appkit-controllers/node_modules/@noble/ciphers": { @@ -4315,9 +4286,9 @@ } }, "node_modules/@reown/appkit-controllers/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -4357,10 +4328,10 @@ } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", - "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -4373,39 +4344,39 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.39.3", "events": "3.3.0", "uint8arrays": "3.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.20.8" } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", - "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@walletconnect/core": "2.21.7", + "@walletconnect/core": "2.21.9", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "events": "3.3.0" } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", - "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -4416,10 +4387,10 @@ } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", - "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -4428,22 +4399,22 @@ "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.7", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "es-toolkit": "1.39.3", "events": "3.3.0" } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", - "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@msgpack/msgpack": "3.1.2", "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.2", + "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@scure/base": "1.2.6", "@walletconnect/jsonrpc-utils": "1.0.8", @@ -4452,21 +4423,20 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", + "@walletconnect/types": "2.21.9", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "blakejs": "1.2.1", "bs58": "6.0.0", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.1", - "viem": "2.31.0" + "viem": "2.36.0" } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", - "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", "funding": [ { "type": "github", @@ -4475,14 +4445,14 @@ ], "license": "MIT", "dependencies": { - "@noble/curves": "1.9.1", + "@noble/curves": "1.9.6", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.0.8", "isows": "1.0.7", - "ox": "0.7.1", - "ws": "8.18.2" + "ox": "0.9.1", + "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -4494,9 +4464,9 @@ } }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -4545,36 +4515,6 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, - "node_modules/@reown/appkit-controllers/node_modules/ox": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", - "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@reown/appkit-controllers/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -4585,9 +4525,9 @@ } }, "node_modules/@reown/appkit-controllers/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4606,15 +4546,15 @@ } }, "node_modules/@reown/appkit-pay": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.8.tgz", - "integrity": "sha512-Gfl4QnRHy2babPTnDeckS/z8UJCiPdZQey1wWgtal5CGVQUKhdvNwDXidJxVqSQTp34Bl9hkKIXKFadkQAIGng==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.9.tgz", + "integrity": "sha512-AEmaPqxnzjawSRFenyiTtq0vjKM5IPb2CTD9wa+OMXFpe6FissO+1Eg1H47sfdrycZCvUizSRmQmYqkJaI8BCw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-ui": "1.8.8", - "@reown/appkit-utils": "1.8.8", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", "lit": "3.3.0", "valtio": "2.1.7" } @@ -4660,25 +4600,25 @@ } }, "node_modules/@reown/appkit-polyfills": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.8.tgz", - "integrity": "sha512-+wQBkloOtiXtl7BltQWBITElWGrfl9kqS+fSNcViyKkgyJtmsqDX7N6LcHuYSBZpRB8UDrovWA5G4u4p3iaAVQ==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.9.tgz", + "integrity": "sha512-33YCU8dxe4UkpNf9qCAaHx5crSoEu6tbmZxE/0eEPCYRDRXoiH9VGiN7xwTDOVduacg/U8H6/32ibmYZKnRk5Q==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "buffer": "6.0.3" } }, "node_modules/@reown/appkit-scaffold-ui": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.8.tgz", - "integrity": "sha512-UEEQhCMSf4282/6vtJbSG5T9EdBL2zx6ZKy9uM78qw5Z1Wg64o9LlHXTjY+E9BFhfjZa1uVgC4bvwLawslVwKw==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.9.tgz", + "integrity": "sha512-F7PSM1nxvlvj2eu8iL355GzvCNiL8RKiCqT1zag8aB4QpxjU24l+vAF6debtkg4HY8nJOyDifZ7Z1jkKrHlIDQ==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-ui": "1.8.8", - "@reown/appkit-utils": "1.8.8", - "@reown/appkit-wallet": "1.8.8", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "@reown/appkit-wallet": "1.8.9", "lit": "3.3.0" } }, @@ -4723,15 +4663,15 @@ } }, "node_modules/@reown/appkit-ui": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.8.tgz", - "integrity": "sha512-cBbaeQ+jiq7A6hEHn3agdTNwmTekXMva17YfHHOpgSicXjIiDUk7z6/oZWVCp89fGvqJKvgwXjToJhX6+GsJUg==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.9.tgz", + "integrity": "sha512-WR17ql77KOMKfyDh7RW4oSfmj+p5gIl0u8Wmopzbx5Hd0HcPVZ5HmTDpwOM9WCSxYcin0fsSAoI+nVdvrhWNtw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@phosphor-icons/webcomponents": "2.1.5", - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-wallet": "1.8.8", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-wallet": "1.8.9", "lit": "3.3.0", "qrcode": "1.5.3" } @@ -4913,20 +4853,20 @@ } }, "node_modules/@reown/appkit-utils": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.8.tgz", - "integrity": "sha512-5JK4IsQb0E0SBurUEy/2npakgUhSIAXyF1K3wAcobkxoFt3N05VWflut/BjBDf56Dn75cUxhh2VGPpmP7RQEhg==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.9.tgz", + "integrity": "sha512-U9hx4h7tIE7ha/QWKjZpZc/imaLumdwe0QNdku9epjp/npXVjGuwUrW5mj8yWNSkjtQpY/BEItNdDAUKZ7rrjw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-controllers": "1.8.8", - "@reown/appkit-polyfills": "1.8.8", - "@reown/appkit-wallet": "1.8.8", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@reown/appkit-wallet": "1.8.9", "@wallet-standard/wallet": "1.1.0", "@walletconnect/logger": "2.1.2", - "@walletconnect/universal-provider": "2.21.7", + "@walletconnect/universal-provider": "2.21.9", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" }, "peerDependencies": { "valtio": "2.1.7" @@ -4945,9 +4885,9 @@ } }, "node_modules/@reown/appkit-utils/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -4987,10 +4927,10 @@ } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", - "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -5003,39 +4943,39 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.39.3", "events": "3.3.0", "uint8arrays": "3.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.20.8" } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", - "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@walletconnect/core": "2.21.7", + "@walletconnect/core": "2.21.9", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "events": "3.3.0" } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", - "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -5046,10 +4986,10 @@ } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", - "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -5058,22 +4998,22 @@ "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.7", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "es-toolkit": "1.39.3", "events": "3.3.0" } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", - "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@msgpack/msgpack": "3.1.2", "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.2", + "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@scure/base": "1.2.6", "@walletconnect/jsonrpc-utils": "1.0.8", @@ -5082,21 +5022,20 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", + "@walletconnect/types": "2.21.9", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "blakejs": "1.2.1", "bs58": "6.0.0", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.1", - "viem": "2.31.0" + "viem": "2.36.0" } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", - "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", "funding": [ { "type": "github", @@ -5105,14 +5044,14 @@ ], "license": "MIT", "dependencies": { - "@noble/curves": "1.9.1", + "@noble/curves": "1.9.6", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.0.8", "isows": "1.0.7", - "ox": "0.7.1", - "ws": "8.18.2" + "ox": "0.9.1", + "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -5124,9 +5063,9 @@ } }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -5175,36 +5114,6 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, - "node_modules/@reown/appkit-utils/node_modules/ox": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", - "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@reown/appkit-utils/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -5215,9 +5124,9 @@ } }, "node_modules/@reown/appkit-utils/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5236,13 +5145,13 @@ } }, "node_modules/@reown/appkit-wallet": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.8.tgz", - "integrity": "sha512-2xsNxGoPhXjsddDGzub0NZWB9+auEa/xpEJUi+DHjK2bfVDUly+XTlVaXDHS9OBAd34oxLijXwN5D2Qgs6XIwQ==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.9.tgz", + "integrity": "sha512-rcAXvkzOVG4941eZVCGtr2dSJAMOclzZGSe+8hnOUnhK4zxa5svxiP6K9O5SMBp3MrAS3WNsRj5hqx6+JHb7iA==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.8", - "@reown/appkit-polyfills": "1.8.8", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", "@walletconnect/logger": "2.1.2", "zod": "3.22.4" } @@ -5269,9 +5178,9 @@ } }, "node_modules/@reown/appkit/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -5311,10 +5220,10 @@ } }, "node_modules/@reown/appkit/node_modules/@walletconnect/core": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", - "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -5327,39 +5236,39 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.39.3", "events": "3.3.0", "uint8arrays": "3.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.20.8" } }, "node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", - "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@walletconnect/core": "2.21.7", + "@walletconnect/core": "2.21.9", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "events": "3.3.0" } }, "node_modules/@reown/appkit/node_modules/@walletconnect/types": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", - "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -5370,10 +5279,10 @@ } }, "node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", - "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -5382,22 +5291,22 @@ "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.7", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", "es-toolkit": "1.39.3", "events": "3.3.0" } }, "node_modules/@reown/appkit/node_modules/@walletconnect/utils": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", - "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", - "license": "Apache-2.0", + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@msgpack/msgpack": "3.1.2", "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.2", + "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@scure/base": "1.2.6", "@walletconnect/jsonrpc-utils": "1.0.8", @@ -5406,21 +5315,20 @@ "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", + "@walletconnect/types": "2.21.9", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "blakejs": "1.2.1", "bs58": "6.0.0", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.1", - "viem": "2.31.0" + "viem": "2.36.0" } }, "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", - "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", "funding": [ { "type": "github", @@ -5429,14 +5337,14 @@ ], "license": "MIT", "dependencies": { - "@noble/curves": "1.9.1", + "@noble/curves": "1.9.6", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.0.8", "isows": "1.0.7", - "ox": "0.7.1", - "ws": "8.18.2" + "ox": "0.9.1", + "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -5448,9 +5356,9 @@ } }, "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -5499,36 +5407,6 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, - "node_modules/@reown/appkit/node_modules/ox": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", - "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@reown/appkit/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -5539,9 +5417,9 @@ } }, "node_modules/@reown/appkit/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -6962,6 +6840,8 @@ }, "node_modules/@wallet-standard/base": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz", + "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==", "license": "Apache-2.0", "engines": { "node": ">=16" @@ -6969,6 +6849,8 @@ }, "node_modules/@wallet-standard/wallet": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/wallet/-/wallet-1.1.0.tgz", + "integrity": "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==", "license": "Apache-2.0", "dependencies": { "@wallet-standard/base": "^1.1.0" @@ -8939,6 +8821,8 @@ }, "node_modules/blakejs": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", "license": "MIT" }, "node_modules/bn.js": { @@ -9615,6 +9499,8 @@ }, "node_modules/core-util-is": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/crc-32": { @@ -10262,8 +10148,6 @@ }, "node_modules/duplexify": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", @@ -11473,8 +11357,6 @@ }, "node_modules/fast-redact": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", "license": "MIT", "engines": { "node": ">=6" @@ -16358,14 +16240,8 @@ } }, "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } + "version": "0.2.0", + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", @@ -16466,9 +16342,9 @@ } }, "node_modules/ox": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz", - "integrity": "sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.1.tgz", + "integrity": "sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==", "funding": [ { "type": "github", @@ -16479,11 +16355,11 @@ "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", - "@noble/curves": "1.9.1", + "@noble/curves": "^1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", - "abitype": "^1.0.9", + "abitype": "^1.0.8", "eventemitter3": "5.0.1" }, "peerDependencies": { @@ -16514,9 +16390,9 @@ } }, "node_modules/ox/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -16875,8 +16751,6 @@ }, "node_modules/pino": { "version": "7.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", - "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", @@ -16896,12 +16770,10 @@ } }, "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", - "dev": true, + "version": "0.5.0", "license": "MIT", "dependencies": { + "duplexify": "^4.1.2", "split2": "^4.0.0" } }, @@ -16928,37 +16800,34 @@ "pino-pretty": "bin.js" } }, - "node_modules/pino-std-serializers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", - "license": "MIT" - }, - "node_modules/pino/node_modules/on-exit-leak-free": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", - "license": "MIT" + "node_modules/pino-pretty/node_modules/on-exit-leak-free": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/pino/node_modules/pino-abstract-transport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "node_modules/pino-pretty/node_modules/pino-abstract-transport": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "duplexify": "^4.1.2", "split2": "^4.0.0" } }, - "node_modules/pino/node_modules/sonic-boom": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "node_modules/pino-pretty/node_modules/sonic-boom": { + "version": "4.2.0", + "dev": true, "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "license": "MIT" + }, "node_modules/pirates": { "version": "4.0.7", "license": "MIT", @@ -17117,10 +16986,100 @@ } } }, + "node_modules/porto/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/porto/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/porto/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/porto/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/porto/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/porto/node_modules/ox": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.9.tgz", + "integrity": "sha512-aPU6d5U9vZFVNut0C8uUeQELC52sD60FENwPizU3+jsZOlAaTzXSE2fO7iyTRVyO5iD7/AbWkAZr/WWCmn5ecQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.9", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/porto/node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -17341,12 +17300,12 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/process-warning": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", "license": "MIT" }, "node_modules/promise-worker-transferable": { @@ -17981,8 +17940,6 @@ }, "node_modules/real-require": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -19098,10 +19055,7 @@ } }, "node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", - "dev": true, + "version": "2.8.0", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -19229,8 +19183,6 @@ }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT" }, "node_modules/strict-uri-encode": { @@ -19811,8 +19763,6 @@ }, "node_modules/thread-stream": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", - "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", "license": "MIT", "dependencies": { "real-require": "^0.1.0" @@ -19882,9 +19832,7 @@ "license": "BSD-3-Clause" }, "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "version": "1.2.1", "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -20801,9 +20749,9 @@ } }, "node_modules/viem": { - "version": "2.37.13", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.37.13.tgz", - "integrity": "sha512-05dh56iMmCyjRLcTIiu8bB4zZLnb9uLOVToDwmBLYDarmoOE8d8SLFkQLc2zLU57FlnYCQIO1VbUviGZYwFGgQ==", + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.38.0.tgz", + "integrity": "sha512-YU5TG8dgBNeYPrCMww0u9/JVeq2ZCk9fzk6QybrPkBooFysamHXL1zC3ua10aLPt9iWoA/gSVf1D9w7nc5B1aA==", "funding": [ { "type": "github", @@ -20831,6 +20779,24 @@ } } }, + "node_modules/viem/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/viem/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/viem/node_modules/@noble/curves": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", @@ -20890,6 +20856,36 @@ } } }, + "node_modules/viem/node_modules/ox": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz", + "integrity": "sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.9", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/viem/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -21295,7 +21291,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.0", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/services/auth/auth.utils.ts b/services/auth/auth.utils.ts index 975661e149..1413d36275 100644 --- a/services/auth/auth.utils.ts +++ b/services/auth/auth.utils.ts @@ -1,8 +1,8 @@ import { publicEnv } from "@/config/env"; -import Cookies from "js-cookie"; -import { jwtDecode } from "jwt-decode"; import { API_AUTH_COOKIE } from "@/constants"; import { safeLocalStorage } from "@/helpers/safeLocalStorage"; +import Cookies from "js-cookie"; +import { jwtDecode } from "jwt-decode"; export const WALLET_AUTH_COOKIE = "wallet-auth"; @@ -31,29 +31,6 @@ const getAddressRoleStorageKey = (address: string): string => { return `auth-role-${address.toLowerCase()}`; }; -// TODO: remove these cookies once migration is complete -export const migrateCookiesToLocalStorage = () => { - const walletAddress = Cookies.get(WALLET_ADDRESS_COOKIE); - const walletRefreshToken = Cookies.get(WALLET_REFRESH_TOKEN_COOKIE); - const walletRole = Cookies.get(WALLET_ROLE_COOKIE); - - if (walletAddress) { - safeLocalStorage.setItem(WALLET_ADDRESS_STORAGE_KEY, walletAddress); - Cookies.remove(WALLET_ADDRESS_COOKIE); - } - if (walletRefreshToken) { - safeLocalStorage.setItem( - WALLET_REFRESH_TOKEN_STORAGE_KEY, - walletRefreshToken - ); - Cookies.remove(WALLET_REFRESH_TOKEN_COOKIE); - } - if (walletRole) { - safeLocalStorage.setItem(WALLET_ROLE_STORAGE_KEY, walletRole); - Cookies.remove(WALLET_ROLE_COOKIE); - } -}; - export const setAuthJwt = ( address: string, jwt: string,