@chipi-stack/chipi-react 14.2.1 → 14.3.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.
- package/dist/hooks.d.mts +93 -5
- package/dist/hooks.d.ts +93 -5
- package/dist/hooks.js +74 -19
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +74 -20
- package/dist/hooks.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +86 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +87 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -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/useUpdateWalletEncryption.ts","../src/hooks/useTransfer.ts","../src/hooks/useApprove.ts","../src/hooks/useGetTransactionList.ts","../src/hooks/useGetTransaction.ts","../src/hooks/useGetTransactionStatus.ts","../src/hooks/usePurchaseSku.ts","../src/hooks/useGetSkuPurchase.ts","../src/hooks/useGetSkuList.ts","../src/hooks/useGetSku.ts","../src/hooks/useCallAnyContract.ts","../src/hooks/useRecordSendTransaction.ts","../src/hooks/useGetTokenBalance.ts","../src/hooks/useCreateSessionKey.ts","../src/hooks/useAddSessionKeyToContract.ts","../src/hooks/useRevokeSessionKey.ts","../src/hooks/useGetSessionData.ts","../src/hooks/useExecuteWithSession.ts","../src/hooks/useX402Payment.ts"],"names":["createContext","getWebWalletEncryptKey","QueryClient","React","ChipiSDK","jsx","QueryClientProvider","useContext","useMutation","createWalletPasskey","useQueryClient","useQuery","ChipiApiError","Chain","useMemo","ChainToken","useCallback","useState","useEffect","decryptPrivateKey","encryptPrivateKey","OnChainTxStatus","query","input","useRef","buildX402TypedData"],"mappings":"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","file":"index.js","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\";\nimport { getWalletEncryptKey as getWebWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\nexport interface PasskeyAdapter {\n getWalletEncryptKey: (input: { externalUserId: string }) => Promise<string | null>;\n}\n\ninterface ChipiContextValue {\n chipiSDK: ChipiSDK;\n config: ChipiSDKConfig;\n passkeyAdapter: PasskeyAdapter;\n}\n\nconst ChipiContext = createContext<ChipiContextValue | null>(null);\n\ninterface ChipiProviderProps {\n children: ReactNode;\n config: ChipiSDKConfig;\n passkeyAdapter?: PasskeyAdapter;\n}\n\nconst defaultPasskeyAdapter: PasskeyAdapter = {\n // Web default: externalUserId is accepted for cross-platform API consistency\n getWalletEncryptKey: async () => getWebWalletEncryptKey(),\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, passkeyAdapter }: ChipiProviderProps) {\n // Create QueryClient\n const queryClient = React.useMemo(() => createDefaultQueryClient(), []);\n\n const chipiSDK = React.useMemo(() => new ChipiSDK(config), [config]);\n const resolvedPasskeyAdapter = passkeyAdapter ?? defaultPasskeyAdapter;\n\n const value = React.useMemo(\n () => ({\n chipiSDK,\n config,\n passkeyAdapter: resolvedPasskeyAdapter,\n }),\n [chipiSDK, config, resolvedPasskeyAdapter]\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 { CreateWalletParams, CreateWalletResponse } 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: (input: CreateWalletInput) => 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<CreateWalletResponse, Error, CreateWalletInput> = 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 if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\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 { useQuery, useQueryClient, type UseQueryOptions } 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<UseQueryOptions<GetWalletResponse | null, Error>, \"queryKey\" | \"queryFn\">;\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) 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 (newInput: GetWalletInput): 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 {\n type WalletType,\n type GetWalletResponse,\n type CreateWalletResponse,\n type GetTokenBalanceResponse,\n Chain,\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(config: UseChipiWalletConfig): UseChipiWalletReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const { externalUserId, getBearerToken, defaultToken = \"USDC\", enabled = true } = config;\n\n const trimmedUserId = externalUserId?.trim() || null;\n\n const isEnabled = Boolean(enabled && trimmedUserId);\n\n // ============ Wallet Query ============\n const walletQuery = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"chipi-wallet\", trimmedUserId],\n queryFn: async () => {\n if (!trimmedUserId) return null;\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet({ externalUserId: trimmedUserId }, 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: Chain.STARKNET,\n chainToken: defaultToken as ChainToken,\n walletPublicKey,\n },\n bearerToken\n );\n },\n enabled: Boolean(isEnabled && 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 (!trimmedUserId) 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 chain: Chain.STARKNET,\n encryptKey,\n externalUserId: trimmedUserId,\n walletType,\n },\n bearerToken,\n });\n },\n onSuccess: () => {\n // Invalidate wallet query to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", trimmedUserId],\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 === ChainToken.ETH || defaultToken === ChainToken.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 SpendingPolicyConfig,\n SpendingPolicyData,\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 // Spending Policy Actions\n /** Set a spending policy for the current session + token pair */\n setSpendingPolicy: (config: Omit<SpendingPolicyConfig, \"sessionPublicKey\">) => Promise<string>;\n /** Query the spending policy for a token (read-only, no gas) */\n getSpendingPolicy: (token: string) => Promise<SpendingPolicyData>;\n /** Remove a spending policy for a token */\n removeSpendingPolicy: (token: string) => Promise<string>;\n\n // Loading states\n isCreating: boolean;\n isRegistering: boolean;\n isRevoking: boolean;\n isExecuting: boolean;\n isLoadingStatus: boolean;\n isSettingSpendingPolicy: boolean;\n isRemovingSpendingPolicy: 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>(storedSession ?? null);\n const [error, setError] = useState<Error | null>(null);\n\n // Sync stored session when it changes\n useEffect(() => {\n setLocalSession(storedSession ?? null);\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 && wallet?.publicKey && localSession?.publicKey && 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 {\n mutationFn: async (params = {}) => {\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession)\n throw new Error(\n \"Wallet does not support sessions. Only CHIPI wallets support session keys.\"\n );\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\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 // ============ Set Spending Policy Mutation ============\n const setSpendingPolicyMutation = useMutation<\n string,\n Error,\n Omit<SpendingPolicyConfig, \"sessionPublicKey\">\n >({\n mutationFn: async (policyConfig) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession)\n throw new Error(\"No session to set policy on. Create and register a session 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.setSpendingPolicy(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n spendingPolicyConfig: {\n sessionPublicKey: localSession.publicKey,\n ...policyConfig,\n },\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Remove Spending Policy Mutation ============\n const removeSpendingPolicyMutation = useMutation<string, Error, string>({\n mutationFn: async (token) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to remove policy from\");\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.removeSpendingPolicy(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionPublicKey: localSession.publicKey,\n token,\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\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 const setSpendingPolicy = useCallback(\n async (policyConfig: Omit<SpendingPolicyConfig, \"sessionPublicKey\">) => {\n return setSpendingPolicyMutation.mutateAsync(policyConfig);\n },\n [setSpendingPolicyMutation]\n );\n\n const getSpendingPolicy = useCallback(\n async (token: string): Promise<SpendingPolicyData> => {\n if (!wallet?.publicKey) throw new Error(\"Wallet is required\");\n if (!localSession?.publicKey) throw new Error(\"No session to query policy for\");\n return chipiSDK.sessions.getSpendingPolicy({\n walletAddress: wallet.publicKey,\n sessionPublicKey: localSession.publicKey,\n token,\n });\n },\n [chipiSDK, wallet, localSession]\n );\n\n const removeSpendingPolicy = useCallback(\n async (token: string) => {\n return removeSpendingPolicyMutation.mutateAsync(token);\n },\n [removeSpendingPolicyMutation]\n );\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 setSpendingPolicyMutation.error ||\n removeSpendingPolicyMutation.error ||\n sessionStatusQuery.error ||\n null\n );\n }, [\n error,\n createSessionMutation.error,\n registerSessionMutation.error,\n revokeSessionMutation.error,\n executeWithSessionMutation.error,\n setSpendingPolicyMutation.error,\n removeSpendingPolicyMutation.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 // Spending Policy Actions\n setSpendingPolicy,\n getSpendingPolicy,\n removeSpendingPolicy,\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 isSettingSpendingPolicy: setSpendingPolicyMutation.isPending,\n isRemovingSpendingPolicy: removeSpendingPolicyMutation.isPending,\n\n // Errors\n error: combinedError,\n };\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { MigrateWalletToPasskeyParams, WalletData } from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\nimport { decryptPrivateKey, encryptPrivateKey, type ChipiWallets } 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 const queryClient = useQueryClient();\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: Validate old encryptKey by decrypting first (before creating passkey)\n let decryptedPrivateKey: string;\n try {\n decryptedPrivateKey = decryptPrivateKey(wallet.encryptedPrivateKey, oldEncryptKey);\n } catch {\n throw new Error(\n \"Failed to decrypt wallet with provided encryptKey. Please verify your PIN/password is correct.\"\n );\n }\n\n // Step 2: Create new passkey only after PIN is confirmed valid\n const passkeyResult = await createWalletPasskey(\n externalUserId,\n externalUserId // Using externalUserId as userName\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: Persist new encrypted key to backend\n const updateResult = await (chipiSDK.wallets as ChipiWallets).updateWalletEncryption(\n {\n externalUserId,\n newEncryptedPrivateKey,\n publicKey: wallet.publicKey,\n },\n bearerToken\n );\n\n if (updateResult?.success === false) {\n throw new Error(\"Backend rejected wallet encryption update\");\n }\n\n const updatedWallet: WalletData = {\n ...wallet,\n encryptedPrivateKey: newEncryptedPrivateKey,\n };\n\n // Invalidate cached wallet so useChipiWallet/useGetWallet refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", externalUserId],\n });\n queryClient.invalidateQueries({\n queryKey: [\"wallet\", externalUserId],\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, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n UpdateWalletEncryptionParams,\n UpdateWalletEncryptionResponse,\n} from \"@chipi-stack/types\";\nimport { ChipiWallets } from \"@chipi-stack/backend\";\n\ntype UpdateWalletEncryptionInput = UpdateWalletEncryptionParams & {\n bearerToken: string;\n};\n\n/**\n * Hook for updating a wallet's encrypted private key.\n * Use when the user changes their passkey or PIN; the client re-encrypts the private key\n * and sends the new ciphertext here.\n */\nexport function useUpdateWalletEncryption(): {\n updateWalletEncryption: (input: UpdateWalletEncryptionInput) => void;\n updateWalletEncryptionAsync: (\n input: UpdateWalletEncryptionInput\n ) => Promise<UpdateWalletEncryptionResponse>;\n data: UpdateWalletEncryptionResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const mutation: UseMutationResult<\n UpdateWalletEncryptionResponse,\n Error,\n UpdateWalletEncryptionInput\n > = useMutation({\n mutationFn: async (input: UpdateWalletEncryptionInput) => {\n const { bearerToken, ...params } = input;\n return (chipiSDK.wallets as ChipiWallets).updateWalletEncryption(params, bearerToken);\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", variables.externalUserId],\n });\n },\n });\n\n return {\n updateWalletEncryption: mutation.mutate,\n updateWalletEncryptionAsync: 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\";\n\ntype TransferInput = {\n params: TransferHookInput;\n bearerToken: string;\n};\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, passkeyAdapter } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, TransferInput> = useMutation({\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 if (!input.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n try {\n const key = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: input.params.externalUserId,\n });\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"NotAllowedError\") {\n throw new Error(\"Passkey authentication was cancelled by the user\");\n }\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...transferParams\n } = input.params;\n return chipiSDK.transfer({\n params: {\n ...transferParams,\n amount: String(transferParams.amount),\n encryptKey: encryptKey,\n },\n bearerToken: input.bearerToken,\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\";\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, passkeyAdapter } = 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 if (!params.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n try {\n const key = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: params.params.externalUserId,\n });\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 if (!encryptKey) {\n throw new Error(\n \"encryptKey is required when usePasskey is false. Provide a PIN or enable usePasskey.\"\n );\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...approveParams\n } = params.params;\n return chipiSDK.approve({\n params: {\n ...approveParams,\n amount: String(approveParams.amount),\n 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<\n UseQueryOptions<PaginatedResponse<Transaction>, Error>,\n \"queryKey\" | \"queryFn\"\n >;\n};\n\ntype FetchTransactionListInput = {\n query: GetTransactionListQuery;\n getBearerToken: () => Promise<string | null | undefined>;\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: FetchTransactionListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.query),\n queryFn: async () => {\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","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { Transaction } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetTransactionInput = {\n hashOrId?: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Transaction, Error>, \"queryKey\" | \"queryFn\">;\n};\n\ntype FetchTransactionInput = {\n hashOrId: string;\n getBearerToken: () => Promise<string | null | undefined>;\n};\n\nexport function useGetTransaction(input?: GetTransactionInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (hashOrId?: string) => [\"transaction\", hashOrId ?? null];\n\n const query = useQuery<Transaction, Error>({\n queryKey: buildQueryKey(input?.hashOrId),\n queryFn: async () => {\n if (!input?.hashOrId) throw new Error(\"hashOrId 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.getTransaction(input.hashOrId, bearerToken);\n },\n enabled: Boolean(input?.hashOrId && input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTransaction = async (newInput: FetchTransactionInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.hashOrId),\n queryFn: async () => {\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransaction(newInput.hashOrId, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransaction,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { TransactionStatusResponse, OnChainTxStatus } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\n/** Terminal statuses that stop polling */\nconst TERMINAL_STATUSES: OnChainTxStatus[] = [\n OnChainTxStatus.ACCEPTED_ON_L1,\n OnChainTxStatus.REJECTED,\n OnChainTxStatus.REVERTED,\n];\n\ntype GetTransactionStatusInput = {\n hash?: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n /** Polling interval in ms. Defaults to 3000. Set to false to disable polling. */\n refetchInterval?: number | false;\n queryOptions?: Omit<\n UseQueryOptions<TransactionStatusResponse, Error>,\n \"queryKey\" | \"queryFn\" | \"refetchInterval\"\n >;\n};\n\ntype FetchTransactionStatusInput = {\n hash: string;\n getBearerToken: () => Promise<string | null | undefined>;\n};\n\nexport function useGetTransactionStatus(input?: GetTransactionStatusInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (hash?: string) => [\"transaction-status\", hash ?? null];\n\n const query = useQuery<TransactionStatusResponse, Error>({\n queryKey: buildQueryKey(input?.hash),\n queryFn: async () => {\n if (!input?.hash) throw new Error(\"hash 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.getTransactionStatus(input.hash, bearerToken);\n },\n enabled: Boolean(input?.hash && input?.getBearerToken),\n refetchInterval: (query) => {\n // Stop polling on terminal statuses\n const status = query.state.data?.status;\n if (status && TERMINAL_STATUSES.includes(status)) {\n return false;\n }\n return input?.refetchInterval ?? 3000;\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTransactionStatus = async (newInput: FetchTransactionStatusInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.hash),\n queryFn: async () => {\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionStatus(newInput.hash, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransactionStatus,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport { CreateSkuPurchaseParams, Transaction } from \"@chipi-stack/types\";\n\ntype PurchaseSkuInput = {\n params: CreateSkuPurchaseParams;\n bearerToken: string;\n};\n\n/**\n * Hook for purchasing SKUs\n */\nexport function usePurchaseSku(): {\n purchaseSku: (input: PurchaseSkuInput) => void;\n purchaseSkuAsync: (input: PurchaseSkuInput) => 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<Transaction, Error, PurchaseSkuInput> = useMutation({\n mutationFn: (input: PurchaseSkuInput) =>\n chipiSDK.purchaseSku({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n purchaseSku: mutation.mutate,\n purchaseSkuAsync: 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 { Transaction } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\n\ntype GetSkuPurchaseInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Transaction, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetSkuPurchase(input?: GetSkuPurchaseInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<Transaction, Error>({\n queryKey: [\"sku-purchase\", 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.getSkuPurchase(input.id, bearerToken);\n },\n enabled: Boolean(input?.id && input?.getBearerToken),\n ...input?.queryOptions,\n });\n\n const fetchSkuPurchase = async (newInput: GetSkuPurchaseInput) => {\n return queryClient.fetchQuery({\n queryKey: [\"sku-purchase\", 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.getSkuPurchase(newInput.id, bearerToken);\n },\n });\n };\n\n return {\n ...query,\n fetchSkuPurchase,\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 { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { Sku } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } 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(input?.id && input?.getBearerToken && input.id.trim() !== \"\"),\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) 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 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 fetchSku,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CallAnyContractParams } from \"@chipi-stack/types\";\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, passkeyAdapter } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, CallAnyContractInput> = 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 if (!params.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n try {\n const key = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: params.params.externalUserId,\n });\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"NotAllowedError\") {\n throw new Error(\"Passkey authentication was cancelled by the user\");\n }\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...contractParams\n } = params.params;\n return chipiSDK.callAnyContract({\n params: {\n ...contractParams,\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 { RecordSendTransactionParams, Transaction } 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: (input: RecordSendTransactionInput) => 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<Transaction, Error, RecordSendTransactionInput> = 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 { GetTokenBalanceParams, GetTokenBalanceResponse } 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)\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.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","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CreateSessionKeyParams, SessionKeyData } 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: (params: CreateSessionKeyParams) => 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<SessionKeyData, Error, CreateSessionKeyParams> = 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> = useMutation({\n mutationFn: (input: AddSessionKeyInput) =>\n chipiSDK.sessions.addSessionKeyToContract(input.params, input.bearerToken),\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","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> = 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","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { GetSessionDataParams, SessionDataResponse } 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: [\"sessionData\", params?.walletAddress, params?.sessionPublicKey],\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","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> = 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","\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n WalletData,\n WalletType,\n PaymentRequirement,\n PaymentPayload,\n SessionKeyData,\n} from \"@chipi-stack/types\";\nimport { buildX402TypedData } from \"@chipi-stack/core\";\n\n/**\n * Configuration for useX402Payment hook\n */\nexport interface UseX402PaymentConfig {\n /** Wallet data */\n wallet: WalletData | null | undefined;\n /** Encryption key for signing */\n encryptKey: string;\n /** Function to get the bearer token for API calls */\n getBearerToken?: () => Promise<string | null | undefined>;\n /** Static bearer token string (alternative to getBearerToken) */\n bearerToken?: string;\n /** Max amount per payment (USDC, human-readable e.g. \"1.00\") */\n maxPaymentAmount?: string;\n /** Alias for maxPaymentAmount */\n maxAmount?: string;\n /** Allowed recipient addresses (whitelist). Empty = allow all. */\n allowedRecipients?: string[];\n /** Active session for automatic payments (optional) */\n session?: SessionKeyData | null;\n /** Callback on successful payment */\n onPaymentComplete?: (txHash: string, amount: string) => void | Promise<void>;\n}\n\n/**\n * Last payment info returned by the hook\n */\nexport interface LastPaymentInfo {\n txHash: string | null;\n amount: string | null;\n timestamp: number;\n}\n\n/**\n * Return type for useX402Payment hook\n */\nexport interface UseX402PaymentReturn {\n /** Fetch wrapper that auto-handles 402 payments */\n x402Fetch: (url: string, init?: Record<string, any>) => Promise<Response>;\n /** Alias for x402Fetch */\n payFetch: (url: string, init?: Record<string, any>) => Promise<Response>;\n /** Manual payment signing (for custom flows) */\n signPayment: (requirement: PaymentRequirement) => Promise<PaymentPayload>;\n /** Whether a payment is in progress */\n isPaying: boolean;\n /** Last payment transaction hash */\n lastTxHash: string | null;\n /** Last payment amount (human-readable USDC) */\n lastAmount: string | null;\n /** Last payment info (txHash + amount + timestamp) */\n lastPayment: LastPaymentInfo | null;\n /** Total USDC spent in this session (human-readable) */\n totalSpent: string;\n /** Error from last payment attempt */\n error: Error | null;\n /** Total payments made in this session */\n paymentCount: number;\n}\n\n/**\n * React hook for x402 payment protocol support.\n *\n * Wraps fetch calls with automatic HTTP 402 payment handling.\n * When a server returns 402, the hook:\n * 1. Parses the payment requirement\n * 2. Validates against configured limits\n * 3. Signs using the wallet (or session key for automatic payments)\n * 4. Retries with the X-PAYMENT header\n *\n * @example\n * ```tsx\n * const { x402Fetch, isPaying, lastTxHash, paymentCount } = useX402Payment({\n * wallet,\n * encryptKey: pin,\n * getBearerToken: getToken,\n * maxPaymentAmount: \"1.00\",\n * onPaymentComplete: (txHash, amount) => {\n * console.log(`Paid ${amount} USDC, tx: ${txHash}`);\n * },\n * });\n *\n * // Automatic 402 handling\n * const response = await x402Fetch(\"https://api.example.com/premium\");\n * const data = await response.json();\n * ```\n */\nexport function useX402Payment(config: UseX402PaymentConfig): UseX402PaymentReturn {\n const { chipiSDK } = useChipiContext();\n\n const {\n wallet,\n encryptKey,\n getBearerToken: getBearerTokenFn,\n bearerToken: staticBearerToken,\n maxPaymentAmount: maxPaymentAmountProp,\n maxAmount,\n allowedRecipients,\n session,\n onPaymentComplete,\n } = config;\n\n // Resolve maxPaymentAmount: explicit prop takes precedence over alias\n const maxPaymentAmount = maxPaymentAmountProp ?? maxAmount;\n\n // Resolve getBearerToken: function takes precedence over static string\n const getBearerToken = useMemo(\n () =>\n getBearerTokenFn ??\n (staticBearerToken\n ? () => Promise.resolve(staticBearerToken)\n : () => Promise.resolve(undefined)),\n [getBearerTokenFn, staticBearerToken]\n );\n\n const [lastTxHash, setLastTxHash] = useState<string | null>(null);\n const [lastAmount, setLastAmount] = useState<string | null>(null);\n const [lastPayment, setLastPayment] = useState<LastPaymentInfo | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const paymentCountRef = useRef(0);\n const [paymentCount, setPaymentCount] = useState(0);\n const totalSpentRef = useRef(0n);\n const [totalSpent, setTotalSpent] = useState(\"0.000000\");\n\n /**\n * Parse PAYMENT-REQUIRED header from a 402 response\n */\n const parsePaymentRequired = useCallback((response: Response): PaymentRequirement => {\n const headerValue = response.headers.get(\"payment-required\");\n\n if (!headerValue) {\n throw new Error(\n \"Server returned 402 but no PAYMENT-REQUIRED header. \" +\n \"The server may not support x402 or is misconfigured.\"\n );\n }\n\n try {\n return JSON.parse(headerValue);\n } catch {\n throw new Error(\"Malformed PAYMENT-REQUIRED header: invalid JSON\");\n }\n }, []);\n\n /**\n * Validate payment requirement against config limits and protocol constraints\n */\n const validateRequirement = useCallback(\n (requirement: PaymentRequirement): void => {\n // Validate protocol constraints\n if (requirement.scheme !== \"exact\") {\n throw new Error(\n `Unsupported payment scheme: \"${requirement.scheme}\". Only \"exact\" is supported.`\n );\n }\n if (requirement.network !== \"starknet-mainnet\") {\n throw new Error(\n `Unsupported network: \"${requirement.network}\". Only \"starknet-mainnet\" is supported.`\n );\n }\n\n // Validate asset is USDC\n const USDC_MAINNET = \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\";\n const normalizeAddr = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n if (normalizeAddr(requirement.asset) !== normalizeAddr(USDC_MAINNET)) {\n throw new Error(`Unsupported asset: ${requirement.asset}. Only USDC is supported.`);\n }\n\n // Validate required fields\n if (!requirement.payTo) {\n throw new Error(\"Invalid payment requirement: missing payTo address\");\n }\n\n // Validate maxTimeoutSeconds\n const timeoutSeconds = Number(requirement.maxTimeoutSeconds);\n if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {\n throw new Error(\"Invalid payment requirement: maxTimeoutSeconds must be a positive number\");\n }\n\n // Validate maxAmountRequired\n let requiredAmount: bigint;\n try {\n requiredAmount = BigInt(requirement.maxAmountRequired);\n } catch {\n throw new Error(\"Invalid payment requirement: maxAmountRequired must be an integer string\");\n }\n if (requiredAmount <= 0n) {\n throw new Error(\"Invalid payment requirement: maxAmountRequired must be > 0\");\n }\n\n if (maxPaymentAmount) {\n const trimmed = maxPaymentAmount.trim();\n if (!/^\\d+(\\.\\d{1,6})?$/.test(trimmed)) {\n throw new Error(`Invalid maxPaymentAmount format: \"${maxPaymentAmount}\"`);\n }\n // String-based conversion to avoid floating-point precision issues\n const [whole, frac = \"\"] = trimmed.split(\".\");\n const fracPadded = (frac + \"000000\").slice(0, 6);\n const maxBaseUnits = BigInt((whole || \"0\") + fracPadded);\n\n if (requiredAmount > maxBaseUnits) {\n const requiredHuman = (Number(requiredAmount) / 1_000_000).toFixed(6);\n throw new Error(\n `Payment amount ${requiredHuman} USDC exceeds maximum allowed ${maxPaymentAmount} USDC`\n );\n }\n }\n\n if (allowedRecipients && allowedRecipients.length > 0) {\n const normalize = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalized = normalize(requirement.payTo);\n const isAllowed = allowedRecipients.some((addr) => normalize(addr) === normalized);\n if (!isAllowed) {\n throw new Error(`Recipient ${requirement.payTo} is not in the allowed recipients list`);\n }\n }\n },\n [maxPaymentAmount, allowedRecipients]\n );\n\n /**\n * Sign a SNIP-12 typed data payment message.\n * Uses session key if available, otherwise signs locally via signTypedData().\n */\n const signPayment = useCallback(\n async (requirement: PaymentRequirement): Promise<PaymentPayload> => {\n if (!wallet) {\n throw new Error(\"Wallet is required for x402 payments\");\n }\n if (!encryptKey) {\n throw new Error(\"Encryption key (PIN) is required for x402 payments\");\n }\n\n validateRequirement(requirement);\n\n const nonce = crypto.randomUUID();\n const validUntil = Math.floor(Date.now() / 1000) + requirement.maxTimeoutSeconds;\n\n // Session key path: session keys use a 4-element signature format\n // [sessionPubKey, r, s, validUntil] that requires the full paymaster\n // execution flow (prepare-typed-data → sign → execute-sponsored-transaction).\n // We keep the executeTransactionWithSession flow here because the facilitator's\n // settle() is a no-op for session-executed payments (already on-chain).\n if (session) {\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,\n calls: [\n {\n contractAddress: requirement.asset,\n entrypoint: \"transfer\",\n calldata: [requirement.payTo, requirement.maxAmountRequired, \"0x0\"],\n },\n ],\n },\n bearerToken,\n });\n\n return {\n x402Version: 1,\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n payload: {\n signature: { r: txHash, s: \"session\" },\n fromAddress: wallet.publicKey,\n toAddress: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n validUntil,\n nonce,\n },\n };\n }\n\n // Standard wallet path: sign SNIP-12 typed data locally without executing a transaction.\n const typedData = buildX402TypedData({\n from_address: wallet.publicKey,\n to_address: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n valid_until: String(validUntil),\n nonce,\n });\n\n const signature = await chipiSDK.signTypedData({\n params: {\n encryptKey,\n wallet,\n typedData,\n },\n });\n\n return {\n x402Version: 1,\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n payload: {\n signature,\n fromAddress: wallet.publicKey,\n toAddress: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n validUntil,\n nonce,\n },\n };\n },\n [wallet, encryptKey, session, getBearerToken, chipiSDK, validateRequirement]\n );\n\n /**\n * Payment mutation for tracking state\n */\n const paymentMutation = useMutation<Response, Error, { url: string; init?: Record<string, any> }>(\n {\n mutationFn: async ({ url, init }) => {\n const response = await globalThis.fetch(url, init);\n\n if (response.status !== 402) {\n return response;\n }\n\n const requirement = parsePaymentRequired(response);\n const payment = await signPayment(requirement);\n\n // Track payment\n const humanAmount = (Number(BigInt(requirement.maxAmountRequired)) / 1_000_000).toFixed(6);\n // Session payments store txHash in signature.r with s=\"session\" marker.\n // Standard wallet payments have ECDSA signature components, not a txHash.\n const isSessionPayment = payment.payload.signature.s === \"session\";\n const txHash = isSessionPayment ? payment.payload.signature.r : null;\n\n setLastAmount(humanAmount);\n setLastTxHash(txHash);\n\n setLastPayment({ txHash, amount: humanAmount, timestamp: Date.now() });\n\n totalSpentRef.current += BigInt(requirement.maxAmountRequired);\n setTotalSpent((Number(totalSpentRef.current) / 1_000_000).toFixed(6));\n\n paymentCountRef.current += 1;\n setPaymentCount(paymentCountRef.current);\n\n // Retry with payment header\n const headers = new Headers(init?.headers);\n headers.set(\"X-PAYMENT\", JSON.stringify(payment));\n\n const paidResponse = await globalThis.fetch(url, { ...init, headers });\n if (paidResponse.status === 402) {\n throw new Error(\n \"Server returned 402 after payment was submitted. Payment may have failed verification.\"\n );\n }\n\n // Completion callback (fire-and-forget, don't block response)\n if (onPaymentComplete) {\n void Promise.resolve(onPaymentComplete(txHash ?? \"\", humanAmount)).catch(() => {});\n }\n\n return paidResponse;\n },\n onError: (err) => {\n setError(err);\n },\n onSuccess: () => {\n setError(null);\n },\n }\n );\n\n const x402Fetch = useCallback(\n async (url: string, init?: Record<string, any>): Promise<Response> => {\n return paymentMutation.mutateAsync({ url, init });\n },\n [paymentMutation]\n );\n\n return {\n x402Fetch,\n payFetch: x402Fetch,\n signPayment,\n isPaying: paymentMutation.isPending,\n lastTxHash,\n lastAmount,\n lastPayment,\n totalSpent,\n error: error || paymentMutation.error || null,\n paymentCount,\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/useUpdateWalletEncryption.ts","../src/hooks/useTransfer.ts","../src/hooks/useApprove.ts","../src/hooks/useGetTransactionList.ts","../src/hooks/useGetTransaction.ts","../src/hooks/useGetTransactionStatus.ts","../src/hooks/useSyncOnChainTransfers.ts","../src/hooks/usePurchaseSku.ts","../src/hooks/useGetSkuPurchase.ts","../src/hooks/useGetSkuList.ts","../src/hooks/useGetSku.ts","../src/hooks/useCallAnyContract.ts","../src/hooks/useRecordSendTransaction.ts","../src/hooks/useGetTokenBalance.ts","../src/hooks/useCreateSessionKey.ts","../src/hooks/useAddSessionKeyToContract.ts","../src/hooks/useRevokeSessionKey.ts","../src/hooks/useGetSessionData.ts","../src/hooks/useExecuteWithSession.ts","../src/hooks/useX402Payment.ts"],"names":["createContext","getWebWalletEncryptKey","QueryClient","React","ChipiSDK","jsx","QueryClientProvider","useContext","useMutation","createWalletPasskey","useQueryClient","useQuery","ChipiApiError","Chain","useMemo","ChainToken","useCallback","useState","useEffect","decryptPrivateKey","encryptPrivateKey","OnChainTxStatus","query","input","useRef","buildX402TypedData"],"mappings":"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","file":"index.js","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\";\nimport { getWalletEncryptKey as getWebWalletEncryptKey } from \"@chipi-stack/chipi-passkey\";\n\nexport interface PasskeyAdapter {\n getWalletEncryptKey: (input: { externalUserId: string }) => Promise<string | null>;\n}\n\ninterface ChipiContextValue {\n chipiSDK: ChipiSDK;\n config: ChipiSDKConfig;\n passkeyAdapter: PasskeyAdapter;\n}\n\nconst ChipiContext = createContext<ChipiContextValue | null>(null);\n\ninterface ChipiProviderProps {\n children: ReactNode;\n config: ChipiSDKConfig;\n passkeyAdapter?: PasskeyAdapter;\n}\n\nconst defaultPasskeyAdapter: PasskeyAdapter = {\n // Web default: attempts passkey auth, returns null on failure (caller uses PIN backup)\n getWalletEncryptKey: async () => {\n try {\n return await getWebWalletEncryptKey();\n } catch (error) {\n // Passkey failed (PRF unavailable, user cancelled, localStorage cleared)\n // Log for debugging — return null so caller can fall back to PIN backup\n console.warn(\n \"[ChipiProvider] Passkey auth failed, falling back to PIN:\",\n error instanceof Error ? error.message : error\n );\n return null;\n }\n },\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, passkeyAdapter }: ChipiProviderProps) {\n // Create QueryClient\n const queryClient = React.useMemo(() => createDefaultQueryClient(), []);\n\n const chipiSDK = React.useMemo(() => new ChipiSDK(config), [config]);\n const resolvedPasskeyAdapter = passkeyAdapter ?? defaultPasskeyAdapter;\n\n const value = React.useMemo(\n () => ({\n chipiSDK,\n config,\n passkeyAdapter: resolvedPasskeyAdapter,\n }),\n [chipiSDK, config, resolvedPasskeyAdapter]\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 { CreateWalletParams, CreateWalletResponse } 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 *\n * Supports dual-key wrapping: when `usePasskey: true` AND `encryptKey` (PIN) provided,\n * the private key is encrypted twice — once with the passkey-derived key (primary) and\n * once with the PIN (backup). If passkey fails later, PIN recovers the wallet.\n *\n * @example\n * ```tsx\n * // Passkey + PIN (recommended)\n * await createWalletAsync({\n * params: {\n * encryptKey: pin, // PIN backup\n * externalUserId: userId,\n * chain: Chain.STARKNET,\n * usePasskey: true, // Creates passkey + dual encryption\n * },\n * bearerToken,\n * });\n *\n * // PIN only (backward compatible)\n * await createWalletAsync({\n * params: {\n * encryptKey: pin,\n * externalUserId: userId,\n * chain: Chain.STARKNET,\n * },\n * bearerToken,\n * });\n * ```\n */\nexport function useCreateWallet(): {\n createWallet: (input: CreateWalletInput) => void;\n createWalletAsync: (input: CreateWalletInput) => 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<CreateWalletResponse, Error, CreateWalletInput> = useMutation({\n mutationFn: async (input: CreateWalletInput) => {\n let encryptKey = input.params.encryptKey;\n let encryptKeyBackup: string | undefined;\n let credentialId: string | undefined;\n let prfSupported: boolean | undefined;\n let authMethod: string | undefined;\n\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\n );\n\n credentialId = passkeyResult.credentialId;\n prfSupported = passkeyResult.prfSupported;\n\n if (encryptKey) {\n // Dual-key mode: passkey is primary, PIN is backup\n encryptKeyBackup = encryptKey;\n encryptKey = passkeyResult.encryptKey;\n authMethod = \"passkey+pin\";\n } else {\n // Passkey-only mode (no PIN backup — not recommended)\n encryptKey = passkeyResult.encryptKey;\n authMethod = \"passkey\";\n }\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 } else {\n // PIN-only mode\n authMethod = encryptKey ? \"pin\" : undefined;\n }\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\n }\n\n return chipiSDK.createWallet({\n params: {\n ...input.params,\n encryptKey,\n encryptKeyBackup,\n authMethod: authMethod as any,\n credentialId,\n prfSupported,\n deviceType: \"web\",\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 { useQuery, useQueryClient, type UseQueryOptions } 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<UseQueryOptions<GetWalletResponse | null, Error>, \"queryKey\" | \"queryFn\">;\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) 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 (newInput: GetWalletInput): 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 {\n type WalletType,\n type GetWalletResponse,\n type CreateWalletResponse,\n type GetTokenBalanceResponse,\n Chain,\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(config: UseChipiWalletConfig): UseChipiWalletReturn {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const { externalUserId, getBearerToken, defaultToken = \"USDC\", enabled = true } = config;\n\n const trimmedUserId = externalUserId?.trim() || null;\n\n const isEnabled = Boolean(enabled && trimmedUserId);\n\n // ============ Wallet Query ============\n const walletQuery = useQuery<GetWalletResponse | null, Error>({\n queryKey: [\"chipi-wallet\", trimmedUserId],\n queryFn: async () => {\n if (!trimmedUserId) return null;\n const bearerToken = await getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getWallet({ externalUserId: trimmedUserId }, 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: Chain.STARKNET,\n chainToken: defaultToken as ChainToken,\n walletPublicKey,\n },\n bearerToken\n );\n },\n enabled: Boolean(isEnabled && 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 (!trimmedUserId) 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 chain: Chain.STARKNET,\n encryptKey,\n externalUserId: trimmedUserId,\n walletType,\n },\n bearerToken,\n });\n },\n onSuccess: () => {\n // Invalidate wallet query to refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", trimmedUserId],\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 === ChainToken.ETH || defaultToken === ChainToken.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 SpendingPolicyConfig,\n SpendingPolicyData,\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 // Spending Policy Actions\n /** Set a spending policy for the current session + token pair */\n setSpendingPolicy: (config: Omit<SpendingPolicyConfig, \"sessionPublicKey\">) => Promise<string>;\n /** Query the spending policy for a token (read-only, no gas) */\n getSpendingPolicy: (token: string) => Promise<SpendingPolicyData>;\n /** Remove a spending policy for a token */\n removeSpendingPolicy: (token: string) => Promise<string>;\n\n // Loading states\n isCreating: boolean;\n isRegistering: boolean;\n isRevoking: boolean;\n isExecuting: boolean;\n isLoadingStatus: boolean;\n isSettingSpendingPolicy: boolean;\n isRemovingSpendingPolicy: 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>(storedSession ?? null);\n const [error, setError] = useState<Error | null>(null);\n\n // Sync stored session when it changes\n useEffect(() => {\n setLocalSession(storedSession ?? null);\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 && wallet?.publicKey && localSession?.publicKey && 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 {\n mutationFn: async (params = {}) => {\n if (!encryptKey) throw new Error(\"Encryption key (PIN) is required\");\n if (!supportsSession)\n throw new Error(\n \"Wallet does not support sessions. Only CHIPI wallets support session keys.\"\n );\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\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 // ============ Set Spending Policy Mutation ============\n const setSpendingPolicyMutation = useMutation<\n string,\n Error,\n Omit<SpendingPolicyConfig, \"sessionPublicKey\">\n >({\n mutationFn: async (policyConfig) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession)\n throw new Error(\"No session to set policy on. Create and register a session 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.setSpendingPolicy(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n spendingPolicyConfig: {\n sessionPublicKey: localSession.publicKey,\n ...policyConfig,\n },\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\n },\n onError: (err) => {\n setError(err);\n },\n });\n\n // ============ Remove Spending Policy Mutation ============\n const removeSpendingPolicyMutation = useMutation<string, Error, string>({\n mutationFn: async (token) => {\n if (!wallet) throw new Error(\"Wallet is required\");\n if (!localSession) throw new Error(\"No session to remove policy from\");\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.removeSpendingPolicy(\n {\n encryptKey,\n wallet: wallet as WalletData & { walletType?: WalletType },\n sessionPublicKey: localSession.publicKey,\n token,\n },\n bearerToken\n );\n\n return txHash;\n },\n onSuccess: () => {\n setError(null);\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 const setSpendingPolicy = useCallback(\n async (policyConfig: Omit<SpendingPolicyConfig, \"sessionPublicKey\">) => {\n return setSpendingPolicyMutation.mutateAsync(policyConfig);\n },\n [setSpendingPolicyMutation]\n );\n\n const getSpendingPolicy = useCallback(\n async (token: string): Promise<SpendingPolicyData> => {\n if (!wallet?.publicKey) throw new Error(\"Wallet is required\");\n if (!localSession?.publicKey) throw new Error(\"No session to query policy for\");\n return chipiSDK.sessions.getSpendingPolicy({\n walletAddress: wallet.publicKey,\n sessionPublicKey: localSession.publicKey,\n token,\n });\n },\n [chipiSDK, wallet, localSession]\n );\n\n const removeSpendingPolicy = useCallback(\n async (token: string) => {\n return removeSpendingPolicyMutation.mutateAsync(token);\n },\n [removeSpendingPolicyMutation]\n );\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 setSpendingPolicyMutation.error ||\n removeSpendingPolicyMutation.error ||\n sessionStatusQuery.error ||\n null\n );\n }, [\n error,\n createSessionMutation.error,\n registerSessionMutation.error,\n revokeSessionMutation.error,\n executeWithSessionMutation.error,\n setSpendingPolicyMutation.error,\n removeSpendingPolicyMutation.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 // Spending Policy Actions\n setSpendingPolicy,\n getSpendingPolicy,\n removeSpendingPolicy,\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 isSettingSpendingPolicy: setSpendingPolicyMutation.isPending,\n isRemovingSpendingPolicy: removeSpendingPolicyMutation.isPending,\n\n // Errors\n error: combinedError,\n };\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { MigrateWalletToPasskeyParams, WalletData } from \"@chipi-stack/types\";\nimport { createWalletPasskey } from \"@chipi-stack/chipi-passkey\";\nimport { decryptPrivateKey, encryptPrivateKey, type ChipiWallets } 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 const queryClient = useQueryClient();\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: Validate old encryptKey by decrypting first (before creating passkey)\n let decryptedPrivateKey: string;\n try {\n decryptedPrivateKey = decryptPrivateKey(wallet.encryptedPrivateKey, oldEncryptKey);\n } catch {\n throw new Error(\n \"Failed to decrypt wallet with provided encryptKey. Please verify your PIN/password is correct.\"\n );\n }\n\n // Step 2: Create new passkey only after PIN is confirmed valid\n const passkeyResult = await createWalletPasskey(\n externalUserId,\n externalUserId // Using externalUserId as userName\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: Persist new encrypted key to backend\n const updateResult = await (chipiSDK.wallets as ChipiWallets).updateWalletEncryption(\n {\n externalUserId,\n newEncryptedPrivateKey,\n publicKey: wallet.publicKey,\n },\n bearerToken\n );\n\n if (updateResult?.success === false) {\n throw new Error(\"Backend rejected wallet encryption update\");\n }\n\n const updatedWallet: WalletData = {\n ...wallet,\n encryptedPrivateKey: newEncryptedPrivateKey,\n };\n\n // Invalidate cached wallet so useChipiWallet/useGetWallet refetch\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", externalUserId],\n });\n queryClient.invalidateQueries({\n queryKey: [\"wallet\", externalUserId],\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, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n UpdateWalletEncryptionParams,\n UpdateWalletEncryptionResponse,\n} from \"@chipi-stack/types\";\nimport { ChipiWallets } from \"@chipi-stack/backend\";\n\ntype UpdateWalletEncryptionInput = UpdateWalletEncryptionParams & {\n bearerToken: string;\n};\n\n/**\n * Hook for updating a wallet's encrypted private key.\n * Use when the user changes their passkey or PIN; the client re-encrypts the private key\n * and sends the new ciphertext here.\n */\nexport function useUpdateWalletEncryption(): {\n updateWalletEncryption: (input: UpdateWalletEncryptionInput) => void;\n updateWalletEncryptionAsync: (\n input: UpdateWalletEncryptionInput\n ) => Promise<UpdateWalletEncryptionResponse>;\n data: UpdateWalletEncryptionResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const mutation: UseMutationResult<\n UpdateWalletEncryptionResponse,\n Error,\n UpdateWalletEncryptionInput\n > = useMutation({\n mutationFn: async (input: UpdateWalletEncryptionInput) => {\n const { bearerToken, ...params } = input;\n return (chipiSDK.wallets as ChipiWallets).updateWalletEncryption(params, bearerToken);\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"chipi-wallet\", variables.externalUserId],\n });\n },\n });\n\n return {\n updateWalletEncryption: mutation.mutate,\n updateWalletEncryptionAsync: 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, WalletData } from \"@chipi-stack/types\";\n\ntype TransferInput = {\n params: TransferHookInput;\n bearerToken: string;\n};\n\n/**\n * Configuration for useTransfer hook.\n */\nexport interface UseTransferConfig {\n /**\n * Callback to prompt user for PIN when passkey fails.\n * Should show a PIN input dialog and return the PIN, or null to cancel.\n * Only called when usePasskey: true and passkey auth fails.\n */\n onPinRequired?: () => Promise<string | null>;\n}\n\n/**\n * Hook for transferring tokens.\n *\n * When `usePasskey: true`:\n * 1. Tries passkey authentication first\n * 2. If passkey fails and wallet has `encryptedPrivateKeyBackup`:\n * calls `onPinRequired` to get PIN, uses PIN to decrypt backup\n * 3. If no backup or no `onPinRequired`, throws\n *\n * @example\n * ```tsx\n * const { transferAsync } = useTransfer({\n * onPinRequired: async () => {\n * // Show PIN dialog, return PIN or null to cancel\n * return await showPinDialog();\n * },\n * });\n * ```\n */\nexport function useTransfer(config?: UseTransferConfig): {\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, passkeyAdapter } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, TransferInput> = useMutation({\n mutationFn: async (input: TransferInput) => {\n let encryptKey = input.params.encryptKey;\n let walletForTransfer = input.params.wallet;\n\n // If usePasskey is true, try passkey first, fall back to PIN\n if (input.params.usePasskey) {\n if (!input.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n\n // Try passkey authentication\n const passkeyKey = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: input.params.externalUserId,\n });\n\n if (passkeyKey) {\n // Passkey succeeded — use passkey key with primary encryptedPrivateKey\n encryptKey = passkeyKey;\n } else {\n // Passkey failed (PRF unavailable, user cancelled, etc.)\n // Try PIN backup if wallet has encryptedPrivateKeyBackup\n const wallet = input.params.wallet as WalletData & {\n encryptedPrivateKeyBackup?: string;\n };\n\n if (wallet.encryptedPrivateKeyBackup && config?.onPinRequired) {\n const pin = await config.onPinRequired();\n if (!pin) {\n throw new Error(\"Transfer cancelled — PIN required as passkey fallback\");\n }\n encryptKey = pin;\n // Use the backup encrypted key for decryption\n walletForTransfer = {\n ...wallet,\n encryptedPrivateKey: wallet.encryptedPrivateKeyBackup,\n };\n } else if (wallet.encryptedPrivateKeyBackup) {\n throw new Error(\n \"Passkey authentication failed. Provide an onPinRequired callback to use PIN backup.\"\n );\n } else {\n throw new Error(\"Passkey authentication failed and no PIN backup available.\");\n }\n }\n }\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...transferParams\n } = input.params;\n return chipiSDK.transfer({\n params: {\n ...transferParams,\n wallet: walletForTransfer,\n amount: String(transferParams.amount),\n encryptKey: encryptKey,\n },\n bearerToken: input.bearerToken,\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\";\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, passkeyAdapter } = 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 if (!params.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n try {\n const key = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: params.params.externalUserId,\n });\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 if (!encryptKey) {\n throw new Error(\n \"encryptKey is required when usePasskey is false. Provide a PIN or enable usePasskey.\"\n );\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...approveParams\n } = params.params;\n return chipiSDK.approve({\n params: {\n ...approveParams,\n amount: String(approveParams.amount),\n 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<\n UseQueryOptions<PaginatedResponse<Transaction>, Error>,\n \"queryKey\" | \"queryFn\"\n >;\n};\n\ntype FetchTransactionListInput = {\n query: GetTransactionListQuery;\n getBearerToken: () => Promise<string | null | undefined>;\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: FetchTransactionListInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.query),\n queryFn: async () => {\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","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { Transaction } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\ntype GetTransactionInput = {\n hashOrId?: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Transaction, Error>, \"queryKey\" | \"queryFn\">;\n};\n\ntype FetchTransactionInput = {\n hashOrId: string;\n getBearerToken: () => Promise<string | null | undefined>;\n};\n\nexport function useGetTransaction(input?: GetTransactionInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (hashOrId?: string) => [\"transaction\", hashOrId ?? null];\n\n const query = useQuery<Transaction, Error>({\n queryKey: buildQueryKey(input?.hashOrId),\n queryFn: async () => {\n if (!input?.hashOrId) throw new Error(\"hashOrId 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.getTransaction(input.hashOrId, bearerToken);\n },\n enabled: Boolean(input?.hashOrId && input?.getBearerToken),\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTransaction = async (newInput: FetchTransactionInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.hashOrId),\n queryFn: async () => {\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransaction(newInput.hashOrId, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransaction,\n };\n}\n","\"use client\";\n\nimport { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { TransactionStatusResponse, OnChainTxStatus } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } from \"@chipi-stack/shared\";\n\n/** Terminal statuses that stop polling */\nconst TERMINAL_STATUSES: OnChainTxStatus[] = [\n OnChainTxStatus.ACCEPTED_ON_L1,\n OnChainTxStatus.REJECTED,\n OnChainTxStatus.REVERTED,\n];\n\ntype GetTransactionStatusInput = {\n hash?: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n /** Polling interval in ms. Defaults to 3000. Set to false to disable polling. */\n refetchInterval?: number | false;\n queryOptions?: Omit<\n UseQueryOptions<TransactionStatusResponse, Error>,\n \"queryKey\" | \"queryFn\" | \"refetchInterval\"\n >;\n};\n\ntype FetchTransactionStatusInput = {\n hash: string;\n getBearerToken: () => Promise<string | null | undefined>;\n};\n\nexport function useGetTransactionStatus(input?: GetTransactionStatusInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const buildQueryKey = (hash?: string) => [\"transaction-status\", hash ?? null];\n\n const query = useQuery<TransactionStatusResponse, Error>({\n queryKey: buildQueryKey(input?.hash),\n queryFn: async () => {\n if (!input?.hash) throw new Error(\"hash 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.getTransactionStatus(input.hash, bearerToken);\n },\n enabled: Boolean(input?.hash && input?.getBearerToken),\n refetchInterval: (query) => {\n // Stop polling on terminal statuses\n const status = query.state.data?.status;\n if (status && TERMINAL_STATUSES.includes(status)) {\n return false;\n }\n return input?.refetchInterval ?? 3000;\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n ...input?.queryOptions,\n });\n\n const fetchTransactionStatus = async (newInput: FetchTransactionStatusInput) => {\n return queryClient.fetchQuery({\n queryKey: buildQueryKey(newInput.hash),\n queryFn: async () => {\n const bearerToken = await newInput.getBearerToken();\n if (!bearerToken) throw new Error(\"Bearer token is required\");\n return chipiSDK.getTransactionStatus(newInput.hash, bearerToken);\n },\n retry: (failureCount: number, error: Error) => {\n if (error instanceof ChipiApiError || (error as any)?.status) {\n return false;\n }\n return failureCount < 3;\n },\n });\n };\n\n return {\n ...query,\n fetchTransactionStatus,\n };\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { SyncOnChainTransfersParams, SyncOnChainTransfersResponse } from \"@chipi-stack/types\";\n\ntype SyncOnChainInput = SyncOnChainTransfersParams & {\n bearerToken: string;\n};\n\n/**\n * Hook for syncing on-chain transfers from Voyager into the DB.\n *\n * Discovers transactions not made through the SDK (e.g., external USDC receives\n * from Argent X or other wallets). After sync, useGetTransactionList returns\n * the newly discovered transactions automatically.\n *\n * @example\n * ```tsx\n * const { syncTransfers, data, isLoading } = useSyncOnChainTransfers();\n *\n * // Sync on-chain transfers for a wallet\n * const result = await syncTransfersAsync({\n * walletAddress: wallet.publicKey,\n * bearerToken: await getToken(),\n * });\n * console.log(`Synced ${result.synced} new transfers`);\n * ```\n */\nexport function useSyncOnChainTransfers(): {\n syncTransfers: (input: SyncOnChainInput) => void;\n syncTransfersAsync: (input: SyncOnChainInput) => Promise<SyncOnChainTransfersResponse>;\n data: SyncOnChainTransfersResponse | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n} {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const mutation: UseMutationResult<SyncOnChainTransfersResponse, Error, SyncOnChainInput> =\n useMutation({\n mutationFn: async (input: SyncOnChainInput) => {\n const { bearerToken, ...params } = input;\n return chipiSDK.transactions.syncOnChainTransfers(params, bearerToken);\n },\n onSuccess: () => {\n // Invalidate transaction list cache so new txs appear immediately\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey[0] === \"transaction-list\",\n });\n },\n });\n\n return {\n syncTransfers: mutation.mutate,\n syncTransfersAsync: 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 { CreateSkuPurchaseParams, Transaction } from \"@chipi-stack/types\";\n\ntype PurchaseSkuInput = {\n params: CreateSkuPurchaseParams;\n bearerToken: string;\n};\n\n/**\n * Hook for purchasing SKUs\n */\nexport function usePurchaseSku(): {\n purchaseSku: (input: PurchaseSkuInput) => void;\n purchaseSkuAsync: (input: PurchaseSkuInput) => 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<Transaction, Error, PurchaseSkuInput> = useMutation({\n mutationFn: (input: PurchaseSkuInput) =>\n chipiSDK.purchaseSku({\n params: input.params,\n bearerToken: input.bearerToken,\n }),\n });\n\n return {\n purchaseSku: mutation.mutate,\n purchaseSkuAsync: 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 { Transaction } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\n\ntype GetSkuPurchaseInput = {\n id: string;\n getBearerToken?: () => Promise<string | null | undefined>;\n queryOptions?: Omit<UseQueryOptions<Transaction, Error>, \"queryKey\" | \"queryFn\">;\n};\n\nexport function useGetSkuPurchase(input?: GetSkuPurchaseInput) {\n const { chipiSDK } = useChipiContext();\n const queryClient = useQueryClient();\n\n const query = useQuery<Transaction, Error>({\n queryKey: [\"sku-purchase\", 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.getSkuPurchase(input.id, bearerToken);\n },\n enabled: Boolean(input?.id && input?.getBearerToken),\n ...input?.queryOptions,\n });\n\n const fetchSkuPurchase = async (newInput: GetSkuPurchaseInput) => {\n return queryClient.fetchQuery({\n queryKey: [\"sku-purchase\", 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.getSkuPurchase(newInput.id, bearerToken);\n },\n });\n };\n\n return {\n ...query,\n fetchSkuPurchase,\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 { useQuery, useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { Sku } from \"@chipi-stack/types\";\nimport { useChipiContext } from \"../context\";\nimport { ChipiApiError } 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(input?.id && input?.getBearerToken && input.id.trim() !== \"\"),\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) 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 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 fetchSku,\n };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CallAnyContractParams } from \"@chipi-stack/types\";\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, passkeyAdapter } = useChipiContext();\n\n const mutation: UseMutationResult<string, Error, CallAnyContractInput> = 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 if (!params.params.externalUserId) {\n throw new Error(\"externalUserId is required when usePasskey is true\");\n }\n try {\n const key = await passkeyAdapter.getWalletEncryptKey({\n externalUserId: params.params.externalUserId,\n });\n if (!key) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n encryptKey = key;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"NotAllowedError\") {\n throw new Error(\"Passkey authentication was cancelled by the user\");\n }\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\"Failed to authenticate with passkey\");\n }\n }\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required when usePasskey is false\");\n }\n\n const {\n usePasskey: _usePasskey,\n externalUserId: _externalUserId,\n ...contractParams\n } = params.params;\n return chipiSDK.callAnyContract({\n params: {\n ...contractParams,\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 { RecordSendTransactionParams, Transaction } 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: (input: RecordSendTransactionInput) => 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<Transaction, Error, RecordSendTransactionInput> = 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 { GetTokenBalanceParams, GetTokenBalanceResponse } 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)\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.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","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { CreateSessionKeyParams, SessionKeyData } 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: (params: CreateSessionKeyParams) => 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<SessionKeyData, Error, CreateSessionKeyParams> = 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> = useMutation({\n mutationFn: (input: AddSessionKeyInput) =>\n chipiSDK.sessions.addSessionKeyToContract(input.params, input.bearerToken),\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","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> = 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","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type { GetSessionDataParams, SessionDataResponse } 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: [\"sessionData\", params?.walletAddress, params?.sessionPublicKey],\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","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> = 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","\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useChipiContext } from \"../context\";\nimport type {\n WalletData,\n WalletType,\n PaymentRequirement,\n PaymentPayload,\n SessionKeyData,\n} from \"@chipi-stack/types\";\nimport { buildX402TypedData } from \"@chipi-stack/core\";\n\n/**\n * Configuration for useX402Payment hook\n */\nexport interface UseX402PaymentConfig {\n /** Wallet data */\n wallet: WalletData | null | undefined;\n /** Encryption key for signing */\n encryptKey: string;\n /** Function to get the bearer token for API calls */\n getBearerToken?: () => Promise<string | null | undefined>;\n /** Static bearer token string (alternative to getBearerToken) */\n bearerToken?: string;\n /** Max amount per payment (USDC, human-readable e.g. \"1.00\") */\n maxPaymentAmount?: string;\n /** Alias for maxPaymentAmount */\n maxAmount?: string;\n /** Allowed recipient addresses (whitelist). Empty = allow all. */\n allowedRecipients?: string[];\n /** Active session for automatic payments (optional) */\n session?: SessionKeyData | null;\n /** Callback on successful payment */\n onPaymentComplete?: (txHash: string, amount: string) => void | Promise<void>;\n}\n\n/**\n * Last payment info returned by the hook\n */\nexport interface LastPaymentInfo {\n txHash: string | null;\n amount: string | null;\n timestamp: number;\n}\n\n/**\n * Return type for useX402Payment hook\n */\nexport interface UseX402PaymentReturn {\n /** Fetch wrapper that auto-handles 402 payments */\n x402Fetch: (url: string, init?: Record<string, any>) => Promise<Response>;\n /** Alias for x402Fetch */\n payFetch: (url: string, init?: Record<string, any>) => Promise<Response>;\n /** Manual payment signing (for custom flows) */\n signPayment: (requirement: PaymentRequirement) => Promise<PaymentPayload>;\n /** Whether a payment is in progress */\n isPaying: boolean;\n /** Last payment transaction hash */\n lastTxHash: string | null;\n /** Last payment amount (human-readable USDC) */\n lastAmount: string | null;\n /** Last payment info (txHash + amount + timestamp) */\n lastPayment: LastPaymentInfo | null;\n /** Total USDC spent in this session (human-readable) */\n totalSpent: string;\n /** Error from last payment attempt */\n error: Error | null;\n /** Total payments made in this session */\n paymentCount: number;\n}\n\n/**\n * React hook for x402 payment protocol support.\n *\n * Wraps fetch calls with automatic HTTP 402 payment handling.\n * When a server returns 402, the hook:\n * 1. Parses the payment requirement\n * 2. Validates against configured limits\n * 3. Signs using the wallet (or session key for automatic payments)\n * 4. Retries with the X-PAYMENT header\n *\n * @example\n * ```tsx\n * const { x402Fetch, isPaying, lastTxHash, paymentCount } = useX402Payment({\n * wallet,\n * encryptKey: pin,\n * getBearerToken: getToken,\n * maxPaymentAmount: \"1.00\",\n * onPaymentComplete: (txHash, amount) => {\n * console.log(`Paid ${amount} USDC, tx: ${txHash}`);\n * },\n * });\n *\n * // Automatic 402 handling\n * const response = await x402Fetch(\"https://api.example.com/premium\");\n * const data = await response.json();\n * ```\n */\nexport function useX402Payment(config: UseX402PaymentConfig): UseX402PaymentReturn {\n const { chipiSDK } = useChipiContext();\n\n const {\n wallet,\n encryptKey,\n getBearerToken: getBearerTokenFn,\n bearerToken: staticBearerToken,\n maxPaymentAmount: maxPaymentAmountProp,\n maxAmount,\n allowedRecipients,\n session,\n onPaymentComplete,\n } = config;\n\n // Resolve maxPaymentAmount: explicit prop takes precedence over alias\n const maxPaymentAmount = maxPaymentAmountProp ?? maxAmount;\n\n // Resolve getBearerToken: function takes precedence over static string\n const getBearerToken = useMemo(\n () =>\n getBearerTokenFn ??\n (staticBearerToken\n ? () => Promise.resolve(staticBearerToken)\n : () => Promise.resolve(undefined)),\n [getBearerTokenFn, staticBearerToken]\n );\n\n const [lastTxHash, setLastTxHash] = useState<string | null>(null);\n const [lastAmount, setLastAmount] = useState<string | null>(null);\n const [lastPayment, setLastPayment] = useState<LastPaymentInfo | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const paymentCountRef = useRef(0);\n const [paymentCount, setPaymentCount] = useState(0);\n const totalSpentRef = useRef(0n);\n const [totalSpent, setTotalSpent] = useState(\"0.000000\");\n\n /**\n * Parse PAYMENT-REQUIRED header from a 402 response\n */\n const parsePaymentRequired = useCallback((response: Response): PaymentRequirement => {\n const headerValue = response.headers.get(\"payment-required\");\n\n if (!headerValue) {\n throw new Error(\n \"Server returned 402 but no PAYMENT-REQUIRED header. \" +\n \"The server may not support x402 or is misconfigured.\"\n );\n }\n\n try {\n return JSON.parse(headerValue);\n } catch {\n throw new Error(\"Malformed PAYMENT-REQUIRED header: invalid JSON\");\n }\n }, []);\n\n /**\n * Validate payment requirement against config limits and protocol constraints\n */\n const validateRequirement = useCallback(\n (requirement: PaymentRequirement): void => {\n // Validate protocol constraints\n if (requirement.scheme !== \"exact\") {\n throw new Error(\n `Unsupported payment scheme: \"${requirement.scheme}\". Only \"exact\" is supported.`\n );\n }\n if (requirement.network !== \"starknet-mainnet\") {\n throw new Error(\n `Unsupported network: \"${requirement.network}\". Only \"starknet-mainnet\" is supported.`\n );\n }\n\n // Validate asset is USDC\n const USDC_MAINNET = \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\";\n const normalizeAddr = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n if (normalizeAddr(requirement.asset) !== normalizeAddr(USDC_MAINNET)) {\n throw new Error(`Unsupported asset: ${requirement.asset}. Only USDC is supported.`);\n }\n\n // Validate required fields\n if (!requirement.payTo) {\n throw new Error(\"Invalid payment requirement: missing payTo address\");\n }\n\n // Validate maxTimeoutSeconds\n const timeoutSeconds = Number(requirement.maxTimeoutSeconds);\n if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {\n throw new Error(\"Invalid payment requirement: maxTimeoutSeconds must be a positive number\");\n }\n\n // Validate maxAmountRequired\n let requiredAmount: bigint;\n try {\n requiredAmount = BigInt(requirement.maxAmountRequired);\n } catch {\n throw new Error(\"Invalid payment requirement: maxAmountRequired must be an integer string\");\n }\n if (requiredAmount <= 0n) {\n throw new Error(\"Invalid payment requirement: maxAmountRequired must be > 0\");\n }\n\n if (maxPaymentAmount) {\n const trimmed = maxPaymentAmount.trim();\n if (!/^\\d+(\\.\\d{1,6})?$/.test(trimmed)) {\n throw new Error(`Invalid maxPaymentAmount format: \"${maxPaymentAmount}\"`);\n }\n // String-based conversion to avoid floating-point precision issues\n const [whole, frac = \"\"] = trimmed.split(\".\");\n const fracPadded = (frac + \"000000\").slice(0, 6);\n const maxBaseUnits = BigInt((whole || \"0\") + fracPadded);\n\n if (requiredAmount > maxBaseUnits) {\n const requiredHuman = (Number(requiredAmount) / 1_000_000).toFixed(6);\n throw new Error(\n `Payment amount ${requiredHuman} USDC exceeds maximum allowed ${maxPaymentAmount} USDC`\n );\n }\n }\n\n if (allowedRecipients && allowedRecipients.length > 0) {\n const normalize = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalized = normalize(requirement.payTo);\n const isAllowed = allowedRecipients.some((addr) => normalize(addr) === normalized);\n if (!isAllowed) {\n throw new Error(`Recipient ${requirement.payTo} is not in the allowed recipients list`);\n }\n }\n },\n [maxPaymentAmount, allowedRecipients]\n );\n\n /**\n * Sign a SNIP-12 typed data payment message.\n * Uses session key if available, otherwise signs locally via signTypedData().\n */\n const signPayment = useCallback(\n async (requirement: PaymentRequirement): Promise<PaymentPayload> => {\n if (!wallet) {\n throw new Error(\"Wallet is required for x402 payments\");\n }\n if (!encryptKey) {\n throw new Error(\"Encryption key (PIN) is required for x402 payments\");\n }\n\n validateRequirement(requirement);\n\n const nonce = crypto.randomUUID();\n const validUntil = Math.floor(Date.now() / 1000) + requirement.maxTimeoutSeconds;\n\n // Session key path: session keys use a 4-element signature format\n // [sessionPubKey, r, s, validUntil] that requires the full paymaster\n // execution flow (prepare-typed-data → sign → execute-sponsored-transaction).\n // We keep the executeTransactionWithSession flow here because the facilitator's\n // settle() is a no-op for session-executed payments (already on-chain).\n if (session) {\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,\n calls: [\n {\n contractAddress: requirement.asset,\n entrypoint: \"transfer\",\n calldata: [requirement.payTo, requirement.maxAmountRequired, \"0x0\"],\n },\n ],\n },\n bearerToken,\n });\n\n return {\n x402Version: 1,\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n payload: {\n signature: { r: txHash, s: \"session\" },\n fromAddress: wallet.publicKey,\n toAddress: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n validUntil,\n nonce,\n },\n };\n }\n\n // Standard wallet path: sign SNIP-12 typed data locally without executing a transaction.\n const typedData = buildX402TypedData({\n from_address: wallet.publicKey,\n to_address: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n valid_until: String(validUntil),\n nonce,\n });\n\n const signature = await chipiSDK.signTypedData({\n params: {\n encryptKey,\n wallet,\n typedData,\n },\n });\n\n return {\n x402Version: 1,\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n payload: {\n signature,\n fromAddress: wallet.publicKey,\n toAddress: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n validUntil,\n nonce,\n },\n };\n },\n [wallet, encryptKey, session, getBearerToken, chipiSDK, validateRequirement]\n );\n\n /**\n * Payment mutation for tracking state\n */\n const paymentMutation = useMutation<Response, Error, { url: string; init?: Record<string, any> }>(\n {\n mutationFn: async ({ url, init }) => {\n const response = await globalThis.fetch(url, init);\n\n if (response.status !== 402) {\n return response;\n }\n\n const requirement = parsePaymentRequired(response);\n const payment = await signPayment(requirement);\n\n // Track payment\n const humanAmount = (Number(BigInt(requirement.maxAmountRequired)) / 1_000_000).toFixed(6);\n // Session payments store txHash in signature.r with s=\"session\" marker.\n // Standard wallet payments have ECDSA signature components, not a txHash.\n const isSessionPayment = payment.payload.signature.s === \"session\";\n const txHash = isSessionPayment ? payment.payload.signature.r : null;\n\n setLastAmount(humanAmount);\n setLastTxHash(txHash);\n\n setLastPayment({ txHash, amount: humanAmount, timestamp: Date.now() });\n\n totalSpentRef.current += BigInt(requirement.maxAmountRequired);\n setTotalSpent((Number(totalSpentRef.current) / 1_000_000).toFixed(6));\n\n paymentCountRef.current += 1;\n setPaymentCount(paymentCountRef.current);\n\n // Retry with payment header\n const headers = new Headers(init?.headers);\n headers.set(\"X-PAYMENT\", JSON.stringify(payment));\n\n const paidResponse = await globalThis.fetch(url, { ...init, headers });\n if (paidResponse.status === 402) {\n throw new Error(\n \"Server returned 402 after payment was submitted. Payment may have failed verification.\"\n );\n }\n\n // Completion callback (fire-and-forget, don't block response)\n if (onPaymentComplete) {\n void Promise.resolve(onPaymentComplete(txHash ?? \"\", humanAmount)).catch(() => {});\n }\n\n return paidResponse;\n },\n onError: (err) => {\n setError(err);\n },\n onSuccess: () => {\n setError(null);\n },\n }\n );\n\n const x402Fetch = useCallback(\n async (url: string, init?: Record<string, any>): Promise<Response> => {\n return paymentMutation.mutateAsync({ url, init });\n },\n [paymentMutation]\n );\n\n return {\n x402Fetch,\n payFetch: x402Fetch,\n signPayment,\n isPaying: paymentMutation.isPending,\n lastTxHash,\n lastAmount,\n lastPayment,\n totalSpent,\n error: error || paymentMutation.error || null,\n paymentCount,\n };\n}\n"]}
|