@chipi-stack/chipi-react 12.4.0 → 12.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/ChipiProvider.tsx","../src/hooks/useCreateWallet.ts","../src/hooks/useGetWallet.ts","../src/hooks/useChipiWallet.ts","../src/hooks/useChipiSession.ts","../src/hooks/useMigrateWalletToPasskey.ts","../src/hooks/useTransfer.ts","../src/hooks/useApprove.ts","../src/hooks/useGetTransactionList.ts","../src/hooks/useCreateSkuTransaction.ts","../src/hooks/useGetSkuTransaction.ts","../src/hooks/useGetSkuList.ts","../src/hooks/useGetSku.ts","../src/hooks/useStakeVesuUsdc.ts","../src/hooks/useWithdrawVesuUsdc.ts","../src/hooks/useCallAnyContract.ts","../src/hooks/useRecordSendTransaction.ts","../src/hooks/useGetTokenBalance.ts","../src/hooks/useGetUser.ts","../src/hooks/useCreateUser.ts","../src/hooks/useCreateSessionKey.ts","../src/hooks/useAddSessionKeyToContract.ts","../src/hooks/useRevokeSessionKey.ts","../src/hooks/useGetSessionData.ts","../src/hooks/useExecuteWithSession.ts"],"names":["useQueryClient","useQuery","ChipiApiError","useMutation","useMemo","useCallback","createWalletPasskey","getWalletEncryptKey","input"],"mappings":"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","file":"hooks.mjs","sourcesContent":["import React, { createContext, useContext, ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { ChipiSDK } from \"@chipi-stack/backend\";\nimport type { ChipiSDKConfig } from \"@chipi-stack/types\";\n\ninterface ChipiContextValue {\n chipiSDK: ChipiSDK;\n config: ChipiSDKConfig;\n}\n\nconst ChipiContext = createContext<ChipiContextValue | null>(null);\n\ninterface ChipiProviderProps {\n children: ReactNode;\n config: ChipiSDKConfig;\n}\n\n// Default QueryClient configuration\nconst createDefaultQueryClient = () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000, // 1 minute\n gcTime: 10 * 60 * 1000, // 10 minutes (formerly cacheTime)\n retry: (failureCount, error: any) => {\n // Don't retry on 4xx errors\n if (error?.status >= 400 && error?.status < 500) {\n return false;\n }\n return failureCount < 3;\n },\n },\n mutations: {\n retry: false,\n },\n },\n });\n\n/**\n * Provider component that wraps your app and provides Chipi SDK context with QueryClient\n */\nexport function ChipiProvider({ children, config }: ChipiProviderProps) {\n // Create QueryClient\n const queryClient = React.useMemo(() => createDefaultQueryClient(), []);\n\n const chipiSDK = React.useMemo(() => new ChipiSDK(config), [config]);\n\n const value = React.useMemo(\n () => ({\n chipiSDK,\n config,\n }),\n [chipiSDK, config]\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChipiContext.Provider value={value}>{children}</ChipiContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access Chipi SDK context\n */\nexport function useChipiContext(): ChipiContextValue {\n const context = useContext(ChipiContext);\n\n if (!context) {\n throw new Error(\"useChipiContext must be used within a ChipiProvider\");\n }\n\n return context;\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n CreateWalletParams,\n CreateWalletResponse,\n} from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\n\ntype CreateWalletInput = {\n params: CreateWalletParams;\n bearerToken: string;\n};\n\n/**\n * Hook for creating a new wallet\n */\nexport function useCreateWallet(): {\n createWallet: (input: CreateWalletInput) => void;\n createWalletAsync: (\n input: CreateWalletInput\n ) => Promise<CreateWalletResponse>;\n data: CreateWalletResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n CreateWalletResponse,\n Error,\n CreateWalletInput\n > = useMutation({\n mutationFn: async (input: CreateWalletInput) => {\n let encryptKey = input.params.encryptKey;\n\n // If usePasskey is true, create passkey and get encryptKey\n if (input.params.usePasskey) {\n if (!input.params.externalUserId) {\n throw new Error(\"externalUserId is required when using passkey\");\n }\n\n try {\n const passkeyResult = await createWalletPasskey(\n input.params.externalUserId,\n input.params.externalUserId // Using externalUserId as userName\n );\n encryptKey = passkeyResult.encryptKey;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Passkey creation failed: ${error.message}`);\n }\n throw new Error(\"Failed to create passkey for wallet\");\n }\n }\n\n return chipiSDK.createWallet({\n params: {\n ...input.params,\n encryptKey: encryptKey!,\n },\n bearerToken: input.bearerToken,\n });\n },\n });\n\n return {\n createWallet: mutation.mutate,\n createWalletAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { GetWalletParams, GetWalletResponse } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetWalletInput = {\n params?: GetWalletParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<\n UseQueryOptions<GetWalletResponse | null, Error>,\n \"queryKey\" | \"queryFn\"\n >;\n};\n\nexport function useGetWallet(input?: GetWalletInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"wallet\", input?.params?.externalUserId],\n queryFn: async () => {\n if (!input || !input.params || !input.getBearerToken)\n throw new Error(\"Input is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet(input.params, bearerToken);\n },\n enabled: Boolean(\n input?.params?.externalUserId &&\n input?.getBearerToken &&\n input.params.externalUserId.trim() !== \"\"\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchWallet = async (\n newInput: GetWalletInput\n ): Promise<GetWalletResponse | null> => {\n return queryClient.fetchQuery({\n queryKey: [\"wallet\", newInput?.params?.externalUserId],\n queryFn: async () => {\n if (!newInput || !newInput.getBearerToken || !newInput.params)\n throw new Error(\"Input is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet(newInput.params, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchWallet,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\nimport type {\n WalletType,\n GetWalletResponse,\n CreateWalletResponse,\n GetTokenBalanceResponse,\n ChainToken,\n} from \"@chipi-stack/types\";\n\n/**\n * Configuration for useChipiWallet hook\n */\nexport interface UseChipiWalletConfig {\n /** External user ID (e.g., from Clerk, Firebase, etc.) */\n externalUserId: string | null | undefined;\n /** Function to get the bearer token for API calls */\n getBearerToken: () => Promise<string | null | undefined>;\n /** Default token for balance display (defaults to USDC) */\n defaultToken?: ChainToken;\n /** Whether to automatically fetch wallet on mount */\n enabled?: boolean;\n}\n\n/**\n * Extended wallet response with additional computed properties\n */\nexport interface ChipiWalletData extends GetWalletResponse {\n /** Whether this wallet supports session keys */\n supportsSessionKeys: boolean;\n /** Formatted short address for display */\n shortAddress: string;\n}\n\n/**\n * Return type for useChipiWallet hook\n */\nexport interface UseChipiWalletReturn {\n // Wallet data\n /** The user's wallet data, null if not found, undefined if loading */\n wallet: ChipiWalletData | null | undefined;\n /** Whether the user has a wallet */\n hasWallet: boolean;\n /** Whether the wallet is currently being fetched */\n isLoadingWallet: boolean;\n /** Error from fetching wallet */\n walletError: Error | null;\n\n // Balance data\n /** The wallet's balance for the default token */\n balance: GetTokenBalanceResponse | undefined;\n /** Formatted balance string (e.g., \"100.50\") */\n formattedBalance: string;\n /** Whether balance is loading */\n isLoadingBalance: boolean;\n\n // Create wallet\n /** Create a new wallet */\n\n createWallet: (params: {\n encryptKey: string;\n walletType?: WalletType;\n }) => Promise<CreateWalletResponse>;\n /** Whether wallet creation is in progress */\n isCreating: boolean;\n /** Data from the last wallet creation */\n createdWallet: CreateWalletResponse | undefined;\n\n // Actions\n /** Refetch the wallet data */\n refetchWallet: () => Promise<void>;\n /** Refetch the balance */\n refetchBalance: () => Promise<void>;\n /** Refetch both wallet and balance */\n refetchAll: () => Promise<void>;\n}\n\n/**\n * All-in-one wallet hook for Chipi SDK.\n *\n * Combines wallet fetching, creation, and balance checking into a single hook\n * for simplified wallet management.\n *\n * @example\n * ```tsx\n * import { useAuth } from \"@clerk/nextjs\";\n * import { useChipiWallet } from \"@chipi-stack/nextjs\";\n *\n * function WalletComponent() {\n * const { userId, getToken } = useAuth();\n * const {\n * wallet,\n * hasWallet,\n * balance,\n * formattedBalance,\n * createWallet,\n * isCreating,\n * isLoadingWallet,\n * } = useChipiWallet({\n * externalUserId: userId,\n * getBearerToken: getToken,\n * });\n *\n * if (isLoadingWallet) return <div>Loading...</div>;\n *\n * if (!hasWallet) {\n * return (\n * <button\n * onClick={() => createWallet({ encryptKey: \"1234\" })}\n * disabled={isCreating}\n * >\n * {isCreating ? \"Creating...\" : \"Create Wallet\"}\n * </button>\n * );\n * }\n *\n * return (\n * <div>\n * <p>Address: {wallet?.shortAddress}</p>\n * <p>Balance: ${formattedBalance} USDC</p>\n * <p>Session Keys: {wallet?.supportsSessionKeys ? \"Yes\" : \"No\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useChipiWallet(\n config: UseChipiWalletConfig\n): UseChipiWalletReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const {\n externalUserId,\n getBearerToken,\n defaultToken = \"USDC\",\n enabled = true,\n } = config;\n\n const isEnabled = Boolean(\n enabled && externalUserId && externalUserId.trim() !== \"\"\n );\n\n // ============ Wallet Query ============\n const walletQuery = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"chipi-wallet\", externalUserId],\n queryFn: async () => {\n if (!externalUserId) return null;\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet({ externalUserId }, bearerToken);\n },\n enabled: isEnabled,\n retry: (failureCount, error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n\n // ============ Balance Query ============\n const walletPublicKey = walletQuery.data?.wallet.publicKey;\n\n const balanceQuery = useQuery<GetTokenBalanceResponse, Error>({\n queryKey: [\"chipi-wallet-balance\", walletPublicKey, defaultToken],\n queryFn: async () => {\n if (!walletPublicKey) throw new Error(\"No wallet\");\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(\n {\n chain: \"STARKNET\",\n chainToken: defaultToken,\n walletPublicKey,\n },\n bearerToken\n );\n },\n enabled: Boolean(walletPublicKey),\n retry: (failureCount, error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n\n // ============ Create Wallet Mutation ============\n const createWalletMutation = useMutation<\n CreateWalletResponse,\n Error,\n { encryptKey: string; walletType?: WalletType }\n >({\n mutationFn: async ({ encryptKey, walletType = \"CHIPI\" }) => {\n if (!externalUserId) throw new Error(\"External user ID is required\");\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n return chipiSDK.createWallet({\n params: {\n encryptKey,\n externalUserId,\n walletType,\n },\n bearerToken,\n });\n },\n onSuccess: () => {\n // Invalidate wallet query to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", externalUserId],\n });\n },\n });\n\n // ============ Computed Values ============\n const wallet = useMemo<ChipiWalletData | null | undefined>(() => {\n if (walletQuery.isLoading) return undefined;\n if (!walletQuery.data) return null;\n\n const data = walletQuery.data;\n return {\n ...data,\n supportsSessionKeys: data.wallet.walletType === \"CHIPI\",\n shortAddress: formatAddress(data.wallet.publicKey),\n };\n }, [walletQuery.data, walletQuery.isLoading]);\n\n const formattedBalance = useMemo(() => {\n if (!balanceQuery.data?.balance) return \"0.00\";\n const num = Number(balanceQuery.data.balance);\n return num.toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits:\n defaultToken === \"ETH\" || defaultToken === \"STRK\" ? 6 : 2,\n });\n }, [balanceQuery.data, defaultToken]);\n\n // ============ Actions ============\n const refetchWallet = useCallback(async () => {\n await walletQuery.refetch();\n }, [walletQuery]);\n\n const refetchBalance = useCallback(async () => {\n await balanceQuery.refetch();\n }, [balanceQuery]);\n\n const refetchAll = useCallback(async () => {\n await Promise.all([walletQuery.refetch(), balanceQuery.refetch()]);\n }, [walletQuery, balanceQuery]);\n\n const createWallet = useCallback(\n async (params: { encryptKey: string; walletType?: WalletType }) => {\n return createWalletMutation.mutateAsync(params);\n },\n [createWalletMutation]\n );\n\n return {\n // Wallet data\n wallet,\n hasWallet: wallet !== null && wallet !== undefined,\n isLoadingWallet: walletQuery.isLoading,\n walletError: walletQuery.error,\n\n // Balance data\n balance: balanceQuery.data,\n formattedBalance,\n isLoadingBalance: balanceQuery.isLoading,\n\n // Create wallet\n createWallet,\n isCreating: createWalletMutation.isPending,\n createdWallet: createWalletMutation.data,\n\n // Actions\n refetchWallet,\n refetchBalance,\n refetchAll,\n };\n}\n\n/**\n * Format a wallet address for display\n */\nfunction formatAddress(address: string, chars = 6): string {\n if (!address || address.length < chars * 2) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState, useEffect } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n SessionKeyData,\n SessionConfig,\n SessionDataResponse,\n WalletData,\n WalletType,\n CreateSessionKeyParams,\n Call,\n} from \"@chipi-stack/types\";\n\n/**\n * Wallet data with optional wallet type for session operations\n */\nexport interface SessionWallet extends WalletData {\n walletType?: WalletType;\n}\n\n/**\n * Configuration for useChipiSession hook\n */\nexport interface UseChipiSessionConfig {\n /** Wallet data (must be a CHIPI wallet for session support) */\n wallet: SessionWallet | null | undefined;\n /** Encryption key (user's PIN) for signing operations */\n encryptKey: string;\n /** Function to get the bearer token for API calls */\n getBearerToken: () => Promise<string | null | undefined>;\n /** Previously stored session data (from Clerk metadata, database, etc.) */\n storedSession?: SessionKeyData | null;\n /** Callback fired when a new session is created (for persistence) */\n onSessionCreated?: (session: SessionKeyData) => void | Promise<void>;\n /** Session duration in seconds (default: 6 hours) */\n defaultDurationSeconds?: number;\n /** Default max calls for session registration (default: 1000) */\n defaultMaxCalls?: number;\n /** Whether to auto-check session status on mount */\n autoCheckStatus?: boolean;\n}\n\n/**\n * Session lifecycle state\n */\nexport type SessionState = \n | \"none\" // No session exists\n | \"created\" // Session created locally, not registered on-chain\n | \"active\" // Session registered and active on-chain\n | \"expired\" // Session has expired\n | \"revoked\"; // Session has been revoked\n\n/**\n * Return type for useChipiSession hook\n */\nexport interface UseChipiSessionReturn {\n // Session data\n /** Current session key data */\n session: SessionKeyData | null;\n /** On-chain session status (from contract query) */\n sessionStatus: SessionDataResponse | undefined;\n /** Current session lifecycle state */\n sessionState: SessionState;\n /** Whether there is an active, usable session */\n hasActiveSession: boolean;\n /** Whether the session has expired */\n isSessionExpired: boolean;\n /** Remaining calls available for the session */\n remainingCalls: number | undefined;\n /** Whether the wallet supports sessions (CHIPI wallet) */\n supportsSession: boolean;\n\n // Actions\n /** Create a new session keypair locally (does NOT register on-chain) */\n createSession: (config?: Partial<CreateSessionKeyParams>) => Promise<SessionKeyData>;\n /** Register the current session on the blockchain */\n registerSession: (config?: Partial<SessionConfig>) => Promise<string>;\n /** Revoke the current session from the blockchain */\n revokeSession: () => Promise<string>;\n /** Execute calls using the session key (no owner signature needed) */\n executeWithSession: (calls: Call[]) => Promise<string>;\n /** Clear the current session from local state */\n clearSession: () => void;\n /** Refresh the on-chain session status */\n refetchStatus: () => Promise<void>;\n\n // Loading states\n isCreating: boolean;\n isRegistering: boolean;\n isRevoking: boolean;\n isExecuting: boolean;\n isLoadingStatus: boolean;\n\n // Errors\n error: Error | null;\n}\n\n/**\n * All-in-one session management hook for Chipi SDK.\n *\n * Combines session creation, registration, execution, and revocation\n * into a single unified API. Session keys enable gasless transactions\n * without requiring the owner's private key for each operation.\n *\n * **Important:** Sessions only work with CHIPI wallets. ARGENT wallets\n * do not support session keys.\n *\n * @example\n * ```tsx\n * import { useAuth } from \"@clerk/nextjs\";\n * import { useChipiWallet, useChipiSession } from \"@chipi-stack/nextjs\";\n *\n * function SessionComponent() {\n * const { userId, getToken } = useAuth();\n * const [pin, setPin] = useState(\"\");\n * const { wallet } = useChipiWallet({ externalUserId: userId, getBearerToken: getToken });\n *\n * const {\n * session,\n * hasActiveSession,\n * sessionState,\n * createSession,\n * registerSession,\n * executeWithSession,\n * isCreating,\n * isRegistering,\n * } = useChipiSession({\n * wallet,\n * encryptKey: pin,\n * getBearerToken: getToken,\n * onSessionCreated: async (newSession) => {\n * // Persist to Clerk metadata or database\n * await saveSessionToClerk(newSession);\n * },\n * });\n *\n * const handleSetupSession = async () => {\n * // Step 1: Create session locally\n * await createSession();\n * // Step 2: Register on-chain\n * await registerSession();\n * };\n *\n * const handleTransfer = async () => {\n * // Execute transfer using session (no PIN needed after setup)\n * await executeWithSession([{\n * contractAddress: USDC_ADDRESS,\n * entrypoint: \"transfer\",\n * calldata: [recipient, amount, \"0x0\"],\n * }]);\n * };\n *\n * return (\n * <div>\n * <p>Session State: {sessionState}</p>\n * {!hasActiveSession ? (\n * <button onClick={handleSetupSession} disabled={isCreating || isRegistering}>\n * Setup Session\n * </button>\n * ) : (\n * <button onClick={handleTransfer}>\n * Transfer (Gasless)\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useChipiSession(config: UseChipiSessionConfig): UseChipiSessionReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const {\n wallet,\n encryptKey,\n getBearerToken,\n storedSession,\n onSessionCreated,\n defaultDurationSeconds = 21600, // 6 hours\n defaultMaxCalls = 1000,\n autoCheckStatus = true,\n } = config;\n\n // ============ Local Session State ============\n const [localSession, setLocalSession] = useState<SessionKeyData | null>(\n storedSession ?? null\n );\n const [error, setError] = useState<Error | null>(null);\n\n // Sync stored session when it changes\n useEffect(() => {\n if (storedSession) {\n setLocalSession(storedSession);\n }\n }, [storedSession]);\n\n // ============ Computed Values ============\n const supportsSession = useMemo(() => {\n if (!wallet) return false;\n // CHIPI wallets support sessions, ARGENT wallets don't\n // If walletType is undefined (legacy), assume it doesn't support sessions\n return wallet.walletType === \"CHIPI\";\n }, [wallet]);\n\n // ============ Session Status Query ============\n const sessionStatusQuery = useQuery<SessionDataResponse | null, Error>({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n queryFn: async () => {\n if (!wallet?.publicKey || !localSession?.publicKey) return null;\n return chipiSDK.sessions.getSessionData({\n walletAddress: wallet.publicKey,\n sessionPublicKey: localSession.publicKey,\n });\n },\n enabled: Boolean(\n autoCheckStatus &&\n wallet?.publicKey &&\n localSession?.publicKey &&\n supportsSession\n ),\n staleTime: 30000, // 30 seconds\n });\n\n // ============ Session State Computation ============\n const sessionState = useMemo<SessionState>(() => {\n if (!localSession) return \"none\";\n \n const status = sessionStatusQuery.data;\n \n // If we have status data from the contract\n if (status) {\n if (!status.isActive) return \"revoked\";\n if (status.validUntil * 1000 < Date.now()) return \"expired\";\n if (status.remainingCalls <= 0) return \"expired\";\n return \"active\";\n }\n \n // No status data yet - check local expiration\n if (localSession.validUntil * 1000 < Date.now()) return \"expired\";\n \n // Session exists locally but no on-chain status - assume created but not registered\n return \"created\";\n }, [localSession, sessionStatusQuery.data]);\n\n const hasActiveSession = sessionState === \"active\";\n const isSessionExpired = sessionState === \"expired\";\n const remainingCalls = sessionStatusQuery.data?.remainingCalls;\n\n // ============ Create Session Mutation ============\n const createSessionMutation = useMutation<SessionKeyData, Error, Partial<CreateSessionKeyParams>>({\n mutationFn: async (params = {}) => {\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions. Only CHIPI wallets support session keys.\");\n\n const sessionData = chipiSDK.sessions.createSessionKey({\n encryptKey,\n durationSeconds: params.durationSeconds ?? defaultDurationSeconds,\n });\n\n return sessionData;\n },\n onSuccess: async (sessionData) => {\n setLocalSession(sessionData);\n setError(null);\n \n // Call the persistence callback if provided\n if (onSessionCreated) {\n await onSessionCreated(sessionData);\n }\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Register Session Mutation ============\n const registerSessionMutation = useMutation<string, Error, Partial<SessionConfig>>({\n mutationFn: async (sessionConfig = {}) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to register. Call createSession first.\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.sessions.addSessionKeyToContract(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionConfig: {\n sessionPublicKey: localSession.publicKey,\n validUntil: sessionConfig.validUntil ?? localSession.validUntil,\n maxCalls: sessionConfig.maxCalls ?? defaultMaxCalls,\n allowedEntrypoints: sessionConfig.allowedEntrypoints ?? [],\n },\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Invalidate session status to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Revoke Session Mutation ============\n const revokeSessionMutation = useMutation<string, Error, void>({\n mutationFn: async () => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to revoke\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.sessions.revokeSessionKey(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionPublicKey: localSession.publicKey,\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Invalidate session status\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Execute With Session Mutation ============\n const executeWithSessionMutation = useMutation<string, Error, Call[]>({\n mutationFn: async (calls) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No active session\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!hasActiveSession) throw new Error(\"Session is not active. Register the session first.\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.executeTransactionWithSession({\n params: {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n session: localSession,\n calls,\n },\n bearerToken,\n });\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Refetch status to update remaining calls\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Actions ============\n const createSession = useCallback(\n async (params?: Partial<CreateSessionKeyParams>) => {\n return createSessionMutation.mutateAsync(params ?? {});\n },\n [createSessionMutation]\n );\n\n const registerSession = useCallback(\n async (sessionConfig?: Partial<SessionConfig>) => {\n return registerSessionMutation.mutateAsync(sessionConfig ?? {});\n },\n [registerSessionMutation]\n );\n\n const revokeSession = useCallback(async () => {\n return revokeSessionMutation.mutateAsync();\n }, [revokeSessionMutation]);\n\n const executeWithSession = useCallback(\n async (calls: Call[]) => {\n return executeWithSessionMutation.mutateAsync(calls);\n },\n [executeWithSessionMutation]\n );\n\n const clearSession = useCallback(() => {\n setLocalSession(null);\n setError(null);\n }, []);\n\n const refetchStatus = useCallback(async () => {\n await sessionStatusQuery.refetch();\n }, [sessionStatusQuery]);\n\n // ============ Combined Error ============\n const combinedError = useMemo(() => {\n return (\n error ||\n createSessionMutation.error ||\n registerSessionMutation.error ||\n revokeSessionMutation.error ||\n executeWithSessionMutation.error ||\n sessionStatusQuery.error ||\n null\n );\n }, [\n error,\n createSessionMutation.error,\n registerSessionMutation.error,\n revokeSessionMutation.error,\n executeWithSessionMutation.error,\n sessionStatusQuery.error,\n ]);\n\n return {\n // Session data\n session: localSession,\n sessionStatus: sessionStatusQuery.data ?? undefined,\n sessionState,\n hasActiveSession,\n isSessionExpired,\n remainingCalls,\n supportsSession,\n\n // Actions\n createSession,\n registerSession,\n revokeSession,\n executeWithSession,\n clearSession,\n refetchStatus,\n\n // Loading states\n isCreating: createSessionMutation.isPending,\n isRegistering: registerSessionMutation.isPending,\n isRevoking: revokeSessionMutation.isPending,\n isExecuting: executeWithSessionMutation.isPending,\n isLoadingStatus: sessionStatusQuery.isLoading,\n\n // Errors\n error: combinedError,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n MigrateWalletToPasskeyParams,\n WalletData,\n} from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\nimport { decryptPrivateKey, encryptPrivateKey } from \"@chipi-stack/backend\";\n\ntype MigrateWalletToPasskeyInput = MigrateWalletToPasskeyParams & {\n bearerToken: string;\n};\n\ninterface MigrateWalletToPasskeyResult {\n success: boolean;\n wallet: WalletData;\n credentialId: string;\n}\n\n/**\n * Hook for migrating a wallet from encryptKey (PIN) to passkey authentication\n */\nexport function useMigrateWalletToPasskey(): {\n migrateWalletToPasskey: (input: MigrateWalletToPasskeyInput) => void;\n migrateWalletToPasskeyAsync: (\n input: MigrateWalletToPasskeyInput\n ) => Promise<MigrateWalletToPasskeyResult>;\n data: MigrateWalletToPasskeyResult | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n MigrateWalletToPasskeyResult,\n Error,\n MigrateWalletToPasskeyInput\n > = useMutation({\n mutationFn: async (input: MigrateWalletToPasskeyInput) => {\n const { wallet, oldEncryptKey, externalUserId, bearerToken } = input;\n\n try {\n // Step 1: Create new passkey and get new encryptKey\n const passkeyResult = await createWalletPasskey(\n externalUserId,\n externalUserId // Using externalUserId as userName\n );\n\n // Step 2: Decrypt private key with old encryptKey\n let decryptedPrivateKey: string;\n try {\n decryptedPrivateKey = decryptPrivateKey(\n wallet.encryptedPrivateKey,\n oldEncryptKey\n );\n } catch (error) {\n throw new Error(\n \"Failed to decrypt wallet with provided encryptKey. Please verify your PIN/password is correct.\"\n );\n }\n\n // Step 3: Re-encrypt with new passkey-derived encryptKey\n const newEncryptedPrivateKey = encryptPrivateKey(\n decryptedPrivateKey,\n passkeyResult.encryptKey\n );\n\n // Step 4: Update wallet in backend\n // Note: This requires an API endpoint to update the encrypted private key\n // For now, we'll construct the updated wallet object\n // You may need to add an actual API call here depending on your backend implementation\n\n const updatedWallet: WalletData = {\n ...wallet,\n encryptedPrivateKey: newEncryptedPrivateKey,\n };\n\n // TODO: Add API call to update wallet if your backend has such an endpoint\n // await chipiSDK.wallets.updateWalletEncryption({\n // publicKey: wallet.publicKey,\n // encryptedPrivateKey: newEncryptedPrivateKey,\n // bearerToken,\n // });\n\n return {\n success: true,\n wallet: updatedWallet,\n credentialId: passkeyResult.credentialId,\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Migration failed: ${error.message}`);\n }\n throw new Error(\"Failed to migrate wallet to passkey\");\n }\n },\n });\n\n return {\n migrateWalletToPasskey: mutation.mutate,\n migrateWalletToPasskeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { TransferHookInput } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype TransferInput = { params: TransferHookInput; bearerToken: string };\n\n/**\n * Hook for transferring tokens\n */\nexport function useTransfer(): {\n transfer: (input: TransferInput) => void;\n transferAsync: (input: TransferInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, TransferInput> = useMutation(\n {\n mutationFn: async (input: TransferInput) => {\n let encryptKey = input.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (input.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.transfer({\n params: {\n ...input.params,\n amount: String(input.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: input.bearerToken,\n });\n },\n }\n );\n\n return {\n transfer: mutation.mutate,\n transferAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { ApproveHookInput } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype ApproveInput = {\n params: ApproveHookInput;\n bearerToken: string;\n};\n\n/**\n * Hook for approving token spending\n */\nexport function useApprove(): {\n approve: (params: ApproveInput) => void;\n approveAsync: (params: ApproveInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, ApproveInput> = useMutation({\n mutationFn: async (params: ApproveInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Passkey authentication failed: ${error.message}`);\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.approve({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n approve: mutation.mutate,\n approveAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { PaginatedResponse, Transaction, GetTransactionListQuery } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype TransactionListInput = {\n query: GetTransactionListQuery;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<PaginatedResponse<Transaction>, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetTransactionList(input?: TransactionListInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (q?: GetTransactionListQuery) => [\n \"transaction-list\",\n q?.page ?? 1,\n q?.limit ?? 10,\n q?.calledFunction ?? null,\n q?.walletAddress,\n q?.day ?? null,\n q?.month ?? null,\n q?.year ?? null,\n ];\n \n const query = useQuery<PaginatedResponse<Transaction>, Error>({\n queryKey: buildQueryKey(input?.query),\n queryFn: async () => {\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionList(input.query, bearerToken);\n },\n enabled: Boolean(input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n\n return failureCount < 3;\n },\n ...input?.queryOptions\n });\n\n const fetchTransactionList = async (newInput: TransactionListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.query),\n queryFn: async () => {\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionList(newInput.query, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransactionList,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport { CreateSkuTransactionParams, SkuTransaction } from \"@chipi-stack/types\";\n\ntype CreateSkuTransactionInput = { \n params: CreateSkuTransactionParams; \n bearerToken: string; \n};\n\n/**\n * Hook for creating SKU transactions\n */\nexport function useCreateSkuTransaction(): {\n createSkuTransaction: (input: CreateSkuTransactionInput) => void;\n createSkuTransactionAsync: (input: CreateSkuTransactionInput) => Promise<SkuTransaction>;\n data: SkuTransaction | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<SkuTransaction, Error, CreateSkuTransactionInput> = useMutation({\n mutationFn: (input: CreateSkuTransactionInput) =>\n chipiSDK.createSkuTransaction({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n createSkuTransaction: mutation.mutate,\n createSkuTransactionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport {\n SkuTransaction,\n} from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\n\ntype GetSkuTransactionInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<SkuTransaction, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetSkuTransaction(input?: GetSkuTransactionInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n \n const query = useQuery<SkuTransaction, Error>({\n queryKey: [\"sku-transaction\", input?.id],\n queryFn: async () => {\n if (!input?.id) throw new Error(\"id is required\");\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.skuTransactions.getSkuTransaction(input.id, bearerToken);\n },\n enabled: Boolean(input?.id && input?.getBearerToken),\n ...input?.queryOptions\n });\n\n const fetchSkuTransaction = async (newInput: GetSkuTransactionInput) => {\n return queryClient.fetchQuery({\n queryKey: [\"sku-transaction\", newInput?.id],\n queryFn: async () => {\n if (!newInput?.id) throw new Error(\"id is required\");\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.skuTransactions.getSkuTransaction(newInput.id, bearerToken);\n },\n });\n };\n\n return {\n ...query,\n fetchSkuTransaction,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { PaginatedResponse, Sku, GetSkuListQuery } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype SkuListInput = {\n query: GetSkuListQuery;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<PaginatedResponse<Sku>, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetSkuList(input?: SkuListInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (q?: GetSkuListQuery) => [\n \"available-skus\",\n q?.page ?? 1,\n q?.limit ?? 10,\n q?.offset ?? 0,\n q?.provider ?? null,\n q?.category ?? null,\n ];\n \n const query = useQuery<PaginatedResponse<Sku>, Error>({\n queryKey: buildQueryKey(input?.query),\n queryFn: async () => {\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSkuList(input.query, bearerToken);\n },\n enabled: Boolean(input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n\n return failureCount < 3;\n },\n ...input?.queryOptions\n });\n\n const fetchSkuList = async (newInput: SkuListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.query),\n queryFn: async () => {\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSkuList(newInput.query, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchSkuList,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Sku } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError, ErrorResponse } from \"@chipi-stack/shared\";\n\ntype GetSkuInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Sku, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetSku(input?: GetSkuInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<Sku, Error>({\n queryKey: [\"sku\", input?.id],\n queryFn: async () => {\n if (!input?.id || !input?.getBearerToken)\n throw new Error(\"id and getBearerToken are required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSku(input.id, bearerToken);\n },\n enabled: Boolean(\n input?.id && input?.getBearerToken && input.id.trim() !== \"\"\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchSku = async (input: GetSkuInput): Promise<Sku> => {\n return queryClient.fetchQuery({\n queryKey: [\"sku\", input?.id],\n queryFn: async () => {\n if (!input?.getBearerToken)\n throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSku(input.id, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as ErrorResponse)?.code) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchSku,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n StakeVesuUsdcParams,\n StakeVesuUsdcHookInputParams,\n} from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype StakeVesuUsdcInput = {\n params: StakeVesuUsdcHookInputParams;\n bearerToken: string;\n};\n\n/**\n * Hook for staking USDC in Vesu protocol\n */\nexport function useStakeVesuUsdc(): {\n stakeVesuUsdc: (params: StakeVesuUsdcInput) => void;\n stakeVesuUsdcAsync: (params: StakeVesuUsdcInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, StakeVesuUsdcInput> =\n useMutation({\n mutationFn: async (params: StakeVesuUsdcInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.stakeVesuUsdc({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n stakeVesuUsdc: mutation.mutate,\n stakeVesuUsdcAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { WithdrawVesuUsdcHookInputParams } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype WithdrawVesuUsdcInput = {\n params: WithdrawVesuUsdcHookInputParams;\n bearerToken: string;\n};\n\n/**\n * Hook for withdrawing USDC from Vesu protocol\n */\nexport function useWithdrawVesuUsdc(): {\n withdrawVesuUsdc: (params: WithdrawVesuUsdcInput) => void;\n withdrawVesuUsdcAsync: (params: WithdrawVesuUsdcInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, WithdrawVesuUsdcInput> =\n useMutation({\n mutationFn: async (params: WithdrawVesuUsdcInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.withdrawVesuUsdc({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n withdrawVesuUsdc: mutation.mutate,\n withdrawVesuUsdcAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CallAnyContractParams } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype CallAnyContractInput = {\n params: CallAnyContractParams;\n bearerToken: string;\n};\n\n/**\n * Hook for calling any contract method\n */\nexport function useCallAnyContract(): {\n callAnyContract: (params: CallAnyContractInput) => void;\n callAnyContractAsync: (params: CallAnyContractInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, CallAnyContractInput> =\n useMutation({\n mutationFn: async (params: CallAnyContractInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.callAnyContract({\n params: {\n ...params.params,\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n callAnyContract: mutation.mutate,\n callAnyContractAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n RecordSendTransactionParams,\n Transaction,\n} from \"@chipi-stack/types\";\n\ntype RecordSendTransactionInput = {\n params: RecordSendTransactionParams;\n bearerToken: string;\n};\n\nexport function useRecordSendTransaction(): {\n recordSendTransaction: (input: RecordSendTransactionInput) => void;\n recordSendTransactionAsync: (\n input: RecordSendTransactionInput\n ) => Promise<Transaction>;\n data: Transaction | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n Transaction,\n Error,\n RecordSendTransactionInput\n > = useMutation({\n mutationFn: (input: RecordSendTransactionInput) =>\n chipiSDK.recordSendTransaction({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n recordSendTransaction: mutation.mutate,\n recordSendTransactionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport {\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n} from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetTokenBalanceInput = {\n params?: GetTokenBalanceParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<GetTokenBalanceResponse, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetTokenBalance(input?: GetTokenBalanceInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (params?: GetTokenBalanceParams) => [\n \"chain-token-balance\",\n params?.chainToken ?? null,\n params?.chain ?? null,\n params?.walletPublicKey ?? null,\n params?.externalUserId ?? null,\n ];\n \n const query = useQuery<GetTokenBalanceResponse, Error>({\n queryKey: buildQueryKey(input?.params),\n queryFn: async () => {\n if (!input || !input.params || !input.getBearerToken) throw new Error(\"Input is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(input.params, bearerToken);\n },\n enabled: Boolean(input?.params && input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTokenBalance = async (newInput: GetTokenBalanceInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.params),\n queryFn: async () => {\n if (!newInput || !newInput.getBearerToken || !newInput.params) throw new Error(\"Input is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(newInput.params, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTokenBalance,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { GetUserParams, User, WalletData } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError, ErrorResponse } from \"@chipi-stack/shared\";\n\ntype GetUserInput = {\n params?: GetUserParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<User, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetUser(input?: GetUserInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<User & { chipiWallets?: WalletData[] }, Error>({\n queryKey: [\n \"user\",\n input?.params?.id,\n input?.params?.externalId,\n input?.params?.username,\n input?.params?.phone?.phoneCountryCode,\n input?.params?.phone?.phoneNumber,\n input?.params?.taxId,\n input?.params?.includeStarknetWallet,\n ],\n queryFn: async () => {\n if (!input?.params || !input?.getBearerToken)\n throw new Error(\"externalId and getBearerToken are required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getUser(input.params, bearerToken);\n },\n enabled: Boolean(\n input?.params &&\n input?.getBearerToken &&\n // Use truthy check instead of !== \"\" to handle undefined properly\n (input.params.externalId?.trim() ||\n input.params.username?.trim() ||\n (input.params.phone?.phoneCountryCode !== undefined &&\n input.params.phone?.phoneNumber !== undefined) ||\n input.params.taxId?.trim())\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchUser = async (\n input: GetUserInput\n ): Promise<User & { chipiWallets?: WalletData[] }> => {\n return queryClient.fetchQuery({\n queryKey: [\n \"user\",\n input?.params?.externalId,\n input?.params?.id,\n input?.params?.username,\n input?.params?.phone?.phoneCountryCode,\n input?.params?.phone?.phoneNumber,\n input?.params?.taxId,\n input?.params?.includeStarknetWallet,\n ],\n queryFn: async () => {\n if (!input?.getBearerToken)\n throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n if (!input?.params) throw new Error(\"params are required\");\n return chipiSDK.getUser(input.params, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as ErrorResponse)?.code) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchUser,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CreateUserParams, User } from \"@chipi-stack/types\";\n\ntype CreateUserInput = {\n params: CreateUserParams;\n bearerToken: string;\n};\n\n/**\n * Hook for creating a new user\n */\nexport function useCreateUser(): {\n createUser: (input: CreateUserInput) => void;\n createUserAsync: (input: CreateUserInput) => Promise<User>;\n data: User | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<User, Error, CreateUserInput> = useMutation(\n {\n mutationFn: (input: CreateUserInput) =>\n chipiSDK.createUser(input.params, input.bearerToken),\n }\n );\n\n return {\n createUser: mutation.mutate,\n createUserAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n CreateSessionKeyParams,\n SessionKeyData,\n} from \"@chipi-stack/types\";\n\n/**\n * Hook for creating a session keypair locally.\n *\n * This generates session keys but does NOT register them on-chain.\n * The returned SessionKeyData should be stored by the developer externally\n * (e.g., in Clerk metadata, database, etc.) - the SDK does NOT persist this.\n *\n * After generating, call `useAddSessionKeyToContract` to register the session on-chain.\n *\n * @example\n * ```typescript\n * const { createSessionKey, data: session } = useCreateSessionKey();\n *\n * // Generate session keypair\n * createSessionKey({\n * encryptKey: userEncryptKey,\n * durationSeconds: 21600 // 6 hours (optional, default)\n * });\n *\n * // Store session externally after creation\n * if (session) {\n * await saveToClerk(session);\n * }\n * ```\n */\nexport function useCreateSessionKey(): {\n createSessionKey: (params: CreateSessionKeyParams) => void;\n createSessionKeyAsync: (\n params: CreateSessionKeyParams\n ) => Promise<SessionKeyData>;\n data: SessionKeyData | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n SessionKeyData,\n Error,\n CreateSessionKeyParams\n > = useMutation({\n mutationFn: async (params: CreateSessionKeyParams) =>\n chipiSDK.sessions.createSessionKey(params),\n });\n\n return {\n createSessionKey: mutation.mutate,\n createSessionKeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { AddSessionKeyParams } from \"@chipi-stack/types\";\n\ntype AddSessionKeyInput = {\n params: AddSessionKeyParams;\n bearerToken: string;\n};\n\n/**\n * Hook for registering a session key on the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `add_or_update_session_key` on the CHIPI wallet contract.\n *\n * The session must be registered before it can be used for transactions.\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { addSessionKeyToContract, isLoading } = useAddSessionKeyToContract();\n *\n * // Register session on-chain\n * addSessionKeyToContract({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: [] // empty = all allowed\n * }\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useAddSessionKeyToContract(): {\n addSessionKeyToContract: (input: AddSessionKeyInput) => void;\n addSessionKeyToContractAsync: (input: AddSessionKeyInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, AddSessionKeyInput> =\n useMutation({\n mutationFn: (input: AddSessionKeyInput) =>\n chipiSDK.sessions.addSessionKeyToContract(\n input.params,\n input.bearerToken\n ),\n });\n\n return {\n addSessionKeyToContract: mutation.mutate,\n addSessionKeyToContractAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { RevokeSessionKeyParams } from \"@chipi-stack/types\";\n\ntype RevokeSessionKeyInput = {\n params: RevokeSessionKeyParams;\n bearerToken: string;\n};\n\n/**\n * Hook for revoking a session key from the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `revoke_session_key` on the CHIPI wallet contract.\n *\n * After revocation, the session key can no longer be used for transactions.\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { revokeSessionKey, isLoading } = useRevokeSessionKey();\n *\n * // Revoke a session\n * revokeSessionKey({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useRevokeSessionKey(): {\n revokeSessionKey: (input: RevokeSessionKeyInput) => void;\n revokeSessionKeyAsync: (input: RevokeSessionKeyInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, RevokeSessionKeyInput> =\n useMutation({\n mutationFn: (input: RevokeSessionKeyInput) =>\n chipiSDK.sessions.revokeSessionKey(input.params, input.bearerToken),\n });\n\n return {\n revokeSessionKey: mutation.mutate,\n revokeSessionKeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n GetSessionDataParams,\n SessionDataResponse,\n} from \"@chipi-stack/types\";\n\n/**\n * Hook for querying session data from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n * Returns the on-chain state of a session key including:\n * - Whether it's active\n * - When it expires\n * - Remaining calls\n * - Allowed entrypoints\n *\n * @example\n * ```typescript\n * const { data: sessionData, isLoading } = useGetSessionData({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey\n * });\n *\n * if (sessionData?.isActive) {\n * console.log(`Session has ${sessionData.remainingCalls} calls remaining`);\n * }\n * ```\n */\nexport function useGetSessionData(\n params: GetSessionDataParams | null,\n options?: { enabled?: boolean }\n): {\n data: SessionDataResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n refetch: UseQueryResult<SessionDataResponse, Error>[\"refetch\"];\n} {\n const { chipiSDK } = useChipiContext();\n\n const query: UseQueryResult<SessionDataResponse, Error> = useQuery({\n queryKey: [\n \"sessionData\",\n params?.walletAddress,\n params?.sessionPublicKey,\n ],\n queryFn: () => {\n if (!params) {\n throw new Error(\"Session data params are required\");\n }\n return chipiSDK.sessions.getSessionData(params);\n },\n enabled: options?.enabled !== false && params !== null,\n });\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n isSuccess: query.isSuccess,\n refetch: query.refetch,\n };\n}\n\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { ExecuteWithSessionParams } from \"@chipi-stack/types\";\n\ntype ExecuteWithSessionInput = {\n params: ExecuteWithSessionParams;\n bearerToken: string;\n};\n\n/**\n * Hook for executing a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `useCreateSessionKey`\n * 2. Registered on-chain via `useAddSessionKeyToContract`\n *\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { executeWithSession, isLoading } = useExecuteWithSession();\n *\n * // Execute a transfer using session key (no owner key needed)\n * executeWithSession({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * session: sessionKeyData,\n * calls: [{\n * contractAddress: USDC_ADDRESS,\n * entrypoint: 'transfer',\n * calldata: [recipient, amount, '0x0']\n * }]\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useExecuteWithSession(): {\n executeWithSession: (input: ExecuteWithSessionInput) => void;\n executeWithSessionAsync: (input: ExecuteWithSessionInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, ExecuteWithSessionInput> =\n useMutation({\n mutationFn: (input: ExecuteWithSessionInput) =>\n chipiSDK.executeTransactionWithSession({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n executeWithSession: mutation.mutate,\n executeWithSessionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n"]}
1
+ {"version":3,"sources":["../src/context/ChipiProvider.tsx","../src/hooks/useCreateWallet.ts","../src/hooks/useGetWallet.ts","../src/hooks/useChipiWallet.ts","../src/hooks/useChipiSession.ts","../src/hooks/useMigrateWalletToPasskey.ts","../src/hooks/useTransfer.ts","../src/hooks/useApprove.ts","../src/hooks/useGetTransactionList.ts","../src/hooks/useCreateSkuTransaction.ts","../src/hooks/useGetSkuTransaction.ts","../src/hooks/useGetSkuList.ts","../src/hooks/useGetSku.ts","../src/hooks/useStakeVesuUsdc.ts","../src/hooks/useWithdrawVesuUsdc.ts","../src/hooks/useCallAnyContract.ts","../src/hooks/useRecordSendTransaction.ts","../src/hooks/useGetTokenBalance.ts","../src/hooks/useGetUser.ts","../src/hooks/useCreateUser.ts","../src/hooks/useCreateSessionKey.ts","../src/hooks/useAddSessionKeyToContract.ts","../src/hooks/useRevokeSessionKey.ts","../src/hooks/useGetSessionData.ts","../src/hooks/useExecuteWithSession.ts"],"names":["useQueryClient","useQuery","ChipiApiError","useMutation","useMemo","useCallback","createWalletPasskey","getWalletEncryptKey","input"],"mappings":"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","file":"hooks.mjs","sourcesContent":["import React, { createContext, useContext, ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { ChipiSDK } from \"@chipi-stack/backend\";\nimport type { ChipiSDKConfig } from \"@chipi-stack/types\";\n\ninterface ChipiContextValue {\n chipiSDK: ChipiSDK;\n config: ChipiSDKConfig;\n}\n\nconst ChipiContext = createContext<ChipiContextValue | null>(null);\n\ninterface ChipiProviderProps {\n children: ReactNode;\n config: ChipiSDKConfig;\n}\n\n// Default QueryClient configuration\nconst createDefaultQueryClient = () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000, // 1 minute\n gcTime: 10 * 60 * 1000, // 10 minutes (formerly cacheTime)\n retry: (failureCount, error: any) => {\n // Don't retry on 4xx errors\n if (error?.status >= 400 && error?.status < 500) {\n return false;\n }\n return failureCount < 3;\n },\n },\n mutations: {\n retry: false,\n },\n },\n });\n\n/**\n * Provider component that wraps your app and provides Chipi SDK context with QueryClient\n */\nexport function ChipiProvider({ children, config }: ChipiProviderProps) {\n // Create QueryClient\n const queryClient = React.useMemo(() => createDefaultQueryClient(), []);\n\n const chipiSDK = React.useMemo(() => new ChipiSDK(config), [config]);\n\n const value = React.useMemo(\n () => ({\n chipiSDK,\n config,\n }),\n [chipiSDK, config]\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChipiContext.Provider value={value}>{children}</ChipiContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access Chipi SDK context\n */\nexport function useChipiContext(): ChipiContextValue {\n const context = useContext(ChipiContext);\n\n if (!context) {\n throw new Error(\"useChipiContext must be used within a ChipiProvider\");\n }\n\n return context;\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n CreateWalletParams,\n CreateWalletResponse,\n} from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\n\ntype CreateWalletInput = {\n params: CreateWalletParams;\n bearerToken: string;\n};\n\n/**\n * Hook for creating a new wallet\n */\nexport function useCreateWallet(): {\n createWallet: (input: CreateWalletInput) => void;\n createWalletAsync: (\n input: CreateWalletInput\n ) => Promise<CreateWalletResponse>;\n data: CreateWalletResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n CreateWalletResponse,\n Error,\n CreateWalletInput\n > = useMutation({\n mutationFn: async (input: CreateWalletInput) => {\n let encryptKey = input.params.encryptKey;\n\n // If usePasskey is true, create passkey and get encryptKey\n if (input.params.usePasskey) {\n if (!input.params.externalUserId) {\n throw new Error(\"externalUserId is required when using passkey\");\n }\n\n try {\n const passkeyResult = await createWalletPasskey(\n input.params.externalUserId,\n input.params.externalUserId // Using externalUserId as userName\n );\n encryptKey = passkeyResult.encryptKey;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Passkey creation failed: ${error.message}`);\n }\n throw new Error(\"Failed to create passkey for wallet\");\n }\n }\n\n return chipiSDK.createWallet({\n params: {\n ...input.params,\n encryptKey: encryptKey!,\n },\n bearerToken: input.bearerToken,\n });\n },\n });\n\n return {\n createWallet: mutation.mutate,\n createWalletAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { GetWalletParams, GetWalletResponse } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetWalletInput = {\n params?: GetWalletParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<\n UseQueryOptions<GetWalletResponse | null, Error>,\n \"queryKey\" | \"queryFn\"\n >;\n};\n\nexport function useGetWallet(input?: GetWalletInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"wallet\", input?.params?.externalUserId],\n queryFn: async () => {\n if (!input || !input.params || !input.getBearerToken)\n throw new Error(\"Input is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet(input.params, bearerToken);\n },\n enabled: Boolean(\n input?.params?.externalUserId &&\n input?.getBearerToken &&\n input.params.externalUserId.trim() !== \"\"\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchWallet = async (\n newInput: GetWalletInput\n ): Promise<GetWalletResponse | null> => {\n return queryClient.fetchQuery({\n queryKey: [\"wallet\", newInput?.params?.externalUserId],\n queryFn: async () => {\n if (!newInput || !newInput.getBearerToken || !newInput.params)\n throw new Error(\"Input is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet(newInput.params, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchWallet,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\nimport type {\n WalletType,\n GetWalletResponse,\n CreateWalletResponse,\n GetTokenBalanceResponse,\n ChainToken,\n} from \"@chipi-stack/types\";\n\n/**\n * Configuration for useChipiWallet hook\n */\nexport interface UseChipiWalletConfig {\n /** External user ID (e.g., from Clerk, Firebase, etc.) */\n externalUserId: string | null | undefined;\n /** Function to get the bearer token for API calls */\n getBearerToken: () => Promise<string | null | undefined>;\n /** Default token for balance display (defaults to USDC) */\n defaultToken?: ChainToken;\n /** Whether to automatically fetch wallet on mount */\n enabled?: boolean;\n}\n\n/**\n * Extended wallet response with additional computed properties\n */\nexport interface ChipiWalletData extends GetWalletResponse {\n /** Whether this wallet supports session keys */\n supportsSessionKeys: boolean;\n /** Formatted short address for display */\n shortAddress: string;\n}\n\n/**\n * Return type for useChipiWallet hook\n */\nexport interface UseChipiWalletReturn {\n // Wallet data\n /** The user's wallet data, null if not found, undefined if loading */\n wallet: ChipiWalletData | null | undefined;\n /** Whether the user has a wallet */\n hasWallet: boolean;\n /** Whether the wallet is currently being fetched */\n isLoadingWallet: boolean;\n /** Error from fetching wallet */\n walletError: Error | null;\n\n // Balance data\n /** The wallet's balance for the default token */\n balance: GetTokenBalanceResponse | undefined;\n /** Formatted balance string (e.g., \"100.50\") */\n formattedBalance: string;\n /** Whether balance is loading */\n isLoadingBalance: boolean;\n\n // Create wallet\n /** Create a new wallet */\n\n createWallet: (params: {\n encryptKey: string;\n walletType?: WalletType;\n }) => Promise<CreateWalletResponse>;\n /** Whether wallet creation is in progress */\n isCreating: boolean;\n /** Data from the last wallet creation */\n createdWallet: CreateWalletResponse | undefined;\n\n // Actions\n /** Refetch the wallet data */\n refetchWallet: () => Promise<void>;\n /** Refetch the balance */\n refetchBalance: () => Promise<void>;\n /** Refetch both wallet and balance */\n refetchAll: () => Promise<void>;\n}\n\n/**\n * All-in-one wallet hook for Chipi SDK.\n *\n * Combines wallet fetching, creation, and balance checking into a single hook\n * for simplified wallet management.\n *\n * @example\n * ```tsx\n * import { useAuth } from \"@clerk/nextjs\";\n * import { useChipiWallet } from \"@chipi-stack/nextjs\";\n *\n * function WalletComponent() {\n * const { userId, getToken } = useAuth();\n * const {\n * wallet,\n * hasWallet,\n * balance,\n * formattedBalance,\n * createWallet,\n * isCreating,\n * isLoadingWallet,\n * } = useChipiWallet({\n * externalUserId: userId,\n * getBearerToken: getToken,\n * });\n *\n * if (isLoadingWallet) return <div>Loading...</div>;\n *\n * if (!hasWallet) {\n * return (\n * <button\n * onClick={() => createWallet({ encryptKey: \"1234\" })}\n * disabled={isCreating}\n * >\n * {isCreating ? \"Creating...\" : \"Create Wallet\"}\n * </button>\n * );\n * }\n *\n * return (\n * <div>\n * <p>Address: {wallet?.shortAddress}</p>\n * <p>Balance: ${formattedBalance} USDC</p>\n * <p>Session Keys: {wallet?.supportsSessionKeys ? \"Yes\" : \"No\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useChipiWallet(\n config: UseChipiWalletConfig\n): UseChipiWalletReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const {\n externalUserId,\n getBearerToken,\n defaultToken = \"USDC\",\n enabled = true,\n } = config;\n\n const isEnabled = Boolean(\n enabled && externalUserId && externalUserId.trim() !== \"\"\n );\n\n // ============ Wallet Query ============\n const walletQuery = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"chipi-wallet\", externalUserId],\n queryFn: async () => {\n if (!externalUserId) return null;\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet({ externalUserId }, bearerToken);\n },\n enabled: isEnabled,\n retry: (failureCount, error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n\n // ============ Balance Query ============\n const walletPublicKey = walletQuery.data?.publicKey;\n\n const balanceQuery = useQuery<GetTokenBalanceResponse, Error>({\n queryKey: [\"chipi-wallet-balance\", walletPublicKey, defaultToken],\n queryFn: async () => {\n if (!walletPublicKey) throw new Error(\"No wallet\");\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(\n {\n chain: \"STARKNET\",\n chainToken: defaultToken,\n walletPublicKey,\n },\n bearerToken\n );\n },\n enabled: Boolean(walletPublicKey),\n retry: (failureCount, error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n\n // ============ Create Wallet Mutation ============\n const createWalletMutation = useMutation<\n CreateWalletResponse,\n Error,\n { encryptKey: string; walletType?: WalletType }\n >({\n mutationFn: async ({ encryptKey, walletType = \"CHIPI\" }) => {\n if (!externalUserId) throw new Error(\"External user ID is required\");\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n return chipiSDK.createWallet({\n params: {\n encryptKey,\n externalUserId,\n walletType,\n },\n bearerToken,\n });\n },\n onSuccess: () => {\n // Invalidate wallet query to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", externalUserId],\n });\n },\n });\n\n // ============ Computed Values ============\n const wallet = useMemo<ChipiWalletData | null | undefined>(() => {\n if (walletQuery.isLoading) return undefined;\n if (!walletQuery.data) return null;\n\n const data = walletQuery.data;\n return {\n ...data,\n supportsSessionKeys: data.walletType === \"CHIPI\",\n shortAddress: formatAddress(data.publicKey),\n };\n }, [walletQuery.data, walletQuery.isLoading]);\n\n const formattedBalance = useMemo(() => {\n if (!balanceQuery.data?.balance) return \"0.00\";\n const num = Number(balanceQuery.data.balance);\n return num.toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits:\n defaultToken === \"ETH\" || defaultToken === \"STRK\" ? 6 : 2,\n });\n }, [balanceQuery.data, defaultToken]);\n\n // ============ Actions ============\n const refetchWallet = useCallback(async () => {\n await walletQuery.refetch();\n }, [walletQuery]);\n\n const refetchBalance = useCallback(async () => {\n await balanceQuery.refetch();\n }, [balanceQuery]);\n\n const refetchAll = useCallback(async () => {\n await Promise.all([walletQuery.refetch(), balanceQuery.refetch()]);\n }, [walletQuery, balanceQuery]);\n\n const createWallet = useCallback(\n async (params: { encryptKey: string; walletType?: WalletType }) => {\n return createWalletMutation.mutateAsync(params);\n },\n [createWalletMutation]\n );\n\n return {\n // Wallet data\n wallet,\n hasWallet: wallet !== null && wallet !== undefined,\n isLoadingWallet: walletQuery.isLoading,\n walletError: walletQuery.error,\n\n // Balance data\n balance: balanceQuery.data,\n formattedBalance,\n isLoadingBalance: balanceQuery.isLoading,\n\n // Create wallet\n createWallet,\n isCreating: createWalletMutation.isPending,\n createdWallet: createWalletMutation.data,\n\n // Actions\n refetchWallet,\n refetchBalance,\n refetchAll,\n };\n}\n\n/**\n * Format a wallet address for display\n */\nfunction formatAddress(address: string, chars = 6): string {\n if (!address || address.length < chars * 2) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState, useEffect } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n SessionKeyData,\n SessionConfig,\n SessionDataResponse,\n WalletData,\n WalletType,\n CreateSessionKeyParams,\n Call,\n} from \"@chipi-stack/types\";\n\n/**\n * Wallet data with optional wallet type for session operations\n */\nexport interface SessionWallet extends WalletData {\n walletType?: WalletType;\n}\n\n/**\n * Configuration for useChipiSession hook\n */\nexport interface UseChipiSessionConfig {\n /** Wallet data (must be a CHIPI wallet for session support) */\n wallet: SessionWallet | null | undefined;\n /** Encryption key (user's PIN) for signing operations */\n encryptKey: string;\n /** Function to get the bearer token for API calls */\n getBearerToken: () => Promise<string | null | undefined>;\n /** Previously stored session data (from Clerk metadata, database, etc.) */\n storedSession?: SessionKeyData | null;\n /** Callback fired when a new session is created (for persistence) */\n onSessionCreated?: (session: SessionKeyData) => void | Promise<void>;\n /** Session duration in seconds (default: 6 hours) */\n defaultDurationSeconds?: number;\n /** Default max calls for session registration (default: 1000) */\n defaultMaxCalls?: number;\n /** Whether to auto-check session status on mount */\n autoCheckStatus?: boolean;\n}\n\n/**\n * Session lifecycle state\n */\nexport type SessionState = \n | \"none\" // No session exists\n | \"created\" // Session created locally, not registered on-chain\n | \"active\" // Session registered and active on-chain\n | \"expired\" // Session has expired\n | \"revoked\"; // Session has been revoked\n\n/**\n * Return type for useChipiSession hook\n */\nexport interface UseChipiSessionReturn {\n // Session data\n /** Current session key data */\n session: SessionKeyData | null;\n /** On-chain session status (from contract query) */\n sessionStatus: SessionDataResponse | undefined;\n /** Current session lifecycle state */\n sessionState: SessionState;\n /** Whether there is an active, usable session */\n hasActiveSession: boolean;\n /** Whether the session has expired */\n isSessionExpired: boolean;\n /** Remaining calls available for the session */\n remainingCalls: number | undefined;\n /** Whether the wallet supports sessions (CHIPI wallet) */\n supportsSession: boolean;\n\n // Actions\n /** Create a new session keypair locally (does NOT register on-chain) */\n createSession: (config?: Partial<CreateSessionKeyParams>) => Promise<SessionKeyData>;\n /** Register the current session on the blockchain */\n registerSession: (config?: Partial<SessionConfig>) => Promise<string>;\n /** Revoke the current session from the blockchain */\n revokeSession: () => Promise<string>;\n /** Execute calls using the session key (no owner signature needed) */\n executeWithSession: (calls: Call[]) => Promise<string>;\n /** Clear the current session from local state */\n clearSession: () => void;\n /** Refresh the on-chain session status */\n refetchStatus: () => Promise<void>;\n\n // Loading states\n isCreating: boolean;\n isRegistering: boolean;\n isRevoking: boolean;\n isExecuting: boolean;\n isLoadingStatus: boolean;\n\n // Errors\n error: Error | null;\n}\n\n/**\n * All-in-one session management hook for Chipi SDK.\n *\n * Combines session creation, registration, execution, and revocation\n * into a single unified API. Session keys enable gasless transactions\n * without requiring the owner's private key for each operation.\n *\n * **Important:** Sessions only work with CHIPI wallets. ARGENT wallets\n * do not support session keys.\n *\n * @example\n * ```tsx\n * import { useAuth } from \"@clerk/nextjs\";\n * import { useChipiWallet, useChipiSession } from \"@chipi-stack/nextjs\";\n *\n * function SessionComponent() {\n * const { userId, getToken } = useAuth();\n * const [pin, setPin] = useState(\"\");\n * const { wallet } = useChipiWallet({ externalUserId: userId, getBearerToken: getToken });\n *\n * const {\n * session,\n * hasActiveSession,\n * sessionState,\n * createSession,\n * registerSession,\n * executeWithSession,\n * isCreating,\n * isRegistering,\n * } = useChipiSession({\n * wallet,\n * encryptKey: pin,\n * getBearerToken: getToken,\n * onSessionCreated: async (newSession) => {\n * // Persist to Clerk metadata or database\n * await saveSessionToClerk(newSession);\n * },\n * });\n *\n * const handleSetupSession = async () => {\n * // Step 1: Create session locally\n * await createSession();\n * // Step 2: Register on-chain\n * await registerSession();\n * };\n *\n * const handleTransfer = async () => {\n * // Execute transfer using session (no PIN needed after setup)\n * await executeWithSession([{\n * contractAddress: USDC_ADDRESS,\n * entrypoint: \"transfer\",\n * calldata: [recipient, amount, \"0x0\"],\n * }]);\n * };\n *\n * return (\n * <div>\n * <p>Session State: {sessionState}</p>\n * {!hasActiveSession ? (\n * <button onClick={handleSetupSession} disabled={isCreating || isRegistering}>\n * Setup Session\n * </button>\n * ) : (\n * <button onClick={handleTransfer}>\n * Transfer (Gasless)\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useChipiSession(config: UseChipiSessionConfig): UseChipiSessionReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const {\n wallet,\n encryptKey,\n getBearerToken,\n storedSession,\n onSessionCreated,\n defaultDurationSeconds = 21600, // 6 hours\n defaultMaxCalls = 1000,\n autoCheckStatus = true,\n } = config;\n\n // ============ Local Session State ============\n const [localSession, setLocalSession] = useState<SessionKeyData | null>(\n storedSession ?? null\n );\n const [error, setError] = useState<Error | null>(null);\n\n // Sync stored session when it changes\n useEffect(() => {\n if (storedSession) {\n setLocalSession(storedSession);\n }\n }, [storedSession]);\n\n // ============ Computed Values ============\n const supportsSession = useMemo(() => {\n if (!wallet) return false;\n // CHIPI wallets support sessions, ARGENT wallets don't\n // If walletType is undefined (legacy), assume it doesn't support sessions\n return wallet.walletType === \"CHIPI\";\n }, [wallet]);\n\n // ============ Session Status Query ============\n const sessionStatusQuery = useQuery<SessionDataResponse | null, Error>({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n queryFn: async () => {\n if (!wallet?.publicKey || !localSession?.publicKey) return null;\n return chipiSDK.sessions.getSessionData({\n walletAddress: wallet.publicKey,\n sessionPublicKey: localSession.publicKey,\n });\n },\n enabled: Boolean(\n autoCheckStatus &&\n wallet?.publicKey &&\n localSession?.publicKey &&\n supportsSession\n ),\n staleTime: 30000, // 30 seconds\n });\n\n // ============ Session State Computation ============\n const sessionState = useMemo<SessionState>(() => {\n if (!localSession) return \"none\";\n \n const status = sessionStatusQuery.data;\n \n // If we have status data from the contract\n if (status) {\n if (!status.isActive) return \"revoked\";\n if (status.validUntil * 1000 < Date.now()) return \"expired\";\n if (status.remainingCalls <= 0) return \"expired\";\n return \"active\";\n }\n \n // No status data yet - check local expiration\n if (localSession.validUntil * 1000 < Date.now()) return \"expired\";\n \n // Session exists locally but no on-chain status - assume created but not registered\n return \"created\";\n }, [localSession, sessionStatusQuery.data]);\n\n const hasActiveSession = sessionState === \"active\";\n const isSessionExpired = sessionState === \"expired\";\n const remainingCalls = sessionStatusQuery.data?.remainingCalls;\n\n // ============ Create Session Mutation ============\n const createSessionMutation = useMutation<SessionKeyData, Error, Partial<CreateSessionKeyParams>>({\n mutationFn: async (params = {}) => {\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions. Only CHIPI wallets support session keys.\");\n\n const sessionData = chipiSDK.sessions.createSessionKey({\n encryptKey,\n durationSeconds: params.durationSeconds ?? defaultDurationSeconds,\n });\n\n return sessionData;\n },\n onSuccess: async (sessionData) => {\n setLocalSession(sessionData);\n setError(null);\n \n // Call the persistence callback if provided\n if (onSessionCreated) {\n await onSessionCreated(sessionData);\n }\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Register Session Mutation ============\n const registerSessionMutation = useMutation<string, Error, Partial<SessionConfig>>({\n mutationFn: async (sessionConfig = {}) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to register. Call createSession first.\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.sessions.addSessionKeyToContract(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionConfig: {\n sessionPublicKey: localSession.publicKey,\n validUntil: sessionConfig.validUntil ?? localSession.validUntil,\n maxCalls: sessionConfig.maxCalls ?? defaultMaxCalls,\n allowedEntrypoints: sessionConfig.allowedEntrypoints ?? [],\n },\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Invalidate session status to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Revoke Session Mutation ============\n const revokeSessionMutation = useMutation<string, Error, void>({\n mutationFn: async () => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to revoke\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession) throw new Error(\"Wallet does not support sessions\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.sessions.revokeSessionKey(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionPublicKey: localSession.publicKey,\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Invalidate session status\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Execute With Session Mutation ============\n const executeWithSessionMutation = useMutation<string, Error, Call[]>({\n mutationFn: async (calls) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No active session\");\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!hasActiveSession) throw new Error(\"Session is not active. Register the session first.\");\n\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n\n const txHash = await chipiSDK.executeTransactionWithSession({\n params: {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n session: localSession,\n calls,\n },\n bearerToken,\n });\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n // Refetch status to update remaining calls\n queryClient.invalidateQueries({\n queryKey: [\"chipi-session-status\", wallet?.publicKey, localSession?.publicKey],\n });\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Actions ============\n const createSession = useCallback(\n async (params?: Partial<CreateSessionKeyParams>) => {\n return createSessionMutation.mutateAsync(params ?? {});\n },\n [createSessionMutation]\n );\n\n const registerSession = useCallback(\n async (sessionConfig?: Partial<SessionConfig>) => {\n return registerSessionMutation.mutateAsync(sessionConfig ?? {});\n },\n [registerSessionMutation]\n );\n\n const revokeSession = useCallback(async () => {\n return revokeSessionMutation.mutateAsync();\n }, [revokeSessionMutation]);\n\n const executeWithSession = useCallback(\n async (calls: Call[]) => {\n return executeWithSessionMutation.mutateAsync(calls);\n },\n [executeWithSessionMutation]\n );\n\n const clearSession = useCallback(() => {\n setLocalSession(null);\n setError(null);\n }, []);\n\n const refetchStatus = useCallback(async () => {\n await sessionStatusQuery.refetch();\n }, [sessionStatusQuery]);\n\n // ============ Combined Error ============\n const combinedError = useMemo(() => {\n return (\n error ||\n createSessionMutation.error ||\n registerSessionMutation.error ||\n revokeSessionMutation.error ||\n executeWithSessionMutation.error ||\n sessionStatusQuery.error ||\n null\n );\n }, [\n error,\n createSessionMutation.error,\n registerSessionMutation.error,\n revokeSessionMutation.error,\n executeWithSessionMutation.error,\n sessionStatusQuery.error,\n ]);\n\n return {\n // Session data\n session: localSession,\n sessionStatus: sessionStatusQuery.data ?? undefined,\n sessionState,\n hasActiveSession,\n isSessionExpired,\n remainingCalls,\n supportsSession,\n\n // Actions\n createSession,\n registerSession,\n revokeSession,\n executeWithSession,\n clearSession,\n refetchStatus,\n\n // Loading states\n isCreating: createSessionMutation.isPending,\n isRegistering: registerSessionMutation.isPending,\n isRevoking: revokeSessionMutation.isPending,\n isExecuting: executeWithSessionMutation.isPending,\n isLoadingStatus: sessionStatusQuery.isLoading,\n\n // Errors\n error: combinedError,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n MigrateWalletToPasskeyParams,\n WalletData,\n} from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\nimport { decryptPrivateKey, encryptPrivateKey } from \"@chipi-stack/backend\";\n\ntype MigrateWalletToPasskeyInput = MigrateWalletToPasskeyParams & {\n bearerToken: string;\n};\n\ninterface MigrateWalletToPasskeyResult {\n success: boolean;\n wallet: WalletData;\n credentialId: string;\n}\n\n/**\n * Hook for migrating a wallet from encryptKey (PIN) to passkey authentication\n */\nexport function useMigrateWalletToPasskey(): {\n migrateWalletToPasskey: (input: MigrateWalletToPasskeyInput) => void;\n migrateWalletToPasskeyAsync: (\n input: MigrateWalletToPasskeyInput\n ) => Promise<MigrateWalletToPasskeyResult>;\n data: MigrateWalletToPasskeyResult | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n MigrateWalletToPasskeyResult,\n Error,\n MigrateWalletToPasskeyInput\n > = useMutation({\n mutationFn: async (input: MigrateWalletToPasskeyInput) => {\n const { wallet, oldEncryptKey, externalUserId, bearerToken } = input;\n\n try {\n // Step 1: Create new passkey and get new encryptKey\n const passkeyResult = await createWalletPasskey(\n externalUserId,\n externalUserId // Using externalUserId as userName\n );\n\n // Step 2: Decrypt private key with old encryptKey\n let decryptedPrivateKey: string;\n try {\n decryptedPrivateKey = decryptPrivateKey(\n wallet.encryptedPrivateKey,\n oldEncryptKey\n );\n } catch (error) {\n throw new Error(\n \"Failed to decrypt wallet with provided encryptKey. Please verify your PIN/password is correct.\"\n );\n }\n\n // Step 3: Re-encrypt with new passkey-derived encryptKey\n const newEncryptedPrivateKey = encryptPrivateKey(\n decryptedPrivateKey,\n passkeyResult.encryptKey\n );\n\n // Step 4: Update wallet in backend\n // Note: This requires an API endpoint to update the encrypted private key\n // For now, we'll construct the updated wallet object\n // You may need to add an actual API call here depending on your backend implementation\n\n const updatedWallet: WalletData = {\n ...wallet,\n encryptedPrivateKey: newEncryptedPrivateKey,\n };\n\n // TODO: Add API call to update wallet if your backend has such an endpoint\n // await chipiSDK.wallets.updateWalletEncryption({\n // publicKey: wallet.publicKey,\n // encryptedPrivateKey: newEncryptedPrivateKey,\n // bearerToken,\n // });\n\n return {\n success: true,\n wallet: updatedWallet,\n credentialId: passkeyResult.credentialId,\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Migration failed: ${error.message}`);\n }\n throw new Error(\"Failed to migrate wallet to passkey\");\n }\n },\n });\n\n return {\n migrateWalletToPasskey: mutation.mutate,\n migrateWalletToPasskeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { TransferHookInput } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype TransferInput = { params: TransferHookInput; bearerToken: string };\n\n/**\n * Hook for transferring tokens\n */\nexport function useTransfer(): {\n transfer: (input: TransferInput) => void;\n transferAsync: (input: TransferInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, TransferInput> = useMutation(\n {\n mutationFn: async (input: TransferInput) => {\n let encryptKey = input.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (input.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.transfer({\n params: {\n ...input.params,\n amount: String(input.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: input.bearerToken,\n });\n },\n }\n );\n\n return {\n transfer: mutation.mutate,\n transferAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { ApproveHookInput } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype ApproveInput = {\n params: ApproveHookInput;\n bearerToken: string;\n};\n\n/**\n * Hook for approving token spending\n */\nexport function useApprove(): {\n approve: (params: ApproveInput) => void;\n approveAsync: (params: ApproveInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, ApproveInput> = useMutation({\n mutationFn: async (params: ApproveInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Passkey authentication failed: ${error.message}`);\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.approve({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n approve: mutation.mutate,\n approveAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { PaginatedResponse, Transaction, GetTransactionListQuery } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype TransactionListInput = {\n query: GetTransactionListQuery;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<PaginatedResponse<Transaction>, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetTransactionList(input?: TransactionListInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (q?: GetTransactionListQuery) => [\n \"transaction-list\",\n q?.page ?? 1,\n q?.limit ?? 10,\n q?.calledFunction ?? null,\n q?.walletAddress,\n q?.day ?? null,\n q?.month ?? null,\n q?.year ?? null,\n ];\n \n const query = useQuery<PaginatedResponse<Transaction>, Error>({\n queryKey: buildQueryKey(input?.query),\n queryFn: async () => {\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionList(input.query, bearerToken);\n },\n enabled: Boolean(input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n\n return failureCount < 3;\n },\n ...input?.queryOptions\n });\n\n const fetchTransactionList = async (newInput: TransactionListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.query),\n queryFn: async () => {\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionList(newInput.query, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransactionList,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport { CreateSkuTransactionParams, SkuTransaction } from \"@chipi-stack/types\";\n\ntype CreateSkuTransactionInput = { \n params: CreateSkuTransactionParams; \n bearerToken: string; \n};\n\n/**\n * Hook for creating SKU transactions\n */\nexport function useCreateSkuTransaction(): {\n createSkuTransaction: (input: CreateSkuTransactionInput) => void;\n createSkuTransactionAsync: (input: CreateSkuTransactionInput) => Promise<SkuTransaction>;\n data: SkuTransaction | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<SkuTransaction, Error, CreateSkuTransactionInput> = useMutation({\n mutationFn: (input: CreateSkuTransactionInput) =>\n chipiSDK.createSkuTransaction({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n createSkuTransaction: mutation.mutate,\n createSkuTransactionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport {\n SkuTransaction,\n} from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\n\ntype GetSkuTransactionInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<SkuTransaction, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetSkuTransaction(input?: GetSkuTransactionInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n \n const query = useQuery<SkuTransaction, Error>({\n queryKey: [\"sku-transaction\", input?.id],\n queryFn: async () => {\n if (!input?.id) throw new Error(\"id is required\");\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.skuTransactions.getSkuTransaction(input.id, bearerToken);\n },\n enabled: Boolean(input?.id && input?.getBearerToken),\n ...input?.queryOptions\n });\n\n const fetchSkuTransaction = async (newInput: GetSkuTransactionInput) => {\n return queryClient.fetchQuery({\n queryKey: [\"sku-transaction\", newInput?.id],\n queryFn: async () => {\n if (!newInput?.id) throw new Error(\"id is required\");\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.skuTransactions.getSkuTransaction(newInput.id, bearerToken);\n },\n });\n };\n\n return {\n ...query,\n fetchSkuTransaction,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { PaginatedResponse, Sku, GetSkuListQuery } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype SkuListInput = {\n query: GetSkuListQuery;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<PaginatedResponse<Sku>, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetSkuList(input?: SkuListInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (q?: GetSkuListQuery) => [\n \"available-skus\",\n q?.page ?? 1,\n q?.limit ?? 10,\n q?.offset ?? 0,\n q?.provider ?? null,\n q?.category ?? null,\n ];\n \n const query = useQuery<PaginatedResponse<Sku>, Error>({\n queryKey: buildQueryKey(input?.query),\n queryFn: async () => {\n if (!input?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSkuList(input.query, bearerToken);\n },\n enabled: Boolean(input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n\n return failureCount < 3;\n },\n ...input?.queryOptions\n });\n\n const fetchSkuList = async (newInput: SkuListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.query),\n queryFn: async () => {\n if (!newInput?.getBearerToken) throw new Error(\"getBearerToken is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSkuList(newInput.query, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchSkuList,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Sku } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError, ErrorResponse } from \"@chipi-stack/shared\";\n\ntype GetSkuInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Sku, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetSku(input?: GetSkuInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<Sku, Error>({\n queryKey: [\"sku\", input?.id],\n queryFn: async () => {\n if (!input?.id || !input?.getBearerToken)\n throw new Error(\"id and getBearerToken are required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSku(input.id, bearerToken);\n },\n enabled: Boolean(\n input?.id && input?.getBearerToken && input.id.trim() !== \"\"\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchSku = async (input: GetSkuInput): Promise<Sku> => {\n return queryClient.fetchQuery({\n queryKey: [\"sku\", input?.id],\n queryFn: async () => {\n if (!input?.getBearerToken)\n throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getSku(input.id, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as ErrorResponse)?.code) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchSku,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n StakeVesuUsdcParams,\n StakeVesuUsdcHookInputParams,\n} from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype StakeVesuUsdcInput = {\n params: StakeVesuUsdcHookInputParams;\n bearerToken: string;\n};\n\n/**\n * Hook for staking USDC in Vesu protocol\n */\nexport function useStakeVesuUsdc(): {\n stakeVesuUsdc: (params: StakeVesuUsdcInput) => void;\n stakeVesuUsdcAsync: (params: StakeVesuUsdcInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, StakeVesuUsdcInput> =\n useMutation({\n mutationFn: async (params: StakeVesuUsdcInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.stakeVesuUsdc({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n stakeVesuUsdc: mutation.mutate,\n stakeVesuUsdcAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { WithdrawVesuUsdcHookInputParams } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype WithdrawVesuUsdcInput = {\n params: WithdrawVesuUsdcHookInputParams;\n bearerToken: string;\n};\n\n/**\n * Hook for withdrawing USDC from Vesu protocol\n */\nexport function useWithdrawVesuUsdc(): {\n withdrawVesuUsdc: (params: WithdrawVesuUsdcInput) => void;\n withdrawVesuUsdcAsync: (params: WithdrawVesuUsdcInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, WithdrawVesuUsdcInput> =\n useMutation({\n mutationFn: async (params: WithdrawVesuUsdcInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.withdrawVesuUsdc({\n params: {\n ...params.params,\n amount: String(params.params.amount),\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n withdrawVesuUsdc: mutation.mutate,\n withdrawVesuUsdcAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CallAnyContractParams } from \"@chipi-stack/types\";\nimport { getWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\ntype CallAnyContractInput = {\n params: CallAnyContractParams;\n bearerToken: string;\n};\n\n/**\n * Hook for calling any contract method\n */\nexport function useCallAnyContract(): {\n callAnyContract: (params: CallAnyContractInput) => void;\n callAnyContractAsync: (params: CallAnyContractInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, CallAnyContractInput> =\n useMutation({\n mutationFn: async (params: CallAnyContractInput) => {\n let encryptKey = params.params.encryptKey;\n\n // If usePasskey is true, authenticate with passkey to get encryptKey\n if (params.params.usePasskey) {\n try {\n const key = await getWalletEncryptKey();\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Passkey authentication failed: ${error.message}`\n );\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n return chipiSDK.callAnyContract({\n params: {\n ...params.params,\n encryptKey: encryptKey!,\n },\n bearerToken: params.bearerToken,\n });\n },\n });\n\n return {\n callAnyContract: mutation.mutate,\n callAnyContractAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n RecordSendTransactionParams,\n Transaction,\n} from \"@chipi-stack/types\";\n\ntype RecordSendTransactionInput = {\n params: RecordSendTransactionParams;\n bearerToken: string;\n};\n\nexport function useRecordSendTransaction(): {\n recordSendTransaction: (input: RecordSendTransactionInput) => void;\n recordSendTransactionAsync: (\n input: RecordSendTransactionInput\n ) => Promise<Transaction>;\n data: Transaction | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n Transaction,\n Error,\n RecordSendTransactionInput\n > = useMutation({\n mutationFn: (input: RecordSendTransactionInput) =>\n chipiSDK.recordSendTransaction({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n recordSendTransaction: mutation.mutate,\n recordSendTransactionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport {\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n} from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetTokenBalanceInput = {\n params?: GetTokenBalanceParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<GetTokenBalanceResponse, Error>, 'queryKey' | 'queryFn'>;\n};\n\nexport function useGetTokenBalance(input?: GetTokenBalanceInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (params?: GetTokenBalanceParams) => [\n \"chain-token-balance\",\n params?.chainToken ?? null,\n params?.chain ?? null,\n params?.walletPublicKey ?? null,\n params?.externalUserId ?? null,\n ];\n \n const query = useQuery<GetTokenBalanceResponse, Error>({\n queryKey: buildQueryKey(input?.params),\n queryFn: async () => {\n if (!input || !input.params || !input.getBearerToken) throw new Error(\"Input is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(input.params, bearerToken);\n },\n enabled: Boolean(input?.params && input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTokenBalance = async (newInput: GetTokenBalanceInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput?.params),\n queryFn: async () => {\n if (!newInput || !newInput.getBearerToken || !newInput.params) throw new Error(\"Input is required\");\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTokenBalance(newInput.params, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTokenBalance,\n };\n}\n","\"use client\";\n\nimport {\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { GetUserParams, User, WalletData } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError, ErrorResponse } from \"@chipi-stack/shared\";\n\ntype GetUserInput = {\n params?: GetUserParams;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<User, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetUser(input?: GetUserInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<User & { chipiWallets?: WalletData[] }, Error>({\n queryKey: [\n \"user\",\n input?.params?.id,\n input?.params?.externalId,\n input?.params?.username,\n input?.params?.phone?.phoneCountryCode,\n input?.params?.phone?.phoneNumber,\n input?.params?.taxId,\n input?.params?.includeStarknetWallet,\n ],\n queryFn: async () => {\n if (!input?.params || !input?.getBearerToken)\n throw new Error(\"externalId and getBearerToken are required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getUser(input.params, bearerToken);\n },\n enabled: Boolean(\n input?.params &&\n input?.getBearerToken &&\n // Use truthy check instead of !== \"\" to handle undefined properly\n (input.params.externalId?.trim() ||\n input.params.username?.trim() ||\n (input.params.phone?.phoneCountryCode !== undefined &&\n input.params.phone?.phoneNumber !== undefined) ||\n input.params.taxId?.trim())\n ),\n retry: (failureCount: number, error: Error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchUser = async (\n input: GetUserInput\n ): Promise<User & { chipiWallets?: WalletData[] }> => {\n return queryClient.fetchQuery({\n queryKey: [\n \"user\",\n input?.params?.externalId,\n input?.params?.id,\n input?.params?.username,\n input?.params?.phone?.phoneCountryCode,\n input?.params?.phone?.phoneNumber,\n input?.params?.taxId,\n input?.params?.includeStarknetWallet,\n ],\n queryFn: async () => {\n if (!input?.getBearerToken)\n throw new Error(\"getBearerToken is required\");\n const bearerToken = await input.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n if (!input?.params) throw new Error(\"params are required\");\n return chipiSDK.getUser(input.params, bearerToken);\n },\n retry: (failureCount, error) => {\n // Don't retry on API errors (errors with status codes like 404, 400, etc.)\n if (error instanceof ChipiApiError || (error as ErrorResponse)?.code) {\n return false;\n }\n // Retry on network errors (no status code) up to 3 times\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchUser,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CreateUserParams, User } from \"@chipi-stack/types\";\n\ntype CreateUserInput = {\n params: CreateUserParams;\n bearerToken: string;\n};\n\n/**\n * Hook for creating a new user\n */\nexport function useCreateUser(): {\n createUser: (input: CreateUserInput) => void;\n createUserAsync: (input: CreateUserInput) => Promise<User>;\n data: User | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<User, Error, CreateUserInput> = useMutation(\n {\n mutationFn: (input: CreateUserInput) =>\n chipiSDK.createUser(input.params, input.bearerToken),\n }\n );\n\n return {\n createUser: mutation.mutate,\n createUserAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n CreateSessionKeyParams,\n SessionKeyData,\n} from \"@chipi-stack/types\";\n\n/**\n * Hook for creating a session keypair locally.\n *\n * This generates session keys but does NOT register them on-chain.\n * The returned SessionKeyData should be stored by the developer externally\n * (e.g., in Clerk metadata, database, etc.) - the SDK does NOT persist this.\n *\n * After generating, call `useAddSessionKeyToContract` to register the session on-chain.\n *\n * @example\n * ```typescript\n * const { createSessionKey, data: session } = useCreateSessionKey();\n *\n * // Generate session keypair\n * createSessionKey({\n * encryptKey: userEncryptKey,\n * durationSeconds: 21600 // 6 hours (optional, default)\n * });\n *\n * // Store session externally after creation\n * if (session) {\n * await saveToClerk(session);\n * }\n * ```\n */\nexport function useCreateSessionKey(): {\n createSessionKey: (params: CreateSessionKeyParams) => void;\n createSessionKeyAsync: (\n params: CreateSessionKeyParams\n ) => Promise<SessionKeyData>;\n data: SessionKeyData | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<\n SessionKeyData,\n Error,\n CreateSessionKeyParams\n > = useMutation({\n mutationFn: async (params: CreateSessionKeyParams) =>\n chipiSDK.sessions.createSessionKey(params),\n });\n\n return {\n createSessionKey: mutation.mutate,\n createSessionKeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { AddSessionKeyParams } from \"@chipi-stack/types\";\n\ntype AddSessionKeyInput = {\n params: AddSessionKeyParams;\n bearerToken: string;\n};\n\n/**\n * Hook for registering a session key on the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `add_or_update_session_key` on the CHIPI wallet contract.\n *\n * The session must be registered before it can be used for transactions.\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { addSessionKeyToContract, isLoading } = useAddSessionKeyToContract();\n *\n * // Register session on-chain\n * addSessionKeyToContract({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: [] // empty = all allowed\n * }\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useAddSessionKeyToContract(): {\n addSessionKeyToContract: (input: AddSessionKeyInput) => void;\n addSessionKeyToContractAsync: (input: AddSessionKeyInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, AddSessionKeyInput> =\n useMutation({\n mutationFn: (input: AddSessionKeyInput) =>\n chipiSDK.sessions.addSessionKeyToContract(\n input.params,\n input.bearerToken\n ),\n });\n\n return {\n addSessionKeyToContract: mutation.mutate,\n addSessionKeyToContractAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { RevokeSessionKeyParams } from \"@chipi-stack/types\";\n\ntype RevokeSessionKeyInput = {\n params: RevokeSessionKeyParams;\n bearerToken: string;\n};\n\n/**\n * Hook for revoking a session key from the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `revoke_session_key` on the CHIPI wallet contract.\n *\n * After revocation, the session key can no longer be used for transactions.\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { revokeSessionKey, isLoading } = useRevokeSessionKey();\n *\n * // Revoke a session\n * revokeSessionKey({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useRevokeSessionKey(): {\n revokeSessionKey: (input: RevokeSessionKeyInput) => void;\n revokeSessionKeyAsync: (input: RevokeSessionKeyInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, RevokeSessionKeyInput> =\n useMutation({\n mutationFn: (input: RevokeSessionKeyInput) =>\n chipiSDK.sessions.revokeSessionKey(input.params, input.bearerToken),\n });\n\n return {\n revokeSessionKey: mutation.mutate,\n revokeSessionKeyAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n GetSessionDataParams,\n SessionDataResponse,\n} from \"@chipi-stack/types\";\n\n/**\n * Hook for querying session data from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n * Returns the on-chain state of a session key including:\n * - Whether it's active\n * - When it expires\n * - Remaining calls\n * - Allowed entrypoints\n *\n * @example\n * ```typescript\n * const { data: sessionData, isLoading } = useGetSessionData({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey\n * });\n *\n * if (sessionData?.isActive) {\n * console.log(`Session has ${sessionData.remainingCalls} calls remaining`);\n * }\n * ```\n */\nexport function useGetSessionData(\n params: GetSessionDataParams | null,\n options?: { enabled?: boolean }\n): {\n data: SessionDataResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n refetch: UseQueryResult<SessionDataResponse, Error>[\"refetch\"];\n} {\n const { chipiSDK } = useChipiContext();\n\n const query: UseQueryResult<SessionDataResponse, Error> = useQuery({\n queryKey: [\n \"sessionData\",\n params?.walletAddress,\n params?.sessionPublicKey,\n ],\n queryFn: () => {\n if (!params) {\n throw new Error(\"Session data params are required\");\n }\n return chipiSDK.sessions.getSessionData(params);\n },\n enabled: options?.enabled !== false && params !== null,\n });\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n isSuccess: query.isSuccess,\n refetch: query.refetch,\n };\n}\n\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { ExecuteWithSessionParams } from \"@chipi-stack/types\";\n\ntype ExecuteWithSessionInput = {\n params: ExecuteWithSessionParams;\n bearerToken: string;\n};\n\n/**\n * Hook for executing a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `useCreateSessionKey`\n * 2. Registered on-chain via `useAddSessionKeyToContract`\n *\n * Only works with CHIPI wallets.\n *\n * @example\n * ```typescript\n * const { executeWithSession, isLoading } = useExecuteWithSession();\n *\n * // Execute a transfer using session key (no owner key needed)\n * executeWithSession({\n * params: {\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * session: sessionKeyData,\n * calls: [{\n * contractAddress: USDC_ADDRESS,\n * entrypoint: 'transfer',\n * calldata: [recipient, amount, '0x0']\n * }]\n * },\n * bearerToken\n * });\n * ```\n */\nexport function useExecuteWithSession(): {\n executeWithSession: (input: ExecuteWithSessionInput) => void;\n executeWithSessionAsync: (input: ExecuteWithSessionInput) => Promise<string>;\n data: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, ExecuteWithSessionInput> =\n useMutation({\n mutationFn: (input: ExecuteWithSessionInput) =>\n chipiSDK.executeTransactionWithSession({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n executeWithSession: mutation.mutate,\n executeWithSessionAsync: mutation.mutateAsync,\n data: mutation.data,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n\n"]}
package/dist/index.js CHANGED
@@ -168,7 +168,7 @@ function useChipiWallet(config) {
168
168
  return failureCount < 3;
169
169
  }
170
170
  });
171
- const walletPublicKey = walletQuery.data?.wallet.publicKey;
171
+ const walletPublicKey = walletQuery.data?.publicKey;
172
172
  const balanceQuery = reactQuery.useQuery({
173
173
  queryKey: ["chipi-wallet-balance", walletPublicKey, defaultToken],
174
174
  queryFn: async () => {
@@ -218,8 +218,8 @@ function useChipiWallet(config) {
218
218
  const data = walletQuery.data;
219
219
  return {
220
220
  ...data,
221
- supportsSessionKeys: data.wallet.walletType === "CHIPI",
222
- shortAddress: formatAddress(data.wallet.publicKey)
221
+ supportsSessionKeys: data.walletType === "CHIPI",
222
+ shortAddress: formatAddress(data.publicKey)
223
223
  };
224
224
  }, [walletQuery.data, walletQuery.isLoading]);
225
225
  const formattedBalance = React.useMemo(() => {