@oasisprotocol/privana-sdk 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/hooks/use-privana-client.ts","../src/sdk/hooks/use-hosted-redirect-auth.ts","../src/sdk/hooks/use-balance.ts","../src/sdk/hooks/use-batch-balances.ts","../src/sdk/hooks/use-deposit.ts","../src/sdk/hooks/use-deposit-address.ts","../src/sdk/hooks/use-withdraw.ts","../src/sdk/hooks/use-lock-funds.ts","../src/sdk/hooks/use-unlock-funds.ts","../src/sdk/hooks/use-transfer.ts","../src/sdk/hooks/use-locked-funds.ts","../src/sdk/hooks/use-total-locked-balance.ts","../src/sdk/hooks/use-expired-locks.ts","../src/sdk/hooks/use-pending-deposits.ts","../src/sdk/hooks/use-pending-withdrawals.ts","../src/sdk/hooks/use-history.ts","../src/sdk/hooks/use-token-info.ts","../src/sdk/hooks/use-token-list.ts","../src/sdk/hooks/use-modify-lock.ts","../src/components/ui/dialog.tsx","../src/components/privana/token-icons.tsx","../src/components/privana/icons.tsx","../src/components/privana/transaction-steps.tsx","../src/components/privana/deposit-form.tsx","../src/components/privana/withdraw-form.tsx","../src/components/privana/privana-modal.tsx","../src/components/privana/privana-button.tsx","../src/sdk/hooks/use-moonpay-limits.ts","../src/components/privana/token-selector-view.tsx","../src/components/privana/credit-card-widget-view.tsx","../src/components/privana/privana-icon.tsx","../src/components/privana/allowance-policy-section.tsx","../src/components/privana/deposit-modal.tsx","../src/components/privana/withdraw-modal.tsx","../src/components/privana/wallet-modal.tsx"],"names":["usePrivanaContext","AccountingApiError","HostedAuthError","useState","useRef","useMemo","createHostedAuthPendingStorageKey","useCallback","clearHostedAuthPendingTransaction","HostedAuthRequiredError","createPkceVerifier","createPkceChallenge","createHostedAuthState","persistHostedAuthPendingTransaction","stripHostedAuthCallbackParams","parseHostedAuthCallback","readHostedAuthPendingTransaction","HostedAuthStateMismatchError","buildHostedAuthSession","useContext","QueryClientContext","useSafePrivanaContext","usePrivateReadRequest","useQuery","formatTokenAmount","setBrowserStorageItem","getBrowserStorageItem","isSignedLockUsable","removeBrowserStorageItem","useAccount","getChainById","useWalletClient","useQueryClient","useConfig","useEffect","submitPendingLock","error","PostDepositLockError","useDepositVerification","useMutation","useWriteContract","useSendTransaction","useEnsureCorrectChain","getTransactionReceipt","getBlockNumber","waitForTransactionReceipt","zeroAddress","canUseBrowserStorage","clampLockAmount","getWalletClient","createSignedLockRequest","erc20Abi","signWithdrawMessage","signLockMessage","signTransferMessage","signTransferLockedMessage","keepPreviousData","query","signModifyLockMessage","DialogPrimitive","jsx","cn","jsxs","XIcon","useBalance","useReadContract","parseTokenAmount","toast","getExplorerAddressUrl","getExplorerLabel","shortenAddress","formatTimeRemaining","Fragment","useWagmiBalance","useId","Button","MoonPayContext","TokenSelectorView","FiatOnRampForm","MoonPayProvider","QRCodeSVG","Skeleton","formatCountdown"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport { usePrivanaContext } from '../context/privana-provider'\n\nexport function usePrivanaClient() {\n const { client } = usePrivanaContext()\n return client\n}\n","'use client'\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport {\n buildHostedAuthSession,\n clearHostedAuthPendingTransaction,\n createHostedAuthPendingStorageKey,\n createHostedAuthState,\n createPkceChallenge,\n createPkceVerifier,\n parseHostedAuthCallback,\n persistHostedAuthPendingTransaction,\n readHostedAuthPendingTransaction,\n stripHostedAuthCallbackParams,\n} from '../auth'\nimport {\n AccountingApiError,\n HostedAuthError,\n HostedAuthRequiredError,\n HostedAuthStateMismatchError,\n} from '../client'\nimport { usePrivanaContext } from '../context'\nimport type { HostedAuthSession } from '../types'\n\nconst hostedAuthExchangeInflight = new Map<string, Promise<HostedAuthSession>>()\n\nfunction normalizeHostedAuthError(error: unknown): HostedAuthError | Error {\n if (error instanceof AccountingApiError && error.detail) {\n return new HostedAuthError(error.detail)\n }\n if (error instanceof Error) {\n return error\n }\n return new HostedAuthError('Hosted authentication failed.')\n}\n\nexport interface UseHostedRedirectAuthResult {\n session: HostedAuthSession | null\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | null\n login: () => Promise<void>\n completeLogin: () => Promise<HostedAuthSession | null>\n logout: () => Promise<void>\n refresh: () => Promise<HostedAuthSession>\n}\n\nexport function useHostedRedirectAuth(): UseHostedRedirectAuthResult {\n const {\n client,\n hostedAuthConfig,\n hostedAuthSession,\n networkConfig,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n } = usePrivanaContext()\n const [error, setError] = useState<Error | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const loginInflight = useRef<Promise<void> | null>(null)\n const completionInflight = useRef<Promise<HostedAuthSession | null> | null>(null)\n const pendingStorageKey = useMemo(\n () =>\n hostedAuthConfig\n ? createHostedAuthPendingStorageKey(client.getBaseUrl(), hostedAuthConfig)\n : null,\n [client, hostedAuthConfig]\n )\n\n const clearPendingLogin = useCallback(() => {\n if (!pendingStorageKey || typeof window === 'undefined') return\n clearHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n }, [pendingStorageKey])\n\n const login = useCallback(async (): Promise<void> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (loginInflight.current) {\n return loginInflight.current\n }\n\n const loginPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n try {\n const verifier = createPkceVerifier()\n const codeChallenge = await createPkceChallenge(verifier)\n const state = createHostedAuthState()\n persistHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey, {\n codeVerifier: verifier,\n state,\n })\n const authorizeUrl = client.getHostedAuthAuthorizeUrl({\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n code_challenge: codeChallenge,\n chain_id: networkConfig.chainId,\n code_challenge_method: 'S256',\n response_mode: 'redirect',\n state,\n })\n\n window.location.assign(authorizeUrl)\n } catch (loginError) {\n clearPendingLogin()\n const normalizedError = normalizeHostedAuthError(loginError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n loginInflight.current = null\n setIsLoading(false)\n }\n })()\n\n loginInflight.current = loginPromise\n return loginPromise\n }, [clearPendingLogin, client, hostedAuthConfig, networkConfig.chainId, pendingStorageKey])\n\n const completeLogin = useCallback(async (): Promise<HostedAuthSession | null> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (completionInflight.current) {\n return completionInflight.current\n }\n\n const completionPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n const callbackUrl = new URL(window.location.href)\n const cleanupCallbackUrl = () => {\n window.history.replaceState(null, '', stripHostedAuthCallbackParams(callbackUrl))\n }\n\n try {\n const callback = parseHostedAuthCallback(callbackUrl, hostedAuthConfig.redirectUri)\n if (!callback) {\n return null\n }\n\n const pending = readHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n if (!pending) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n 'Hosted authentication response could not be matched to a pending login request.'\n )\n }\n if (!callback.state || callback.state !== pending.state) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthStateMismatchError()\n }\n if ('error' in callback) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n callback.errorDescription || callback.error || 'Hosted authentication failed.'\n )\n }\n\n const { codeVerifier } = pending\n const exchangeKey = `${pendingStorageKey}:${callback.code}:${pending.state}`\n let exchangePromise = hostedAuthExchangeInflight.get(exchangeKey)\n\n if (!exchangePromise) {\n exchangePromise = (async () => {\n const response = await client.exchangeHostedAuthCode({\n code: callback.code,\n code_verifier: codeVerifier,\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n })\n\n const session = buildHostedAuthSession(response, hostedAuthConfig)\n setHostedAuthSession(session)\n clearPendingLogin()\n cleanupCallbackUrl()\n return session\n })()\n\n hostedAuthExchangeInflight.set(exchangeKey, exchangePromise)\n }\n\n try {\n return await exchangePromise\n } finally {\n if (hostedAuthExchangeInflight.get(exchangeKey) === exchangePromise) {\n hostedAuthExchangeInflight.delete(exchangeKey)\n }\n }\n } catch (completionError) {\n const normalizedError = normalizeHostedAuthError(completionError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n completionInflight.current = null\n setIsLoading(false)\n }\n })()\n\n completionInflight.current = completionPromise\n return completionPromise\n }, [clearPendingLogin, client, hostedAuthConfig, pendingStorageKey, setHostedAuthSession])\n\n const logout = useCallback(async (): Promise<void> => {\n setError(null)\n try {\n if (hostedAuthSession) {\n await client.logoutJwtSession({\n refresh_token: hostedAuthSession.refreshToken,\n })\n }\n } finally {\n clearHostedAuthSession()\n }\n }, [clearHostedAuthSession, client, hostedAuthSession])\n\n const refresh = useCallback(async (): Promise<HostedAuthSession> => {\n setIsLoading(true)\n setError(null)\n try {\n return await refreshHostedAuthSession()\n } catch (refreshError) {\n const normalizedError =\n refreshError instanceof Error\n ? refreshError\n : new HostedAuthError('Hosted authentication refresh failed.')\n setError(normalizedError)\n throw normalizedError\n } finally {\n setIsLoading(false)\n }\n }, [refreshHostedAuthSession])\n\n return {\n session: hostedAuthSession,\n isAuthenticated: !!hostedAuthSession,\n isLoading,\n error,\n login,\n completeLogin,\n logout,\n refresh,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BalanceResponse } from '../types'\nimport { formatTokenAmount } from '@/lib/utils'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseBalanceResult {\n balance: string\n balanceWei: string\n balanceFormatted: string\n tokenSymbol: string\n chainId: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBalance(options: UseBalanceOptions = {}): UseBalanceResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const defaultToken = accountingContext?.defaultToken\n const pollingInterval = accountingContext?.pollingInterval ?? 10000\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<BalanceResponse, Error>({\n queryKey: ['accounting-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n if (!client) throw new Error('No accounting client')\n return executePrivateRead(() => client.getBalance(tokenId))\n },\n enabled:\n hasProviders &&\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n const balanceWei = query.data?.balance ?? '0'\n\n return {\n balance: balanceWei,\n balanceWei,\n balanceFormatted: formatTokenAmount(balanceWei),\n tokenSymbol: query.data?.token_symbol ?? '',\n chainId: query.data?.chain_id ?? '',\n isLoading: query.isPending || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BatchBalancesResponse, TokenBalance } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBatchBalancesOptions {\n tokenIds: Bytes32[]\n enabled?: boolean\n}\n\nexport interface UseBatchBalancesResult {\n balances: TokenBalance[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBatchBalances(options: UseBatchBalancesOptions): UseBatchBalancesResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<BatchBalancesResponse, Error>({\n queryKey: ['accounting-batch-balances', ...privateReadQueryScope, options.tokenIds],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getBatchBalances({ token_ids: options.tokenIds }))\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n options.tokenIds.length > 0 &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n balances: query.data?.balances ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient, useWriteContract, useSendTransaction, useConfig } from 'wagmi'\nimport {\n getBlockNumber,\n getTransactionReceipt,\n getWalletClient,\n waitForTransactionReceipt,\n} from '@wagmi/core'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport { useDepositVerification, type VerificationContext } from './use-deposit-verification'\nimport {\n canUseBrowserStorage,\n getBrowserStorageItem,\n removeBrowserStorageItem,\n setBrowserStorageItem,\n} from './browser-storage'\nimport {\n clampLockAmount,\n createSignedLockRequest,\n isSignedLockUsable,\n submitPendingLock,\n PostDepositLockError,\n type PostDepositLockConfig,\n} from './pending-lock'\nimport type {\n Address,\n Bytes32,\n DepositAddressResponse,\n DepositCheckResponse,\n LockFundsRequest,\n TransactionSubmissionResponse,\n} from '../types'\n\nexport interface UseDepositOptions {\n onDepositAddressReceived?: (response: DepositAddressResponse) => void\n onDepositSuccess?: (txHash: string) => void\n /** `lockPending` is true when a pre-signed lock is being submitted after\n * this credit — `onLockSubmitted` or `onLockFailed` will follow. */\n onCredited?: (txHash: string, response: DepositCheckResponse, lockPending?: boolean) => void\n /** Fired when the pre-signed post-deposit lock is accepted by the API. */\n onLockSubmitted?: (response: TransactionSubmissionResponse) => void\n /**\n * Fired when the deposit credited but the pre-signed lock could not be\n * submitted (expired, short credit, stale nonce). The funds sit in the\n * user's available balance — re-prompt a fresh lock signature at the\n * credited amount. Falls back to `onError` when not provided.\n */\n onLockFailed?: (error: PostDepositLockError) => void\n /** Called when deposit check polling times out - deposit may still be processing */\n onCheckTimeout?: (txHash: string) => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking deposit status (default: 5000) */\n pollInterval?: number\n /** Max time to wait for deposit to be credited in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n /** Number of block confirmations to wait before checking deposit status (default: 15) */\n confirmations?: number\n}\n\nexport interface DepositParams {\n tokenId: Bytes32\n amount: bigint\n /**\n * Pre-sign a `Lock` for the deposited amount (capped by `maxAmount`) before\n * the transfer; the SDK submits it once the deposit credits.\n */\n postDepositLock?: PostDepositLockConfig\n}\n\nexport interface UseDepositResult {\n depositAddress: DepositAddressResponse | null\n txHash: `0x${string}` | undefined\n isGettingAddress: boolean\n isSwitchingChain: boolean\n isSendingTransaction: boolean\n isWaitingForConfirmation: boolean\n isWaitingForProcessing: boolean\n /** True if processing timed out (deposit may still be processing in background) */\n didTimeout: boolean\n /**\n * True when an on-chain transfer succeeded but the API verification step\n * (checkDeposit or status polling) failed. The funds have already left the\n * wallet, so a fresh `deposit()` would cause a double spend. Call\n * `retryVerification()` to re-run verification against the existing txHash,\n * or `reset()` to discard local tracking (the deposit may still be credited\n * in the background).\n */\n verificationFailed: boolean\n isPending: boolean\n error: Error | null\n deposit: (params: DepositParams) => Promise<void>\n /** Re-run the API verification (sweep trigger + polling) for the existing txHash. */\n retryVerification: () => Promise<void>\n reset: () => void\n}\n\ninterface PersistedDeposit {\n txHash: string\n chainId: number\n amount: string\n depositAddress: DepositAddressResponse\n signedLock?: LockFundsRequest\n savedAt: number\n}\n\nconst STALE_MS = 30 * 60 * 1000\n\nfunction storageKey(address: string): string {\n return `privana:pending-deposit:${address.toLowerCase()}`\n}\n\nfunction savePendingDeposit(address: string, data: PersistedDeposit): void {\n const stored = setBrowserStorageItem(storageKey(address), JSON.stringify(data))\n if (!stored && data.signedLock) {\n throw new Error('Unable to persist pending locked deposit for recovery')\n }\n}\n\nfunction loadPendingDeposit(address: string): PersistedDeposit | null {\n try {\n const raw = getBrowserStorageItem(storageKey(address))\n if (!raw) return null\n const data: PersistedDeposit = JSON.parse(raw)\n // A still-usable signed lock keeps the record alive past STALE_MS: the\n // lock's own expiry is the real deadline, and dropping the record here\n // would silently orphan a lock the user already signed.\n if (\n Date.now() - data.savedAt > STALE_MS &&\n !(data.signedLock && isSignedLockUsable(data.signedLock))\n ) {\n clearPendingDeposit(address)\n return null\n }\n return data\n } catch {\n return null\n }\n}\n\n// `onlyForTxHash` guards the deferred post-lock cleanup: a new deposit may\n// have persisted its own record for this address by the time the previous\n// deposit's lock submission settles, and that record must survive.\nfunction clearPendingDeposit(address: string, onlyForTxHash?: string): void {\n if (onlyForTxHash) {\n try {\n const raw = getBrowserStorageItem(storageKey(address))\n // Records without a txHash are corrupt, not a successor's — clear them.\n const recordTxHash = raw ? (JSON.parse(raw) as PersistedDeposit).txHash : undefined\n if (recordTxHash && recordTxHash !== onlyForTxHash) return\n } catch {\n // Unreadable record — fall through and clear it.\n }\n }\n removeBrowserStorageItem(storageKey(address))\n}\n\nexport function useDeposit(options: UseDepositOptions = {}): UseDepositResult {\n const { address } = useAccount()\n const { client, enabledTokens, getChainById, networkConfig, serviceAddress } = usePrivanaContext()\n const { data: walletClient } = useWalletClient()\n const queryClient = useQueryClient()\n const config = useConfig()\n const { executePrivateRead } = usePrivateReadRequest()\n\n const confirmations = options.confirmations ?? 15\n\n const [depositAddress, setDepositAddress] = useState<DepositAddressResponse | null>(null)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n const [isSwitchingChain, setIsSwitchingChain] = useState(false)\n const [isWaitingForConfirmation, setIsWaitingForConfirmation] = useState(false)\n // Captures failures from the pre-verification phase (waitForTransactionReceipt\n // timing out, etc.) so we can OR them with the verification hook's own\n // verificationFailed when surfacing state to consumers.\n const [receiptFailed, setReceiptFailed] = useState(false)\n const [depositError, setDepositError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n // Set the moment we know an on-chain transfer has been dispatched so we\n // refuse a second deposit() call that would double-spend. Cleared on\n // credit / reset.\n const verificationContextRef = useRef<VerificationContext | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running deposit flow\n const onDepositAddressReceivedRef = useRef(options.onDepositAddressReceived)\n const onDepositSuccessRef = useRef(options.onDepositSuccess)\n const onCreditedRef = useRef(options.onCredited)\n const onLockSubmittedRef = useRef(options.onLockSubmitted)\n const onLockFailedRef = useRef(options.onLockFailed)\n const onCheckTimeoutRef = useRef(options.onCheckTimeout)\n const onErrorRef = useRef(options.onError)\n useEffect(() => {\n onDepositAddressReceivedRef.current = options.onDepositAddressReceived\n onDepositSuccessRef.current = options.onDepositSuccess\n onCreditedRef.current = options.onCredited\n onLockSubmittedRef.current = options.onLockSubmitted\n onLockFailedRef.current = options.onLockFailed\n onCheckTimeoutRef.current = options.onCheckTimeout\n onErrorRef.current = options.onError\n }, [\n options.onDepositAddressReceived,\n options.onDepositSuccess,\n options.onCredited,\n options.onLockSubmitted,\n options.onLockFailed,\n options.onCheckTimeout,\n options.onError,\n ])\n\n // Signed lock waiting for the deposit to credit. Mirrors the persisted copy\n // so a resumed session can still submit it.\n const pendingLockRef = useRef<LockFundsRequest | null>(null)\n\n // The deposit is credited either way; only the lock half can fail here, so\n // route failures to the dedicated callback (or onError as fallback) instead\n // of the deposit error state.\n const submitPendingLockAfterCredit = useCallback(\n async (signedLock: LockFundsRequest, response: DepositCheckResponse) => {\n try {\n const result = await submitPendingLock({\n client,\n payload: signedLock,\n creditedAmount: response.amount != null ? BigInt(response.amount) : undefined,\n })\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onLockSubmittedRef.current?.(result)\n } catch (err) {\n const error =\n err instanceof PostDepositLockError\n ? err\n : new PostDepositLockError(\n err instanceof Error ? err.message : 'Lock submission failed',\n 'submission-failed',\n BigInt(signedLock.amount),\n undefined,\n { cause: err }\n )\n ;(onLockFailedRef.current ?? onErrorRef.current)?.(error)\n }\n },\n [client, queryClient]\n )\n\n const {\n isVerifying,\n didTimeout,\n verificationFailed: innerVerificationFailed,\n error: verificationError,\n verify,\n reset: resetVerification,\n } = useDepositVerification({\n pollInterval: options.pollInterval,\n pollTimeout: options.pollTimeout,\n onCredited: (hash, response) => {\n verificationContextRef.current = null\n const signedLock = pendingLockRef.current\n pendingLockRef.current = null\n // Kick off the lock submission before the host callback: a throwing\n // onCredited must not be able to strand the signed lock. Keep the\n // persisted record (it carries the signed lock) until the attempt\n // settles, so a tab close mid-submission can retry next session.\n // At-least-once edge: if the tab dies after the API accepted the lock\n // but before the response arrived, the retry re-submits a consumed\n // nonce and surfaces as a (fund-safe) spurious 'lock failed' — the\n // client cannot distinguish that from a submission that never landed.\n if (signedLock) {\n void submitPendingLockAfterCredit(signedLock, response).finally(() => {\n if (address) clearPendingDeposit(address, hash)\n })\n } else if (address) {\n clearPendingDeposit(address)\n }\n onCreditedRef.current?.(hash, response, signedLock !== null)\n },\n onCheckTimeout: (hash) => {\n onCheckTimeoutRef.current?.(hash)\n },\n onError: (err) => {\n onErrorRef.current?.(err)\n },\n })\n\n const addressMutation = useMutation({\n mutationFn: async () => {\n if (!address) throw new Error('No wallet connected')\n return executePrivateRead(() => client.getDepositAddress())\n },\n onSuccess: (data) => {\n setDepositAddress(data)\n onDepositAddressReceivedRef.current?.(data)\n },\n onError: (error) => {\n onErrorRef.current?.(error as Error)\n },\n })\n\n const {\n writeContractAsync,\n isPending: isWritingContract,\n error: writeError,\n reset: resetWriteContract,\n } = useWriteContract()\n\n const {\n sendTransactionAsync,\n isPending: isSendingNative,\n error: sendNativeError,\n reset: resetSendTransaction,\n } = useSendTransaction()\n\n const isSendingTx = isWritingContract || isSendingNative\n const sendError = writeError ?? sendNativeError\n\n const { ensureCorrectChain } = useEnsureCorrectChain()\n\n const invalidateGeneration = useCallback(() => {\n generationRef.current++\n }, [])\n\n // Cleanup in-flight async work on unmount.\n useEffect(() => {\n return () => {\n invalidateGeneration()\n }\n }, [invalidateGeneration])\n\n const resumedAddressRef = useRef<string | undefined>(undefined)\n\n const reset = useCallback(() => {\n generationRef.current++\n resetVerification()\n if (address) clearPendingDeposit(address)\n verificationContextRef.current = null\n pendingLockRef.current = null\n setDepositAddress(null)\n setTxHash(undefined)\n setIsSwitchingChain(false)\n setIsWaitingForConfirmation(false)\n setReceiptFailed(false)\n setDepositError(null)\n addressMutation.reset()\n resetWriteContract()\n resetSendTransaction()\n }, [address, addressMutation, resetWriteContract, resetSendTransaction, resetVerification])\n\n // Resume a persisted deposit on mount\n useEffect(() => {\n if (!address || resumedAddressRef.current === address) return\n const persisted = loadPendingDeposit(address)\n if (!persisted) return\n resumedAddressRef.current = address\n\n const hash = persisted.txHash as `0x${string}`\n setTxHash(hash)\n setDepositAddress(persisted.depositAddress)\n setIsWaitingForConfirmation(true)\n pendingLockRef.current = persisted.signedLock ?? null\n const ctx: VerificationContext = {\n hash,\n chainId: persisted.chainId,\n amount: BigInt(persisted.amount),\n }\n verificationContextRef.current = ctx\n\n const generation = ++generationRef.current\n const isStale = () => generation !== generationRef.current\n\n ;(async () => {\n try {\n // Try a one-shot receipt fetch first. Resumed deposits were submitted\n // in a previous session, so the transaction is almost certainly mined\n // already. getTransactionReceipt avoids the subscription-based polling\n // of waitForTransactionReceipt, which can hang if the wagmi transport\n // isn't fully initialised yet on mount.\n let confirmed = false\n try {\n const receipt = await getTransactionReceipt(config, {\n hash,\n chainId: persisted.chainId,\n })\n // A receipt exists from the first block, so accepting it alone would\n // confirm a resumed deposit at 1 block where a live one waits 15.\n const blockNumber = await getBlockNumber(config, { chainId: persisted.chainId })\n confirmed = blockNumber - receipt.blockNumber + 1n >= BigInt(confirmations)\n } catch {\n // Receipt not available yet — fall back to polling\n }\n if (!confirmed) {\n await waitForTransactionReceipt(config, {\n hash,\n chainId: persisted.chainId,\n confirmations,\n })\n }\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n onDepositSuccessRef.current?.(hash)\n queryClient.invalidateQueries({ queryKey: ['readContract'] })\n await verify(ctx)\n } catch (err) {\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n setDepositError(error)\n setReceiptFailed(true)\n onErrorRef.current?.(error)\n }\n })()\n }, [address, config, confirmations, queryClient, verify])\n\n const deposit = useCallback(\n async (params: DepositParams) => {\n // Guard: a prior deposit already sent funds on-chain and is waiting on\n // verification. Starting a new flow here would issue a second transfer.\n if (verificationContextRef.current) {\n throw new Error(\n 'A deposit is pending verification. Call retryVerification() or reset() first.'\n )\n }\n\n // Clear state from any previous deposit attempt\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('No wallet connected')\n\n // Resolve token and source chain before anything else\n const token = enabledTokens.find((t) => t.id.toLowerCase() === params.tokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token ID: ${params.tokenId}`)\n const sourceChain = getChainById(token.chainId)\n if (!sourceChain) throw new Error(`Chain ${token.chainId} not configured`)\n\n // 1. Get deposit address\n const addrResponse = await addressMutation.mutateAsync()\n if (isStale()) return\n\n // 2. Validate deposit address\n const depositAddr = addrResponse.deposit_address\n if (!depositAddr || depositAddr === zeroAddress) {\n throw new Error('Invalid deposit address received from API')\n }\n\n // 3. Validate amount against the backend minimum. Below this the\n // deposit processor refuses to credit and funds would be stranded\n // at the per-user deposit address.\n const isNative = token.contract === zeroAddress\n const minsForChain = addrResponse.min_deposit?.[String(sourceChain.id)]\n const minAmountStr = isNative ? minsForChain?.native : minsForChain?.erc20\n if (minAmountStr && params.amount < BigInt(minAmountStr)) {\n throw new Error(\n `Amount is below the minimum deposit (${minAmountStr}) for ${isNative ? 'native' : 'ERC-20'} on chain ${sourceChain.id}`\n )\n }\n\n if (params.postDepositLock && !canUseBrowserStorage()) {\n throw new Error('Browser storage is required for locked deposit recovery')\n }\n // 4. Sign the exact-amount Lock before any funds move, so the transfer\n // never proceeds without a submittable lock payload in hand. The Lock\n // domain lives on the Accounting chain and wallets reject typed data\n // whose domain chainId differs from the active chain, so switch there\n // before signing.\n const lockAmount = clampLockAmount(params.amount, params.postDepositLock?.maxAmount)\n let signedLock: LockFundsRequest | undefined\n if (params.postDepositLock) {\n setIsSwitchingChain(true)\n try {\n await ensureCorrectChain(networkConfig.chainId)\n } finally {\n if (!isStale()) setIsSwitchingChain(false)\n }\n if (isStale()) return\n // Re-fetch the wallet client bound to the signing chain: the\n // render-time client can go stale across the chain switch above and\n // wagmi then rejects the signature with a chain mismatch.\n const signingWalletClient = await getWalletClient(config, {\n chainId: networkConfig.chainId,\n })\n signedLock = await createSignedLockRequest({\n client,\n walletClient: signingWalletClient,\n userAddress: address as Address,\n networkConfig,\n serviceAddress: requireServiceAddress(\n params.postDepositLock.serviceAddress ?? serviceAddress\n ),\n tokenId: params.tokenId,\n amount: lockAmount,\n lockDuration: params.postDepositLock.lockDuration,\n })\n }\n if (isStale()) return\n\n // 5. Switch to the source chain and send the transfer to the deposit\n // address (native or ERC-20)\n setIsSwitchingChain(true)\n try {\n await ensureCorrectChain(sourceChain.id)\n } finally {\n if (!isStale()) setIsSwitchingChain(false)\n }\n if (isStale()) return\n const hash =\n token.contract === zeroAddress\n ? await sendTransactionAsync({\n to: depositAddr,\n value: params.amount,\n chainId: sourceChain.id,\n })\n : await writeContractAsync({\n address: token.contract,\n abi: erc20Abi,\n functionName: 'transfer',\n args: [depositAddr, params.amount],\n chainId: sourceChain.id,\n })\n if (isStale()) return\n setTxHash(hash)\n\n // Past this point the wallet has already dispatched the transfer, so any\n // subsequent failure must preserve the hash and route to a retry state\n // rather than appearing terminal.\n const ctx: VerificationContext = {\n hash,\n chainId: sourceChain.id,\n amount: params.amount,\n }\n verificationContextRef.current = ctx\n pendingLockRef.current = signedLock ?? null\n try {\n savePendingDeposit(address, {\n txHash: hash,\n chainId: sourceChain.id,\n amount: params.amount.toString(),\n depositAddress: addrResponse,\n signedLock,\n savedAt: Date.now(),\n })\n } catch (err) {\n console.warn('Failed to persist pending deposit after transfer broadcast:', err)\n }\n\n try {\n // 6. Wait for on-chain confirmation\n setIsWaitingForConfirmation(true)\n try {\n await waitForTransactionReceipt(config, {\n hash,\n chainId: sourceChain.id,\n confirmations,\n })\n } finally {\n if (!isStale()) setIsWaitingForConfirmation(false)\n }\n if (isStale()) return\n\n onDepositSuccessRef.current?.(hash)\n\n // Invalidate wagmi wallet balance queries since tokens have left the wallet\n queryClient.invalidateQueries({ queryKey: ['readContract'] })\n\n // 6-7. Verification (phase 1 + phase 2) delegated to useDepositVerification\n await verify(ctx)\n } catch (err) {\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n setDepositError(error)\n setReceiptFailed(true)\n onErrorRef.current?.(error)\n }\n } catch (err) {\n if (isStale()) return\n const error = err instanceof Error ? err : new Error('Deposit failed')\n // Pre-transfer failure: nothing left the wallet, safe to surface\n // as a terminal error. Post-transfer failures are handled in the\n // inner catch above and never reach here.\n setDepositError(error)\n onErrorRef.current?.(error)\n }\n },\n [\n address,\n walletClient,\n addressMutation,\n client,\n getChainById,\n config,\n confirmations,\n enabledTokens,\n ensureCorrectChain,\n networkConfig,\n queryClient,\n serviceAddress,\n writeContractAsync,\n sendTransactionAsync,\n reset,\n verify,\n ]\n )\n\n // Wrap the inner hook's retry so it works after a wallet/receipt-phase failure\n // too. We keep our own ctx set the moment the on-chain transfer is dispatched,\n // before waitForTransactionReceipt — the inner hook only knows about\n // contexts that reached verify(). Also clear receipt-phase failure state so a\n // retry isn't surfaced as \"failed and verifying\" simultaneously.\n const retryVerification = useCallback(async (): Promise<void> => {\n const ctx = verificationContextRef.current\n if (!ctx) {\n throw new Error('No pending deposit to verify')\n }\n setReceiptFailed(false)\n setDepositError(null)\n await verify(ctx)\n }, [verify])\n\n const isPending =\n addressMutation.isPending ||\n isSwitchingChain ||\n isSendingTx ||\n isWaitingForConfirmation ||\n isVerifying\n\n const error = addressMutation.error || sendError || depositError || verificationError\n\n return {\n depositAddress,\n txHash,\n isGettingAddress: addressMutation.isPending,\n isSwitchingChain,\n isSendingTransaction: isSendingTx,\n isWaitingForConfirmation,\n isWaitingForProcessing: isVerifying,\n didTimeout,\n verificationFailed: innerVerificationFailed || receiptFailed,\n isPending,\n error: error as Error | null,\n deposit,\n retryVerification,\n reset,\n }\n}\n\nfunction requireServiceAddress(serviceAddress: Address | undefined): Address {\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n return serviceAddress\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport type { DepositAddressResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseDepositAddressOptions {\n enabled?: boolean\n}\n\nexport interface UseDepositAddressResult {\n depositAddress: string | null\n isReady: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\n/**\n * Fetches the user's Privana deposit address via the SIWE private-read flow\n * (`POST /v1/accounting/deposits/address`) — the same authenticated path used\n * by `useFiatOnRamp`. Used by the external-wallet deposit view to show a QR\n * code / copyable address to send funds to.\n */\nexport function useDepositAddress(options: UseDepositAddressOptions = {}): UseDepositAddressResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n const isReady = hasProviders && privateReadReady && !!privateReadAddress && !!client\n\n const query = useQuery<DepositAddressResponse, Error>({\n queryKey: ['accounting-deposit-address', ...privateReadQueryScope],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!client) throw new Error('No accounting client')\n return executePrivateRead(() => client.getDepositAddress())\n },\n enabled: isReady && (options.enabled ?? true),\n })\n\n return {\n depositAddress: query.data?.deposit_address ?? null,\n isReady,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { signWithdrawMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseWithdrawOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is submitted to the backend */\n onSubmitSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is fully processed (broadcast to destination chain) */\n onProcessingSuccess?: () => void\n /** Called when processing times out - withdrawal may still be processing */\n onProcessingTimeout?: () => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking withdrawal status (default: 3000) */\n pollInterval?: number\n /** Max time to wait for withdrawal to be processed in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n}\n\nexport interface WithdrawParams {\n tokenId: Bytes32\n amount: bigint\n}\n\nexport type WithdrawStep = 'idle' | 'switching-chain' | 'signing' | 'submitting' | 'processing'\n\nexport interface UseWithdrawResult {\n withdraw: (params: WithdrawParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n currentStep: WithdrawStep\n /** True if processing timed out (withdrawal may still be processing in background) */\n didTimeout: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useWithdraw(options: UseWithdrawOptions = {}): UseWithdrawResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n const { chainId, ensureCorrectChain } = useEnsureCorrectChain()\n\n const pollInterval = options.pollInterval ?? 3000\n const pollTimeout = options.pollTimeout ?? 180000\n\n const [currentStep, setCurrentStep] = useState<WithdrawStep>('idle')\n const [didTimeout, setDidTimeout] = useState(false)\n const [isSuccess, setIsSuccess] = useState(false)\n const [withdrawError, setWithdrawError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running withdraw flow\n const onSubmitSuccessRef = useRef(options.onSubmitSuccess)\n const onProcessingSuccessRef = useRef(options.onProcessingSuccess)\n const onProcessingTimeoutRef = useRef(options.onProcessingTimeout)\n const onSuccessRef = useRef(options.onSuccess)\n const onErrorRef = useRef(options.onError)\n\n useEffect(() => {\n onSubmitSuccessRef.current = options.onSubmitSuccess\n onProcessingSuccessRef.current = options.onProcessingSuccess\n onProcessingTimeoutRef.current = options.onProcessingTimeout\n onSuccessRef.current = options.onSuccess\n onErrorRef.current = options.onError\n }, [\n options.onSubmitSuccess,\n options.onProcessingSuccess,\n options.onProcessingTimeout,\n options.onSuccess,\n options.onError,\n ])\n\n const { chainId: signingChainId } = networkConfig\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n }\n }\n }, [])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(false)\n setIsSuccess(false)\n setWithdrawError(null)\n }, [stopPolling])\n\n const withdraw = useCallback(\n async (params: WithdrawParams): Promise<TransactionSubmissionResponse | undefined> => {\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('Wallet not connected')\n\n // Snapshot pending withdrawal indices so we can detect the new one after submission\n const pendingResponse = await client.getPendingWithdrawals(address)\n if (isStale()) return undefined\n const knownIndices = new Set(pendingResponse.pending_withdrawals.map((w) => w.index))\n\n // 1. Switch to signing chain\n if (chainId !== signingChainId) {\n setCurrentStep('switching-chain')\n }\n await ensureCorrectChain(signingChainId)\n if (isStale()) return undefined\n\n // 2. Fetch nonce from API (direct Sapphire contract reads revert without encrypted calldata)\n const nonceResponse = await client.getWithdrawalNonce(address)\n if (isStale()) return undefined\n const nonce = BigInt(nonceResponse.nonce)\n\n // 3. Sign EIP-712 message\n setCurrentStep('signing')\n const signature = await signWithdrawMessage({\n walletClient,\n chainId: signingChainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n tokenId: params.tokenId,\n amount: params.amount,\n nonce,\n },\n })\n if (isStale()) return undefined\n\n // 4. Submit to API\n setCurrentStep('submitting')\n const submissionResponse = await client.requestWithdrawal({\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n if (isStale()) return submissionResponse\n\n onSubmitSuccessRef.current?.(submissionResponse)\n onSuccessRef.current?.(submissionResponse)\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n\n // 5. Poll for withdrawal completion\n setCurrentStep('processing')\n const pollStartTime = Date.now()\n let withdrawalIndex: number | null = null\n let consecutiveFailures = 0\n\n const handleSuccess = () => {\n stopPolling()\n setCurrentStep('idle')\n setIsSuccess(true)\n onProcessingSuccessRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const handleTimeout = () => {\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(true)\n onProcessingTimeoutRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const checkWithdrawalStatus = async (): Promise<boolean> => {\n if (isStale()) return true\n\n if (Date.now() - pollStartTime > pollTimeout) {\n handleTimeout()\n return true\n }\n\n try {\n if (withdrawalIndex !== null) {\n const info = await client.getWithdrawalInfo(withdrawalIndex)\n if (isStale()) return true\n consecutiveFailures = 0\n if (info.resolved) {\n handleSuccess()\n return true\n }\n return false\n }\n\n // Find our new withdrawal in the pending list by matching against the\n // pre-submission snapshot. This avoids sequential index scanning.\n const pending = await client.getPendingWithdrawals(address)\n if (isStale()) return true\n consecutiveFailures = 0\n const match = pending.pending_withdrawals.find(\n (w) =>\n !knownIndices.has(w.index) &&\n w.user_address.toLowerCase() === address.toLowerCase() &&\n w.token_id.toLowerCase() === params.tokenId.toLowerCase() &&\n w.amount === String(params.amount)\n )\n\n if (match) {\n withdrawalIndex = match.index\n if (match.resolved) {\n handleSuccess()\n return true\n }\n }\n } catch (err) {\n if (isStale()) return true\n consecutiveFailures++\n console.warn('Error polling withdrawal status:', err)\n if (consecutiveFailures >= 3) {\n handleTimeout()\n return true\n }\n }\n return false\n }\n\n const pollLoop = async () => {\n const done = await checkWithdrawalStatus()\n if (!done && !isStale() && pollIntervalRef.current !== null) {\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n }\n }\n pollIntervalRef.current = setTimeout(pollLoop, 0)\n\n return submissionResponse\n } catch (err) {\n if (isStale()) return undefined\n const error = err instanceof Error ? err : new Error('Withdrawal failed')\n setCurrentStep('idle')\n setWithdrawError(error)\n onErrorRef.current?.(error)\n return undefined\n }\n },\n [\n address,\n walletClient,\n client,\n chainId,\n signingChainId,\n networkConfig.accountingContract,\n ensureCorrectChain,\n pollInterval,\n pollTimeout,\n queryClient,\n stopPolling,\n reset,\n ]\n )\n\n const isPending = currentStep !== 'idle'\n\n return {\n withdraw,\n isPending,\n isSuccess,\n currentStep,\n didTimeout,\n error: withdrawError,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signLockMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseLockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface LockFundsParams {\n tokenId: Bytes32\n amount: bigint\n expiry: bigint\n}\n\nexport interface UseLockFundsResult {\n lockFunds: (params: LockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useLockFunds(options: UseLockFundsOptions = {}): UseLockFundsResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: LockFundsParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getLockNonce(address)\n\n const signature = await signLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n serviceAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n expiry: params.expiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.lockFunds({\n service_address: serviceAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n expiry: params.expiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const lockFunds = useCallback(\n async (params: LockFundsParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n lockFunds,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseUnlockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface UnlockFundsParams {\n lockId: number\n}\n\nexport interface UseUnlockFundsResult {\n unlockFunds: (params: UnlockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n unlockAllExpired: () => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useUnlockFunds(options: UseUnlockFundsOptions = {}): UseUnlockFundsResult {\n const { address } = useAccount()\n const { client } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const unlockMutation = useMutation({\n mutationFn: async (params: UnlockFundsParams) => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockFunds({\n user_address: address,\n lock_id: params.lockId,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockAllMutation = useMutation({\n mutationFn: async () => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockAllExpired({\n user_address: address,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockFunds = useCallback(\n async (params: UnlockFundsParams) => {\n return unlockMutation.mutateAsync(params)\n },\n [unlockMutation]\n )\n\n const unlockAllExpired = useCallback(async () => {\n return unlockAllMutation.mutateAsync()\n }, [unlockAllMutation])\n\n const reset = useCallback(() => {\n unlockMutation.reset()\n unlockAllMutation.reset()\n }, [unlockMutation, unlockAllMutation])\n\n return {\n unlockFunds,\n unlockAllExpired,\n isPending: unlockMutation.isPending || unlockAllMutation.isPending,\n isSuccess: unlockMutation.isSuccess || unlockAllMutation.isSuccess,\n error: (unlockMutation.error || unlockAllMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signTransferMessage, signTransferLockedMessage } from '../signatures'\nimport type { Bytes32, Address, TransactionSubmissionResponse } from '../types'\n\nexport interface UseTransferOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface TransferParams {\n toAddress: Address\n tokenId: Bytes32\n amount: bigint\n}\n\nexport interface TransferLockedParams {\n lockId: number\n toAddress: Address\n amount: bigint\n}\n\nexport interface UseTransferResult {\n transfer: (params: TransferParams) => Promise<TransactionSubmissionResponse | undefined>\n transferLocked: (\n params: TransferLockedParams\n ) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useTransfer(options: UseTransferOptions = {}): UseTransferResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const transferMutation = useMutation({\n mutationFn: async (params: TransferParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getTransferNonce(address)\n\n const signature = await signTransferMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n toAddress: params.toAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n nonce: BigInt(nonce),\n },\n })\n\n return client.transferFunds({\n to_address: params.toAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transferLockedMutation = useMutation({\n mutationFn: async (params: TransferLockedParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getTransferLockedNonce(serviceAddress)\n\n const signature = await signTransferLockedMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n userAddress: address,\n toAddress: params.toAddress,\n lockId: BigInt(params.lockId),\n amount: params.amount,\n nonce: BigInt(nonce),\n serviceAddress,\n },\n })\n\n return client.transferLockedFunds({\n user_address: address,\n lock_id: params.lockId,\n to_address: params.toAddress,\n amount: params.amount.toString(),\n service_address: serviceAddress,\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transfer = useCallback(\n async (params: TransferParams) => {\n return transferMutation.mutateAsync(params)\n },\n [transferMutation]\n )\n\n const transferLocked = useCallback(\n async (params: TransferLockedParams) => {\n return transferLockedMutation.mutateAsync(params)\n },\n [transferLockedMutation]\n )\n\n const reset = useCallback(() => {\n transferMutation.reset()\n transferLockedMutation.reset()\n }, [transferMutation, transferLockedMutation])\n\n return {\n transfer,\n transferLocked,\n isPending: transferMutation.isPending || transferLockedMutation.isPending,\n isSuccess: transferMutation.isSuccess || transferLockedMutation.isSuccess,\n error: (transferMutation.error || transferLockedMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, LockedFundsResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseLockedFundsOptions {\n enabled?: boolean\n}\n\nexport interface UseLockedFundsResult {\n locks: LockInfo[]\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useLockedFunds(options: UseLockedFundsOptions = {}): UseLockedFundsResult {\n const { client, pollingInterval, serviceAddress } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<LockedFundsResponse, Error>({\n queryKey: ['accounting-locked-funds', ...privateReadQueryScope, serviceAddress ?? null],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getLockedFunds(serviceAddress))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n locks: query.data?.locks ?? [],\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TotalLockedBalanceResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseTotalLockedBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseTotalLockedBalanceResult {\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTotalLockedBalance(\n options: UseTotalLockedBalanceOptions = {}\n): UseTotalLockedBalanceResult {\n const { client, pollingInterval, defaultToken } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<TotalLockedBalanceResponse, Error>({\n queryKey: ['accounting-total-locked-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n return executePrivateRead(() => client.getTotalLockedBalance(tokenId))\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, ExpiredLocksResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseExpiredLocksOptions {\n enabled?: boolean\n}\n\nexport interface UseExpiredLocksResult {\n expiredLocks: LockInfo[]\n hasExpiredLocks: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useExpiredLocks(options: UseExpiredLocksOptions = {}): UseExpiredLocksResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<ExpiredLocksResponse, Error>({\n queryKey: ['accounting-expired-locks', ...privateReadQueryScope],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getExpiredLocks())\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n })\n\n const expiredLocks = query.data?.expired_locks ?? []\n\n return {\n expiredLocks,\n hasExpiredLocks: expiredLocks.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport { AccountingApiError } from '../client/errors'\nimport type { Address, PendingDeposit, PendingDepositsResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UsePendingDepositsOptions {\n /** Source chain to scan. Query is disabled while undefined. */\n chainId?: number\n enabled?: boolean\n /** Auto-poll cadence in ms, or false for manual refetch only (default: 30s, the server scan-cache TTL). */\n refetchInterval?: number | false\n /** Narrow the scan to one registered ERC20. */\n tokenAddress?: Address\n /** Scan window in blocks (server default ≈ 1h, clamped ≈ 24h). */\n lookbackBlocks?: number\n}\n\nexport interface UsePendingDepositsResult {\n pending: PendingDeposit[]\n scannedToBlock: number | undefined\n isFetching: boolean\n isError: boolean\n error: Error | null\n isRateLimited: boolean\n /** Discovery is not configured for this chain server-side (503) — a deployment fault, not transient. */\n isUnavailable: boolean\n refetch: () => Promise<PendingDepositsResponse | undefined>\n}\n\nfunction statusCodeOf(error: unknown): number | undefined {\n return error instanceof AccountingApiError ? error.statusCode : undefined\n}\n\nexport function usePendingDeposits(\n options: UsePendingDepositsOptions = {}\n): UsePendingDepositsResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const { chainId, tokenAddress, lookbackBlocks } = options\n\n const query = useQuery<PendingDepositsResponse, Error>({\n queryKey: ['accounting-pending-deposits', ...privateReadQueryScope, chainId, tokenAddress],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!chainId) throw new Error('No chain ID provided')\n if (!client) throw new Error('No accounting client')\n try {\n return await executePrivateRead(() =>\n client.getPendingDeposits({\n chain_id: chainId,\n token_address: tokenAddress,\n lookback_blocks: lookbackBlocks,\n })\n )\n } catch (error: unknown) {\n if (statusCodeOf(error) === 404) {\n return { pending: [], scanned_from_block: 0, scanned_to_block: 0 }\n }\n throw error\n }\n },\n enabled:\n hasProviders &&\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!chainId &&\n !!client,\n // A 503 means discovery is not configured for this chain server-side —\n // polling can't fix that, so stop until a manual refetch succeeds.\n refetchInterval: (query) =>\n statusCodeOf(query.state.error) === 503 ? false : (options.refetchInterval ?? 30_000),\n staleTime: 25_000,\n retry: (failureCount, error) => {\n const status = statusCodeOf(error)\n if (status === 429 || status === 404 || status === 503) return false\n return failureCount < 2\n },\n })\n\n return {\n pending: query.data?.pending ?? [],\n scannedToBlock: query.data?.scanned_to_block,\n isFetching: query.isFetching,\n isError: query.isError,\n error: query.error,\n isRateLimited: statusCodeOf(query.error) === 429,\n isUnavailable: statusCodeOf(query.error) === 503,\n refetch: async () => (await query.refetch()).data,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { WithdrawalInfo, PendingWithdrawalsResponse } from '../types'\n\nexport interface UsePendingWithdrawalsOptions {\n enabled?: boolean\n}\n\nexport interface UsePendingWithdrawalsResult {\n withdrawals: WithdrawalInfo[]\n hasPendingWithdrawals: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function usePendingWithdrawals(\n options: UsePendingWithdrawalsOptions = {}\n): UsePendingWithdrawalsResult {\n const { address, isConnected } = useAccount()\n const { client, pollingInterval } = usePrivanaContext()\n\n const query = useQuery<PendingWithdrawalsResponse, Error>({\n queryKey: ['accounting-pending-withdrawals', address],\n queryFn: async (): Promise<PendingWithdrawalsResponse> => {\n if (!address) throw new Error('No wallet connected')\n try {\n return await client.getPendingWithdrawals(address)\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'statusCode' in error &&\n error.statusCode === 404\n ) {\n return { user_address: address, pending_withdrawals: [] }\n }\n throw error\n }\n },\n enabled: (options.enabled ?? true) && isConnected && !!address,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n retry: (failureCount, error) => {\n if (error && typeof error === 'object' && 'statusCode' in error && error.statusCode === 404) {\n return false\n }\n return failureCount < 3\n },\n })\n\n const withdrawals = query.data?.pending_withdrawals ?? []\n\n return {\n withdrawals,\n hasPendingWithdrawals: withdrawals.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { HistoryEntry, HistoryResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseHistoryOptions {\n offset?: number\n limit?: number\n enabled?: boolean\n}\n\nexport interface UseHistoryResult {\n history: HistoryEntry[]\n total: number\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useHistory(options: UseHistoryOptions = {}): UseHistoryResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const offset = options.offset ?? -1\n const limit = options.limit ?? 50\n\n const query = useQuery<HistoryResponse, Error>({\n queryKey: ['accounting-history', ...privateReadQueryScope, offset, limit],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getHistory({ offset, limit }))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n history: query.data?.history ?? [],\n total: query.data?.total ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TokenInfoResponse } from '../types'\n\nexport interface UseTokenInfoOptions {\n tokenId?: Bytes32 | string\n enabled?: boolean\n}\n\nexport interface UseTokenInfoResult {\n data: TokenInfoResponse | undefined\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenInfo(options: UseTokenInfoOptions = {}): UseTokenInfoResult {\n const { client } = usePrivanaContext()\n const { tokenId } = options\n\n const query = useQuery<TokenInfoResponse, Error>({\n queryKey: ['accounting-token-info', tokenId],\n queryFn: () => {\n if (!tokenId) throw new Error('No token ID provided')\n return client.getTokenInfo(tokenId)\n },\n enabled: (options.enabled ?? true) && !!tokenId && !!client,\n staleTime: Infinity,\n })\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TokenInfoResponse, TokenListResponse } from '../types'\n\nexport interface UseTokenListOptions {\n enabled?: boolean\n}\n\nexport interface UseTokenListResult {\n tokens: TokenInfoResponse[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenList(options: UseTokenListOptions = {}): UseTokenListResult {\n const { client } = usePrivanaContext()\n\n const query = useQuery<TokenListResponse, Error>({\n queryKey: ['accounting-token-list'],\n queryFn: () => client.listTokens(),\n enabled: (options.enabled ?? true) && !!client,\n staleTime: Infinity,\n })\n\n return {\n tokens: query.data?.tokens ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signModifyLockMessage } from '../signatures'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseModifyLockOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface ModifyLockParams {\n lockId: number\n amount: bigint\n newExpiry: bigint\n}\n\nexport interface UseModifyLockResult {\n modifyLock: (params: ModifyLockParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useModifyLock(options: UseModifyLockOptions = {}): UseModifyLockResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: ModifyLockParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getModifyLockNonce(address)\n\n const signature = await signModifyLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n lockId: BigInt(params.lockId),\n amount: params.amount,\n newExpiry: params.newExpiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.modifyLock({\n lock_id: params.lockId,\n amount: params.amount.toString(),\n new_expiry: params.newExpiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const modifyLock = useCallback(\n async (params: ModifyLockParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n modifyLock,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n data-privana\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n overlayClassName?: string\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay className={overlayClassName} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n data-privana\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"text-muted-foreground hover:text-foreground absolute top-4 right-4 cursor-pointer rounded-xs transition-colors focus:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","'use client'\n\ninterface IconProps {\n className?: string\n size?: number\n}\n\nexport function USDCIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2000 2000\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M1000 2000c554.17 0 1000-445.83 1000-1000S1554.17 0 1000 0 0 445.83 0 1000s445.83 1000 1000 1000z\"\n fill=\"#2775ca\"\n />\n <path\n d=\"M1275 1158.33c0-145.83-87.5-195.83-262.5-216.66-125-16.67-150-50-150-108.34s41.67-95.83 125-95.83c75 0 116.67 25 137.5 87.5 4.17 12.5 16.67 20.83 29.17 20.83h66.66c16.67 0 29.17-12.5 29.17-29.16v-4.17c-16.67-91.67-91.67-162.5-187.5-170.83v-100c0-16.67-12.5-29.17-33.33-33.34h-62.5c-16.67 0-29.17 12.5-33.34 33.34v95.83c-125 16.67-204.16 100-204.16 204.17 0 137.5 83.33 191.66 258.33 212.5 116.67 20.83 154.17 45.83 154.17 112.5s-58.34 112.5-137.5 112.5c-108.34 0-145.84-45.84-158.34-108.34-4.16-16.66-16.66-25-29.16-25h-70.84c-16.66 0-29.16 12.5-29.16 29.17v4.17c16.66 104.16 83.33 179.16 220.83 200v100c0 16.66 12.5 29.16 33.33 33.33h62.5c16.67 0 29.17-12.5 33.34-33.33v-100c125-20.84 208.33-108.34 208.33-220.84z\"\n fill=\"#fff\"\n />\n <path\n d=\"M787.5 1595.83c-325-116.66-491.67-479.16-370.83-800 62.5-175 200-308.33 370.83-370.83 16.67-8.33 25-20.83 25-41.67V325c0-16.67-8.33-29.17-25-33.33-4.17 0-12.5 0-16.67 4.16-395.83 125-612.5 545.84-487.5 941.67 75 233.33 254.17 412.5 487.5 487.5 16.67 8.33 33.34 0 37.5-16.67 4.17-4.16 4.17-8.33 4.17-16.66v-58.34c0-12.5-12.5-29.16-25-37.5zM1229.17 295.83c-16.67-8.33-33.34 0-37.5 16.67-4.17 4.17-4.17 8.33-4.17 16.67v58.33c0 16.67 12.5 33.33 25 41.67 325 116.66 491.67 479.16 370.83 800-62.5 175-200 308.33-370.83 370.83-16.67 8.33-25 20.83-25 41.67V1700c0 16.67 8.33 29.17 25 33.33 4.17 0 12.5 0 16.67-4.16 395.83-125 612.5-545.84 487.5-941.67-75-237.5-258.34-416.67-487.5-491.67z\"\n fill=\"#fff\"\n />\n </svg>\n )\n}\n\nexport function BaseIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2500 2500\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"1250\" cy=\"1250\" r=\"1250\" fill=\"#0052FF\" />\n <path\n d=\"M1247.8,2500c691.6,0,1252.2-559.6,1252.2-1250C2500,559.6,1939.4,0,1247.8,0C591.7,0,53.5,503.8,0,1144.9h1655.1v210.2H0C53.5,1996.2,591.7,2500,1247.8,2500z\"\n fill=\"white\"\n />\n </svg>\n )\n}\n\nexport function WETHIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 250 250\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M0 125C0 55.9644 55.9644 0 125 0C194.036 0 250 55.9644 250 125C250 194.036 194.036 250 125 250C55.9644 250 0 194.036 0 125Z\"\n fill=\"#627EEA\"\n />\n <path\n d=\"M125.047 30.5V100.351L184.086 126.732L125.047 30.5Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 30.5L66 126.732L125.047 100.351V30.5Z\" fill=\"white\" />\n <path\n d=\"M125.047 172V219.462L184.125 137.728L125.047 172Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 219.462V171.992L66 137.728L125.047 219.462Z\" fill=\"white\" />\n <path\n d=\"M125.047 161.013L184.086 126.733L125.047 100.368V161.013Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n <path d=\"M66 126.733L125.047 161.013V100.368L66 126.733Z\" fill=\"white\" fillOpacity=\"0.602\" />\n </svg>\n )\n}\n\nexport function getTokenIcon(symbol: string, size?: number) {\n const iconSize = size ?? 24\n switch (symbol.toUpperCase()) {\n case 'USDC':\n return <USDCIcon size={iconSize} />\n case 'WETH':\n return <WETHIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n {symbol.slice(0, 2)}\n </div>\n )\n }\n}\n\nexport function getChainIcon(chainId: number, size?: number) {\n const iconSize = size ?? 24\n switch (chainId) {\n case 84532:\n return <BaseIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n ?\n </div>\n )\n }\n}\n","'use client'\n\nimport { cn } from '@/lib/utils'\n\nexport function CloseIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M11.99997 11.99997l-5.99995-5.99995-6.00002-6.00002m6.00002 6.00002l6.00001-6.00002m-12.00003 12.00003l6.00002-6.00001\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function ChevronRightIcon() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"-rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nexport function ChevronLeftIcon() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nexport function ChevronDownIcon({\n direction = 'down',\n className,\n}: {\n direction?: 'up' | 'right' | 'down'\n className?: string\n}) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn(\n 'transition-transform',\n direction === 'right' && '-rotate-90',\n direction === 'up' && 'rotate-180',\n className\n )}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function CopyIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nexport function CircleCheckIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 10l2.5 2.5L14 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function CircleXIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M7 7l6 6M13 7l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function ArrowRightIcon({ className }: { className?: string }) {\n return (\n <svg width=\"24\" height=\"8\" viewBox=\"0 0 24 8\" fill=\"none\" className={className}>\n <path\n d=\"M0 4h22m0 0l-4-4m4 4l-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","'use client'\n\nexport interface Step {\n label: string\n status: 'pending' | 'active' | 'completed'\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 6l2.5 2.5 4.5-4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M3.5 1.5h7v7M10.5 1.5L1.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function Spinner({ size = 20 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" className=\"animate-spin\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.15\" />\n <path d=\"M10 2a8 8 0 016.93 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\ninterface TransactionProgressViewProps {\n title: string\n steps: Step[]\n onCancel?: () => void\n}\n\nexport function TransactionProgressView({ title, steps, onCancel }: TransactionProgressViewProps) {\n const completed = steps.filter((s) => s.status === 'completed').length\n const active = steps.find((s) => s.status === 'active')\n const total = steps.length\n const progress = ((completed + (active ? 0.5 : 0)) / total) * 100\n\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-primary\">\n <Spinner size={20} />\n </div>\n <span className=\"text-foreground text-sm font-medium\">{active?.label ?? title}</span>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"bg-secondary h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full rounded-full transition-all duration-500\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs\">\n Step {Math.max(1, completed + (active ? 1 : 0))} of {total}\n </span>\n </div>\n\n {onCancel && (\n <button\n onClick={onCancel}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors\"\n >\n Cancel\n </button>\n )}\n </div>\n )\n}\n\ninterface TransactionSuccessViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onDone: () => void\n}\n\nexport function TransactionSuccessView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onDone,\n}: TransactionSuccessViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-400\">\n <CheckIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n <button\n onClick={onDone}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors\"\n >\n Done\n </button>\n </div>\n </div>\n )\n}\n\nfunction WarningIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M7 5v2.5M7 10h.005M6.13 2.5h1.74L13 11.5H1L6.13 2.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\ninterface TransactionWarningViewProps {\n title: string\n message: string\n onDone: () => void\n}\n\nexport function TransactionWarningView({ title, message, onDone }: TransactionWarningViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <button\n onClick={onDone}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors\"\n >\n Done\n </button>\n </div>\n )\n}\n\ninterface TransactionErrorViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onRetry: () => void\n onDismiss: () => void\n isRetrying?: boolean\n /** Label for the retry button. Defaults to \"Retry Verification\". */\n retryLabel?: string\n}\n\nexport function TransactionErrorView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onRetry,\n onDismiss,\n isRetrying,\n retryLabel = 'Retry Verification',\n}: TransactionErrorViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n\n <div className=\"flex gap-2\">\n <button\n onClick={onDismiss}\n disabled={isRetrying}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Close\n </button>\n <button\n onClick={onRetry}\n disabled={isRetrying}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isRetrying ? 'Retrying...' : retryLabel}\n </button>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount, useBalance, useReadContract } from 'wagmi'\nimport { useDeposit } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n TransactionErrorView,\n type Step,\n} from './transaction-steps'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\n\ninterface DepositFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n onUnsafeToCloseChange?: (isUnsafe: boolean) => void\n onSuccess?: () => void\n}\n\nexport function DepositForm({\n selectedToken,\n onTokenSelect,\n onPendingChange,\n onUnsafeToCloseChange,\n onSuccess,\n}: DepositFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n // Read balance from the token's chain directly (uses app RPC, not wallet chain).\n // This lets the form display correct balance without forcing a wallet switch;\n // the wallet switch happens on-demand inside deposit() via ensureCorrectChain.\n // Native and ERC-20 need different wagmi hooks (wagmi v2 dropped `token` from\n // useBalance), so we call both unconditionally and gate via `query.enabled`.\n const isNative = selectedToken.contract === zeroAddress\n const { data: nativeBalanceData } = useBalance({\n address,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && isNative,\n },\n })\n const { data: erc20Balance } = useReadContract({\n address: selectedToken.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && !isNative,\n },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedWalletBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), selectedToken.decimals)\n : '0.00'\n\n const handleMaxClick = () => {\n if (formattedWalletBalance && parseFloat(formattedWalletBalance) > 0) {\n setAmount(formattedWalletBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n walletBalance != null &&\n parseTokenAmount(amount, selectedToken.decimals) > walletBalance\n\n const {\n txHash,\n isGettingAddress,\n isSwitchingChain,\n isSendingTransaction,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n verificationFailed,\n isPending,\n error,\n deposit,\n retryVerification,\n reset,\n } = useDeposit({\n onCredited: () => {\n setAmount('')\n if (onSuccess) {\n reset()\n onSuccess()\n } else {\n setShowSuccess(true)\n }\n },\n onCheckTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const depositSteps: Step[] = [\n {\n label: 'Getting deposit address',\n status: isGettingAddress\n ? 'active'\n : isSwitchingChain ||\n isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: `Switching to ${targetChain?.name ?? 'deposit chain'}`,\n status: isSwitchingChain\n ? 'active'\n : isSendingTransaction || isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirm in wallet',\n status: isSendingTransaction\n ? 'active'\n : isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirming transaction',\n status: isWaitingForConfirmation\n ? 'active'\n : isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Verifying deposit — may take up to a few minutes',\n status: isWaitingForProcessing ? 'active' : 'pending',\n },\n ]\n\n useEffect(() => {\n // Post-transfer verification errors are surfaced via the dedicated\n // TransactionErrorView below, so skip the toast for those.\n if (error && !verificationFailed) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error, verificationFailed])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n useEffect(() => {\n onUnsafeToCloseChange?.((isGettingAddress || isSendingTransaction) && !cancelled)\n }, [isGettingAddress, isSendingTransaction, cancelled, onUnsafeToCloseChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleDismissVerificationError = () => {\n setAmount('')\n setCancelled(false)\n reset()\n }\n\n const handleRetryVerification = () => {\n retryVerification().catch(() => {\n // Errors are already surfaced via the hook's error state and onError callback.\n })\n }\n\n const explorerTxUrl =\n txHash && targetChain?.explorerUrl ? `${targetChain.explorerUrl}/tx/${txHash}` : undefined\n\n const handleSubmit = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await deposit({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n if (isSwitchingChain) return 'Switching...'\n return 'Deposit'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Deposit Successful\"\n message={`Your ${selectedToken.symbol} deposit has been processed.`}\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Deposit Processing\"\n message={`Your transaction was confirmed but the deposit is still being processed. Please check your balance - it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (verificationFailed) {\n const baseMessage =\n 'Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address — retry verification instead of starting a new deposit.'\n const detail = error?.message\n const message = detail ? `${baseMessage} (${detail})` : baseMessage\n return (\n <TransactionErrorView\n title=\"Verification failed\"\n message={message}\n explorerUrl={explorerTxUrl}\n explorerLabel=\"View transaction\"\n onRetry={handleRetryVerification}\n onDismiss={handleDismissVerificationError}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is confirmed (during address fetch/wallet signing)\n const canCancel = isGettingAddress || isSendingTransaction\n return (\n <TransactionProgressView\n title=\"Depositing...\"\n steps={depositSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedWalletBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleSubmit}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount } from 'wagmi'\nimport { useWithdraw, useBalance } from '@/sdk/hooks'\nimport type { WithdrawStep } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n type Step,\n} from './transaction-steps'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { getExplorerAddressUrl, getExplorerLabel } from '@/sdk/types/chains'\n\ninterface WithdrawFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n onUnsafeToCloseChange?: (isUnsafe: boolean) => void\n}\n\nexport function WithdrawForm({\n selectedToken,\n onTokenSelect,\n onPendingChange,\n onUnsafeToCloseChange,\n}: WithdrawFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({\n tokenId: selectedToken.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n\n const { withdraw, isPending, currentStep, error, reset } = useWithdraw({\n onProcessingSuccess: () => {\n setAmount('')\n setShowSuccess(true)\n },\n onProcessingTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const explorerUrl =\n address && targetChain ? getExplorerAddressUrl(targetChain.id, address) : undefined\n\n const getStepStatus = (step: WithdrawStep, after: WithdrawStep[]): Step['status'] => {\n if (currentStep === step) return 'active'\n if (after.includes(currentStep)) return 'completed'\n return 'pending'\n }\n\n const withdrawSteps: Step[] = [\n {\n label: 'Switching to signing chain',\n status: getStepStatus('switching-chain', ['signing', 'submitting', 'processing']),\n },\n { label: 'Sign in wallet', status: getStepStatus('signing', ['submitting', 'processing']) },\n {\n label: 'Submitting withdrawal',\n status: getStepStatus('submitting', ['processing']),\n },\n {\n label: 'Processing — may take a minute or two',\n status: getStepStatus('processing', []),\n },\n ]\n\n useEffect(() => {\n if (error) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error])\n\n useEffect(() => {\n const pending = isPending && !cancelled\n onPendingChange?.(pending)\n onUnsafeToCloseChange?.(pending)\n }, [isPending, cancelled, onPendingChange, onUnsafeToCloseChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleWithdraw = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await withdraw({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const handleMaxClick = () => {\n if (formattedBalance && parseFloat(formattedBalance) > 0) {\n setAmount(formattedBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, selectedToken.decimals) > BigInt(balanceWei)\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n return 'Withdraw'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Withdrawal Complete\"\n message={`Your ${selectedToken.symbol} withdrawal has been processed. Funds should appear in your wallet shortly.`}\n explorerUrl={explorerUrl}\n explorerLabel={targetChain ? getExplorerLabel(targetChain.id) : undefined}\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Withdrawal Processing\"\n message={`Your withdrawal is still being processed. Please check your balance — it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is submitted (steps 1-2)\n const canCancel =\n currentStep === 'idle' || currentStep === 'switching-chain' || currentStep === 'signing'\n return (\n <TransactionProgressView\n title=\"Withdrawing...\"\n steps={withdrawSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleWithdraw}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useMemo, useEffect, useId } from 'react'\nimport { useAccount, useBalance as useWagmiBalance, useReadContract } from 'wagmi'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport { DepositForm } from './deposit-form'\nimport { WithdrawForm } from './withdraw-form'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance, useLockedFunds, useUnlockFunds } from '@/sdk/hooks'\nimport { formatTokenAmount, formatTimeRemaining, cn, shortenAddress } from '@/lib/utils'\nimport { getTokenIcon, getChainIcon } from './token-icons'\nimport { CloseIcon, ChevronRightIcon, ChevronLeftIcon, ChevronDownIcon } from './icons'\n\ntype ModalView = 'main' | 'locked-funds' | 'select-token' | 'balance-details'\n\nfunction BalanceCards({\n selectedToken,\n onLockedFundsClick,\n onBalanceClick,\n showLockedFunds = true,\n disabled,\n}: {\n selectedToken: TokenConfig\n onLockedFundsClick: () => void\n onBalanceClick: () => void\n showLockedFunds?: boolean\n disabled?: boolean\n}) {\n const { balanceWei, isLoading: balanceLoading } = useBalance({\n tokenId: selectedToken.id,\n })\n const { totalLocked, isLoading: lockedLoading } = useLockedFunds({ enabled: showLockedFunds })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n const formattedLocked = showLockedFunds\n ? formatTokenAmount(String(totalLocked), selectedToken.decimals)\n : '0.00'\n\n return (\n <div className={cn('flex gap-2', disabled && 'opacity-50')}>\n <button\n onClick={onBalanceClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Balance</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {balanceLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-24 animate-pulse rounded\" />\n ) : (\n formattedBalance\n )}\n </div>\n </button>\n\n {showLockedFunds && (\n <button\n onClick={onLockedFundsClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Locked Funds</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {lockedLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-20 animate-pulse rounded\" />\n ) : (\n formattedLocked\n )}\n </div>\n </button>\n )}\n </div>\n )\n}\n\nfunction Tabs({\n activeTab,\n onTabChange,\n disabled,\n}: {\n activeTab: 'deposit' | 'withdraw'\n onTabChange: (tab: 'deposit' | 'withdraw') => void\n disabled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'bg-muted relative flex gap-2 overflow-hidden rounded-[10px] p-1',\n disabled && 'opacity-50'\n )}\n >\n <div\n className={cn(\n 'bg-input absolute top-1 bottom-1 left-1 w-[calc(50%-8px)] rounded-md transition-transform duration-200',\n activeTab === 'withdraw' && 'translate-x-[calc(100%+8px)]'\n )}\n />\n <button\n onClick={() => !disabled && onTabChange('deposit')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'deposit' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Deposit\n </button>\n <button\n onClick={() => !disabled && onTabChange('withdraw')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'withdraw' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Withdraw\n </button>\n </div>\n )\n}\n\ninterface LockedFundsSection {\n title: string\n items: {\n lockId: number\n amount: string\n serviceAddress: string\n time: string\n isExpired: boolean\n }[]\n}\n\nfunction LockedFundsView({ onBack }: { onBack: () => void }) {\n const { getTokenById } = usePrivanaContext()\n const { locks, isLoading } = useLockedFunds()\n const { unlockFunds, unlockAllExpired, isPending } = useUnlockFunds()\n const [collapsedSections, setCollapsedSections] = useState<Record<string, boolean>>({})\n\n const sections = useMemo(() => {\n const sectionMap: Record<string, LockedFundsSection> = {}\n\n locks.forEach((lock) => {\n const serviceName = shortenAddress(lock.service_address)\n if (!sectionMap[lock.service_address]) {\n sectionMap[lock.service_address] = {\n title: `Service ${serviceName}`,\n items: [],\n }\n }\n sectionMap[lock.service_address].items.push({\n lockId: lock.lock_id,\n amount: formatTokenAmount(String(lock.amount), getTokenById(lock.token_id)?.decimals ?? 18),\n serviceAddress: lock.service_address,\n time: lock.is_expired ? 'Click to unlock' : formatTimeRemaining(lock.expiry),\n isExpired: lock.is_expired,\n })\n })\n\n return Object.values(sectionMap)\n }, [getTokenById, locks])\n\n const toggleSection = (title: string) => {\n setCollapsedSections((prev) => ({\n ...prev,\n [title]: !prev[title],\n }))\n }\n\n const expiredCount = locks.filter((l) => l.is_expired).length\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Locked Funds</span>\n </div>\n </div>\n\n <div className=\"bg-muted flex min-h-0 flex-1 flex-col rounded-[10px] p-2\">\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex flex-col gap-2 p-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex animate-pulse items-center gap-3 rounded-lg p-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex-1\">\n <div className=\"bg-secondary mb-2 h-3.5 w-24 rounded\" />\n <div className=\"bg-secondary h-3 w-32 rounded\" />\n </div>\n </div>\n ))}\n </div>\n ) : sections.length === 0 ? (\n <div className=\"flex items-center justify-center p-8\">\n <span className=\"text-muted-foreground text-sm\">No locked funds</span>\n </div>\n ) : (\n sections.map((section) => (\n <div key={section.title}>\n <button\n onClick={() => toggleSection(section.title)}\n className=\"text-muted-foreground hover:bg-secondary flex w-full cursor-pointer items-center justify-between rounded-lg px-4 py-4 transition-colors\"\n >\n <span className=\"text-sm\">{section.title}</span>\n <ChevronDownIcon\n direction={collapsedSections[section.title] ? 'right' : 'down'}\n />\n </button>\n\n {!collapsedSections[section.title] &&\n section.items.map((item) => (\n <div\n key={`${item.serviceAddress}-${item.lockId}`}\n className={cn(\n 'flex items-center justify-between gap-3 rounded-lg p-3',\n item.isExpired && 'bg-secondary'\n )}\n >\n <div className=\"flex flex-1 items-center gap-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-foreground text-sm font-medium\">\n {item.amount} USDC\n </span>\n <span className=\"text-muted-foreground text-xs\">\n Service: {shortenAddress(item.serviceAddress)}\n </span>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col items-end gap-2\">\n {item.isExpired ? (\n <button\n onClick={() => unlockFunds({ lockId: Number(item.lockId) })}\n disabled={isPending}\n className=\"text-foreground hover:text-foreground/80 cursor-pointer text-sm transition-colors disabled:opacity-50\"\n >\n Click to unlock\n </button>\n ) : (\n <span className=\"text-sm text-amber-500\">{item.time}</span>\n )}\n <span className=\"text-muted-foreground text-xs\">on Base Sepolia</span>\n </div>\n </div>\n ))}\n </div>\n ))\n )}\n </div>\n\n {expiredCount > 0 && (\n <div className=\"p-3\">\n <button\n onClick={() => unlockAllExpired()}\n disabled={isPending}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50\"\n >\n Unlock All ({expiredCount})\n </button>\n </div>\n )}\n </div>\n </>\n )\n}\n\nfunction BalanceTokenRow({ token }: { token: TokenConfig }) {\n const { balanceWei, isLoading } = useBalance({\n tokenId: token.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, token.decimals)\n\n return (\n <div className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2.5\">\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n {isLoading ? (\n <span className=\"bg-secondary h-4 w-16 animate-pulse rounded\" />\n ) : (\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n )}\n </div>\n )\n}\n\nfunction BalanceDetailsView({ onBack }: { onBack: () => void }) {\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Token Balances</span>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token Balance</span>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {chainTokens.map((token) => (\n <BalanceTokenRow key={token.id} token={token} />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction TokenRow({\n token,\n isSelected,\n onClick,\n}: {\n token: TokenConfig\n isSelected: boolean\n onClick: () => void\n}) {\n const { address } = useAccount()\n const isNative = token.contract === zeroAddress\n\n const { data: nativeBalanceData } = useWagmiBalance({\n address,\n chainId: token.chainId,\n query: { enabled: !!address && isNative },\n })\n const { data: erc20Balance } = useReadContract({\n address: token.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: token.chainId,\n query: { enabled: !!address && !isNative },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), token.decimals)\n : '0.00'\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n </button>\n )\n}\n\nfunction TokenSelectorView({\n onBack,\n onSelect,\n selectedTokenId,\n}: {\n onBack: () => void\n onSelect: (token: TokenConfig) => void\n selectedTokenId?: string\n}) {\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n const handleTokenSelect = (token: TokenConfig) => {\n onSelect(token)\n onBack()\n }\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Select Token</span>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token</span>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {chainTokens.map((token) => (\n <TokenRow\n key={token.id}\n token={token}\n isSelected={selectedTokenId === token.id}\n onClick={() => handleTokenSelect(token)}\n />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\ninterface ModalBodyProps {\n onViewChange?: (view: ModalView) => void\n onCloseBlockedChange?: (isBlocked: boolean) => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nfunction ModalBody({\n onViewChange,\n onCloseBlockedChange,\n showLockedFunds = true,\n defaultTab = 'deposit',\n onDepositSuccess,\n}: ModalBodyProps) {\n const { defaultToken, tokensStatus } = usePrivanaContext()\n const [selectedToken, setSelectedToken] = useState<TokenConfig | undefined>(defaultToken)\n const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(defaultTab)\n const [currentView, setCurrentView] = useState<ModalView>('main')\n const [isInteractionPending, setIsInteractionPending] = useState(false)\n\n // Sync selectedToken once tokens finish loading\n useEffect(() => {\n if (!selectedToken && defaultToken) {\n setSelectedToken(defaultToken)\n }\n }, [selectedToken, defaultToken])\n\n const handlePendingChange = (isPending: boolean) => {\n setIsInteractionPending(isPending)\n }\n\n const handleCloseBlockedChange = (isBlocked: boolean) => {\n onCloseBlockedChange?.(isBlocked)\n }\n\n const handleViewChange = (view: ModalView) => {\n const update = () => {\n setCurrentView(view)\n onViewChange?.(view)\n }\n if (typeof document !== 'undefined' && typeof document.startViewTransition === 'function') {\n document.documentElement.dataset.privanaVtDir = view === 'main' ? 'back' : 'forward'\n const transition = document.startViewTransition(update)\n transition.finished.then(() => {\n delete document.documentElement.dataset.privanaVtDir\n })\n } else {\n update()\n }\n }\n\n const handleTokenSelect = (token: TokenConfig) => {\n setSelectedToken(token)\n }\n\n if (tokensStatus === 'loading' || !selectedToken) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"bg-secondary h-25 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-11 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-50 animate-pulse rounded-[10px]\" />\n </div>\n )\n }\n\n if (currentView === 'locked-funds') {\n return <LockedFundsView onBack={() => handleViewChange('main')} />\n }\n\n if (currentView === 'balance-details') {\n return <BalanceDetailsView onBack={() => handleViewChange('main')} />\n }\n\n if (currentView === 'select-token') {\n return (\n <TokenSelectorView\n onBack={() => handleViewChange('main')}\n onSelect={handleTokenSelect}\n selectedTokenId={selectedToken.id}\n />\n )\n }\n\n return (\n <>\n <div className=\"flex flex-col gap-2 pb-4\">\n <div className={cn(isInteractionPending && 'pointer-events-none')}>\n <BalanceCards\n selectedToken={selectedToken}\n onLockedFundsClick={() => handleViewChange('locked-funds')}\n onBalanceClick={() => handleViewChange('balance-details')}\n showLockedFunds={showLockedFunds}\n disabled={isInteractionPending}\n />\n </div>\n\n <div className={cn(isInteractionPending && 'pointer-events-none')}>\n <Tabs activeTab={activeTab} onTabChange={setActiveTab} disabled={isInteractionPending} />\n </div>\n\n <div className=\"bg-muted rounded-[10px] p-5\">\n {activeTab === 'deposit' ? (\n <DepositForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handlePendingChange}\n onUnsafeToCloseChange={handleCloseBlockedChange}\n onSuccess={onDepositSuccess}\n />\n ) : (\n <WithdrawForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handlePendingChange}\n onUnsafeToCloseChange={handleCloseBlockedChange}\n />\n )}\n </div>\n </div>\n </>\n )\n}\n\ninterface PrivanaModalProps {\n open: boolean\n onClose: () => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaModal({\n open,\n onClose,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: PrivanaModalProps) {\n const [currentView, setCurrentView] = useState<ModalView>('main')\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n data-view={currentView}\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex h-[596px] max-h-[95dvh] w-[560px] max-w-[95vw] flex-col gap-2 overflow-hidden rounded-2xl border-0 p-2 pb-[2.75rem]\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <button\n data-privana-close\n onClick={handleClose}\n disabled={isCloseBlocked}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-6 w-6 items-center justify-center transition-colors',\n isCloseBlocked\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n <div\n data-privana-content\n data-view={currentView}\n className=\"flex min-h-0 flex-1 flex-col gap-2\"\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Privana\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Deposit or withdraw tokens from your Privana\n </DialogDescription>\n {currentView === 'main' && (\n <DialogHeader>\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-6 font-medium\">Privana</span>\n </div>\n </DialogHeader>\n )}\n <ModalBody\n onCloseBlockedChange={setIsCloseBlocked}\n onViewChange={setCurrentView}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </div>\n <a\n data-privana-footer\n href=\"https://privana.finance\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Powered by Privana\"\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function PrivanaInlineModal({\n className,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: {\n className?: string\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <ModalBody\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode, type ComponentProps, type ReactElement } from 'react'\nimport { useAccount } from 'wagmi'\nimport { Button, type buttonVariants } from '@/components/ui/button'\nimport { PrivanaModal } from './privana-modal'\nimport { cn } from '@/lib/utils'\nimport type { VariantProps } from 'class-variance-authority'\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nexport interface PrivanaButtonProps extends Omit<ComponentProps<'button'>, 'children'> {\n children?: ReactNode\n variant?: ButtonVariantProps['variant']\n size?: ButtonVariantProps['size']\n asChild?: boolean\n renderButton?: (props: { onClick: () => void; isOpen: boolean }) => ReactElement\n hideWhenDisconnected?: boolean\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaButton({\n children,\n className,\n variant = 'outline',\n size = 'default',\n asChild = false,\n renderButton,\n hideWhenDisconnected = true,\n showLockedFunds = true,\n defaultTab,\n onDepositSuccess,\n ...buttonProps\n}: PrivanaButtonProps) {\n const [modalOpen, setModalOpen] = useState(false)\n const { isConnected } = useAccount()\n\n if (hideWhenDisconnected && !isConnected) {\n return null\n }\n\n const handleClick = () => setModalOpen(true)\n\n const buttonElement = renderButton ? (\n renderButton({ onClick: handleClick, isOpen: modalOpen })\n ) : (\n <Button\n variant={variant}\n size={size}\n asChild={asChild}\n className={cn(className)}\n onClick={handleClick}\n disabled={!isConnected}\n {...buttonProps}\n >\n {children ?? 'Privana'}\n </Button>\n )\n\n return (\n <span data-privana className=\"contents\">\n {buttonElement}\n <PrivanaModal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </span>\n )\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { MoonPayContext } from '@moonpay/moonpay-react'\n\nexport const DEFAULT_MOONPAY_API_URL = 'https://api.moonpay.com/v3'\n\nexport interface MoonpayLimits {\n /** Minimum fiat purchase for the currency/payment-method (fees included). */\n minBuyAmount: number | undefined\n /** Maximum fiat purchase for the currency/payment-method (fees included). */\n maxBuyAmount: number | undefined\n}\n\nexport interface UseMoonpayLimitsOptions {\n /** MoonPay currency code, e.g. 'usdc'. */\n currencyCode?: string\n /** Fiat currency the limits are quoted in (default: 'usd'). */\n baseCurrencyCode?: string\n /** Payment method the limits apply to (default: 'credit_debit_card'). */\n paymentMethod?: string\n /** Versioned MoonPay REST API base URL (default: 'https://api.moonpay.com/v3'). */\n apiBaseUrl?: string\n /** Skip the request when false (e.g. non credit-card flows). */\n enabled?: boolean\n}\n\nexport interface UseMoonpayLimitsResult extends MoonpayLimits {\n isLoading: boolean\n error: Error | null\n}\n\nexport function useMoonpayLimits({\n currencyCode,\n baseCurrencyCode = 'usd',\n paymentMethod = 'credit_debit_card',\n apiBaseUrl = DEFAULT_MOONPAY_API_URL,\n enabled = true,\n}: UseMoonpayLimitsOptions): UseMoonpayLimitsResult {\n const { apiKey } = useContext(MoonPayContext) ?? {}\n const canFetch = enabled && !!apiKey && !!currencyCode\n\n const query = useQuery({\n queryKey: ['moonpay-limits', apiBaseUrl, currencyCode, baseCurrencyCode, paymentMethod, apiKey],\n enabled: canFetch,\n staleTime: 5 * 60_000,\n queryFn: async (): Promise<MoonpayLimits> => {\n const params = new URLSearchParams({\n apiKey: apiKey as string,\n baseCurrencyCode,\n paymentMethod,\n areFeesIncluded: 'true',\n })\n const res = await fetch(\n `${apiBaseUrl}/currencies/${currencyCode}/limits?${params.toString()}`\n )\n if (!res.ok) {\n throw new Error(`MoonPay limits request failed: ${res.status}`)\n }\n const data = (await res.json()) as {\n baseCurrency?: { minBuyAmount?: unknown; maxBuyAmount?: unknown }\n }\n const asNumber = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) ? value : undefined\n return {\n minBuyAmount: asNumber(data.baseCurrency?.minBuyAmount),\n maxBuyAmount: asNumber(data.baseCurrency?.maxBuyAmount),\n }\n },\n })\n\n return {\n minBuyAmount: query.data?.minBuyAmount,\n maxBuyAmount: query.data?.maxBuyAmount,\n isLoading: query.isLoading,\n error: (query.error as Error | null) ?? null,\n }\n}\n","'use client'\n\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\n\ninterface TokenSelectorViewProps {\n selectedTokenId?: string\n onSelect: (tokenId: string) => void\n}\n\n/**\n * Simple single-column token picker shared by the Deposit and Withdraw modals.\n * (The combined PrivanaModal uses its own network-aware variant.)\n */\nexport function TokenSelectorView({ selectedTokenId, onSelect }: TokenSelectorViewProps) {\n const { enabledTokens } = usePrivanaContext()\n\n return (\n <div className=\"bg-muted flex flex-col rounded-[10px] p-3\">\n <div className=\"flex max-h-72 flex-col gap-1 overflow-y-auto\">\n {enabledTokens.map((token) => {\n const isSelected = selectedTokenId === token.id\n return (\n <button\n key={token.id}\n type=\"button\"\n onClick={() => onSelect(token.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-6 w-6 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 24)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-medium\">{token.symbol}</div>\n <div className=\"text-muted-foreground text-[11px]\">{token.name}</div>\n </div>\n {isSelected && (\n <div className=\"bg-primary flex h-4 w-4 shrink-0 items-center justify-center rounded-full\">\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n className=\"text-primary-foreground\"\n >\n <path\n d=\"M2 5L4 7L8 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </button>\n )\n })}\n {enabledTokens.length === 0 && (\n <p className=\"text-muted-foreground px-3 py-6 text-center text-sm\">No tokens available</p>\n )}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport type { Allowance } from '@/sdk/types/allowance'\nimport type { PostDepositLockError } from '@/sdk/hooks/pending-lock'\nimport { FiatOnRampForm } from './fiat-on-ramp-form'\n\nexport function CreditCardWidgetView({\n token,\n amount,\n allowance,\n onCredited,\n onLockSubmitted,\n onLockFailed,\n}: {\n token: TokenConfig | undefined\n amount: string\n allowance?: Allowance\n onCredited?: () => void\n onLockSubmitted?: () => void\n onLockFailed?: (error: PostDepositLockError) => void\n}) {\n const moonpayCurrencyCode = token?.moonpayCurrencyCode\n const containerRef = useRef<HTMLDivElement>(null)\n const [widgetTheme, setWidgetTheme] = useState<'light' | 'dark'>()\n useEffect(() => {\n if (containerRef.current) setWidgetTheme(resolveSdkTheme(containerRef.current))\n }, [])\n\n return (\n <div ref={containerRef} className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">Complete your purchase</h2>\n {token && moonpayCurrencyCode ? (\n <FiatOnRampForm\n tokenId={token.id}\n currencyCode={moonpayCurrencyCode}\n // The user typed a crypto amount — quote-driven so MoonPay targets\n // it as the delivery amount, locked inside the widget.\n quoteCurrencyAmount={amount || undefined}\n lockAmount\n variant=\"embedded\"\n autoStart\n theme={widgetTheme}\n postDepositLock={\n allowance\n ? {\n maxAmount: BigInt(allowance.value),\n lockDuration: allowance.lockDuration,\n }\n : undefined\n }\n onCredited={onCredited}\n onLockSubmitted={onLockSubmitted}\n onLockFailed={onLockFailed}\n />\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {token?.symbol ?? 'This token'} isn’t available for card purchases yet.\n </p>\n )}\n </div>\n )\n}\n\nfunction resolveSdkTheme(el: HTMLElement): 'light' | 'dark' {\n const scheme = getComputedStyle(el).colorScheme\n if (scheme === 'dark') return 'dark'\n if (scheme === 'light') return 'light'\n return el.closest('.dark') ? 'dark' : 'light'\n}\n","'use client'\n\ninterface PrivanaIconProps {\n className?: string\n size?: number\n}\n\nexport function PrivanaIcon({ className, size = 32 }: PrivanaIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <rect width=\"32\" height=\"32\" rx=\"3.55556\" fill=\"black\" />\n <path\n d=\"M9.02789 9.05299L9.20884 7.82227H15.6221L16.1099 7.82683L16.5817 7.83825L17.0398 7.85652L17.4842 7.88163L17.9125 7.91588L18.3271 7.95698L18.7256 8.00722L19.1104 8.06202L19.4814 8.12595L19.8823 8.20815L20.2602 8.2972L20.6175 8.39538L20.9542 8.50042L21.2703 8.61687L21.5657 8.74017L21.8406 8.8726L22.0948 9.01645L22.1521 9.05299H9.02789ZM9.02789 12.0784L9.20884 10.8477H21.9505L22.1177 10.955L22.317 11.1057L22.4934 11.2633L22.6445 11.4322L22.7705 11.608L22.8713 11.793L22.9491 11.9871L22.9721 12.0784H9.02789ZM15.8167 11.0372H13.1369L13.0843 12.0784H18.8447L18.8264 12.0213L18.7645 11.9072L18.6844 11.7976L18.5836 11.6948L18.4645 11.6012L18.3271 11.5121L18.1736 11.4299L18.0041 11.3569L17.8209 11.2907L17.6193 11.2313L17.404 11.1811L17.1727 11.1354L16.9276 11.1011L16.6711 11.0737L16.3985 11.0532L16.1145 11.0418L15.8167 11.0372ZM9.02789 15.1038L9.20884 13.8731H22.7453L22.7728 13.9759L22.8003 14.1334L22.8232 14.3252L22.8163 14.5102L22.7819 14.6905L22.7178 14.8664L22.6239 15.0376L22.5735 15.1038H9.02789ZM13.1484 13.8731L13.0843 15.1038H17.5323L17.6674 15.0696L17.8644 15.0079L18.043 14.9372L18.2034 14.8618L18.3454 14.7796L18.4691 14.6883L18.5744 14.5946L18.6569 14.4942L18.721 14.3914L18.7622 14.2841L18.7828 14.1722V14.0558L18.7622 13.9348L18.7416 13.8731H13.1484ZM9.02789 18.1293L9.20884 16.8985H22.3605L22.2895 16.9899L22.1406 17.1406L21.9643 17.2867L21.7581 17.426L21.5268 17.5561L21.2703 17.6817L20.9862 17.7982L20.6747 17.9055L20.3381 18.006L19.9739 18.0996L19.8387 18.1293H9.02789ZM13.1484 16.8985L13.1392 17.0629H15.8144L16.1145 17.0607L16.3985 17.047L16.6665 17.0264L16.9207 16.999L17.1612 16.9625L17.388 16.9168L17.4658 16.8985H13.1484ZM9.02789 21.1547L9.20884 19.9217H19.7036L19.4562 19.9742L19.0989 20.0381L18.7256 20.0952L18.3316 20.1432L17.9239 20.1843L17.4956 20.2185L17.0536 20.2459L16.5932 20.2642L16.1168 20.2756L15.6243 20.2802H13.1301L13.0843 21.1547H9.02789ZM13.0843 24.1778H9.02789L9.20884 22.9471H13.1484L13.0843 24.1778Z\"\n fill=\"white\"\n />\n </svg>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport type { Allowance, AllowanceTerm } from '@/sdk/types/allowance'\nimport { cn } from '@/lib/utils'\nimport { ChevronDownIcon, CircleCheckIcon, CircleXIcon, ArrowRightIcon } from './icons'\nimport { PrivanaIcon } from './privana-icon'\n\nfunction PolicyTermRow({\n term,\n kind,\n}: {\n term: AllowanceTerm\n kind: 'permission' | 'restriction'\n}) {\n return (\n <div className=\"flex gap-2\">\n <div\n className={cn(\n 'mt-0.5 shrink-0',\n kind === 'permission' ? 'text-emerald-500' : 'text-orange-500'\n )}\n >\n {kind === 'permission' ? <CircleCheckIcon /> : <CircleXIcon />}\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-foreground text-sm leading-5 font-medium\">{term.title}</span>\n <span className=\"text-muted-foreground text-sm leading-5\">{term.description}</span>\n </div>\n </div>\n )\n}\n\nexport function AllowancePolicySection({\n allowance,\n serviceName,\n serviceIcon,\n}: {\n allowance: Allowance\n serviceName: string\n serviceIcon?: ReactNode\n}) {\n const [collapsed, setCollapsed] = useState(false)\n const permissions = allowance.terms?.permissions ?? []\n const restrictions = allowance.terms?.restrictions ?? []\n const hasTerms = permissions.length > 0 || restrictions.length > 0\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-8 w-8 items-center justify-center overflow-hidden rounded-lg\">\n {serviceIcon}\n </div>\n <ArrowRightIcon className=\"text-muted-foreground\" />\n <PrivanaIcon size={32} />\n </div>\n\n <p className=\"text-sm leading-5\">\n <span className=\"text-foreground font-medium\">{serviceName}</span>{' '}\n <span className=\"text-muted-foreground\">wants a policy on your Privana account.</span>\n </p>\n\n {hasTerms && (\n <>\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full cursor-pointer items-center gap-2\"\n >\n <span className=\"bg-border h-px flex-1\" />\n <span className=\"text-muted-foreground text-[10px] leading-[14px] font-medium tracking-[0.2px] whitespace-nowrap uppercase\">\n {collapsed ? 'Show details' : 'Hide details'}\n </span>\n <ChevronDownIcon\n direction={collapsed ? 'down' : 'up'}\n className=\"text-foreground shrink-0\"\n />\n <span className=\"bg-border h-px flex-1\" />\n </button>\n\n {!collapsed && (\n <div className=\"flex flex-col gap-4\">\n {permissions.map((term, i) => (\n <PolicyTermRow key={`permission-${i}`} term={term} kind=\"permission\" />\n ))}\n {restrictions.map((term, i) => (\n <PolicyTermRow key={`restriction-${i}`} term={term} kind=\"restriction\" />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport { useAccount, useBalance, useReadContract } from 'wagmi'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { QRCodeSVG } from 'qrcode.react'\nimport { MoonPayProvider } from '@moonpay/moonpay-react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport type { Allowance } from '@/sdk/types/allowance'\nimport { toast } from 'sonner'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport {\n useDeposit,\n useDepositAddress,\n useDepositVerification,\n usePendingDeposits,\n type PostDepositLockError,\n} from '@/sdk/hooks'\nimport { useMoonpayLimits } from '@/sdk/hooks/use-moonpay-limits'\nimport {\n cn,\n formatCountdown,\n formatTokenAmount,\n parseTokenAmount,\n shortenAddress,\n} from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { TokenSelectorView } from './token-selector-view'\nimport { CreditCardWidgetView } from './credit-card-widget-view'\nimport {\n Spinner,\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n TransactionErrorView,\n type Step,\n} from './transaction-steps'\nimport { CloseIcon, ChevronRightIcon, ChevronLeftIcon, CopyIcon } from './icons'\nimport { AllowancePolicySection } from './allowance-policy-section'\n\ntype DepositMethodTab = 'crypto' | 'credit-card'\n\n// Mounting MoonPayProvider injects MoonPay's web-sdk script from their CDN, so\n// it wraps only the credit-card subtree instead of the app root — the other\n// deposit flows never pay that cost. Without `networkConfig.moonpayApiKey` the\n// children render bare and the credit-card flow stays fail-closed (purchase\n// limits never load, so the deposit button stays disabled).\nfunction MoonPayGate({ enabled, children }: { enabled: boolean; children: ReactNode }) {\n const { networkConfig } = usePrivanaContext()\n const apiKey = networkConfig.moonpayApiKey\n if (!enabled || !apiKey) return <>{children}</>\n return <MoonPayProvider apiKey={apiKey}>{children}</MoonPayProvider>\n}\n\nexport type DepositSource = 'connected' | 'external' | 'credit-card'\n\ntype DepositView = 'method' | 'deposit' | 'select-token' | 'external-deposit' | 'credit-card-widget'\n\ntype DepositFlowView =\n | 'depositing'\n | 'deposit-success'\n | 'deposit-timeout'\n | 'deposit-error'\n | 'lock-error'\n\nfunction MethodTabs({\n activeTab,\n onTabChange,\n}: {\n activeTab: DepositMethodTab\n onTabChange: (tab: DepositMethodTab) => void\n}) {\n return (\n <div className=\"bg-secondary relative flex gap-2 overflow-hidden rounded-[10px] p-1\">\n <div\n className={cn(\n 'bg-input absolute top-1 bottom-1 left-1 w-[calc(50%-8px)] rounded-md transition-transform duration-200',\n activeTab === 'credit-card' && 'translate-x-[calc(100%+8px)]'\n )}\n />\n <button\n type=\"button\"\n onClick={() => onTabChange('crypto')}\n className={cn(\n 'relative z-10 flex-1 cursor-pointer rounded-md px-3 py-[9px] text-sm font-medium transition-colors',\n activeTab === 'crypto' ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n Crypto\n </button>\n <button\n type=\"button\"\n onClick={() => onTabChange('credit-card')}\n className={cn(\n 'relative z-10 flex-1 cursor-pointer rounded-md px-3 py-[9px] text-sm font-medium transition-colors',\n activeTab === 'credit-card' ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n Credit Card\n </button>\n </div>\n )\n}\n\nfunction MethodOption({\n title,\n description,\n onClick,\n}: {\n title: string\n description: string\n onClick?: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"bg-input hover:bg-input/70 border-border flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left transition-colors\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-foreground text-sm leading-[14px] font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs leading-3\">{description}</span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n )\n}\n\nfunction DepositView({\n source,\n selectedToken,\n amount,\n allowance,\n onAmountChange,\n onSelectToken,\n onConnectWallet,\n onSubmit,\n isSubmitting = false,\n}: {\n source: DepositSource\n selectedToken: TokenConfig | undefined\n amount: string\n allowance?: Allowance\n onAmountChange: (value: string) => void\n onSelectToken: () => void\n onConnectWallet?: () => void\n onSubmit: (args: { source: DepositSource; tokenId: string; amount: string }) => void\n isSubmitting?: boolean\n}) {\n const { getChainById, chains, serviceName, serviceIcon, networkConfig } = usePrivanaContext()\n const { address, isConnected } = useAccount()\n const appName = serviceName ?? 'Privana'\n const chain = selectedToken ? getChainById(selectedToken.chainId) : undefined\n const targetChain = chain ?? chains[0]\n const sourceLabel = source === 'connected' ? 'Connected Wallet' : 'External Wallet'\n const isConnectedSource = source === 'connected'\n const isCreditCard = source === 'credit-card'\n const isNative = selectedToken?.contract === zeroAddress\n const { data: nativeBalanceData } = useBalance({\n address,\n chainId: targetChain?.id,\n query: { enabled: isConnectedSource && !!address && !!selectedToken && isNative },\n })\n const { data: erc20Balance } = useReadContract({\n address: selectedToken?.contract as `0x${string}` | undefined,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: targetChain?.id,\n query: { enabled: isConnectedSource && !!address && !!selectedToken && !isNative },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n const formattedWalletBalance =\n walletBalance != null && selectedToken\n ? formatTokenAmount(walletBalance.toString(), selectedToken.decimals)\n : '0.00'\n\n // The credit-card amount is the token amount MoonPay should deliver\n // (quoteCurrencyAmount — the pre-signed lock needs an exact crypto target).\n // Gate it against MoonPay's fiat minimum so the user can't sign the policy\n // for an amount MoonPay would reject once the widget opens; the ~1:1\n // comparison holds because card purchases are limited to USD-stable tokens.\n const {\n minBuyAmount: moonpayMinBuy,\n isLoading: moonpayLimitsLoading,\n error: moonpayLimitsError,\n } = useMoonpayLimits({\n currencyCode: selectedToken?.moonpayCurrencyCode,\n apiBaseUrl: networkConfig.moonpayApiUrl,\n enabled: isCreditCard,\n })\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n // Card purchases keep a 2-decimal cap so the quote string stays simple for\n // MoonPay; other sources take a token amount capped by the token's decimals.\n const maxAmountDecimals = isCreditCard ? 2 : selectedToken?.decimals\n const tooManyDecimals =\n hasValidAmount &&\n maxAmountDecimals != null &&\n amount.includes('.') &&\n amount.split('.')[1].length > maxAmountDecimals\n const exceedsBalance =\n isConnectedSource &&\n hasValidAmount &&\n !tooManyDecimals &&\n !!selectedToken &&\n walletBalance != null &&\n parseTokenAmount(amount, selectedToken.decimals) > walletBalance\n const belowMoonpayMin =\n isCreditCard && hasValidAmount && moonpayMinBuy != null && parseFloat(amount) < moonpayMinBuy\n const moonpayLimitsUnready =\n isCreditCard && !!selectedToken?.moonpayCurrencyCode && moonpayMinBuy == null\n // No MoonPay currency mapping for this token.\n const creditCardUnavailable =\n isCreditCard && !!selectedToken && !selectedToken.moonpayCurrencyCode\n const needsConnect = isConnectedSource && !isConnected\n\n const canDeposit =\n hasValidAmount &&\n !!selectedToken &&\n !tooManyDecimals &&\n !exceedsBalance &&\n !belowMoonpayMin &&\n !moonpayLimitsUnready &&\n !creditCardUnavailable &&\n !needsConnect\n\n const handleMax = () => {\n const max = formattedWalletBalance.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n {isCreditCard ? (\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Buy with credit card and deposit\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n Enter your deposit amount and proceed to sign a policy.\n </p>\n </div>\n ) : (\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Deposit from {sourceLabel}\n </h2>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n type=\"button\"\n onClick={onSelectToken}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left\"\n >\n {selectedToken ? (\n <>\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">on {chain?.name ?? '—'}</span>\n </div>\n </>\n ) : (\n <span className=\"text-muted-foreground flex-1 text-sm\">Select token</span>\n )}\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n {isConnectedSource && (\n <span className=\"text-muted-foreground text-sm\">\n Available {formattedWalletBalance} {selectedToken?.symbol}\n </span>\n )}\n </div>\n <div\n className={cn(\n 'border-border bg-input flex items-center gap-2 rounded-[10px] border',\n isConnectedSource ? 'py-1 pr-1 pl-3' : 'px-3 py-3'\n )}\n >\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 flex-1 bg-transparent text-sm outline-none\"\n />\n {isConnectedSource ? (\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n ) : isCreditCard ? (\n <span className=\"text-muted-foreground text-sm\">{selectedToken?.symbol ?? 'USD'}</span>\n ) : (\n selectedToken && (\n <span className=\"text-muted-foreground text-sm\">{selectedToken.symbol}</span>\n )\n )}\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {maxAmountDecimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n {belowMoonpayMin && moonpayMinBuy != null && (\n <p className=\"text-destructive text-sm\">Minimum purchase is ${moonpayMinBuy} USD.</p>\n )}\n {isCreditCard && moonpayLimitsError && (\n <p className=\"text-destructive text-sm\">\n Couldn’t load purchase limits. Please try again.\n </p>\n )}\n {isCreditCard && moonpayLimitsLoading && (\n <p className=\"text-muted-foreground text-sm\">Checking purchase limits…</p>\n )}\n {creditCardUnavailable && (\n <p className=\"text-destructive text-sm\">\n {selectedToken?.symbol ?? 'This token'} isn’t available for card purchases yet.\n </p>\n )}\n </div>\n\n {allowance && (\n <AllowancePolicySection\n allowance={allowance}\n serviceName={appName}\n serviceIcon={serviceIcon}\n />\n )}\n\n <button\n type=\"button\"\n disabled={needsConnect ? !onConnectWallet : !canDeposit || isSubmitting}\n onClick={() => {\n if (needsConnect) {\n onConnectWallet?.()\n return\n }\n if (selectedToken) onSubmit({ source, tokenId: selectedToken.id, amount })\n }}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {needsConnect ? 'Connect Wallet' : allowance ? 'Sign Policy and Deposit' : 'Deposit'}\n </button>\n </div>\n )\n}\n\nfunction SummaryRow({ value, label }: { value: string; label: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm leading-5\">\n <span className=\"text-foreground font-medium\">{value}</span>\n <span className=\"text-muted-foreground\">{label}</span>\n </div>\n )\n}\n\nconst LISTENING_WINDOW_MS = 3_600_000\n\nfunction remainingSeconds(deadline: number): number {\n return Math.max(0, Math.round((deadline - Date.now()) / 1000))\n}\n\nfunction useCountdown(deadline: number): number {\n const [secondsLeft, setSecondsLeft] = useState(() => remainingSeconds(deadline))\n useEffect(() => {\n if (remainingSeconds(deadline) <= 0) return\n const id = setInterval(() => {\n const left = remainingSeconds(deadline)\n setSecondsLeft(left)\n if (left <= 0) clearInterval(id)\n }, 1000)\n return () => clearInterval(id)\n }, [deadline])\n return secondsLeft\n}\n\nfunction AwaitingDepositStatus({\n title,\n subtitle,\n remaining,\n}: {\n title: string\n subtitle: string\n remaining?: string\n}) {\n return (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"text-foreground\">\n <Spinner size={32} />\n </div>\n <div className=\"flex flex-col gap-2\">\n <h3 className=\"text-foreground text-xl leading-6 font-medium\">{title}</h3>\n <p className=\"text-muted-foreground text-sm leading-[18px]\">\n {subtitle}\n {remaining && (\n <>\n <br />\n Remaining time: {remaining}\n </>\n )}\n </p>\n </div>\n </div>\n )\n}\n\nfunction ExternalDepositView({\n token,\n amount,\n onCredited,\n}: {\n token: TokenConfig | undefined\n amount: string\n /** When set, the host owns the success UX — the inline success view is skipped. */\n onCredited?: () => void\n}) {\n const { getChainById } = usePrivanaContext()\n const { depositAddress, isReady, isLoading } = useDepositAddress()\n const chain = token ? getChainById(token.chainId) : undefined\n const [copied, setCopied] = useState(false)\n\n const [deadline] = useState(() => Date.now() + LISTENING_WINDOW_MS)\n const secondsLeft = useCountdown(deadline)\n const listening = secondsLeft > 0\n const [nothingFound, setNothingFound] = useState(false)\n const [credited, setCredited] = useState<{ txHash: string } | null>(null)\n\n const verification = useDepositVerification({\n onCredited: (txHash) => {\n if (onCredited) {\n onCredited()\n return\n }\n setCredited({ txHash })\n },\n })\n const { isVerifying, verificationFailed, didTimeout, verify } = verification\n const scanPaused = isVerifying || verificationFailed || didTimeout || !!credited\n\n const {\n pending,\n isFetching: isScanning,\n isError: isScanError,\n isRateLimited,\n isUnavailable,\n refetch: refetchPendingDeposits,\n } = usePendingDeposits({\n chainId: token?.chainId,\n enabled: isReady && !!depositAddress && !!token,\n refetchInterval: listening && !scanPaused ? 30_000 : false,\n })\n\n const processedRef = useRef(new Set<string>())\n useEffect(() => {\n if (scanPaused) return\n const next = [...pending]\n .sort((a, b) => a.block_number - b.block_number)\n .find((d) => !processedRef.current.has(`${d.tx_hash}:${d.log_index}`))\n if (!next) return\n processedRef.current.add(`${next.tx_hash}:${next.log_index}`)\n void verify({\n hash: next.tx_hash,\n chainId: next.chain_id,\n amount: BigInt(next.amount),\n logIndex: next.log_index,\n })\n }, [pending, scanPaused, verify])\n\n const nothingFoundTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n useEffect(() => () => clearTimeout(nothingFoundTimerRef.current), [])\n\n const handleRefresh = () => {\n processedRef.current.clear()\n void refetchPendingDeposits().then((result) => {\n if (!result || result.pending.length === 0) {\n setNothingFound(true)\n clearTimeout(nothingFoundTimerRef.current)\n nothingFoundTimerRef.current = setTimeout(() => setNothingFound(false), 4000)\n }\n })\n }\n\n const handleCopy = () => {\n if (!depositAddress) return\n void navigator.clipboard.writeText(depositAddress)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Deposit from an External Wallet\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n Transfer crypto from external wallet or exchange.\n </p>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <SummaryRow value={chain?.name ?? '—'} label=\"Chain\" />\n <div className=\"bg-border h-px w-full\" />\n <SummaryRow value={token?.symbol ?? '—'} label=\"Currency\" />\n <div className=\"bg-border h-px w-full\" />\n <SummaryRow value={amount || '—'} label=\"Value\" />\n </div>\n\n <div className=\"bg-secondary flex h-50 items-center justify-center rounded-[10px]\">\n {!isReady ? (\n <p className=\"text-muted-foreground px-6 text-center text-sm\">\n Connect your wallet to generate a deposit address.\n </p>\n ) : depositAddress ? (\n <div className=\"rounded-[10px] bg-white p-3\">\n <QRCodeSVG value={depositAddress} size={160} />\n </div>\n ) : isLoading ? (\n <Skeleton className=\"h-full w-full rounded-[10px]\" />\n ) : (\n <span className=\"text-muted-foreground text-sm\">Deposit address unavailable</span>\n )}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-muted-foreground text-sm\">Deposit Address</p>\n <div className=\"flex items-center gap-3\">\n <div className=\"border-border flex h-10 min-w-0 flex-1 items-center rounded-[10px] border px-3\">\n {depositAddress ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-sm\">{depositAddress}</p>\n ) : isReady && isLoading ? (\n <Skeleton className=\"h-4 w-3/4\" />\n ) : (\n <p className=\"text-muted-foreground text-sm\">—</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!depositAddress}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 shrink-0 cursor-pointer items-center gap-2 rounded-[10px] px-3 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <CopyIcon />\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n\n {credited ? (\n <TransactionSuccessView\n title=\"Deposit Credited\"\n message={`Transfer ${shortenAddress(credited.txHash)} has been credited to your Privana balance.`}\n onDone={() => {\n setCredited(null)\n verification.reset()\n void refetchPendingDeposits()\n }}\n />\n ) : verificationFailed || didTimeout ? (\n <TransactionErrorView\n title=\"Could not verify deposit\"\n message={\n didTimeout\n ? 'Verification timed out — your deposit may still be credited in the background.'\n : (verification.error?.message ??\n 'Your transfer was found but could not be verified.')\n }\n onRetry={() => void verification.retryVerification()}\n onDismiss={() => verification.reset()}\n isRetrying={isVerifying}\n />\n ) : isVerifying ? (\n <AwaitingDepositStatus\n title=\"Deposit detected\"\n subtitle=\"Crediting the incoming transaction to your Privana balance...\"\n />\n ) : (\n <>\n <AwaitingDepositStatus\n title=\"Awaiting Deposit\"\n subtitle={\n listening\n ? 'We are listening for your incoming transaction for the next hour.'\n : \"We've stopped listening automatically. Use the button below to check for your deposit.\"\n }\n remaining={listening ? formatCountdown(secondsLeft) : undefined}\n />\n\n <div className=\"flex flex-col gap-3\">\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={!depositAddress || isScanning}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Refresh deposit status\n </button>\n {isRateLimited ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Checked too recently — try again in a moment.\n </p>\n ) : isUnavailable ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Deposit discovery is unavailable for this chain.\n </p>\n ) : isScanError ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Chain temporarily unreachable — retrying automatically.\n </p>\n ) : nothingFound ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n No incoming transaction found yet.\n </p>\n ) : null}\n </div>\n </>\n )}\n </div>\n )\n}\n\nexport interface DepositMethodHandlers {\n defaultTab?: DepositMethodTab\n /** Allowance (shown as a \"policy\") the host service requests. */\n allowance?: Allowance\n onSelectConnectedWallet?: () => void\n onSelectExternalWallet?: () => void\n onSelectCreditCard?: () => void\n onConnectWallet?: () => void\n /** Called when the user confirms the amount on the deposit view. */\n onDeposit?: (args: { source: DepositSource; tokenId: string; amount: string }) => void\n /** With an allowance this fires only after the pre-signed lock is accepted. */\n onDepositSuccess?: () => void\n /** The deposit credited but the pre-signed lock failed — re-prompt. */\n onLockFailed?: (error: PostDepositLockError) => void\n}\n\nexport function DepositModalContent({\n defaultTab = 'crypto',\n allowance,\n onSelectConnectedWallet,\n onSelectExternalWallet,\n onSelectCreditCard,\n onConnectWallet,\n onDeposit,\n onDepositSuccess,\n onLockFailed,\n onClose,\n onCloseBlockedChange,\n onExit,\n}: DepositMethodHandlers & {\n onClose?: () => void\n onCloseBlockedChange?: (blocked: boolean) => void\n /** Renders a back chevron on the root method view (for embedding, e.g. WalletModal). */\n onExit?: () => void\n}) {\n const { serviceName, enabledTokens, defaultToken, hostedAuthConfig, getChainById } =\n usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [activeTab, setActiveTab] = useState<DepositMethodTab>(defaultTab)\n const [view, setView] = useState<DepositView>('method')\n const [source, setSource] = useState<DepositSource>('connected')\n const [selectedTokenId, setSelectedTokenId] = useState(defaultToken?.id ?? '')\n const [amount, setAmount] = useState('')\n\n const selectedToken = enabledTokens.find((t) => t.id === selectedTokenId) ?? defaultToken\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('method')\n setAmount('')\n setSelectedTokenId('')\n }\n }, [address, hostedAuthConfig])\n\n const openDeposit = (next: DepositSource) => {\n setSource(next)\n setView('deposit')\n }\n\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n const [isSubmittingLock, setIsSubmittingLock] = useState(false)\n const [lockFailedMessage, setLockFailedMessage] = useState<string | null>(null)\n\n const finishDeposit = () => {\n setAmount('')\n if (onDepositSuccess) {\n resetDeposit()\n onDepositSuccess()\n } else {\n setShowSuccess(true)\n }\n }\n\n // Card purchases surface success inline in the on-ramp form (the crypto\n // success view would show transfer steps that never happened), so without\n // a host callback there is nothing to do here.\n const finishCardPurchase = () => {\n setAmount('')\n onDepositSuccess?.()\n }\n\n const {\n txHash,\n isGettingAddress,\n isSwitchingChain,\n isSendingTransaction,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n verificationFailed,\n isPending,\n error: depositError,\n deposit,\n retryVerification,\n reset: resetDeposit,\n } = useDeposit({\n onCredited: (_txHash, _response, lockPending) => {\n // With an allowance the flow's promise is locked funds, not just a\n // credit — hold the progress view until the pre-signed lock settles.\n if (lockPending) {\n setIsSubmittingLock(true)\n return\n }\n finishDeposit()\n },\n onLockSubmitted: () => {\n setIsSubmittingLock(false)\n finishDeposit()\n },\n // The deposit credited; only the policy lock failed. Success must not\n // fire (the host would act on unlocked funds) — show the dedicated\n // error view and let the host re-prompt for a fresh lock.\n onLockFailed: (err) => {\n setIsSubmittingLock(false)\n setLockFailedMessage(err.message)\n onLockFailed?.(err)\n },\n onCheckTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const isUnsafeToClose = (isGettingAddress || isSendingTransaction) && !cancelled\n useEffect(() => {\n onCloseBlockedChange?.(isUnsafeToClose)\n }, [isUnsafeToClose, onCloseBlockedChange])\n\n useEffect(() => {\n // Post-transfer verification errors get the dedicated error view below.\n if (depositError && !verificationFailed) {\n toast.error(\n depositError.message.length > 100\n ? `${depositError.message.slice(0, 100)}...`\n : depositError.message\n )\n }\n }, [depositError, verificationFailed])\n\n const handleSubmit = (args: { source: DepositSource; tokenId: string; amount: string }) => {\n if (args.source === 'external') {\n setView('external-deposit')\n return\n }\n if (args.source === 'credit-card') {\n // The pre-signed lock for card purchases is created inside the on-ramp\n // flow itself — see the postDepositLock wiring in CreditCardWidgetView.\n setView('credit-card-widget')\n return\n }\n const token = enabledTokens.find((t) => t.id === args.tokenId)\n if (!token) return\n onDeposit?.(args)\n setCancelled(false)\n deposit({\n tokenId: token.id,\n amount: parseTokenAmount(args.amount, token.decimals),\n postDepositLock: allowance\n ? {\n maxAmount: BigInt(allowance.value),\n lockDuration: allowance.lockDuration,\n }\n : undefined,\n }).catch((err: unknown) => {\n toast.error(err instanceof Error ? err.message : 'Deposit failed')\n })\n }\n\n const targetChain = selectedToken ? getChainById(selectedToken.chainId) : undefined\n const explorerTxUrl =\n txHash && targetChain?.explorerUrl ? `${targetChain.explorerUrl}/tx/${txHash}` : undefined\n const depositSteps: Step[] = [\n {\n label: 'Getting deposit address',\n status: isGettingAddress\n ? 'active'\n : isSwitchingChain ||\n isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing ||\n isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: `Switching to ${targetChain?.name ?? 'deposit chain'}`,\n status: isSwitchingChain\n ? 'active'\n : isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing ||\n isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirm in wallet',\n status: isSendingTransaction\n ? 'active'\n : isWaitingForConfirmation || isWaitingForProcessing || isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirming transaction',\n status: isWaitingForConfirmation\n ? 'active'\n : isWaitingForProcessing || isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Verifying deposit — may take up to a few minutes',\n status: isWaitingForProcessing ? 'active' : isSubmittingLock ? 'completed' : 'pending',\n },\n ...(allowance\n ? [\n {\n label: `Locking funds for ${appName}`,\n status: isSubmittingLock ? 'active' : 'pending',\n } as Step,\n ]\n : []),\n ]\n const flowView: DepositFlowView | null = showSuccess\n ? 'deposit-success'\n : lockFailedMessage\n ? 'lock-error'\n : showTimeout\n ? 'deposit-timeout'\n : verificationFailed\n ? 'deposit-error'\n : (isPending && !cancelled) || isSubmittingLock\n ? 'depositing'\n : null\n const activeView: DepositView | DepositFlowView = flowView ?? view\n\n const handleDepositDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n resetDeposit()\n }\n\n const handleDepositCancel = () => {\n setCancelled(true)\n resetDeposit()\n }\n\n const handleLockFailedDone = () => {\n setLockFailedMessage(null)\n setAmount('')\n setCancelled(false)\n resetDeposit()\n }\n\n const handleDismissVerificationError = () => {\n setAmount('')\n setCancelled(false)\n resetDeposit()\n }\n\n const handleRetryVerification = () => {\n retryVerification().catch(() => {\n // Errors are already surfaced via the hook's error state and onError callback.\n })\n }\n\n const back =\n view === 'external-deposit'\n ? { to: 'deposit' as const, label: 'Deposit from External Wallet' }\n : view === 'credit-card-widget'\n ? { to: 'deposit' as const, label: 'Buy with credit card and deposit' }\n : view === 'select-token'\n ? { to: 'deposit' as const, label: 'Deposit' }\n : { to: 'method' as const, label: 'Deposit Method' }\n\n const goBack = () => {\n if (back.to === 'method') {\n setAmount('')\n setSelectedTokenId('')\n }\n setView(back.to)\n }\n\n return (\n <>\n {onClose && (\n <button\n data-privana-close\n onClick={onClose}\n disabled={isUnsafeToClose}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-5 w-5 items-center justify-center transition-colors',\n isUnsafeToClose\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n )}\n\n {flowView || (activeView === 'method' && !onExit) ? (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={activeView === 'method' ? onExit : goBack}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n {activeView === 'method' ? appName : back.label}\n </button>\n )}\n\n {flowView && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n {activeView === 'deposit-success' && (\n <TransactionSuccessView\n title=\"Deposit Successful\"\n message={`Your ${selectedToken?.symbol ?? ''} deposit has been processed.`}\n onDone={handleDepositDone}\n />\n )}\n {activeView === 'lock-error' && (\n <TransactionWarningView\n title=\"Deposit credited, lock failed\"\n message={`Your deposit was credited but locking the funds for ${appName} failed: ${lockFailedMessage}`}\n onDone={handleLockFailedDone}\n />\n )}\n {activeView === 'deposit-timeout' && (\n <TransactionWarningView\n title=\"Deposit Processing\"\n message=\"Your transaction was confirmed but the deposit is still being processed. Please check your balance - it should update shortly.\"\n onDone={handleDepositDone}\n />\n )}\n {activeView === 'deposit-error' && (\n <TransactionErrorView\n title=\"Verification failed\"\n message={\n depositError?.message\n ? `Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address — retry verification instead of starting a new deposit. (${depositError.message})`\n : 'Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address — retry verification instead of starting a new deposit.'\n }\n explorerUrl={explorerTxUrl}\n explorerLabel=\"View transaction\"\n onRetry={handleRetryVerification}\n onDismiss={handleDismissVerificationError}\n />\n )}\n {activeView === 'depositing' && (\n <TransactionProgressView\n title=\"Depositing...\"\n steps={depositSteps}\n // Only allow cancel before the transaction is confirmed (during\n // address fetch / wallet signing).\n onCancel={isGettingAddress || isSendingTransaction ? handleDepositCancel : undefined}\n />\n )}\n </div>\n )}\n\n {activeView === 'method' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n {activeTab === 'crypto'\n ? 'Choose the deposit method'\n : 'Buy with credit card and deposit'}\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n {activeTab === 'crypto'\n ? 'Choose the deposit method.'\n : 'Use credit card to buy crypto and deposit'}\n </p>\n </div>\n\n <MethodTabs activeTab={activeTab} onTabChange={setActiveTab} />\n\n {activeTab === 'crypto' ? (\n <div className=\"flex flex-col gap-3\">\n <MethodOption\n title=\"Connected wallet\"\n description=\"Deposit from your connected wallet.\"\n onClick={() => {\n onSelectConnectedWallet?.()\n openDeposit('connected')\n }}\n />\n <MethodOption\n title=\"External Wallet\"\n description=\"Send funds from external wallet or exchange.\"\n onClick={() => {\n onSelectExternalWallet?.()\n openDeposit('external')\n }}\n />\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n <MethodOption\n title=\"Moonpay\"\n description=\"on selected address\"\n onClick={() => {\n onSelectCreditCard?.()\n openDeposit('credit-card')\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {activeView === 'deposit' && (\n <MoonPayGate enabled={source === 'credit-card'}>\n <DepositView\n source={source}\n selectedToken={selectedToken}\n amount={amount}\n allowance={allowance}\n onAmountChange={setAmount}\n onSelectToken={() => setView('select-token')}\n onConnectWallet={onConnectWallet}\n onSubmit={handleSubmit}\n isSubmitting={isPending}\n />\n </MoonPayGate>\n )}\n\n {activeView === 'select-token' && (\n <TokenSelectorView\n selectedTokenId={selectedToken?.id}\n onSelect={(id) => {\n setSelectedTokenId(id)\n setView('deposit')\n }}\n />\n )}\n\n {activeView === 'external-deposit' && (\n <ExternalDepositView\n token={selectedToken}\n amount={amount}\n onCredited={allowance ? undefined : onDepositSuccess}\n />\n )}\n\n {activeView === 'credit-card-widget' && (\n <MoonPayGate enabled>\n <CreditCardWidgetView\n token={selectedToken}\n amount={amount}\n allowance={allowance}\n // Mirrors the crypto path's lock gating: with an allowance the\n // host learns of success only once the lock is accepted. The\n // on-ramp hook also reports resumed background rows through these\n // same callbacks, which at worst ends the deposit view early or\n // surfaces an earlier purchase's lock failure — both re-promptable.\n onCredited={allowance ? undefined : finishCardPurchase}\n onLockSubmitted={finishCardPurchase}\n onLockFailed={(err) => {\n setLockFailedMessage(err.message)\n onLockFailed?.(err)\n }}\n />\n </MoonPayGate>\n )}\n </>\n )\n}\n\nexport interface DepositModalProps extends DepositMethodHandlers {\n open: boolean\n onClose: () => void\n}\n\nexport function DepositModal({ open, onClose, ...handlers }: DepositModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Deposit\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Deposit funds into your account.\n </DialogDescription>\n <DepositModalContent\n onClose={handleClose}\n onCloseBlockedChange={setIsCloseBlocked}\n {...handlers}\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DepositInlineModalProps extends DepositMethodHandlers {\n className?: string\n}\n\nexport function DepositInlineModal({ className, ...handlers }: DepositInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <DepositModalContent {...handlers} />\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount } from 'wagmi'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { getExplorerAddressUrl, getExplorerLabel } from '@/sdk/types/chains'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance, useWithdraw } from '@/sdk/hooks'\nimport type { WithdrawStep } from '@/sdk/hooks'\nimport { cn, formatTokenAmount, parseTokenAmount } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { TokenSelectorView } from './token-selector-view'\nimport { CloseIcon, ChevronLeftIcon, ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n type Step,\n} from './transaction-steps'\n\ntype WithdrawModalView = 'form' | 'select-token'\n\nfunction WithdrawView({\n selectedToken,\n amount,\n onAmountChange,\n onSelectToken,\n onPendingChange,\n}: {\n selectedToken: TokenConfig | undefined\n amount: string\n onAmountChange: (value: string) => void\n onSelectToken: () => void\n onPendingChange?: (pending: boolean) => void\n}) {\n const { chains, getChainById } = usePrivanaContext()\n const { isConnected, address } = useAccount()\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = selectedToken ? (getChainById(selectedToken.chainId) ?? chains[0]) : chains[0]\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({\n tokenId: selectedToken?.id,\n enabled: !!selectedToken,\n })\n\n const formattedBalance = selectedToken\n ? formatTokenAmount(balanceWei, selectedToken.decimals)\n : '0.00'\n\n const { withdraw, isPending, currentStep, error, reset } = useWithdraw({\n onProcessingSuccess: () => {\n onAmountChange('')\n setShowSuccess(true)\n },\n onProcessingTimeout: () => {\n onAmountChange('')\n setShowTimeout(true)\n },\n })\n\n const explorerUrl =\n address && targetChain ? getExplorerAddressUrl(targetChain.id, address) : undefined\n\n const getStepStatus = (step: WithdrawStep, after: WithdrawStep[]): Step['status'] => {\n if (currentStep === step) return 'active'\n if (after.includes(currentStep)) return 'completed'\n return 'pending'\n }\n\n const withdrawSteps: Step[] = [\n {\n label: 'Switching to signing chain',\n status: getStepStatus('switching-chain', ['signing', 'submitting', 'processing']),\n },\n { label: 'Sign in wallet', status: getStepStatus('signing', ['submitting', 'processing']) },\n { label: 'Submitting withdrawal', status: getStepStatus('submitting', ['processing']) },\n { label: 'Processing — may take a minute or two', status: getStepStatus('processing', []) },\n ]\n\n useEffect(() => {\n if (error) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n const tooManyDecimals =\n !!hasValidAmount &&\n !!selectedToken &&\n amount.includes('.') &&\n amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n !!hasValidAmount &&\n !tooManyDecimals &&\n !!selectedToken &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, selectedToken.decimals) > BigInt(balanceWei)\n\n const canWithdraw =\n isConnected && hasValidAmount && !!selectedToken && !tooManyDecimals && !exceedsBalance\n\n const handleMax = () => {\n if (!selectedToken) return\n const max = formattedBalance.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n const handleWithdraw = async () => {\n if (!selectedToken || !canWithdraw) return\n setCancelled(false)\n await withdraw({\n tokenId: selectedToken.id,\n amount: parseTokenAmount(amount, selectedToken.decimals),\n })\n }\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n if (showSuccess && selectedToken) {\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionSuccessView\n title=\"Withdrawal Complete\"\n message={`Your ${selectedToken.symbol} withdrawal has been processed. Funds should appear in your wallet shortly.`}\n explorerUrl={explorerUrl}\n explorerLabel={targetChain ? getExplorerLabel(targetChain.id) : undefined}\n onDone={handleDone}\n />\n </div>\n )\n }\n\n if (showTimeout) {\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionWarningView\n title=\"Withdrawal Processing\"\n message=\"Your withdrawal is still being processed. Please check your balance — it should update shortly.\"\n onDone={handleDone}\n />\n </div>\n )\n }\n\n if (isPending && !cancelled) {\n const canCancel =\n currentStep === 'idle' || currentStep === 'switching-chain' || currentStep === 'signing'\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Withdrawing...\"\n steps={withdrawSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n </div>\n )\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">Withdraw</h2>\n\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n type=\"button\"\n onClick={onSelectToken}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left\"\n >\n {selectedToken ? (\n <>\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">on {targetChain?.name ?? '—'}</span>\n </div>\n </>\n ) : (\n <span className=\"text-muted-foreground flex-1 text-sm\">Select token</span>\n )}\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n Available {formattedBalance} {selectedToken?.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 flex-1 bg-transparent text-sm outline-none\"\n />\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && selectedToken && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n type=\"button\"\n disabled={!canWithdraw}\n onClick={handleWithdraw}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {!isConnected ? 'Connect Wallet' : 'Withdraw'}\n </button>\n </div>\n )\n}\n\nexport function WithdrawModalContent({\n onClose,\n onPendingChange,\n onBack,\n}: {\n onClose?: () => void\n onPendingChange?: (pending: boolean) => void\n /** Renders a back chevron on the form view (for embedding, e.g. WalletModal). */\n onBack?: () => void\n}) {\n const { serviceName, enabledTokens, defaultToken, hostedAuthConfig } = usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [view, setView] = useState<WithdrawModalView>('form')\n const [selectedTokenId, setSelectedTokenId] = useState(defaultToken?.id ?? '')\n const [amount, setAmount] = useState('')\n const [isPending, setIsPending] = useState(false)\n\n const handlePendingChange = (pending: boolean) => {\n setIsPending(pending)\n onPendingChange?.(pending)\n }\n\n const selectedToken = enabledTokens.find((t) => t.id === selectedTokenId) ?? defaultToken\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('form')\n setAmount('')\n setSelectedTokenId('')\n }\n }, [address, hostedAuthConfig])\n\n return (\n <>\n {onClose && !isPending && (\n <button\n data-privana-close\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground absolute top-6 right-5 z-20 flex h-5 w-5 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n\n {view === 'select-token' ? (\n <button\n type=\"button\"\n onClick={() => setView('form')}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n Withdraw\n </button>\n ) : onBack && !isPending ? (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n {appName}\n </button>\n ) : (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n )}\n\n {view === 'form' && (\n <WithdrawView\n selectedToken={selectedToken}\n amount={amount}\n onAmountChange={setAmount}\n onSelectToken={() => setView('select-token')}\n onPendingChange={handlePendingChange}\n />\n )}\n\n {view === 'select-token' && (\n <TokenSelectorView\n selectedTokenId={selectedToken?.id}\n onSelect={(id) => {\n setSelectedTokenId(id)\n setView('form')\n }}\n />\n )}\n </>\n )\n}\n\nexport interface WithdrawModalProps {\n open: boolean\n onClose: () => void\n}\n\nexport function WithdrawModal({ open, onClose }: WithdrawModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Withdraw\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Withdraw funds from your account.\n </DialogDescription>\n <WithdrawModalContent onClose={handleClose} onPendingChange={setIsCloseBlocked} />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface WithdrawInlineModalProps {\n className?: string\n}\n\nexport function WithdrawInlineModal({ className }: WithdrawInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <WithdrawModalContent />\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport { useAccount } from 'wagmi'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance } from '@/sdk/hooks'\nimport { cn, formatTimeRemaining, formatTokenAmount, parseTokenAmount } from '@/lib/utils'\nimport { CloseIcon } from './icons'\nimport { AllowancePolicySection } from './allowance-policy-section'\nimport { DepositModalContent, type DepositMethodHandlers } from './deposit-modal'\nimport { WithdrawModalContent } from './withdraw-modal'\nimport { TransactionProgressView, TransactionErrorView } from './transaction-steps'\n\nconst AVAILABLE_COLOR = 'bg-[#007bff]'\nconst IN_USE_COLOR = 'bg-[#4fc77f]'\n\nexport interface WalletSession {\n /** Funds committed to the active session, in the display token's base units. */\n inUse: string | bigint\n /** Unix timestamp (seconds) when the session lock expires; shows the countdown. */\n expiry?: number\n}\n\nexport interface WalletModalHandlers extends DepositMethodHandlers {\n session?: WalletSession\n // `unknown` (rather than `void | Promise<void>`) preserves the void-return-callback\n // leniency: callers may pass value-returning async handlers (e.g. `async () => receipt`).\n // The runtime return value is inspected internally to decide whether to show progress.\n onFundSession?: (args: { tokenId: string; amount: string }) => unknown\n onEndSession?: () => Promise<void>\n}\n\nfunction toInUseWei(value: string | bigint): bigint {\n let parsed: bigint\n try {\n parsed = typeof value === 'bigint' ? value : BigInt(value)\n } catch {\n console.warn(`[privana-sdk] Invalid session.inUse value: ${value}`)\n return 0n\n }\n if (parsed < 0n) {\n console.warn(`[privana-sdk] Negative session.inUse value: ${value}`)\n return 0n\n }\n return parsed\n}\n\nfunction useNow(intervalMs: number, enabled: boolean) {\n const [, setTick] = useState(0)\n useEffect(() => {\n if (!enabled) return\n const id = setInterval(() => setTick((t) => t + 1), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs, enabled])\n}\n\nfunction SegmentedBalanceBar({\n availableWei,\n inUseWei,\n}: {\n availableWei: bigint\n inUseWei: bigint\n}) {\n const total = availableWei + inUseWei\n // With no funds at all, show a full \"available\" track.\n const showAvailable = inUseWei === 0n || availableWei > 0n\n const showInUse = inUseWei > 0n\n const grow = (part: bigint) => (total > 0n ? Number((part * 1000n) / total) : 1)\n\n return (\n <div className=\"flex h-1.5 w-full\">\n {showAvailable && (\n <div\n className={cn(AVAILABLE_COLOR, 'rounded-l-full', !showInUse && 'rounded-r-full')}\n style={{ flexGrow: grow(availableWei) }}\n />\n )}\n {showInUse && (\n <div\n className={cn(IN_USE_COLOR, 'rounded-r-full', !showAvailable && 'rounded-l-full')}\n style={{ flexGrow: grow(inUseWei) }}\n />\n )}\n </div>\n )\n}\n\nfunction BalanceLegendItem({ color, label }: { color: string; label: string }) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className={cn('h-2.5 w-2.5 rounded-full', color)} />\n <span className=\"text-foreground text-sm leading-5\">{label}</span>\n </div>\n )\n}\n\ntype BalanceVariant = 'idle' | 'session-zero' | 'fully-in-use' | 'mixed'\n\nfunction WalletBalanceView({\n session,\n allowance,\n amount,\n onAmountChange,\n onFundSession,\n onAddFunds,\n onWithdraw,\n}: {\n session?: WalletSession\n allowance?: WalletModalHandlers['allowance']\n amount: string\n onAmountChange: (value: string) => void\n onFundSession?: WalletModalHandlers['onFundSession']\n onAddFunds?: () => void\n onWithdraw?: () => void\n}) {\n const { serviceName, serviceIcon, defaultToken } = usePrivanaContext()\n const appName = serviceName ?? 'Privana'\n const token = defaultToken\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({ tokenId: token?.id, enabled: !!token })\n\n const inUseWei = session ? toInUseWei(session.inUse) : 0n\n const availableWei = BigInt(balanceWei)\n const variant: BalanceVariant = !session\n ? 'idle'\n : inUseWei === 0n\n ? 'session-zero'\n : availableWei === 0n\n ? 'fully-in-use'\n : 'mixed'\n\n const expiry = session?.expiry\n useNow(30_000, expiry != null)\n const countdown = expiry != null ? formatTimeRemaining(expiry) : null\n\n const decimals = token?.decimals ?? 18\n const totalFormatted = formatTokenAmount((availableWei + inUseWei).toString(), decimals)\n const availableFormatted = formatTokenAmount(availableWei.toString(), decimals)\n const inUseFormatted = formatTokenAmount(inUseWei.toString(), decimals)\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount &&\n !!token &&\n amount.includes('.') &&\n amount.split('.')[1].length > token.decimals\n // Only available funds can be committed to a session — in-use funds are\n // already locked.\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n !!token &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, token.decimals) > availableWei\n\n const canFundSession =\n hasValidAmount &&\n !!token &&\n !tooManyDecimals &&\n !exceedsBalance &&\n !isBalanceLoading &&\n !isBalanceError\n\n const handleMax = () => {\n const max = availableFormatted.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n const handleFundSession = () => {\n if (!token || !canFundSession || !onFundSession) return\n onFundSession({ tokenId: token.id, amount })\n }\n\n const showInput = variant !== 'fully-in-use'\n const showInlineFund = variant === 'session-zero' || variant === 'mixed'\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm leading-[14px]\">Total</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] leading-[10px] font-bold\">\n {token?.symbol ?? '—'}\n </span>\n </div>\n {isBalanceLoading ? (\n <Skeleton className=\"h-9 w-40\" />\n ) : isBalanceError ? (\n <span className=\"text-muted-foreground text-[32px] leading-9 font-medium\">—</span>\n ) : (\n <span className=\"text-foreground text-[32px] leading-9 font-medium\">\n {totalFormatted}\n </span>\n )}\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <SegmentedBalanceBar availableWei={availableWei} inUseWei={inUseWei} />\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n {variant === 'fully-in-use' ? (\n <BalanceLegendItem color={IN_USE_COLOR} label=\"In use\" />\n ) : variant === 'mixed' ? (\n <>\n <BalanceLegendItem\n color={AVAILABLE_COLOR}\n label={`Available (${availableFormatted})`}\n />\n <BalanceLegendItem color={IN_USE_COLOR} label={`In use (${inUseFormatted})`} />\n </>\n ) : (\n <BalanceLegendItem color={AVAILABLE_COLOR} label=\"Available\" />\n )}\n </div>\n {countdown && (\n <span className=\"text-muted-foreground text-sm leading-5 whitespace-nowrap\">\n {countdown}\n </span>\n )}\n </div>\n </div>\n\n {showInput && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"border-border bg-input flex h-10 flex-1 items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 min-w-0 flex-1 bg-transparent text-sm outline-none\"\n />\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"text-foreground cursor-pointer rounded px-3 py-2.5 text-xs font-semibold\"\n >\n MAX\n </button>\n </div>\n {showInlineFund && (\n <button\n type=\"button\"\n disabled={!onFundSession || !canFundSession}\n onClick={handleFundSession}\n className=\"border-border flex h-10 min-w-20 cursor-pointer items-center justify-center rounded-[10px] border px-3 text-sm font-medium text-[#4fc77f] transition-opacity hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Fund session\n </button>\n )}\n </div>\n {tooManyDecimals && token && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {token.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n )}\n\n {variant === 'idle' && allowance && (\n <div className=\"bg-muted rounded-[10px] p-4\">\n <AllowancePolicySection\n allowance={allowance}\n serviceName={appName}\n serviceIcon={serviceIcon}\n />\n </div>\n )}\n\n <div className=\"flex items-start gap-4\">\n {variant === 'idle' ? (\n <>\n <button\n type=\"button\"\n disabled={!onFundSession || !canFundSession}\n onClick={handleFundSession}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Fund session\n </button>\n <button\n type=\"button\"\n disabled={!onAddFunds}\n onClick={onAddFunds}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Add funds\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n disabled={!onAddFunds}\n onClick={onAddFunds}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Add Funds\n </button>\n <button\n type=\"button\"\n disabled={!onWithdraw}\n onClick={onWithdraw}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Withdraw\n </button>\n </>\n )}\n </div>\n </div>\n )\n}\n\ntype WalletView =\n | 'balance'\n | 'deposit'\n | 'funding-session'\n | 'fund-session-error'\n | 'ending-session'\n | 'end-session-error'\n | 'withdraw'\n\n/**\n * Invoke a session handler (onFundSession/onEndSession) guarded by a run token.\n *\n * Shared by the fund- and end-session flows so they cannot diverge: a\n * synchronous throw is caught and routed to `onError` exactly like a rejected\n * promise (so the error view is always entered), a non-thenable result calls\n * `onSyncResult` (lets callers skip progress UI for synchronous handlers), and\n * a thenable calls `onAsyncStart` then resolves/rejects. Stale runs —\n * superseded by a retry or an account switch — are ignored.\n */\nfunction invokeGuarded(\n runRef: { current: number },\n invoke: () => unknown,\n handlers: {\n onSyncResult: () => void\n onAsyncStart: () => void\n onSuccess: () => void\n onError: (err: unknown) => void\n }\n) {\n const run = ++runRef.current\n const isCurrent = () => runRef.current === run\n\n let result: unknown\n try {\n result = invoke()\n } catch (err) {\n if (isCurrent()) handlers.onError(err)\n return\n }\n\n if (result == null || typeof (result as { then?: unknown }).then !== 'function') {\n handlers.onSyncResult()\n return\n }\n\n handlers.onAsyncStart()\n ;(result as Promise<unknown>).then(\n () => {\n if (isCurrent()) handlers.onSuccess()\n },\n (err: unknown) => {\n if (isCurrent()) handlers.onError(err)\n }\n )\n}\n\nfunction WalletModalContent({\n session,\n allowance,\n onFundSession,\n onEndSession,\n onDepositSuccess,\n onClose,\n onCloseBlockedChange,\n ...depositHandlers\n}: WalletModalHandlers & {\n onClose?: () => void\n onCloseBlockedChange?: (blocked: boolean) => void\n}) {\n const { serviceName, hostedAuthConfig } = usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [view, setView] = useState<WalletView>('balance')\n const [amount, setAmount] = useState('')\n const [depositBlocked, setDepositBlocked] = useState(false)\n const [withdrawPending, setWithdrawPending] = useState(false)\n const [endSessionError, setEndSessionError] = useState<string | null>(null)\n const [fundSessionError, setFundSessionError] = useState<string | null>(null)\n\n const endSessionRunRef = useRef(0)\n const fundSessionRunRef = useRef(0)\n const [pendingFundSession, setPendingFundSession] = useState<{\n tokenId: string\n amount: string\n } | null>(null)\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('balance')\n setAmount('')\n setDepositBlocked(false)\n setWithdrawPending(false)\n setEndSessionError(null)\n setFundSessionError(null)\n setPendingFundSession(null)\n endSessionRunRef.current++\n fundSessionRunRef.current++\n }\n }, [address, hostedAuthConfig])\n\n const closeBlocked =\n depositBlocked || withdrawPending || view === 'funding-session' || view === 'ending-session'\n useEffect(() => {\n onCloseBlockedChange?.(closeBlocked)\n }, [closeBlocked, onCloseBlockedChange])\n\n const exitDeposit = () => {\n // The embedded content unmounts, so its onCloseBlockedChange(false) never fires.\n setDepositBlocked(false)\n setView('balance')\n }\n\n const exitWithdraw = () => {\n setWithdrawPending(false)\n setView('balance')\n }\n\n const startEndSession = () => {\n if (!onEndSession) return\n setEndSessionError(null)\n invokeGuarded(endSessionRunRef, () => onEndSession(), {\n onSyncResult: () => setView('withdraw'),\n onAsyncStart: () => setView('ending-session'),\n onSuccess: () => setView('withdraw'),\n onError: (err: unknown) => {\n setEndSessionError(err instanceof Error ? err.message : null)\n setView('end-session-error')\n },\n })\n }\n\n const handleWithdraw = () => {\n if (session && onEndSession) {\n startEndSession()\n } else {\n setView('withdraw')\n }\n }\n\n const dismissEndSessionError = () => {\n endSessionRunRef.current++\n setEndSessionError(null)\n setView('balance')\n }\n\n const fundSession = (args: { tokenId: string; amount: string }) => {\n if (!onFundSession) return\n setFundSessionError(null)\n setPendingFundSession(args)\n setAmount('')\n invokeGuarded(fundSessionRunRef, () => onFundSession(args), {\n onSyncResult: () => {\n setPendingFundSession(null)\n setView('balance')\n },\n onAsyncStart: () => setView('funding-session'),\n onSuccess: () => {\n setPendingFundSession(null)\n setView('balance')\n },\n onError: (err: unknown) => {\n setFundSessionError(err instanceof Error ? err.message : null)\n setView('fund-session-error')\n },\n })\n }\n\n const dismissFundSessionError = () => {\n fundSessionRunRef.current++\n setFundSessionError(null)\n if (pendingFundSession) {\n setAmount(pendingFundSession.amount)\n setPendingFundSession(null)\n }\n setView('balance')\n }\n\n return (\n <>\n {onClose && (\n <button\n data-privana-close\n onClick={onClose}\n disabled={closeBlocked}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-5 w-5 items-center justify-center transition-colors',\n closeBlocked\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n )}\n\n {(view === 'balance' ||\n view === 'funding-session' ||\n view === 'fund-session-error' ||\n view === 'ending-session' ||\n view === 'end-session-error') && (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n )}\n\n {view === 'balance' && (\n <WalletBalanceView\n session={session}\n allowance={allowance}\n amount={amount}\n onAmountChange={setAmount}\n onFundSession={onFundSession ? fundSession : undefined}\n onAddFunds={() => setView('deposit')}\n onWithdraw={handleWithdraw}\n />\n )}\n\n {view === 'funding-session' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Funding session...\"\n steps={[{ label: 'Waiting for the session to be funded', status: 'active' }]}\n />\n </div>\n )}\n\n {view === 'fund-session-error' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionErrorView\n title=\"Could not fund session\"\n message={\n fundSessionError\n ? `Your session could not be funded. (${fundSessionError})`\n : 'Your session could not be funded.'\n }\n onRetry={() => {\n if (pendingFundSession) fundSession(pendingFundSession)\n }}\n onDismiss={dismissFundSessionError}\n retryLabel=\"Try again\"\n />\n </div>\n )}\n\n {view === 'ending-session' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Ending game session...\"\n steps={[{ label: 'Waiting for the game session to settle', status: 'active' }]}\n />\n </div>\n )}\n\n {view === 'end-session-error' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionErrorView\n title=\"Could not end session\"\n message={\n endSessionError\n ? `Your game session could not be ended, so the funds committed to it are not available to withdraw yet. (${endSessionError})`\n : 'Your game session could not be ended, so the funds committed to it are not available to withdraw yet.'\n }\n onRetry={startEndSession}\n onDismiss={dismissEndSessionError}\n retryLabel=\"Try again\"\n />\n </div>\n )}\n\n {view === 'withdraw' && (\n <WithdrawModalContent onBack={exitWithdraw} onPendingChange={setWithdrawPending} />\n )}\n\n {view === 'deposit' && (\n <DepositModalContent\n {...depositHandlers}\n allowance={allowance}\n onExit={exitDeposit}\n onCloseBlockedChange={setDepositBlocked}\n onDepositSuccess={() => {\n exitDeposit()\n onDepositSuccess?.()\n }}\n />\n )}\n </>\n )\n}\n\nexport interface WalletModalProps extends WalletModalHandlers {\n open: boolean\n onClose: () => void\n}\n\nexport function WalletModal({ open, onClose, ...handlers }: WalletModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Wallet\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Manage your account balance.\n </DialogDescription>\n <WalletModalContent\n onClose={handleClose}\n onCloseBlockedChange={setIsCloseBlocked}\n {...handlers}\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface WalletInlineModalProps extends WalletModalHandlers {\n className?: string\n}\n\nexport function WalletInlineModal({ className, ...handlers }: WalletInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <WalletModalContent {...handlers} />\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/sdk/hooks/use-privana-client.ts","../src/sdk/hooks/use-hosted-redirect-auth.ts","../src/sdk/hooks/use-balance.ts","../src/sdk/hooks/use-batch-balances.ts","../src/sdk/hooks/use-deposit.ts","../src/sdk/hooks/use-deposit-address.ts","../src/sdk/hooks/use-withdraw.ts","../src/sdk/hooks/use-lock-funds.ts","../src/sdk/hooks/use-unlock-funds.ts","../src/sdk/hooks/use-transfer.ts","../src/sdk/hooks/use-locked-funds.ts","../src/sdk/hooks/use-total-locked-balance.ts","../src/sdk/hooks/use-expired-locks.ts","../src/sdk/hooks/use-pending-deposits.ts","../src/sdk/hooks/use-pending-withdrawals.ts","../src/sdk/hooks/use-history.ts","../src/sdk/hooks/use-token-info.ts","../src/sdk/hooks/use-token-list.ts","../src/sdk/hooks/use-modify-lock.ts","../src/components/ui/dialog.tsx","../src/components/privana/token-icons.tsx","../src/components/privana/icons.tsx","../src/components/privana/transaction-steps.tsx","../src/components/privana/deposit-form.tsx","../src/components/privana/withdraw-form.tsx","../src/components/privana/privana-modal.tsx","../src/components/privana/privana-button.tsx","../src/sdk/hooks/external-deposit-lock.ts","../src/sdk/hooks/use-external-deposit-lock.ts","../src/sdk/hooks/use-moonpay-limits.ts","../src/components/privana/token-selector-view.tsx","../src/components/privana/credit-card-widget-view.tsx","../src/components/privana/privana-icon.tsx","../src/components/privana/allowance-policy-section.tsx","../src/components/privana/deposit-modal.tsx","../src/components/privana/withdraw-modal.tsx","../src/components/privana/wallet-modal.tsx"],"names":["usePrivanaContext","AccountingApiError","HostedAuthError","useState","useRef","useMemo","createHostedAuthPendingStorageKey","useCallback","clearHostedAuthPendingTransaction","HostedAuthRequiredError","createPkceVerifier","createPkceChallenge","createHostedAuthState","persistHostedAuthPendingTransaction","stripHostedAuthCallbackParams","parseHostedAuthCallback","readHostedAuthPendingTransaction","HostedAuthStateMismatchError","buildHostedAuthSession","useContext","QueryClientContext","useSafePrivanaContext","usePrivateReadRequest","useQuery","formatTokenAmount","setBrowserStorageItem","getBrowserStorageItem","isSignedLockUsable","removeBrowserStorageItem","useAccount","getChainById","useWalletClient","useQueryClient","useConfig","useEffect","submitPendingLock","error","PostDepositLockError","useDepositVerification","useMutation","useWriteContract","useSendTransaction","useEnsureCorrectChain","getTransactionReceipt","getBlockNumber","waitForTransactionReceipt","zeroAddress","canUseBrowserStorage","clampLockAmount","requireDepositLockOwner","getWalletClient","createSignedLockRequest","requireServiceAddress","erc20Abi","signWithdrawMessage","signLockMessage","signTransferMessage","signTransferLockedMessage","keepPreviousData","query","signModifyLockMessage","DialogPrimitive","jsx","cn","jsxs","XIcon","useBalance","useReadContract","parseTokenAmount","toast","getExplorerAddressUrl","getExplorerLabel","shortenAddress","formatTimeRemaining","Fragment","useWagmiBalance","useId","Button","getSharedBrowserStorageItem","setSharedBrowserStorageItem","removeSharedBrowserStorageItem","canUseSharedBrowserStorage","DEFAULT_LOCK_DURATION_SECONDS","MoonPayContext","TokenSelectorView","FiatOnRampForm","MoonPayProvider","formatUnits","QRCodeSVG","Skeleton","formatCountdown","token"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport { usePrivanaContext } from '../context/privana-provider'\n\nexport function usePrivanaClient() {\n const { client } = usePrivanaContext()\n return client\n}\n","'use client'\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport {\n buildHostedAuthSession,\n clearHostedAuthPendingTransaction,\n createHostedAuthPendingStorageKey,\n createHostedAuthState,\n createPkceChallenge,\n createPkceVerifier,\n parseHostedAuthCallback,\n persistHostedAuthPendingTransaction,\n readHostedAuthPendingTransaction,\n stripHostedAuthCallbackParams,\n} from '../auth'\nimport {\n AccountingApiError,\n HostedAuthError,\n HostedAuthRequiredError,\n HostedAuthStateMismatchError,\n} from '../client'\nimport { usePrivanaContext } from '../context'\nimport type { HostedAuthSession } from '../types'\n\nconst hostedAuthExchangeInflight = new Map<string, Promise<HostedAuthSession>>()\n\nfunction normalizeHostedAuthError(error: unknown): HostedAuthError | Error {\n if (error instanceof AccountingApiError && error.detail) {\n return new HostedAuthError(error.detail)\n }\n if (error instanceof Error) {\n return error\n }\n return new HostedAuthError('Hosted authentication failed.')\n}\n\nexport interface UseHostedRedirectAuthResult {\n session: HostedAuthSession | null\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | null\n login: () => Promise<void>\n completeLogin: () => Promise<HostedAuthSession | null>\n logout: () => Promise<void>\n refresh: () => Promise<HostedAuthSession>\n}\n\nexport function useHostedRedirectAuth(): UseHostedRedirectAuthResult {\n const {\n client,\n hostedAuthConfig,\n hostedAuthSession,\n networkConfig,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n } = usePrivanaContext()\n const [error, setError] = useState<Error | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const loginInflight = useRef<Promise<void> | null>(null)\n const completionInflight = useRef<Promise<HostedAuthSession | null> | null>(null)\n const pendingStorageKey = useMemo(\n () =>\n hostedAuthConfig\n ? createHostedAuthPendingStorageKey(client.getBaseUrl(), hostedAuthConfig)\n : null,\n [client, hostedAuthConfig]\n )\n\n const clearPendingLogin = useCallback(() => {\n if (!pendingStorageKey || typeof window === 'undefined') return\n clearHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n }, [pendingStorageKey])\n\n const login = useCallback(async (): Promise<void> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (loginInflight.current) {\n return loginInflight.current\n }\n\n const loginPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n try {\n const verifier = createPkceVerifier()\n const codeChallenge = await createPkceChallenge(verifier)\n const state = createHostedAuthState()\n persistHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey, {\n codeVerifier: verifier,\n state,\n })\n const authorizeUrl = client.getHostedAuthAuthorizeUrl({\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n code_challenge: codeChallenge,\n chain_id: networkConfig.chainId,\n code_challenge_method: 'S256',\n response_mode: 'redirect',\n state,\n })\n\n window.location.assign(authorizeUrl)\n } catch (loginError) {\n clearPendingLogin()\n const normalizedError = normalizeHostedAuthError(loginError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n loginInflight.current = null\n setIsLoading(false)\n }\n })()\n\n loginInflight.current = loginPromise\n return loginPromise\n }, [clearPendingLogin, client, hostedAuthConfig, networkConfig.chainId, pendingStorageKey])\n\n const completeLogin = useCallback(async (): Promise<HostedAuthSession | null> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (completionInflight.current) {\n return completionInflight.current\n }\n\n const completionPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n const callbackUrl = new URL(window.location.href)\n const cleanupCallbackUrl = () => {\n window.history.replaceState(null, '', stripHostedAuthCallbackParams(callbackUrl))\n }\n\n try {\n const callback = parseHostedAuthCallback(callbackUrl, hostedAuthConfig.redirectUri)\n if (!callback) {\n return null\n }\n\n const pending = readHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n if (!pending) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n 'Hosted authentication response could not be matched to a pending login request.'\n )\n }\n if (!callback.state || callback.state !== pending.state) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthStateMismatchError()\n }\n if ('error' in callback) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n callback.errorDescription || callback.error || 'Hosted authentication failed.'\n )\n }\n\n const { codeVerifier } = pending\n const exchangeKey = `${pendingStorageKey}:${callback.code}:${pending.state}`\n let exchangePromise = hostedAuthExchangeInflight.get(exchangeKey)\n\n if (!exchangePromise) {\n exchangePromise = (async () => {\n const response = await client.exchangeHostedAuthCode({\n code: callback.code,\n code_verifier: codeVerifier,\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n })\n\n const session = buildHostedAuthSession(response, hostedAuthConfig)\n setHostedAuthSession(session)\n clearPendingLogin()\n cleanupCallbackUrl()\n return session\n })()\n\n hostedAuthExchangeInflight.set(exchangeKey, exchangePromise)\n }\n\n try {\n return await exchangePromise\n } finally {\n if (hostedAuthExchangeInflight.get(exchangeKey) === exchangePromise) {\n hostedAuthExchangeInflight.delete(exchangeKey)\n }\n }\n } catch (completionError) {\n const normalizedError = normalizeHostedAuthError(completionError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n completionInflight.current = null\n setIsLoading(false)\n }\n })()\n\n completionInflight.current = completionPromise\n return completionPromise\n }, [clearPendingLogin, client, hostedAuthConfig, pendingStorageKey, setHostedAuthSession])\n\n const logout = useCallback(async (): Promise<void> => {\n setError(null)\n try {\n if (hostedAuthSession) {\n await client.logoutJwtSession({\n refresh_token: hostedAuthSession.refreshToken,\n })\n }\n } finally {\n clearHostedAuthSession()\n }\n }, [clearHostedAuthSession, client, hostedAuthSession])\n\n const refresh = useCallback(async (): Promise<HostedAuthSession> => {\n setIsLoading(true)\n setError(null)\n try {\n return await refreshHostedAuthSession()\n } catch (refreshError) {\n const normalizedError =\n refreshError instanceof Error\n ? refreshError\n : new HostedAuthError('Hosted authentication refresh failed.')\n setError(normalizedError)\n throw normalizedError\n } finally {\n setIsLoading(false)\n }\n }, [refreshHostedAuthSession])\n\n return {\n session: hostedAuthSession,\n isAuthenticated: !!hostedAuthSession,\n isLoading,\n error,\n login,\n completeLogin,\n logout,\n refresh,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BalanceResponse } from '../types'\nimport { formatTokenAmount } from '@/lib/utils'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseBalanceResult {\n balance: string\n balanceWei: string\n balanceFormatted: string\n tokenSymbol: string\n chainId: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBalance(options: UseBalanceOptions = {}): UseBalanceResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const defaultToken = accountingContext?.defaultToken\n const pollingInterval = accountingContext?.pollingInterval ?? 10000\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<BalanceResponse, Error>({\n queryKey: ['accounting-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n if (!client) throw new Error('No accounting client')\n return executePrivateRead((readClient) => readClient.getBalance(tokenId))\n },\n enabled:\n hasProviders &&\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n const balanceWei = query.data?.balance ?? '0'\n\n return {\n balance: balanceWei,\n balanceWei,\n balanceFormatted: formatTokenAmount(balanceWei),\n tokenSymbol: query.data?.token_symbol ?? '',\n chainId: query.data?.chain_id ?? '',\n isLoading: query.isPending || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BatchBalancesResponse, TokenBalance } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBatchBalancesOptions {\n tokenIds: Bytes32[]\n enabled?: boolean\n}\n\nexport interface UseBatchBalancesResult {\n balances: TokenBalance[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBatchBalances(options: UseBatchBalancesOptions): UseBatchBalancesResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<BatchBalancesResponse, Error>({\n queryKey: ['accounting-batch-balances', ...privateReadQueryScope, options.tokenIds],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead((readClient) =>\n readClient.getBatchBalances({ token_ids: options.tokenIds })\n )\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n options.tokenIds.length > 0 &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n balances: query.data?.balances ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient, useWriteContract, useSendTransaction, useConfig } from 'wagmi'\nimport {\n getBlockNumber,\n getTransactionReceipt,\n getWalletClient,\n waitForTransactionReceipt,\n} from '@wagmi/core'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport { useDepositVerification, type VerificationContext } from './use-deposit-verification'\nimport {\n canUseBrowserStorage,\n getBrowserStorageItem,\n removeBrowserStorageItem,\n setBrowserStorageItem,\n} from './browser-storage'\nimport {\n clampLockAmount,\n createSignedLockRequest,\n isSignedLockUsable,\n requireDepositLockOwner,\n requireServiceAddress,\n submitPendingLock,\n PostDepositLockError,\n type PostDepositLockConfig,\n} from './pending-lock'\nimport type {\n Bytes32,\n DepositAddressResponse,\n DepositCheckResponse,\n LockFundsRequest,\n TransactionSubmissionResponse,\n} from '../types'\n\nexport interface UseDepositOptions {\n onDepositAddressReceived?: (response: DepositAddressResponse) => void\n onDepositSuccess?: (txHash: string) => void\n /** `lockPending` is true when a pre-signed lock is being submitted after\n * this credit — `onLockSubmitted` or `onLockFailed` will follow. */\n onCredited?: (txHash: string, response: DepositCheckResponse, lockPending?: boolean) => void\n /** Fired when the pre-signed post-deposit lock is accepted by the API. */\n onLockSubmitted?: (response: TransactionSubmissionResponse) => void\n /**\n * Fired when the deposit credited but the pre-signed lock could not be\n * submitted. The funds sit in the user's available balance. Fresh signing\n * is safe only for failures known to precede any API attempt; otherwise\n * retry or reconcile the same signature. Falls back to `onError`.\n */\n onLockFailed?: (error: PostDepositLockError) => void\n /** Called when deposit check polling times out - deposit may still be processing */\n onCheckTimeout?: (txHash: string) => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking deposit status (default: 5000) */\n pollInterval?: number\n /** Max time to wait for deposit to be credited in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n /** Number of block confirmations to wait before checking deposit status (default: 15) */\n confirmations?: number\n}\n\nexport interface DepositParams {\n tokenId: Bytes32\n amount: bigint\n /**\n * Pre-sign a `Lock` for the deposited amount (capped by `maxAmount`) before\n * the transfer; the SDK submits it once the deposit credits.\n */\n postDepositLock?: PostDepositLockConfig\n}\n\nexport interface UseDepositResult {\n depositAddress: DepositAddressResponse | null\n txHash: `0x${string}` | undefined\n isGettingAddress: boolean\n isSwitchingChain: boolean\n isSendingTransaction: boolean\n isWaitingForConfirmation: boolean\n isWaitingForProcessing: boolean\n /** True if processing timed out (deposit may still be processing in background) */\n didTimeout: boolean\n /**\n * True when an on-chain transfer succeeded but the API verification step\n * (checkDeposit or status polling) failed. The funds have already left the\n * wallet, so a fresh `deposit()` would cause a double spend. Call\n * `retryVerification()` to re-run verification against the existing txHash,\n * or `reset()` to discard local tracking (the deposit may still be credited\n * in the background).\n */\n verificationFailed: boolean\n isPending: boolean\n error: Error | null\n deposit: (params: DepositParams) => Promise<void>\n /** Re-run the API verification (sweep trigger + polling) for the existing txHash. */\n retryVerification: () => Promise<void>\n reset: () => void\n}\n\ninterface PersistedDeposit {\n txHash: string\n chainId: number\n amount: string\n depositAddress: DepositAddressResponse\n signedLock?: LockFundsRequest\n savedAt: number\n}\n\nconst STALE_MS = 30 * 60 * 1000\n\nfunction storageKey(address: string): string {\n return `privana:pending-deposit:${address.toLowerCase()}`\n}\n\nfunction savePendingDeposit(address: string, data: PersistedDeposit): void {\n const stored = setBrowserStorageItem(storageKey(address), JSON.stringify(data))\n if (!stored && data.signedLock) {\n throw new Error('Unable to persist pending locked deposit for recovery')\n }\n}\n\nfunction loadPendingDeposit(address: string): PersistedDeposit | null {\n try {\n const raw = getBrowserStorageItem(storageKey(address))\n if (!raw) return null\n const data: PersistedDeposit = JSON.parse(raw)\n // A still-usable signed lock keeps the record alive past STALE_MS: the\n // lock's own expiry is the real deadline, and dropping the record here\n // would silently orphan a lock the user already signed.\n if (\n Date.now() - data.savedAt > STALE_MS &&\n !(data.signedLock && isSignedLockUsable(data.signedLock))\n ) {\n clearPendingDeposit(address)\n return null\n }\n return data\n } catch {\n return null\n }\n}\n\n// `onlyForTxHash` guards the deferred post-lock cleanup: a new deposit may\n// have persisted its own record for this address by the time the previous\n// deposit's lock submission settles, and that record must survive.\nfunction clearPendingDeposit(address: string, onlyForTxHash?: string): void {\n if (onlyForTxHash) {\n try {\n const raw = getBrowserStorageItem(storageKey(address))\n // Records without a txHash are corrupt, not a successor's — clear them.\n const recordTxHash = raw ? (JSON.parse(raw) as PersistedDeposit).txHash : undefined\n if (recordTxHash && recordTxHash !== onlyForTxHash) return\n } catch {\n // Unreadable record — fall through and clear it.\n }\n }\n removeBrowserStorageItem(storageKey(address))\n}\n\nexport function useDeposit(options: UseDepositOptions = {}): UseDepositResult {\n const { address } = useAccount()\n const { client, enabledTokens, getChainById, networkConfig, serviceAddress } = usePrivanaContext()\n const { data: walletClient } = useWalletClient()\n const queryClient = useQueryClient()\n const config = useConfig()\n const { executePrivateRead, privateReadAddress } = usePrivateReadRequest()\n const privateReadAddressRef = useRef(privateReadAddress)\n privateReadAddressRef.current = privateReadAddress\n\n const confirmations = options.confirmations ?? 15\n\n const [depositAddress, setDepositAddress] = useState<DepositAddressResponse | null>(null)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n const [isSwitchingChain, setIsSwitchingChain] = useState(false)\n const [isWaitingForConfirmation, setIsWaitingForConfirmation] = useState(false)\n // Captures failures from the pre-verification phase (waitForTransactionReceipt\n // timing out, etc.) so we can OR them with the verification hook's own\n // verificationFailed when surfacing state to consumers.\n const [receiptFailed, setReceiptFailed] = useState(false)\n const [depositError, setDepositError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n // Set the moment we know an on-chain transfer has been dispatched so we\n // refuse a second deposit() call that would double-spend. Cleared on\n // credit / reset.\n const verificationContextRef = useRef<VerificationContext | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running deposit flow\n const onDepositAddressReceivedRef = useRef(options.onDepositAddressReceived)\n const onDepositSuccessRef = useRef(options.onDepositSuccess)\n const onCreditedRef = useRef(options.onCredited)\n const onLockSubmittedRef = useRef(options.onLockSubmitted)\n const onLockFailedRef = useRef(options.onLockFailed)\n const onCheckTimeoutRef = useRef(options.onCheckTimeout)\n const onErrorRef = useRef(options.onError)\n useEffect(() => {\n onDepositAddressReceivedRef.current = options.onDepositAddressReceived\n onDepositSuccessRef.current = options.onDepositSuccess\n onCreditedRef.current = options.onCredited\n onLockSubmittedRef.current = options.onLockSubmitted\n onLockFailedRef.current = options.onLockFailed\n onCheckTimeoutRef.current = options.onCheckTimeout\n onErrorRef.current = options.onError\n }, [\n options.onDepositAddressReceived,\n options.onDepositSuccess,\n options.onCredited,\n options.onLockSubmitted,\n options.onLockFailed,\n options.onCheckTimeout,\n options.onError,\n ])\n\n // Signed lock waiting for the deposit to credit. Mirrors the persisted copy\n // so a resumed session can still submit it.\n const pendingLockRef = useRef<LockFundsRequest | null>(null)\n\n // The deposit is credited either way; only the lock half can fail here, so\n // route failures to the dedicated callback (or onError as fallback) instead\n // of the deposit error state.\n const submitPendingLockAfterCredit = useCallback(\n async (signedLock: LockFundsRequest, creditedAmount: bigint) => {\n try {\n const result = await submitPendingLock({\n client,\n payload: signedLock,\n creditedAmount,\n })\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onLockSubmittedRef.current?.(result)\n } catch (err) {\n const error =\n err instanceof PostDepositLockError\n ? err\n : new PostDepositLockError(\n err instanceof Error ? err.message : 'Lock submission failed',\n 'submission-failed',\n BigInt(signedLock.amount),\n creditedAmount,\n { cause: err }\n )\n ;(onLockFailedRef.current ?? onErrorRef.current)?.(error)\n }\n },\n [client, queryClient]\n )\n\n const {\n isVerifying,\n didTimeout,\n verificationFailed: innerVerificationFailed,\n error: verificationError,\n verify,\n reset: resetVerification,\n } = useDepositVerification({\n pollInterval: options.pollInterval,\n pollTimeout: options.pollTimeout,\n onCredited: (hash, response, creditedAmount) => {\n verificationContextRef.current = null\n const signedLock = pendingLockRef.current\n pendingLockRef.current = null\n // Kick off the lock submission before the host callback: a throwing\n // onCredited must not be able to strand the signed lock. Keep the\n // persisted record (it carries the signed lock) until the attempt\n // settles, so a tab close mid-submission can retry next session.\n // At-least-once edge: if the tab dies after the API accepted the lock\n // but before the response arrived, the retry re-submits a consumed\n // nonce and surfaces as a (fund-safe) spurious 'lock failed' — the\n // client cannot distinguish that from a submission that never landed.\n if (signedLock) {\n void submitPendingLockAfterCredit(signedLock, creditedAmount).finally(() => {\n if (address) clearPendingDeposit(address, hash)\n })\n } else if (address) {\n clearPendingDeposit(address)\n }\n onCreditedRef.current?.(hash, response, signedLock !== null)\n },\n onCheckTimeout: (hash) => {\n onCheckTimeoutRef.current?.(hash)\n },\n onError: (err) => {\n onErrorRef.current?.(err)\n },\n })\n\n const addressMutation = useMutation({\n mutationFn: async () => {\n if (!address) throw new Error('No wallet connected')\n return executePrivateRead((readClient) => readClient.getDepositAddress())\n },\n onSuccess: (data) => {\n setDepositAddress(data)\n onDepositAddressReceivedRef.current?.(data)\n },\n onError: (error) => {\n onErrorRef.current?.(error as Error)\n },\n })\n\n const {\n writeContractAsync,\n isPending: isWritingContract,\n error: writeError,\n reset: resetWriteContract,\n } = useWriteContract()\n\n const {\n sendTransactionAsync,\n isPending: isSendingNative,\n error: sendNativeError,\n reset: resetSendTransaction,\n } = useSendTransaction()\n\n const isSendingTx = isWritingContract || isSendingNative\n const sendError = writeError ?? sendNativeError\n\n const { ensureCorrectChain } = useEnsureCorrectChain()\n\n const invalidateGeneration = useCallback(() => {\n generationRef.current++\n }, [])\n\n // Cleanup in-flight async work on unmount.\n useEffect(() => {\n return () => {\n invalidateGeneration()\n }\n }, [invalidateGeneration])\n\n const resumedAddressRef = useRef<string | undefined>(undefined)\n\n const reset = useCallback(() => {\n generationRef.current++\n resetVerification()\n if (address) clearPendingDeposit(address)\n verificationContextRef.current = null\n pendingLockRef.current = null\n setDepositAddress(null)\n setTxHash(undefined)\n setIsSwitchingChain(false)\n setIsWaitingForConfirmation(false)\n setReceiptFailed(false)\n setDepositError(null)\n addressMutation.reset()\n resetWriteContract()\n resetSendTransaction()\n }, [address, addressMutation, resetWriteContract, resetSendTransaction, resetVerification])\n\n // Resume a persisted deposit on mount\n useEffect(() => {\n if (!address || resumedAddressRef.current === address) return\n const persisted = loadPendingDeposit(address)\n if (!persisted) return\n resumedAddressRef.current = address\n\n const hash = persisted.txHash as `0x${string}`\n setTxHash(hash)\n setDepositAddress(persisted.depositAddress)\n setIsWaitingForConfirmation(true)\n pendingLockRef.current = persisted.signedLock ?? null\n const ctx: VerificationContext = {\n hash,\n chainId: persisted.chainId,\n amount: BigInt(persisted.amount),\n }\n verificationContextRef.current = ctx\n\n const generation = ++generationRef.current\n const isStale = () => generation !== generationRef.current\n\n ;(async () => {\n try {\n // Try a one-shot receipt fetch first. Resumed deposits were submitted\n // in a previous session, so the transaction is almost certainly mined\n // already. getTransactionReceipt avoids the subscription-based polling\n // of waitForTransactionReceipt, which can hang if the wagmi transport\n // isn't fully initialised yet on mount.\n let confirmed = false\n try {\n const receipt = await getTransactionReceipt(config, {\n hash,\n chainId: persisted.chainId,\n })\n // A receipt exists from the first block, so accepting it alone would\n // confirm a resumed deposit at 1 block where a live one waits 15.\n const blockNumber = await getBlockNumber(config, { chainId: persisted.chainId })\n confirmed = blockNumber - receipt.blockNumber + 1n >= BigInt(confirmations)\n } catch {\n // Receipt not available yet — fall back to polling\n }\n if (!confirmed) {\n await waitForTransactionReceipt(config, {\n hash,\n chainId: persisted.chainId,\n confirmations,\n })\n }\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n onDepositSuccessRef.current?.(hash)\n queryClient.invalidateQueries({ queryKey: ['readContract'] })\n await verify(ctx)\n } catch (err) {\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n setDepositError(error)\n setReceiptFailed(true)\n onErrorRef.current?.(error)\n }\n })()\n }, [address, config, confirmations, queryClient, verify])\n\n const deposit = useCallback(\n async (params: DepositParams) => {\n // Guard: a prior deposit already sent funds on-chain and is waiting on\n // verification. Starting a new flow here would issue a second transfer.\n if (verificationContextRef.current) {\n throw new Error(\n 'A deposit is pending verification. Call retryVerification() or reset() first.'\n )\n }\n\n // Clear state from any previous deposit attempt\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('No wallet connected')\n\n // Resolve token and source chain before anything else\n const token = enabledTokens.find((t) => t.id.toLowerCase() === params.tokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token ID: ${params.tokenId}`)\n const sourceChain = getChainById(token.chainId)\n if (!sourceChain) throw new Error(`Chain ${token.chainId} not configured`)\n\n // 1. Get deposit address\n const addrResponse = await addressMutation.mutateAsync()\n if (isStale()) return\n\n // 2. Validate deposit address\n const depositAddr = addrResponse.deposit_address\n if (!depositAddr || depositAddr === zeroAddress) {\n throw new Error('Invalid deposit address received from API')\n }\n\n // 3. Validate amount against the backend minimum. Below this the\n // deposit processor refuses to credit and funds would be stranded\n // at the per-user deposit address.\n const isNative = token.contract === zeroAddress\n const minsForChain = addrResponse.min_deposit?.[String(sourceChain.id)]\n const minAmountStr = isNative ? minsForChain?.native : minsForChain?.erc20\n if (minAmountStr && params.amount < BigInt(minAmountStr)) {\n throw new Error(\n `Amount is below the minimum deposit (${minAmountStr}) for ${isNative ? 'native' : 'ERC-20'} on chain ${sourceChain.id}`\n )\n }\n\n if (params.postDepositLock && !canUseBrowserStorage()) {\n throw new Error('Browser storage is required for locked deposit recovery')\n }\n // 4. Sign the exact-amount Lock before any funds move, so the transfer\n // never proceeds without a submittable lock payload in hand. The Lock\n // domain lives on the Accounting chain and wallets reject typed data\n // whose domain chainId differs from the active chain, so switch there\n // before signing.\n const lockAmount = clampLockAmount(params.amount, params.postDepositLock?.maxAmount)\n let signedLock: LockFundsRequest | undefined\n if (params.postDepositLock) {\n const lockOwner = requireDepositLockOwner(address, privateReadAddress)\n setIsSwitchingChain(true)\n try {\n await ensureCorrectChain(networkConfig.chainId)\n } finally {\n if (!isStale()) setIsSwitchingChain(false)\n }\n if (isStale()) return\n // Re-fetch the wallet client bound to the signing chain: the\n // render-time client can go stale across the chain switch above and\n // wagmi then rejects the signature with a chain mismatch.\n const signingWalletClient = await getWalletClient(config, {\n chainId: networkConfig.chainId,\n })\n signedLock = await createSignedLockRequest({\n client,\n walletClient: signingWalletClient,\n userAddress: lockOwner,\n networkConfig,\n serviceAddress: requireServiceAddress(\n params.postDepositLock.serviceAddress ?? serviceAddress\n ),\n tokenId: params.tokenId,\n amount: lockAmount,\n lockDuration: params.postDepositLock.lockDuration,\n })\n if (privateReadAddressRef.current?.toLowerCase() !== lockOwner.toLowerCase()) {\n throw new Error('Authenticated deposit account changed while signing')\n }\n }\n if (isStale()) return\n\n // 5. Switch to the source chain and send the transfer to the deposit\n // address (native or ERC-20)\n setIsSwitchingChain(true)\n try {\n await ensureCorrectChain(sourceChain.id)\n } finally {\n if (!isStale()) setIsSwitchingChain(false)\n }\n if (isStale()) return\n const hash =\n token.contract === zeroAddress\n ? await sendTransactionAsync({\n to: depositAddr,\n value: params.amount,\n chainId: sourceChain.id,\n })\n : await writeContractAsync({\n address: token.contract,\n abi: erc20Abi,\n functionName: 'transfer',\n args: [depositAddr, params.amount],\n chainId: sourceChain.id,\n })\n if (isStale()) return\n setTxHash(hash)\n\n // Past this point the wallet has already dispatched the transfer, so any\n // subsequent failure must preserve the hash and route to a retry state\n // rather than appearing terminal.\n const ctx: VerificationContext = {\n hash,\n chainId: sourceChain.id,\n amount: params.amount,\n }\n verificationContextRef.current = ctx\n pendingLockRef.current = signedLock ?? null\n try {\n savePendingDeposit(address, {\n txHash: hash,\n chainId: sourceChain.id,\n amount: params.amount.toString(),\n depositAddress: addrResponse,\n signedLock,\n savedAt: Date.now(),\n })\n } catch (err) {\n console.warn('Failed to persist pending deposit after transfer broadcast:', err)\n }\n\n try {\n // 6. Wait for on-chain confirmation\n setIsWaitingForConfirmation(true)\n try {\n await waitForTransactionReceipt(config, {\n hash,\n chainId: sourceChain.id,\n confirmations,\n })\n } finally {\n if (!isStale()) setIsWaitingForConfirmation(false)\n }\n if (isStale()) return\n\n onDepositSuccessRef.current?.(hash)\n\n // Invalidate wagmi wallet balance queries since tokens have left the wallet\n queryClient.invalidateQueries({ queryKey: ['readContract'] })\n\n // 6-7. Verification (phase 1 + phase 2) delegated to useDepositVerification\n await verify(ctx)\n } catch (err) {\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n setDepositError(error)\n setReceiptFailed(true)\n onErrorRef.current?.(error)\n }\n } catch (err) {\n if (isStale()) return\n const error = err instanceof Error ? err : new Error('Deposit failed')\n // Pre-transfer failure: nothing left the wallet, safe to surface\n // as a terminal error. Post-transfer failures are handled in the\n // inner catch above and never reach here.\n setDepositError(error)\n onErrorRef.current?.(error)\n }\n },\n [\n address,\n walletClient,\n addressMutation,\n client,\n getChainById,\n config,\n confirmations,\n enabledTokens,\n ensureCorrectChain,\n networkConfig,\n privateReadAddress,\n queryClient,\n serviceAddress,\n writeContractAsync,\n sendTransactionAsync,\n reset,\n verify,\n ]\n )\n\n // Wrap the inner hook's retry so it works after a wallet/receipt-phase failure\n // too. We keep our own ctx set the moment the on-chain transfer is dispatched,\n // before waitForTransactionReceipt — the inner hook only knows about\n // contexts that reached verify(). Also clear receipt-phase failure state so a\n // retry isn't surfaced as \"failed and verifying\" simultaneously.\n const retryVerification = useCallback(async (): Promise<void> => {\n const ctx = verificationContextRef.current\n if (!ctx) {\n throw new Error('No pending deposit to verify')\n }\n setReceiptFailed(false)\n setDepositError(null)\n await verify(ctx)\n }, [verify])\n\n const isPending =\n addressMutation.isPending ||\n isSwitchingChain ||\n isSendingTx ||\n isWaitingForConfirmation ||\n isVerifying\n\n const error = addressMutation.error || sendError || depositError || verificationError\n\n return {\n depositAddress,\n txHash,\n isGettingAddress: addressMutation.isPending,\n isSwitchingChain,\n isSendingTransaction: isSendingTx,\n isWaitingForConfirmation,\n isWaitingForProcessing: isVerifying,\n didTimeout,\n verificationFailed: innerVerificationFailed || receiptFailed,\n isPending,\n error: error as Error | null,\n deposit,\n retryVerification,\n reset,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport type { DepositAddressResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseDepositAddressOptions {\n enabled?: boolean\n}\n\nexport interface UseDepositAddressResult {\n response?: DepositAddressResponse\n depositAddress: string | null\n isReady: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\n/**\n * Fetches the user's Privana deposit address via the SIWE private-read flow\n * (`POST /v1/accounting/deposits/address`) — the same authenticated path used\n * by `useFiatOnRamp`. Used by the external-wallet deposit view to show a QR\n * code / copyable address to send funds to.\n */\nexport function useDepositAddress(options: UseDepositAddressOptions = {}): UseDepositAddressResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n const isReady = hasProviders && privateReadReady && !!privateReadAddress && !!client\n\n const query = useQuery<DepositAddressResponse, Error>({\n queryKey: ['accounting-deposit-address', ...privateReadQueryScope],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!client) throw new Error('No accounting client')\n return executePrivateRead((readClient) => readClient.getDepositAddress())\n },\n enabled: isReady && (options.enabled ?? true),\n })\n\n return {\n response: query.data,\n depositAddress: query.data?.deposit_address ?? null,\n isReady,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { signWithdrawMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseWithdrawOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is submitted to the backend */\n onSubmitSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is fully processed (broadcast to destination chain) */\n onProcessingSuccess?: () => void\n /** Called when processing times out - withdrawal may still be processing */\n onProcessingTimeout?: () => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking withdrawal status (default: 3000) */\n pollInterval?: number\n /** Max time to wait for withdrawal to be processed in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n}\n\nexport interface WithdrawParams {\n tokenId: Bytes32\n amount: bigint\n}\n\nexport type WithdrawStep = 'idle' | 'switching-chain' | 'signing' | 'submitting' | 'processing'\n\nexport interface UseWithdrawResult {\n withdraw: (params: WithdrawParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n currentStep: WithdrawStep\n /** True if processing timed out (withdrawal may still be processing in background) */\n didTimeout: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useWithdraw(options: UseWithdrawOptions = {}): UseWithdrawResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n const { chainId, ensureCorrectChain } = useEnsureCorrectChain()\n\n const pollInterval = options.pollInterval ?? 3000\n const pollTimeout = options.pollTimeout ?? 180000\n\n const [currentStep, setCurrentStep] = useState<WithdrawStep>('idle')\n const [didTimeout, setDidTimeout] = useState(false)\n const [isSuccess, setIsSuccess] = useState(false)\n const [withdrawError, setWithdrawError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running withdraw flow\n const onSubmitSuccessRef = useRef(options.onSubmitSuccess)\n const onProcessingSuccessRef = useRef(options.onProcessingSuccess)\n const onProcessingTimeoutRef = useRef(options.onProcessingTimeout)\n const onSuccessRef = useRef(options.onSuccess)\n const onErrorRef = useRef(options.onError)\n\n useEffect(() => {\n onSubmitSuccessRef.current = options.onSubmitSuccess\n onProcessingSuccessRef.current = options.onProcessingSuccess\n onProcessingTimeoutRef.current = options.onProcessingTimeout\n onSuccessRef.current = options.onSuccess\n onErrorRef.current = options.onError\n }, [\n options.onSubmitSuccess,\n options.onProcessingSuccess,\n options.onProcessingTimeout,\n options.onSuccess,\n options.onError,\n ])\n\n const { chainId: signingChainId } = networkConfig\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n }\n }\n }, [])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(false)\n setIsSuccess(false)\n setWithdrawError(null)\n }, [stopPolling])\n\n const withdraw = useCallback(\n async (params: WithdrawParams): Promise<TransactionSubmissionResponse | undefined> => {\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('Wallet not connected')\n\n // Snapshot pending withdrawal indices so we can detect the new one after submission\n const pendingResponse = await client.getPendingWithdrawals(address)\n if (isStale()) return undefined\n const knownIndices = new Set(pendingResponse.pending_withdrawals.map((w) => w.index))\n\n // 1. Switch to signing chain\n if (chainId !== signingChainId) {\n setCurrentStep('switching-chain')\n }\n await ensureCorrectChain(signingChainId)\n if (isStale()) return undefined\n\n // 2. Fetch nonce from API (direct Sapphire contract reads revert without encrypted calldata)\n const nonceResponse = await client.getWithdrawalNonce(address)\n if (isStale()) return undefined\n const nonce = BigInt(nonceResponse.nonce)\n\n // 3. Sign EIP-712 message\n setCurrentStep('signing')\n const signature = await signWithdrawMessage({\n walletClient,\n chainId: signingChainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n tokenId: params.tokenId,\n amount: params.amount,\n nonce,\n },\n })\n if (isStale()) return undefined\n\n // 4. Submit to API\n setCurrentStep('submitting')\n const submissionResponse = await client.requestWithdrawal({\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n if (isStale()) return submissionResponse\n\n onSubmitSuccessRef.current?.(submissionResponse)\n onSuccessRef.current?.(submissionResponse)\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n\n // 5. Poll for withdrawal completion\n setCurrentStep('processing')\n const pollStartTime = Date.now()\n let withdrawalIndex: number | null = null\n let consecutiveFailures = 0\n\n const handleSuccess = () => {\n stopPolling()\n setCurrentStep('idle')\n setIsSuccess(true)\n onProcessingSuccessRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const handleTimeout = () => {\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(true)\n onProcessingTimeoutRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const checkWithdrawalStatus = async (): Promise<boolean> => {\n if (isStale()) return true\n\n if (Date.now() - pollStartTime > pollTimeout) {\n handleTimeout()\n return true\n }\n\n try {\n if (withdrawalIndex !== null) {\n const info = await client.getWithdrawalInfo(withdrawalIndex)\n if (isStale()) return true\n consecutiveFailures = 0\n if (info.resolved) {\n handleSuccess()\n return true\n }\n return false\n }\n\n // Find our new withdrawal in the pending list by matching against the\n // pre-submission snapshot. This avoids sequential index scanning.\n const pending = await client.getPendingWithdrawals(address)\n if (isStale()) return true\n consecutiveFailures = 0\n const match = pending.pending_withdrawals.find(\n (w) =>\n !knownIndices.has(w.index) &&\n w.user_address.toLowerCase() === address.toLowerCase() &&\n w.token_id.toLowerCase() === params.tokenId.toLowerCase() &&\n w.amount === String(params.amount)\n )\n\n if (match) {\n withdrawalIndex = match.index\n if (match.resolved) {\n handleSuccess()\n return true\n }\n }\n } catch (err) {\n if (isStale()) return true\n consecutiveFailures++\n console.warn('Error polling withdrawal status:', err)\n if (consecutiveFailures >= 3) {\n handleTimeout()\n return true\n }\n }\n return false\n }\n\n const pollLoop = async () => {\n const done = await checkWithdrawalStatus()\n if (!done && !isStale() && pollIntervalRef.current !== null) {\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n }\n }\n pollIntervalRef.current = setTimeout(pollLoop, 0)\n\n return submissionResponse\n } catch (err) {\n if (isStale()) return undefined\n const error = err instanceof Error ? err : new Error('Withdrawal failed')\n setCurrentStep('idle')\n setWithdrawError(error)\n onErrorRef.current?.(error)\n return undefined\n }\n },\n [\n address,\n walletClient,\n client,\n chainId,\n signingChainId,\n networkConfig.accountingContract,\n ensureCorrectChain,\n pollInterval,\n pollTimeout,\n queryClient,\n stopPolling,\n reset,\n ]\n )\n\n const isPending = currentStep !== 'idle'\n\n return {\n withdraw,\n isPending,\n isSuccess,\n currentStep,\n didTimeout,\n error: withdrawError,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signLockMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseLockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface LockFundsParams {\n tokenId: Bytes32\n amount: bigint\n expiry: bigint\n}\n\nexport interface UseLockFundsResult {\n lockFunds: (params: LockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useLockFunds(options: UseLockFundsOptions = {}): UseLockFundsResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: LockFundsParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getLockNonce(address)\n\n const signature = await signLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n serviceAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n expiry: params.expiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.lockFunds({\n service_address: serviceAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n expiry: params.expiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const lockFunds = useCallback(\n async (params: LockFundsParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n lockFunds,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseUnlockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface UnlockFundsParams {\n lockId: number\n}\n\nexport interface UseUnlockFundsResult {\n unlockFunds: (params: UnlockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n unlockAllExpired: () => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useUnlockFunds(options: UseUnlockFundsOptions = {}): UseUnlockFundsResult {\n const { address } = useAccount()\n const { client } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const unlockMutation = useMutation({\n mutationFn: async (params: UnlockFundsParams) => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockFunds({\n user_address: address,\n lock_id: params.lockId,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockAllMutation = useMutation({\n mutationFn: async () => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockAllExpired({\n user_address: address,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockFunds = useCallback(\n async (params: UnlockFundsParams) => {\n return unlockMutation.mutateAsync(params)\n },\n [unlockMutation]\n )\n\n const unlockAllExpired = useCallback(async () => {\n return unlockAllMutation.mutateAsync()\n }, [unlockAllMutation])\n\n const reset = useCallback(() => {\n unlockMutation.reset()\n unlockAllMutation.reset()\n }, [unlockMutation, unlockAllMutation])\n\n return {\n unlockFunds,\n unlockAllExpired,\n isPending: unlockMutation.isPending || unlockAllMutation.isPending,\n isSuccess: unlockMutation.isSuccess || unlockAllMutation.isSuccess,\n error: (unlockMutation.error || unlockAllMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signTransferMessage, signTransferLockedMessage } from '../signatures'\nimport type { Bytes32, Address, TransactionSubmissionResponse } from '../types'\n\nexport interface UseTransferOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface TransferParams {\n toAddress: Address\n tokenId: Bytes32\n amount: bigint\n}\n\nexport interface TransferLockedParams {\n lockId: number\n toAddress: Address\n amount: bigint\n}\n\nexport interface UseTransferResult {\n transfer: (params: TransferParams) => Promise<TransactionSubmissionResponse | undefined>\n transferLocked: (\n params: TransferLockedParams\n ) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useTransfer(options: UseTransferOptions = {}): UseTransferResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const transferMutation = useMutation({\n mutationFn: async (params: TransferParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getTransferNonce(address)\n\n const signature = await signTransferMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n toAddress: params.toAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n nonce: BigInt(nonce),\n },\n })\n\n return client.transferFunds({\n to_address: params.toAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transferLockedMutation = useMutation({\n mutationFn: async (params: TransferLockedParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getTransferLockedNonce(serviceAddress)\n\n const signature = await signTransferLockedMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n userAddress: address,\n toAddress: params.toAddress,\n lockId: BigInt(params.lockId),\n amount: params.amount,\n nonce: BigInt(nonce),\n serviceAddress,\n },\n })\n\n return client.transferLockedFunds({\n user_address: address,\n lock_id: params.lockId,\n to_address: params.toAddress,\n amount: params.amount.toString(),\n service_address: serviceAddress,\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transfer = useCallback(\n async (params: TransferParams) => {\n return transferMutation.mutateAsync(params)\n },\n [transferMutation]\n )\n\n const transferLocked = useCallback(\n async (params: TransferLockedParams) => {\n return transferLockedMutation.mutateAsync(params)\n },\n [transferLockedMutation]\n )\n\n const reset = useCallback(() => {\n transferMutation.reset()\n transferLockedMutation.reset()\n }, [transferMutation, transferLockedMutation])\n\n return {\n transfer,\n transferLocked,\n isPending: transferMutation.isPending || transferLockedMutation.isPending,\n isSuccess: transferMutation.isSuccess || transferLockedMutation.isSuccess,\n error: (transferMutation.error || transferLockedMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, LockedFundsResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseLockedFundsOptions {\n enabled?: boolean\n}\n\nexport interface UseLockedFundsResult {\n locks: LockInfo[]\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useLockedFunds(options: UseLockedFundsOptions = {}): UseLockedFundsResult {\n const { client, pollingInterval, serviceAddress } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<LockedFundsResponse, Error>({\n queryKey: ['accounting-locked-funds', ...privateReadQueryScope, serviceAddress ?? null],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead((readClient) => readClient.getLockedFunds(serviceAddress))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n locks: query.data?.locks ?? [],\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TotalLockedBalanceResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseTotalLockedBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseTotalLockedBalanceResult {\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTotalLockedBalance(\n options: UseTotalLockedBalanceOptions = {}\n): UseTotalLockedBalanceResult {\n const { client, pollingInterval, defaultToken } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<TotalLockedBalanceResponse, Error>({\n queryKey: ['accounting-total-locked-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n return executePrivateRead((readClient) => readClient.getTotalLockedBalance(tokenId))\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, ExpiredLocksResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseExpiredLocksOptions {\n enabled?: boolean\n}\n\nexport interface UseExpiredLocksResult {\n expiredLocks: LockInfo[]\n hasExpiredLocks: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useExpiredLocks(options: UseExpiredLocksOptions = {}): UseExpiredLocksResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<ExpiredLocksResponse, Error>({\n queryKey: ['accounting-expired-locks', ...privateReadQueryScope],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead((readClient) => readClient.getExpiredLocks())\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n })\n\n const expiredLocks = query.data?.expired_locks ?? []\n\n return {\n expiredLocks,\n hasExpiredLocks: expiredLocks.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport { AccountingApiError } from '../client/errors'\nimport type { Address, PendingDeposit, PendingDepositsResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UsePendingDepositsOptions {\n /** Source chain to scan. Query is disabled while undefined. */\n chainId?: number\n enabled?: boolean\n /** Auto-poll cadence in ms, or false for manual refetch only (default: 30s, the server scan-cache TTL). */\n refetchInterval?: number | false\n /** Narrow the scan to one registered ERC20. */\n tokenAddress?: Address\n /** Scan window in blocks (server default ≈ 1h, clamped ≈ 24h). */\n lookbackBlocks?: number\n}\n\nexport interface UsePendingDepositsResult {\n pending: PendingDeposit[]\n scannedToBlock: number | undefined\n isFetching: boolean\n isError: boolean\n error: Error | null\n isRateLimited: boolean\n /** Discovery is not configured for this chain server-side (503) — a deployment fault, not transient. */\n isUnavailable: boolean\n refetch: () => Promise<PendingDepositsResponse | undefined>\n}\n\nfunction statusCodeOf(error: unknown): number | undefined {\n return error instanceof AccountingApiError ? error.statusCode : undefined\n}\n\nexport function usePendingDeposits(\n options: UsePendingDepositsOptions = {}\n): UsePendingDepositsResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const { chainId, tokenAddress, lookbackBlocks } = options\n\n const query = useQuery<PendingDepositsResponse, Error>({\n queryKey: ['accounting-pending-deposits', ...privateReadQueryScope, chainId, tokenAddress],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!chainId) throw new Error('No chain ID provided')\n if (!client) throw new Error('No accounting client')\n try {\n return await executePrivateRead((readClient) =>\n readClient.getPendingDeposits({\n chain_id: chainId,\n token_address: tokenAddress,\n lookback_blocks: lookbackBlocks,\n })\n )\n } catch (error: unknown) {\n if (statusCodeOf(error) === 404) {\n return { pending: [], scanned_from_block: 0, scanned_to_block: 0 }\n }\n throw error\n }\n },\n enabled:\n hasProviders &&\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!chainId &&\n !!client,\n // A 503 means discovery is not configured for this chain server-side —\n // polling can't fix that, so stop until a manual refetch succeeds.\n refetchInterval: (query) =>\n statusCodeOf(query.state.error) === 503 ? false : (options.refetchInterval ?? 30_000),\n staleTime: 25_000,\n retry: (failureCount, error) => {\n const status = statusCodeOf(error)\n if (status === 429 || status === 404 || status === 503) return false\n return failureCount < 2\n },\n })\n\n return {\n pending: query.data?.pending ?? [],\n scannedToBlock: query.data?.scanned_to_block,\n isFetching: query.isFetching,\n isError: query.isError,\n error: query.error,\n isRateLimited: statusCodeOf(query.error) === 429,\n isUnavailable: statusCodeOf(query.error) === 503,\n refetch: async () => (await query.refetch()).data,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { WithdrawalInfo, PendingWithdrawalsResponse } from '../types'\n\nexport interface UsePendingWithdrawalsOptions {\n enabled?: boolean\n}\n\nexport interface UsePendingWithdrawalsResult {\n withdrawals: WithdrawalInfo[]\n hasPendingWithdrawals: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function usePendingWithdrawals(\n options: UsePendingWithdrawalsOptions = {}\n): UsePendingWithdrawalsResult {\n const { address, isConnected } = useAccount()\n const { client, pollingInterval } = usePrivanaContext()\n\n const query = useQuery<PendingWithdrawalsResponse, Error>({\n queryKey: ['accounting-pending-withdrawals', address],\n queryFn: async (): Promise<PendingWithdrawalsResponse> => {\n if (!address) throw new Error('No wallet connected')\n try {\n return await client.getPendingWithdrawals(address)\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'statusCode' in error &&\n error.statusCode === 404\n ) {\n return { user_address: address, pending_withdrawals: [] }\n }\n throw error\n }\n },\n enabled: (options.enabled ?? true) && isConnected && !!address,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n retry: (failureCount, error) => {\n if (error && typeof error === 'object' && 'statusCode' in error && error.statusCode === 404) {\n return false\n }\n return failureCount < 3\n },\n })\n\n const withdrawals = query.data?.pending_withdrawals ?? []\n\n return {\n withdrawals,\n hasPendingWithdrawals: withdrawals.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { HistoryEntry, HistoryResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseHistoryOptions {\n offset?: number\n limit?: number\n enabled?: boolean\n}\n\nexport interface UseHistoryResult {\n history: HistoryEntry[]\n total: number\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useHistory(options: UseHistoryOptions = {}): UseHistoryResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const offset = options.offset ?? -1\n const limit = options.limit ?? 50\n\n const query = useQuery<HistoryResponse, Error>({\n queryKey: ['accounting-history', ...privateReadQueryScope, offset, limit],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead((readClient) => readClient.getHistory({ offset, limit }))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n history: query.data?.history ?? [],\n total: query.data?.total ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TokenInfoResponse } from '../types'\n\nexport interface UseTokenInfoOptions {\n tokenId?: Bytes32 | string\n enabled?: boolean\n}\n\nexport interface UseTokenInfoResult {\n data: TokenInfoResponse | undefined\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenInfo(options: UseTokenInfoOptions = {}): UseTokenInfoResult {\n const { client } = usePrivanaContext()\n const { tokenId } = options\n\n const query = useQuery<TokenInfoResponse, Error>({\n queryKey: ['accounting-token-info', tokenId],\n queryFn: () => {\n if (!tokenId) throw new Error('No token ID provided')\n return client.getTokenInfo(tokenId)\n },\n enabled: (options.enabled ?? true) && !!tokenId && !!client,\n staleTime: Infinity,\n })\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TokenInfoResponse, TokenListResponse } from '../types'\n\nexport interface UseTokenListOptions {\n enabled?: boolean\n}\n\nexport interface UseTokenListResult {\n tokens: TokenInfoResponse[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenList(options: UseTokenListOptions = {}): UseTokenListResult {\n const { client } = usePrivanaContext()\n\n const query = useQuery<TokenListResponse, Error>({\n queryKey: ['accounting-token-list'],\n queryFn: () => client.listTokens(),\n enabled: (options.enabled ?? true) && !!client,\n staleTime: Infinity,\n })\n\n return {\n tokens: query.data?.tokens ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signModifyLockMessage } from '../signatures'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseModifyLockOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface ModifyLockParams {\n lockId: number\n amount: bigint\n newExpiry: bigint\n}\n\nexport interface UseModifyLockResult {\n modifyLock: (params: ModifyLockParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useModifyLock(options: UseModifyLockOptions = {}): UseModifyLockResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: ModifyLockParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getModifyLockNonce(address)\n\n const signature = await signModifyLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n lockId: BigInt(params.lockId),\n amount: params.amount,\n newExpiry: params.newExpiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.modifyLock({\n lock_id: params.lockId,\n amount: params.amount.toString(),\n new_expiry: params.newExpiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const modifyLock = useCallback(\n async (params: ModifyLockParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n modifyLock,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n data-privana\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n overlayClassName?: string\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay className={overlayClassName} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n data-privana\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"text-muted-foreground hover:text-foreground absolute top-4 right-4 cursor-pointer rounded-xs transition-colors focus:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","'use client'\n\ninterface IconProps {\n className?: string\n size?: number\n}\n\nexport function USDCIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2000 2000\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M1000 2000c554.17 0 1000-445.83 1000-1000S1554.17 0 1000 0 0 445.83 0 1000s445.83 1000 1000 1000z\"\n fill=\"#2775ca\"\n />\n <path\n d=\"M1275 1158.33c0-145.83-87.5-195.83-262.5-216.66-125-16.67-150-50-150-108.34s41.67-95.83 125-95.83c75 0 116.67 25 137.5 87.5 4.17 12.5 16.67 20.83 29.17 20.83h66.66c16.67 0 29.17-12.5 29.17-29.16v-4.17c-16.67-91.67-91.67-162.5-187.5-170.83v-100c0-16.67-12.5-29.17-33.33-33.34h-62.5c-16.67 0-29.17 12.5-33.34 33.34v95.83c-125 16.67-204.16 100-204.16 204.17 0 137.5 83.33 191.66 258.33 212.5 116.67 20.83 154.17 45.83 154.17 112.5s-58.34 112.5-137.5 112.5c-108.34 0-145.84-45.84-158.34-108.34-4.16-16.66-16.66-25-29.16-25h-70.84c-16.66 0-29.16 12.5-29.16 29.17v4.17c16.66 104.16 83.33 179.16 220.83 200v100c0 16.66 12.5 29.16 33.33 33.33h62.5c16.67 0 29.17-12.5 33.34-33.33v-100c125-20.84 208.33-108.34 208.33-220.84z\"\n fill=\"#fff\"\n />\n <path\n d=\"M787.5 1595.83c-325-116.66-491.67-479.16-370.83-800 62.5-175 200-308.33 370.83-370.83 16.67-8.33 25-20.83 25-41.67V325c0-16.67-8.33-29.17-25-33.33-4.17 0-12.5 0-16.67 4.16-395.83 125-612.5 545.84-487.5 941.67 75 233.33 254.17 412.5 487.5 487.5 16.67 8.33 33.34 0 37.5-16.67 4.17-4.16 4.17-8.33 4.17-16.66v-58.34c0-12.5-12.5-29.16-25-37.5zM1229.17 295.83c-16.67-8.33-33.34 0-37.5 16.67-4.17 4.17-4.17 8.33-4.17 16.67v58.33c0 16.67 12.5 33.33 25 41.67 325 116.66 491.67 479.16 370.83 800-62.5 175-200 308.33-370.83 370.83-16.67 8.33-25 20.83-25 41.67V1700c0 16.67 8.33 29.17 25 33.33 4.17 0 12.5 0 16.67-4.16 395.83-125 612.5-545.84 487.5-941.67-75-237.5-258.34-416.67-487.5-491.67z\"\n fill=\"#fff\"\n />\n </svg>\n )\n}\n\nexport function BaseIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2500 2500\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"1250\" cy=\"1250\" r=\"1250\" fill=\"#0052FF\" />\n <path\n d=\"M1247.8,2500c691.6,0,1252.2-559.6,1252.2-1250C2500,559.6,1939.4,0,1247.8,0C591.7,0,53.5,503.8,0,1144.9h1655.1v210.2H0C53.5,1996.2,591.7,2500,1247.8,2500z\"\n fill=\"white\"\n />\n </svg>\n )\n}\n\nexport function WETHIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 250 250\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M0 125C0 55.9644 55.9644 0 125 0C194.036 0 250 55.9644 250 125C250 194.036 194.036 250 125 250C55.9644 250 0 194.036 0 125Z\"\n fill=\"#627EEA\"\n />\n <path\n d=\"M125.047 30.5V100.351L184.086 126.732L125.047 30.5Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 30.5L66 126.732L125.047 100.351V30.5Z\" fill=\"white\" />\n <path\n d=\"M125.047 172V219.462L184.125 137.728L125.047 172Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 219.462V171.992L66 137.728L125.047 219.462Z\" fill=\"white\" />\n <path\n d=\"M125.047 161.013L184.086 126.733L125.047 100.368V161.013Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n <path d=\"M66 126.733L125.047 161.013V100.368L66 126.733Z\" fill=\"white\" fillOpacity=\"0.602\" />\n </svg>\n )\n}\n\nexport function getTokenIcon(symbol: string, size?: number) {\n const iconSize = size ?? 24\n switch (symbol.toUpperCase()) {\n case 'USDC':\n return <USDCIcon size={iconSize} />\n case 'WETH':\n return <WETHIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n {symbol.slice(0, 2)}\n </div>\n )\n }\n}\n\nexport function getChainIcon(chainId: number, size?: number) {\n const iconSize = size ?? 24\n switch (chainId) {\n case 84532:\n return <BaseIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n ?\n </div>\n )\n }\n}\n","'use client'\n\nimport { cn } from '@/lib/utils'\n\nexport function CloseIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M11.99997 11.99997l-5.99995-5.99995-6.00002-6.00002m6.00002 6.00002l6.00001-6.00002m-12.00003 12.00003l6.00002-6.00001\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function ChevronRightIcon() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"-rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nexport function ChevronLeftIcon() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nexport function ChevronDownIcon({\n direction = 'down',\n className,\n}: {\n direction?: 'up' | 'right' | 'down'\n className?: string\n}) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn(\n 'transition-transform',\n direction === 'right' && '-rotate-90',\n direction === 'up' && 'rotate-180',\n className\n )}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function CopyIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nexport function CircleCheckIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 10l2.5 2.5L14 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function CircleXIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M7 7l6 6M13 7l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function ArrowRightIcon({ className }: { className?: string }) {\n return (\n <svg width=\"24\" height=\"8\" viewBox=\"0 0 24 8\" fill=\"none\" className={className}>\n <path\n d=\"M0 4h22m0 0l-4-4m4 4l-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","'use client'\n\nexport interface Step {\n label: string\n status: 'pending' | 'active' | 'completed'\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 6l2.5 2.5 4.5-4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M3.5 1.5h7v7M10.5 1.5L1.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function Spinner({ size = 20 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" className=\"animate-spin\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.15\" />\n <path d=\"M10 2a8 8 0 016.93 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\ninterface TransactionProgressViewProps {\n title: string\n steps: Step[]\n onCancel?: () => void\n}\n\nexport function TransactionProgressView({ title, steps, onCancel }: TransactionProgressViewProps) {\n const completed = steps.filter((s) => s.status === 'completed').length\n const active = steps.find((s) => s.status === 'active')\n const total = steps.length\n const progress = ((completed + (active ? 0.5 : 0)) / total) * 100\n\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-primary\">\n <Spinner size={20} />\n </div>\n <span className=\"text-foreground text-sm font-medium\">{active?.label ?? title}</span>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"bg-secondary h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full rounded-full transition-all duration-500\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs\">\n Step {Math.max(1, completed + (active ? 1 : 0))} of {total}\n </span>\n </div>\n\n {onCancel && (\n <button\n onClick={onCancel}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors\"\n >\n Cancel\n </button>\n )}\n </div>\n )\n}\n\ninterface TransactionSuccessViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onDone: () => void\n}\n\nexport function TransactionSuccessView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onDone,\n}: TransactionSuccessViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-400\">\n <CheckIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n <button\n onClick={onDone}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors\"\n >\n Done\n </button>\n </div>\n </div>\n )\n}\n\nfunction WarningIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M7 5v2.5M7 10h.005M6.13 2.5h1.74L13 11.5H1L6.13 2.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\ninterface TransactionWarningViewProps {\n title: string\n message: string\n onDone: () => void\n actionLabel?: string\n pendingLabel?: string\n isPending?: boolean\n onDismiss?: () => void\n dismissLabel?: string\n}\n\nexport function TransactionWarningView({\n title,\n message,\n onDone,\n actionLabel = 'Done',\n pendingLabel = actionLabel,\n isPending = false,\n onDismiss,\n dismissLabel = 'Dismiss',\n}: TransactionWarningViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n {onDismiss && (\n <button\n onClick={onDismiss}\n disabled={isPending}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {dismissLabel}\n </button>\n )}\n <button\n onClick={onDone}\n disabled={isPending}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isPending ? pendingLabel : actionLabel}\n </button>\n </div>\n </div>\n )\n}\n\ninterface TransactionErrorViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onRetry: () => void\n onDismiss?: () => void\n isRetrying?: boolean\n /** Label for the retry button. Defaults to \"Retry Verification\". */\n retryLabel?: string\n /** Label for the secondary button. Defaults to \"Close\". */\n dismissLabel?: string\n}\n\nexport function TransactionErrorView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onRetry,\n onDismiss,\n isRetrying,\n retryLabel = 'Retry Verification',\n dismissLabel = 'Close',\n}: TransactionErrorViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n\n <div className=\"flex gap-2\">\n {onDismiss && (\n <button\n onClick={onDismiss}\n disabled={isRetrying}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {dismissLabel}\n </button>\n )}\n <button\n onClick={onRetry}\n disabled={isRetrying}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isRetrying ? 'Retrying…' : retryLabel}\n </button>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount, useBalance, useReadContract } from 'wagmi'\nimport { useDeposit } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n TransactionErrorView,\n type Step,\n} from './transaction-steps'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\n\ninterface DepositFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n onUnsafeToCloseChange?: (isUnsafe: boolean) => void\n onSuccess?: () => void\n}\n\nexport function DepositForm({\n selectedToken,\n onTokenSelect,\n onPendingChange,\n onUnsafeToCloseChange,\n onSuccess,\n}: DepositFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n // Read balance from the token's chain directly (uses app RPC, not wallet chain).\n // This lets the form display correct balance without forcing a wallet switch;\n // the wallet switch happens on-demand inside deposit() via ensureCorrectChain.\n // Native and ERC-20 need different wagmi hooks (wagmi v2 dropped `token` from\n // useBalance), so we call both unconditionally and gate via `query.enabled`.\n const isNative = selectedToken.contract === zeroAddress\n const { data: nativeBalanceData } = useBalance({\n address,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && isNative,\n },\n })\n const { data: erc20Balance } = useReadContract({\n address: selectedToken.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && !isNative,\n },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedWalletBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), selectedToken.decimals)\n : '0.00'\n\n const handleMaxClick = () => {\n if (formattedWalletBalance && parseFloat(formattedWalletBalance) > 0) {\n setAmount(formattedWalletBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n walletBalance != null &&\n parseTokenAmount(amount, selectedToken.decimals) > walletBalance\n\n const {\n txHash,\n isGettingAddress,\n isSwitchingChain,\n isSendingTransaction,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n verificationFailed,\n isPending,\n error,\n deposit,\n retryVerification,\n reset,\n } = useDeposit({\n onCredited: () => {\n setAmount('')\n if (onSuccess) {\n reset()\n onSuccess()\n } else {\n setShowSuccess(true)\n }\n },\n onCheckTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const depositSteps: Step[] = [\n {\n label: 'Getting deposit address',\n status: isGettingAddress\n ? 'active'\n : isSwitchingChain ||\n isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: `Switching to ${targetChain?.name ?? 'deposit chain'}`,\n status: isSwitchingChain\n ? 'active'\n : isSendingTransaction || isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirm in wallet',\n status: isSendingTransaction\n ? 'active'\n : isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirming transaction',\n status: isWaitingForConfirmation\n ? 'active'\n : isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Verifying deposit — may take up to a few minutes',\n status: isWaitingForProcessing ? 'active' : 'pending',\n },\n ]\n\n useEffect(() => {\n // Post-transfer verification errors are surfaced via the dedicated\n // TransactionErrorView below, so skip the toast for those.\n if (error && !verificationFailed) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error, verificationFailed])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n useEffect(() => {\n onUnsafeToCloseChange?.((isGettingAddress || isSendingTransaction) && !cancelled)\n }, [isGettingAddress, isSendingTransaction, cancelled, onUnsafeToCloseChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleDismissVerificationError = () => {\n setAmount('')\n setCancelled(false)\n reset()\n }\n\n const handleRetryVerification = () => {\n retryVerification().catch(() => {\n // Errors are already surfaced via the hook's error state and onError callback.\n })\n }\n\n const explorerTxUrl =\n txHash && targetChain?.explorerUrl ? `${targetChain.explorerUrl}/tx/${txHash}` : undefined\n\n const handleSubmit = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await deposit({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n if (isSwitchingChain) return 'Switching…'\n return 'Deposit'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Deposit Successful\"\n message={`Your ${selectedToken.symbol} deposit has been processed.`}\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Deposit Processing\"\n message={`Your transaction was confirmed but the deposit is still being processed. Please check your balance - it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (verificationFailed) {\n const baseMessage =\n 'Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address. Retry verification instead of starting a new deposit.'\n const detail = error?.message\n const message = detail ? `${baseMessage} (${detail})` : baseMessage\n return (\n <TransactionErrorView\n title=\"Verification failed\"\n message={message}\n explorerUrl={explorerTxUrl}\n explorerLabel=\"View transaction\"\n onRetry={handleRetryVerification}\n onDismiss={handleDismissVerificationError}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is confirmed (during address fetch/wallet signing)\n const canCancel = isGettingAddress || isSendingTransaction\n return (\n <TransactionProgressView\n title=\"Depositing…\"\n steps={depositSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedWalletBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleSubmit}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount } from 'wagmi'\nimport { useWithdraw, useBalance } from '@/sdk/hooks'\nimport type { WithdrawStep } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n type Step,\n} from './transaction-steps'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { getExplorerAddressUrl, getExplorerLabel } from '@/sdk/types/chains'\n\ninterface WithdrawFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n onUnsafeToCloseChange?: (isUnsafe: boolean) => void\n}\n\nexport function WithdrawForm({\n selectedToken,\n onTokenSelect,\n onPendingChange,\n onUnsafeToCloseChange,\n}: WithdrawFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({\n tokenId: selectedToken.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n\n const { withdraw, isPending, currentStep, error, reset } = useWithdraw({\n onProcessingSuccess: () => {\n setAmount('')\n setShowSuccess(true)\n },\n onProcessingTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const explorerUrl =\n address && targetChain ? getExplorerAddressUrl(targetChain.id, address) : undefined\n\n const getStepStatus = (step: WithdrawStep, after: WithdrawStep[]): Step['status'] => {\n if (currentStep === step) return 'active'\n if (after.includes(currentStep)) return 'completed'\n return 'pending'\n }\n\n const withdrawSteps: Step[] = [\n {\n label: 'Switching to signing chain',\n status: getStepStatus('switching-chain', ['signing', 'submitting', 'processing']),\n },\n { label: 'Sign in wallet', status: getStepStatus('signing', ['submitting', 'processing']) },\n {\n label: 'Submitting withdrawal',\n status: getStepStatus('submitting', ['processing']),\n },\n {\n label: 'Processing — may take a minute or two',\n status: getStepStatus('processing', []),\n },\n ]\n\n useEffect(() => {\n if (error) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error])\n\n useEffect(() => {\n const pending = isPending && !cancelled\n onPendingChange?.(pending)\n onUnsafeToCloseChange?.(pending)\n }, [isPending, cancelled, onPendingChange, onUnsafeToCloseChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleWithdraw = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await withdraw({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const handleMaxClick = () => {\n if (formattedBalance && parseFloat(formattedBalance) > 0) {\n setAmount(formattedBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, selectedToken.decimals) > BigInt(balanceWei)\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n return 'Withdraw'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Withdrawal Complete\"\n message={`Your ${selectedToken.symbol} withdrawal has been processed. Funds should appear in your wallet shortly.`}\n explorerUrl={explorerUrl}\n explorerLabel={targetChain ? getExplorerLabel(targetChain.id) : undefined}\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Withdrawal Processing\"\n message={`Your withdrawal is still being processed. Please check your balance — it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is submitted (steps 1-2)\n const canCancel =\n currentStep === 'idle' || currentStep === 'switching-chain' || currentStep === 'signing'\n return (\n <TransactionProgressView\n title=\"Withdrawing...\"\n steps={withdrawSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleWithdraw}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useMemo, useEffect, useId } from 'react'\nimport { useAccount, useBalance as useWagmiBalance, useReadContract } from 'wagmi'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport { DepositForm } from './deposit-form'\nimport { WithdrawForm } from './withdraw-form'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance, useLockedFunds, useUnlockFunds } from '@/sdk/hooks'\nimport { formatTokenAmount, formatTimeRemaining, cn, shortenAddress } from '@/lib/utils'\nimport { getTokenIcon, getChainIcon } from './token-icons'\nimport { CloseIcon, ChevronRightIcon, ChevronLeftIcon, ChevronDownIcon } from './icons'\n\ntype ModalView = 'main' | 'locked-funds' | 'select-token' | 'balance-details'\n\nfunction BalanceCards({\n selectedToken,\n onLockedFundsClick,\n onBalanceClick,\n showLockedFunds = true,\n disabled,\n}: {\n selectedToken: TokenConfig\n onLockedFundsClick: () => void\n onBalanceClick: () => void\n showLockedFunds?: boolean\n disabled?: boolean\n}) {\n const { balanceWei, isLoading: balanceLoading } = useBalance({\n tokenId: selectedToken.id,\n })\n const { totalLocked, isLoading: lockedLoading } = useLockedFunds({ enabled: showLockedFunds })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n const formattedLocked = showLockedFunds\n ? formatTokenAmount(String(totalLocked), selectedToken.decimals)\n : '0.00'\n\n return (\n <div className={cn('flex gap-2', disabled && 'opacity-50')}>\n <button\n onClick={onBalanceClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Balance</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {balanceLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-24 animate-pulse rounded\" />\n ) : (\n formattedBalance\n )}\n </div>\n </button>\n\n {showLockedFunds && (\n <button\n onClick={onLockedFundsClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Locked Funds</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {lockedLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-20 animate-pulse rounded\" />\n ) : (\n formattedLocked\n )}\n </div>\n </button>\n )}\n </div>\n )\n}\n\nfunction Tabs({\n activeTab,\n onTabChange,\n disabled,\n}: {\n activeTab: 'deposit' | 'withdraw'\n onTabChange: (tab: 'deposit' | 'withdraw') => void\n disabled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'bg-muted relative flex gap-2 overflow-hidden rounded-[10px] p-1',\n disabled && 'opacity-50'\n )}\n >\n <div\n className={cn(\n 'bg-input absolute top-1 bottom-1 left-1 w-[calc(50%-8px)] rounded-md transition-transform duration-200',\n activeTab === 'withdraw' && 'translate-x-[calc(100%+8px)]'\n )}\n />\n <button\n onClick={() => !disabled && onTabChange('deposit')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'deposit' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Deposit\n </button>\n <button\n onClick={() => !disabled && onTabChange('withdraw')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'withdraw' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Withdraw\n </button>\n </div>\n )\n}\n\ninterface LockedFundsSection {\n title: string\n items: {\n lockId: number\n amount: string\n serviceAddress: string\n time: string\n isExpired: boolean\n }[]\n}\n\nfunction LockedFundsView({ onBack }: { onBack: () => void }) {\n const { getTokenById } = usePrivanaContext()\n const { locks, isLoading } = useLockedFunds()\n const { unlockFunds, unlockAllExpired, isPending } = useUnlockFunds()\n const [collapsedSections, setCollapsedSections] = useState<Record<string, boolean>>({})\n\n const sections = useMemo(() => {\n const sectionMap: Record<string, LockedFundsSection> = {}\n\n locks.forEach((lock) => {\n const serviceName = shortenAddress(lock.service_address)\n if (!sectionMap[lock.service_address]) {\n sectionMap[lock.service_address] = {\n title: `Service ${serviceName}`,\n items: [],\n }\n }\n sectionMap[lock.service_address].items.push({\n lockId: lock.lock_id,\n amount: formatTokenAmount(String(lock.amount), getTokenById(lock.token_id)?.decimals ?? 18),\n serviceAddress: lock.service_address,\n time: lock.is_expired ? 'Click to unlock' : formatTimeRemaining(lock.expiry),\n isExpired: lock.is_expired,\n })\n })\n\n return Object.values(sectionMap)\n }, [getTokenById, locks])\n\n const toggleSection = (title: string) => {\n setCollapsedSections((prev) => ({\n ...prev,\n [title]: !prev[title],\n }))\n }\n\n const expiredCount = locks.filter((l) => l.is_expired).length\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Locked Funds</span>\n </div>\n </div>\n\n <div className=\"bg-muted flex min-h-0 flex-1 flex-col rounded-[10px] p-2\">\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex flex-col gap-2 p-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex animate-pulse items-center gap-3 rounded-lg p-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex-1\">\n <div className=\"bg-secondary mb-2 h-3.5 w-24 rounded\" />\n <div className=\"bg-secondary h-3 w-32 rounded\" />\n </div>\n </div>\n ))}\n </div>\n ) : sections.length === 0 ? (\n <div className=\"flex items-center justify-center p-8\">\n <span className=\"text-muted-foreground text-sm\">No locked funds</span>\n </div>\n ) : (\n sections.map((section) => (\n <div key={section.title}>\n <button\n onClick={() => toggleSection(section.title)}\n className=\"text-muted-foreground hover:bg-secondary flex w-full cursor-pointer items-center justify-between rounded-lg px-4 py-4 transition-colors\"\n >\n <span className=\"text-sm\">{section.title}</span>\n <ChevronDownIcon\n direction={collapsedSections[section.title] ? 'right' : 'down'}\n />\n </button>\n\n {!collapsedSections[section.title] &&\n section.items.map((item) => (\n <div\n key={`${item.serviceAddress}-${item.lockId}`}\n className={cn(\n 'flex items-center justify-between gap-3 rounded-lg p-3',\n item.isExpired && 'bg-secondary'\n )}\n >\n <div className=\"flex flex-1 items-center gap-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-foreground text-sm font-medium\">\n {item.amount} USDC\n </span>\n <span className=\"text-muted-foreground text-xs\">\n Service: {shortenAddress(item.serviceAddress)}\n </span>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col items-end gap-2\">\n {item.isExpired ? (\n <button\n onClick={() => unlockFunds({ lockId: Number(item.lockId) })}\n disabled={isPending}\n className=\"text-foreground hover:text-foreground/80 cursor-pointer text-sm transition-colors disabled:opacity-50\"\n >\n Click to unlock\n </button>\n ) : (\n <span className=\"text-sm text-amber-500\">{item.time}</span>\n )}\n <span className=\"text-muted-foreground text-xs\">on Base Sepolia</span>\n </div>\n </div>\n ))}\n </div>\n ))\n )}\n </div>\n\n {expiredCount > 0 && (\n <div className=\"p-3\">\n <button\n onClick={() => unlockAllExpired()}\n disabled={isPending}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50\"\n >\n Unlock All ({expiredCount})\n </button>\n </div>\n )}\n </div>\n </>\n )\n}\n\nfunction BalanceTokenRow({ token }: { token: TokenConfig }) {\n const { balanceWei, isLoading } = useBalance({\n tokenId: token.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, token.decimals)\n\n return (\n <div className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2.5\">\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n {isLoading ? (\n <span className=\"bg-secondary h-4 w-16 animate-pulse rounded\" />\n ) : (\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n )}\n </div>\n )\n}\n\nfunction BalanceDetailsView({ onBack }: { onBack: () => void }) {\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Token Balances</span>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token Balance</span>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {chainTokens.map((token) => (\n <BalanceTokenRow key={token.id} token={token} />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction TokenRow({\n token,\n isSelected,\n onClick,\n}: {\n token: TokenConfig\n isSelected: boolean\n onClick: () => void\n}) {\n const { address } = useAccount()\n const isNative = token.contract === zeroAddress\n\n const { data: nativeBalanceData } = useWagmiBalance({\n address,\n chainId: token.chainId,\n query: { enabled: !!address && isNative },\n })\n const { data: erc20Balance } = useReadContract({\n address: token.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: token.chainId,\n query: { enabled: !!address && !isNative },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), token.decimals)\n : '0.00'\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n </button>\n )\n}\n\nfunction TokenSelectorView({\n onBack,\n onSelect,\n selectedTokenId,\n}: {\n onBack: () => void\n onSelect: (token: TokenConfig) => void\n selectedTokenId?: string\n}) {\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n const handleTokenSelect = (token: TokenConfig) => {\n onSelect(token)\n onBack()\n }\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground -ml-2 flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Select Token</span>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token</span>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {chainTokens.map((token) => (\n <TokenRow\n key={token.id}\n token={token}\n isSelected={selectedTokenId === token.id}\n onClick={() => handleTokenSelect(token)}\n />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\ninterface ModalBodyProps {\n onViewChange?: (view: ModalView) => void\n onCloseBlockedChange?: (isBlocked: boolean) => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nfunction ModalBody({\n onViewChange,\n onCloseBlockedChange,\n showLockedFunds = true,\n defaultTab = 'deposit',\n onDepositSuccess,\n}: ModalBodyProps) {\n const { defaultToken, tokensStatus } = usePrivanaContext()\n const [selectedToken, setSelectedToken] = useState<TokenConfig | undefined>(defaultToken)\n const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(defaultTab)\n const [currentView, setCurrentView] = useState<ModalView>('main')\n const [isInteractionPending, setIsInteractionPending] = useState(false)\n\n // Sync selectedToken once tokens finish loading\n useEffect(() => {\n if (!selectedToken && defaultToken) {\n setSelectedToken(defaultToken)\n }\n }, [selectedToken, defaultToken])\n\n const handlePendingChange = (isPending: boolean) => {\n setIsInteractionPending(isPending)\n }\n\n const handleCloseBlockedChange = (isBlocked: boolean) => {\n onCloseBlockedChange?.(isBlocked)\n }\n\n const handleViewChange = (view: ModalView) => {\n const update = () => {\n setCurrentView(view)\n onViewChange?.(view)\n }\n if (typeof document !== 'undefined' && typeof document.startViewTransition === 'function') {\n document.documentElement.dataset.privanaVtDir = view === 'main' ? 'back' : 'forward'\n const transition = document.startViewTransition(update)\n transition.finished.then(() => {\n delete document.documentElement.dataset.privanaVtDir\n })\n } else {\n update()\n }\n }\n\n const handleTokenSelect = (token: TokenConfig) => {\n setSelectedToken(token)\n }\n\n if (tokensStatus === 'loading' || !selectedToken) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"bg-secondary h-25 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-11 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-50 animate-pulse rounded-[10px]\" />\n </div>\n )\n }\n\n if (currentView === 'locked-funds') {\n return <LockedFundsView onBack={() => handleViewChange('main')} />\n }\n\n if (currentView === 'balance-details') {\n return <BalanceDetailsView onBack={() => handleViewChange('main')} />\n }\n\n if (currentView === 'select-token') {\n return (\n <TokenSelectorView\n onBack={() => handleViewChange('main')}\n onSelect={handleTokenSelect}\n selectedTokenId={selectedToken.id}\n />\n )\n }\n\n return (\n <>\n <div className=\"flex flex-col gap-2 pb-4\">\n <div className={cn(isInteractionPending && 'pointer-events-none')}>\n <BalanceCards\n selectedToken={selectedToken}\n onLockedFundsClick={() => handleViewChange('locked-funds')}\n onBalanceClick={() => handleViewChange('balance-details')}\n showLockedFunds={showLockedFunds}\n disabled={isInteractionPending}\n />\n </div>\n\n <div className={cn(isInteractionPending && 'pointer-events-none')}>\n <Tabs activeTab={activeTab} onTabChange={setActiveTab} disabled={isInteractionPending} />\n </div>\n\n <div className=\"bg-muted rounded-[10px] p-5\">\n {activeTab === 'deposit' ? (\n <DepositForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handlePendingChange}\n onUnsafeToCloseChange={handleCloseBlockedChange}\n onSuccess={onDepositSuccess}\n />\n ) : (\n <WithdrawForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handlePendingChange}\n onUnsafeToCloseChange={handleCloseBlockedChange}\n />\n )}\n </div>\n </div>\n </>\n )\n}\n\ninterface PrivanaModalProps {\n open: boolean\n onClose: () => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaModal({\n open,\n onClose,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: PrivanaModalProps) {\n const [currentView, setCurrentView] = useState<ModalView>('main')\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n data-view={currentView}\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex h-[596px] max-h-[95dvh] w-[560px] max-w-[95vw] flex-col gap-2 overflow-hidden rounded-2xl border-0 p-2 pb-[2.75rem]\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <button\n data-privana-close\n onClick={handleClose}\n disabled={isCloseBlocked}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-6 w-6 items-center justify-center transition-colors',\n isCloseBlocked\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n <div\n data-privana-content\n data-view={currentView}\n className=\"flex min-h-0 flex-1 flex-col gap-2\"\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Privana\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Deposit or withdraw tokens from your Privana\n </DialogDescription>\n {currentView === 'main' && (\n <DialogHeader>\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-6 font-medium\">Privana</span>\n </div>\n </DialogHeader>\n )}\n <ModalBody\n onCloseBlockedChange={setIsCloseBlocked}\n onViewChange={setCurrentView}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </div>\n <a\n data-privana-footer\n href=\"https://privana.finance\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Powered by Privana\"\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function PrivanaInlineModal({\n className,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: {\n className?: string\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <ModalBody\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode, type ComponentProps, type ReactElement } from 'react'\nimport { useAccount } from 'wagmi'\nimport { Button, type buttonVariants } from '@/components/ui/button'\nimport { PrivanaModal } from './privana-modal'\nimport { cn } from '@/lib/utils'\nimport type { VariantProps } from 'class-variance-authority'\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nexport interface PrivanaButtonProps extends Omit<ComponentProps<'button'>, 'children'> {\n children?: ReactNode\n variant?: ButtonVariantProps['variant']\n size?: ButtonVariantProps['size']\n asChild?: boolean\n renderButton?: (props: { onClick: () => void; isOpen: boolean }) => ReactElement\n hideWhenDisconnected?: boolean\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaButton({\n children,\n className,\n variant = 'outline',\n size = 'default',\n asChild = false,\n renderButton,\n hideWhenDisconnected = true,\n showLockedFunds = true,\n defaultTab,\n onDepositSuccess,\n ...buttonProps\n}: PrivanaButtonProps) {\n const [modalOpen, setModalOpen] = useState(false)\n const { isConnected } = useAccount()\n\n if (hideWhenDisconnected && !isConnected) {\n return null\n }\n\n const handleClick = () => setModalOpen(true)\n\n const buttonElement = renderButton ? (\n renderButton({ onClick: handleClick, isOpen: modalOpen })\n ) : (\n <Button\n variant={variant}\n size={size}\n asChild={asChild}\n className={cn(className)}\n onClick={handleClick}\n disabled={!isConnected}\n {...buttonProps}\n >\n {children ?? 'Privana'}\n </Button>\n )\n\n return (\n <span data-privana className=\"contents\">\n {buttonElement}\n <PrivanaModal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </span>\n )\n}\n","import type { PrivanaClient } from '../client'\nimport type {\n Address,\n Bytes32,\n DepositAddressResponse,\n LockFundsRequest,\n TransactionSubmissionResponse,\n} from '../types'\nimport {\n getSharedBrowserStorageItem,\n removeSharedBrowserStorageItem,\n setSharedBrowserStorageItem,\n} from './browser-storage'\nimport { AccountingApiError } from '../client/errors'\nimport { PostDepositLockError, submitPendingLock } from './pending-lock'\n\nconst ACTIVE_SESSION_PREFIX = 'privana:external-deposit-lock:active:'\nconst SESSION_PREFIX = 'privana:external-deposit-lock:session:'\n\nexport interface ExternalDepositVerificationRecord {\n hash: `0x${string}`\n chainId: number\n amount: string\n logIndex?: number\n}\n\nexport interface ExternalDepositLockSessionRecord {\n version: 1\n owner: Address\n serviceAddress: Address\n chainId: number\n tokenId: Bytes32\n /** Latest source block observed after signing; older candidates cannot consume this policy. */\n startBlock: number\n depositAmount: string\n maxLockAmount: string\n lockDuration: number\n generation: string\n verification?: ExternalDepositVerificationRecord\n creditedAmount?: string\n /** Once an API attempt starts, recovery may only replay this exact signature. */\n submissionAmbiguous?: boolean\n payload?: LockFundsRequest\n}\n\nexport class ExternalDepositLockSessionChangedError extends Error {\n constructor() {\n super('External deposit lock session changed')\n this.name = 'ExternalDepositLockSessionChangedError'\n Object.setPrototypeOf(this, ExternalDepositLockSessionChangedError.prototype)\n }\n}\n\nexport function externalDepositSessionId(chainId: number, tokenId: string): string {\n return `${chainId}:${tokenId.toLowerCase()}`\n}\n\nexport function isExternalDepositBlockInSession(\n session: ExternalDepositLockSessionRecord,\n blockNumber: number\n): boolean {\n return Number.isSafeInteger(blockNumber) && blockNumber > session.startBlock\n}\n\n/** True only while a verification callback still owns the active, uncredited candidate. */\nexport function isCurrentExternalDepositVerification(\n session: ExternalDepositLockSessionRecord,\n txHash: string\n): boolean {\n return (\n session.creditedAmount === undefined &&\n session.verification?.hash.toLowerCase() === txHash.toLowerCase()\n )\n}\n\nexport function getExternalDepositMinimum(\n response: DepositAddressResponse | undefined,\n chainId: number\n): bigint | undefined {\n const value = response?.min_deposit?.[String(chainId)]?.erc20\n if (value === undefined) return undefined\n try {\n const amount = BigInt(value)\n return amount >= 0n ? amount : undefined\n } catch {\n return undefined\n }\n}\n\nfunction activeSessionKey(owner: string): string {\n return `${ACTIVE_SESSION_PREFIX}${owner.toLowerCase()}`\n}\n\nfunction sessionKey(owner: string, sessionId: string): string {\n return `${SESSION_PREFIX}${owner.toLowerCase()}:${sessionId}`\n}\n\nfunction activeSessionId(owner: string): string | undefined {\n const value = getSharedBrowserStorageItem(activeSessionKey(owner))\n return value || undefined\n}\n\nfunction isPositiveIntegerString(value: unknown): value is string {\n if (typeof value !== 'string') return false\n try {\n return BigInt(value) > 0n\n } catch {\n return false\n }\n}\n\nfunction isSessionRecord(value: unknown): value is ExternalDepositLockSessionRecord {\n if (!value || typeof value !== 'object') return false\n const record = value as Partial<ExternalDepositLockSessionRecord>\n if (\n record.version !== 1 ||\n typeof record.owner !== 'string' ||\n typeof record.serviceAddress !== 'string' ||\n !Number.isInteger(record.chainId) ||\n (record.chainId ?? 0) <= 0 ||\n typeof record.tokenId !== 'string' ||\n !Number.isSafeInteger(record.startBlock) ||\n (record.startBlock ?? -1) < 0 ||\n !isPositiveIntegerString(record.depositAmount) ||\n !isPositiveIntegerString(record.maxLockAmount) ||\n !Number.isInteger(record.lockDuration) ||\n (record.lockDuration ?? 0) <= 0 ||\n typeof record.generation !== 'string' ||\n !record.generation ||\n (record.submissionAmbiguous !== undefined && typeof record.submissionAmbiguous !== 'boolean') ||\n (record.creditedAmount !== undefined && !isPositiveIntegerString(record.creditedAmount))\n ) {\n return false\n }\n if (\n record.verification &&\n (typeof record.verification.hash !== 'string' ||\n record.verification.chainId !== record.chainId ||\n !isPositiveIntegerString(record.verification.amount) ||\n (record.verification.logIndex !== undefined &&\n (!Number.isInteger(record.verification.logIndex) || record.verification.logIndex < 0)))\n ) {\n return false\n }\n if (record.verification && record.creditedAmount !== undefined) return false\n if (record.submissionAmbiguous && record.creditedAmount === undefined) return false\n if (!record.payload) {\n return record.creditedAmount !== undefined && !record.submissionAmbiguous\n }\n if (\n typeof record.payload.signature !== 'string' ||\n typeof record.payload.token_id !== 'string' ||\n typeof record.payload.service_address !== 'string' ||\n record.payload.signature !== record.generation ||\n record.payload.token_id.toLowerCase() !== record.tokenId.toLowerCase() ||\n record.payload.service_address.toLowerCase() !== record.serviceAddress.toLowerCase() ||\n !isPositiveIntegerString(record.payload.amount)\n ) {\n return false\n }\n return BigInt(record.payload.amount) <= BigInt(record.maxLockAmount)\n}\n\nfunction writeSessionRecord(session: ExternalDepositLockSessionRecord): boolean {\n const id = externalDepositSessionId(session.chainId, session.tokenId)\n return setSharedBrowserStorageItem(sessionKey(session.owner, id), JSON.stringify(session))\n}\n\nexport function saveExternalDepositLockSession(\n session: ExternalDepositLockSessionRecord,\n expectedSession: ExternalDepositLockSessionRecord | null = null\n): void {\n if (!isSessionRecord(session)) throw new Error('Invalid external deposit lock session')\n const current = loadExternalDepositLockSession(session.owner)\n if (\n (expectedSession === null && current) ||\n (expectedSession !== null && (!current || !isSameSessionSnapshot(current, expectedSession)))\n ) {\n throw new ExternalDepositLockSessionChangedError()\n }\n const nextId = externalDepositSessionId(session.chainId, session.tokenId)\n const previousId = activeSessionId(session.owner)\n if (!writeSessionRecord(session)) {\n throw new Error('Unable to persist external deposit lock session')\n }\n if (previousId !== nextId) {\n if (!setSharedBrowserStorageItem(activeSessionKey(session.owner), nextId)) {\n removeSharedBrowserStorageItem(sessionKey(session.owner, nextId))\n throw new Error('Unable to persist external deposit lock session')\n }\n if (previousId) {\n removeSharedBrowserStorageItem(sessionKey(session.owner, previousId))\n }\n }\n}\n\nexport function loadExternalDepositLockSession(\n owner: Address\n): ExternalDepositLockSessionRecord | undefined {\n const id = activeSessionId(owner)\n if (!id) return undefined\n const key = sessionKey(owner, id)\n try {\n const raw = getSharedBrowserStorageItem(key)\n const parsed: unknown = raw ? JSON.parse(raw) : undefined\n if (\n !isSessionRecord(parsed) ||\n parsed.owner.toLowerCase() !== owner.toLowerCase() ||\n externalDepositSessionId(parsed.chainId, parsed.tokenId) !== id\n ) {\n removeSharedBrowserStorageItem(key)\n removeSharedBrowserStorageItem(activeSessionKey(owner))\n return undefined\n }\n return parsed\n } catch {\n removeSharedBrowserStorageItem(key)\n removeSharedBrowserStorageItem(activeSessionKey(owner))\n return undefined\n }\n}\n\nexport function subscribeExternalDepositLockSession(\n owner: Address,\n onChange: (session: ExternalDepositLockSessionRecord | undefined) => void\n): () => void {\n if (typeof window === 'undefined') return () => undefined\n\n let localStorage: Storage\n try {\n localStorage = window.localStorage\n } catch {\n return () => undefined\n }\n\n const activeKey = activeSessionKey(owner)\n const ownerSessionPrefix = `${SESSION_PREFIX}${owner.toLowerCase()}:`\n const handleStorage = (event: StorageEvent) => {\n if (event.storageArea !== localStorage) return\n if (\n event.key !== null &&\n event.key !== activeKey &&\n !event.key.startsWith(ownerSessionPrefix)\n ) {\n return\n }\n onChange(loadExternalDepositLockSession(owner))\n }\n\n window.addEventListener('storage', handleStorage)\n return () => window.removeEventListener('storage', handleStorage)\n}\n\nexport function clearExternalDepositLockSession(\n owner: Address,\n expectedSessionId?: string,\n expectedGeneration?: string\n): void {\n const id = activeSessionId(owner)\n if (!id || (expectedSessionId && id !== expectedSessionId)) return\n if (expectedGeneration) {\n const current = loadExternalDepositLockSession(owner)\n if (!current || current.generation !== expectedGeneration) return\n }\n removeSharedBrowserStorageItem(sessionKey(owner, id))\n removeSharedBrowserStorageItem(activeSessionKey(owner))\n}\n\nfunction isSameVerification(\n left: ExternalDepositVerificationRecord | undefined,\n right: ExternalDepositVerificationRecord | undefined\n): boolean {\n if (!left || !right) return left === right\n return (\n left.hash.toLowerCase() === right.hash.toLowerCase() &&\n left.chainId === right.chainId &&\n left.amount === right.amount &&\n (left.logIndex ?? 0) === (right.logIndex ?? 0)\n )\n}\n\nfunction isSamePayload(left: LockFundsRequest | undefined, right: LockFundsRequest | undefined) {\n if (!left || !right) return left === right\n return (\n left.service_address.toLowerCase() === right.service_address.toLowerCase() &&\n left.token_id.toLowerCase() === right.token_id.toLowerCase() &&\n left.amount === right.amount &&\n left.expiry === right.expiry &&\n left.nonce === right.nonce &&\n left.signature === right.signature\n )\n}\n\nfunction isSameSessionSnapshot(\n left: ExternalDepositLockSessionRecord,\n right: ExternalDepositLockSessionRecord\n): boolean {\n return (\n left.version === right.version &&\n left.owner.toLowerCase() === right.owner.toLowerCase() &&\n left.serviceAddress.toLowerCase() === right.serviceAddress.toLowerCase() &&\n left.chainId === right.chainId &&\n left.tokenId.toLowerCase() === right.tokenId.toLowerCase() &&\n left.startBlock === right.startBlock &&\n left.depositAmount === right.depositAmount &&\n left.maxLockAmount === right.maxLockAmount &&\n left.lockDuration === right.lockDuration &&\n left.generation === right.generation &&\n left.creditedAmount === right.creditedAmount &&\n left.submissionAmbiguous === right.submissionAmbiguous &&\n isSameVerification(left.verification, right.verification) &&\n isSamePayload(left.payload, right.payload)\n )\n}\n\nexport function isSameExternalDepositLockSession(\n left: ExternalDepositLockSessionRecord,\n right: ExternalDepositLockSessionRecord\n): boolean {\n return isSameSessionSnapshot(left, right)\n}\n\n/**\n * Clears only the exact failed verification candidate. The signed policy and\n * source-chain boundary stay intact so discovery can continue safely.\n */\nexport function clearExternalDepositVerification(\n session: ExternalDepositLockSessionRecord\n): ExternalDepositLockSessionRecord | undefined {\n if (!session.verification || session.creditedAmount) return undefined\n const current = loadExternalDepositLockSession(session.owner)\n if (\n !current ||\n current.generation !== session.generation ||\n current.creditedAmount ||\n !isSameVerification(current.verification, session.verification)\n ) {\n return undefined\n }\n const next = { ...current, verification: undefined }\n if (!writeSessionRecord(next)) {\n throw new Error('Unable to clear failed deposit verification')\n }\n return next\n}\n\n/** Clear a recovery session only when no cross-tab progress replaced the snapshot. */\nexport function discardExternalDepositLockSession(\n session: ExternalDepositLockSessionRecord\n): boolean {\n const current = loadExternalDepositLockSession(session.owner)\n if (!current) return true\n if (!isSameSessionSnapshot(current, session)) return false\n clearExternalDepositLockSession(\n current.owner,\n externalDepositSessionId(current.chainId, current.tokenId),\n current.generation\n )\n return loadExternalDepositLockSession(current.owner) === undefined\n}\n\nfunction clearSubmittedPayload(\n session: ExternalDepositLockSessionRecord,\n signature: string,\n clearAmbiguous = false\n): boolean {\n const current = loadExternalDepositLockSession(session.owner)\n if (\n !current?.payload ||\n current.payload.signature !== signature ||\n (current.submissionAmbiguous && !clearAmbiguous)\n ) {\n return false\n }\n return writeSessionRecord({ ...current, submissionAmbiguous: undefined, payload: undefined })\n}\n\nfunction markSubmissionAmbiguous(\n session: ExternalDepositLockSessionRecord,\n signature: string\n): boolean {\n const current = loadExternalDepositLockSession(session.owner)\n if (!current?.payload || current.payload.signature !== signature) return false\n if (current.submissionAmbiguous) return true\n return writeSessionRecord({ ...current, submissionAmbiguous: true })\n}\n\nfunction ambiguousSubmissionError(error: PostDepositLockError): PostDepositLockError {\n return new PostDepositLockError(\n 'Lock submission could not be confirmed. Retry only the saved signature, or check locked funds before stopping recovery.',\n error.reason,\n error.signedAmount,\n error.creditedAmount,\n {\n cause: error.cause,\n submissionMayHaveSucceeded: true,\n }\n )\n}\n\nfunction isDefinitiveSubmissionFailure(error: PostDepositLockError): boolean {\n const cause = error.cause\n return cause instanceof AccountingApiError && cause.statusCode !== 408 && cause.statusCode < 500\n}\n\nfunction submissionLockName(session: ExternalDepositLockSessionRecord): string {\n return `privana:external-deposit-lock:submit:${session.owner.toLowerCase()}:${externalDepositSessionId(session.chainId, session.tokenId)}`\n}\n\nasync function withSubmissionLock<T>(\n session: ExternalDepositLockSessionRecord,\n task: (crossTabExclusive: boolean) => Promise<T>\n): Promise<T> {\n const locks = typeof navigator === 'undefined' ? undefined : navigator.locks\n if (!locks) return task(false)\n return locks.request(submissionLockName(session), () => task(true))\n}\n\nexport function externalDepositRetryAmount(session: ExternalDepositLockSessionRecord): bigint {\n if (!session.creditedAmount) throw new Error('No credited external deposit to recover')\n const creditedAmount = BigInt(session.creditedAmount)\n const maxLockAmount = BigInt(session.maxLockAmount)\n return creditedAmount < maxLockAmount ? creditedAmount : maxLockAmount\n}\n\nexport async function submitExternalDepositLock(\n client: PrivanaClient,\n session: ExternalDepositLockSessionRecord\n): Promise<TransactionSubmissionResponse> {\n return withSubmissionLock(session, async (crossTabExclusive) => {\n const current = loadExternalDepositLockSession(session.owner)\n if (!current || current.generation !== session.generation) {\n throw new PostDepositLockError(\n 'External deposit lock session changed before submission',\n 'not-found',\n BigInt(session.maxLockAmount),\n session.creditedAmount ? BigInt(session.creditedAmount) : undefined\n )\n }\n const result = await submitExternalDepositLockAttempt(client, current, crossTabExclusive)\n clearExternalDepositLockSession(\n current.owner,\n externalDepositSessionId(current.chainId, current.tokenId),\n current.generation\n )\n return result\n })\n}\n\nasync function submitExternalDepositLockAttempt(\n client: PrivanaClient,\n session: ExternalDepositLockSessionRecord,\n crossTabExclusive: boolean\n): Promise<TransactionSubmissionResponse> {\n const creditedAmount = session.creditedAmount ? BigInt(session.creditedAmount) : undefined\n if (!creditedAmount) {\n throw new PostDepositLockError(\n 'External deposit has not been credited',\n 'submission-failed',\n BigInt(session.maxLockAmount)\n )\n }\n const payload = session.payload\n if (!payload) {\n throw new PostDepositLockError(\n 'No persisted signed policy found for this deposit session',\n 'not-found',\n BigInt(session.maxLockAmount),\n creditedAmount\n )\n }\n try {\n return await submitPendingLock({\n client,\n payload,\n creditedAmount,\n beforeSubmit: () => {\n if (!markSubmissionAmbiguous(session, payload.signature)) {\n throw new Error('Unable to persist lock submission recovery state')\n }\n },\n })\n } catch (err) {\n if (\n err instanceof PostDepositLockError &&\n err.reason === 'submission-failed' &&\n crossTabExclusive &&\n !session.submissionAmbiguous &&\n isDefinitiveSubmissionFailure(err)\n ) {\n if (!clearSubmittedPayload(session, payload.signature, true)) {\n const latest = loadExternalDepositLockSession(session.owner)\n if (latest?.submissionAmbiguous) throw ambiguousSubmissionError(err)\n }\n } else if (err instanceof PostDepositLockError && err.reason === 'submission-failed') {\n const ambiguous =\n markSubmissionAmbiguous(session, payload.signature) ||\n loadExternalDepositLockSession(session.owner)?.submissionAmbiguous === true\n if (ambiguous) throw ambiguousSubmissionError(err)\n } else {\n const current = loadExternalDepositLockSession(session.owner)\n if (session.submissionAmbiguous || current?.submissionAmbiguous) {\n if (err instanceof PostDepositLockError) throw ambiguousSubmissionError(err)\n throw err\n }\n if (!clearSubmittedPayload(session, payload.signature)) {\n const latest = loadExternalDepositLockSession(session.owner)\n if (latest?.submissionAmbiguous && err instanceof PostDepositLockError) {\n throw ambiguousSubmissionError(err)\n }\n }\n }\n throw err\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useConfig } from 'wagmi'\nimport { getBlockNumber, getWalletClient } from '@wagmi/core'\nimport { zeroAddress } from 'viem'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\nimport type { Allowance } from '../types/allowance'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { VerificationContext } from './use-deposit-verification'\nimport { canUseSharedBrowserStorage } from './browser-storage'\nimport {\n clampLockAmount,\n createSignedLockRequest,\n DEFAULT_LOCK_DURATION_SECONDS,\n requireDepositLockOwner,\n requireServiceAddress,\n PostDepositLockError,\n} from './pending-lock'\nimport {\n clearExternalDepositVerification,\n clearExternalDepositLockSession,\n discardExternalDepositLockSession,\n ExternalDepositLockSessionChangedError,\n externalDepositRetryAmount,\n externalDepositSessionId,\n isCurrentExternalDepositVerification,\n isSameExternalDepositLockSession,\n loadExternalDepositLockSession,\n saveExternalDepositLockSession,\n subscribeExternalDepositLockSession,\n submitExternalDepositLock,\n type ExternalDepositLockSessionRecord,\n} from './external-deposit-lock'\n\nexport interface UseExternalDepositLockOptions {\n allowance?: Allowance\n onLockSubmitted?: (response: TransactionSubmissionResponse) => void\n onLockFailed?: (error: PostDepositLockError) => void\n}\n\nexport interface SignExternalDepositLockParams {\n tokenId: string\n amount: bigint\n}\n\nexport interface UseExternalDepositLockResult {\n isSigning: boolean\n isSubmittingLock: boolean\n session: ExternalDepositLockSessionRecord | null\n signAndPersist: (params: SignExternalDepositLockParams) => Promise<void>\n recordVerification: (context: VerificationContext) => void\n settleAfterCredit: (txHash: string, creditedAmount: bigint) => Promise<void>\n retryAfterCredit: () => Promise<void>\n clearVerification: () => boolean\n discardSession: () => boolean\n}\n\nexport function useExternalDepositLock({\n allowance,\n onLockSubmitted,\n onLockFailed,\n}: UseExternalDepositLockOptions): UseExternalDepositLockResult {\n const { client, networkConfig, serviceAddress, getTokenById, tokensStatus } = usePrivanaContext()\n const config = useConfig()\n const queryClient = useQueryClient()\n const { address } = useAccount()\n const { privateReadAddress } = usePrivateReadRequest()\n const { ensureCorrectChain } = useEnsureCorrectChain()\n\n const [isSigning, setIsSigning] = useState(false)\n const [isSubmittingLock, setIsSubmittingLock] = useState(false)\n const [session, setSession] = useState<ExternalDepositLockSessionRecord | null>(null)\n\n const sessionRef = useRef<ExternalDepositLockSessionRecord | null>(null)\n const signingRef = useRef(false)\n const settlingRef = useRef(false)\n const pendingCreditedTransitionRef = useRef<{\n predecessor: ExternalDepositLockSessionRecord\n credited: ExternalDepositLockSessionRecord\n } | null>(null)\n const hydratedScopeRef = useRef<string | null>(null)\n const beneficiaryRef = useRef(privateReadAddress)\n beneficiaryRef.current = privateReadAddress\n\n const onLockSubmittedRef = useRef(onLockSubmitted)\n const onLockFailedRef = useRef(onLockFailed)\n useEffect(() => {\n onLockSubmittedRef.current = onLockSubmitted\n onLockFailedRef.current = onLockFailed\n }, [onLockSubmitted, onLockFailed])\n\n const installSession = useCallback((next: ExternalDepositLockSessionRecord | null) => {\n sessionRef.current = next\n setSession(next)\n }, [])\n\n const preserveCreditedFallback = useCallback(\n (durable: ExternalDepositLockSessionRecord | null) => {\n const pending = pendingCreditedTransitionRef.current\n if (pending && durable && isSameExternalDepositLockSession(durable, pending.predecessor)) {\n return pending.credited\n }\n pendingCreditedTransitionRef.current = null\n return durable\n },\n []\n )\n\n const notifyFailure = useCallback((error: PostDepositLockError) => {\n onLockFailedRef.current?.(error)\n }, [])\n\n const submitSession = useCallback(\n async (active: ExternalDepositLockSessionRecord) => {\n if (settlingRef.current) return\n settlingRef.current = true\n setIsSubmittingLock(true)\n let result: TransactionSubmissionResponse\n try {\n let submission = active\n const storedBeforeSubmit = loadExternalDepositLockSession(active.owner)\n if (storedBeforeSubmit?.generation === active.generation) {\n if (active.creditedAmount && !storedBeforeSubmit.creditedAmount) {\n // A previous storage write may have failed after credit. Retry that\n // exact transition before the submission reads durable state.\n const pending = pendingCreditedTransitionRef.current\n if (\n !pending ||\n !isSameExternalDepositLockSession(active, pending.credited) ||\n !isSameExternalDepositLockSession(storedBeforeSubmit, pending.predecessor)\n ) {\n throw new ExternalDepositLockSessionChangedError()\n }\n saveExternalDepositLockSession(pending.credited, pending.predecessor)\n pendingCreditedTransitionRef.current = null\n submission = pending.credited\n } else {\n submission = storedBeforeSubmit\n }\n }\n result = await submitExternalDepositLock(client, submission)\n } catch (err) {\n const stored = loadExternalDepositLockSession(active.owner)\n const error =\n err instanceof PostDepositLockError\n ? err\n : new PostDepositLockError(\n err instanceof Error ? err.message : 'Lock submission failed',\n 'submission-failed',\n BigInt(active.maxLockAmount),\n active.creditedAmount ? BigInt(active.creditedAmount) : undefined,\n { cause: err }\n )\n if (err instanceof ExternalDepositLockSessionChangedError) {\n pendingCreditedTransitionRef.current = null\n installSession(stored ?? null)\n return\n }\n // Another tab may have completed or replaced this generation. Its\n // outcome is authoritative and must not surface as a local failure.\n if (!stored || stored.generation !== active.generation) {\n pendingCreditedTransitionRef.current = null\n installSession(stored ?? null)\n return\n }\n if (active.creditedAmount && !stored.creditedAmount) {\n const pending = pendingCreditedTransitionRef.current\n if (\n pending &&\n isSameExternalDepositLockSession(active, pending.credited) &&\n isSameExternalDepositLockSession(stored, pending.predecessor)\n ) {\n installSession(pending.credited)\n notifyFailure(error)\n return\n }\n pendingCreditedTransitionRef.current = null\n installSession(stored)\n return\n }\n installSession(active.creditedAmount && !stored.creditedAmount ? active : stored)\n notifyFailure(error)\n return\n } finally {\n settlingRef.current = false\n setIsSubmittingLock(false)\n }\n\n installSession(loadExternalDepositLockSession(active.owner) ?? null)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onLockSubmittedRef.current?.(result)\n },\n [client, installSession, notifyFailure, queryClient]\n )\n\n const validateRestoredSession = useCallback(\n (\n restored: ExternalDepositLockSessionRecord | undefined\n ): ExternalDepositLockSessionRecord | null => {\n if (!restored || !serviceAddress) return null\n const token = getTokenById(restored.tokenId)\n const invalid =\n restored.serviceAddress.toLowerCase() !== serviceAddress.toLowerCase() ||\n !token ||\n token.chainId !== restored.chainId ||\n token.contract === zeroAddress ||\n (!restored.creditedAmount && !restored.payload)\n if (!invalid) return restored\n\n clearExternalDepositLockSession(\n restored.owner,\n externalDepositSessionId(restored.chainId, restored.tokenId),\n restored.generation\n )\n return null\n },\n [getTokenById, serviceAddress]\n )\n\n useEffect(() => {\n if (!privateReadAddress || !serviceAddress || tokensStatus !== 'ready') {\n // Hide unavailable-account state without discarding a credited in-memory\n // fallback whose durable transition is waiting to be retried.\n setSession(null)\n return\n }\n const hydrationKey = `${privateReadAddress.toLowerCase()}:${serviceAddress.toLowerCase()}`\n const shouldResume = hydratedScopeRef.current !== hydrationKey\n hydratedScopeRef.current = hydrationKey\n\n const restored = preserveCreditedFallback(\n validateRestoredSession(loadExternalDepositLockSession(privateReadAddress))\n )\n installSession(restored)\n if (!restored) {\n return\n }\n if (!shouldResume) return\n if (restored.creditedAmount && restored.payload) {\n void submitSession(restored)\n } else if (restored.creditedAmount) {\n notifyFailure(\n new PostDepositLockError(\n 'Deposit credited; sign a fresh policy to lock the funds',\n 'not-found',\n BigInt(restored.maxLockAmount),\n BigInt(restored.creditedAmount)\n )\n )\n }\n }, [\n installSession,\n notifyFailure,\n privateReadAddress,\n preserveCreditedFallback,\n serviceAddress,\n submitSession,\n tokensStatus,\n validateRestoredSession,\n ])\n\n useEffect(() => {\n if (!privateReadAddress || !serviceAddress || tokensStatus !== 'ready') return\n const reconcile = (restored: ExternalDepositLockSessionRecord | undefined) => {\n installSession(preserveCreditedFallback(validateRestoredSession(restored)))\n }\n const unsubscribe = subscribeExternalDepositLockSession(privateReadAddress, reconcile)\n // Close the small gap between initial hydration and listener registration.\n reconcile(loadExternalDepositLockSession(privateReadAddress))\n return unsubscribe\n }, [\n installSession,\n preserveCreditedFallback,\n privateReadAddress,\n serviceAddress,\n tokensStatus,\n validateRestoredSession,\n ])\n\n const signAndPersist = useCallback(\n async ({ tokenId, amount }: SignExternalDepositLockParams) => {\n if (!allowance) throw new Error('No allowance configured for this deposit')\n if (signingRef.current || settlingRef.current) {\n throw new Error('A policy operation is already in progress')\n }\n if (!canUseSharedBrowserStorage()) {\n throw new Error('Browser storage is required for locked deposit recovery')\n }\n const owner = requireDepositLockOwner(address, privateReadAddress)\n if (sessionRef.current || loadExternalDepositLockSession(owner)) {\n throw new Error('Finish or cancel the active external deposit before starting another')\n }\n const token = getTokenById(tokenId)\n if (!token) throw new Error(`Unknown token ID: ${tokenId}`)\n if (token.contract === zeroAddress) {\n throw new Error('External deposits support ERC20 tokens only')\n }\n const targetService = requireServiceAddress(serviceAddress)\n const lockDuration = allowance.lockDuration ?? DEFAULT_LOCK_DURATION_SECONDS\n\n signingRef.current = true\n setIsSigning(true)\n try {\n await ensureCorrectChain(networkConfig.chainId)\n const signingWalletClient = await getWalletClient(config, {\n chainId: networkConfig.chainId,\n })\n const payload = await createSignedLockRequest({\n client,\n walletClient: signingWalletClient,\n userAddress: owner,\n networkConfig,\n serviceAddress: targetService,\n tokenId: token.id as Bytes32,\n amount: clampLockAmount(amount, BigInt(allowance.value)),\n lockDuration,\n })\n const startBlock = await getBlockNumber(config, { chainId: token.chainId })\n if (startBlock > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('Source-chain block number exceeds the supported range')\n }\n if (beneficiaryRef.current?.toLowerCase() !== owner.toLowerCase()) {\n throw new Error('Authenticated deposit account changed while signing')\n }\n const next: ExternalDepositLockSessionRecord = {\n version: 1,\n owner,\n serviceAddress: targetService,\n chainId: token.chainId,\n tokenId: token.id as Bytes32,\n startBlock: Number(startBlock),\n depositAmount: amount.toString(),\n maxLockAmount: String(payload.amount),\n lockDuration,\n generation: payload.signature,\n payload,\n }\n saveExternalDepositLockSession(next, null)\n installSession(next)\n } finally {\n signingRef.current = false\n setIsSigning(false)\n }\n },\n [\n address,\n allowance,\n client,\n config,\n ensureCorrectChain,\n getTokenById,\n installSession,\n networkConfig,\n privateReadAddress,\n serviceAddress,\n ]\n )\n\n const settleAfterCredit = useCallback(\n async (txHash: string, creditedAmount: bigint) => {\n const active = sessionRef.current\n if (!active || settlingRef.current) return\n if (!isCurrentExternalDepositVerification(active, txHash)) {\n // Another tab may have advanced or replaced the candidate while this\n // verification was in flight. Its durable state is authoritative.\n return\n }\n if (creditedAmount <= 0n) throw new Error('Credited amount must be positive')\n const credited = {\n ...active,\n verification: undefined,\n creditedAmount: creditedAmount.toString(),\n }\n try {\n saveExternalDepositLockSession(credited, active)\n pendingCreditedTransitionRef.current = null\n } catch (err) {\n const stored = loadExternalDepositLockSession(active.owner)\n if (\n err instanceof ExternalDepositLockSessionChangedError ||\n !stored ||\n !isSameExternalDepositLockSession(stored, active)\n ) {\n pendingCreditedTransitionRef.current = null\n installSession(stored ?? null)\n return\n }\n pendingCreditedTransitionRef.current = { predecessor: active, credited }\n installSession(credited)\n notifyFailure(\n new PostDepositLockError(\n err instanceof Error ? err.message : 'Unable to persist credited deposit state',\n 'submission-failed',\n BigInt(active.maxLockAmount),\n creditedAmount,\n { cause: err }\n )\n )\n return\n }\n installSession(credited)\n await submitSession(credited)\n },\n [installSession, notifyFailure, submitSession]\n )\n\n const recordVerification = useCallback(\n (context: VerificationContext) => {\n const active = sessionRef.current\n if (!active || active.creditedAmount) {\n throw new Error('No external deposit session is awaiting verification')\n }\n if (active.verification) {\n const sameTransfer =\n active.verification.hash.toLowerCase() === context.hash.toLowerCase() &&\n active.verification.chainId === context.chainId &&\n active.verification.amount === context.amount.toString() &&\n (active.verification.logIndex ?? 0) === (context.logIndex ?? 0)\n if (sameTransfer) return\n throw new Error('Another transfer is already being verified for this deposit session')\n }\n if (context.chainId !== active.chainId || context.amount <= 0n) {\n throw new Error('Discovered transfer does not match the signed deposit session')\n }\n const current = loadExternalDepositLockSession(active.owner)\n if (!current || current.generation !== active.generation) {\n throw new Error('The signed deposit session changed before verification')\n }\n const next: ExternalDepositLockSessionRecord = {\n ...active,\n verification: {\n hash: context.hash,\n chainId: context.chainId,\n amount: context.amount.toString(),\n logIndex: context.logIndex,\n },\n }\n saveExternalDepositLockSession(next, active)\n installSession(next)\n },\n [installSession]\n )\n\n const retryAfterCredit = useCallback(async () => {\n const active = sessionRef.current\n if (!active?.creditedAmount) throw new Error('No credited external deposit to recover')\n if (signingRef.current || settlingRef.current) {\n throw new Error('A policy operation is already in progress')\n }\n if (privateReadAddress?.toLowerCase() !== active.owner.toLowerCase()) {\n throw new Error('Authenticated deposit account does not match the credited deposit')\n }\n const token = getTokenById(active.tokenId)\n if (!token || token.chainId !== active.chainId || token.contract === zeroAddress) {\n throw new Error('The credited token is no longer available')\n }\n const targetService = requireServiceAddress(serviceAddress)\n if (targetService.toLowerCase() !== active.serviceAddress.toLowerCase()) {\n throw new Error('The service for this credited deposit has changed')\n }\n if (active.payload) {\n await submitSession(active)\n return\n }\n if (active.submissionAmbiguous) {\n throw new Error(\n 'The previous lock submission may have succeeded; a fresh signature is unsafe'\n )\n }\n const owner = requireDepositLockOwner(address, privateReadAddress)\n const amount = externalDepositRetryAmount(active)\n\n let retrySession: ExternalDepositLockSessionRecord\n signingRef.current = true\n setIsSigning(true)\n try {\n await ensureCorrectChain(networkConfig.chainId)\n const signingWalletClient = await getWalletClient(config, {\n chainId: networkConfig.chainId,\n })\n const payload = await createSignedLockRequest({\n client,\n walletClient: signingWalletClient,\n userAddress: owner,\n networkConfig,\n serviceAddress: targetService,\n tokenId: active.tokenId,\n amount,\n lockDuration: active.lockDuration,\n })\n if (beneficiaryRef.current?.toLowerCase() !== owner.toLowerCase()) {\n throw new Error('Authenticated deposit account changed while signing')\n }\n retrySession = {\n ...active,\n depositAmount: amount.toString(),\n generation: payload.signature,\n verification: undefined,\n submissionAmbiguous: undefined,\n payload,\n }\n saveExternalDepositLockSession(retrySession, active)\n installSession(retrySession)\n } finally {\n signingRef.current = false\n setIsSigning(false)\n }\n await submitSession(retrySession)\n }, [\n address,\n client,\n config,\n ensureCorrectChain,\n getTokenById,\n installSession,\n networkConfig,\n privateReadAddress,\n serviceAddress,\n submitSession,\n ])\n\n const clearVerification = useCallback((): boolean => {\n const active = sessionRef.current\n if (!active?.verification || active.creditedAmount) return false\n const next = clearExternalDepositVerification(active)\n if (!next) {\n installSession(loadExternalDepositLockSession(active.owner) ?? null)\n return false\n }\n installSession(next)\n return true\n }, [installSession])\n\n const discardSession = useCallback((): boolean => {\n const active = sessionRef.current\n if (!active) return true\n if (signingRef.current || settlingRef.current) return false\n const pending = pendingCreditedTransitionRef.current\n const discardTarget =\n pending && isSameExternalDepositLockSession(active, pending.credited)\n ? pending.predecessor\n : active\n const discarded = discardExternalDepositLockSession(discardTarget)\n const restored = loadExternalDepositLockSession(active.owner) ?? null\n if (discarded) pendingCreditedTransitionRef.current = null\n installSession(restored)\n return discarded && !restored\n }, [installSession])\n\n return {\n isSigning,\n isSubmittingLock,\n session,\n signAndPersist,\n recordVerification,\n settleAfterCredit,\n retryAfterCredit,\n clearVerification,\n discardSession,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { MoonPayContext } from '@moonpay/moonpay-react'\n\nexport const DEFAULT_MOONPAY_API_URL = 'https://api.moonpay.com/v3'\n\nexport interface MoonpayLimits {\n /** Minimum fiat purchase for the currency/payment-method (fees included). */\n minBuyAmount: number | undefined\n /** Maximum fiat purchase for the currency/payment-method (fees included). */\n maxBuyAmount: number | undefined\n}\n\nexport interface UseMoonpayLimitsOptions {\n /** MoonPay currency code, e.g. 'usdc'. */\n currencyCode?: string\n /** Fiat currency the limits are quoted in (default: 'usd'). */\n baseCurrencyCode?: string\n /** Payment method the limits apply to (default: 'credit_debit_card'). */\n paymentMethod?: string\n /** Versioned MoonPay REST API base URL (default: 'https://api.moonpay.com/v3'). */\n apiBaseUrl?: string\n /** Skip the request when false (e.g. non credit-card flows). */\n enabled?: boolean\n}\n\nexport interface UseMoonpayLimitsResult extends MoonpayLimits {\n isLoading: boolean\n error: Error | null\n}\n\nexport function useMoonpayLimits({\n currencyCode,\n baseCurrencyCode = 'usd',\n paymentMethod = 'credit_debit_card',\n apiBaseUrl = DEFAULT_MOONPAY_API_URL,\n enabled = true,\n}: UseMoonpayLimitsOptions): UseMoonpayLimitsResult {\n const { apiKey } = useContext(MoonPayContext) ?? {}\n const canFetch = enabled && !!apiKey && !!currencyCode\n\n const query = useQuery({\n queryKey: ['moonpay-limits', apiBaseUrl, currencyCode, baseCurrencyCode, paymentMethod, apiKey],\n enabled: canFetch,\n staleTime: 5 * 60_000,\n queryFn: async (): Promise<MoonpayLimits> => {\n const params = new URLSearchParams({\n apiKey: apiKey as string,\n baseCurrencyCode,\n paymentMethod,\n areFeesIncluded: 'true',\n })\n const res = await fetch(\n `${apiBaseUrl}/currencies/${currencyCode}/limits?${params.toString()}`\n )\n if (!res.ok) {\n throw new Error(`MoonPay limits request failed: ${res.status}`)\n }\n const data = (await res.json()) as {\n baseCurrency?: { minBuyAmount?: unknown; maxBuyAmount?: unknown }\n }\n const asNumber = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) ? value : undefined\n return {\n minBuyAmount: asNumber(data.baseCurrency?.minBuyAmount),\n maxBuyAmount: asNumber(data.baseCurrency?.maxBuyAmount),\n }\n },\n })\n\n return {\n minBuyAmount: query.data?.minBuyAmount,\n maxBuyAmount: query.data?.maxBuyAmount,\n isLoading: query.isLoading,\n error: (query.error as Error | null) ?? null,\n }\n}\n","'use client'\n\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { cn } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\n\ninterface TokenSelectorViewProps {\n selectedTokenId?: string\n onSelect: (tokenId: string) => void\n}\n\n/**\n * Simple single-column token picker shared by the Deposit and Withdraw modals.\n * (The combined PrivanaModal uses its own network-aware variant.)\n */\nexport function TokenSelectorView({ selectedTokenId, onSelect }: TokenSelectorViewProps) {\n const { enabledTokens } = usePrivanaContext()\n\n return (\n <div className=\"bg-muted flex flex-col rounded-[10px] p-3\">\n <div className=\"flex max-h-72 flex-col gap-1 overflow-y-auto\">\n {enabledTokens.map((token) => {\n const isSelected = selectedTokenId === token.id\n return (\n <button\n key={token.id}\n type=\"button\"\n onClick={() => onSelect(token.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-6 w-6 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 24)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-medium\">{token.symbol}</div>\n <div className=\"text-muted-foreground text-[11px]\">{token.name}</div>\n </div>\n {isSelected && (\n <div className=\"bg-primary flex h-4 w-4 shrink-0 items-center justify-center rounded-full\">\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n className=\"text-primary-foreground\"\n >\n <path\n d=\"M2 5L4 7L8 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </button>\n )\n })}\n {enabledTokens.length === 0 && (\n <p className=\"text-muted-foreground px-3 py-6 text-center text-sm\">No tokens available</p>\n )}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport type { Allowance } from '@/sdk/types/allowance'\nimport type { PostDepositLockError } from '@/sdk/hooks/pending-lock'\nimport { FiatOnRampForm } from './fiat-on-ramp-form'\n\nexport function CreditCardWidgetView({\n token,\n amount,\n allowance,\n onCredited,\n onLockSubmitted,\n onLockFailed,\n}: {\n token: TokenConfig | undefined\n amount: string\n allowance?: Allowance\n onCredited?: () => void\n onLockSubmitted?: () => void\n onLockFailed?: (error: PostDepositLockError) => void\n}) {\n const moonpayCurrencyCode = token?.moonpayCurrencyCode\n const containerRef = useRef<HTMLDivElement>(null)\n const [widgetTheme, setWidgetTheme] = useState<'light' | 'dark'>()\n useEffect(() => {\n if (containerRef.current) setWidgetTheme(resolveSdkTheme(containerRef.current))\n }, [])\n\n return (\n <div ref={containerRef} className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">Complete your purchase</h2>\n {token && moonpayCurrencyCode ? (\n <FiatOnRampForm\n tokenId={token.id}\n currencyCode={moonpayCurrencyCode}\n // The user typed a crypto amount — quote-driven so MoonPay targets\n // it as the delivery amount, locked inside the widget.\n quoteCurrencyAmount={amount || undefined}\n lockAmount\n variant=\"embedded\"\n autoStart\n theme={widgetTheme}\n postDepositLock={\n allowance\n ? {\n maxAmount: BigInt(allowance.value),\n lockDuration: allowance.lockDuration,\n }\n : undefined\n }\n onCredited={onCredited}\n onLockSubmitted={onLockSubmitted}\n onLockFailed={onLockFailed}\n />\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {token?.symbol ?? 'This token'} isn’t available for card purchases yet.\n </p>\n )}\n </div>\n )\n}\n\nfunction resolveSdkTheme(el: HTMLElement): 'light' | 'dark' {\n const scheme = getComputedStyle(el).colorScheme\n if (scheme === 'dark') return 'dark'\n if (scheme === 'light') return 'light'\n return el.closest('.dark') ? 'dark' : 'light'\n}\n","'use client'\n\ninterface PrivanaIconProps {\n className?: string\n size?: number\n}\n\nexport function PrivanaIcon({ className, size = 32 }: PrivanaIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <rect width=\"32\" height=\"32\" rx=\"3.55556\" fill=\"black\" />\n <path\n d=\"M9.02789 9.05299L9.20884 7.82227H15.6221L16.1099 7.82683L16.5817 7.83825L17.0398 7.85652L17.4842 7.88163L17.9125 7.91588L18.3271 7.95698L18.7256 8.00722L19.1104 8.06202L19.4814 8.12595L19.8823 8.20815L20.2602 8.2972L20.6175 8.39538L20.9542 8.50042L21.2703 8.61687L21.5657 8.74017L21.8406 8.8726L22.0948 9.01645L22.1521 9.05299H9.02789ZM9.02789 12.0784L9.20884 10.8477H21.9505L22.1177 10.955L22.317 11.1057L22.4934 11.2633L22.6445 11.4322L22.7705 11.608L22.8713 11.793L22.9491 11.9871L22.9721 12.0784H9.02789ZM15.8167 11.0372H13.1369L13.0843 12.0784H18.8447L18.8264 12.0213L18.7645 11.9072L18.6844 11.7976L18.5836 11.6948L18.4645 11.6012L18.3271 11.5121L18.1736 11.4299L18.0041 11.3569L17.8209 11.2907L17.6193 11.2313L17.404 11.1811L17.1727 11.1354L16.9276 11.1011L16.6711 11.0737L16.3985 11.0532L16.1145 11.0418L15.8167 11.0372ZM9.02789 15.1038L9.20884 13.8731H22.7453L22.7728 13.9759L22.8003 14.1334L22.8232 14.3252L22.8163 14.5102L22.7819 14.6905L22.7178 14.8664L22.6239 15.0376L22.5735 15.1038H9.02789ZM13.1484 13.8731L13.0843 15.1038H17.5323L17.6674 15.0696L17.8644 15.0079L18.043 14.9372L18.2034 14.8618L18.3454 14.7796L18.4691 14.6883L18.5744 14.5946L18.6569 14.4942L18.721 14.3914L18.7622 14.2841L18.7828 14.1722V14.0558L18.7622 13.9348L18.7416 13.8731H13.1484ZM9.02789 18.1293L9.20884 16.8985H22.3605L22.2895 16.9899L22.1406 17.1406L21.9643 17.2867L21.7581 17.426L21.5268 17.5561L21.2703 17.6817L20.9862 17.7982L20.6747 17.9055L20.3381 18.006L19.9739 18.0996L19.8387 18.1293H9.02789ZM13.1484 16.8985L13.1392 17.0629H15.8144L16.1145 17.0607L16.3985 17.047L16.6665 17.0264L16.9207 16.999L17.1612 16.9625L17.388 16.9168L17.4658 16.8985H13.1484ZM9.02789 21.1547L9.20884 19.9217H19.7036L19.4562 19.9742L19.0989 20.0381L18.7256 20.0952L18.3316 20.1432L17.9239 20.1843L17.4956 20.2185L17.0536 20.2459L16.5932 20.2642L16.1168 20.2756L15.6243 20.2802H13.1301L13.0843 21.1547H9.02789ZM13.0843 24.1778H9.02789L9.20884 22.9471H13.1484L13.0843 24.1778Z\"\n fill=\"white\"\n />\n </svg>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport type { Allowance, AllowanceTerm } from '@/sdk/types/allowance'\nimport { cn } from '@/lib/utils'\nimport { ChevronDownIcon, CircleCheckIcon, CircleXIcon, ArrowRightIcon } from './icons'\nimport { PrivanaIcon } from './privana-icon'\n\nfunction PolicyTermRow({\n term,\n kind,\n}: {\n term: AllowanceTerm\n kind: 'permission' | 'restriction'\n}) {\n return (\n <div className=\"flex gap-2\">\n <div\n className={cn(\n 'mt-0.5 shrink-0',\n kind === 'permission' ? 'text-emerald-500' : 'text-orange-500'\n )}\n >\n {kind === 'permission' ? <CircleCheckIcon /> : <CircleXIcon />}\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-foreground text-sm leading-5 font-medium\">{term.title}</span>\n <span className=\"text-muted-foreground text-sm leading-5\">{term.description}</span>\n </div>\n </div>\n )\n}\n\nexport function AllowancePolicySection({\n allowance,\n serviceName,\n serviceIcon,\n}: {\n allowance: Allowance\n serviceName: string\n serviceIcon?: ReactNode\n}) {\n const [collapsed, setCollapsed] = useState(false)\n const permissions = allowance.terms?.permissions ?? []\n const restrictions = allowance.terms?.restrictions ?? []\n const hasTerms = permissions.length > 0 || restrictions.length > 0\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-8 w-8 items-center justify-center overflow-hidden rounded-lg\">\n {serviceIcon}\n </div>\n <ArrowRightIcon className=\"text-muted-foreground\" />\n <PrivanaIcon size={32} />\n </div>\n\n <p className=\"text-sm leading-5\">\n <span className=\"text-foreground font-medium\">{serviceName}</span>{' '}\n <span className=\"text-muted-foreground\">wants a policy on your Privana account.</span>\n </p>\n\n {hasTerms && (\n <>\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full cursor-pointer items-center gap-2\"\n >\n <span className=\"bg-border h-px flex-1\" />\n <span className=\"text-muted-foreground text-[10px] leading-[14px] font-medium tracking-[0.2px] whitespace-nowrap uppercase\">\n {collapsed ? 'Show details' : 'Hide details'}\n </span>\n <ChevronDownIcon\n direction={collapsed ? 'down' : 'up'}\n className=\"text-foreground shrink-0\"\n />\n <span className=\"bg-border h-px flex-1\" />\n </button>\n\n {!collapsed && (\n <div className=\"flex flex-col gap-4\">\n {permissions.map((term, i) => (\n <PolicyTermRow key={`permission-${i}`} term={term} kind=\"permission\" />\n ))}\n {restrictions.map((term, i) => (\n <PolicyTermRow key={`restriction-${i}`} term={term} kind=\"restriction\" />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport { useAccount, useBalance, useReadContract } from 'wagmi'\nimport { erc20Abi, formatUnits, zeroAddress } from 'viem'\nimport { QRCodeSVG } from 'qrcode.react'\nimport { MoonPayProvider } from '@moonpay/moonpay-react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport type { Allowance } from '@/sdk/types/allowance'\nimport { toast } from 'sonner'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport {\n useDeposit,\n useDepositVerification,\n usePendingDeposits,\n isSignedLockUsable,\n type PostDepositLockError,\n type VerificationContext,\n} from '@/sdk/hooks'\nimport { useDepositAddress, type UseDepositAddressResult } from '@/sdk/hooks/use-deposit-address'\nimport {\n getExternalDepositMinimum,\n isExternalDepositBlockInSession,\n} from '@/sdk/hooks/external-deposit-lock'\nimport {\n useExternalDepositLock,\n type UseExternalDepositLockResult,\n} from '@/sdk/hooks/use-external-deposit-lock'\nimport { useMoonpayLimits } from '@/sdk/hooks/use-moonpay-limits'\nimport {\n cn,\n formatCountdown,\n formatTokenAmount,\n parseTokenAmount,\n shortenAddress,\n} from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { TokenSelectorView } from './token-selector-view'\nimport { CreditCardWidgetView } from './credit-card-widget-view'\nimport {\n Spinner,\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n TransactionErrorView,\n type Step,\n} from './transaction-steps'\nimport { CloseIcon, ChevronRightIcon, ChevronLeftIcon, CopyIcon } from './icons'\nimport { AllowancePolicySection } from './allowance-policy-section'\n\ntype DepositMethodTab = 'crypto' | 'credit-card'\n\n// Mounting MoonPayProvider injects MoonPay's web-sdk script from their CDN, so\n// it wraps only the credit-card subtree instead of the app root — the other\n// deposit flows never pay that cost. Without `networkConfig.moonpayApiKey` the\n// children render bare and the credit-card flow stays fail-closed (purchase\n// limits never load, so the deposit button stays disabled).\nfunction MoonPayGate({ enabled, children }: { enabled: boolean; children: ReactNode }) {\n const { networkConfig } = usePrivanaContext()\n const apiKey = networkConfig.moonpayApiKey\n if (!enabled || !apiKey) return <>{children}</>\n return <MoonPayProvider apiKey={apiKey}>{children}</MoonPayProvider>\n}\n\nexport type DepositSource = 'connected' | 'external' | 'credit-card'\n\ntype DepositView = 'method' | 'deposit' | 'select-token' | 'external-deposit' | 'credit-card-widget'\n\ntype DepositFlowView =\n | 'depositing'\n | 'deposit-success'\n | 'deposit-timeout'\n | 'deposit-error'\n | 'lock-error'\n\nfunction formatPostDepositLockFailure(\n error: PostDepositLockError | null,\n token: TokenConfig | undefined\n): string {\n if (\n error?.reason === 'credited-below-signed' &&\n error.creditedAmount !== undefined &&\n error.signedAmount !== undefined &&\n token\n ) {\n const creditedAmount = `${formatUnits(error.creditedAmount, token.decimals)} ${token.symbol}`\n const signedAmount = `${formatUnits(error.signedAmount, token.decimals)} ${token.symbol}`\n return `Credited amount (${creditedAmount}) is below the signed lock amount (${signedAmount})`\n }\n return error?.message ?? 'Lock submission failed'\n}\n\nfunction MethodTabs({\n activeTab,\n onTabChange,\n}: {\n activeTab: DepositMethodTab\n onTabChange: (tab: DepositMethodTab) => void\n}) {\n return (\n <div className=\"bg-secondary relative flex gap-2 overflow-hidden rounded-[10px] p-1\">\n <div\n className={cn(\n 'bg-input absolute top-1 bottom-1 left-1 w-[calc(50%-8px)] rounded-md transition-transform duration-200',\n activeTab === 'credit-card' && 'translate-x-[calc(100%+8px)]'\n )}\n />\n <button\n type=\"button\"\n onClick={() => onTabChange('crypto')}\n className={cn(\n 'relative z-10 flex-1 cursor-pointer rounded-md px-3 py-[9px] text-sm font-medium transition-colors',\n activeTab === 'crypto' ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n Crypto\n </button>\n <button\n type=\"button\"\n onClick={() => onTabChange('credit-card')}\n className={cn(\n 'relative z-10 flex-1 cursor-pointer rounded-md px-3 py-[9px] text-sm font-medium transition-colors',\n activeTab === 'credit-card' ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n Credit Card\n </button>\n </div>\n )\n}\n\nfunction MethodOption({\n title,\n description,\n onClick,\n}: {\n title: string\n description: string\n onClick?: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"bg-input hover:bg-input/70 border-border flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left transition-colors\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-foreground text-sm leading-[14px] font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs leading-3\">{description}</span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n )\n}\n\nfunction DepositView({\n source,\n selectedToken,\n amount,\n allowance,\n externalMinimum,\n onAmountChange,\n onSelectToken,\n onConnectWallet,\n onSubmit,\n isSubmitting = false,\n}: {\n source: DepositSource\n selectedToken: TokenConfig | undefined\n amount: string\n allowance?: Allowance\n /** `undefined` while loading, `null` when unavailable, otherwise base units. */\n externalMinimum?: bigint | null\n onAmountChange: (value: string) => void\n onSelectToken: () => void\n onConnectWallet?: () => void\n onSubmit: (args: { source: DepositSource; tokenId: string; amount: string }) => void\n isSubmitting?: boolean\n}) {\n const { getChainById, chains, serviceName, serviceIcon, networkConfig, hostedAuthConfig } =\n usePrivanaContext()\n const { address, isConnected } = useAccount()\n const appName = serviceName ?? 'Privana'\n const chain = selectedToken ? getChainById(selectedToken.chainId) : undefined\n const targetChain = chain ?? chains[0]\n const sourceLabel = source === 'connected' ? 'Connected Wallet' : 'External Wallet'\n const isConnectedSource = source === 'connected'\n const isExternal = source === 'external'\n const isCreditCard = source === 'credit-card'\n const isNative = selectedToken?.contract === zeroAddress\n const { data: nativeBalanceData } = useBalance({\n address,\n chainId: targetChain?.id,\n query: { enabled: isConnectedSource && !!address && !!selectedToken && isNative },\n })\n const { data: erc20Balance } = useReadContract({\n address: selectedToken?.contract as `0x${string}` | undefined,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: targetChain?.id,\n query: { enabled: isConnectedSource && !!address && !!selectedToken && !isNative },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n const formattedWalletBalance =\n walletBalance != null && selectedToken\n ? formatTokenAmount(walletBalance.toString(), selectedToken.decimals)\n : '0.00'\n\n // The credit-card amount is the token amount MoonPay should deliver\n // (quoteCurrencyAmount — the pre-signed lock needs an exact crypto target).\n // Gate it against MoonPay's fiat minimum so the user can't sign the policy\n // for an amount MoonPay would reject once the widget opens; the ~1:1\n // comparison holds because card purchases are limited to USD-stable tokens.\n const {\n minBuyAmount: moonpayMinBuy,\n isLoading: moonpayLimitsLoading,\n error: moonpayLimitsError,\n } = useMoonpayLimits({\n currencyCode: selectedToken?.moonpayCurrencyCode,\n apiBaseUrl: networkConfig.moonpayApiUrl,\n enabled: isCreditCard,\n })\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n // Card purchases keep a 2-decimal cap so the quote string stays simple for\n // MoonPay; other sources take a token amount capped by the token's decimals.\n const maxAmountDecimals = isCreditCard ? 2 : selectedToken?.decimals\n const tooManyDecimals =\n hasValidAmount &&\n maxAmountDecimals != null &&\n amount.includes('.') &&\n amount.split('.')[1].length > maxAmountDecimals\n const exceedsBalance =\n isConnectedSource &&\n hasValidAmount &&\n !tooManyDecimals &&\n !!selectedToken &&\n walletBalance != null &&\n parseTokenAmount(amount, selectedToken.decimals) > walletBalance\n const belowMoonpayMin =\n isCreditCard && hasValidAmount && moonpayMinBuy != null && parseFloat(amount) < moonpayMinBuy\n const moonpayLimitsUnready =\n isCreditCard && !!selectedToken?.moonpayCurrencyCode && moonpayMinBuy == null\n // No MoonPay currency mapping for this token.\n const creditCardUnavailable =\n isCreditCard && !!selectedToken && !selectedToken.moonpayCurrencyCode\n const externalTokenUnavailable = isExternal && !!selectedToken && isNative\n const externalMinimumRequired = isExternal && !!allowance && !!selectedToken\n const externalMinimumLoading = externalMinimumRequired && externalMinimum === undefined\n const externalMinimumUnavailable = externalMinimumRequired && externalMinimum === null\n const belowExternalMinimum =\n externalMinimumRequired &&\n hasValidAmount &&\n !tooManyDecimals &&\n !!selectedToken &&\n typeof externalMinimum === 'bigint' &&\n parseTokenAmount(amount, selectedToken.decimals) < externalMinimum\n // Signing the external-deposit policy needs a wallet even though the\n // transfer itself comes from elsewhere.\n const externalNeedsWallet = isExternal && (!!allowance || !hostedAuthConfig)\n const needsConnect = (isConnectedSource || externalNeedsWallet) && !isConnected\n\n const canDeposit =\n hasValidAmount &&\n !!selectedToken &&\n !tooManyDecimals &&\n !exceedsBalance &&\n !belowMoonpayMin &&\n !moonpayLimitsUnready &&\n !creditCardUnavailable &&\n !externalTokenUnavailable &&\n !externalMinimumLoading &&\n !externalMinimumUnavailable &&\n !belowExternalMinimum &&\n !needsConnect\n\n const handleMax = () => {\n const max = formattedWalletBalance.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n {isCreditCard ? (\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Buy with credit card and deposit\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n Enter your deposit amount and proceed to sign a policy.\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Deposit from {sourceLabel}\n </h2>\n {allowance && (\n <p className=\"text-muted-foreground text-sm\">\n Enter your deposit amount and proceed to sign a policy.\n </p>\n )}\n </div>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n type=\"button\"\n onClick={onSelectToken}\n // Frozen while signing: the policy signature captures the values at\n // click time, so the form must not drift under the wallet prompt.\n disabled={isSubmitting}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {selectedToken ? (\n <>\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">on {chain?.name ?? '—'}</span>\n </div>\n </>\n ) : (\n <span className=\"text-muted-foreground flex-1 text-sm\">Select token</span>\n )}\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n {isConnectedSource && (\n <span className=\"text-muted-foreground text-sm\">\n Available {formattedWalletBalance} {selectedToken?.symbol}\n </span>\n )}\n </div>\n <div\n className={cn(\n 'border-border bg-input flex items-center gap-2 rounded-[10px] border',\n isConnectedSource ? 'py-1 pr-1 pl-3' : 'px-3 py-3'\n )}\n >\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n disabled={isSubmitting}\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 flex-1 bg-transparent text-sm outline-none\"\n />\n {isConnectedSource ? (\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n ) : isCreditCard ? (\n <span className=\"text-muted-foreground text-sm\">{selectedToken?.symbol ?? 'USD'}</span>\n ) : (\n selectedToken && (\n <span className=\"text-muted-foreground text-sm\">{selectedToken.symbol}</span>\n )\n )}\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {maxAmountDecimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n {belowMoonpayMin && moonpayMinBuy != null && (\n <p className=\"text-destructive text-sm\">Minimum purchase is ${moonpayMinBuy} USD.</p>\n )}\n {belowExternalMinimum && selectedToken && typeof externalMinimum === 'bigint' && (\n <p className=\"text-destructive text-sm\">\n Minimum deposit is {formatUnits(externalMinimum, selectedToken.decimals)}{' '}\n {selectedToken.symbol}.\n </p>\n )}\n {externalMinimumLoading && (\n <p className=\"text-muted-foreground text-sm\">Checking minimum deposit…</p>\n )}\n {externalMinimumUnavailable && (\n <p className=\"text-destructive text-sm\">\n Couldn’t load the minimum deposit. Please try again.\n </p>\n )}\n {isCreditCard && moonpayLimitsError && (\n <p className=\"text-destructive text-sm\">\n Couldn’t load purchase limits. Please try again.\n </p>\n )}\n {isCreditCard && moonpayLimitsLoading && (\n <p className=\"text-muted-foreground text-sm\">Checking purchase limits…</p>\n )}\n {creditCardUnavailable && (\n <p className=\"text-destructive text-sm\">\n {selectedToken?.symbol ?? 'This token'} isn’t available for card purchases yet.\n </p>\n )}\n {externalTokenUnavailable && (\n <p className=\"text-destructive text-sm\">\n {selectedToken?.symbol ?? 'This token'} can’t be used for external deposits. Choose an\n ERC20 token.\n </p>\n )}\n </div>\n\n {allowance && (\n <AllowancePolicySection\n allowance={allowance}\n serviceName={appName}\n serviceIcon={serviceIcon}\n />\n )}\n\n <button\n type=\"button\"\n disabled={needsConnect ? !onConnectWallet : !canDeposit || isSubmitting}\n onClick={() => {\n if (needsConnect) {\n onConnectWallet?.()\n return\n }\n if (selectedToken) onSubmit({ source, tokenId: selectedToken.id, amount })\n }}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {needsConnect ? 'Connect Wallet' : allowance ? 'Sign Policy and Deposit' : 'Deposit'}\n </button>\n </div>\n )\n}\n\nfunction SummaryRow({ value, label }: { value: string; label: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm leading-5\">\n <span className=\"text-foreground font-medium\">{value}</span>\n <span className=\"text-muted-foreground\">{label}</span>\n </div>\n )\n}\n\nconst LISTENING_WINDOW_MS = 3_600_000\n\nfunction remainingSeconds(deadline: number): number {\n return Math.max(0, Math.round((deadline - Date.now()) / 1000))\n}\n\nfunction useCountdown(deadline: number): number {\n const [secondsLeft, setSecondsLeft] = useState(() => remainingSeconds(deadline))\n useEffect(() => {\n if (remainingSeconds(deadline) <= 0) return\n const id = setInterval(() => {\n const left = remainingSeconds(deadline)\n setSecondsLeft(left)\n if (left <= 0) clearInterval(id)\n }, 1000)\n return () => clearInterval(id)\n }, [deadline])\n return secondsLeft\n}\n\nfunction AwaitingDepositStatus({\n title,\n subtitle,\n remaining,\n}: {\n title: string\n subtitle: string\n remaining?: string\n}) {\n return (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"text-foreground\">\n <Spinner size={32} />\n </div>\n <div className=\"flex flex-col gap-2\">\n <h3 className=\"text-foreground text-xl leading-6 font-medium\">{title}</h3>\n <p className=\"text-muted-foreground text-sm leading-[18px]\">\n {subtitle}\n {remaining && (\n <>\n <br />\n Remaining time: {remaining}\n </>\n )}\n </p>\n </div>\n </div>\n )\n}\n\nfunction ExternalDepositView({\n token,\n amount,\n depositAddressState,\n onCredited,\n onDiscardLock,\n lock,\n}: {\n token: TokenConfig | undefined\n amount: string\n depositAddressState: UseDepositAddressResult\n /** When set, the host owns the success UX — the inline success view is skipped. */\n onCredited?: () => void\n /** Explicitly abandons a signed session before any transfer is discovered. */\n onDiscardLock?: () => void\n /** When set, every credit routes to the pre-signed lock instead of the success views. */\n lock?: Pick<\n UseExternalDepositLockResult,\n | 'isSigning'\n | 'isSubmittingLock'\n | 'recordVerification'\n | 'settleAfterCredit'\n | 'retryAfterCredit'\n | 'clearVerification'\n | 'session'\n >\n}) {\n const { getChainById, getTokenById, serviceName } = usePrivanaContext()\n const appName = serviceName ?? 'Privana'\n const { depositAddress, isReady, isLoading } = depositAddressState\n const chain = token ? getChainById(token.chainId) : undefined\n const lockSession = lock?.session\n const recordVerification = lock?.recordVerification\n const settleAfterCredit = lock?.settleAfterCredit\n const retryAfterCredit = lock?.retryAfterCredit\n const discoveryToken = lockSession ? getTokenById(lockSession.tokenId) : token\n const [copied, setCopied] = useState(false)\n\n const [deadline] = useState(() => Date.now() + LISTENING_WINDOW_MS)\n const secondsLeft = useCountdown(deadline)\n const listening = secondsLeft > 0\n const [nothingFound, setNothingFound] = useState(false)\n const [credited, setCredited] = useState<{ txHash: string } | null>(null)\n const [showCancelWarning, setShowCancelWarning] = useState(false)\n\n const verification = useDepositVerification({\n onCredited: (txHash, _response, creditedAmount) => {\n if (settleAfterCredit) {\n void settleAfterCredit(txHash, creditedAmount)\n return\n }\n if (onCredited) {\n onCredited()\n return\n }\n setCredited({ txHash })\n },\n })\n const { isVerifying, verificationFailed, canCheckAnotherTransfer, didTimeout, verify } =\n verification\n const scanPaused =\n isVerifying ||\n verificationFailed ||\n didTimeout ||\n !!credited ||\n !!lock?.isSigning ||\n !!lock?.isSubmittingLock ||\n !!lockSession?.verification ||\n !!lockSession?.creditedAmount\n const showDepositInstructions = !credited && !lockSession?.creditedAmount\n\n const {\n pending,\n isFetching: isScanning,\n isError: isScanError,\n isRateLimited,\n isUnavailable,\n refetch: refetchPendingDeposits,\n } = usePendingDeposits({\n chainId: discoveryToken?.chainId,\n tokenAddress: discoveryToken?.contract === zeroAddress ? undefined : discoveryToken?.contract,\n enabled:\n isReady && !!depositAddress && !!discoveryToken && discoveryToken.contract !== zeroAddress,\n refetchInterval: listening && !scanPaused ? 30_000 : false,\n })\n\n const processedRef = useRef(new Set<string>())\n const verificationRunRef = useRef<string | null>(null)\n useEffect(\n () => () => {\n verificationRunRef.current = null\n },\n []\n )\n\n useEffect(() => {\n const stored = lockSession?.verification\n if (!stored || lockSession.creditedAmount || isVerifying || verificationFailed || didTimeout) {\n return\n }\n const key = `${lockSession.generation}:${stored.chainId}:${stored.hash}:${stored.logIndex ?? 0}`\n if (verificationRunRef.current === key) return\n verificationRunRef.current = key\n processedRef.current.add(`${stored.hash}:${stored.logIndex ?? 0}`)\n void verify({\n hash: stored.hash,\n chainId: stored.chainId,\n amount: BigInt(stored.amount),\n logIndex: stored.logIndex,\n })\n }, [didTimeout, isVerifying, lockSession, verificationFailed, verify])\n\n useEffect(() => {\n if (scanPaused) return\n const next = [...pending]\n .sort((a, b) => a.block_number - b.block_number)\n .find(\n (deposit) =>\n (!lockSession || isExternalDepositBlockInSession(lockSession, deposit.block_number)) &&\n !processedRef.current.has(`${deposit.tx_hash}:${deposit.log_index}`)\n )\n if (!next) return\n const context: VerificationContext = {\n hash: next.tx_hash,\n chainId: next.chain_id,\n amount: BigInt(next.amount),\n logIndex: next.log_index,\n }\n if (recordVerification) {\n try {\n recordVerification(context)\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Unable to save deposit recovery state')\n return\n }\n }\n processedRef.current.add(`${next.tx_hash}:${next.log_index}`)\n if (!recordVerification) void verify(context)\n }, [lockSession, pending, recordVerification, scanPaused, verify])\n\n const nothingFoundTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n useEffect(() => () => clearTimeout(nothingFoundTimerRef.current), [])\n\n const handleRefresh = () => {\n processedRef.current.clear()\n void refetchPendingDeposits().then((result) => {\n if (!result || result.pending.length === 0) {\n setNothingFound(true)\n clearTimeout(nothingFoundTimerRef.current)\n nothingFoundTimerRef.current = setTimeout(() => setNothingFound(false), 4000)\n }\n })\n }\n\n const handleCopy = async () => {\n if (!depositAddress) return\n try {\n await navigator.clipboard.writeText(depositAddress)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n toast.error('Unable to copy the deposit address')\n }\n }\n\n const handleCheckAnotherTransfer = () => {\n try {\n if (!lock?.clearVerification()) {\n toast.error('Deposit recovery changed in another tab. Please review the current state.')\n return\n }\n verificationRunRef.current = null\n verification.reset()\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Unable to continue deposit discovery')\n }\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n Deposit from an External Wallet\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n Transfer crypto from external wallet or exchange.\n </p>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <SummaryRow value={chain?.name ?? '—'} label=\"Chain\" />\n <div className=\"bg-border h-px w-full\" />\n <SummaryRow value={token?.symbol ?? '—'} label=\"Currency\" />\n <div className=\"bg-border h-px w-full\" />\n <SummaryRow value={amount || '—'} label=\"Value\" />\n </div>\n\n {showDepositInstructions && (\n <>\n {!scanPaused && (\n <p className=\"text-muted-foreground text-sm\">\n Send the displayed amount in one transfer. Transfers below the minimum are not\n combined or automatically returned.\n </p>\n )}\n\n <div className=\"bg-secondary flex h-50 items-center justify-center rounded-[10px]\">\n {!isReady ? (\n <p className=\"text-muted-foreground px-6 text-center text-sm\">\n Connect your wallet to generate a deposit address.\n </p>\n ) : depositAddress ? (\n <div className=\"rounded-[10px] bg-white p-3\">\n <QRCodeSVG value={depositAddress} size={160} />\n </div>\n ) : isLoading ? (\n <Skeleton className=\"h-full w-full rounded-[10px]\" />\n ) : (\n <span className=\"text-muted-foreground text-sm\">Deposit address unavailable</span>\n )}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-muted-foreground text-sm\">Deposit Address</p>\n <div className=\"flex items-center gap-3\">\n <div className=\"border-border flex h-10 min-w-0 flex-1 items-center rounded-[10px] border px-3\">\n {depositAddress ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-sm\">\n {depositAddress}\n </p>\n ) : isReady && isLoading ? (\n <Skeleton className=\"h-4 w-3/4\" />\n ) : (\n <p className=\"text-muted-foreground text-sm\">—</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!depositAddress}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 shrink-0 cursor-pointer items-center gap-2 rounded-[10px] px-3 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <CopyIcon />\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n </>\n )}\n\n {showCancelWarning &&\n lockSession &&\n !lockSession.verification &&\n !lockSession.creditedAmount ? (\n <TransactionWarningView\n title=\"Cancel this deposit?\"\n message=\"Only cancel if you have not sent funds. Canceling after a transfer was sent stops recovery and can leave the transfer uncredited or unlocked.\"\n onDone={() => onDiscardLock?.()}\n actionLabel=\"I haven’t sent funds\"\n onDismiss={() => setShowCancelWarning(false)}\n dismissLabel=\"Keep waiting\"\n />\n ) : lock?.isSigning ? (\n <AwaitingDepositStatus\n title=\"Confirm policy in your wallet\"\n subtitle=\"Sign a fresh policy for the funds already credited.\"\n />\n ) : lock?.isSubmittingLock ? (\n <AwaitingDepositStatus\n title={`Locking funds for ${appName}`}\n subtitle=\"Deposit credited. Applying your signed policy…\"\n />\n ) : lock?.session?.creditedAmount ? (\n <TransactionWarningView\n title={lock.session.submissionAmbiguous ? 'Lock status unknown' : 'Deposit credited'}\n message={\n lock.session.submissionAmbiguous\n ? 'The lock may already have succeeded. Retry only the saved signature, or check locked funds before stopping recovery.'\n : 'The deposit is credited, but its signed lock still needs to be submitted.'\n }\n onDone={() => {\n void retryAfterCredit?.().catch((err: unknown) => {\n toast.error(err instanceof Error ? err.message : 'Policy recovery failed')\n })\n }}\n actionLabel={\n lock.session.payload ? 'Retry lock submission' : 'Sign policy and lock funds'\n }\n />\n ) : credited ? (\n <TransactionSuccessView\n title=\"Deposit Credited\"\n message={`Transfer ${shortenAddress(credited.txHash)} has been credited to your Privana balance.`}\n onDone={() => {\n setCredited(null)\n verification.reset()\n void refetchPendingDeposits()\n }}\n />\n ) : verificationFailed || didTimeout ? (\n <TransactionErrorView\n title=\"Could not verify deposit\"\n message={\n didTimeout\n ? 'Verification timed out — your deposit may still be credited in the background.'\n : (verification.error?.message ??\n 'Your transfer was found but could not be verified.')\n }\n onRetry={() => void verification.retryVerification()}\n onDismiss={\n lock\n ? canCheckAnotherTransfer\n ? handleCheckAnotherTransfer\n : undefined\n : () => verification.reset()\n }\n dismissLabel={lock && canCheckAnotherTransfer ? 'Check another transfer' : undefined}\n isRetrying={isVerifying}\n />\n ) : isVerifying ? (\n <AwaitingDepositStatus\n title=\"Deposit detected\"\n subtitle=\"Crediting the incoming transaction to your Privana balance…\"\n />\n ) : (\n <>\n <AwaitingDepositStatus\n title=\"Awaiting Deposit\"\n subtitle={\n listening\n ? 'We are listening for your incoming transaction for the next hour.'\n : \"We've stopped listening automatically. Use the button below to check for your deposit.\"\n }\n remaining={listening ? formatCountdown(secondsLeft) : undefined}\n />\n\n <div className=\"flex flex-col gap-3\">\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={!depositAddress || isScanning}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Refresh deposit status\n </button>\n {lockSession && !lockSession.verification && !lockSession.creditedAmount && (\n <button\n type=\"button\"\n onClick={() => setShowCancelWarning(true)}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors\"\n >\n Cancel deposit\n </button>\n )}\n {isRateLimited ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Checked too recently. Try again in a moment.\n </p>\n ) : isUnavailable ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Deposit discovery is unavailable for this chain.\n </p>\n ) : isScanError ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n Chain temporarily unreachable. Retrying automatically.\n </p>\n ) : nothingFound ? (\n <p className=\"text-muted-foreground text-center text-sm\">\n No incoming transaction found yet.\n </p>\n ) : null}\n </div>\n </>\n )}\n </div>\n )\n}\n\nexport interface DepositMethodHandlers {\n defaultTab?: DepositMethodTab\n /** Allowance (shown as a \"policy\") the host service requests. */\n allowance?: Allowance\n onSelectConnectedWallet?: () => void\n onSelectExternalWallet?: () => void\n onSelectCreditCard?: () => void\n onConnectWallet?: () => void\n /** Called when the user confirms the amount on the deposit view. */\n onDeposit?: (args: { source: DepositSource; tokenId: string; amount: string }) => void\n /** With an allowance this fires only after the pre-signed lock is accepted. */\n onDepositSuccess?: () => void\n /** The deposit credited but the pre-signed lock failed — re-prompt. */\n onLockFailed?: (error: PostDepositLockError) => void\n}\n\nexport function DepositModalContent({\n defaultTab = 'crypto',\n allowance,\n onSelectConnectedWallet,\n onSelectExternalWallet,\n onSelectCreditCard,\n onConnectWallet,\n onDeposit,\n onDepositSuccess,\n onLockFailed,\n onClose,\n onCloseBlockedChange,\n onExit,\n}: DepositMethodHandlers & {\n onClose?: () => void\n onCloseBlockedChange?: (blocked: boolean) => void\n /** Renders a back chevron on the root method view (for embedding, e.g. WalletModal). */\n onExit?: () => void\n}) {\n const { serviceName, enabledTokens, defaultToken, hostedAuthConfig, getChainById, getTokenById } =\n usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [activeTab, setActiveTab] = useState<DepositMethodTab>(defaultTab)\n const [view, setView] = useState<DepositView>('method')\n const [source, setSource] = useState<DepositSource>('connected')\n const [selectedTokenId, setSelectedTokenId] = useState(defaultToken?.id ?? '')\n const [amount, setAmount] = useState('')\n\n const selectedToken = enabledTokens.find((t) => t.id === selectedTokenId) ?? defaultToken\n const externalDepositAddress = useDepositAddress({\n enabled: source === 'external' && (view === 'deposit' || view === 'external-deposit'),\n })\n const externalMinimum =\n source !== 'external' || !selectedToken\n ? undefined\n : externalDepositAddress.isError\n ? null\n : externalDepositAddress.response\n ? (getExternalDepositMinimum(externalDepositAddress.response, selectedToken.chainId) ??\n null)\n : undefined\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('method')\n setAmount('')\n setSelectedTokenId('')\n }\n }, [address, hostedAuthConfig])\n\n const openDeposit = (next: DepositSource) => {\n setSource(next)\n setView('deposit')\n }\n\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n const [isSubmittingLock, setIsSubmittingLock] = useState(false)\n const [lockFailure, setLockFailure] = useState<PostDepositLockError | null>(null)\n\n const finishDeposit = () => {\n setAmount('')\n if (view === 'external-deposit') setView('deposit')\n if (onDepositSuccess) {\n resetDeposit()\n onDepositSuccess()\n } else {\n setShowSuccess(true)\n }\n }\n\n // Card purchases surface success inline in the on-ramp form (the crypto\n // success view would show transfer steps that never happened), so without\n // a host callback there is nothing to do here.\n const finishCardPurchase = () => {\n setAmount('')\n onDepositSuccess?.()\n }\n\n const {\n txHash,\n isGettingAddress,\n isSwitchingChain,\n isSendingTransaction,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n verificationFailed,\n isPending,\n error: depositError,\n deposit,\n retryVerification,\n reset: resetDeposit,\n } = useDeposit({\n onCredited: (_txHash, _response, lockPending) => {\n // With an allowance the flow's promise is locked funds, not just a\n // credit — hold the progress view until the pre-signed lock settles.\n if (lockPending) {\n setIsSubmittingLock(true)\n return\n }\n finishDeposit()\n },\n onLockSubmitted: () => {\n setIsSubmittingLock(false)\n setLockFailure(null)\n finishDeposit()\n },\n // The deposit credited; only the policy lock failed. Success must not\n // fire (the host would act on unlocked funds) — show the dedicated\n // error view and let the host re-prompt for a fresh lock.\n onLockFailed: (err) => {\n setIsSubmittingLock(false)\n setLockFailure(err)\n onLockFailed?.(err)\n },\n onCheckTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n // Pre-signed lock for the external-wallet flow. The connected flow above\n // runs its lock inside useDeposit; here the transfer happens outside the\n // app, so signing (handleSubmit) and settling (ExternalDepositView's credit\n // callback) are wired separately through this hook.\n const externalLock = useExternalDepositLock({\n allowance,\n onLockSubmitted: () => {\n setLockFailure(null)\n finishDeposit()\n },\n // Same contract as the connected flow: the deposit credited, only the\n // lock failed — never report success, show the lock-error view instead.\n onLockFailed: (err) => {\n setLockFailure(err)\n onLockFailed?.(err)\n },\n })\n\n useEffect(() => {\n const restored = externalLock.session\n if (!restored) return\n const canRestore =\n view === 'method' ||\n (source === 'external' && (view === 'deposit' || view === 'external-deposit'))\n if (!canRestore) return\n const token = getTokenById(restored.tokenId)\n if (!token) return\n setSource('external')\n setSelectedTokenId(token.id)\n setAmount(formatUnits(BigInt(restored.depositAmount), token.decimals))\n setView('external-deposit')\n }, [externalLock.session, getTokenById, source, view])\n\n useEffect(() => {\n if (view === 'external-deposit' && allowance && !externalLock.session) {\n setView('deposit')\n }\n }, [allowance, externalLock.session, view])\n\n const isUnsafeToClose =\n ((isGettingAddress || isSendingTransaction) && !cancelled) ||\n externalLock.isSigning ||\n externalLock.isSubmittingLock\n useEffect(() => {\n onCloseBlockedChange?.(isUnsafeToClose)\n }, [isUnsafeToClose, onCloseBlockedChange])\n\n useEffect(() => {\n // Post-transfer verification errors get the dedicated error view below.\n if (depositError && !verificationFailed) {\n toast.error(\n depositError.message.length > 100\n ? `${depositError.message.slice(0, 100)}...`\n : depositError.message\n )\n }\n }, [depositError, verificationFailed])\n\n const handleSubmit = (args: { source: DepositSource; tokenId: string; amount: string }) => {\n if (args.source === 'external') {\n const token = enabledTokens.find((candidate) => candidate.id === args.tokenId)\n if (!token) return\n if (token.contract === zeroAddress) {\n toast.error('External deposits support ERC20 tokens only')\n return\n }\n const depositAmount = parseTokenAmount(args.amount, token.decimals)\n if (!allowance) {\n setView('external-deposit')\n return\n }\n if (typeof externalMinimum !== 'bigint') {\n toast.error('Minimum deposit is unavailable. Please try again.')\n return\n }\n if (depositAmount < externalMinimum) {\n toast.error(\n `Minimum deposit is ${formatUnits(externalMinimum, token.decimals)} ${token.symbol}`\n )\n return\n }\n externalLock\n .signAndPersist({\n tokenId: token.id,\n amount: depositAmount,\n })\n .then(() => setView('external-deposit'))\n .catch((err: unknown) => {\n toast.error(err instanceof Error ? err.message : 'Policy signing failed')\n })\n return\n }\n if (args.source === 'credit-card') {\n // The pre-signed lock for card purchases is created inside the on-ramp\n // flow itself — see the postDepositLock wiring in CreditCardWidgetView.\n setView('credit-card-widget')\n return\n }\n const token = enabledTokens.find((t) => t.id === args.tokenId)\n if (!token) return\n onDeposit?.(args)\n setCancelled(false)\n deposit({\n tokenId: token.id,\n amount: parseTokenAmount(args.amount, token.decimals),\n postDepositLock: allowance\n ? {\n maxAmount: BigInt(allowance.value),\n lockDuration: allowance.lockDuration,\n }\n : undefined,\n }).catch((err: unknown) => {\n toast.error(err instanceof Error ? err.message : 'Deposit failed')\n })\n }\n\n const targetChain = selectedToken ? getChainById(selectedToken.chainId) : undefined\n const explorerTxUrl =\n txHash && targetChain?.explorerUrl ? `${targetChain.explorerUrl}/tx/${txHash}` : undefined\n const depositSteps: Step[] = [\n {\n label: 'Getting deposit address',\n status: isGettingAddress\n ? 'active'\n : isSwitchingChain ||\n isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing ||\n isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: `Switching to ${targetChain?.name ?? 'deposit chain'}`,\n status: isSwitchingChain\n ? 'active'\n : isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing ||\n isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirm in wallet',\n status: isSendingTransaction\n ? 'active'\n : isWaitingForConfirmation || isWaitingForProcessing || isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirming transaction',\n status: isWaitingForConfirmation\n ? 'active'\n : isWaitingForProcessing || isSubmittingLock\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Verifying deposit — may take up to a few minutes',\n status: isWaitingForProcessing ? 'active' : isSubmittingLock ? 'completed' : 'pending',\n },\n ...(allowance\n ? [\n {\n label: `Locking funds for ${appName}`,\n status: isSubmittingLock ? 'active' : 'pending',\n } as Step,\n ]\n : []),\n ]\n const hasExternalLockRecovery =\n view === 'external-deposit' && !!externalLock.session?.creditedAmount\n const externalSubmissionAmbiguous =\n hasExternalLockRecovery && !!lockFailure?.submissionMayHaveSucceeded\n const savedExternalPayloadUsable =\n !!externalLock.session?.payload && isSignedLockUsable(externalLock.session.payload)\n const ambiguousRecoveryMustBeAbandoned =\n externalSubmissionAmbiguous && !savedExternalPayloadUsable\n const externalRecoveryExitLabel = externalSubmissionAmbiguous\n ? 'Stop recovery'\n : 'Keep funds unlocked'\n const lockFailureToken =\n hasExternalLockRecovery && externalLock.session\n ? (getTokenById(externalLock.session.tokenId) ?? selectedToken)\n : selectedToken\n const lockFailureMessage = formatPostDepositLockFailure(lockFailure, lockFailureToken)\n const flowView: DepositFlowView | null = showSuccess\n ? 'deposit-success'\n : lockFailure\n ? 'lock-error'\n : showTimeout\n ? 'deposit-timeout'\n : verificationFailed\n ? 'deposit-error'\n : (isPending && !cancelled) || isSubmittingLock\n ? 'depositing'\n : null\n const activeView: DepositView | DepositFlowView = flowView ?? view\n\n const handleDepositDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n resetDeposit()\n }\n\n const handleDepositCancel = () => {\n setCancelled(true)\n resetDeposit()\n }\n\n const handleLockFailedDone = () => {\n if (hasExternalLockRecovery && !externalLock.discardSession()) {\n toast.error('Deposit recovery changed in another tab. Please review the current state.')\n return\n }\n setLockFailure(null)\n setAmount('')\n setCancelled(false)\n resetDeposit()\n if (view === 'external-deposit') setView('deposit')\n }\n\n const handleExternalLockRetry = () => {\n externalLock.retryAfterCredit().catch((err: unknown) => {\n toast.error(err instanceof Error ? err.message : 'Policy signing failed')\n })\n }\n\n const handleExternalVerificationDiscard = () => {\n if (!externalLock.discardSession()) {\n toast.error('Deposit recovery changed in another tab. Please review the current state.')\n return\n }\n setAmount('')\n setView('deposit')\n }\n\n const handleDismissVerificationError = () => {\n setAmount('')\n setCancelled(false)\n resetDeposit()\n }\n\n const handleRetryVerification = () => {\n retryVerification().catch(() => {\n // Errors are already surfaced via the hook's error state and onError callback.\n })\n }\n\n const back =\n view === 'external-deposit'\n ? { to: 'deposit' as const, label: 'Deposit from External Wallet' }\n : view === 'credit-card-widget'\n ? { to: 'deposit' as const, label: 'Buy with credit card and deposit' }\n : view === 'select-token'\n ? { to: 'deposit' as const, label: 'Deposit' }\n : { to: 'method' as const, label: 'Deposit Method' }\n\n const goBack = () => {\n if (view === 'external-deposit' && externalLock.session) {\n toast.error('Cancel the active deposit from the address screen before going back')\n return\n }\n if (back.to === 'method') {\n setAmount('')\n setSelectedTokenId('')\n }\n setView(back.to)\n }\n\n return (\n <>\n {onClose && (\n <button\n data-privana-close\n onClick={onClose}\n disabled={isUnsafeToClose}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-5 w-5 items-center justify-center transition-colors',\n isUnsafeToClose\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n )}\n\n {flowView || (activeView === 'method' && !onExit) ? (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={activeView === 'method' ? onExit : goBack}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n {activeView === 'method' ? appName : back.label}\n </button>\n )}\n\n {flowView && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n {activeView === 'deposit-success' && (\n <TransactionSuccessView\n title=\"Deposit Successful\"\n message={`Your ${selectedToken?.symbol ?? ''} deposit has been processed.`}\n onDone={handleDepositDone}\n />\n )}\n {activeView === 'lock-error' && (\n <TransactionWarningView\n title={\n externalSubmissionAmbiguous\n ? 'Deposit credited, lock status unknown'\n : 'Deposit credited, lock failed'\n }\n message={\n externalSubmissionAmbiguous\n ? `Your deposit was credited, but the lock for ${appName} may already have succeeded. Retry only the saved signature; if it has expired, check locked funds before stopping recovery.`\n : `Your deposit was credited but locking the funds for ${appName} failed: ${lockFailureMessage}`\n }\n onDone={\n hasExternalLockRecovery && !ambiguousRecoveryMustBeAbandoned\n ? handleExternalLockRetry\n : handleLockFailedDone\n }\n actionLabel={\n hasExternalLockRecovery\n ? ambiguousRecoveryMustBeAbandoned\n ? externalRecoveryExitLabel\n : externalLock.session?.payload\n ? 'Retry lock submission'\n : 'Sign policy and lock funds'\n : undefined\n }\n pendingLabel={externalLock.isSigning ? 'Confirm policy in wallet…' : 'Locking funds…'}\n isPending={externalLock.isSigning || externalLock.isSubmittingLock}\n onDismiss={\n hasExternalLockRecovery && !ambiguousRecoveryMustBeAbandoned\n ? handleLockFailedDone\n : undefined\n }\n dismissLabel={externalRecoveryExitLabel}\n />\n )}\n {activeView === 'deposit-timeout' && (\n <TransactionWarningView\n title=\"Deposit Processing\"\n message=\"Your transaction was confirmed but the deposit is still being processed. Please check your balance - it should update shortly.\"\n onDone={handleDepositDone}\n />\n )}\n {activeView === 'deposit-error' && (\n <TransactionErrorView\n title=\"Verification failed\"\n message={\n depositError?.message\n ? `Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address. Retry verification instead of starting a new deposit. (${depositError.message})`\n : 'Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address. Retry verification instead of starting a new deposit.'\n }\n explorerUrl={explorerTxUrl}\n explorerLabel=\"View transaction\"\n onRetry={handleRetryVerification}\n onDismiss={handleDismissVerificationError}\n />\n )}\n {activeView === 'depositing' && (\n <TransactionProgressView\n title=\"Depositing…\"\n steps={depositSteps}\n // Only allow cancel before the transaction is confirmed (during\n // address fetch / wallet signing).\n onCancel={isGettingAddress || isSendingTransaction ? handleDepositCancel : undefined}\n />\n )}\n </div>\n )}\n\n {activeView === 'method' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">\n {activeTab === 'crypto'\n ? 'Choose the deposit method'\n : 'Buy with credit card and deposit'}\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n {activeTab === 'crypto'\n ? 'Choose the deposit method.'\n : 'Use credit card to buy crypto and deposit'}\n </p>\n </div>\n\n <MethodTabs activeTab={activeTab} onTabChange={setActiveTab} />\n\n {activeTab === 'crypto' ? (\n <div className=\"flex flex-col gap-3\">\n <MethodOption\n title=\"Connected wallet\"\n description=\"Deposit from your connected wallet.\"\n onClick={() => {\n onSelectConnectedWallet?.()\n openDeposit('connected')\n }}\n />\n <MethodOption\n title=\"External Wallet\"\n description=\"Send funds from external wallet or exchange.\"\n onClick={() => {\n onSelectExternalWallet?.()\n openDeposit('external')\n }}\n />\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n <MethodOption\n title=\"Moonpay\"\n description=\"on selected address\"\n onClick={() => {\n onSelectCreditCard?.()\n openDeposit('credit-card')\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {activeView === 'deposit' && (\n <MoonPayGate enabled={source === 'credit-card'}>\n <DepositView\n source={source}\n selectedToken={selectedToken}\n amount={amount}\n allowance={allowance}\n externalMinimum={externalMinimum}\n onAmountChange={setAmount}\n onSelectToken={() => setView('select-token')}\n onConnectWallet={onConnectWallet}\n onSubmit={handleSubmit}\n isSubmitting={isPending || externalLock.isSigning || externalLock.isSubmittingLock}\n />\n </MoonPayGate>\n )}\n\n {activeView === 'select-token' && (\n <TokenSelectorView\n selectedTokenId={selectedToken?.id}\n onSelect={(id) => {\n setSelectedTokenId(id)\n setView('deposit')\n }}\n />\n )}\n\n {activeView === 'external-deposit' && (!allowance || externalLock.session) && (\n <ExternalDepositView\n token={selectedToken}\n amount={amount}\n depositAddressState={externalDepositAddress}\n onCredited={allowance ? undefined : onDepositSuccess}\n onDiscardLock={handleExternalVerificationDiscard}\n // Routed on the signed session, not the allowance prop: once a\n // policy is signed it must settle even if the host's allowance\n // changes, and after it settles credits get the default handling.\n lock={externalLock.session ? externalLock : undefined}\n />\n )}\n\n {activeView === 'credit-card-widget' && (\n <MoonPayGate enabled>\n <CreditCardWidgetView\n token={selectedToken}\n amount={amount}\n allowance={allowance}\n // Mirrors the crypto path's lock gating: with an allowance the\n // host learns of success only once the lock is accepted. The\n // on-ramp hook also reports resumed background rows through these\n // same callbacks, which at worst ends the deposit view early or\n // surfaces an earlier purchase's lock failure — both re-promptable.\n onCredited={allowance ? undefined : finishCardPurchase}\n onLockSubmitted={finishCardPurchase}\n onLockFailed={(err) => {\n setLockFailure(err)\n onLockFailed?.(err)\n }}\n />\n </MoonPayGate>\n )}\n </>\n )\n}\n\nexport interface DepositModalProps extends DepositMethodHandlers {\n open: boolean\n onClose: () => void\n}\n\nexport function DepositModal({ open, onClose, ...handlers }: DepositModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Deposit\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Deposit funds into your account.\n </DialogDescription>\n <DepositModalContent\n onClose={handleClose}\n onCloseBlockedChange={setIsCloseBlocked}\n {...handlers}\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DepositInlineModalProps extends DepositMethodHandlers {\n className?: string\n}\n\nexport function DepositInlineModal({ className, ...handlers }: DepositInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <DepositModalContent {...handlers} />\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount } from 'wagmi'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { getExplorerAddressUrl, getExplorerLabel } from '@/sdk/types/chains'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance, useWithdraw } from '@/sdk/hooks'\nimport type { WithdrawStep } from '@/sdk/hooks'\nimport { cn, formatTokenAmount, parseTokenAmount } from '@/lib/utils'\nimport { getTokenIcon } from './token-icons'\nimport { TokenSelectorView } from './token-selector-view'\nimport { CloseIcon, ChevronLeftIcon, ChevronRightIcon } from './icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n type Step,\n} from './transaction-steps'\n\ntype WithdrawModalView = 'form' | 'select-token'\n\nfunction WithdrawView({\n selectedToken,\n amount,\n onAmountChange,\n onSelectToken,\n onPendingChange,\n}: {\n selectedToken: TokenConfig | undefined\n amount: string\n onAmountChange: (value: string) => void\n onSelectToken: () => void\n onPendingChange?: (pending: boolean) => void\n}) {\n const { chains, getChainById } = usePrivanaContext()\n const { isConnected, address } = useAccount()\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = selectedToken ? (getChainById(selectedToken.chainId) ?? chains[0]) : chains[0]\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({\n tokenId: selectedToken?.id,\n enabled: !!selectedToken,\n })\n\n const formattedBalance = selectedToken\n ? formatTokenAmount(balanceWei, selectedToken.decimals)\n : '0.00'\n\n const { withdraw, isPending, currentStep, error, reset } = useWithdraw({\n onProcessingSuccess: () => {\n onAmountChange('')\n setShowSuccess(true)\n },\n onProcessingTimeout: () => {\n onAmountChange('')\n setShowTimeout(true)\n },\n })\n\n const explorerUrl =\n address && targetChain ? getExplorerAddressUrl(targetChain.id, address) : undefined\n\n const getStepStatus = (step: WithdrawStep, after: WithdrawStep[]): Step['status'] => {\n if (currentStep === step) return 'active'\n if (after.includes(currentStep)) return 'completed'\n return 'pending'\n }\n\n const withdrawSteps: Step[] = [\n {\n label: 'Switching to signing chain',\n status: getStepStatus('switching-chain', ['signing', 'submitting', 'processing']),\n },\n { label: 'Sign in wallet', status: getStepStatus('signing', ['submitting', 'processing']) },\n { label: 'Submitting withdrawal', status: getStepStatus('submitting', ['processing']) },\n { label: 'Processing — may take a minute or two', status: getStepStatus('processing', []) },\n ]\n\n useEffect(() => {\n if (error) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n const tooManyDecimals =\n !!hasValidAmount &&\n !!selectedToken &&\n amount.includes('.') &&\n amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n !!hasValidAmount &&\n !tooManyDecimals &&\n !!selectedToken &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, selectedToken.decimals) > BigInt(balanceWei)\n\n const canWithdraw =\n isConnected && hasValidAmount && !!selectedToken && !tooManyDecimals && !exceedsBalance\n\n const handleMax = () => {\n if (!selectedToken) return\n const max = formattedBalance.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n const handleWithdraw = async () => {\n if (!selectedToken || !canWithdraw) return\n setCancelled(false)\n await withdraw({\n tokenId: selectedToken.id,\n amount: parseTokenAmount(amount, selectedToken.decimals),\n })\n }\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n if (showSuccess && selectedToken) {\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionSuccessView\n title=\"Withdrawal Complete\"\n message={`Your ${selectedToken.symbol} withdrawal has been processed. Funds should appear in your wallet shortly.`}\n explorerUrl={explorerUrl}\n explorerLabel={targetChain ? getExplorerLabel(targetChain.id) : undefined}\n onDone={handleDone}\n />\n </div>\n )\n }\n\n if (showTimeout) {\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionWarningView\n title=\"Withdrawal Processing\"\n message=\"Your withdrawal is still being processed. Please check your balance — it should update shortly.\"\n onDone={handleDone}\n />\n </div>\n )\n }\n\n if (isPending && !cancelled) {\n const canCancel =\n currentStep === 'idle' || currentStep === 'switching-chain' || currentStep === 'signing'\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Withdrawing...\"\n steps={withdrawSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n </div>\n )\n }\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <h2 className=\"text-foreground text-[28px] leading-8 font-medium\">Withdraw</h2>\n\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n type=\"button\"\n onClick={onSelectToken}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3 text-left\"\n >\n {selectedToken ? (\n <>\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">on {targetChain?.name ?? '—'}</span>\n </div>\n </>\n ) : (\n <span className=\"text-muted-foreground flex-1 text-sm\">Select token</span>\n )}\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n Available {formattedBalance} {selectedToken?.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 flex-1 bg-transparent text-sm outline-none\"\n />\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && selectedToken && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n type=\"button\"\n disabled={!canWithdraw}\n onClick={handleWithdraw}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {!isConnected ? 'Connect Wallet' : 'Withdraw'}\n </button>\n </div>\n )\n}\n\nexport function WithdrawModalContent({\n onClose,\n onPendingChange,\n onBack,\n}: {\n onClose?: () => void\n onPendingChange?: (pending: boolean) => void\n /** Renders a back chevron on the form view (for embedding, e.g. WalletModal). */\n onBack?: () => void\n}) {\n const { serviceName, enabledTokens, defaultToken, hostedAuthConfig } = usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [view, setView] = useState<WithdrawModalView>('form')\n const [selectedTokenId, setSelectedTokenId] = useState(defaultToken?.id ?? '')\n const [amount, setAmount] = useState('')\n const [isPending, setIsPending] = useState(false)\n\n const handlePendingChange = (pending: boolean) => {\n setIsPending(pending)\n onPendingChange?.(pending)\n }\n\n const selectedToken = enabledTokens.find((t) => t.id === selectedTokenId) ?? defaultToken\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('form')\n setAmount('')\n setSelectedTokenId('')\n }\n }, [address, hostedAuthConfig])\n\n return (\n <>\n {onClose && !isPending && (\n <button\n data-privana-close\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground absolute top-6 right-5 z-20 flex h-5 w-5 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n\n {view === 'select-token' ? (\n <button\n type=\"button\"\n onClick={() => setView('form')}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n Withdraw\n </button>\n ) : onBack && !isPending ? (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-foreground flex w-fit cursor-pointer items-center gap-2 px-5 py-4 text-sm font-medium transition-opacity hover:opacity-70\"\n >\n <ChevronLeftIcon />\n {appName}\n </button>\n ) : (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n )}\n\n {view === 'form' && (\n <WithdrawView\n selectedToken={selectedToken}\n amount={amount}\n onAmountChange={setAmount}\n onSelectToken={() => setView('select-token')}\n onPendingChange={handlePendingChange}\n />\n )}\n\n {view === 'select-token' && (\n <TokenSelectorView\n selectedTokenId={selectedToken?.id}\n onSelect={(id) => {\n setSelectedTokenId(id)\n setView('form')\n }}\n />\n )}\n </>\n )\n}\n\nexport interface WithdrawModalProps {\n open: boolean\n onClose: () => void\n}\n\nexport function WithdrawModal({ open, onClose }: WithdrawModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Withdraw\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Withdraw funds from your account.\n </DialogDescription>\n <WithdrawModalContent onClose={handleClose} onPendingChange={setIsCloseBlocked} />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface WithdrawInlineModalProps {\n className?: string\n}\n\nexport function WithdrawInlineModal({ className }: WithdrawInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <WithdrawModalContent />\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport { useAccount } from 'wagmi'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance } from '@/sdk/hooks'\nimport { cn, formatTimeRemaining, formatTokenAmount, parseTokenAmount } from '@/lib/utils'\nimport { CloseIcon } from './icons'\nimport { AllowancePolicySection } from './allowance-policy-section'\nimport { DepositModalContent, type DepositMethodHandlers } from './deposit-modal'\nimport { WithdrawModalContent } from './withdraw-modal'\nimport { TransactionProgressView, TransactionErrorView } from './transaction-steps'\n\nconst AVAILABLE_COLOR = 'bg-[#007bff]'\nconst IN_USE_COLOR = 'bg-[#4fc77f]'\n\nexport interface WalletSession {\n /** Funds committed to the active session, in the display token's base units. */\n inUse: string | bigint\n /** Unix timestamp (seconds) when the session lock expires; shows the countdown. */\n expiry?: number\n}\n\nexport interface WalletModalHandlers extends DepositMethodHandlers {\n session?: WalletSession\n // `unknown` (rather than `void | Promise<void>`) preserves the void-return-callback\n // leniency: callers may pass value-returning async handlers (e.g. `async () => receipt`).\n // The runtime return value is inspected internally to decide whether to show progress.\n onFundSession?: (args: { tokenId: string; amount: string }) => unknown\n onEndSession?: () => Promise<void>\n}\n\nfunction toInUseWei(value: string | bigint): bigint {\n let parsed: bigint\n try {\n parsed = typeof value === 'bigint' ? value : BigInt(value)\n } catch {\n console.warn(`[privana-sdk] Invalid session.inUse value: ${value}`)\n return 0n\n }\n if (parsed < 0n) {\n console.warn(`[privana-sdk] Negative session.inUse value: ${value}`)\n return 0n\n }\n return parsed\n}\n\nfunction useNow(intervalMs: number, enabled: boolean) {\n const [, setTick] = useState(0)\n useEffect(() => {\n if (!enabled) return\n const id = setInterval(() => setTick((t) => t + 1), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs, enabled])\n}\n\nfunction SegmentedBalanceBar({\n availableWei,\n inUseWei,\n}: {\n availableWei: bigint\n inUseWei: bigint\n}) {\n const total = availableWei + inUseWei\n // With no funds at all, show a full \"available\" track.\n const showAvailable = inUseWei === 0n || availableWei > 0n\n const showInUse = inUseWei > 0n\n const grow = (part: bigint) => (total > 0n ? Number((part * 1000n) / total) : 1)\n\n return (\n <div className=\"flex h-1.5 w-full\">\n {showAvailable && (\n <div\n className={cn(AVAILABLE_COLOR, 'rounded-l-full', !showInUse && 'rounded-r-full')}\n style={{ flexGrow: grow(availableWei) }}\n />\n )}\n {showInUse && (\n <div\n className={cn(IN_USE_COLOR, 'rounded-r-full', !showAvailable && 'rounded-l-full')}\n style={{ flexGrow: grow(inUseWei) }}\n />\n )}\n </div>\n )\n}\n\nfunction BalanceLegendItem({ color, label }: { color: string; label: string }) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className={cn('h-2.5 w-2.5 rounded-full', color)} />\n <span className=\"text-foreground text-sm leading-5\">{label}</span>\n </div>\n )\n}\n\ntype BalanceVariant = 'idle' | 'session-zero' | 'fully-in-use' | 'mixed'\n\nfunction WalletBalanceView({\n session,\n allowance,\n amount,\n onAmountChange,\n onFundSession,\n onAddFunds,\n onWithdraw,\n}: {\n session?: WalletSession\n allowance?: WalletModalHandlers['allowance']\n amount: string\n onAmountChange: (value: string) => void\n onFundSession?: WalletModalHandlers['onFundSession']\n onAddFunds?: () => void\n onWithdraw?: () => void\n}) {\n const { serviceName, serviceIcon, defaultToken } = usePrivanaContext()\n const appName = serviceName ?? 'Privana'\n const token = defaultToken\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({ tokenId: token?.id, enabled: !!token })\n\n const inUseWei = session ? toInUseWei(session.inUse) : 0n\n const availableWei = BigInt(balanceWei)\n const variant: BalanceVariant = !session\n ? 'idle'\n : inUseWei === 0n\n ? 'session-zero'\n : availableWei === 0n\n ? 'fully-in-use'\n : 'mixed'\n\n const expiry = session?.expiry\n useNow(30_000, expiry != null)\n const countdown = expiry != null ? formatTimeRemaining(expiry) : null\n\n const decimals = token?.decimals ?? 18\n const totalFormatted = formatTokenAmount((availableWei + inUseWei).toString(), decimals)\n const availableFormatted = formatTokenAmount(availableWei.toString(), decimals)\n const inUseFormatted = formatTokenAmount(inUseWei.toString(), decimals)\n\n const hasValidAmount = !!amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount &&\n !!token &&\n amount.includes('.') &&\n amount.split('.')[1].length > token.decimals\n // Only available funds can be committed to a session — in-use funds are\n // already locked.\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n !!token &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, token.decimals) > availableWei\n\n const canFundSession =\n hasValidAmount &&\n !!token &&\n !tooManyDecimals &&\n !exceedsBalance &&\n !isBalanceLoading &&\n !isBalanceError\n\n const handleMax = () => {\n const max = availableFormatted.replace(/\\s/g, '')\n if (parseFloat(max) > 0) onAmountChange(max)\n }\n\n const handleFundSession = () => {\n if (!token || !canFundSession || !onFundSession) return\n onFundSession({ tokenId: token.id, amount })\n }\n\n const showInput = variant !== 'fully-in-use'\n const showInlineFund = variant === 'session-zero' || variant === 'mixed'\n\n return (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm leading-[14px]\">Total</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] leading-[10px] font-bold\">\n {token?.symbol ?? '—'}\n </span>\n </div>\n {isBalanceLoading ? (\n <Skeleton className=\"h-9 w-40\" />\n ) : isBalanceError ? (\n <span className=\"text-muted-foreground text-[32px] leading-9 font-medium\">—</span>\n ) : (\n <span className=\"text-foreground text-[32px] leading-9 font-medium\">\n {totalFormatted}\n </span>\n )}\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <SegmentedBalanceBar availableWei={availableWei} inUseWei={inUseWei} />\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n {variant === 'fully-in-use' ? (\n <BalanceLegendItem color={IN_USE_COLOR} label=\"In use\" />\n ) : variant === 'mixed' ? (\n <>\n <BalanceLegendItem\n color={AVAILABLE_COLOR}\n label={`Available (${availableFormatted})`}\n />\n <BalanceLegendItem color={IN_USE_COLOR} label={`In use (${inUseFormatted})`} />\n </>\n ) : (\n <BalanceLegendItem color={AVAILABLE_COLOR} label=\"Available\" />\n )}\n </div>\n {countdown && (\n <span className=\"text-muted-foreground text-sm leading-5 whitespace-nowrap\">\n {countdown}\n </span>\n )}\n </div>\n </div>\n\n {showInput && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"border-border bg-input flex h-10 flex-1 items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) onAmountChange(value)\n }}\n className=\"text-foreground placeholder:text-muted-foreground/50 min-w-0 flex-1 bg-transparent text-sm outline-none\"\n />\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"text-foreground cursor-pointer rounded px-3 py-2.5 text-xs font-semibold\"\n >\n MAX\n </button>\n </div>\n {showInlineFund && (\n <button\n type=\"button\"\n disabled={!onFundSession || !canFundSession}\n onClick={handleFundSession}\n className=\"border-border flex h-10 min-w-20 cursor-pointer items-center justify-center rounded-[10px] border px-3 text-sm font-medium text-[#4fc77f] transition-opacity hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Fund session\n </button>\n )}\n </div>\n {tooManyDecimals && token && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {token.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n )}\n\n {variant === 'idle' && allowance && (\n <div className=\"bg-muted rounded-[10px] p-4\">\n <AllowancePolicySection\n allowance={allowance}\n serviceName={appName}\n serviceIcon={serviceIcon}\n />\n </div>\n )}\n\n <div className=\"flex items-start gap-4\">\n {variant === 'idle' ? (\n <>\n <button\n type=\"button\"\n disabled={!onFundSession || !canFundSession}\n onClick={handleFundSession}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Fund session\n </button>\n <button\n type=\"button\"\n disabled={!onAddFunds}\n onClick={onAddFunds}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Add funds\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n disabled={!onAddFunds}\n onClick={onAddFunds}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Add Funds\n </button>\n <button\n type=\"button\"\n disabled={!onWithdraw}\n onClick={onWithdraw}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Withdraw\n </button>\n </>\n )}\n </div>\n </div>\n )\n}\n\ntype WalletView =\n | 'balance'\n | 'deposit'\n | 'funding-session'\n | 'fund-session-error'\n | 'ending-session'\n | 'end-session-error'\n | 'withdraw'\n\n/**\n * Invoke a session handler (onFundSession/onEndSession) guarded by a run token.\n *\n * Shared by the fund- and end-session flows so they cannot diverge: a\n * synchronous throw is caught and routed to `onError` exactly like a rejected\n * promise (so the error view is always entered), a non-thenable result calls\n * `onSyncResult` (lets callers skip progress UI for synchronous handlers), and\n * a thenable calls `onAsyncStart` then resolves/rejects. Stale runs —\n * superseded by a retry or an account switch — are ignored.\n */\nfunction invokeGuarded(\n runRef: { current: number },\n invoke: () => unknown,\n handlers: {\n onSyncResult: () => void\n onAsyncStart: () => void\n onSuccess: () => void\n onError: (err: unknown) => void\n }\n) {\n const run = ++runRef.current\n const isCurrent = () => runRef.current === run\n\n let result: unknown\n try {\n result = invoke()\n } catch (err) {\n if (isCurrent()) handlers.onError(err)\n return\n }\n\n if (result == null || typeof (result as { then?: unknown }).then !== 'function') {\n handlers.onSyncResult()\n return\n }\n\n handlers.onAsyncStart()\n ;(result as Promise<unknown>).then(\n () => {\n if (isCurrent()) handlers.onSuccess()\n },\n (err: unknown) => {\n if (isCurrent()) handlers.onError(err)\n }\n )\n}\n\nfunction WalletModalContent({\n session,\n allowance,\n onFundSession,\n onEndSession,\n onDepositSuccess,\n onClose,\n onCloseBlockedChange,\n ...depositHandlers\n}: WalletModalHandlers & {\n onClose?: () => void\n onCloseBlockedChange?: (blocked: boolean) => void\n}) {\n const { serviceName, hostedAuthConfig } = usePrivanaContext()\n const { address } = useAccount()\n const appName = serviceName ?? 'Privana'\n const [view, setView] = useState<WalletView>('balance')\n const [amount, setAmount] = useState('')\n const [depositBlocked, setDepositBlocked] = useState(false)\n const [withdrawPending, setWithdrawPending] = useState(false)\n const [endSessionError, setEndSessionError] = useState<string | null>(null)\n const [fundSessionError, setFundSessionError] = useState<string | null>(null)\n\n const endSessionRunRef = useRef(0)\n const fundSessionRunRef = useRef(0)\n const [pendingFundSession, setPendingFundSession] = useState<{\n tokenId: string\n amount: string\n } | null>(null)\n\n const prevAddressRef = useRef(address)\n useEffect(() => {\n const prev = prevAddressRef.current\n prevAddressRef.current = address\n if (hostedAuthConfig) return\n if (prev && address && prev !== address) {\n setView('balance')\n setAmount('')\n setDepositBlocked(false)\n setWithdrawPending(false)\n setEndSessionError(null)\n setFundSessionError(null)\n setPendingFundSession(null)\n endSessionRunRef.current++\n fundSessionRunRef.current++\n }\n }, [address, hostedAuthConfig])\n\n const closeBlocked =\n depositBlocked || withdrawPending || view === 'funding-session' || view === 'ending-session'\n useEffect(() => {\n onCloseBlockedChange?.(closeBlocked)\n }, [closeBlocked, onCloseBlockedChange])\n\n const exitDeposit = () => {\n // The embedded content unmounts, so its onCloseBlockedChange(false) never fires.\n setDepositBlocked(false)\n setView('balance')\n }\n\n const exitWithdraw = () => {\n setWithdrawPending(false)\n setView('balance')\n }\n\n const startEndSession = () => {\n if (!onEndSession) return\n setEndSessionError(null)\n invokeGuarded(endSessionRunRef, () => onEndSession(), {\n onSyncResult: () => setView('withdraw'),\n onAsyncStart: () => setView('ending-session'),\n onSuccess: () => setView('withdraw'),\n onError: (err: unknown) => {\n setEndSessionError(err instanceof Error ? err.message : null)\n setView('end-session-error')\n },\n })\n }\n\n const handleWithdraw = () => {\n if (session && onEndSession) {\n startEndSession()\n } else {\n setView('withdraw')\n }\n }\n\n const dismissEndSessionError = () => {\n endSessionRunRef.current++\n setEndSessionError(null)\n setView('balance')\n }\n\n const fundSession = (args: { tokenId: string; amount: string }) => {\n if (!onFundSession) return\n setFundSessionError(null)\n setPendingFundSession(args)\n setAmount('')\n invokeGuarded(fundSessionRunRef, () => onFundSession(args), {\n onSyncResult: () => {\n setPendingFundSession(null)\n setView('balance')\n },\n onAsyncStart: () => setView('funding-session'),\n onSuccess: () => {\n setPendingFundSession(null)\n setView('balance')\n },\n onError: (err: unknown) => {\n setFundSessionError(err instanceof Error ? err.message : null)\n setView('fund-session-error')\n },\n })\n }\n\n const dismissFundSessionError = () => {\n fundSessionRunRef.current++\n setFundSessionError(null)\n if (pendingFundSession) {\n setAmount(pendingFundSession.amount)\n setPendingFundSession(null)\n }\n setView('balance')\n }\n\n return (\n <>\n {onClose && (\n <button\n data-privana-close\n onClick={onClose}\n disabled={closeBlocked}\n aria-label=\"Close\"\n className={cn(\n 'absolute top-6 right-5 z-20 flex h-5 w-5 items-center justify-center transition-colors',\n closeBlocked\n ? 'text-muted-foreground/40 cursor-not-allowed'\n : 'text-muted-foreground hover:text-foreground cursor-pointer'\n )}\n >\n <CloseIcon />\n </button>\n )}\n\n {(view === 'balance' ||\n view === 'funding-session' ||\n view === 'fund-session-error' ||\n view === 'ending-session' ||\n view === 'end-session-error') && (\n <div className=\"flex items-center px-5 py-4\">\n <span className=\"text-foreground text-xl leading-5 font-medium\">{appName}</span>\n </div>\n )}\n\n {view === 'balance' && (\n <WalletBalanceView\n session={session}\n allowance={allowance}\n amount={amount}\n onAmountChange={setAmount}\n onFundSession={onFundSession ? fundSession : undefined}\n onAddFunds={() => setView('deposit')}\n onWithdraw={session && !onEndSession ? undefined : handleWithdraw}\n />\n )}\n\n {view === 'funding-session' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Funding session...\"\n steps={[{ label: 'Waiting for the session to be funded', status: 'active' }]}\n />\n </div>\n )}\n\n {view === 'fund-session-error' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionErrorView\n title=\"Could not fund session\"\n message={\n fundSessionError\n ? `Your session could not be funded. (${fundSessionError})`\n : 'Your session could not be funded.'\n }\n onRetry={() => {\n if (pendingFundSession) fundSession(pendingFundSession)\n }}\n onDismiss={dismissFundSessionError}\n retryLabel=\"Try again\"\n />\n </div>\n )}\n\n {view === 'ending-session' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionProgressView\n title=\"Ending game session...\"\n steps={[{ label: 'Waiting for the game session to settle', status: 'active' }]}\n />\n </div>\n )}\n\n {view === 'end-session-error' && (\n <div className=\"bg-muted flex flex-col gap-6 rounded-[10px] p-5\">\n <TransactionErrorView\n title=\"Could not end session\"\n message={\n endSessionError\n ? `Your game session could not be ended, so the funds committed to it are not available to withdraw yet. (${endSessionError})`\n : 'Your game session could not be ended, so the funds committed to it are not available to withdraw yet.'\n }\n onRetry={startEndSession}\n onDismiss={dismissEndSessionError}\n retryLabel=\"Try again\"\n />\n </div>\n )}\n\n {view === 'withdraw' && (\n <WithdrawModalContent onBack={exitWithdraw} onPendingChange={setWithdrawPending} />\n )}\n\n {view === 'deposit' && (\n <DepositModalContent\n {...depositHandlers}\n allowance={allowance}\n onExit={exitDeposit}\n onCloseBlockedChange={setDepositBlocked}\n onDepositSuccess={() => {\n exitDeposit()\n onDepositSuccess?.()\n }}\n />\n )}\n </>\n )\n}\n\nexport interface WalletModalProps extends WalletModalHandlers {\n open: boolean\n onClose: () => void\n}\n\nexport function WalletModal({ open, onClose, ...handlers }: WalletModalProps) {\n const titleId = useId()\n const descId = useId()\n const [isCloseBlocked, setIsCloseBlocked] = useState(false)\n\n const handleClose = () => {\n if (!isCloseBlocked) onClose()\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleClose()\n }}\n >\n <DialogContent\n data-privana\n showCloseButton={false}\n onInteractOutside={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={isCloseBlocked ? (e) => e.preventDefault() : undefined}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 rounded-2xl border-0 p-2\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogTitle id={titleId} className=\"sr-only\">\n Wallet\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Manage your account balance.\n </DialogDescription>\n <WalletModalContent\n onClose={handleClose}\n onCloseBlockedChange={setIsCloseBlocked}\n {...handlers}\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface WalletInlineModalProps extends WalletModalHandlers {\n className?: string\n}\n\nexport function WalletInlineModal({ className, ...handlers }: WalletInlineModalProps) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card relative flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <WalletModalContent {...handlers} />\n </div>\n )\n}\n"]}