@oasisprotocol/privana-sdk 0.5.7 → 0.5.9

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../shared/config.json","../src/sdk/types/common.ts","../src/sdk/types/chains.ts","../src/sdk/auth/auth-clock-skew.ts","../src/sdk/auth/hosted-auth.ts","../src/sdk/auth/siwe.ts","../src/sdk/client/errors.ts","../src/sdk/client/http-client.ts","../src/sdk/client/privana-client.ts","../src/sdk/signatures/eip712-types.ts","../src/sdk/signatures/sign-lock.ts","../src/sdk/signatures/sign-modify-lock.ts","../src/sdk/signatures/sign-transfer.ts","../src/sdk/signatures/sign-transfer-locked.ts","../src/sdk/signatures/sign-withdraw.ts","../src/sdk/signatures/sign-withdraw-from-lock.ts","../src/sdk/hooks/use-safe-account.ts","../src/sdk/auth/siwe-persistence.ts","../src/sdk/auth/siwe-auth-policy.ts","../src/sdk/auth/auth-lifecycle.ts","../src/sdk/auth/auth-lifecycle-effects.ts","../src/sdk/auth/siwe-auth-controller.ts","../src/sdk/hooks/private-read-token-store.ts","../src/sdk/hooks/use-siwe-auth-lifecycle.ts","../src/sdk/context/siwe-auth-provider.tsx","../src/sdk/moonpay-currency-codes.ts","../src/sdk/context/privana-provider.tsx","../src/sdk/hooks/browser-storage.ts","../src/sdk/hooks/pending-lock.ts","../src/sdk/hooks/deposit-finality.ts","../src/sdk/hooks/use-private-read-request.ts","../src/sdk/hooks/use-deposit-verification.ts","../src/sdk/on-ramp/product-config.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/skeleton.tsx","../src/sdk/on-ramp/moonpay-adapter.ts","../../../node_modules/@wagmi/core/src/utils/getAction.ts","../../../node_modules/@wagmi/core/src/version.ts","../../../node_modules/@wagmi/core/src/utils/getVersion.ts","../../../node_modules/@wagmi/core/src/errors/base.ts","../../../node_modules/@wagmi/core/src/errors/config.ts","../../../node_modules/@wagmi/core/src/actions/getConnectorClient.ts","../../../node_modules/@wagmi/core/src/actions/getBlockNumber.ts","../../../node_modules/@wagmi/core/src/actions/getChainId.ts","../../../node_modules/@wagmi/core/src/actions/getTransactionReceipt.ts","../../../node_modules/@wagmi/core/src/actions/getWalletClient.ts","../../../node_modules/@wagmi/core/src/actions/waitForTransactionReceipt.ts","../src/sdk/on-ramp/provider.ts","../src/sdk/on-ramp/recovery.ts","../src/sdk/on-ramp/receipt.ts","../src/sdk/on-ramp/settlement.ts","../src/sdk/hooks/use-ensure-correct-chain.ts","../src/sdk/hooks/use-on-ramp.ts","../src/sdk/hooks/use-fiat-on-ramp.ts","../src/components/privana/use-moonpay-on-ramp-adapter.tsx","../src/components/privana/fiat-on-ramp-form.tsx","../src/sdk/on-ramp/transak-adapter.ts","../src/sdk/on-ramp/transak-frame.tsx","../src/sdk/hooks/use-transak-on-ramp.tsx"],"names":["createSiweMessage","useContext","WagmiContext","useRef","useCallback","watchAccount","getAccount","useSyncExternalStore","activeAddress","useState","useMemo","getWalletClient","useEffect","createContext","jsx","zeroAddress","getChainById","token","useQueryClient","error","parseUnits","twMerge","clsx","cva","Slot","_BaseError_walk","connector","chainId","parseAccount","getAddress","chain","createClient","custom","viem_getBlockNumber","getChainId","viem_getTransactionReceipt","walletActions","viem_waitForTransactionReceipt","getTransaction","call","hexToString","parseAbiItem","decodeEventLog","useConfig","useChainId","useSwitchChain","useAccount","useWalletClient","errorPayload","MoonPayBuyWidget","formatUnits","jsxs","Loader2","CircleCheckIcon","isPlainRecord","hasProviderEvidence"],"mappings":"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","file":"chunk-KCXYYUUG.cjs","sourcesContent":["{\n \"chains\": [\n {\n \"id\": 84532,\n \"name\": \"Base Sepolia\",\n \"explorerUrl\": \"https://sepolia.basescan.org\",\n \"explorerName\": \"BaseScan\"\n },\n {\n \"id\": 11155111,\n \"name\": \"Ethereum Sepolia\",\n \"explorerUrl\": \"https://sepolia.etherscan.io\",\n \"explorerName\": \"Etherscan\"\n },\n {\n \"id\": 1,\n \"name\": \"Ethereum\",\n \"explorerUrl\": \"https://etherscan.io\",\n \"explorerName\": \"Etherscan\"\n },\n {\n \"id\": 8453,\n \"name\": \"Base\",\n \"explorerUrl\": \"https://basescan.org\",\n \"explorerName\": \"BaseScan\"\n },\n {\n \"id\": 999,\n \"name\": \"HyperEVM\",\n \"explorerUrl\": \"https://hyperevmscan.io\",\n \"explorerName\": \"HyperEVMScan\"\n }\n ],\n \"networks\": {\n \"testnet\": {\n \"chainId\": 23295,\n \"name\": \"Sapphire Testnet\",\n \"accountingContract\": \"0x910CFfe4e8B27bc367F6E34D6D8e3C31DED68B6f\",\n \"apiUrl\": \"https://api.testnet.privana.finance\"\n },\n \"mainnet\": {\n \"chainId\": 23294,\n \"name\": \"Sapphire Mainnet\",\n \"accountingContract\": \"0x5f16C90a0F410AE4Cdb76d9964f5FFDDeE305876\",\n \"apiUrl\": \"https://api.privana.finance\"\n }\n }\n}\n","import config from '@shared/config.json'\n\nexport type Address = `0x${string}`\nexport type Bytes32 = `0x${string}`\nexport type HexString = `0x${string}`\nexport type IntegerLike = string | number\n// Mirrors backend protocol support for authorize URL construction.\n// High-level hosted auth in the provider/hooks layer is intentionally redirect-only.\nexport type HostedAuthResponseMode = 'web_message' | 'redirect'\n\nexport type Network = keyof typeof config.networks\n\nexport interface NetworkConfig {\n chainId: number\n name: string\n accountingContract: Address\n apiUrl: string\n /** Versioned MoonPay REST API base URL (default: 'https://api.moonpay.com/v3'). */\n moonpayApiUrl?: string\n /**\n * MoonPay publishable API key ('pk_test_…' / 'pk_live_…' — MoonPay infers the\n * environment from the prefix). Enables the credit-card deposit flow: the SDK\n * mounts its own MoonPayProvider around the credit-card subtree, so consumers\n * don't wrap the app in one (and don't pay MoonPay's CDN script cost at app start).\n */\n moonpayApiKey?: string\n}\n\nexport const NETWORK_CONFIG = {\n testnet: {\n ...config.networks.testnet,\n accountingContract: config.networks.testnet.accountingContract as Address,\n },\n mainnet: {\n ...config.networks.mainnet,\n accountingContract: config.networks.mainnet.accountingContract as Address,\n },\n} as const satisfies Record<Network, NetworkConfig>\n\nexport function getChainId(network: Network): number {\n return NETWORK_CONFIG[network].chainId\n}\n\nexport function getAccountingContract(network: Network): Address {\n return NETWORK_CONFIG[network].accountingContract\n}\n\nexport function getApiUrl(network: Network): string {\n return NETWORK_CONFIG[network].apiUrl\n}\n\nexport function normalizeHex(value: string): HexString {\n const normalized = value.trim().toLowerCase()\n return (normalized.startsWith('0x') ? normalized : `0x${normalized}`) as HexString\n}\n\nexport function normalizeAddress(value: string): Address {\n return normalizeHex(value) as Address\n}\n","import config from '@shared/config.json'\n\nexport interface ChainConfig {\n id: number\n name: string\n explorerUrl: string\n explorerName: string\n}\n\nexport const SUPPORTED_CHAINS: ChainConfig[] = config.chains.map((chain) => ({\n id: chain.id,\n name: chain.name,\n explorerUrl: chain.explorerUrl,\n explorerName: chain.explorerName,\n}))\n\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.find((c) => c.id === chainId)\n}\n\nexport function getExplorerLabel(chainId: number): string {\n const chain = getChainById(chainId)\n return `View on ${chain?.explorerName ?? 'Explorer'}`\n}\n\nexport function getExplorerAddressUrl(chainId: number, address: string): string | undefined {\n const chain = getChainById(chainId)\n if (!chain) return undefined\n return `${chain.explorerUrl}/address/${address}#tokentxns`\n}\n","/**\n * Safety margin applied to every auth token-expiry check, in milliseconds. Treating tokens as\n * expired slightly early absorbs clock skew and request latency, so refreshes and cache evictions\n * fire before the real deadline.\n */\nexport const AUTH_CLOCK_SKEW_MS = 30_000\n","import type {\n HostedAuthCallback,\n HostedAuthConfig,\n HostedAuthPendingTransaction,\n HostedAuthSession,\n HostedAuthTokenExchangeResponse,\n JwtRefreshResponse,\n} from '../types'\n\nimport { AUTH_CLOCK_SKEW_MS } from './auth-clock-skew'\n\nexport const HOSTED_AUTH_CLOCK_SKEW_MS = AUTH_CLOCK_SKEW_MS\n\nconst PKCE_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'\nconst DEFAULT_RANDOM_LENGTH = 64\nconst HOSTED_AUTH_CALLBACK_QUERY_KEYS = ['code', 'error', 'error_description', 'state'] as const\n\ntype StorageLike = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n\nfunction randomString(length: number): string {\n const values = new Uint8Array(length)\n crypto.getRandomValues(values)\n let output = ''\n for (const value of values) {\n output += PKCE_CHARSET[value % PKCE_CHARSET.length]\n }\n return output\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n let binary = ''\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte)\n })\n\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nexport function createPkceVerifier(length = DEFAULT_RANDOM_LENGTH): string {\n return randomString(length)\n}\n\nexport async function createPkceChallenge(verifier: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier))\n return toBase64Url(new Uint8Array(digest))\n}\n\nexport function createHostedAuthState(length = DEFAULT_RANDOM_LENGTH): string {\n return randomString(length)\n}\n\nexport function createHostedAuthStorageKey(apiUrl: string, config: HostedAuthConfig): string {\n const normalizedApiUrl = apiUrl.replace(/\\/$/, '')\n return [\n 'privana',\n 'hosted-auth',\n normalizedApiUrl,\n config.clientId.trim(),\n config.redirectUri.trim(),\n ].join(':')\n}\n\nexport function createHostedAuthPendingStorageKey(\n apiUrl: string,\n config: HostedAuthConfig\n): string {\n return `${createHostedAuthStorageKey(apiUrl, config)}:pending`\n}\n\nexport function persistHostedAuthPendingTransaction(\n storage: StorageLike,\n key: string,\n transaction: HostedAuthPendingTransaction\n): void {\n storage.setItem(key, JSON.stringify(transaction))\n}\n\nexport function readHostedAuthPendingTransaction(\n storage: StorageLike,\n key: string\n): HostedAuthPendingTransaction | null {\n const raw = storage.getItem(key)\n if (!raw) return null\n\n try {\n const parsed = JSON.parse(raw) as Partial<HostedAuthPendingTransaction>\n if (typeof parsed.codeVerifier !== 'string' || typeof parsed.state !== 'string') {\n return null\n }\n\n return {\n codeVerifier: parsed.codeVerifier,\n state: parsed.state,\n }\n } catch {\n return null\n }\n}\n\nexport function clearHostedAuthPendingTransaction(storage: StorageLike, key: string): void {\n storage.removeItem(key)\n}\n\nexport function parseHostedAuthCallback(url: URL, redirectUri: string): HostedAuthCallback | null {\n const expectedUrl = new URL(redirectUri)\n if (url.origin !== expectedUrl.origin || url.pathname !== expectedUrl.pathname) {\n return null\n }\n\n const code = url.searchParams.get('code')\n if (code) {\n return {\n code,\n state: url.searchParams.get('state'),\n }\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n return {\n error,\n errorDescription: url.searchParams.get('error_description') ?? undefined,\n state: url.searchParams.get('state'),\n }\n }\n\n return null\n}\n\nexport function stripHostedAuthCallbackParams(url: URL): string {\n const nextUrl = new URL(url.toString())\n HOSTED_AUTH_CALLBACK_QUERY_KEYS.forEach((key) => {\n nextUrl.searchParams.delete(key)\n })\n\n return `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`\n}\n\nexport function buildHostedAuthSession(\n response: HostedAuthTokenExchangeResponse,\n config: HostedAuthConfig,\n now = Date.now()\n): HostedAuthSession {\n return {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n idToken: response.id_token,\n tokenType: response.token_type,\n address: response.address,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n expiresAt: now + response.expires_in * 1000,\n refreshExpiresAt: now + response.refresh_expires_in * 1000,\n }\n}\n\nexport function applyRefreshResponse(\n session: HostedAuthSession,\n response: JwtRefreshResponse,\n now = Date.now()\n): HostedAuthSession {\n return {\n ...session,\n accessToken: response.token,\n refreshToken: response.refresh_token,\n expiresAt: now + response.expires_in * 1000,\n refreshExpiresAt: now + response.refresh_expires_in * 1000,\n }\n}\n\nexport function isHostedAuthSessionActive(\n session: HostedAuthSession,\n now = Date.now(),\n skewMs = HOSTED_AUTH_CLOCK_SKEW_MS\n): boolean {\n return session.expiresAt > now + skewMs\n}\n\nexport function isHostedAuthRefreshActive(\n session: HostedAuthSession,\n now = Date.now(),\n skewMs = HOSTED_AUTH_CLOCK_SKEW_MS\n): boolean {\n return session.refreshExpiresAt > now + skewMs\n}\n","import { createSiweMessage } from 'viem/siwe'\nimport type { Address } from '../types'\n\n/** How long a signed SIWE session stays valid. The nonce expires much sooner, but the backend\n * expects the signed message itself to cover the auth-token window. */\nexport const SIWE_MESSAGE_VALIDITY_MS = 24 * 60 * 60 * 1000\n\nexport type SiweMessageValue = ReturnType<typeof createSiweMessage>\n\nexport interface SiweMessageApi {\n getSiweDomain(): Promise<{ domain: string }>\n getSiweNonce(address: Address): Promise<{ nonce: string }>\n}\n\nexport function buildSiweStatement(chainId: number): string {\n return `Sign in to Privana on chain ${chainId}`\n}\n\n/** Fetches the domain + nonce and assembles the message both SIWE login paths sign. */\nexport async function buildSiweLoginMessage(\n api: SiweMessageApi,\n params: { address: Address; chainId: number; apiUrl: string }\n): Promise<{ message: SiweMessageValue; expirationTime: Date }> {\n const { address, chainId, apiUrl } = params\n const [{ domain }, { nonce }] = await Promise.all([\n api.getSiweDomain(),\n api.getSiweNonce(address),\n ])\n const issuedAt = new Date()\n const expirationTime = new Date(issuedAt.getTime() + SIWE_MESSAGE_VALIDITY_MS)\n const uri =\n typeof window !== 'undefined' && window.location.origin ? window.location.origin : apiUrl\n\n const message = createSiweMessage({\n address,\n chainId,\n domain,\n expirationTime,\n issuedAt,\n nonce,\n statement: buildSiweStatement(chainId),\n uri,\n version: '1',\n })\n return { message, expirationTime }\n}\n","export class AccountingApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly detail?: string\n ) {\n super(message)\n this.name = 'AccountingApiError'\n Object.setPrototypeOf(this, AccountingApiError.prototype)\n }\n}\n\nexport class NetworkError extends Error {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message)\n this.name = 'NetworkError'\n Object.setPrototypeOf(this, NetworkError.prototype)\n }\n}\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n public readonly field?: string\n ) {\n super(message)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\nexport class HostedAuthError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'HostedAuthError'\n Object.setPrototypeOf(this, HostedAuthError.prototype)\n }\n}\n\nexport class HostedAuthRequiredError extends HostedAuthError {\n constructor(\n message = 'Hosted redirect authentication is required. Start login with useHostedRedirectAuth().'\n ) {\n super(message)\n this.name = 'HostedAuthRequiredError'\n Object.setPrototypeOf(this, HostedAuthRequiredError.prototype)\n }\n}\n\nexport class HostedAuthStateMismatchError extends HostedAuthError {\n constructor(message = 'Hosted authentication returned an invalid state value.') {\n super(message)\n this.name = 'HostedAuthStateMismatchError'\n Object.setPrototypeOf(this, HostedAuthStateMismatchError.prototype)\n }\n}\n","import { AccountingApiError, NetworkError } from './errors'\n\nexport interface HttpClientConfig {\n baseUrl: string\n timeout?: number\n headers?: Record<string, string>\n}\n\nexport class HttpClient {\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly headers: Record<string, string>\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.timeout = config.timeout ?? 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...config.headers,\n }\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path)\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, body)\n }\n\n getBaseUrl(): string {\n return this.baseUrl\n }\n\n setHeader(name: string, value: string): void {\n this.headers[name] = value\n }\n\n removeHeader(name: string): void {\n delete this.headers[name]\n }\n\n getHeader(name: string): string | undefined {\n return this.headers[name]\n }\n\n private async request<T>(method: 'GET' | 'POST', path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n let detail: string | undefined\n try {\n const errorBody = await response.json()\n detail = errorBody.detail || errorBody.error_description || errorBody.message\n } catch {\n detail = await response.text().catch(() => undefined)\n }\n\n throw new AccountingApiError(\n `API request failed: ${response.status} ${response.statusText}`,\n response.status,\n detail\n )\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof AccountingApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new NetworkError(`Request timeout after ${this.timeout}ms`)\n }\n throw new NetworkError(`Network request failed: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error occurred')\n }\n }\n}\n","import { HttpClient, type HttpClientConfig } from './http-client'\nimport type {\n Address,\n Bytes32,\n DepositAddressRequest,\n DepositAddressResponse,\n DepositCheckRequest,\n DepositCheckResponse,\n PendingDepositsRequest,\n PendingDepositsResponse,\n HostedAuthAuthorizeUrlRequest,\n HostedAuthTokenExchangeRequest,\n HostedAuthTokenExchangeResponse,\n JwtLogoutRequest,\n JwtLogoutResponse,\n JwtRefreshRequest,\n JwtRefreshResponse,\n LockFundsRequest,\n ModifyLockRequest,\n HistoryRequest,\n UnlockFundsRequest,\n UnlockAllExpiredRequest,\n TransferFundsRequest,\n TransferLockedFundsRequest,\n WithdrawalRequest,\n WithdrawFromLockRequest,\n BatchBalancesRequest,\n TransactionSubmissionResponse,\n BalanceResponse,\n BatchBalancesResponse,\n HistoryResponse,\n TokenInfoResponse,\n LockedFundsResponse,\n ExpiredLocksResponse,\n TotalLockedBalanceResponse,\n PendingWithdrawalsResponse,\n WithdrawalInfoResponse,\n TransferNonceResponse,\n WithdrawalNonceResponse,\n LockNonceResponse,\n ModifyLockNonceResponse,\n TransferLockedNonceResponse,\n SiweDomainResponse,\n SiweNonceResponse,\n SiweLoginRequest,\n SiweLoginResponse,\n TokenListResponse,\n CreateOnRampIntentRequest,\n CreateOnRampIntentResponse,\n CreateOnRampSessionRequest,\n OnRampSessionResponse,\n PendingOnRampsResponse,\n SignOnRampUrlRequest,\n SignOnRampUrlResponse,\n UpdateOnRampRequest,\n UpdateOnRampResponse,\n} from '../types'\nimport { normalizeAddress, normalizeHex } from '../types'\n\nexport type PrivanaClientConfig = HttpClientConfig\nconst PRIVATE_READ_TOKEN_HEADER = 'X-SIWE-Token'\nconst MAX_BATCH_BALANCE_TOKEN_IDS = 100\nconst MAX_HISTORY_PAGE_SIZE = 100\n\nexport class PrivanaClient {\n private readonly http: HttpClient\n private readonly baseConfig: PrivanaClientConfig\n\n constructor(config: PrivanaClientConfig) {\n this.http = new HttpClient(config)\n this.baseConfig = { ...config, headers: { ...config.headers } }\n }\n\n getBaseUrl(): string {\n return this.http.getBaseUrl()\n }\n\n async getDepositAddress(request: DepositAddressRequest = {}): Promise<DepositAddressResponse> {\n return this.http.post<DepositAddressResponse>('/v1/accounting/deposits/address', {\n chain_type: request.chain_type ?? 'evm',\n version: request.version ?? 0,\n })\n }\n\n async checkDeposit(request: DepositCheckRequest): Promise<DepositCheckResponse> {\n return this.http.post<DepositCheckResponse>('/v1/accounting/deposits/check', {\n chain_type: request.chain_type ?? 'evm',\n chain_id: request.chain_id,\n tx_hash: normalizeHex(request.tx_hash),\n amount: String(request.amount),\n log_index: request.log_index ?? 0,\n version: request.version ?? 0,\n })\n }\n\n async getDepositStatus(depositId: string): Promise<DepositCheckResponse> {\n return this.http.get<DepositCheckResponse>(`/v1/accounting/deposits/status/${depositId}`)\n }\n\n async getPendingDeposits(request: PendingDepositsRequest): Promise<PendingDepositsResponse> {\n const params = new URLSearchParams({ chain_id: String(request.chain_id) })\n if (request.version !== undefined) params.set('version', String(request.version))\n if (request.token_address !== undefined) {\n params.set('token_address', normalizeAddress(request.token_address))\n }\n if (request.lookback_blocks !== undefined) {\n params.set('lookback_blocks', String(request.lookback_blocks))\n }\n return this.http.get<PendingDepositsResponse>(\n `/v1/accounting/deposits/pending?${params.toString()}`\n )\n }\n\n async getBalance(tokenId: Bytes32 | string): Promise<BalanceResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<BalanceResponse>(`/v1/accounting/balances/${token}`)\n }\n\n async getBatchBalances(request: BatchBalancesRequest): Promise<BatchBalancesResponse> {\n if (request.token_ids.length > MAX_BATCH_BALANCE_TOKEN_IDS) {\n throw new Error(\n `Batch balance requests support at most ${MAX_BATCH_BALANCE_TOKEN_IDS} token IDs`\n )\n }\n\n return this.http.post<BatchBalancesResponse>('/v1/accounting/balances/batch', {\n token_ids: request.token_ids.map((id) => normalizeHex(id)),\n })\n }\n\n async getHistory(request: HistoryRequest = {}): Promise<HistoryResponse> {\n const offset = request.offset ?? -1\n const limit = request.limit ?? 50\n\n if (!Number.isSafeInteger(offset)) {\n throw new Error('History offset must be an integer')\n }\n if (!Number.isSafeInteger(limit)) {\n throw new Error('History limit must be an integer')\n }\n if (limit < 0 || limit > MAX_HISTORY_PAGE_SIZE) {\n throw new Error(`History requests support between 0 and ${MAX_HISTORY_PAGE_SIZE} entries`)\n }\n\n const params = new URLSearchParams({\n offset: String(offset),\n limit: String(limit),\n })\n return this.http.get<HistoryResponse>(`/v1/accounting/history?${params.toString()}`)\n }\n\n async listTokens(): Promise<TokenListResponse> {\n return this.http.get<TokenListResponse>('/v1/accounting/tokens')\n }\n\n async getTokenInfo(tokenId: Bytes32 | string): Promise<TokenInfoResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<TokenInfoResponse>(`/v1/accounting/tokens/${token}`)\n }\n\n async lockFunds(request: LockFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/lock', {\n service_address: normalizeAddress(request.service_address),\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n expiry: String(request.expiry),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async modifyLock(request: ModifyLockRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/modify-lock', {\n lock_id: request.lock_id,\n amount: String(request.amount),\n new_expiry: String(request.new_expiry),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async unlockFunds(request: UnlockFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/unlock', {\n user_address: normalizeAddress(request.user_address),\n lock_id: request.lock_id,\n })\n }\n\n async unlockAllExpired(request: UnlockAllExpiredRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>(\n '/v1/accounting/funds/unlock-all-expired',\n {\n user_address: normalizeAddress(request.user_address),\n }\n )\n }\n\n async getLockedFunds(serviceAddress?: Address | string): Promise<LockedFundsResponse> {\n const queryParams = serviceAddress ? `?service_address=${normalizeAddress(serviceAddress)}` : ''\n return this.http.get<LockedFundsResponse>(`/v1/accounting/funds/locked${queryParams}`)\n }\n\n async getTotalLockedBalance(tokenId: Bytes32 | string): Promise<TotalLockedBalanceResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<TotalLockedBalanceResponse>(`/v1/accounting/funds/locked/total/${token}`)\n }\n\n async getExpiredLocks(): Promise<ExpiredLocksResponse> {\n return this.http.get<ExpiredLocksResponse>('/v1/accounting/funds/expired')\n }\n\n async transferFunds(request: TransferFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/transfer', {\n to_address: normalizeAddress(request.to_address),\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async getTransferNonce(userAddress: Address | string): Promise<TransferNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<TransferNonceResponse>(`/v1/accounting/funds/transfer/nonce/${user}`)\n }\n\n async getLockNonce(userAddress: Address | string): Promise<LockNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<LockNonceResponse>(`/v1/accounting/funds/lock/nonce/${user}`)\n }\n\n async getModifyLockNonce(userAddress: Address | string): Promise<ModifyLockNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<ModifyLockNonceResponse>(`/v1/accounting/funds/modify-lock/nonce/${user}`)\n }\n\n async transferLockedFunds(\n request: TransferLockedFundsRequest\n ): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/transfer-locked', {\n user_address: normalizeAddress(request.user_address),\n lock_id: request.lock_id,\n to_address: normalizeAddress(request.to_address),\n amount: String(request.amount),\n service_address: normalizeAddress(request.service_address),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async withdrawFromLock(request: WithdrawFromLockRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>(\n '/v1/accounting/funds/withdraw-from-lock',\n {\n to_address: normalizeAddress(request.to_address),\n lock_id: request.lock_id,\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n }\n )\n }\n\n async requestWithdrawal(request: WithdrawalRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/withdraw', {\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async getWithdrawalNonce(userAddress: Address | string): Promise<WithdrawalNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<WithdrawalNonceResponse>(`/v1/accounting/withdraw/nonce/${user}`)\n }\n\n async getTransferLockedNonce(\n serviceAddress: Address | string\n ): Promise<TransferLockedNonceResponse> {\n const service = normalizeAddress(serviceAddress)\n return this.http.get<TransferLockedNonceResponse>(\n `/v1/accounting/funds/transfer-locked/nonce/${service}`\n )\n }\n\n async getPendingWithdrawals(userAddress: Address | string): Promise<PendingWithdrawalsResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<PendingWithdrawalsResponse>(`/v1/accounting/withdraw/pending/${user}`)\n }\n\n async getWithdrawalInfo(index: number): Promise<WithdrawalInfoResponse> {\n return this.http.get<WithdrawalInfoResponse>(`/v1/accounting/withdraw/${index}`)\n }\n\n async getSiweDomain(): Promise<SiweDomainResponse> {\n return this.http.get<SiweDomainResponse>('/v1/accounting/auth/domain')\n }\n\n async getSiweNonce(userAddress: Address | string): Promise<SiweNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<SiweNonceResponse>(`/v1/accounting/auth/nonce?address=${user}`)\n }\n\n async loginWithSiwe(request: SiweLoginRequest): Promise<SiweLoginResponse> {\n return this.http.post<SiweLoginResponse>('/v1/accounting/auth/login', {\n siwe_message: request.siwe_message,\n signature: normalizeHex(request.signature),\n })\n }\n\n getHostedAuthAuthorizeUrl(request: HostedAuthAuthorizeUrlRequest): string {\n const url = new URL(\n 'v1/accounting/auth/authorize',\n `${this.http.getBaseUrl().replace(/\\/$/, '')}/`\n )\n url.searchParams.set('client_id', request.client_id)\n url.searchParams.set('redirect_uri', request.redirect_uri)\n url.searchParams.set('code_challenge', request.code_challenge)\n url.searchParams.set('state', request.state)\n url.searchParams.set('chain_id', String(request.chain_id))\n url.searchParams.set('response_mode', request.response_mode ?? 'redirect')\n url.searchParams.set('code_challenge_method', request.code_challenge_method ?? 'S256')\n return url.toString()\n }\n\n async exchangeHostedAuthCode(\n request: HostedAuthTokenExchangeRequest\n ): Promise<HostedAuthTokenExchangeResponse> {\n return this.http.post<HostedAuthTokenExchangeResponse>('/v1/accounting/auth/token', {\n grant_type: request.grant_type ?? 'authorization_code',\n code: request.code,\n code_verifier: request.code_verifier,\n client_id: request.client_id,\n redirect_uri: request.redirect_uri,\n })\n }\n\n async refreshJwtSession(request: JwtRefreshRequest): Promise<JwtRefreshResponse> {\n return this.http.post<JwtRefreshResponse>('/v1/accounting/auth/jwt/refresh', {\n refresh_token: request.refresh_token,\n })\n }\n\n async logoutJwtSession(request: JwtLogoutRequest = {}): Promise<JwtLogoutResponse> {\n return this.http.post<JwtLogoutResponse>('/v1/accounting/auth/jwt/logout', {\n refresh_token: request.refresh_token,\n revoke_all: request.revoke_all ?? false,\n })\n }\n\n async signOnRampUrl(request: SignOnRampUrlRequest): Promise<SignOnRampUrlResponse> {\n return this.http.post<SignOnRampUrlResponse>('/v1/accounting/onramp/sign-url', {\n url: request.url,\n })\n }\n\n async createOnRampIntent(\n request: CreateOnRampIntentRequest\n ): Promise<CreateOnRampIntentResponse> {\n return this.http.post<CreateOnRampIntentResponse>('/v1/accounting/onramp/intent', {\n wallet_address: request.wallet_address ? normalizeAddress(request.wallet_address) : undefined,\n token_id: normalizeHex(request.token_id),\n chain_id: request.chain_id,\n moonpay_currency_code: request.moonpay_currency_code,\n })\n }\n\n async createOnRampSession(request: CreateOnRampSessionRequest): Promise<OnRampSessionResponse> {\n return this.http.post<OnRampSessionResponse>('/v1/accounting/onramp/session', {\n transaction_id: request.transaction_id,\n ip_attestation: request.ip_attestation,\n })\n }\n\n async updateOnRamp(\n transactionId: string,\n request: UpdateOnRampRequest\n ): Promise<UpdateOnRampResponse> {\n return this.http.post<UpdateOnRampResponse>(\n `/v1/accounting/onramp/${encodeURIComponent(transactionId)}`,\n {\n wallet_address: request.wallet_address\n ? normalizeAddress(request.wallet_address)\n : undefined,\n token_id: request.token_id ? normalizeHex(request.token_id) : undefined,\n chain_id: request.chain_id,\n moonpay_transaction_id: request.moonpay_transaction_id,\n base_currency_code: request.base_currency_code,\n base_currency_amount: request.base_currency_amount,\n quote_currency_amount: request.quote_currency_amount,\n on_chain_tx_hash: request.on_chain_tx_hash\n ? normalizeHex(request.on_chain_tx_hash)\n : undefined,\n deposit_tx_hash: request.deposit_tx_hash\n ? normalizeHex(request.deposit_tx_hash)\n : undefined,\n }\n )\n }\n\n async getPendingOnRamps(\n externalTransactionIds: readonly string[] = []\n ): Promise<PendingOnRampsResponse> {\n const params = new URLSearchParams()\n for (const transactionId of externalTransactionIds.slice(0, 10)) {\n params.append('externalTransactionId', transactionId)\n }\n const query = params.toString()\n return this.http.get<PendingOnRampsResponse>(\n `/v1/accounting/onramp/pending${query ? `?${query}` : ''}`\n )\n }\n\n /**\n * @deprecated This mutates the shared client's headers and displaces its Authorization\n * (JWT bearer) header, which breaks concurrent JWT-authenticated requests. Use\n * {@link PrivanaClient.withPrivateReadToken} instead, which returns a scoped client that\n * authenticates the private read without touching the shared client's headers. Will be\n * removed in a future release.\n */\n setPrivateReadToken(token: string): void {\n this.http.removeHeader('Authorization')\n this.http.setHeader(PRIVATE_READ_TOKEN_HEADER, token)\n }\n\n /**\n * @deprecated The shared client no longer carries a private-read token between requests;\n * private reads now run on a scoped client from {@link PrivanaClient.withPrivateReadToken}.\n * Returns whatever X-SIWE-Token is currently set on the shared client's headers. Will be\n * removed in a future release.\n */\n getPrivateReadToken(): string | undefined {\n return this.http.getHeader(PRIVATE_READ_TOKEN_HEADER)\n }\n\n clearPrivateReadToken(): void {\n this.http.removeHeader(PRIVATE_READ_TOKEN_HEADER)\n }\n\n setBearerToken(token: string): void {\n this.http.removeHeader(PRIVATE_READ_TOKEN_HEADER)\n this.http.setHeader('Authorization', `Bearer ${token}`)\n }\n\n clearBearerToken(): void {\n this.http.removeHeader('Authorization')\n }\n\n /**\n * Returns a scoped client whose requests authenticate with the given SIWE private-read\n * token (X-SIWE-Token) instead of the client-wide JWT bearer. The scoped client shares\n * baseUrl/timeout/base headers but owns a separate header set, so private reads issued\n * through it never displace the real client's Authorization header: concurrent\n * JWT-authenticated requests on the real client keep their bearer, and a bearer installed\n * mid-flight (auto-login/hydration) is never erased by a private read.\n */\n withPrivateReadToken(token: string): PrivanaClient {\n const headers: Record<string, string> = {}\n for (const [name, value] of Object.entries(this.baseConfig.headers ?? {})) {\n const lower = name.toLowerCase()\n if (lower === 'authorization' || lower === PRIVATE_READ_TOKEN_HEADER.toLowerCase()) {\n continue\n }\n headers[name] = value\n }\n headers[PRIVATE_READ_TOKEN_HEADER] = token\n return new PrivanaClient({ ...this.baseConfig, headers })\n }\n}\n","import type { Address, Bytes32 } from '../types'\n\nexport interface EIP712Domain {\n name: string\n version: string\n chainId: number\n verifyingContract: Address\n}\n\nexport function createDomain(chainId: number, verifyingContract: Address): EIP712Domain {\n return {\n name: 'AccountingModule',\n version: '1',\n chainId,\n verifyingContract,\n }\n}\n\nexport const LOCK_TYPES = {\n Lock: [\n { name: 'serviceAddress', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'expiry', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const TRANSFER_TYPES = {\n Transfer: [\n { name: 'toAddress', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const TRANSFER_LOCKED_TYPES = {\n TransferLocked: [\n { name: 'userAddress', type: 'address' },\n { name: 'toAddress', type: 'address' },\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'serviceAddress', type: 'address' },\n ],\n} as const\n\nexport const WITHDRAW_TYPES = {\n Withdraw: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const MODIFY_LOCK_TYPES = {\n ModifyLock: [\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'newExpiry', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const WITHDRAW_FROM_LOCK_TYPES = {\n WithdrawFromLock: [\n { name: 'userAddress', type: 'address' },\n { name: 'toAddress', type: 'address' },\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport interface LockMessage {\n serviceAddress: Address\n tokenId: Bytes32\n amount: bigint\n expiry: bigint\n nonce: bigint\n}\n\nexport interface TransferMessage {\n toAddress: Address\n tokenId: Bytes32\n amount: bigint\n nonce: bigint\n}\n\nexport interface TransferLockedMessage {\n userAddress: Address\n toAddress: Address\n lockId: bigint\n amount: bigint\n nonce: bigint\n serviceAddress: Address\n}\n\nexport interface WithdrawMessage {\n tokenId: Bytes32\n amount: bigint\n nonce: bigint\n}\n\nexport interface ModifyLockMessage {\n lockId: bigint\n amount: bigint\n newExpiry: bigint\n nonce: bigint\n}\n\nexport interface WithdrawFromLockMessage {\n userAddress: Address\n toAddress: Address\n lockId: bigint\n amount: bigint\n nonce: bigint\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, LOCK_TYPES, type LockMessage } from './eip712-types'\n\nexport interface SignLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: LockMessage\n}\n\nexport async function signLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: LOCK_TYPES,\n primaryType: 'Lock',\n message,\n })\n\n return signature\n}\n\nexport function createLockExpiry(minutesFromNow: number = 60): bigint {\n return BigInt(Math.floor(Date.now() / 1000) + minutesFromNow * 60)\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, MODIFY_LOCK_TYPES, type ModifyLockMessage } from './eip712-types'\n\nexport interface SignModifyLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: ModifyLockMessage\n}\n\nexport async function signModifyLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignModifyLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: MODIFY_LOCK_TYPES,\n primaryType: 'ModifyLock',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, TRANSFER_TYPES, type TransferMessage } from './eip712-types'\n\nexport interface SignTransferParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: TransferMessage\n}\n\nexport async function signTransferMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignTransferParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: TRANSFER_TYPES,\n primaryType: 'Transfer',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, TRANSFER_LOCKED_TYPES, type TransferLockedMessage } from './eip712-types'\n\nexport interface SignTransferLockedParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: TransferLockedMessage\n}\n\nexport async function signTransferLockedMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignTransferLockedParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: TRANSFER_LOCKED_TYPES,\n primaryType: 'TransferLocked',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, WITHDRAW_TYPES, type WithdrawMessage } from './eip712-types'\n\nexport interface SignWithdrawParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: WithdrawMessage\n}\n\nexport async function signWithdrawMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignWithdrawParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: WITHDRAW_TYPES,\n primaryType: 'Withdraw',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport {\n createDomain,\n WITHDRAW_FROM_LOCK_TYPES,\n type WithdrawFromLockMessage,\n} from './eip712-types'\n\nexport interface SignWithdrawFromLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: WithdrawFromLockMessage\n}\n\nexport async function signWithdrawFromLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignWithdrawFromLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: WITHDRAW_FROM_LOCK_TYPES,\n primaryType: 'WithdrawFromLock',\n message,\n })\n\n return signature\n}\n","'use client'\n\nimport { useContext, useSyncExternalStore, useRef, useCallback } from 'react'\nimport { WagmiContext } from 'wagmi'\nimport { getAccount, watchAccount } from 'wagmi/actions'\nimport type { Address } from 'viem'\n\ntype AccountStatus = 'connecting' | 'reconnecting' | 'connected' | 'disconnected'\n\ninterface SafeAccountResult {\n address: Address | undefined\n isConnected: boolean\n status: AccountStatus\n}\n\nconst defaultResult: SafeAccountResult = {\n address: undefined,\n isConnected: false,\n status: 'disconnected',\n}\n\nexport function useSafeAccount(): SafeAccountResult {\n const context = useContext(WagmiContext)\n const cacheRef = useRef<SafeAccountResult>(defaultResult)\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n if (!context) return () => {}\n return watchAccount(context, { onChange })\n },\n [context]\n )\n\n const getSnapshot = useCallback(() => {\n if (!context) return defaultResult\n const account = getAccount(context)\n if (\n cacheRef.current.address !== account.address ||\n cacheRef.current.isConnected !== account.isConnected ||\n cacheRef.current.status !== account.status\n ) {\n cacheRef.current = {\n address: account.address,\n isConnected: account.isConnected,\n status: account.status,\n }\n }\n return cacheRef.current\n }, [context])\n\n const getServerSnapshot = useCallback(() => defaultResult, [])\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","/**\n * Opt-in persistence for the direct (in-app) SIWE auth flow.\n *\n * Storage access fails softly: when `localStorage` is blocked (e.g. private browsing) or a write\n * fails, the session continues in memory only and a single warning is emitted. Storing long-lived\n * refresh credentials in `localStorage` exposes them to XSS exfiltration; integrations must weigh\n * that risk before opting in.\n */\n\nimport type { JwtRefreshResponse, SiweLoginResponse } from '../types'\nimport { AUTH_CLOCK_SKEW_MS } from './auth-clock-skew'\n\nexport const PERSISTED_SIWE_AUTH_RECORD_VERSION = 2\n\nexport type StorageLike = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n\n/** Structurally `SiweAuthTokens`, but typed with plain strings since the values come from JSON. */\nexport interface PersistedSiweAuthTokens {\n siwe_token: string\n jwt_access_token: string\n jwt_refresh_token: string\n address: string\n}\n\nexport interface PersistedSiweAuthRecord {\n version: number\n tokens: PersistedSiweAuthTokens\n accessTokenExpiresAt: number\n refreshTokenExpiresAt: number\n /** Absolute expiry (ms epoch) of the SIWE token, established at login and preserved across JWT refreshes. */\n siweTokenExpiresAt: number\n updatedAt: number\n}\n\nlet warnedBlockedStorage = false\n\nfunction warnBlockedStorageOnce(): void {\n if (warnedBlockedStorage) return\n warnedBlockedStorage = true\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn(\n 'Privana SIWE auth: localStorage is unavailable or blocked; sessions will stay in memory only.'\n )\n }\n}\n\nexport function createSiweAuthStorageKey(apiUrl: string, chainId: number): string {\n const normalizedApiUrl = apiUrl.replace(/\\/$/, '')\n return ['privana', 'siwe-auth', normalizedApiUrl, String(chainId)].join(':')\n}\n\nexport function buildPersistedSiweAuthRecordFromLogin(\n response: SiweLoginResponse,\n now: number,\n siweTokenExpiresAt: number\n): PersistedSiweAuthRecord {\n return {\n version: PERSISTED_SIWE_AUTH_RECORD_VERSION,\n tokens: {\n siwe_token: response.siwe_token,\n jwt_access_token: response.jwt_access_token,\n jwt_refresh_token: response.jwt_refresh_token,\n address: response.address,\n },\n accessTokenExpiresAt: now + response.jwt_expires_in * 1000,\n refreshTokenExpiresAt: now + response.jwt_refresh_expires_in * 1000,\n siweTokenExpiresAt,\n updatedAt: now,\n }\n}\n\nexport function applyRefreshToPersistedSiweAuthRecord(\n previous: PersistedSiweAuthRecord,\n response: JwtRefreshResponse,\n now = Date.now()\n): PersistedSiweAuthRecord {\n return {\n ...previous,\n tokens: {\n ...previous.tokens,\n jwt_access_token: response.token,\n jwt_refresh_token: response.refresh_token,\n },\n accessTokenExpiresAt: now + response.expires_in * 1000,\n refreshTokenExpiresAt: now + response.refresh_expires_in * 1000,\n updatedAt: now,\n }\n}\n\nexport function isPersistedSiweAuthRecord(value: unknown): value is PersistedSiweAuthRecord {\n if (typeof value !== 'object' || value === null) return false\n const record = value as Record<string, unknown>\n if (record.version !== PERSISTED_SIWE_AUTH_RECORD_VERSION) return false\n if (typeof record.accessTokenExpiresAt !== 'number') return false\n if (typeof record.refreshTokenExpiresAt !== 'number') return false\n if (typeof record.siweTokenExpiresAt !== 'number') return false\n if (typeof record.updatedAt !== 'number') return false\n const tokens = record.tokens\n if (typeof tokens !== 'object' || tokens === null) return false\n const tokenFields = tokens as Record<string, unknown>\n return (\n typeof tokenFields.siwe_token === 'string' &&\n typeof tokenFields.jwt_access_token === 'string' &&\n typeof tokenFields.jwt_refresh_token === 'string' &&\n typeof tokenFields.address === 'string' &&\n tokenFields.address.length > 0\n )\n}\n\nexport function isPersistedSiweAuthAccessActive(\n record: PersistedSiweAuthRecord,\n now = Date.now()\n): boolean {\n return record.accessTokenExpiresAt > now + AUTH_CLOCK_SKEW_MS\n}\n\nexport function isPersistedSiweAuthRefreshActive(\n record: PersistedSiweAuthRecord,\n now = Date.now()\n): boolean {\n return record.refreshTokenExpiresAt > now + AUTH_CLOCK_SKEW_MS\n}\n\n/** Validates a raw payload without touching storage. Used for cross-tab `storage` events. */\nexport function parsePersistedSiweAuthRecord(\n raw: string,\n now = Date.now()\n): PersistedSiweAuthRecord | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n if (!isPersistedSiweAuthRecord(parsed)) return null\n if (!isPersistedSiweAuthRefreshActive(parsed, now)) return null\n return parsed\n}\n\n/**\n * Reads and validates the persisted record, removing malformed, unsupported, or expired entries.\n * Returns `null` (without writing) when storage access itself throws.\n */\nexport function readPersistedSiweAuth(\n storage: StorageLike,\n key: string,\n now = Date.now()\n): PersistedSiweAuthRecord | null {\n let raw: string | null\n try {\n raw = storage.getItem(key)\n } catch {\n return null\n }\n if (raw == null) return null\n\n const record = parsePersistedSiweAuthRecord(raw, now)\n if (!record) removePersistedSiweAuth(storage, key)\n return record\n}\n\nexport function writePersistedSiweAuth(\n storage: StorageLike,\n key: string,\n record: PersistedSiweAuthRecord\n): void {\n try {\n storage.setItem(key, JSON.stringify(record))\n } catch {\n warnBlockedStorageOnce()\n }\n}\n\nexport function removePersistedSiweAuth(storage: StorageLike, key: string): void {\n try {\n storage.removeItem(key)\n } catch {\n // Ignored: a blocked remove must never invalidate an otherwise successful session.\n }\n}\n\nlet localStorageProbe: Storage | null | undefined\n\n/**\n * Returns the shared `localStorage`, or `null` on the server or when access is blocked. Probes\n * with a read once per process so Safari private mode (which throws on access) is detected.\n */\nexport function getSiweAuthLocalStorage(): Storage | null {\n if (localStorageProbe !== undefined) return localStorageProbe\n if (typeof window === 'undefined') return null\n try {\n const storage = window.localStorage\n storage.getItem('__privana_siwe_probe__')\n localStorageProbe = storage\n } catch {\n warnBlockedStorageOnce()\n localStorageProbe = null\n }\n return localStorageProbe\n}\n\n/**\n * A record is adoptable when it targets the same wallet and is newer than the record this tab last\n * applied. Used to adopt another tab's rotations before/after a refresh.\n */\nexport function isAdoptableRecord(\n record: PersistedSiweAuthRecord | null,\n currentAddress: string | null,\n currentUpdatedAt: number | null\n): boolean {\n if (!record || !currentAddress) return false\n if (record.tokens.address.toLowerCase() !== currentAddress.toLowerCase()) return false\n return record.updatedAt > (currentUpdatedAt ?? -1)\n}\n\nexport type HydrationAction =\n | { type: 'restore'; record: PersistedSiweAuthRecord }\n | { type: 'refresh'; record: PersistedSiweAuthRecord }\n | { type: 'remove' }\n | { type: 'dormant' }\n\n/** Decides what to do with a persisted record once a wallet has settled. */\nexport function resolveHydrationAction(\n record: PersistedSiweAuthRecord | null,\n connectedAddress: string | null,\n now = Date.now()\n): HydrationAction {\n if (!connectedAddress) return { type: 'dormant' }\n if (!record) return { type: 'dormant' }\n if (record.tokens.address.toLowerCase() !== connectedAddress.toLowerCase()) {\n return { type: 'remove' }\n }\n if (isPersistedSiweAuthAccessActive(record, now)) return { type: 'restore', record }\n if (isPersistedSiweAuthRefreshActive(record, now)) return { type: 'refresh', record }\n return { type: 'remove' }\n}\n\nexport type StorageEventAction =\n | { type: 'logout' }\n | { type: 'adopt'; record: PersistedSiweAuthRecord }\n | { type: 'ignore' }\n\n/** Decides how to react to a cross-tab `storage` event for the SIWE auth key. */\nexport function resolveStorageEvent(\n newValue: string | null,\n currentAddress: string | null,\n currentUpdatedAt: number | null,\n now = Date.now()\n): StorageEventAction {\n if (!currentAddress) return { type: 'ignore' }\n if (newValue == null) return { type: 'logout' }\n const record = parsePersistedSiweAuthRecord(newValue, now)\n if (!record) return { type: 'ignore' }\n if (!isAdoptableRecord(record, currentAddress, currentUpdatedAt)) return { type: 'ignore' }\n return { type: 'adopt', record }\n}\n","/**\n * Pure auth-policy planners for the direct (in-app) SIWE auth flow: what the connection-driven\n * effect should do (auto-login / disconnect / address-mismatch invalidation) and which address this\n * tab treats as its active auth authority. Pure so the provider stays a thin executor and each rule\n * is unit-testable in isolation.\n */\n\n/**\n * The address this tab currently treats as its cross-tab authority, taken from the first available\n * candidate: the published session's address, then — before the session is published (e.g. during\n * refresh-first hydration) — the pending persisted record's address, then the authenticating\n * address of an in-flight login. Storage listeners and adoption use this so a logout or a newer\n * rotation in another tab is honored even while hydration/login is in flight, instead of being\n * ignored (which could let a successful login resurrect a session another tab just ended, or let a\n * doomed refresh discard another tab's successful rotation).\n */\nexport function resolveActiveSessionAddress(\n ...candidates: (string | null | undefined)[]\n): string | null {\n return candidates.find((candidate) => !!candidate) ?? null\n}\n\nexport type AutoLoginEffectAction =\n | { type: 'wait' }\n | { type: 'reset-on-disconnect' }\n | { type: 'clear-on-mismatch' }\n | { type: 'auto-login' }\n | { type: 'noop' }\n\nexport interface AutoLoginEffectInput {\n status: string\n isConnected: boolean\n address: string | null\n sessionAddress: string | null\n autoLogin: boolean\n isLoading: boolean\n /** True while a persisted session is being refreshed on load; suppresses auto-login until it settles. */\n isHydrating: boolean\n autoAttemptedAddress: string | null\n /**\n * Address that owns an in-flight login/hydration. Before a session is published this is the only\n * signal that a pending op must be invalidated on disconnect or address change; it is folded into\n * the disconnect/mismatch guards below alongside `sessionAddress`.\n */\n authenticatingAddress: string | null\n}\n\n/**\n * Decides what the connection-driven effect should do. Disconnect and address-mismatch\n * invalidation run regardless of `autoLogin` so a manually authenticated session is always\n * dropped when the wallet changes or disconnects; `autoLogin` only gates the automatic\n * `login()` branch.\n */\nexport function resolveAutoLoginEffectAction(input: AutoLoginEffectInput): AutoLoginEffectAction {\n const {\n status,\n isConnected,\n address,\n sessionAddress,\n autoLogin,\n isLoading,\n isHydrating,\n autoAttemptedAddress,\n authenticatingAddress,\n } = input\n // Guarding on the in-flight owner too means a pending op is cancelled even with no session yet,\n // so its stale async result cannot then be committed.\n const activeAddress = resolveActiveSessionAddress(sessionAddress, authenticatingAddress)\n if (status === 'connecting' || status === 'reconnecting') return { type: 'wait' }\n if (!isConnected && activeAddress) return { type: 'reset-on-disconnect' }\n if (\n isConnected &&\n address &&\n activeAddress &&\n address.toLowerCase() !== activeAddress.toLowerCase()\n ) {\n return { type: 'clear-on-mismatch' }\n }\n if (!autoLogin) return { type: 'noop' }\n // Defer auto-login while a persisted session is hydrating: the refresh may yet publish a session,\n // and a concurrent signature would double-sign. Once isHydrating settles to false the effect\n // re-evaluates (it is a dependency) and auto-login proceeds when no session was established.\n if (isHydrating) return { type: 'wait' }\n if (isConnected && address && !sessionAddress && !isLoading && autoAttemptedAddress !== address) {\n return { type: 'auto-login' }\n }\n return { type: 'noop' }\n}\n","import type { PersistedSiweAuthRecord } from './siwe-persistence'\n\nexport type RefreshData = { refreshToken: string; refreshExpiresAt: number }\n\n/**\n * Mutable lifecycle state for the SIWE auth session. Folded into a single object so that\n * multi-field transitions (reset, commit) are atomic and testable.\n */\nexport interface AuthLifecycleState {\n /** Monotonic generation; bumped on every authoritative transition so stale\n * async ops can detect invalidation by capturing before an await and\n * re-checking after. */\n generation: number\n /** Refresh credentials for the current session. */\n refreshData: RefreshData | null\n /** Last persisted record applied in this tab; drives cross-tab \"newer record\"\n * comparisons and refresh-record updates. */\n currentRecord: PersistedSiweAuthRecord | null\n /** Address auto-login has been attempted for (suppresses re-login after\n * explicit logout). */\n autoAttemptedAddress: string | null\n /** Address owning an in-flight login/hydration; feeds disconnect/mismatch\n * invalidation so a pending op is cancelled before any session is published.\n * Cleared only by the reset transition, never in an op finally, so a stale\n * op can't clobber the owner a newer op has claimed. */\n authenticatingAddress: string | null\n /** Address hydration has already been attempted for, so it runs once per\n * wallet. */\n hydratedAddress: string | null\n}\n\n/** Lifecycle events. Authoritative transitions (`reset`, `commit`) bump generation; `refresh` and\n * the single-field marker events do not. Every lifecycle mutation flows through one of these, so\n * an event log fully determines state. */\nexport type AuthLifecycleEvent =\n | { type: 'reset' }\n | { type: 'commit'; record: PersistedSiweAuthRecord }\n | { type: 'refresh'; refreshData: RefreshData; record: PersistedSiweAuthRecord | null }\n | { type: 'setAutoAttemptedAddress'; address: string | null }\n | { type: 'setAuthenticatingAddress'; address: string | null }\n | { type: 'setHydratedAddress'; address: string | null }\n | { type: 'clearCurrentRecord' }\n\nexport function initialAuthLifecycleState(): AuthLifecycleState {\n return {\n generation: 0,\n refreshData: null,\n currentRecord: null,\n autoAttemptedAddress: null,\n authenticatingAddress: null,\n hydratedAddress: null,\n }\n}\n\nexport function reduceAuthLifecycle(\n state: AuthLifecycleState,\n event: AuthLifecycleEvent\n): AuthLifecycleState {\n switch (event.type) {\n case 'reset':\n return {\n generation: state.generation + 1,\n refreshData: null,\n currentRecord: null,\n autoAttemptedAddress: null,\n authenticatingAddress: null,\n hydratedAddress: null,\n }\n case 'commit':\n return {\n ...state,\n generation: state.generation + 1,\n refreshData: {\n refreshToken: event.record.tokens.jwt_refresh_token,\n refreshExpiresAt: event.record.refreshTokenExpiresAt,\n },\n currentRecord: event.record,\n }\n case 'refresh':\n return {\n ...state,\n refreshData: event.refreshData,\n currentRecord: event.record,\n }\n case 'setAutoAttemptedAddress':\n return { ...state, autoAttemptedAddress: event.address }\n case 'setAuthenticatingAddress':\n return { ...state, authenticatingAddress: event.address }\n case 'setHydratedAddress':\n return { ...state, hydratedAddress: event.address }\n case 'clearCurrentRecord':\n return { ...state, currentRecord: null }\n }\n}\n","import type { Address, HexString } from '../types'\nimport type { PersistedSiweAuthRecord } from './siwe-persistence'\n\n/** Session published to consumers. */\nexport interface SiweAuthSession {\n address: Address\n}\n\n/** Raw tokens exposed so apps with own backend can forward them. */\nexport interface SiweAuthTokens {\n siwe_token: HexString\n jwt_access_token: string\n jwt_refresh_token: string\n address: Address\n}\n\n/** SetStateAction<T | null> as a plain callable so helpers are React-agnostic and testable. */\nexport type NullableSetter<T> = (value: T | null | ((prev: T | null) => T | null)) => void\n\nexport interface SiweLifecycleClient {\n setBearerToken(token: string): void\n clearBearerToken(): void\n clearPrivateReadToken(): void\n}\n\n/** Shared private-read token cache surface. */\nexport interface SiweLifecycleCache {\n set(scopeKey: string, token: string, expiresAt: number): void\n}\n\n/** localStorage-ish surface for persisted SIWE auth. */\nexport interface SiweLifecycleStorage {\n read(): PersistedSiweAuthRecord | null\n write(record: PersistedSiweAuthRecord): void\n remove(): void\n}\n\nexport interface SiweLifecycleReact {\n setSession: NullableSetter<SiweAuthSession>\n setTokens: NullableSetter<SiweAuthTokens>\n setAccessTokenExpiresAt: NullableSetter<number>\n setIsLoading: (b: boolean) => void\n setIsHydrating: (b: boolean) => void\n setError: (e: Error | null) => void\n}\n\n/** The full dependency-injection seam. `persistJwt` is read here so storage gating is centralized. */\nexport interface SiweLifecyclePorts {\n persistJwt: boolean\n client: SiweLifecycleClient\n storage: SiweLifecycleStorage\n cache: SiweLifecycleCache\n react: SiweLifecycleReact\n makeScopeKey: (address: string) => string\n}\n\n/**\n * Seed the shared private-read token cache so reads reuse this token instead of triggering a\n * second signature. Private reads authenticate via a scoped client (PrivanaClient.withPrivateReadToken),\n * so the client-wide bearer is never displaced here — arming a global X-SIWE header is unnecessary.\n */\nexport function armPrivateRead(\n ports: SiweLifecyclePorts,\n input: { siweToken: string; siweExpiry: number; scopeKey: string }\n): void {\n ports.cache.set(input.scopeKey, input.siweToken, input.siweExpiry)\n}\n\n/**\n * Apply rotated JWTs to live state without publishing a session: bearer token, a partial token\n * merge, and the access-token expiry. Used by the refresh path, where no session change occurs.\n */\nexport function applyAccessRotation(\n ports: SiweLifecyclePorts,\n rotation: { accessToken: string; refreshToken: string; accessTokenExpiresAt: number }\n): void {\n ports.client.setBearerToken(rotation.accessToken)\n ports.react.setTokens((prev) =>\n prev\n ? {\n ...prev,\n jwt_access_token: rotation.accessToken,\n jwt_refresh_token: rotation.refreshToken,\n }\n : prev\n )\n ports.react.setAccessTokenExpiresAt(rotation.accessTokenExpiresAt)\n}\n\n/** Publish a record as the live session: bearer token, address, complete token set, and expiry. */\nexport function publishSession(ports: SiweLifecyclePorts, record: PersistedSiweAuthRecord): void {\n ports.client.setBearerToken(record.tokens.jwt_access_token)\n ports.react.setSession({ address: record.tokens.address as Address })\n ports.react.setTokens({\n siwe_token: record.tokens.siwe_token as HexString,\n jwt_access_token: record.tokens.jwt_access_token,\n jwt_refresh_token: record.tokens.jwt_refresh_token,\n address: record.tokens.address as Address,\n })\n ports.react.setAccessTokenExpiresAt(record.accessTokenExpiresAt)\n}\n\n/** Persist the record to storage when `persistJwt` is on; pass `null` to remove. */\nexport function persistRecordIfEnabled(\n ports: SiweLifecyclePorts,\n record: PersistedSiweAuthRecord | null\n): void {\n if (!ports.persistJwt) return\n if (record) ports.storage.write(record)\n else ports.storage.remove()\n}\n\n/** Clear every live auth surface: both client headers and all React session state, including the\n * loading AND hydrating flags — a reset means no operation is loading or hydrating for this scope\n * anymore, so a stale in-flight login or refresh whose await settles late is not the only thing\n * that can clear it (and cannot strand the flag if no newer work follows). */\nexport function clearSessionEffects(ports: SiweLifecyclePorts): void {\n ports.client.clearPrivateReadToken()\n ports.client.clearBearerToken()\n ports.react.setSession(null)\n ports.react.setTokens(null)\n ports.react.setAccessTokenExpiresAt(null)\n ports.react.setIsLoading(false)\n ports.react.setIsHydrating(false)\n ports.react.setError(null)\n}\n","import type { PrivanaClient } from '../client'\nimport type { Address, HexString } from '../types'\nimport { buildSiweLoginMessage, type SiweMessageValue } from './siwe'\nimport {\n applyRefreshToPersistedSiweAuthRecord,\n buildPersistedSiweAuthRecordFromLogin,\n isAdoptableRecord,\n isPersistedSiweAuthAccessActive,\n type PersistedSiweAuthRecord,\n} from './siwe-persistence'\nimport { resolveActiveSessionAddress } from './siwe-auth-policy'\nimport {\n applyAccessRotation,\n armPrivateRead,\n clearSessionEffects,\n persistRecordIfEnabled,\n publishSession,\n type SiweLifecyclePorts,\n} from './auth-lifecycle-effects'\nimport type { AuthLifecycleEvent, AuthLifecycleState, RefreshData } from './auth-lifecycle'\nimport { AUTH_CLOCK_SKEW_MS } from './auth-clock-skew'\n\n/** Network surface the commands call; satisfied by a PrivanaClient or any structural stand-in. */\nexport type SiweLifecycleApi = Pick<\n PrivanaClient,\n 'getSiweDomain' | 'getSiweNonce' | 'loginWithSiwe' | 'refreshJwtSession' | 'logoutJwtSession'\n>\n\n/** Wallet signing surface (wraps wagmi's getWalletClient + signMessage). */\nexport interface SiweLifecycleSigner {\n signSiweMessage(input: { account: Address; message: SiweMessageValue }): Promise<HexString>\n}\n\n/** Static-ish config read off the handle; the hook refreshes it each render. */\nexport interface SiweAuthControllerConfig {\n address: Address | undefined\n chainId: number\n apiUrl: string\n persistJwt: boolean\n}\n\n/** The framework-agnostic controller handle. Commands read state + config from here and\n * dispatch events / call effect helpers through `ports`. Mutable dedup fields live here too. */\nexport interface SiweAuthController {\n config: SiweAuthControllerConfig\n ports: SiweLifecyclePorts\n api: SiweLifecycleApi\n signer: SiweLifecycleSigner\n loginInFlight: boolean\n /** Generation snapshot of the in-flight login, or -1 when idle. `reset` clears it so a stale\n * login's catch/finally can detect it no longer owns the slot and must not clobber a newer\n * scope's error/loading state — or clear flags a newer login has since claimed. This is tracked\n * separately from `state.generation` because a successful login's own `commit` also bumps\n * generation, which would otherwise look indistinguishable from an invalidating reset. */\n loginOwnerGeneration: number\n /** Generation snapshot of the in-flight hydration, or -1 when idle. Mirrors `loginOwnerGeneration`\n * for the hydrating flag: `reset` clears it so a stale hydration's finally cannot pull the flag\n * out from under a newer scope. Tracked separately from `state.generation` because a successful\n * hydration's own `commit` (via ctrlRestoreSession) also bumps generation, which would otherwise\n * look indistinguishable from an invalidating reset and strand the hydrating flag on success. */\n hydrateOwnerGeneration: number\n refreshPromise: Promise<void> | null\n getState(): AuthLifecycleState\n getSessionAddress(): string | null\n dispatch(event: AuthLifecycleEvent): void\n}\n\nfunction activeAddress(ctrl: SiweAuthController): string | null {\n return resolveActiveSessionAddress(\n ctrl.getSessionAddress(),\n ctrl.getState().currentRecord?.tokens.address\n )\n}\n\n/** Reset all live auth state + (optionally) persisted storage. Reclaims the login AND refresh slots,\n * so a stale in-flight login or refresh (whose await may never settle) cannot block a fresh attempt\n * or clobber the new scope's error/loading state from a late catch/finally — and a scope change\n * during refresh cannot leave the new scope's hydration waiting on the previous backend's promise. */\nexport function ctrlReset(ctrl: SiweAuthController, removeStorage: boolean): void {\n ctrl.loginInFlight = false\n ctrl.loginOwnerGeneration = -1\n ctrl.hydrateOwnerGeneration = -1\n ctrl.refreshPromise = null\n ctrl.dispatch({ type: 'reset' })\n clearSessionEffects(ctrl.ports)\n if (removeStorage) persistRecordIfEnabled(ctrl.ports, null)\n}\n\n/** Make a record the live session: commit + private-read arming + session publish. */\nexport function ctrlRestoreSession(\n ctrl: SiweAuthController,\n record: PersistedSiweAuthRecord\n): void {\n ctrl.dispatch({ type: 'commit', record })\n armPrivateRead(ctrl.ports, {\n siweToken: record.tokens.siwe_token,\n siweExpiry: record.siweTokenExpiresAt,\n scopeKey: ctrl.ports.makeScopeKey(record.tokens.address),\n })\n publishSession(ctrl.ports, record)\n}\n\n/** Before/after a refresh, adopt a concurrent cross-tab rotation instead of a redundant call.\n * Adoption is a FULL restore because the newer record may come from another tab's fresh login,\n * which rotated the SIWE token — a JWT-only apply would leave this tab reading against a stale\n * private-read token. */\nexport function ctrlAdoptNewerRecordIfAvailable(ctrl: SiweAuthController): boolean {\n if (!ctrl.config.persistJwt) return false\n const record = ctrl.ports.storage.read()\n if (!record) return false\n const current = activeAddress(ctrl)\n if (!isAdoptableRecord(record, current, ctrl.getState().currentRecord?.updatedAt ?? null)) {\n return false\n }\n ctrlRestoreSession(ctrl, record)\n return true\n}\n\n/** Auto-login signature flow. Owns generation capture/recheck so a mid-flight logout, wallet\n * switch, or network change aborts, and marks the address auto-attempted only once the slot is\n * claimed — a no-op (slot busy) never suppresses a future auto-login for this address. */\nexport async function ctrlLogin(ctrl: SiweAuthController): Promise<void> {\n const address = ctrl.config.address\n if (!address) throw new Error('No wallet connected')\n if (ctrl.loginInFlight) return\n ctrl.loginInFlight = true\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address })\n ctrl.dispatch({ type: 'setAuthenticatingAddress', address })\n ctrl.ports.react.setIsLoading(true)\n ctrl.ports.react.setError(null)\n // Snapshot the network scope + api at command start. A runtime networkConfig/client change\n // (or any generation bump) invalidates this attempt; the snapshot guarantees the assembled SIWE\n // message never mixes a nonce/domain from one backend with a chain id asserted to another.\n const generation = ctrl.getState().generation\n ctrl.loginOwnerGeneration = generation\n const { chainId, apiUrl } = ctrl.config\n const api = ctrl.api\n try {\n const { message, expirationTime } = await buildSiweLoginMessage(api, {\n address,\n chainId,\n apiUrl,\n })\n const signature = await ctrl.signer.signSiweMessage({ account: address, message })\n const res = await api.loginWithSiwe({ siwe_message: message, signature })\n if (ctrl.getState().generation !== generation) return\n const record = buildPersistedSiweAuthRecordFromLogin(res, Date.now(), expirationTime.getTime())\n ctrlRestoreSession(ctrl, record)\n persistRecordIfEnabled(ctrl.ports, record)\n } catch (err) {\n // Only surface the error if this operation still owns the slot; a stale op (wallet/network\n // switched mid-sign, which cleared loginOwnerGeneration via reset) must not write into the new\n // scope's shared React state. Ownership is checked via loginOwnerGeneration (not state.generation)\n // because a successful login's own commit also bumps generation.\n if (ctrl.loginOwnerGeneration === generation) {\n ctrl.ports.react.setError(err instanceof Error ? err : new Error('Sign-in failed'))\n }\n throw err\n } finally {\n // Only clear if this op still owns the slot. A reset already reclaimed the slot + loading\n // flag for the new scope, and a newer login may have claimed the slot since — clearing\n // unconditionally would clobber that newer login's flags.\n if (ctrl.loginOwnerGeneration === generation) {\n ctrl.ports.react.setIsLoading(false)\n ctrl.loginInFlight = false\n ctrl.loginOwnerGeneration = -1\n }\n }\n}\n\n/** Best-effort revoke all refresh tokens (log out everywhere, including any stolen token) while\n * the bearer is still set, then clear local state and suppress same-wallet re-login. */\nexport async function ctrlLogout(ctrl: SiweAuthController): Promise<void> {\n const refreshToken = ctrl.getState().refreshData?.refreshToken\n try {\n if (refreshToken) {\n try {\n await ctrl.api.logoutJwtSession({ refresh_token: refreshToken, revoke_all: true })\n } catch {\n // Best-effort: local state clears in finally regardless; don't block logout on revocation.\n }\n }\n } finally {\n // Reset AFTER the revocation call: /auth/jwt/logout authenticates via the JWT bearer\n // (Depends(get_current_user)), so clearing the bearer first would 401 and revoke nothing.\n ctrlReset(ctrl, ctrl.config.persistJwt)\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address: ctrl.config.address ?? null })\n }\n}\n\n/** Refresh the access token; adopt cross-tab rotations; clear on terminal failure. */\nexport async function ctrlRefreshAccessToken(ctrl: SiweAuthController): Promise<void> {\n const data = ctrl.getState().refreshData\n if (!data) return\n if (Date.now() >= data.refreshExpiresAt - AUTH_CLOCK_SKEW_MS) {\n ctrlReset(ctrl, ctrl.config.persistJwt)\n return\n }\n if (ctrl.refreshPromise) return ctrl.refreshPromise\n const generation = ctrl.getState().generation\n const promise = (async () => {\n try {\n if (ctrlAdoptNewerRecordIfAvailable(ctrl)) return\n const res = await ctrl.api.refreshJwtSession({ refresh_token: data.refreshToken })\n if (ctrl.getState().generation !== generation) return\n const refreshedAt = Date.now()\n const refreshData: RefreshData = {\n refreshToken: res.refresh_token,\n refreshExpiresAt: refreshedAt + res.refresh_expires_in * 1000,\n }\n const previous = ctrl.getState().currentRecord\n // refreshData always rotates (it holds the token for the NEXT refresh); currentRecord\n // rotates only when it exists AND we persist.\n if (previous && ctrl.config.persistJwt) {\n const nextRecord = applyRefreshToPersistedSiweAuthRecord(previous, res, refreshedAt)\n ctrl.dispatch({ type: 'refresh', refreshData, record: nextRecord })\n ctrl.ports.storage.write(nextRecord)\n } else {\n ctrl.dispatch({ type: 'refresh', refreshData, record: previous })\n }\n applyAccessRotation(ctrl.ports, {\n accessToken: res.token,\n refreshToken: res.refresh_token,\n accessTokenExpiresAt: refreshedAt + res.expires_in * 1000,\n })\n } catch {\n if (ctrl.getState().generation !== generation) return\n if (!ctrlAdoptNewerRecordIfAvailable(ctrl)) ctrlReset(ctrl, ctrl.config.persistJwt)\n }\n })()\n ctrl.refreshPromise = promise\n try {\n await promise\n } finally {\n // Only null the slot if this op still owns it. A reset since it started (network/client change)\n // reclaims the slot for a newer scope, and a newer refresh may have since claimed it — clearing\n // unconditionally would evict that newer refresh's in-flight promise.\n if (ctrl.refreshPromise === promise) ctrl.refreshPromise = null\n }\n}\n\n/** Refresh-first hydration: seed markers, commit, await refresh, publish if still active. */\nexport async function ctrlHydrateViaRefresh(\n ctrl: SiweAuthController,\n record: PersistedSiweAuthRecord,\n address: string\n): Promise<void> {\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address })\n ctrl.dispatch({ type: 'setAuthenticatingAddress', address })\n ctrl.ports.react.setIsHydrating(true)\n ctrl.dispatch({ type: 'commit', record })\n const hydrationGen = ctrl.getState().generation\n ctrl.hydrateOwnerGeneration = hydrationGen\n try {\n await ctrlRefreshAccessToken(ctrl).catch(() => {})\n const fresh = ctrl.getState().currentRecord\n if (\n fresh &&\n fresh.tokens.address.toLowerCase() === address.toLowerCase() &&\n isPersistedSiweAuthAccessActive(fresh)\n ) {\n ctrlRestoreSession(ctrl, fresh)\n } else if (ctrl.getState().generation === hydrationGen) {\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address: null })\n }\n } finally {\n // Only clear if this hydration still owns the slot. A reset since it started (network/client\n // change) reclaimed the flag for the new scope — clearing unconditionally would pull it out\n // from under a newer hydration still in flight. Ownership is checked via hydrateOwnerGeneration\n // (not state.generation) because a successful hydration's own ctrlRestoreSession commit also\n // bumps generation, which would otherwise strand the flag on the happy path.\n if (ctrl.hydrateOwnerGeneration === hydrationGen) {\n ctrl.ports.react.setIsHydrating(false)\n ctrl.hydrateOwnerGeneration = -1\n }\n }\n}\n","import { AUTH_CLOCK_SKEW_MS } from '../auth/auth-clock-skew'\n\ninterface PrivateReadTokenEntry {\n token: string\n expiresAt: number\n}\n\nconst cache = new Map<string, PrivateReadTokenEntry>()\n\nexport function createScopeKey(apiUrl: string, chainId: number, address: string): string {\n return `${apiUrl.replace(/\\/$/, '')}:${chainId}:${address.toLowerCase()}`\n}\n\nexport function getCachedPrivateReadToken(scopeKey: string): string | null {\n const cached = cache.get(scopeKey)\n if (!cached) return null\n if (cached.expiresAt <= Date.now() + AUTH_CLOCK_SKEW_MS) {\n cache.delete(scopeKey)\n return null\n }\n return cached.token\n}\n\nexport function setCachedPrivateReadToken(\n scopeKey: string,\n token: string,\n expiresAt: number\n): void {\n cache.set(scopeKey, { token, expiresAt })\n}\n\nexport function deleteCachedPrivateReadToken(scopeKey: string): void {\n cache.delete(scopeKey)\n}\n","'use client'\n\nimport { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport { getWalletClient } from 'wagmi/actions'\nimport { WagmiContext } from 'wagmi'\nimport type { HexString } from '../types'\nimport {\n getSiweAuthLocalStorage,\n readPersistedSiweAuth,\n removePersistedSiweAuth,\n resolveHydrationAction,\n resolveStorageEvent,\n writePersistedSiweAuth,\n type PersistedSiweAuthRecord,\n} from '../auth/siwe-persistence'\nimport { resolveActiveSessionAddress, resolveAutoLoginEffectAction } from '../auth/siwe-auth-policy'\nimport {\n initialAuthLifecycleState,\n reduceAuthLifecycle,\n type AuthLifecycleEvent,\n} from '../auth/auth-lifecycle'\nimport {\n ctrlHydrateViaRefresh,\n ctrlLogin,\n ctrlLogout,\n ctrlRefreshAccessToken,\n ctrlReset,\n ctrlRestoreSession,\n type SiweAuthController,\n} from '../auth/siwe-auth-controller'\nimport { AUTH_CLOCK_SKEW_MS } from '../auth/auth-clock-skew'\nimport { createScopeKey, setCachedPrivateReadToken } from './private-read-token-store'\nimport { useSafeAccount } from './use-safe-account'\nimport type { SiweLifecyclePorts } from '../auth/auth-lifecycle-effects'\nimport type { SiweAuthSession, SiweAuthTokens } from '../auth/auth-lifecycle-effects'\n\nexport interface SiweAuthRuntimeDeps {\n storageKey: string\n apiUrl: string\n chainId: number\n persistJwt: boolean\n autoLogin: boolean\n /** The subset of PrivanaClient the lifecycle touches. */\n client: SiweLifecyclePorts['client']\n api: SiweAuthController['api']\n}\n\nexport interface SiweAuthLifecycleResult {\n isAuthenticated: boolean\n isLoading: boolean\n isHydrating: boolean\n error: Error | null\n session: SiweAuthSession | null\n accessToken: string | undefined\n tokens: SiweAuthTokens | null\n login: () => Promise<void>\n logout: () => Promise<void>\n}\n\nexport function useSiweAuthLifecycle(deps: SiweAuthRuntimeDeps): SiweAuthLifecycleResult {\n const { storageKey, apiUrl, chainId, persistJwt, autoLogin, client, api } = deps\n const wagmiContext = useContext(WagmiContext)\n const { address, isConnected, status } = useSafeAccount()\n\n const [session, setSession] = useState<SiweAuthSession | null>(null)\n const [tokens, setTokens] = useState<SiweAuthTokens | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [isHydrating, setIsHydrating] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [accessTokenExpiresAt, setAccessTokenExpiresAt] = useState<number | null>(null)\n\n const sessionRef = useRef<SiweAuthSession | null>(null)\n const prevPersistJwtRef = useRef<boolean | undefined>(undefined)\n const authRef = useRef(initialAuthLifecycleState())\n\n const storageAdapter = useMemo(\n () => ({\n read: () => {\n const ls = getSiweAuthLocalStorage()\n return ls ? readPersistedSiweAuth(ls, storageKey) : null\n },\n write: (record: PersistedSiweAuthRecord) => {\n const ls = getSiweAuthLocalStorage()\n if (ls) writePersistedSiweAuth(ls, storageKey, record)\n },\n remove: () => {\n const ls = getSiweAuthLocalStorage()\n if (ls) removePersistedSiweAuth(ls, storageKey)\n },\n }),\n [storageKey]\n )\n\n // Values the once-created ports/controller closures must read live rather than capture.\n const scopeInputsRef = useRef({ apiUrl, chainId })\n scopeInputsRef.current.apiUrl = apiUrl\n scopeInputsRef.current.chainId = chainId\n const wagmiContextRef = useRef(wagmiContext)\n wagmiContextRef.current = wagmiContext\n\n const portsRef = useRef<SiweLifecyclePorts | null>(null)\n if (!portsRef.current) {\n portsRef.current = {\n persistJwt,\n client,\n storage: storageAdapter,\n cache: { set: setCachedPrivateReadToken },\n react: {\n setSession,\n setTokens,\n setAccessTokenExpiresAt,\n setIsLoading,\n setIsHydrating,\n setError,\n },\n makeScopeKey: (addr: string) =>\n createScopeKey(scopeInputsRef.current.apiUrl, scopeInputsRef.current.chainId, addr),\n }\n }\n const ports = portsRef.current\n // Keep mutable port fields current without rebinding commands, so a runtime networkConfig\n // (apiUrl/chainId/storageKey) or client change takes effect.\n ports.persistJwt = persistJwt\n ports.client = client\n ports.storage = storageAdapter\n\n const ctrlRef = useRef<SiweAuthController | null>(null)\n if (!ctrlRef.current) {\n ctrlRef.current = {\n config: { address, chainId, apiUrl, persistJwt },\n ports,\n api,\n signer: {\n signSiweMessage: async ({ account, message }) => {\n const ctx = wagmiContextRef.current\n if (!ctx) throw new Error('WagmiProvider is required for SIWE auth')\n const walletClient = await getWalletClient(ctx)\n if (!walletClient) throw new Error('No wallet client available')\n return walletClient.signMessage({\n account: walletClient.account ?? account,\n message,\n }) as Promise<HexString>\n },\n },\n loginInFlight: false,\n loginOwnerGeneration: -1,\n hydrateOwnerGeneration: -1,\n refreshPromise: null,\n getState: () => authRef.current,\n getSessionAddress: () => sessionRef.current?.address ?? null,\n dispatch: (event: AuthLifecycleEvent) => {\n authRef.current = reduceAuthLifecycle(authRef.current, event)\n },\n }\n }\n const ctrl = ctrlRef.current\n ctrl.config = { address, chainId, apiUrl, persistJwt }\n ctrl.api = api\n\n const login = useCallback(() => ctrlLogin(ctrl), [ctrl])\n const logout = useCallback(() => ctrlLogout(ctrl), [ctrl])\n const refreshAccessToken = useCallback(() => ctrlRefreshAccessToken(ctrl), [ctrl])\n const resetSession = useCallback(() => ctrlReset(ctrl, false), [ctrl])\n const clearSession = useCallback(() => ctrlReset(ctrl, ctrl.config.persistJwt), [ctrl])\n const restoreSession = useCallback(\n (record: PersistedSiweAuthRecord) => ctrlRestoreSession(ctrl, record),\n [ctrl]\n )\n const hydrateViaRefresh = useCallback(\n (record: PersistedSiweAuthRecord, addr: string) => ctrlHydrateViaRefresh(ctrl, record, addr),\n [ctrl]\n )\n\n // Refresh scheduler.\n useEffect(() => {\n if (accessTokenExpiresAt == null) return\n const delay = Math.max(accessTokenExpiresAt - AUTH_CLOCK_SKEW_MS - Date.now(), 0)\n const timer = setTimeout(() => {\n void refreshAccessToken()\n }, delay)\n return () => clearTimeout(timer)\n }, [accessTokenExpiresAt, refreshAccessToken])\n\n // Network scope (apiUrl/chainId/client) tracking + persisted-session hydration, combined so the\n // reset→hydrate ordering is structural rather than dependent on effect declaration order. The\n // reset is memory-only by design: it must NOT remove the destination scope's persisted record,\n // so the hydration that immediately follows can restore a session stored under the new\n // storageKey (the reset cleared hydratedAddress, so hydration re-runs against the current key).\n const scopeRef = useRef<\n { apiUrl: string; chainId: number; client: SiweLifecyclePorts['client'] } | undefined\n >(undefined)\n useEffect(() => {\n const prev = scopeRef.current\n scopeRef.current = { apiUrl, chainId, client }\n const scopeChanged =\n !!prev && !(prev.apiUrl === apiUrl && prev.chainId === chainId && prev.client === client)\n if (scopeChanged) {\n ctrlReset(ctrl, false)\n }\n\n if (!persistJwt) return\n if (status === 'connecting' || status === 'reconnecting') return\n if (!isConnected || !address) return\n if (ctrl.getState().hydratedAddress === address) return\n ctrl.dispatch({ type: 'setHydratedAddress', address })\n\n const action = resolveHydrationAction(storageAdapter.read(), address)\n switch (action.type) {\n case 'restore':\n restoreSession(action.record)\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address })\n break\n case 'refresh':\n void hydrateViaRefresh(action.record, address)\n break\n case 'remove':\n storageAdapter.remove()\n break\n case 'dormant':\n break\n }\n }, [\n apiUrl,\n chainId,\n client,\n persistJwt,\n status,\n isConnected,\n address,\n storageAdapter,\n ctrl,\n restoreSession,\n hydrateViaRefresh,\n ])\n\n // Auto-login / disconnect / mismatch handling.\n useEffect(() => {\n const action = resolveAutoLoginEffectAction({\n status,\n isConnected,\n address: address ?? null,\n sessionAddress: session?.address ?? null,\n autoLogin,\n isLoading,\n isHydrating,\n autoAttemptedAddress: ctrl.getState().autoAttemptedAddress,\n authenticatingAddress: ctrl.getState().authenticatingAddress,\n })\n switch (action.type) {\n case 'wait':\n case 'noop':\n return\n case 'reset-on-disconnect':\n resetSession()\n return\n case 'clear-on-mismatch':\n clearSession()\n return\n case 'auto-login':\n // autoAttemptedAddress is marked inside ctrlLogin once the slot is claimed, so a no-op\n // (slot already busy) does not suppress a future auto-login for this address.\n void login().catch(() => {})\n return\n }\n }, [\n autoLogin,\n status,\n isConnected,\n address,\n session,\n isLoading,\n isHydrating,\n ctrl,\n login,\n clearSession,\n resetSession,\n ])\n\n // Cross-tab storage synchronization.\n useEffect(() => {\n if (!persistJwt || typeof window === 'undefined') return\n function onStorage(event: StorageEvent) {\n if (event.key !== storageKey) return\n const currentAddress = resolveActiveSessionAddress(\n sessionRef.current?.address,\n ctrl.getState().currentRecord?.tokens.address,\n ctrl.getState().authenticatingAddress\n )\n const action = resolveStorageEvent(\n event.newValue,\n currentAddress,\n ctrl.getState().currentRecord?.updatedAt ?? null\n )\n switch (action.type) {\n case 'logout':\n resetSession()\n if (currentAddress)\n ctrl.dispatch({ type: 'setAutoAttemptedAddress', address: currentAddress })\n break\n case 'adopt':\n // A full restore, not a JWT-only apply: the other tab may have performed a fresh\n // login, rotating the SIWE token and private-read token.\n restoreSession(action.record)\n break\n case 'ignore':\n break\n }\n }\n window.addEventListener('storage', onStorage)\n return () => window.removeEventListener('storage', onStorage)\n }, [persistJwt, storageKey, ctrl, restoreSession, resetSession])\n\n // Only an observed runtime true->false transition removes storage. An initial `false` stays\n // dormant so a memory-only provider can never delete (and thus cross-tab log out) another tab's\n // persisted session.\n useEffect(() => {\n const prev = prevPersistJwtRef.current\n prevPersistJwtRef.current = persistJwt\n if (!(prev === true && !persistJwt)) return\n ctrl.dispatch({ type: 'clearCurrentRecord' })\n storageAdapter.remove()\n }, [persistJwt, storageAdapter, ctrl])\n\n // Mirror the published session for synchronous reads.\n useEffect(() => {\n sessionRef.current = session\n }, [session])\n\n return useMemo(\n () => ({\n isAuthenticated: !!session,\n isLoading: isLoading || isHydrating,\n isHydrating,\n error,\n session,\n accessToken: tokens?.jwt_access_token,\n tokens,\n login,\n logout,\n }),\n [session, isLoading, isHydrating, error, tokens, login, logout]\n )\n}\n","'use client'\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { PrivanaClient } from '../client'\nimport type { NetworkConfig } from '../types'\nimport { createSiweAuthStorageKey } from '../auth/siwe-persistence'\nimport { useSiweAuthLifecycle } from '../hooks/use-siwe-auth-lifecycle'\nimport type { SiweAuthSession, SiweAuthTokens } from '../auth/auth-lifecycle-effects'\n\nexport type { SiweAuthSession, SiweAuthTokens }\n\nexport interface SiweAuthContextValue {\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | null\n session: SiweAuthSession | null\n accessToken: string | undefined\n tokens: SiweAuthTokens | null\n login: () => Promise<void>\n logout: () => Promise<void>\n}\n\nconst SiweAuthContext = createContext<SiweAuthContextValue | null>(null)\n\nexport type SiweAuthConfig =\n | boolean\n | {\n autoLogin?: boolean\n persistJwt?: boolean\n }\n\nexport interface SiweAuthProviderProps {\n children: ReactNode\n client: PrivanaClient\n networkConfig: NetworkConfig\n autoLogin?: boolean\n persistJwt?: boolean\n}\n\nexport function SiweAuthProvider({\n children,\n client,\n networkConfig,\n autoLogin = true,\n persistJwt = false,\n}: SiweAuthProviderProps) {\n const storageKey = useMemo(\n () => createSiweAuthStorageKey(networkConfig.apiUrl, networkConfig.chainId),\n [networkConfig.apiUrl, networkConfig.chainId]\n )\n\n // Referentially stable unless the PrivanaClient instance changes, so the lifecycle hook can\n // detect a client replacement (and distinguish it from an ordinary re-render).\n const lifecycleClient = useMemo(\n () => ({\n setBearerToken: (t: string) => client.setBearerToken(t),\n clearBearerToken: () => client.clearBearerToken(),\n clearPrivateReadToken: () => client.clearPrivateReadToken(),\n }),\n [client]\n )\n\n const value = useSiweAuthLifecycle({\n storageKey,\n apiUrl: networkConfig.apiUrl,\n chainId: networkConfig.chainId,\n persistJwt,\n autoLogin,\n client: lifecycleClient,\n api: client,\n })\n\n return <SiweAuthContext.Provider value={value}>{children}</SiweAuthContext.Provider>\n}\n\nexport function useSiweAuth(): SiweAuthContextValue {\n const ctx = useContext(SiweAuthContext)\n if (!ctx) throw new Error('useSiweAuth must be used within SiweAuthProvider')\n return ctx\n}\n","/**\n * This belongs on the `/v1/accounting/tokens` API response alongside symbol/decimals\n * — delete this module once the backend returns `moonpay_currency_code` and read it\n * directly in the PrivanaProvider token mapping.\n *\n * Today MoonPay sandbox only ever delivers the MPT test token (ETH Sepolia), so that\n * is the single supported on-ramp token — keyed by token id, since the sandbox\n * delivery is tied to a specific token, not a symbol/chain.\n *\n * MoonPay's canonical list: https://api.moonpay.com/v3/currencies\n */\nconst MOONPAY_CURRENCY_CODE_BY_TOKEN_ID: Record<string, string> = {\n // Sandbox MPT test token (Ethereum Sepolia).\n '0xbd3a41ffd21be1cfcdca7a4e7755842a5b78c9443fb7ea008e6a7314f0caea87': 'usdc',\n}\n\nexport function resolveMoonpayCurrencyCode(tokenId: string): string | undefined {\n return MOONPAY_CURRENCY_CODE_BY_TOKEN_ID[tokenId.toLowerCase()]\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { zeroAddress } from 'viem'\nimport { PrivanaClient } from '../client'\nimport {\n applyRefreshResponse,\n createHostedAuthStorageKey,\n isHostedAuthRefreshActive,\n isHostedAuthSessionActive,\n} from '../auth'\nimport { HostedAuthRequiredError } from '../client'\nimport type {\n Address,\n HostedAuthConfig,\n HostedAuthSession,\n NetworkConfig,\n OnRampConfig,\n} from '../types'\nimport { NETWORK_CONFIG, type TokenConfig } from '../types'\nimport { SUPPORTED_CHAINS, type ChainConfig } from '../types/chains'\nimport { resolveMoonpayCurrencyCode } from '../moonpay-currency-codes'\nimport { SiweAuthProvider, type SiweAuthConfig } from './siwe-auth-provider'\n\nexport type TokensStatus = 'loading' | 'ready' | 'error'\n\nexport interface PrivanaContextValue {\n client: PrivanaClient\n networkConfig: NetworkConfig\n /** Explicit product on-ramp selection. Undefined preserves legacy MoonPay behavior. */\n onRamp?: OnRampConfig\n enabledTokens: TokenConfig[]\n defaultToken: TokenConfig | undefined\n getTokenById: (id: string) => TokenConfig | undefined\n getChainById: (id: number) => ChainConfig | undefined\n chains: ChainConfig[]\n tokensStatus: TokensStatus\n tokensError?: Error\n pollingInterval: number\n serviceAddress?: Address\n serviceName?: string\n serviceIcon?: ReactNode\n hostedAuthConfig: HostedAuthConfig | null\n hostedAuthSession: HostedAuthSession | null\n setHostedAuthSession: (session: HostedAuthSession | null) => void\n clearHostedAuthSession: () => void\n refreshHostedAuthSession: () => Promise<HostedAuthSession>\n}\n\nconst PrivanaContext = createContext<PrivanaContextValue | null>(null)\n\nexport function readStoredHostedAuthSession(\n storage: Pick<Storage, 'getItem' | 'removeItem'>,\n hostedAuthStorageKey: string,\n now = Date.now()\n): HostedAuthSession | null {\n const raw = storage.getItem(hostedAuthStorageKey)\n if (!raw) {\n return null\n }\n\n try {\n const parsed = JSON.parse(raw) as HostedAuthSession\n if (!isHostedAuthRefreshActive(parsed, now, 0)) {\n storage.removeItem(hostedAuthStorageKey)\n return null\n }\n return parsed\n } catch {\n storage.removeItem(hostedAuthStorageKey)\n return null\n }\n}\n\nexport function syncHostedAuthSessionToClient(\n client: Pick<PrivanaClient, 'clearBearerToken' | 'clearPrivateReadToken' | 'setBearerToken'>,\n hostedAuthConfig: HostedAuthConfig | null,\n hostedAuthSession: HostedAuthSession | null\n): void {\n if (!hostedAuthConfig) {\n client.clearBearerToken()\n client.clearPrivateReadToken()\n return\n }\n\n if (hostedAuthSession && isHostedAuthSessionActive(hostedAuthSession)) {\n client.setBearerToken(hostedAuthSession.accessToken)\n client.clearPrivateReadToken()\n return\n }\n\n client.clearBearerToken()\n client.clearPrivateReadToken()\n}\n\n/**\n * Default network configuration (testnet).\n */\nconst DEFAULT_NETWORK_CONFIG = NETWORK_CONFIG.testnet\n\nexport interface PrivanaProviderProps {\n children: ReactNode\n /**\n * Network configuration including chainId, accountingContract, apiUrl, and name.\n * Defaults to testnet config. Partial overrides are merged with defaults.\n */\n networkConfig?: Partial<NetworkConfig>\n /**\n * Optional product-level card on-ramp selection. When omitted, the deposit\n * modal preserves its legacy MoonPay behavior. An explicit selection locks\n * card deposits to one provider, Privana token, and provider asset code.\n */\n onRamp?: OnRampConfig\n /**\n * Optional list of token IDs to filter from the API response.\n * When provided, only tokens whose ID matches this list are enabled.\n * When omitted, all tokens returned by the API are enabled.\n */\n tokens?: string[]\n /**\n * Chain configurations to use. Defaults to SDK built-in chains from config.json.\n * Pass custom ChainConfig[] for deployments targeting different chains.\n */\n chains?: ChainConfig[]\n pollingInterval?: number\n /**\n * The service address for lock operations.\n */\n serviceAddress?: Address\n /**\n * Display name of the host application/service. Shown as the title in\n * Privana modals (e.g. the deposit modal header). Defaults to \"Privana\".\n */\n serviceName?: string\n /**\n * Optional icon/logo for the host application/service.\n */\n serviceIcon?: ReactNode\n /**\n * Optional hosted redirect auth configuration for cross-domain browser apps.\n */\n hostedAuth?: HostedAuthConfig\n /**\n * Optional direct (in-app) SIWE auth. When provided, the connected wallet\n * signs an EIP-4361 message in-app and `useSiweAuth()` becomes available.\n * Mutually exclusive with `hostedAuth`: providing both throws, because\n * `usePrivateReadRequest()` prefers `hostedAuthConfig` and would otherwise\n * ignore the SIWE login.\n */\n siweAuth?: SiweAuthConfig\n}\n\nexport function PrivanaProvider({\n children,\n networkConfig: networkConfigOverride,\n onRamp,\n tokens,\n chains,\n pollingInterval = 10000,\n serviceAddress,\n serviceName,\n serviceIcon,\n hostedAuth,\n siweAuth,\n}: PrivanaProviderProps) {\n if (hostedAuth && siweAuth) {\n throw new Error(\n 'PrivanaProvider: `hostedAuth` and `siweAuth` are mutually exclusive - provide only one. ' +\n 'When both are set, private reads use hosted auth and the in-app SIWE login is ignored.'\n )\n }\n\n const networkConfig = useMemo<NetworkConfig>(() => {\n const config: NetworkConfig = {\n ...DEFAULT_NETWORK_CONFIG,\n ...networkConfigOverride,\n }\n\n // Validate that critical fields are present and valid\n if (!config.chainId || config.chainId <= 0) {\n throw new Error('PrivanaProvider: networkConfig.chainId must be a positive number')\n }\n if (!config.accountingContract || !config.accountingContract.startsWith('0x')) {\n throw new Error('PrivanaProvider: networkConfig.accountingContract must be a valid address')\n }\n if (!config.apiUrl) {\n throw new Error('PrivanaProvider: networkConfig.apiUrl must be provided')\n }\n\n return config\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Use individual properties for stable memoization\n }, [\n networkConfigOverride?.chainId,\n networkConfigOverride?.name,\n networkConfigOverride?.accountingContract,\n networkConfigOverride?.apiUrl,\n networkConfigOverride?.moonpayApiUrl,\n networkConfigOverride?.moonpayApiKey,\n ])\n\n const resolvedChains = useMemo(() => {\n if (chains && chains.length > 0) return chains\n return SUPPORTED_CHAINS\n }, [chains])\n\n const client = useMemo(\n () => new PrivanaClient({ baseUrl: networkConfig.apiUrl }),\n [networkConfig.apiUrl]\n )\n\n const [allTokens, setAllTokens] = useState<TokenConfig[]>([])\n const [tokensStatus, setTokensStatus] = useState<TokensStatus>('loading')\n const [tokensError, setTokensError] = useState<Error | undefined>()\n\n useEffect(() => {\n setTokensStatus('loading')\n setTokensError(undefined)\n client\n .listTokens()\n .then(({ tokens: list }) => {\n setAllTokens(\n list.map((t) => ({\n id: t.token_id,\n symbol: t.symbol,\n decimals: t.decimals,\n contract: t.token_address ?? zeroAddress,\n name: t.name,\n chainId: t.chain_id,\n moonpayCurrencyCode: resolveMoonpayCurrencyCode(t.token_id),\n }))\n )\n setTokensStatus('ready')\n })\n .catch((err) => {\n setTokensError(err instanceof Error ? err : new Error(String(err)))\n setTokensStatus('error')\n })\n }, [client])\n\n const enabledTokens = useMemo(() => {\n if (tokens && tokens.length > 0) {\n const allowed = new Set(tokens.map((id) => id.toLowerCase()))\n return allTokens.filter((t) => allowed.has(t.id.toLowerCase()))\n }\n return allTokens\n }, [allTokens, tokens])\n\n const tokenById = useMemo(\n () => Object.fromEntries(enabledTokens.map((t) => [t.id.toLowerCase(), t])),\n [enabledTokens]\n )\n\n const getTokenById = useMemo(() => (id: string) => tokenById[id.toLowerCase()], [tokenById])\n\n const chainById = useMemo(\n () => Object.fromEntries(resolvedChains.map((c) => [c.id, c])),\n [resolvedChains]\n )\n\n const getChainById = useMemo(() => (id: number) => chainById[id], [chainById])\n\n const hostedAuthConfig = useMemo<HostedAuthConfig | null>(() => {\n if (!hostedAuth) return null\n\n const clientId = hostedAuth.clientId.trim()\n const redirectUri = hostedAuth.redirectUri.trim()\n if (!clientId) {\n throw new Error(\n 'PrivanaProvider: hostedAuth.clientId must be provided when hostedAuth is enabled'\n )\n }\n if (!redirectUri) {\n throw new Error(\n 'PrivanaProvider: hostedAuth.redirectUri must be provided when hostedAuth is enabled'\n )\n }\n\n return {\n clientId,\n redirectUri,\n }\n }, [hostedAuth])\n\n const hostedAuthStorageKey = useMemo(\n () =>\n hostedAuthConfig ? createHostedAuthStorageKey(networkConfig.apiUrl, hostedAuthConfig) : null,\n [hostedAuthConfig, networkConfig.apiUrl]\n )\n\n const [hostedAuthSession, setHostedAuthSessionState] = useState<HostedAuthSession | null>(null)\n const hostedAuthSessionRef = useRef<HostedAuthSession | null>(null)\n const hostedAuthStateVersionRef = useRef(0)\n const hostedAuthRefreshInflight = useRef<Promise<HostedAuthSession> | null>(null)\n\n const clearHostedAuthSession = useCallback(() => {\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = null\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(null)\n client.clearBearerToken()\n client.clearPrivateReadToken()\n if (hostedAuthStorageKey && typeof window !== 'undefined') {\n window.sessionStorage.removeItem(hostedAuthStorageKey)\n }\n }, [client, hostedAuthStorageKey])\n\n const setHostedAuthSession = useCallback(\n (session: HostedAuthSession | null) => {\n if (!session) {\n clearHostedAuthSession()\n return\n }\n\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = session\n setHostedAuthSessionState(session)\n if (isHostedAuthSessionActive(session)) {\n client.setBearerToken(session.accessToken)\n } else {\n client.clearBearerToken()\n }\n client.clearPrivateReadToken()\n\n if (hostedAuthStorageKey && typeof window !== 'undefined') {\n window.sessionStorage.setItem(hostedAuthStorageKey, JSON.stringify(session))\n }\n },\n [clearHostedAuthSession, client, hostedAuthStorageKey]\n )\n\n const refreshHostedAuthSession = useCallback(async (): Promise<HostedAuthSession> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n const currentSession = hostedAuthSessionRef.current\n if (!currentSession) {\n throw new HostedAuthRequiredError()\n }\n if (!isHostedAuthRefreshActive(currentSession)) {\n clearHostedAuthSession()\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication has expired. Start login again.'\n )\n }\n\n if (hostedAuthRefreshInflight.current) {\n return hostedAuthRefreshInflight.current\n }\n\n const refreshPromise = (async () => {\n const refreshVersion = hostedAuthStateVersionRef.current\n\n try {\n const response = await client.refreshJwtSession({\n refresh_token: currentSession.refreshToken,\n })\n if (refreshVersion !== hostedAuthStateVersionRef.current) {\n const latestSession = hostedAuthSessionRef.current\n if (latestSession) {\n return latestSession\n }\n\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication has changed. Start login again.'\n )\n }\n\n const nextSession = applyRefreshResponse(currentSession, response)\n setHostedAuthSession(nextSession)\n return nextSession\n } catch (error) {\n if (refreshVersion === hostedAuthStateVersionRef.current) {\n clearHostedAuthSession()\n }\n throw error\n } finally {\n hostedAuthRefreshInflight.current = null\n }\n })()\n\n hostedAuthRefreshInflight.current = refreshPromise\n return refreshPromise\n }, [clearHostedAuthSession, client, hostedAuthConfig, setHostedAuthSession])\n\n useEffect(() => {\n hostedAuthSessionRef.current = hostedAuthSession\n }, [hostedAuthSession])\n\n useEffect(() => {\n if (!hostedAuthStorageKey || typeof window === 'undefined') {\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = null\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(null)\n return\n }\n const restoredSession = readStoredHostedAuthSession(window.sessionStorage, hostedAuthStorageKey)\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = restoredSession\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(restoredSession)\n }, [hostedAuthStorageKey])\n\n useEffect(() => {\n syncHostedAuthSessionToClient(client, hostedAuthConfig, hostedAuthSession)\n }, [client, hostedAuthConfig, hostedAuthSession])\n\n const value = useMemo<PrivanaContextValue>(\n () => ({\n client,\n networkConfig,\n onRamp,\n enabledTokens,\n defaultToken: enabledTokens[0],\n getTokenById,\n getChainById,\n chains: resolvedChains,\n tokensStatus,\n tokensError,\n pollingInterval,\n serviceAddress,\n serviceName,\n serviceIcon,\n hostedAuthConfig,\n hostedAuthSession,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n }),\n [\n client,\n networkConfig,\n onRamp,\n enabledTokens,\n getTokenById,\n getChainById,\n resolvedChains,\n tokensStatus,\n tokensError,\n pollingInterval,\n serviceAddress,\n serviceName,\n serviceIcon,\n hostedAuthConfig,\n hostedAuthSession,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n ]\n )\n\n return (\n <PrivanaContext.Provider value={value}>\n {siweAuth ? (\n <SiweAuthProvider\n client={client}\n networkConfig={networkConfig}\n autoLogin={typeof siweAuth === 'object' ? siweAuth.autoLogin : undefined}\n persistJwt={typeof siweAuth === 'object' ? siweAuth.persistJwt : undefined}\n >\n {children}\n </SiweAuthProvider>\n ) : (\n children\n )}\n </PrivanaContext.Provider>\n )\n}\n\nexport function usePrivanaContext(): PrivanaContextValue {\n const context = useContext(PrivanaContext)\n if (!context) {\n throw new Error('usePrivanaContext must be used within a PrivanaProvider')\n }\n return context\n}\n\nexport function useSafePrivanaContext(): PrivanaContextValue | null {\n return useContext(PrivanaContext)\n}\n","function storageCandidate(name: 'localStorage' | 'sessionStorage'): Storage | undefined {\n try {\n if (typeof window === 'undefined') return undefined\n return window[name] ?? undefined\n } catch {\n return undefined\n }\n}\n\nfunction storageCandidates(): Storage[] {\n return [storageCandidate('localStorage'), storageCandidate('sessionStorage')].filter(\n (storage): storage is Storage => storage !== undefined\n )\n}\n\nexport function canUseBrowserStorage(): boolean {\n const probeKey = 'privana:storage-probe'\n for (const storage of storageCandidates()) {\n try {\n storage.setItem(probeKey, '1')\n storage.removeItem(probeKey)\n return true\n } catch {\n // Try the next storage backend.\n }\n }\n return false\n}\n\nexport function setBrowserStorageItem(key: string, value: string): boolean {\n let stored = false\n for (const storage of storageCandidates()) {\n try {\n storage.setItem(key, value)\n stored = true\n } catch {\n // Keep trying fallbacks so one storage backend can fail without losing recovery.\n }\n }\n return stored\n}\n\nexport function getBrowserStorageItem(key: string): string | null {\n for (const storage of storageCandidates()) {\n try {\n const value = storage.getItem(key)\n if (value !== null) return value\n } catch {\n // Ignore unreadable storage backends.\n }\n }\n return null\n}\n\nexport function removeBrowserStorageItem(key: string): void {\n for (const storage of storageCandidates()) {\n try {\n storage.removeItem(key)\n } catch {\n // Ignore cleanup failures.\n }\n }\n}\n\n/**\n * External deposit sessions coordinate work across tabs, so they require one\n * shared authority. A tab-local fallback can resurrect a session another tab\n * already completed or cancelled.\n */\nexport function canUseSharedBrowserStorage(): boolean {\n const storage = storageCandidate('localStorage')\n if (!storage) return false\n const probeKey = 'privana:shared-storage-probe'\n try {\n storage.setItem(probeKey, '1')\n storage.removeItem(probeKey)\n return true\n } catch {\n return false\n }\n}\n\nexport function setSharedBrowserStorageItem(key: string, value: string): boolean {\n const storage = storageCandidate('localStorage')\n if (!storage) return false\n try {\n storage.setItem(key, value)\n } catch {\n return false\n }\n\n // Clean up a current-tab copy left by development versions which mirrored\n // these new session keys before shared storage became authoritative.\n try {\n storageCandidate('sessionStorage')?.removeItem(key)\n } catch {\n // The shared write above is authoritative.\n }\n return true\n}\n\nexport function getSharedBrowserStorageItem(key: string): string | null {\n try {\n return storageCandidate('localStorage')?.getItem(key) ?? null\n } catch {\n return null\n }\n}\n\nexport function removeSharedBrowserStorageItem(key: string): void {\n // localStorage is authoritative. Removing the current tab's legacy mirror\n // as well prevents confusing leftovers during development and upgrades.\n for (const storage of storageCandidates()) {\n try {\n storage.removeItem(key)\n } catch {\n // Ignore cleanup failures.\n }\n }\n}\n","import type { WalletClient } from 'viem'\nimport type { PrivanaClient } from '../client'\nimport { signLockMessage } from '../signatures'\nimport {\n getBrowserStorageItem,\n removeBrowserStorageItem,\n setBrowserStorageItem,\n} from './browser-storage'\nimport type {\n Address,\n Bytes32,\n LockFundsRequest,\n NetworkConfig,\n TransactionSubmissionResponse,\n} from '../types'\n\n/**\n * Deposit-and-lock without backend involvement: the user pre-signs a regular\n * `Lock` (EIP-712) for the exact expected amount before the deposit, the SDK\n * persists the payload, and submits it to POST /funds/lock once the deposit is\n * credited. Every failure fails closed. Deterministic preflight failures such\n * as a short credit or expired signature can safely request a fresh signature;\n * once an API attempt starts, recovery must replay that signature unless the\n * attempt was cross-tab serialized and definitively rejected.\n * Services must only act on lock confirmation, never on deposit.\n */\nexport interface PostDepositLockConfig {\n /** Service the funds get locked to. Defaults to the provider's `serviceAddress`. */\n serviceAddress?: Address\n /**\n * Lock lifetime in seconds from signing (default 259200, 3 days). The `Lock` expiry is\n * an absolute timestamp baked into the signature, so it runs from signing\n * time, not from credit time — budget for the expected delivery delay.\n */\n lockDuration?: number\n /**\n * Cap on the locked amount in base units (the allowance the service\n * requested). The signed amount is `min(computed amount, maxAmount)`.\n */\n maxAmount?: bigint\n}\n\n/** `PostDepositLockConfig` for on-ramps, where fees make delivery inexact. */\nexport interface OnRampPostDepositLockConfig extends PostDepositLockConfig {\n /**\n * Fraction shaved off the quoted amount before signing (default 0.02), so\n * settlement-rate drift on slow payment rails can't push the delivered\n * amount below the signed amount. The difference stays in the user's\n * available balance. Card purchases target the quote amount; the buffer\n * mainly matters for bank rails that settle at a later rate.\n */\n buffer?: number\n}\n\n// 3 days: on-ramp purchases can sit in manual KYC review or bank-rail\n// settlement for more than a day, and a lock that expires before credit\n// strands the purchase as credited-without-lock.\nexport const DEFAULT_LOCK_DURATION_SECONDS = 259200\nexport const DEFAULT_ONRAMP_LOCK_BUFFER = 0.02\n\n/** Fixed-point scale for the buffer so the shave is integer math (floor). */\nconst BUFFER_SCALE = 1_000_000n\n\n/**\n * `floor(amount × (1 − buffer))` in base units. Always rounds down so the\n * signed amount never exceeds what the buffer is meant to guarantee.\n */\nexport function applyLockBuffer(\n amount: bigint,\n buffer: number = DEFAULT_ONRAMP_LOCK_BUFFER\n): bigint {\n if (!Number.isFinite(buffer) || buffer < 0 || buffer >= 1) {\n throw new Error(`Lock buffer must be in [0, 1), got ${buffer}`)\n }\n // Quantize the shave to ppm rounding UP (with a hair of tolerance for float\n // representation error, e.g. 0.02 × 1e6 → 20000.000000000004), so a buffer\n // finer than ppm can only shave more, never less.\n const shave = BigInt(Math.max(0, Math.ceil(buffer * Number(BUFFER_SCALE) - 1e-6)))\n return (amount * (BUFFER_SCALE - shave)) / BUFFER_SCALE\n}\n\n/**\n * `min(amount, maxAmount)` — the allowance cap the service requested. The\n * signed lock must never exceed it, no matter what the flow computed.\n */\nexport function clampLockAmount(amount: bigint, maxAmount?: bigint): bigint {\n return maxAmount !== undefined && maxAmount < amount ? maxAmount : amount\n}\n\n/**\n * The provider's `serviceAddress` is optional; every lock flow needs it set\n * before a `Lock` can be signed.\n */\nexport function requireServiceAddress(serviceAddress: Address | undefined): Address {\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n return serviceAddress\n}\n\nexport function requireDepositLockOwner(\n walletAddress: Address | undefined,\n beneficiary: Address | null\n): Address {\n if (!walletAddress) throw new Error('No wallet connected')\n if (!beneficiary) throw new Error('No authenticated deposit account')\n if (walletAddress.toLowerCase() !== beneficiary.toLowerCase()) {\n throw new Error('Connected wallet does not match the authenticated deposit account')\n }\n return beneficiary\n}\n\nexport interface CreateSignedLockRequestParams {\n client: PrivanaClient\n walletClient: WalletClient\n userAddress: Address\n networkConfig: NetworkConfig\n serviceAddress: Address\n tokenId: Bytes32\n /** Exact amount to lock, in base units. */\n amount: bigint\n lockDuration?: number\n}\n\nfunction walletClientAccountAddress(walletClient: WalletClient): Address | undefined {\n const account = walletClient.account\n if (!account) return undefined\n return typeof account === 'string' ? account : account.address\n}\n\n/**\n * Fetch the user's lock nonce and sign a ready-to-submit `Lock` payload.\n * Validity is bounded by the single-use nonce — any other lock operation by\n * the user invalidates it, which fails closed (revert → re-prompt).\n */\nexport async function createSignedLockRequest({\n client,\n walletClient,\n userAddress,\n networkConfig,\n serviceAddress,\n tokenId,\n amount,\n lockDuration = DEFAULT_LOCK_DURATION_SECONDS,\n}: CreateSignedLockRequestParams): Promise<LockFundsRequest> {\n if (amount <= 0n) {\n throw new Error('Lock amount must be positive')\n }\n const signerAddress = walletClientAccountAddress(walletClient)\n if (!signerAddress || signerAddress.toLowerCase() !== userAddress.toLowerCase()) {\n throw new Error('Connected wallet does not match the authenticated deposit account')\n }\n const expiry = BigInt(Math.floor(Date.now() / 1000) + lockDuration)\n const { nonce } = await client.getLockNonce(userAddress)\n const signature = await signLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n serviceAddress,\n tokenId,\n amount,\n expiry,\n nonce: BigInt(nonce),\n },\n })\n return {\n service_address: serviceAddress,\n token_id: tokenId,\n amount: amount.toString(),\n expiry: expiry.toString(),\n nonce: String(nonce),\n signature,\n }\n}\n\n// Submitting a lock whose expiry is at or past block.timestamp is a\n// guaranteed revert; the slack absorbs submission latency.\nconst EXPIRY_SLACK_SECONDS = 60\n\n/** False once the signed lock's expiry is too close to be worth submitting. */\nexport function isSignedLockUsable(payload: LockFundsRequest): boolean {\n const expiry = Number(payload.expiry)\n if (!Number.isFinite(expiry)) return false\n return expiry > Math.floor(Date.now() / 1000) + EXPIRY_SLACK_SECONDS\n}\n\nexport type PostDepositLockFailureReason =\n /** The signed lock's expiry passed before the deposit was credited. */\n | 'expired'\n /** The credited amount is below the signed amount; submitting would revert. */\n | 'credited-below-signed'\n /** The API rejected the submission (stale nonce, revert, transport error). */\n | 'submission-failed'\n /** No persisted signed lock for this deposit (storage cleared, other device). */\n | 'not-found'\n\n/**\n * The deposit itself was credited; only the post-credit lock failed. UIs may\n * request a fresh signature only when no prior API attempt could have landed.\n */\nexport class PostDepositLockError extends Error {\n public readonly submissionMayHaveSucceeded: boolean\n\n constructor(\n message: string,\n public readonly reason: PostDepositLockFailureReason,\n public readonly signedAmount?: bigint,\n public readonly creditedAmount?: bigint,\n options?: { cause?: unknown; submissionMayHaveSucceeded?: boolean }\n ) {\n super(message, options)\n this.name = 'PostDepositLockError'\n this.submissionMayHaveSucceeded = options?.submissionMayHaveSucceeded ?? false\n Object.setPrototypeOf(this, PostDepositLockError.prototype)\n }\n}\n\nexport interface SubmitPendingLockParams {\n client: PrivanaClient\n payload: LockFundsRequest\n /** Credited amount in base units, when known — skips a guaranteed revert. */\n creditedAmount?: bigint\n /** Runs after deterministic preflight checks and immediately before the API request. */\n beforeSubmit?: () => void\n}\n\n/**\n * Submit a pre-signed lock after the deposit credited. Throws\n * `PostDepositLockError` on every failure path so callers can route to the\n * re-prompt flow.\n */\nexport async function submitPendingLock({\n client,\n payload,\n creditedAmount,\n beforeSubmit,\n}: SubmitPendingLockParams): Promise<TransactionSubmissionResponse> {\n // Guard the parse so a corrupted stored payload surfaces as a typed error\n // instead of a raw TypeError that callers' catch blocks would re-trip on.\n let signedAmount: bigint\n try {\n signedAmount = BigInt(payload.amount)\n } catch (err) {\n throw new PostDepositLockError(\n 'Stored signed lock payload is malformed',\n 'submission-failed',\n undefined,\n creditedAmount,\n { cause: err }\n )\n }\n if (!isSignedLockUsable(payload)) {\n throw new PostDepositLockError(\n 'Signed lock expired before the deposit was credited',\n 'expired',\n signedAmount,\n creditedAmount\n )\n }\n if (creditedAmount !== undefined && creditedAmount < signedAmount) {\n throw new PostDepositLockError(\n 'Credited amount is below the signed lock amount',\n 'credited-below-signed',\n signedAmount,\n creditedAmount\n )\n }\n try {\n beforeSubmit?.()\n return await client.lockFunds(payload)\n } catch (err) {\n throw new PostDepositLockError(\n err instanceof Error ? err.message : 'Lock submission failed',\n 'submission-failed',\n signedAmount,\n creditedAmount,\n { cause: err }\n )\n }\n}\n\ninterface PendingSignedLock {\n payload: LockFundsRequest\n savedAt: number\n}\n\nfunction pendingLockKey(userAddress: string, correlationId: string): string {\n return `privana:pending-lock:${userAddress.toLowerCase()}:${correlationId}`\n}\n\n/**\n * Persist a signed lock so submission survives a page reload between deposit\n * and credit. `correlationId` ties it to the deposit (tx hash) or on-ramp\n * intent (transaction id).\n */\nexport function savePendingLock(\n userAddress: string,\n correlationId: string,\n payload: LockFundsRequest\n): void {\n const record: PendingSignedLock = { payload, savedAt: Date.now() }\n const stored = setBrowserStorageItem(\n pendingLockKey(userAddress, correlationId),\n JSON.stringify(record)\n )\n if (!stored) {\n throw new Error('Unable to persist signed lock for recovery')\n }\n}\n\n/**\n * Returns the stored payload even when its expiry passed — expiry belongs to\n * `submitPendingLock`, which reports it as a precise `'expired'` failure.\n */\nexport function loadPendingLock(\n userAddress: string,\n correlationId: string\n): LockFundsRequest | undefined {\n const key = pendingLockKey(userAddress, correlationId)\n try {\n const raw = getBrowserStorageItem(key)\n if (!raw) return undefined\n const record = JSON.parse(raw) as PendingSignedLock\n if (!record?.payload?.signature) {\n removeBrowserStorageItem(key)\n return undefined\n }\n return record.payload\n } catch {\n return undefined\n }\n}\n\nexport function clearPendingLock(userAddress: string, correlationId: string): void {\n removeBrowserStorageItem(pendingLockKey(userAddress, correlationId))\n}\n","import { AccountingApiError } from '../client/errors'\nimport type { DepositCheckResponse } from '../types'\n\nexport type DepositFinalityCheckResult =\n | { kind: 'response'; response: DepositCheckResponse }\n | { kind: 'stale' }\n | { kind: 'timeout' }\n\nexport async function checkDepositWithFinalityRetry({\n checkDeposit,\n isStale,\n onRetry,\n timeoutMs,\n retryIntervalMs,\n startedAt = Date.now(),\n now = Date.now,\n sleep = defaultSleep,\n}: {\n checkDeposit: () => Promise<DepositCheckResponse>\n isStale: () => boolean\n onRetry: (message: string) => void\n timeoutMs: number\n retryIntervalMs: number\n startedAt?: number\n now?: () => number\n sleep?: (milliseconds: number) => Promise<void>\n}): Promise<DepositFinalityCheckResult> {\n while (true) {\n if (isStale()) return { kind: 'stale' }\n try {\n const response = await checkDeposit()\n if (!isInsufficientFinalityMessage(response.detail) || response.status !== 'error') {\n return { kind: 'response', response }\n }\n if (response.detail) onRetry(response.detail)\n } catch (error) {\n if (isStale()) return { kind: 'stale' }\n if (!isInsufficientFinalityError(error)) throw error\n onRetry(\n error instanceof AccountingApiError && error.detail\n ? error.detail\n : error instanceof Error\n ? error.message\n : String(error)\n )\n }\n\n if (now() - startedAt > timeoutMs) return { kind: 'timeout' }\n await sleep(retryIntervalMs)\n }\n}\n\nexport function isInsufficientFinalityError(error: unknown): boolean {\n if (error instanceof AccountingApiError) {\n return (\n isInsufficientFinalityMessage(error.detail) || isInsufficientFinalityMessage(error.message)\n )\n }\n return error instanceof Error && isInsufficientFinalityMessage(error.message)\n}\n\nexport function isInsufficientFinalityMessage(message: string | null | undefined): boolean {\n return message?.includes('Insufficient finality') ?? false\n}\n\nfunction defaultSleep(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds))\n}\n","'use client'\n\nimport { useCallback, useContext, useMemo } from 'react'\nimport { WagmiContext } from 'wagmi'\nimport { getWalletClient } from 'wagmi/actions'\nimport { isHostedAuthSessionActive } from '../auth'\nimport { buildSiweLoginMessage } from '../auth/siwe'\nimport { AccountingApiError, HostedAuthRequiredError } from '../client'\nimport type { PrivanaClient } from '../client'\nimport { usePrivanaContext } from '../context'\nimport type { Address, HostedAuthSession } from '../types'\nimport { useSafeAccount } from './use-safe-account'\nimport {\n createScopeKey,\n deleteCachedPrivateReadToken,\n getCachedPrivateReadToken,\n setCachedPrivateReadToken,\n} from './private-read-token-store'\n\nconst INITIAL_AUTH_BACKOFF_MS = 5_000\nconst MAX_AUTH_BACKOFF_MS = 60_000\n\ninterface PrivateReadFailureEntry {\n backoffMs: number\n retryAt: number\n}\n\nconst privateReadFailureCache = new Map<string, PrivateReadFailureEntry>()\nconst privateReadInflight = new Map<string, Promise<string>>()\n\n// Unlike the SIWE path below, hosted auth still installs/clears the bearer on the SHARED client\n// and hands that same client to `request`, so it needs the full PrivanaClient rather than a Pick.\nexport async function executeHostedAuthPrivateReadRequest<T>({\n client,\n hostedAuthSession,\n refreshHostedAuthSession,\n request,\n}: {\n client: PrivanaClient\n hostedAuthSession: HostedAuthSession | null\n refreshHostedAuthSession: () => Promise<HostedAuthSession>\n request: (client: PrivanaClient) => Promise<T>\n}): Promise<T> {\n const ensureHostedAuth = async (forceRefresh: boolean): Promise<string> => {\n if (!hostedAuthSession) {\n throw new HostedAuthRequiredError()\n }\n\n if (!forceRefresh && isHostedAuthSessionActive(hostedAuthSession)) {\n client.clearPrivateReadToken()\n client.setBearerToken(hostedAuthSession.accessToken)\n return hostedAuthSession.accessToken\n }\n\n const refreshed = await refreshHostedAuthSession()\n client.clearPrivateReadToken()\n client.setBearerToken(refreshed.accessToken)\n return refreshed.accessToken\n }\n\n await ensureHostedAuth(false)\n\n try {\n return await request(client)\n } catch (error) {\n if (!(error instanceof AccountingApiError) || error.statusCode !== 401) {\n throw error\n }\n\n await ensureHostedAuth(true)\n return request(client)\n }\n}\n\nfunction clearPrivateReadScope(\n scopeKey: string,\n client: Pick<PrivanaClient, 'clearPrivateReadToken'>\n): void {\n deleteCachedPrivateReadToken(scopeKey)\n privateReadFailureCache.delete(scopeKey)\n client.clearPrivateReadToken()\n}\n\nexport async function executeSiwePrivateReadRequest<T>({\n client,\n scopeKey,\n getToken,\n request,\n}: {\n client: Pick<PrivanaClient, 'withPrivateReadToken' | 'clearPrivateReadToken'>\n scopeKey: string\n getToken: (forceRefresh: boolean) => Promise<string>\n request: (client: PrivanaClient) => Promise<T>\n}): Promise<T> {\n // X-SIWE-Token is mutually exclusive with the JWT bearer, so the request runs against a scoped\n // client that carries it on a separate header set; the shared client's Authorization is untouched.\n const run = (token: string) => request(client.withPrivateReadToken(token))\n const token = await getToken(false)\n try {\n return await run(token)\n } catch (error) {\n if (!(error instanceof AccountingApiError) || error.statusCode !== 401) {\n throw error\n }\n clearPrivateReadScope(scopeKey, client)\n return run(await getToken(true))\n }\n}\n\nfunction recordPrivateReadFailure(scopeKey: string): void {\n const previous = privateReadFailureCache.get(scopeKey)\n const backoffMs = Math.min(\n previous ? previous.backoffMs * 2 : INITIAL_AUTH_BACKOFF_MS,\n MAX_AUTH_BACKOFF_MS\n )\n\n privateReadFailureCache.set(scopeKey, {\n backoffMs,\n retryAt: Date.now() + backoffMs,\n })\n}\n\nfunction ensureFailureBackoff(scopeKey: string): void {\n const failure = privateReadFailureCache.get(scopeKey)\n if (!failure) return\n if (failure.retryAt <= Date.now()) {\n privateReadFailureCache.delete(scopeKey)\n return\n }\n\n throw new Error(\n `Private-read authentication is temporarily paused after a recent failure. Retry in ${Math.ceil(\n (failure.retryAt - Date.now()) / 1000\n )}s.`\n )\n}\n\nexport function usePrivateReadRequest(): {\n executePrivateRead<T>(request: (client: PrivanaClient) => Promise<T>): Promise<T>\n privateReadAddress: Address | null\n privateReadReady: boolean\n privateReadQueryScope: readonly [string, number, Address | null]\n} {\n const wagmiContext = useContext(WagmiContext)\n const { client, networkConfig, hostedAuthConfig, hostedAuthSession, refreshHostedAuthSession } =\n usePrivanaContext()\n const { address: walletAddress } = useSafeAccount()\n const privateReadAddress = hostedAuthConfig\n ? (hostedAuthSession?.address ?? null)\n : (walletAddress ?? null)\n const privateReadReady = hostedAuthConfig ? !!hostedAuthSession : !!walletAddress\n\n const executePrivateRead = useCallback(\n async <T>(request: (client: PrivanaClient) => Promise<T>): Promise<T> => {\n if (hostedAuthConfig) {\n return executeHostedAuthPrivateReadRequest({\n client,\n hostedAuthSession,\n refreshHostedAuthSession,\n request,\n })\n }\n\n if (!wagmiContext) {\n throw new Error('WagmiProvider is required for authenticated private reads')\n }\n if (!walletAddress) {\n throw new Error('No wallet connected')\n }\n\n const apiUrl = networkConfig.apiUrl\n const scopeKey = createScopeKey(apiUrl, networkConfig.chainId, walletAddress)\n\n const getToken = async (forceRefresh: boolean): Promise<string> => {\n const inflight = privateReadInflight.get(scopeKey)\n if (inflight) return inflight\n\n if (!forceRefresh) {\n const cached = getCachedPrivateReadToken(scopeKey)\n if (cached) return cached\n }\n\n ensureFailureBackoff(scopeKey)\n\n const authPromise = (async () => {\n try {\n // Resolved here rather than up front so cache hits never pay a connector round-trip.\n const walletClient = await getWalletClient(wagmiContext)\n if (!walletClient) {\n throw new Error('No wallet client available')\n }\n\n const { message, expirationTime } = await buildSiweLoginMessage(client, {\n address: walletAddress,\n chainId: networkConfig.chainId,\n apiUrl,\n })\n\n const signature = await walletClient.signMessage({\n account: walletClient.account ?? walletAddress,\n message,\n })\n\n const login = await client.loginWithSiwe({\n siwe_message: message,\n signature,\n })\n\n setCachedPrivateReadToken(scopeKey, login.siwe_token, expirationTime.getTime())\n privateReadFailureCache.delete(scopeKey)\n return login.siwe_token\n } catch (error) {\n const authError =\n error instanceof Error ? error : new Error('Failed to authenticate private reads')\n clearPrivateReadScope(scopeKey, client)\n recordPrivateReadFailure(scopeKey)\n throw authError\n } finally {\n privateReadInflight.delete(scopeKey)\n }\n })()\n\n // Store the auth promise immediately so concurrent callers reuse it.\n privateReadInflight.set(scopeKey, authPromise)\n return authPromise\n }\n\n return executeSiwePrivateReadRequest({ client, scopeKey, getToken, request })\n },\n [\n client,\n hostedAuthConfig,\n hostedAuthSession,\n networkConfig.apiUrl,\n networkConfig.chainId,\n refreshHostedAuthSession,\n walletAddress,\n wagmiContext,\n ]\n )\n\n const privateReadQueryScope = useMemo(\n () => [networkConfig.apiUrl, networkConfig.chainId, privateReadAddress] as const,\n [networkConfig.apiUrl, networkConfig.chainId, privateReadAddress]\n )\n\n return {\n executePrivateRead,\n privateReadAddress,\n privateReadReady,\n privateReadQueryScope,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { AccountingApiError } from '../client/errors'\nimport { checkDepositWithFinalityRetry } from './deposit-finality'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { DepositCheckResponse } from '../types'\n\nexport interface VerificationContext {\n /** On-chain transfer that funded the user's Privana deposit address. */\n hash: `0x${string}`\n /** Chain the transfer was mined on. */\n chainId: number\n /** Transferred amount in base units (matches the deposit's token decimals). */\n amount: bigint\n /** Log index of the exact Transfer event within the tx (default: 0). */\n logIndex?: number\n}\n\nexport interface UseDepositVerificationOptions {\n /** Fired when the deposit is credited inside the Privana accounting module. */\n onCredited?: (txHash: string, response: DepositCheckResponse, creditedAmount: bigint) => void\n /** Fired when polling exceeds `pollTimeout` (the deposit may still be processing). */\n onCheckTimeout?: (txHash: string) => void\n onError?: (error: Error) => void\n /**\n * Fired each time `checkDeposit` returns \"Insufficient finality\" and the hook\n * is about to sleep + retry. Non-terminal — does not stop the retry loop.\n * Use this to surface confirmation-progress messages (e.g. \"4/32 confirmations\")\n * to the user while phase 1 is still waiting on chain finality.\n */\n onCheckRetry?: (message: string) => void\n /** Polling interval in ms (default: 5000). */\n pollInterval?: number\n /** Retry interval in ms while the source-chain tx is waiting finality (default: pollInterval). */\n finalityRetryInterval?: number\n /** Max time to wait for credit confirmation in ms (default: 180000). */\n pollTimeout?: number\n}\n\nexport interface UseDepositVerificationResult {\n /** True while phase 1 (checkDeposit) or phase 2 (status polling) is in flight. */\n isVerifying: boolean\n /** True if polling timed out before a terminal status. */\n didTimeout: boolean\n /**\n * True when the on-chain transfer exists but the API verification step failed.\n * Funds are still at the deposit address; call `retryVerification()` to re-run\n * without re-sending the transfer.\n */\n verificationFailed: boolean\n /** True only when this transfer was definitively rejected and another candidate is safe to try. */\n canCheckAnotherTransfer: boolean\n error: Error | null\n /** Current transfer hash being verified, if any. */\n txHash: `0x${string}` | undefined\n /** Kick off Phase 1 (checkDeposit) + Phase 2 (poll getDepositStatus) for the given context. */\n verify: (ctx: VerificationContext) => Promise<void>\n /** Re-run verification against the existing context (after a transient API failure). */\n retryVerification: () => Promise<void>\n /** Discard local tracking (the deposit may still be credited in the background). */\n reset: () => void\n}\n\n/**\n * Phase 1 (POST /deposits/check) + Phase 2 (poll /deposits/status) of the\n * Privana deposit flow, decoupled from the wallet-signing half. Use this\n * directly when the on-chain transfer to the deposit address came from\n * somewhere other than the connected wallet — e.g. a fiat on-ramp that\n * delivers straight to the deposit address.\n *\n * For the full deposit flow (get address → wallet transfer → verify) use\n * `useDeposit`, which composes this hook internally.\n */\nexport function useDepositVerification(\n options: UseDepositVerificationOptions = {}\n): UseDepositVerificationResult {\n const queryClient = useQueryClient()\n const { executePrivateRead } = usePrivateReadRequest()\n\n const pollInterval = options.pollInterval ?? 5000\n const finalityRetryInterval = options.finalityRetryInterval ?? pollInterval\n const pollTimeout = options.pollTimeout ?? 180000\n\n const [isVerifying, setIsVerifying] = useState(false)\n const [didTimeout, setDidTimeout] = useState(false)\n const [verificationFailed, setVerificationFailed] = useState(false)\n const [canCheckAnotherTransfer, setCanCheckAnotherTransfer] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n const verificationContextRef = useRef<VerificationContext | null>(null)\n\n // Stable refs so callers can pass inline callbacks without re-triggering\n // the verify callback's useCallback identity.\n const onCreditedRef = useRef(options.onCredited)\n const onCheckTimeoutRef = useRef(options.onCheckTimeout)\n const onErrorRef = useRef(options.onError)\n const onCheckRetryRef = useRef(options.onCheckRetry)\n useEffect(() => {\n onCreditedRef.current = options.onCredited\n onCheckTimeoutRef.current = options.onCheckTimeout\n onErrorRef.current = options.onError\n onCheckRetryRef.current = options.onCheckRetry\n }, [options.onCredited, options.onCheckTimeout, options.onError, options.onCheckRetry])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const invalidateGeneration = useCallback(() => {\n generationRef.current++\n }, [])\n\n useEffect(() => {\n return () => {\n invalidateGeneration()\n stopPolling()\n }\n }, [invalidateGeneration, stopPolling])\n\n const runVerification = useCallback(\n async (ctx: VerificationContext, generation: number): Promise<void> => {\n const isStale = () => generation !== generationRef.current\n const { hash, chainId, amount, logIndex } = ctx\n\n setVerificationFailed(false)\n setCanCheckAnotherTransfer(false)\n setError(null)\n setDidTimeout(false)\n setIsVerifying(true)\n\n const pollStartTime = Date.now()\n\n const markVerificationFailed = (err: Error, canCheckAnother = false) => {\n setIsVerifying(false)\n setError(err)\n setVerificationFailed(true)\n setCanCheckAnotherTransfer(canCheckAnother)\n onErrorRef.current?.(err)\n }\n\n const markVerificationTimedOut = () => {\n stopPolling()\n setIsVerifying(false)\n setDidTimeout(true)\n onCheckTimeoutRef.current?.(hash)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n }\n\n try {\n // Phase 1: trigger sweep. The backend rejects with \"Insufficient finality\"\n // when the source-chain tx isn't deep enough yet; retry on a slower\n // cadence instead of failing, until pollTimeout.\n const finality = await checkDepositWithFinalityRetry({\n checkDeposit: () =>\n executePrivateRead((readClient) =>\n readClient.checkDeposit({\n chain_id: chainId,\n tx_hash: hash,\n amount: amount.toString(),\n log_index: logIndex,\n })\n ),\n isStale,\n onRetry: (message) => onCheckRetryRef.current?.(message),\n timeoutMs: pollTimeout,\n retryIntervalMs: finalityRetryInterval,\n startedAt: pollStartTime,\n })\n if (finality.kind === 'stale') return\n if (finality.kind === 'timeout') {\n markVerificationTimedOut()\n return\n }\n const triggerResult = finality.response\n if (isStale()) return\n\n if (triggerResult.status === 'credited') {\n const creditedAmount = creditedAmountFromResponse(triggerResult, amount)\n setIsVerifying(false)\n verificationContextRef.current = null\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onCreditedRef.current?.(hash, triggerResult, creditedAmount)\n return\n }\n\n if (triggerResult.status === 'error') {\n markVerificationFailed(new Error(triggerResult.detail ?? 'Deposit verification failed'))\n return\n }\n\n const depositId = triggerResult.deposit_id\n if (!depositId) {\n markVerificationFailed(new Error('Deposit check did not return a deposit id'))\n return\n }\n\n // Phase 2: poll status\n let consecutiveFailures = 0\n\n const checkStatus = async (): Promise<boolean> => {\n if (isStale()) return true\n\n if (Date.now() - pollStartTime > pollTimeout) {\n markVerificationTimedOut()\n return true\n }\n\n try {\n const result = await executePrivateRead((readClient) =>\n readClient.getDepositStatus(depositId)\n )\n if (isStale()) return true\n consecutiveFailures = 0\n\n if (result.status === 'credited') {\n let creditedAmount: bigint\n try {\n creditedAmount = creditedAmountFromResponse(result, amount)\n } catch (err) {\n stopPolling()\n markVerificationFailed(\n err instanceof Error ? err : new Error('Deposit credited amount is invalid'),\n false\n )\n return true\n }\n stopPolling()\n setIsVerifying(false)\n verificationContextRef.current = null\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onCreditedRef.current?.(hash, result, creditedAmount)\n return true\n }\n\n if (result.status === 'error') {\n stopPolling()\n markVerificationFailed(new Error(result.detail ?? 'Deposit verification failed'))\n return true\n }\n } catch (err) {\n if (isStale()) return true\n consecutiveFailures++\n console.warn('Error polling deposit status:', err)\n if (consecutiveFailures >= 3) {\n stopPolling()\n markVerificationFailed(\n err instanceof Error ? err : new Error('Deposit status polling failed')\n )\n return true\n }\n }\n return false\n }\n\n const pollLoop = async () => {\n const done = await checkStatus()\n if (!done && !isStale() && pollIntervalRef.current !== null) {\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n }\n }\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n } catch (err) {\n if (isStale()) return\n stopPolling()\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n markVerificationFailed(error, isDefinitiveCandidateFailure(error))\n }\n },\n [executePrivateRead, finalityRetryInterval, pollInterval, pollTimeout, queryClient, stopPolling]\n )\n\n const verify = useCallback(\n async (ctx: VerificationContext): Promise<void> => {\n generationRef.current++\n stopPolling()\n verificationContextRef.current = ctx\n setTxHash(ctx.hash)\n const generation = generationRef.current\n await runVerification(ctx, generation)\n },\n [runVerification, stopPolling]\n )\n\n const retryVerification = useCallback(async (): Promise<void> => {\n const ctx = verificationContextRef.current\n if (!ctx) {\n throw new Error('No pending verification to retry')\n }\n generationRef.current++\n stopPolling()\n const generation = generationRef.current\n await runVerification(ctx, generation)\n }, [runVerification, stopPolling])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n verificationContextRef.current = null\n setTxHash(undefined)\n setIsVerifying(false)\n setDidTimeout(false)\n setVerificationFailed(false)\n setCanCheckAnotherTransfer(false)\n setError(null)\n }, [stopPolling])\n\n return {\n isVerifying,\n didTimeout,\n verificationFailed,\n canCheckAnotherTransfer,\n error,\n txHash,\n verify,\n retryVerification,\n reset,\n }\n}\n\nfunction creditedAmountFromResponse(\n response: DepositCheckResponse,\n requestedAmount: bigint\n): bigint {\n if (response.amount == null) return requestedAmount\n try {\n const amount = BigInt(response.amount)\n if (amount <= 0n) throw new Error('non-positive amount')\n return amount\n } catch (err) {\n throw new Error('Deposit API returned an invalid credited amount', { cause: err })\n }\n}\n\nfunction isDefinitiveCandidateFailure(error: Error): boolean {\n // The deposit API uses 400 for candidate-specific validation failures. A\n // status response of \"error\" or an accounting 422 can still succeed when\n // the same transfer is retried, so neither is safe to skip.\n return error instanceof AccountingApiError && error.statusCode === 400\n}\n","import { parseUnits, zeroAddress } from 'viem'\nimport type { Allowance } from '../types/allowance'\nimport type { Address, OnRampConfig, OnRampProvider } from '../types'\nimport type { PostDepositLockError } from '../hooks/pending-lock'\nimport type { TokenConfig } from '../types/tokens'\n\nconst BYTES32_PATTERN = /^0x[0-9a-fA-F]{64}$/\nconst PROVIDER_ASSET_CODE_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/\nconst TRANSAK_MINIMUM_TARGET_PERCENT = 105n\n\nexport interface ProductOnRampSelection {\n provider: OnRampProvider | null\n token: TokenConfig | undefined\n providerAssetCode: string | undefined\n /** Explicit product configuration permits no token picker or fallback. */\n tokenSelectionLocked: boolean\n unavailableReason: string | null\n}\n\nexport interface ProductOnRampFlowSnapshot {\n /** Local render identity. It contains no credential or signed intent. */\n id: number\n selection: ProductOnRampSelection & {\n provider: OnRampProvider\n token: TokenConfig\n providerAssetCode: string\n unavailableReason: null\n }\n amount: string\n amountBaseUnits: bigint\n allowance: Allowance | undefined\n requiresLock: boolean\n /** Exact service authorized for the optional pre-signed post-credit lock. */\n lockServiceAddress: Address | undefined\n /** Frozen only for the mounted MoonPay provider; never persisted or logged. */\n moonpayApiKey: string | undefined\n /** Exact Privana deployment and authenticated beneficiary that own this flow. */\n scope: ProductOnRampScope\n}\n\nexport interface ProductOnRampScope {\n apiUrl: string\n accountingChainId: number\n accountingContract: Address\n beneficiaryAddress: Address | null\n}\n\ninterface ResolveProductOnRampOptions {\n config: OnRampConfig | undefined\n enabledTokens: readonly TokenConfig[]\n /** Current modal selection used only by the legacy MoonPay path. */\n legacyToken: TokenConfig | undefined\n moonpayApiKey: string | undefined\n}\n\n/**\n * Resolve the sole product-authorized card flow. Explicit configuration is\n * strict and fail-closed; an absent configuration preserves legacy MoonPay.\n */\nexport function resolveProductOnRamp({\n config,\n enabledTokens,\n legacyToken,\n moonpayApiKey,\n}: ResolveProductOnRampOptions): ProductOnRampSelection {\n if (config === undefined) {\n if (!moonpayApiKey) {\n return unavailable('moonpay', legacyToken, false, 'MoonPay is not configured.')\n }\n if (!legacyToken) {\n return available('moonpay', undefined, undefined, false)\n }\n if (!legacyToken.moonpayCurrencyCode) {\n return unavailable(\n 'moonpay',\n legacyToken,\n false,\n `${legacyToken.symbol} isn’t available for card purchases yet.`\n )\n }\n return available('moonpay', legacyToken, legacyToken.moonpayCurrencyCode, false)\n }\n\n if (!isValidConfig(config)) {\n return unavailable(null, undefined, true, 'Card on-ramp configuration is invalid.')\n }\n\n const providerAssetCode = config.providerAssetCode.trim().toLowerCase()\n const token = enabledTokens.find(\n (candidate) => candidate.id.toLowerCase() === config.tokenId.toLowerCase()\n )\n if (!token) {\n return unavailable(\n config.provider,\n undefined,\n true,\n 'The configured card-purchase token is not enabled.'\n )\n }\n if (token.contract.toLowerCase() === zeroAddress) {\n return unavailable(config.provider, token, true, 'Card purchases require an ERC20 token.')\n }\n\n if (config.provider === 'moonpay') {\n if (!moonpayApiKey) {\n return unavailable('moonpay', token, true, 'MoonPay is not configured.')\n }\n if (\n !token.moonpayCurrencyCode ||\n token.moonpayCurrencyCode.toLowerCase() !== providerAssetCode\n ) {\n return unavailable(\n 'moonpay',\n token,\n true,\n 'The configured MoonPay asset does not match the selected token.'\n )\n }\n }\n\n return available(config.provider, token, providerAssetCode, true)\n}\n\n/** Freeze every user-authorized field before the provider flow is mounted. */\nexport function createProductOnRampFlowSnapshot({\n id,\n selection,\n amount,\n allowance,\n lockServiceAddress,\n moonpayApiKey,\n scope,\n}: {\n id: number\n selection: ProductOnRampSelection\n amount: string\n allowance: Allowance | undefined\n lockServiceAddress: Address | undefined\n moonpayApiKey: string | undefined\n scope: ProductOnRampScope\n}): ProductOnRampFlowSnapshot {\n if (\n selection.unavailableReason ||\n !selection.provider ||\n !selection.token ||\n !selection.providerAssetCode\n ) {\n throw new Error(selection.unavailableReason ?? 'Card on-ramp configuration is unavailable.')\n }\n const amountBaseUnits = parseUnits(amount, selection.token.decimals)\n if (amountBaseUnits <= 0n) throw new Error('Card purchase amount must be positive.')\n if (!scope.beneficiaryAddress) {\n throw new Error('Sign in or connect a wallet before starting a card purchase.')\n }\n if (allowance && !lockServiceAddress) {\n throw new Error('The lock service address is not configured.')\n }\n\n return {\n id,\n selection: {\n ...selection,\n provider: selection.provider,\n token: { ...selection.token },\n providerAssetCode: selection.providerAssetCode,\n unavailableReason: null,\n },\n amount,\n amountBaseUnits,\n allowance: cloneAllowance(allowance),\n requiresLock: allowance !== undefined,\n lockServiceAddress: allowance ? lockServiceAddress : undefined,\n moonpayApiKey: selection.provider === 'moonpay' ? moonpayApiKey : undefined,\n scope: { ...scope },\n }\n}\n\n/** A submitted flow is valid only for the deployment and beneficiary that created it. */\nexport function matchesProductOnRampScope(\n expected: ProductOnRampScope,\n current: ProductOnRampScope\n): boolean {\n return (\n expected.apiUrl === current.apiUrl &&\n expected.accountingChainId === current.accountingChainId &&\n expected.accountingContract.toLowerCase() === current.accountingContract.toLowerCase() &&\n expected.beneficiaryAddress?.toLowerCase() === current.beneficiaryAddress?.toLowerCase()\n )\n}\n\nexport function isMoonPayProductOnRamp(selection: ProductOnRampSelection): boolean {\n return selection.provider === 'moonpay' && !selection.unavailableReason\n}\n\n/** Add the provider-delivery margin and round up in token base units. */\nexport function getTransakMinimumTargetBaseUnits(minimum: bigint): bigint {\n return (minimum * TRANSAK_MINIMUM_TARGET_PERCENT + 99n) / 100n\n}\n\nexport function getOnRampTokenFingerprint(token: TokenConfig | undefined): string {\n if (!token) return ''\n return [token.id.toLowerCase(), token.contract.toLowerCase(), token.chainId, token.decimals].join(\n '\\u0000'\n )\n}\n\n/**\n * The frozen snapshot token is the launch authority. The shared core resolves\n * its token from live configuration by id, so a host config change between\n * snapshot and launch must fail closed instead of silently diverging.\n */\nexport function matchesFrozenOnRampToken(\n frozen: TokenConfig,\n live: TokenConfig | undefined\n): boolean {\n return live !== undefined && getOnRampTokenFingerprint(live) === getOnRampTokenFingerprint(frozen)\n}\n\n/** One outcome policy shared by both product provider leaves. */\nexport function createProductOnRampOutcomeCallbacks({\n requiresLock,\n onComplete,\n onLockFailed,\n}: {\n requiresLock: boolean\n onComplete: () => void\n onLockFailed: (error: PostDepositLockError) => void\n}): {\n onCredited: (() => void) | undefined\n onLockSubmitted: () => void\n onLockFailed: (error: PostDepositLockError) => void\n} {\n return {\n onCredited: requiresLock ? undefined : onComplete,\n onLockSubmitted: onComplete,\n onLockFailed,\n }\n}\n\nfunction isValidConfig(config: OnRampConfig): boolean {\n const candidate: unknown = config\n if (!isPlainRecord(candidate)) return false\n if (candidate.provider !== 'moonpay' && candidate.provider !== 'transak') return false\n if (typeof candidate.tokenId !== 'string' || !BYTES32_PATTERN.test(candidate.tokenId)) {\n return false\n }\n return (\n typeof candidate.providerAssetCode === 'string' &&\n PROVIDER_ASSET_CODE_PATTERN.test(candidate.providerAssetCode.trim())\n )\n}\n\nfunction available(\n provider: OnRampProvider,\n token: TokenConfig | undefined,\n providerAssetCode: string | undefined,\n tokenSelectionLocked: boolean\n): ProductOnRampSelection {\n return {\n provider,\n token,\n providerAssetCode,\n tokenSelectionLocked,\n unavailableReason: null,\n }\n}\n\nfunction unavailable(\n provider: OnRampProvider | null,\n token: TokenConfig | undefined,\n tokenSelectionLocked: boolean,\n unavailableReason: string\n): ProductOnRampSelection {\n return {\n provider,\n token,\n providerAssetCode: undefined,\n tokenSelectionLocked,\n unavailableReason,\n }\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction cloneAllowance(allowance: Allowance | undefined): Allowance | undefined {\n if (!allowance) return undefined\n return {\n value: allowance.value,\n minAmount: allowance.minAmount,\n lockDuration: allowance.lockDuration,\n terms: allowance.terms\n ? {\n permissions: allowance.terms.permissions?.map((term) => ({ ...term })),\n restrictions: allowance.terms.restrictions?.map((term) => ({ ...term })),\n }\n : undefined,\n }\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTokenAmount(\n amount: string | bigint,\n decimals: number = 18,\n maxDecimals: number = 6\n): string {\n const value = typeof amount === 'string' ? BigInt(amount) : amount\n const divisor = 10n ** BigInt(decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const shown = fractionalStr.slice(0, Math.max(2, Math.min(maxDecimals, decimals)))\n const trimmed = shown.replace(/0+$/, '').padEnd(2, '0')\n\n const integerWithSpaces = integerPart.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u2009')\n return `${integerWithSpaces}.${trimmed}`\n}\n\nexport function parseTokenAmount(amount: string, decimals: number = 18): bigint {\n const sanitized = amount.replace(/[\\s\\u2009]/g, '').replace(/,/g, '.')\n const lastDot = sanitized.lastIndexOf('.')\n const integerPart = lastDot === -1 ? sanitized : sanitized.slice(0, lastDot).replace(/\\./g, '')\n const fractionalPart = lastDot === -1 ? '' : sanitized.slice(lastDot + 1)\n const paddedFractional = fractionalPart.padEnd(decimals, '0').slice(0, decimals)\n return BigInt(integerPart + paddedFractional)\n}\n\nexport function shortenAddress(address: string, chars: number = 4): string {\n if (!address || address.length < chars * 2 + 2) return address\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`\n}\n\nexport function formatTimestamp(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleString()\n}\n\nexport function isExpired(expiry: number): boolean {\n return Math.floor(Date.now() / 1000) > expiry\n}\n\nexport function formatTimeRemaining(expiryTimestamp: number): string {\n const now = Math.floor(Date.now() / 1000)\n const diff = expiryTimestamp - now\n\n if (diff <= 0) return 'Expired'\n\n const days = Math.floor(diff / 86400)\n const hours = Math.floor((diff % 86400) / 3600)\n const minutes = Math.floor((diff % 3600) / 60)\n\n if (days > 0) {\n return hours > 0 ? `${days}d ${hours}h left` : `${days}d left`\n }\n if (hours > 0) {\n return minutes > 0 ? `${hours}h ${minutes}m left` : `${hours}h left`\n }\n return `${minutes}m left`\n}\n\nexport function formatCountdown(secondsLeft: number): string {\n const clamped = Math.max(0, secondsLeft)\n const minutes = Math.floor(clamped / 60)\n const seconds = clamped % 60\n return `${minutes}m:${String(seconds).padStart(2, '0')}s`\n}\n\nexport function formatRelativeTime(timestamp: string | number): string {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : new Date(timestamp * 1000)\n const now = new Date()\n const diff = Math.floor((now.getTime() - date.getTime()) / 1000)\n\n if (diff < 60) return 'Just now'\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)}d ago`\n return date.toLocaleDateString()\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { cn } from '@/lib/utils'\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-secondary animate-pulse rounded-md', className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import type { OnRampProviderEvent } from './provider'\nimport type { OnRampProviderAdapter } from './provider'\n\nexport const moonPayOnRampAdapter: OnRampProviderAdapter = {\n provider: 'moonpay',\n pollPendingWhileOpen: true,\n buildIntentRequest: ({ walletAddress, tokenId, chainId, providerAssetCode }) => ({\n wallet_address: walletAddress,\n token_id: tokenId,\n chain_id: chainId,\n moonpay_currency_code: providerAssetCode,\n }),\n registerTransaction: async ({ client, intentId, providerTransactionId, tokenId, chainId }) =>\n client.updateOnRamp(intentId, {\n token_id: tokenId,\n chain_id: chainId,\n moonpay_transaction_id:\n intentId === providerTransactionId ? undefined : providerTransactionId,\n }),\n recordDeposit: async ({ client, record, depositTxHash }) =>\n client.updateOnRamp(record.transaction_id, {\n deposit_tx_hash: depositTxHash,\n }),\n}\n\ninterface MoonPayTransactionEvent {\n id: string\n externalTransactionId?: string | null\n}\n\nexport function normalizeMoonPayProviderEvent(\n kind: OnRampProviderEvent['kind'],\n event: MoonPayTransactionEvent\n): OnRampProviderEvent {\n return {\n provider: 'moonpay',\n kind,\n providerTransactionId: event.id,\n intentId: event.externalTransactionId || undefined,\n }\n}\n","import type {\n Account,\n Chain,\n Client,\n PublicActions,\n RpcSchema,\n Transport,\n WalletActions,\n} from 'viem'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n transport extends Transport,\n chain extends Chain | undefined,\n account extends Account | undefined,\n rpcSchema extends RpcSchema | undefined,\n extended extends { [key: string]: unknown },\n client extends Client<transport, chain, account, rpcSchema, extended>,\n parameters,\n returnType,\n>(\n client: client,\n actionFn: (_: any, parameters: parameters) => returnType,\n // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n // meaning that `actionFn.name` will not always work. For that case, the consumer\n // needs to pass the name explicitly.\n name: keyof PublicActions | keyof WalletActions,\n): (parameters: parameters) => returnType {\n const action_implicit = client[actionFn.name]\n if (typeof action_implicit === 'function')\n return action_implicit as (params: parameters) => returnType\n\n const action_explicit = client[name]\n if (typeof action_explicit === 'function')\n return action_explicit as (params: parameters) => returnType\n\n return (params) => actionFn(client, params)\n}\n","export const version = '3.3.1'\n","import { version } from '../version.js'\n\nexport const getVersion = () => `@wagmi/core@${version}`\n","import type { Compute, OneOf } from '../types/utils.js'\nimport { getVersion } from '../utils/getVersion.js'\n\nexport type ErrorType<name extends string = 'Error'> = Error & { name: name }\n\ntype BaseErrorOptions = Compute<\n OneOf<{ details?: string | undefined } | { cause: BaseError | Error }> & {\n docsPath?: string | undefined\n docsSlug?: string | undefined\n metaMessages?: string[] | undefined\n }\n>\n\nexport type BaseErrorType = BaseError & { name: 'WagmiCoreError' }\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n\n override name = 'WagmiCoreError'\n get docsBaseUrl() {\n return 'https://wagmi.sh/core'\n }\n get version() {\n return getVersion()\n }\n\n constructor(shortMessage: string, options: BaseErrorOptions = {}) {\n super()\n\n const details =\n options.cause instanceof BaseError\n ? options.cause.details\n : options.cause?.message\n ? options.cause.message\n : options.details!\n const docsPath =\n options.cause instanceof BaseError\n ? options.cause.docsPath || options.docsPath\n : options.docsPath\n\n this.message = [\n shortMessage || 'An error occurred.',\n '',\n ...(options.metaMessages ? [...options.metaMessages, ''] : []),\n ...(docsPath\n ? [\n `Docs: ${this.docsBaseUrl}${docsPath}.html${\n options.docsSlug ? `#${options.docsSlug}` : ''\n }`,\n ]\n : []),\n ...(details ? [`Details: ${details}`] : []),\n `Version: ${this.version}`,\n ].join('\\n')\n\n if (options.cause) this.cause = options.cause\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = options.metaMessages\n this.shortMessage = shortMessage\n }\n\n walk(fn?: (err: unknown) => boolean) {\n return this.#walk(this, fn)\n }\n\n #walk(err: unknown, fn?: (err: unknown) => boolean): unknown {\n if (fn?.(err)) return err\n if ((err as Error).cause) return this.#walk((err as Error).cause, fn)\n return err\n }\n}\n","import type { Address } from 'viem'\n\nimport type { Connector } from '../createConfig.js'\nimport { BaseError } from './base.js'\n\nexport type ChainNotConfiguredErrorType = ChainNotConfiguredError & {\n name: 'ChainNotConfiguredError'\n}\nexport class ChainNotConfiguredError extends BaseError {\n override name = 'ChainNotConfiguredError'\n constructor() {\n super('Chain not configured.')\n }\n}\n\nexport type ConnectorAlreadyConnectedErrorType =\n ConnectorAlreadyConnectedError & {\n name: 'ConnectorAlreadyConnectedError'\n }\nexport class ConnectorAlreadyConnectedError extends BaseError {\n override name = 'ConnectorAlreadyConnectedError'\n constructor() {\n super('Connector already connected.')\n }\n}\n\nexport type ConnectorNotConnectedErrorType = ConnectorNotConnectedError & {\n name: 'ConnectorNotConnectedError'\n}\nexport class ConnectorNotConnectedError extends BaseError {\n override name = 'ConnectorNotConnectedError'\n constructor() {\n super('Connector not connected.')\n }\n}\n\nexport type ConnectorNotFoundErrorType = ConnectorNotFoundError & {\n name: 'ConnectorNotFoundError'\n}\nexport class ConnectorNotFoundError extends BaseError {\n override name = 'ConnectorNotFoundError'\n constructor() {\n super('Connector not found.')\n }\n}\n\nexport type ConnectorAccountNotFoundErrorType =\n ConnectorAccountNotFoundError & {\n name: 'ConnectorAccountNotFoundError'\n }\nexport class ConnectorAccountNotFoundError extends BaseError {\n override name = 'ConnectorAccountNotFoundError'\n constructor({\n address,\n connector,\n }: {\n address: Address\n connector: Connector\n }) {\n super(`Account \"${address}\" not found for connector \"${connector.name}\".`)\n }\n}\n\nexport type ConnectorChainMismatchErrorType = ConnectorAccountNotFoundError & {\n name: 'ConnectorChainMismatchError'\n}\nexport class ConnectorChainMismatchError extends BaseError {\n override name = 'ConnectorChainMismatchError'\n constructor({\n connectionChainId,\n connectorChainId,\n }: {\n connectionChainId: number\n connectorChainId: number\n }) {\n super(\n `The current chain of the connector (id: ${connectorChainId}) does not match the connection's chain (id: ${connectionChainId}).`,\n {\n metaMessages: [\n `Current Chain ID: ${connectorChainId}`,\n `Expected Chain ID: ${connectionChainId}`,\n ],\n },\n )\n }\n}\n\nexport type ConnectorUnavailableReconnectingErrorType =\n ConnectorUnavailableReconnectingError & {\n name: 'ConnectorUnavailableReconnectingError'\n }\nexport class ConnectorUnavailableReconnectingError extends BaseError {\n override name = 'ConnectorUnavailableReconnectingError'\n constructor({ connector }: { connector: { name: string } }) {\n super(`Connector \"${connector.name}\" unavailable while reconnecting.`, {\n details: [\n 'During the reconnection step, the only connector methods guaranteed to be available are: `id`, `name`, `type`, `uid`.',\n 'All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored.',\n 'This error commonly occurs for connectors that asynchronously inject after reconnection has already started.',\n ].join(' '),\n })\n }\n}\n","import {\n type Account,\n type Address,\n type BaseErrorType,\n type Client,\n createClient,\n custom,\n} from 'viem'\nimport { getAddress, parseAccount } from 'viem/utils'\n\nimport type { Config, Connection } from '../createConfig.js'\nimport type { ErrorType } from '../errors/base.js'\nimport {\n ConnectorAccountNotFoundError,\n type ConnectorAccountNotFoundErrorType,\n ConnectorChainMismatchError,\n type ConnectorChainMismatchErrorType,\n ConnectorNotConnectedError,\n type ConnectorNotConnectedErrorType,\n ConnectorUnavailableReconnectingError,\n type ConnectorUnavailableReconnectingErrorType,\n} from '../errors/config.js'\nimport type {\n ChainIdParameter,\n ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type GetConnectorClientParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n ChainIdParameter<config, chainId> &\n ConnectorParameter & {\n /**\n * Account to use for the client.\n *\n * - `Account | Address`: An Account MUST exist on the connector.\n * - `null`: Account MAY NOT exist on the connector. This is useful for\n * actions that can infer the account from the connector (e.g. sending a\n * call without a connected account – the user will be prompted to select\n * an account within the wallet).\n */\n account?: Address | Account | null | undefined\n /**\n * Assert that the current chain ID matches the connector's chain ID.\n */\n assertChainId?: boolean | undefined\n }\n>\n\nexport type GetConnectorClientReturnType<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n Client<\n config['_internal']['transports'][chainId],\n Extract<config['chains'][number], { id: chainId }>,\n Account\n >\n>\n\nexport type GetConnectorClientErrorType =\n | ConnectorAccountNotFoundErrorType\n | ConnectorChainMismatchErrorType\n | ConnectorNotConnectedErrorType\n | ConnectorUnavailableReconnectingErrorType\n // base\n | BaseErrorType\n | ErrorType\n\n/** https://wagmi.sh/core/api/actions/getConnectorClient */\nexport async function getConnectorClient<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: GetConnectorClientParameters<config, chainId> = {},\n): Promise<GetConnectorClientReturnType<config, chainId>> {\n const { assertChainId = true } = parameters\n\n // Get connection\n let connection: Connection | undefined\n if (parameters.connector) {\n const { connector } = parameters\n if (\n config.state.status === 'reconnecting' &&\n !connector.getAccounts &&\n !connector.getChainId\n )\n throw new ConnectorUnavailableReconnectingError({ connector })\n\n const [accounts, chainId] = await Promise.all([\n connector.getAccounts().catch((e) => {\n if (parameters.account === null) return []\n throw e\n }),\n connector.getChainId(),\n ])\n connection = {\n accounts: accounts as readonly [Address, ...Address[]],\n chainId,\n connector,\n }\n } else connection = config.state.connections.get(config.state.current!)\n if (!connection) throw new ConnectorNotConnectedError()\n\n const chainId = parameters.chainId ?? connection.chainId\n\n // Check connector using same chainId as connection\n const connectorChainId = await connection.connector.getChainId()\n if (assertChainId && connectorChainId !== chainId)\n throw new ConnectorChainMismatchError({\n connectionChainId: chainId,\n connectorChainId,\n })\n\n // If connector has custom `getClient` implementation\n type Return = GetConnectorClientReturnType<config, chainId>\n const connector = connection.connector\n if (connector.getClient)\n return connector.getClient({ chainId }) as unknown as Return\n\n // Default using `custom` transport\n const account = parseAccount(parameters.account ?? connection.accounts[0]!)\n if (account) account.address = getAddress(account.address) // TODO: Checksum address as part of `parseAccount`?\n\n // If account was provided, check that it exists on the connector\n if (\n parameters.account &&\n !connection.accounts.some(\n (x) => x.toLowerCase() === account.address.toLowerCase(),\n )\n )\n throw new ConnectorAccountNotFoundError({\n address: account.address,\n connector,\n })\n\n const chain = config.chains.find((chain) => chain.id === chainId)\n const provider = (await connection.connector.getProvider({ chainId })) as {\n request(...args: any): Promise<any>\n }\n\n return createClient({\n account,\n chain,\n name: 'Connector Client',\n transport: (opts) => custom(provider)({ ...opts, retryCount: 0 }),\n }) as Return\n}\n","import {\n type GetBlockNumberErrorType as viem_GetBlockNumberErrorType,\n type GetBlockNumberParameters as viem_GetBlockNumberParameters,\n type GetBlockNumberReturnType as viem_GetBlockNumberReturnType,\n getBlockNumber as viem_getBlockNumber,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBlockNumberParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<viem_GetBlockNumberParameters & ChainIdParameter<config, chainId>>\n\nexport type GetBlockNumberReturnType = viem_GetBlockNumberReturnType\n\nexport type GetBlockNumberErrorType = viem_GetBlockNumberErrorType\n\n/** https://wagmi.sh/core/api/actions/getBlockNumber */\nexport function getBlockNumber<\n config extends Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n config: config,\n parameters: GetBlockNumberParameters<config, chainId> = {},\n): Promise<GetBlockNumberReturnType> {\n const { chainId, ...rest } = parameters\n const client = config.getClient({ chainId })\n const action = getAction(client, viem_getBlockNumber, 'getBlockNumber')\n return action(rest)\n}\n","import type { Config } from '../createConfig.js'\n\nexport type GetChainIdReturnType<config extends Config = Config> =\n config['chains'][number]['id']\n\n/** https://wagmi.sh/core/api/actions/getChainId */\nexport function getChainId<config extends Config>(\n config: config,\n): GetChainIdReturnType<config> {\n return config.state.chainId\n}\n","import type { Chain } from 'viem'\nimport {\n type GetTransactionReceiptErrorType as viem_GetTransactionReceiptErrorType,\n type GetTransactionReceiptParameters as viem_GetTransactionReceiptParameters,\n type GetTransactionReceiptReturnType as viem_GetTransactionReceiptReturnType,\n getTransactionReceipt as viem_getTransactionReceipt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetTransactionReceiptParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n viem_GetTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type GetTransactionReceiptReturnType<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n ///\n chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n {\n [key in keyof chains]: viem_GetTransactionReceiptReturnType<\n IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n > & { chainId: chains[key]['id'] }\n }[number]\n>\n\nexport type GetTransactionReceiptErrorType = viem_GetTransactionReceiptErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransactionReceipt */\nexport async function getTransactionReceipt<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: GetTransactionReceiptParameters<config>,\n): Promise<GetTransactionReceiptReturnType<config, chainId>> {\n const { chainId, ...rest } = parameters\n const client = config.getClient({ chainId })\n const action = getAction(\n client,\n viem_getTransactionReceipt,\n 'getTransactionReceipt',\n )\n return action(rest) as unknown as Promise<\n GetTransactionReceiptReturnType<config, chainId>\n >\n}\n","import { type Account, type WalletClient, walletActions } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { Compute } from '../types/utils.js'\nimport {\n type GetConnectorClientErrorType,\n type GetConnectorClientParameters,\n getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type GetWalletClientParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = GetConnectorClientParameters<Config, chainId>\n\nexport type GetWalletClientReturnType<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n WalletClient<\n config['_internal']['transports'][chainId],\n Extract<config['chains'][number], { id: chainId }>,\n Account\n >\n>\n\nexport type GetWalletClientErrorType =\n // getConnectorClient()\n | GetConnectorClientErrorType\n // base\n | BaseErrorType\n | ErrorType\n\nexport async function getWalletClient<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: GetWalletClientParameters<config, chainId> = {},\n): Promise<GetWalletClientReturnType<config, chainId>> {\n const client = await getConnectorClient(config, parameters)\n // @ts-ignore\n return client.extend(walletActions) as unknown as GetWalletClientReturnType<\n config,\n chainId\n >\n}\n","import type { Chain } from 'viem'\nimport { hexToString } from 'viem'\nimport {\n call,\n getTransaction,\n type WaitForTransactionReceiptErrorType as viem_WaitForTransactionReceiptErrorType,\n type WaitForTransactionReceiptParameters as viem_WaitForTransactionReceiptParameters,\n type WaitForTransactionReceiptReturnType as viem_WaitForTransactionReceiptReturnType,\n waitForTransactionReceipt as viem_waitForTransactionReceipt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WaitForTransactionReceiptParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n viem_WaitForTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type WaitForTransactionReceiptReturnType<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n ///\n chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n {\n [key in keyof chains]: viem_WaitForTransactionReceiptReturnType<\n IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n > & { chainId: chains[key]['id'] }\n }[number]\n>\n\nexport type WaitForTransactionReceiptErrorType =\n viem_WaitForTransactionReceiptErrorType\n\nexport async function waitForTransactionReceipt<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: WaitForTransactionReceiptParameters<config, chainId>,\n): Promise<WaitForTransactionReceiptReturnType<config, chainId>> {\n const { chainId, timeout = 0, ...rest } = parameters\n\n const client = config.getClient({ chainId })\n const action = getAction(\n client,\n viem_waitForTransactionReceipt,\n 'waitForTransactionReceipt',\n )\n const receipt = await action({ ...rest, timeout })\n\n if (receipt.status === 'reverted') {\n const action_getTransaction = getAction(\n client,\n getTransaction,\n 'getTransaction',\n )\n const { from: account, ...txn } = await action_getTransaction({\n hash: receipt.transactionHash,\n })\n const action_call = getAction(client, call, 'call')\n const code = await action_call({\n ...(txn as any),\n account,\n data: txn.input,\n gasPrice: txn.type !== 'eip1559' ? txn.gasPrice : undefined,\n maxFeePerGas: txn.type === 'eip1559' ? txn.maxFeePerGas : undefined,\n maxPriorityFeePerGas:\n txn.type === 'eip1559' ? txn.maxPriorityFeePerGas : undefined,\n })\n const reason = code?.data\n ? hexToString(`0x${code.data.substring(138)}`)\n : 'unknown reason'\n throw new Error(reason)\n }\n\n return {\n ...receipt,\n chainId: client.chain.id,\n } as WaitForTransactionReceiptReturnType<config, chainId>\n}\n","import type { PrivanaClient } from '../client'\nimport type {\n Address,\n Bytes32,\n CreateOnRampIntentRequest,\n HexString,\n OnRampProvider,\n OnRampRecord,\n} from '../types'\n\nexport interface OnRampProviderIntentInput {\n walletAddress: Address\n tokenId: Bytes32\n chainId: number\n providerAssetCode: string\n}\n\nexport interface OnRampProviderTransactionContext {\n client: PrivanaClient\n intentId: string\n providerTransactionId: string\n tokenId: Bytes32\n chainId: number\n}\n\nexport interface OnRampProviderDepositContext {\n client: PrivanaClient\n record: OnRampRecord\n depositTxHash: HexString\n}\n\n/**\n * The deliberately small backend-facing provider seam. Provider launch UI\n * normalizes its callbacks into `OnRampProviderEvent`; the shared hook owns\n * recovery, receipt verification, credit, and lock settlement.\n */\nexport interface OnRampProviderAdapter {\n provider: OnRampProvider\n pollPendingWhileOpen: boolean\n buildIntentRequest(input: OnRampProviderIntentInput): CreateOnRampIntentRequest\n registerTransaction?(context: OnRampProviderTransactionContext): Promise<OnRampRecord | undefined>\n /**\n * Optional provider compatibility write after Privana has already credited\n * the verified on-chain deposit. It never authorizes or gates credit.\n */\n recordDeposit?(context: OnRampProviderDepositContext): Promise<OnRampRecord | undefined>\n}\n\nexport type OnRampProviderEventKind = 'transaction-created' | 'transaction-completed'\n\nexport interface OnRampProviderEvent {\n provider: OnRampProvider\n kind: OnRampProviderEventKind\n providerTransactionId: string\n /** Signed Privana intent echoed by the provider, when present. */\n intentId?: string\n}\n\nexport interface OnRampProviderEventTarget {\n intentId: string\n isActive: boolean\n isStale: boolean\n}\n\nexport function resolveOnRampProviderEventTarget(\n configuredProvider: OnRampProvider,\n activeIntentId: string | null,\n event: OnRampProviderEvent\n): OnRampProviderEventTarget {\n if (event.provider !== configuredProvider) {\n throw new Error(\n `On-ramp event provider ${event.provider} does not match configured adapter ${configuredProvider}`\n )\n }\n if (!event.providerTransactionId) {\n throw new Error('On-ramp provider event is missing a transaction id')\n }\n\n const intentId = event.intentId || activeIntentId || event.providerTransactionId\n const isActive = activeIntentId !== null && intentId === activeIntentId\n return {\n intentId,\n isActive,\n isStale: activeIntentId !== null && event.intentId !== undefined && !isActive,\n }\n}\n\nexport function assertOnRampRecordProvider(\n record: OnRampRecord,\n configuredProvider: OnRampProvider\n): void {\n if (record.provider !== configuredProvider) {\n throw new Error(\n `On-ramp record provider ${String(record.provider)} does not match configured adapter ${configuredProvider}`\n )\n }\n}\n\n/**\n * A newly created signed intent is launch authority, so every field that can\n * redirect delivery or credit must echo the exact request. Pending recovery\n * records remain more permissive because older records can omit these fields.\n */\nexport function assertCreatedOnRampIntent(\n record: OnRampRecord,\n configuredProvider: OnRampProvider,\n expected: OnRampProviderIntentInput\n): void {\n assertOnRampRecordProvider(record, configuredProvider)\n if (\n typeof record.provider_asset_code !== 'string' ||\n record.provider_asset_code.toLowerCase() !== expected.providerAssetCode.toLowerCase()\n ) {\n throw new Error(\n `On-ramp intent asset ${record.provider_asset_code} does not match requested asset ${expected.providerAssetCode}`\n )\n }\n if (\n typeof record.token_id !== 'string' ||\n record.token_id.toLowerCase() !== expected.tokenId.toLowerCase()\n ) {\n throw new Error('On-ramp intent token does not match the requested token')\n }\n if (record.chain_id !== expected.chainId) {\n throw new Error('On-ramp intent chain does not match the requested chain')\n }\n if (\n typeof record.wallet_address !== 'string' ||\n record.wallet_address.toLowerCase() !== expected.walletAddress.toLowerCase()\n ) {\n throw new Error('On-ramp intent wallet does not match the Privana deposit address')\n }\n}\n\nexport function matchesOnRampTransaction(record: OnRampRecord, transactionId: string): boolean {\n return (\n record.transaction_id === transactionId ||\n record.external_transaction_id === transactionId ||\n record.provider_transaction_id === transactionId ||\n record.moonpay_transaction_id === transactionId\n )\n}\n\nexport function getOnRampIntentId(record: OnRampRecord): string {\n return record.external_transaction_id ?? record.transaction_id\n}\n\n/**\n * Local verification ownership follows the signed Privana intent. A provider\n * payout transaction can contain transfers for more than one signed order.\n */\nexport function getOnRampVerificationKey(record: OnRampRecord): string {\n return getOnRampIntentId(record)\n}\n\nexport function canRetryOnRampVerification(\n record: OnRampRecord,\n activeVerificationId: string | null\n): boolean {\n return Boolean(record.on_chain_tx_hash) && activeVerificationId === null\n}\n\nexport async function recordOnRampProviderDeposit(\n adapter: OnRampProviderAdapter,\n context: OnRampProviderDepositContext\n): Promise<OnRampRecord | undefined> {\n if (context.record.provider !== adapter.provider) return undefined\n return adapter.recordDeposit?.(context)\n}\n\nexport async function verifyPendingOnRampsSequentially({\n records,\n shouldStop,\n wasTriggered,\n trigger,\n waitForTerminal,\n}: {\n records: readonly OnRampRecord[]\n shouldStop: () => boolean\n wasTriggered: (verificationKey: string) => boolean\n trigger: (record: OnRampRecord) => Promise<void>\n waitForTerminal: (verificationKey: string) => Promise<void>\n}): Promise<void> {\n for (const record of records) {\n if (shouldStop()) return\n if (!record.on_chain_tx_hash) continue\n const key = getOnRampVerificationKey(record)\n if (wasTriggered(key)) continue\n try {\n await trigger(record)\n } catch {\n continue\n }\n await waitForTerminal(key)\n }\n}\n","import { AccountingApiError } from '../client'\nimport type { PrivanaClient } from '../client'\nimport type { Address, OnRampRecord, PendingOnRampsResponse } from '../types'\nimport {\n getBrowserStorageItem,\n removeBrowserStorageItem,\n setBrowserStorageItem,\n} from '../hooks/browser-storage'\nimport { getOnRampIntentId, getOnRampVerificationKey } from './provider'\n\nexport const MAX_UNRESOLVED_ONRAMP_INTENTS = 10\nexport const MAX_CREDITED_ONRAMP_VERIFICATIONS = 1_000\n/**\n * A pending read can fan out to isolate up to ten invalid signed intents.\n * Ten seconds leaves room under the backend's 20 requests / 60 seconds limit\n * even for that one-time recovery burst.\n */\nexport const MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS = 10_000\nconst ONRAMP_INTENT_RETENTION_MS = 365 * 24 * 60 * 60 * 1000\nconst ONRAMP_RECOVERY_VERSION = 1\n// Version 1 stored payout transaction hashes, which can span multiple signed\n// orders. Discard those broad markers instead of letting them hide an intent.\nconst ONRAMP_CREDIT_RECOVERY_VERSION = 2\n\nexport interface OnRampRecoveryScope {\n apiUrl: string\n chainId: number\n userAddress: Address\n}\n\nexport interface UnresolvedOnRampIntent {\n transactionId: string\n savedAt: number\n}\n\ninterface PersistedOnRampRecovery {\n version: typeof ONRAMP_RECOVERY_VERSION\n intents: UnresolvedOnRampIntent[]\n}\n\nexport interface CreditedOnRampVerification {\n verificationKey: string\n savedAt: number\n}\n\ninterface PersistedOnRampCredits {\n version: typeof ONRAMP_CREDIT_RECOVERY_VERSION\n verifications: CreditedOnRampVerification[]\n}\n\nfunction recoveryKey(scope: OnRampRecoveryScope): string {\n const api = encodeURIComponent(scope.apiUrl.replace(/\\/$/, ''))\n return `privana:onramp-intents:${api}:${scope.chainId}:${scope.userAddress.toLowerCase()}`\n}\n\nfunction creditedRecoveryKey(scope: OnRampRecoveryScope): string {\n const api = encodeURIComponent(scope.apiUrl.replace(/\\/$/, ''))\n return `privana:onramp-credited:${api}:${scope.chainId}:${scope.userAddress.toLowerCase()}`\n}\n\nfunction isIntent(value: unknown): value is UnresolvedOnRampIntent {\n if (!value || typeof value !== 'object') return false\n const intent = value as Partial<UnresolvedOnRampIntent>\n return (\n typeof intent.transactionId === 'string' &&\n intent.transactionId.length > 0 &&\n intent.transactionId.length <= 512 &&\n Number.isFinite(intent.savedAt) &&\n (intent.savedAt ?? 0) > 0\n )\n}\n\nfunction writeIntents(scope: OnRampRecoveryScope, intents: UnresolvedOnRampIntent[]): boolean {\n if (intents.length === 0) {\n removeBrowserStorageItem(recoveryKey(scope))\n return true\n }\n return setBrowserStorageItem(\n recoveryKey(scope),\n JSON.stringify({\n version: ONRAMP_RECOVERY_VERSION,\n intents,\n } satisfies PersistedOnRampRecovery)\n )\n}\n\nfunction isCreditedVerification(value: unknown): value is CreditedOnRampVerification {\n if (!value || typeof value !== 'object') return false\n const verification = value as Partial<CreditedOnRampVerification>\n return (\n typeof verification.verificationKey === 'string' &&\n verification.verificationKey.length > 0 &&\n verification.verificationKey.length <= 512 &&\n Number.isFinite(verification.savedAt) &&\n (verification.savedAt ?? 0) > 0\n )\n}\n\nfunction writeCreditedVerifications(\n scope: OnRampRecoveryScope,\n verifications: CreditedOnRampVerification[]\n): boolean {\n const key = creditedRecoveryKey(scope)\n if (verifications.length === 0) {\n removeBrowserStorageItem(key)\n return true\n }\n return setBrowserStorageItem(\n key,\n JSON.stringify({\n version: ONRAMP_CREDIT_RECOVERY_VERSION,\n verifications,\n } satisfies PersistedOnRampCredits)\n )\n}\n\nexport function loadUnresolvedOnRampIntents(\n scope: OnRampRecoveryScope,\n now = Date.now()\n): UnresolvedOnRampIntent[] {\n const key = recoveryKey(scope)\n try {\n const raw = getBrowserStorageItem(key)\n if (!raw) return []\n const parsed = JSON.parse(raw) as Partial<PersistedOnRampRecovery>\n if (parsed.version !== ONRAMP_RECOVERY_VERSION || !Array.isArray(parsed.intents)) {\n removeBrowserStorageItem(key)\n return []\n }\n\n const retained = parsed.intents\n .filter(isIntent)\n .filter((intent) => now - intent.savedAt <= ONRAMP_INTENT_RETENTION_MS)\n .sort((left, right) => left.savedAt - right.savedAt)\n .slice(-MAX_UNRESOLVED_ONRAMP_INTENTS)\n if (retained.length !== parsed.intents.length) writeIntents(scope, retained)\n return retained\n } catch {\n removeBrowserStorageItem(key)\n return []\n }\n}\n\nexport function rememberUnresolvedOnRampIntent(\n scope: OnRampRecoveryScope,\n transactionId: string,\n now = Date.now()\n): boolean {\n const intents = loadUnresolvedOnRampIntents(scope, now).filter(\n (intent) => intent.transactionId !== transactionId\n )\n intents.push({ transactionId, savedAt: now })\n return writeIntents(scope, intents.slice(-MAX_UNRESOLVED_ONRAMP_INTENTS))\n}\n\nexport function forgetUnresolvedOnRampIntent(\n scope: OnRampRecoveryScope,\n transactionId: string,\n now = Date.now()\n): void {\n const intents = loadUnresolvedOnRampIntents(scope, now).filter(\n (intent) => intent.transactionId !== transactionId\n )\n writeIntents(scope, intents)\n}\n\n/**\n * Load bounded local markers for deposits already credited by Privana.\n * Provider rows can remain visible after credit, so these keys prevent a\n * reload from submitting the same verified deposit again.\n */\nexport function loadCreditedOnRampVerifications(\n scope: OnRampRecoveryScope,\n now = Date.now()\n): CreditedOnRampVerification[] {\n const key = creditedRecoveryKey(scope)\n try {\n const raw = getBrowserStorageItem(key)\n if (!raw) return []\n const parsed = JSON.parse(raw) as Partial<PersistedOnRampCredits>\n if (parsed.version !== ONRAMP_CREDIT_RECOVERY_VERSION || !Array.isArray(parsed.verifications)) {\n removeBrowserStorageItem(key)\n return []\n }\n\n const retained = parsed.verifications\n .filter(isCreditedVerification)\n .filter((verification) => now - verification.savedAt <= ONRAMP_INTENT_RETENTION_MS)\n .sort((left, right) => left.savedAt - right.savedAt)\n .slice(-MAX_CREDITED_ONRAMP_VERIFICATIONS)\n if (retained.length !== parsed.verifications.length) {\n writeCreditedVerifications(scope, retained)\n }\n return retained\n } catch {\n removeBrowserStorageItem(key)\n return []\n }\n}\n\nexport function rememberCreditedOnRampVerification(\n scope: OnRampRecoveryScope,\n verificationKey: string,\n now = Date.now()\n): boolean {\n if (!verificationKey || verificationKey.length > 512) return false\n const verifications = loadCreditedOnRampVerifications(scope, now).filter(\n (verification) => verification.verificationKey !== verificationKey\n )\n verifications.push({ verificationKey, savedAt: now })\n return writeCreditedVerifications(scope, verifications.slice(-MAX_CREDITED_ONRAMP_VERIFICATIONS))\n}\n\n/** Advance durable recovery from an unresolved intent to a credited marker. */\nexport function finalizeCreditedOnRampIntent(\n scope: OnRampRecoveryScope,\n record: OnRampRecord,\n now = Date.now()\n): boolean {\n const remembered = rememberCreditedOnRampVerification(\n scope,\n getOnRampVerificationKey(record),\n now\n )\n if (remembered) forgetUnresolvedOnRampIntent(scope, getOnRampIntentId(record), now)\n return remembered\n}\n\nexport function filterCreditedOnRampRecords(\n records: readonly OnRampRecord[],\n creditedVerificationKeys: Iterable<string>\n): OnRampRecord[] {\n const credited = new Set(creditedVerificationKeys)\n if (credited.size === 0) return [...records]\n return records.filter((record) => !credited.has(getOnRampVerificationKey(record)))\n}\n\nexport interface InvalidOnRampIntentDisposition {\n activeIntentId: string | null\n invalidatedActiveIntent: boolean\n}\n\n/** Remove a definitively rejected recovery hint and its matching in-memory intent. */\nexport function discardInvalidOnRampIntent(\n scope: OnRampRecoveryScope,\n invalidIntentId: string,\n activeIntentId: string | null\n): InvalidOnRampIntentDisposition {\n forgetUnresolvedOnRampIntent(scope, invalidIntentId)\n const invalidatedActiveIntent = activeIntentId === invalidIntentId\n return {\n activeIntentId: invalidatedActiveIntent ? null : activeIntentId,\n invalidatedActiveIntent,\n }\n}\n\nexport type OnRampCloseRecoveryAction = 'refresh' | 'refresh-and-retain' | 'poll-for-delivery'\n\n/**\n * Provider events are wake-up hints, not proof that no purchase happened.\n * A signed intent must therefore survive a close with no observed event.\n */\nexport function getOnRampCloseRecoveryAction(\n activeIntentId: string | null,\n purchaseEventObserved: boolean\n): OnRampCloseRecoveryAction {\n if (!activeIntentId) return 'refresh'\n return purchaseEventObserved ? 'poll-for-delivery' : 'refresh-and-retain'\n}\n\nexport function createPendingOnRampReadCoordinator<T>({\n read,\n intervalMs = MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS,\n now = Date.now,\n sleep = (milliseconds) => new Promise<void>((resolve) => setTimeout(resolve, milliseconds)),\n}: {\n read: () => Promise<T>\n intervalMs?: number\n now?: () => number\n sleep?: (milliseconds: number) => Promise<void>\n}): () => Promise<T> {\n const safeInterval = Math.max(\n MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS,\n Number.isFinite(intervalMs) ? intervalMs : MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS\n )\n let inFlight: Promise<T> | null = null\n let nextReadAt = 0\n\n return () => {\n if (inFlight) return inFlight\n\n const request = (async () => {\n const delay = Math.max(0, nextReadAt - now())\n if (delay > 0) await sleep(delay)\n nextReadAt = now() + safeInterval\n return read()\n })()\n const tracked: Promise<T> = request.finally(() => {\n if (inFlight === tracked) inFlight = null\n })\n inFlight = tracked\n return tracked\n }\n}\n\nexport async function getPendingOnRampsWithRecovery({\n client,\n intentIds,\n onInvalidIntent,\n}: {\n client: Pick<PrivanaClient, 'getPendingOnRamps'>\n intentIds: readonly string[]\n onInvalidIntent: (intentId: string) => void\n}): Promise<PendingOnRampsResponse> {\n const bounded = [...new Set(intentIds)].slice(-MAX_UNRESOLVED_ONRAMP_INTENTS)\n try {\n return await client.getPendingOnRamps(bounded)\n } catch (error) {\n if (!isBadRequest(error) || bounded.length === 0) throw error\n }\n\n const validResponses: PendingOnRampsResponse[] = []\n for (const intentId of bounded) {\n try {\n validResponses.push(await client.getPendingOnRamps([intentId]))\n } catch (error) {\n if (!isBadRequest(error)) throw error\n onInvalidIntent(intentId)\n }\n }\n if (validResponses.length === 0) return client.getPendingOnRamps([])\n return { pending: mergePendingOnRampRows(validResponses.flatMap((response) => response.pending)) }\n}\n\nfunction mergePendingOnRampRows(rows: readonly OnRampRecord[]): OnRampRecord[] {\n const seen = new Set<string>()\n return rows\n .filter((record) => {\n const identifier = record.provider_transaction_id || record.transaction_id\n const key = `${record.provider}\\u0000${identifier}`\n if (!identifier || seen.has(key)) return false\n seen.add(key)\n return true\n })\n .sort(\n (left, right) =>\n right.updated_at - left.updated_at ||\n right.created_at - left.created_at ||\n String(right.provider_transaction_id ?? '').localeCompare(\n String(left.provider_transaction_id ?? '')\n )\n )\n}\n\nfunction isBadRequest(error: unknown): boolean {\n return error instanceof AccountingApiError && error.statusCode === 400\n}\n","import { decodeEventLog, parseAbiItem, zeroAddress, type Address, type Hex, type Log } from 'viem'\n\nimport type { MinDepositAmounts } from '../types'\n\nconst ERC20_TRANSFER_EVENT = parseAbiItem(\n 'event Transfer(address indexed from, address indexed to, uint256 value)'\n)\n\nexport type OnRampReceiptLog = Pick<Log, 'address' | 'data' | 'topics' | 'logIndex'>\n\nexport interface OnRampDeliveredTransfer {\n amount: bigint\n logIndex: number\n}\n\nfunction decodeErc20TransferLog(log: OnRampReceiptLog) {\n try {\n return decodeEventLog({\n abi: [ERC20_TRANSFER_EVENT],\n data: log.data as Hex,\n topics: log.topics,\n })\n } catch {\n return undefined\n }\n}\n\nexport function assertErc20OnRampToken(tokenAddress: Address): void {\n if (tokenAddress.toLowerCase() === zeroAddress) {\n throw new Error('On-ramp verification supports ERC-20 tokens only')\n }\n}\n\nexport function erc20MinDepositBaseUnits(\n minDepositByChain: Record<string, MinDepositAmounts> | undefined,\n chainId: number\n): bigint | undefined {\n const minimum = minDepositByChain?.[String(chainId)]?.erc20\n return minimum !== undefined && /^\\d+$/.test(minimum) ? BigInt(minimum) : undefined\n}\n\n/** Select the one ERC-20 transfer that authorizes this deposit verification. */\nexport function resolveErc20OnRampTransfer(\n logs: readonly OnRampReceiptLog[],\n tokenAddress: Address,\n depositAddress: Address\n): OnRampDeliveredTransfer {\n let match: OnRampDeliveredTransfer | undefined\n for (const log of logs) {\n if (log.address.toLowerCase() !== tokenAddress.toLowerCase()) continue\n const decoded = decodeErc20TransferLog(log)\n if (!decoded) continue\n\n if (\n decoded.eventName !== 'Transfer' ||\n decoded.args.to.toLowerCase() !== depositAddress.toLowerCase()\n ) {\n continue\n }\n if (match) {\n throw new Error('On-ramp receipt contains multiple matching ERC-20 Transfer logs')\n }\n\n const logIndex = log.logIndex\n if (typeof logIndex !== 'number' || !Number.isSafeInteger(logIndex) || logIndex < 0) {\n throw new Error('Matching on-ramp ERC-20 Transfer does not have a valid log index')\n }\n match = { amount: decoded.args.value, logIndex }\n }\n\n if (!match) {\n throw new Error('On-ramp receipt does not contain a matching ERC-20 Transfer')\n }\n if (match.amount <= 0n) {\n throw new Error('Matching on-ramp ERC-20 Transfer must have a positive amount')\n }\n return match\n}\n","import type { PrivanaClient } from '../client'\nimport type { LockFundsRequest, TransactionSubmissionResponse } from '../types'\nimport { clearPendingLock, loadPendingLock, submitPendingLock } from '../hooks/pending-lock'\n\nexport type OnRampLockSettlement =\n | { kind: 'not-found' }\n | {\n kind: 'submitted'\n payload: LockFundsRequest\n response: TransactionSubmissionResponse\n }\n\nexport async function settlePendingOnRampLock({\n client,\n userAddress,\n transactionId,\n creditedAmount,\n}: {\n client: PrivanaClient\n userAddress: string\n transactionId: string\n creditedAmount: bigint\n}): Promise<OnRampLockSettlement> {\n const payload = loadPendingLock(userAddress, transactionId)\n if (!payload) {\n clearPendingLock(userAddress, transactionId)\n return { kind: 'not-found' }\n }\n try {\n const response = await submitPendingLock({\n client,\n payload,\n creditedAmount,\n })\n return { kind: 'submitted', payload, response }\n } finally {\n // Keep the exact payload until the API attempt settles so reload can\n // replay an interrupted attempt; then preserve the shipped one-shot policy.\n clearPendingLock(userAddress, transactionId)\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { getChainId } from '@wagmi/core'\nimport { useChainId, useConfig, useSwitchChain } from 'wagmi'\n\nexport function useEnsureCorrectChain() {\n const config = useConfig()\n const chainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n\n const waitUntilOnChain = useCallback(\n async (expectedChainId: number, timeoutMs: number, pollIntervalMs = 250) => {\n const startedAt = Date.now()\n while (Date.now() - startedAt < timeoutMs) {\n const currentChainId = getChainId(config)\n if (currentChainId === expectedChainId) return true\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs))\n }\n return false\n },\n [config]\n )\n\n const ensureCorrectChain = useCallback(\n async (targetChainId: number) => {\n const currentChainId = getChainId(config)\n if (currentChainId === targetChainId) return false\n\n let switchErrorMessage: string | undefined\n try {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Chain switch timeout')), 3000)\n })\n await Promise.race([switchChainAsync({ chainId: targetChainId }), timeoutPromise])\n } catch (error) {\n if (error instanceof Error && error.message.includes('Unsupported Chain')) {\n console.warn(\"Got 'Unsupported Chain' error, chain may have switched anyway.\")\n } else {\n switchErrorMessage = error instanceof Error ? error.message : 'Unknown chain switch error'\n }\n }\n\n const settled = await waitUntilOnChain(targetChainId, 20_000)\n if (settled) return true\n\n if (switchErrorMessage) {\n throw new Error(\n `Failed to switch to chain (Chain ID: ${targetChainId}): ${switchErrorMessage}`\n )\n }\n\n throw new Error(`Chain switch did not settle in time (expected ${targetChainId}).`)\n },\n [config, switchChainAsync, waitUntilOnChain]\n )\n\n const isOnChain = useCallback((targetChainId: number) => chainId === targetChainId, [chainId])\n\n return {\n chainId,\n ensureCorrectChain,\n isOnChain,\n }\n}\n","'use client'\n\n// Shared provider-neutral purchase, recovery, verification, credit, and lock flow.\n\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { parseUnits } from 'viem'\nimport { getWalletClient, waitForTransactionReceipt } from '@wagmi/core'\nimport { useAccount, useConfig, useWalletClient } from 'wagmi'\n\nimport { usePrivanaContext } from '../context/privana-provider'\nimport {\n assertCreatedOnRampIntent,\n assertOnRampRecordProvider,\n getOnRampVerificationKey,\n matchesOnRampTransaction,\n recordOnRampProviderDeposit,\n resolveOnRampProviderEventTarget,\n verifyPendingOnRampsSequentially,\n type OnRampProviderAdapter,\n type OnRampProviderEvent,\n type OnRampProviderEventTarget,\n} from '../on-ramp/provider'\nimport {\n createPendingOnRampReadCoordinator,\n discardInvalidOnRampIntent,\n finalizeCreditedOnRampIntent,\n filterCreditedOnRampRecords,\n getOnRampCloseRecoveryAction,\n getPendingOnRampsWithRecovery,\n loadCreditedOnRampVerifications,\n loadUnresolvedOnRampIntents,\n MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS,\n rememberUnresolvedOnRampIntent,\n type OnRampRecoveryScope,\n} from '../on-ramp/recovery'\nimport {\n assertErc20OnRampToken,\n erc20MinDepositBaseUnits,\n resolveErc20OnRampTransfer,\n type OnRampDeliveredTransfer,\n} from '../on-ramp/receipt'\nimport { settlePendingOnRampLock } from '../on-ramp/settlement'\nimport {\n applyLockBuffer,\n clampLockAmount,\n createSignedLockRequest,\n requireDepositLockOwner,\n requireServiceAddress,\n savePendingLock,\n PostDepositLockError,\n type OnRampPostDepositLockConfig,\n} from './pending-lock'\nimport { canUseBrowserStorage } from './browser-storage'\nimport { useDepositVerification } from './use-deposit-verification'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type {\n Address,\n Bytes32,\n HexString,\n MinDepositAmounts,\n OnRampRecord,\n TokenConfig,\n TransactionSubmissionResponse,\n} from '../types'\n\nconst DEFAULT_DELIVERY_TIMEOUT_MS = 120_000\nconst DEFAULT_VERIFICATION_TIMEOUT_MS = 10 * 60_000\nconst DEFAULT_FINALITY_RETRY_INTERVAL_MS = 15_000\n\nexport function bindOnRampFlowSession(\n ref: { current: symbol | null },\n flowSession: symbol\n): () => void {\n ref.current = flowSession\n return () => {\n if (ref.current === flowSession) ref.current = null\n }\n}\n\nexport type OnRampFlowStatus =\n | 'idle'\n /** Provider launch succeeded; the user is completing the purchase. */\n | 'awaiting-purchase'\n /** Provider reported completion; polling recovery until the on-chain transfer appears. */\n | 'awaiting-delivery'\n /** checkDeposit fired; polling getDepositStatus until credited. */\n | 'verifying'\n | 'credited'\n | 'failed'\n\nexport interface OnRampDebugEvent {\n at: string\n event: string\n status: OnRampFlowStatus\n tokenId: Bytes32\n payload?: Record<string, unknown>\n}\n\nexport interface UseOnRampOptions {\n /** Deployment-selected provider behavior. */\n adapter: OnRampProviderAdapter\n /** Privana token the on-ramp will deposit into. */\n tokenId: Bytes32\n /**\n * Pre-sign a `Lock` for the buffered quote amount when the intent is\n * created; the SDK submits it once the delivered deposit credits. Requires\n * `prepareOnRampIntent` to be called with `quoteCurrencyAmount`.\n */\n postDepositLock?: OnRampPostDepositLockConfig\n /** Fired when the deposit is credited inside the Privana accounting module. */\n onCredited?: (txHash: string, record: OnRampRecord) => void\n /** Fired when the pre-signed post-deposit lock is accepted by the API. */\n onLockSubmitted?: (response: TransactionSubmissionResponse, record: OnRampRecord) => 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, record: OnRampRecord) => void\n onError?: (error: Error) => void\n /** Optional diagnostic event stream for previews/tests. No auth tokens or signatures are emitted. */\n onDebugEvent?: (event: OnRampDebugEvent) => void\n /**\n * Max time in ms to wait for the backend to surface the on-chain tx hash\n * after the provider reports completion or its widget closes\n * (default: 120000 = 2 minutes).\n * If exceeded, the row stays in `pending` for the user to finish later.\n */\n deliveryTimeout?: number\n /**\n * Polling interval in ms while waiting for the on-chain tx hash. Values below\n * the rate-safe 10000 ms minimum are clamped.\n */\n deliveryPollInterval?: number\n /** Max time in ms for Privana deposit verification after the on-chain tx hash appears. */\n verificationTimeout?: number\n /** Retry interval in ms while the source-chain tx waits for finality (default: 15000). */\n finalityRetryInterval?: number\n /** Polling interval in ms while waiting for Privana deposit credit. */\n verificationPollInterval?: number\n}\n\nexport interface UseOnRampResult {\n status: OnRampFlowStatus\n /** Active signed Privana intent id passed to the configured provider. */\n activeIntentId: string | null\n /** Completed on-ramps that still need Privana verification. */\n pending: OnRampRecord[]\n /**\n * `transaction_id` of the pending row currently going through verification\n * (receipt fetch → checkDeposit → status polling), or null when idle. Rows\n * being actively verified shouldn't be offered a manual retry.\n */\n activeVerificationId: string | null\n error: Error | null\n /**\n * Per-row finality progress messages (e.g. \"Insufficient finality: 4/32 confirmations\n * on chain 11155111\"), keyed by `transaction_id`. Updated each time `checkDeposit`\n * sees the row isn't deep enough yet — non-terminal; cleared on credit.\n */\n finalityProgress: Record<string, string>\n /** Per-user Privana deposit address. */\n depositAddress: `0x${string}` | undefined\n /**\n * Minimum deposit in base units for the configured token's chain (e.g. for\n * USDC on Base, \"5000000\" = 5 USDC). `undefined` until the deposit address\n * response has been fetched.\n */\n minDepositBaseUnits: bigint | undefined\n /**\n * The Privana token config the on-ramp is configured to deposit into. Source\n * of truth for `decimals`/`symbol` - consumers should prefer this over passing\n * those values in by hand. `undefined` if `tokenId` doesn't match any enabled\n * token (e.g., still loading or misconfigured).\n */\n selectedToken: TokenConfig | undefined\n /** Create the backend intent that the configured provider will echo. */\n prepareOnRampIntent: (request: {\n providerAssetCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n /**\n * Exact crypto amount (human units) the purchase targets — the same value\n * passed to the widget as `quoteCurrencyAmount`. Required when\n * `postDepositLock` is set: the signed lock amount derives from it.\n */\n quoteCurrencyAmount?: string\n }) => Promise<OnRampRecord>\n /** Mark a provider launch as ready for user interaction. */\n handleProviderLaunchReady: () => void\n /** Surface a provider-specific launch failure through the shared flow. */\n handleProviderLaunchFailed: (error: Error) => void\n /** Handle a normalized provider transaction event. */\n handleProviderEvent: (event: OnRampProviderEvent) => Promise<void>\n /** Trigger Privana verification for a row returned by `pending`. */\n finishPendingVerification: (record: OnRampRecord) => Promise<void>\n /** Reconcile local state after the provider UI closes. */\n handleProviderClosed: () => Promise<void>\n refreshPending: () => Promise<void>\n}\n\n/**\n * Provider-neutral purchase recovery and Privana credit flow.\n *\n * The provider delivers to the server-derived Privana deposit address. Provider\n * reads and UI events only discover a candidate transaction. One unambiguous\n * matching receipt log supplies the amount and exact log index;\n * `/deposits/check` remains the sole credit authority. Pending intents are\n * retained locally only as bounded recovery hints, never as order or credit\n * state.\n */\nexport function useOnRamp(options: UseOnRampOptions): UseOnRampResult {\n const {\n adapter,\n tokenId,\n postDepositLock,\n onCredited,\n onLockSubmitted,\n onLockFailed,\n onError,\n onDebugEvent,\n } = options\n const deliveryTimeout = options.deliveryTimeout ?? DEFAULT_DELIVERY_TIMEOUT_MS\n const requestedDeliveryPollInterval =\n options.deliveryPollInterval ?? MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS\n const deliveryPollInterval = Number.isFinite(requestedDeliveryPollInterval)\n ? Math.max(requestedDeliveryPollInterval, MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS)\n : MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS\n const verificationTimeout = options.verificationTimeout ?? DEFAULT_VERIFICATION_TIMEOUT_MS\n const finalityRetryInterval = options.finalityRetryInterval ?? DEFAULT_FINALITY_RETRY_INTERVAL_MS\n\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, enabledTokens, networkConfig, serviceAddress } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadReady } = usePrivateReadRequest()\n const executeOnRampPrivateRead = executePrivateRead\n const privateReadAddressRef = useRef(privateReadAddress)\n privateReadAddressRef.current = privateReadAddress\n const { ensureCorrectChain } = useEnsureCorrectChain()\n const wagmiConfig = useConfig()\n const queryClient = useQueryClient()\n\n const selectedToken = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n const recoveryScope = useMemo<OnRampRecoveryScope | null>(\n () =>\n privateReadAddress\n ? {\n apiUrl: networkConfig.apiUrl,\n chainId: networkConfig.chainId,\n userAddress: privateReadAddress,\n }\n : null,\n [networkConfig.apiUrl, networkConfig.chainId, privateReadAddress]\n )\n const recoveryScopeRef = useRef(recoveryScope)\n recoveryScopeRef.current = recoveryScope\n const flowIdentity = `${networkConfig.apiUrl}\\u0000${networkConfig.chainId}\\u0000${privateReadAddress ?? ''}\\u0000${privateReadReady}\\u0000${tokenId}\\u0000${adapter.provider}`\n // A unique render-session token prevents async work from an earlier\n // user/API/chain/token scope from mutating the current flow, including A→B→A.\n const flowSession = useMemo(() => Symbol(flowIdentity), [flowIdentity])\n const flowSessionRef = useRef<symbol | null>(flowSession)\n flowSessionRef.current = flowSession\n useEffect(() => bindOnRampFlowSession(flowSessionRef, flowSession), [flowSession])\n\n const [status, setStatus] = useState<OnRampFlowStatus>('idle')\n const [pending, setPending] = useState<OnRampRecord[]>([])\n const [error, setError] = useState<Error | null>(null)\n const [depositAddress, setDepositAddress] = useState<`0x${string}` | undefined>()\n // Recovery is not token-scoped, so retain the backend minima for every chain.\n const [minDepositByChain, setMinDepositByChain] = useState<\n Record<string, MinDepositAmounts> | undefined\n >()\n const [activeIntentId, setActiveIntentId] = useState<string | null>(null)\n const [activeVerificationId, setActiveVerificationId] = useState<string | null>(null)\n const [finalityProgress, setFinalityProgress] = useState<Record<string, string>>({})\n\n const onCreditedRef = useRef(onCredited)\n const onLockSubmittedRef = useRef(onLockSubmitted)\n const onLockFailedRef = useRef(onLockFailed)\n const onErrorRef = useRef(onError)\n const onDebugEventRef = useRef(onDebugEvent)\n const statusRef = useRef(status)\n const depositAddressSessionRef = useRef<symbol | null>(null)\n const activeIntentIdRef = useRef<string | null>(null)\n const activeIntentSessionRef = useRef<symbol | null>(null)\n const activeVerificationRecordRef = useRef<OnRampRecord | null>(null)\n const activeVerificationKeyRef = useRef<string | null>(null)\n const activeVerificationSurfacesFailureRef = useRef(false)\n /** Address that signed the pending lock. Storage is keyed by it, and the\n * wallet may be disconnected or on another account by credit time. */\n const lockOwnerRef = useRef<Address | null>(null)\n const triggeredVerificationKeysRef = useRef<Set<string>>(new Set())\n const creditedVerificationKeysRef = useRef<Set<string>>(new Set())\n /** Resolves when the in-flight verification reaches a terminal state; the\n * auto-verify loop awaits it so rows verify one at a time. */\n const activeVerificationDoneRef = useRef<(() => void) | null>(null)\n const closeReconcilePromiseRef = useRef<{\n flowSession: symbol\n promise: Promise<void>\n } | null>(null)\n const deliveryWaitPromiseRef = useRef<{\n flowSession: symbol\n transactionId: string\n promise: Promise<OnRampRecord | null>\n } | null>(null)\n const purchaseInitiatedRef = useRef(false)\n const scopedDepositAddress =\n depositAddressSessionRef.current === flowSession ? depositAddress : undefined\n const scopedMinDepositByChain =\n depositAddressSessionRef.current === flowSession ? minDepositByChain : undefined\n const scopedMinDepositBaseUnits = selectedToken\n ? erc20MinDepositBaseUnits(scopedMinDepositByChain, selectedToken.chainId)\n : undefined\n useEffect(() => {\n onCreditedRef.current = onCredited\n onLockSubmittedRef.current = onLockSubmitted\n onLockFailedRef.current = onLockFailed\n onErrorRef.current = onError\n onDebugEventRef.current = onDebugEvent\n }, [onCredited, onLockSubmitted, onLockFailed, onError, onDebugEvent])\n\n useEffect(() => {\n statusRef.current = status\n }, [status])\n\n useEffect(() => {\n activeIntentIdRef.current = activeIntentId\n }, [activeIntentId])\n\n const emitDebug = useCallback(\n (event: string, payload?: Record<string, unknown>) => {\n onDebugEventRef.current?.({\n at: new Date().toISOString(),\n event,\n status: statusRef.current,\n tokenId,\n payload,\n })\n },\n [tokenId]\n )\n\n useEffect(() => {\n emitDebug('private-read-state', { privateReadReady })\n }, [emitDebug, privateReadReady])\n\n // The provider must deliver directly to Privana, never to the connected wallet.\n useEffect(() => {\n depositAddressSessionRef.current = null\n if (!privateReadReady) {\n emitDebug('deposit-address:skip', { reason: 'private-read-not-ready' })\n setDepositAddress(undefined)\n setMinDepositByChain(undefined)\n return\n }\n\n // Never leave the previous authenticated user's address actionable while\n // the scoped replacement request is in flight.\n setDepositAddress(undefined)\n setMinDepositByChain(undefined)\n let cancelled = false\n void (async () => {\n try {\n emitDebug('deposit-address:request')\n const resp = await executeOnRampPrivateRead((readClient) => readClient.getDepositAddress())\n if (cancelled || flowSessionRef.current !== flowSession) return\n depositAddressSessionRef.current = flowSession\n setDepositAddress(resp.deposit_address)\n setMinDepositByChain(resp.min_deposit)\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n const mins = token ? resp.min_deposit?.[String(token.chainId)] : undefined\n emitDebug('deposit-address:success', {\n depositAddressReady: true,\n selectedToken: token ? summariseToken(token) : null,\n minDepositBaseUnits: mins?.erc20 ?? null,\n })\n } catch (err) {\n if (!cancelled) {\n emitDebug('deposit-address:error', errorPayload(err))\n console.warn('Failed to fetch Privana deposit address:', err)\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [emitDebug, enabledTokens, executeOnRampPrivateRead, flowSession, privateReadReady, tokenId])\n\n const fetchPendingRows = useCallback(async (): Promise<OnRampRecord[]> => {\n const intents = recoveryScope ? loadUnresolvedOnRampIntents(recoveryScope) : []\n const intentIds = intents.map((intent) => intent.transactionId)\n if (activeIntentIdRef.current && activeIntentSessionRef.current === flowSession) {\n intentIds.push(activeIntentIdRef.current)\n }\n const { pending: rows } = await executeOnRampPrivateRead((readClient) =>\n getPendingOnRampsWithRecovery({\n client: readClient,\n intentIds,\n onInvalidIntent: (intentId) => {\n // A request that crossed an auth/scope transition must not discard\n // the old user's durable recovery state based on the new session.\n if (!recoveryScope || flowSessionRef.current !== flowSession) return\n const disposition = discardInvalidOnRampIntent(\n recoveryScope,\n intentId,\n activeIntentIdRef.current\n )\n if (disposition.invalidatedActiveIntent) {\n activeIntentIdRef.current = null\n activeIntentSessionRef.current = null\n setActiveIntentId(null)\n purchaseInitiatedRef.current = false\n lockOwnerRef.current = null\n if (statusRef.current !== 'verifying' && statusRef.current !== 'credited') {\n statusRef.current = 'idle'\n setStatus('idle')\n setError(null)\n }\n }\n emitDebug('pending:discard-invalid-intent', {\n invalidatedActiveIntent: disposition.invalidatedActiveIntent,\n })\n },\n })\n )\n // Exact signed intents deliberately recover orders from a previous\n // provider after a deployment switch or rollback. The core verification\n // path is provider-neutral; only newly created intents and adapter events\n // must match the configured adapter.\n const creditedKeys = recoveryScope\n ? loadCreditedOnRampVerifications(recoveryScope).map(\n (verification) => verification.verificationKey\n )\n : []\n return filterCreditedOnRampRecords(rows, [\n ...creditedKeys,\n ...creditedVerificationKeysRef.current,\n ])\n }, [emitDebug, executeOnRampPrivateRead, flowSession, recoveryScope])\n\n // All callers (mount refresh, embedded recovery, close/event delivery waits,\n // and manual refresh) share this one rate-safe request owner.\n const readPendingRows = useMemo(\n () =>\n createPendingOnRampReadCoordinator({\n read: fetchPendingRows,\n intervalMs: deliveryPollInterval,\n }),\n [deliveryPollInterval, fetchPendingRows]\n )\n\n const refreshPending = useCallback(async () => {\n if (flowSessionRef.current !== flowSession) return\n if (!privateReadReady) {\n emitDebug('pending:skip', { reason: 'private-read-not-ready' })\n setPending([])\n return\n }\n\n try {\n emitDebug('pending:request')\n const rows = await readPendingRows()\n if (flowSessionRef.current !== flowSession) return\n setPending(rows)\n emitDebug('pending:success', {\n count: rows.length,\n rows: rows.map(summariseOnRampRecord),\n })\n } catch (err) {\n if (flowSessionRef.current !== flowSession) return\n emitDebug('pending:error', errorPayload(err))\n console.warn('Failed to load pending on-ramps:', err)\n }\n }, [emitDebug, flowSession, privateReadReady, readPendingRows])\n\n // `expectedKey` guards late clears (e.g. after the awaited work in\n // onCredited): if another record's verification started in the meantime,\n // its refs must survive, so a mismatched clear is a no-op.\n const clearActiveVerification = useCallback((expectedKey?: string | null) => {\n const key = activeVerificationKeyRef.current\n if (expectedKey != null && key !== null && key !== expectedKey) return\n if (key) triggeredVerificationKeysRef.current.delete(key)\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n activeVerificationSurfacesFailureRef.current = false\n setActiveVerificationId(null)\n activeVerificationDoneRef.current?.()\n activeVerificationDoneRef.current = null\n }, [])\n\n // The deposit is credited either way; only the lock half can fail here, so\n // failures route to the dedicated callback (or onError as fallback) instead\n // of the flow's terminal error state.\n const submitPendingLockAfterCredit = useCallback(\n async (record: OnRampRecord, userAddress: string, creditedAmount: bigint) => {\n const transactionId = record.transaction_id\n try {\n const settlement = await settlePendingOnRampLock({\n client,\n userAddress,\n transactionId,\n creditedAmount,\n })\n if (settlement.kind === 'not-found') {\n // Pending rows from other sessions or without a lock configured\n // credit silently. Only the active locked purchase expects a payload.\n if (!postDepositLock || transactionId !== activeIntentIdRef.current) return\n const lockError = new PostDepositLockError(\n 'No persisted signed lock found for this on-ramp',\n 'not-found'\n )\n emitDebug('lock:not-found')\n if (onLockFailedRef.current) onLockFailedRef.current(lockError, record)\n else onErrorRef.current?.(lockError)\n return\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 emitDebug('lock:submitted', {\n submissionIdPresent: Boolean(settlement.response.submission_id),\n })\n onLockSubmittedRef.current?.(settlement.response, record)\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 undefined,\n creditedAmount,\n { cause: err }\n )\n emitDebug('lock:failed', {\n reason: error.reason,\n message: error.message,\n })\n if (onLockFailedRef.current) onLockFailedRef.current(error, record)\n else onErrorRef.current?.(error)\n }\n },\n [client, emitDebug, postDepositLock, queryClient]\n )\n\n const { verify, reset: resetDepositVerification } = useDepositVerification({\n pollTimeout: verificationTimeout,\n pollInterval: options.verificationPollInterval,\n finalityRetryInterval,\n onCheckRetry: (message) => {\n const record = activeVerificationRecordRef.current\n if (!record) return\n emitDebug('verification:check-retry', {\n message,\n record: summariseOnRampRecord(record),\n })\n setFinalityProgress((prev) => ({ ...prev, [record.transaction_id]: message }))\n },\n onCredited: (depositTxHash, _response, creditedAmount) => {\n const record = activeVerificationRecordRef.current\n const recoveryScopeAtCredit = recoveryScopeRef.current\n const verificationKey = record ? getOnRampVerificationKey(record) : null\n emitDebug('verification:credited', {\n depositTxHash,\n record: record ? summariseOnRampRecord(record) : null,\n })\n if (\n record &&\n activeIntentIdRef.current &&\n matchesOnRampTransaction(record, activeIntentIdRef.current)\n ) {\n setStatus('credited')\n }\n if (record) {\n creditedVerificationKeysRef.current.add(getOnRampVerificationKey(record))\n setPending((rows) => filterCreditedOnRampRecords(rows, creditedVerificationKeysRef.current))\n const finalizeRecovery = () => {\n if (\n recoveryScopeAtCredit &&\n !finalizeCreditedOnRampIntent(recoveryScopeAtCredit, record)\n ) {\n emitDebug('verification:credit-recovery-storage-unavailable')\n }\n }\n setFinalityProgress((prev) => {\n if (!(record.transaction_id in prev)) return prev\n const next = { ...prev }\n delete next[record.transaction_id]\n return next\n })\n // Prefer the address that signed the lock: the wallet may have\n // disconnected or switched accounts during the minutes-long delivery\n // window, and the stored payload is keyed by the signer.\n const lockOwner = lockOwnerRef.current ?? privateReadAddress\n if (lockOwner) {\n // Keep durable recovery until the post-credit lock attempt settles.\n void submitPendingLockAfterCredit(record, lockOwner, creditedAmount).finally(\n finalizeRecovery\n )\n } else if (postDepositLock) {\n emitDebug('lock:owner-unavailable')\n const lockError = new PostDepositLockError(\n 'No wallet address available to look up the signed lock for this on-ramp',\n 'not-found'\n )\n if (onLockFailedRef.current) onLockFailedRef.current(lockError, record)\n else onErrorRef.current?.(lockError)\n finalizeRecovery()\n } else {\n finalizeRecovery()\n }\n }\n void (async () => {\n try {\n if (\n record &&\n adapter.recordDeposit &&\n record.provider === adapter.provider &&\n depositTxHash.startsWith('0x')\n ) {\n emitDebug('provider-deposit:record-request', {\n provider: adapter.provider,\n depositTxHash,\n })\n const updated = await executeOnRampPrivateRead((readClient) =>\n recordOnRampProviderDeposit(adapter, {\n client: readClient,\n record,\n depositTxHash: depositTxHash as HexString,\n })\n )\n emitDebug('provider-deposit:record-success', {\n provider: adapter.provider,\n record: updated ? summariseOnRampRecord(updated) : null,\n })\n }\n } catch (err) {\n emitDebug('provider-deposit:record-error', {\n provider: adapter.provider,\n ...errorPayload(err),\n })\n console.warn('Failed to record provider deposit:', err)\n } finally {\n await refreshPending()\n clearActiveVerification(verificationKey)\n if (\n record &&\n activeIntentIdRef.current &&\n matchesOnRampTransaction(record, activeIntentIdRef.current)\n ) {\n activeIntentIdRef.current = null\n activeIntentSessionRef.current = null\n setActiveIntentId(null)\n purchaseInitiatedRef.current = false\n lockOwnerRef.current = null\n }\n }\n })()\n if (record) onCreditedRef.current?.(depositTxHash, record)\n },\n onCheckTimeout: (depositTxHash) => {\n const record = activeVerificationRecordRef.current\n const shouldSurfaceFailure = activeVerificationSurfacesFailureRef.current || !record\n const err = new Error(\n 'Privana verification is still pending. Retry from the pending on-ramp list if it does not complete.'\n )\n emitDebug('verification:timeout', { depositTxHash, message: err.message })\n clearActiveVerification()\n if (shouldSurfaceFailure) {\n setStatus('failed')\n setError(err)\n }\n void refreshPending()\n onErrorRef.current?.(err)\n },\n onError: (err) => {\n const record = activeVerificationRecordRef.current\n const shouldSurfaceFailure = activeVerificationSurfacesFailureRef.current || !record\n emitDebug('verification:error', errorPayload(err))\n clearActiveVerification()\n if (shouldSurfaceFailure) {\n setStatus('failed')\n setError(err)\n }\n onErrorRef.current?.(err)\n },\n })\n\n useEffect(() => {\n // Scope changes invalidate only live work. Signed intents and pending locks\n // stay in their old scoped storage so returning to that account can recover.\n activeIntentIdRef.current = null\n activeIntentSessionRef.current = null\n setActiveIntentId(null)\n purchaseInitiatedRef.current = false\n lockOwnerRef.current = null\n resetDepositVerification()\n clearActiveVerification()\n triggeredVerificationKeysRef.current.clear()\n creditedVerificationKeysRef.current.clear()\n setPending([])\n setFinalityProgress({})\n statusRef.current = 'idle'\n setStatus('idle')\n setError(null)\n }, [clearActiveVerification, flowSession, resetDepositVerification])\n\n useEffect(() => {\n void refreshPending()\n }, [refreshPending])\n\n const prepareOnRampIntent = useCallback(\n async ({\n providerAssetCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n quoteCurrencyAmount,\n }: {\n providerAssetCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n quoteCurrencyAmount?: string\n }) => {\n try {\n setError(null)\n purchaseInitiatedRef.current = false\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token: ${tokenId}`)\n if (!scopedDepositAddress) throw new Error('Privana deposit address is not ready')\n let lockAmount: bigint | undefined\n let lockOwner: Address | undefined\n if (postDepositLock) {\n // Fail before the intent exists: a purchase without a submittable\n // signed lock would defeat the deposit-and-lock guarantee.\n if (!address || !walletClient) throw new Error('Wallet not connected')\n lockOwner = requireDepositLockOwner(address, privateReadAddress)\n if (!quoteCurrencyAmount) {\n throw new Error(\n 'postDepositLock requires quoteCurrencyAmount to derive the lock amount'\n )\n }\n if (!canUseBrowserStorage()) {\n throw new Error('Browser storage is required for locked on-ramp recovery')\n }\n // Sign for the buffered quote. The provider targets the quote while\n // slower rails may drift within the buffer; actual on-chain delivery\n // is verified before the lock submits. Any difference stays in the\n // user's available balance.\n const buffered = applyLockBuffer(\n parseUnits(quoteCurrencyAmount, token.decimals),\n postDepositLock.buffer\n )\n lockAmount = clampLockAmount(buffered, postDepositLock.maxAmount)\n if (lockAmount <= 0n) {\n throw new Error(`Post-deposit lock amount must be positive, got ${lockAmount}`)\n }\n // The Lock domain lives on the Accounting chain and wallets reject\n // typed data whose domain chainId differs from the active chain, so\n // switch there while a failure still precedes the intent.\n await ensureCorrectChain(networkConfig.chainId)\n }\n\n emitDebug('intent:create-request', {\n tokenId,\n chainId: token.chainId,\n provider: adapter.provider,\n providerAssetCode,\n baseCurrencyCode: baseCurrencyCode ?? null,\n baseCurrencyAmountPresent: baseCurrencyAmount !== undefined,\n quoteCurrencyAmountPresent: quoteCurrencyAmount !== undefined,\n depositAddressReady: true,\n })\n const intentInput = {\n walletAddress: scopedDepositAddress,\n tokenId,\n chainId: token.chainId,\n providerAssetCode,\n }\n const record = await executeOnRampPrivateRead((readClient) =>\n readClient.createOnRampIntent(adapter.buildIntentRequest(intentInput))\n )\n if (flowSessionRef.current !== flowSession) {\n throw new Error('On-ramp account or network changed while creating the intent')\n }\n assertCreatedOnRampIntent(record, adapter.provider, intentInput)\n if (postDepositLock && lockOwner && lockAmount !== undefined) {\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(wagmiConfig, {\n chainId: networkConfig.chainId,\n })\n const signedLock = await createSignedLockRequest({\n client,\n walletClient: signingWalletClient,\n userAddress: lockOwner,\n networkConfig,\n serviceAddress: requireServiceAddress(postDepositLock.serviceAddress ?? serviceAddress),\n tokenId,\n amount: lockAmount,\n lockDuration: postDepositLock.lockDuration,\n })\n if (privateReadAddressRef.current?.toLowerCase() !== lockOwner.toLowerCase()) {\n throw new Error('Authenticated deposit account changed while signing')\n }\n if (flowSessionRef.current !== flowSession) {\n throw new Error('On-ramp account or network changed while signing')\n }\n savePendingLock(lockOwner, record.transaction_id, signedLock)\n lockOwnerRef.current = lockOwner\n emitDebug('intent:lock-signed', {\n lockConfigured: true,\n })\n }\n if (\n recoveryScope &&\n !rememberUnresolvedOnRampIntent(recoveryScope, record.transaction_id)\n ) {\n emitDebug('intent:recovery-storage-unavailable')\n }\n if (flowSessionRef.current !== flowSession) {\n throw new Error('On-ramp account or network changed while preparing the purchase')\n }\n activeIntentIdRef.current = record.transaction_id\n activeIntentSessionRef.current = flowSession\n setActiveIntentId(record.transaction_id)\n emitDebug('intent:create-success', {\n record: summariseOnRampRecord(record),\n })\n return record\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Failed to create on-ramp intent')\n if (flowSessionRef.current === flowSession) {\n setStatus('failed')\n setError(e)\n emitDebug('intent:create-error', errorPayload(e))\n onErrorRef.current?.(e)\n }\n throw e\n }\n },\n [\n adapter,\n address,\n client,\n emitDebug,\n enabledTokens,\n ensureCorrectChain,\n executeOnRampPrivateRead,\n flowSession,\n networkConfig,\n postDepositLock,\n privateReadAddress,\n recoveryScope,\n scopedDepositAddress,\n serviceAddress,\n tokenId,\n wagmiConfig,\n walletClient,\n ]\n )\n\n // Some providers need a compatibility mapping when their transaction is\n // created. It remains best-effort: authenticated provider reads are the\n // recovery source and the mapping never authorizes credit.\n const registerProviderTransaction = useCallback(\n async (event: OnRampProviderEvent, intentId: string) => {\n if (flowSessionRef.current !== flowSession) return\n const register = adapter.registerTransaction\n if (!register) return\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n if (!token) {\n emitDebug('provider-transaction:register-skip', {\n provider: adapter.provider,\n reason: 'selected-token-not-found',\n })\n return\n }\n try {\n emitDebug('provider-transaction:register-request', {\n provider: adapter.provider,\n intentIdPresent: Boolean(intentId),\n providerTransactionIdPresent: Boolean(event.providerTransactionId),\n tokenId,\n chainId: token.chainId,\n })\n const record = await executeOnRampPrivateRead((readClient) =>\n register({\n client: readClient,\n intentId,\n providerTransactionId: event.providerTransactionId,\n tokenId,\n chainId: token.chainId,\n })\n )\n if (flowSessionRef.current !== flowSession) return\n if (record) assertOnRampRecordProvider(record, adapter.provider)\n emitDebug('provider-transaction:register-success', {\n provider: adapter.provider,\n record: record ? summariseOnRampRecord(record) : null,\n })\n } catch (err) {\n if (flowSessionRef.current !== flowSession) return\n emitDebug('provider-transaction:register-error', {\n provider: adapter.provider,\n ...errorPayload(err),\n })\n console.warn('Failed to register on-ramp token mapping:', err)\n }\n },\n [adapter, emitDebug, enabledTokens, executeOnRampPrivateRead, flowSession, tokenId]\n )\n\n const handleProviderLaunchReady = useCallback(() => {\n if (flowSessionRef.current !== flowSession) return\n setError(null)\n statusRef.current = 'awaiting-purchase'\n setStatus('awaiting-purchase')\n emitDebug('provider:launch-ready', { provider: adapter.provider })\n }, [adapter.provider, emitDebug, flowSession])\n\n const handleProviderLaunchFailed = useCallback(\n (launchError: Error) => {\n if (flowSessionRef.current !== flowSession) return\n statusRef.current = 'failed'\n setStatus('failed')\n setError(launchError)\n emitDebug('provider:launch-error', {\n provider: adapter.provider,\n ...errorPayload(launchError),\n })\n onErrorRef.current?.(launchError)\n },\n [adapter.provider, emitDebug, flowSession]\n )\n\n // Provider UI events are hints. Poll the authenticated provider read until\n // it returns a strictly admitted record with an on-chain transaction hash.\n const waitForOnChainHash = useCallback(\n async (transactionId: string): Promise<OnRampRecord | null> => {\n if (flowSessionRef.current !== flowSession) return null\n const existing = deliveryWaitPromiseRef.current\n if (existing?.flowSession === flowSession && existing.transactionId === transactionId) {\n return existing.promise\n }\n\n const promise = (async () => {\n const startTime = Date.now()\n emitDebug('delivery-poll:start', {\n deliveryTimeout,\n deliveryPollInterval,\n })\n while (Date.now() - startTime < deliveryTimeout) {\n if (flowSessionRef.current !== flowSession) return null\n try {\n const rows = await readPendingRows()\n if (flowSessionRef.current !== flowSession) return null\n setPending(rows)\n const record = rows.find((r) => matchesOnRampTransaction(r, transactionId))\n emitDebug('delivery-poll:tick', {\n count: rows.length,\n matchingRecord: record ? summariseOnRampRecord(record) : null,\n })\n if (record?.on_chain_tx_hash) {\n emitDebug('delivery-poll:success', {\n record: summariseOnRampRecord(record),\n })\n return record\n }\n } catch (err) {\n emitDebug('delivery-poll:error', {\n ...errorPayload(err),\n })\n console.warn('Polling pending on-ramps failed:', err)\n }\n await new Promise((resolve) => setTimeout(resolve, deliveryPollInterval))\n }\n if (flowSessionRef.current !== flowSession) return null\n emitDebug('delivery-poll:timeout')\n return null\n })()\n const entry = { flowSession, transactionId, promise }\n deliveryWaitPromiseRef.current = entry\n\n try {\n return await promise\n } finally {\n if (deliveryWaitPromiseRef.current === entry) {\n deliveryWaitPromiseRef.current = null\n }\n }\n },\n [deliveryPollInterval, deliveryTimeout, emitDebug, flowSession, readPendingRows]\n )\n\n const triggerVerification = useCallback(\n async (record: OnRampRecord, surfaceFailure = false) => {\n if (flowSessionRef.current !== flowSession) return\n const verificationKey = getOnRampVerificationKey(record)\n if (triggeredVerificationKeysRef.current.has(verificationKey)) {\n emitDebug('verification:skip-duplicate', {\n record: summariseOnRampRecord(record),\n })\n return\n }\n // Starting this verification cancels any in-flight one (verify() stops\n // its polling): un-mark the superseded row so a later pass retries it,\n // and unblock its waiter.\n const supersededKey = activeVerificationKeyRef.current\n if (supersededKey && supersededKey !== verificationKey) {\n triggeredVerificationKeysRef.current.delete(supersededKey)\n }\n activeVerificationDoneRef.current?.()\n activeVerificationDoneRef.current = null\n triggeredVerificationKeysRef.current.add(verificationKey)\n activeVerificationKeyRef.current = verificationKey\n activeVerificationRecordRef.current = record\n activeVerificationSurfacesFailureRef.current =\n surfaceFailure ||\n Boolean(\n activeIntentIdRef.current && matchesOnRampTransaction(record, activeIntentIdRef.current)\n )\n setActiveVerificationId(record.transaction_id)\n setFinalityProgress((prev) => {\n if (!(record.transaction_id in prev)) return prev\n const next = { ...prev }\n delete next[record.transaction_id]\n return next\n })\n\n emitDebug('verification:start', {\n record: summariseOnRampRecord(record),\n })\n try {\n if (!record.on_chain_tx_hash) throw new Error('On-ramp record missing on-chain tx hash')\n if (record.chain_id == null || !record.wallet_address) {\n throw new Error('On-ramp record missing chain id or wallet address')\n }\n // Source the token from the record, not the hook's tokenId. They match\n // for the active flow but diverge when finishing a pending row for a\n // different token than the one currently selected.\n const recordTokenId = record.token_id\n if (!recordTokenId) {\n throw new Error('On-ramp record missing token id')\n }\n const token = enabledTokens.find((t) => t.id.toLowerCase() === recordTokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token: ${recordTokenId}`)\n if (token.chainId !== record.chain_id) {\n throw new Error(\n `Token ${recordTokenId} is on chain ${token.chainId} but record is on chain ${record.chain_id}`\n )\n }\n\n const delivered = await resolveDeliveredTransfer({\n onChainTxHash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n walletAddress: record.wallet_address,\n token,\n wagmiConfig,\n emitDebug,\n })\n if (flowSessionRef.current !== flowSession) return\n\n // Post-completion safety net: provider fees or settlement drift can\n // leave delivery below Privana's minimum.\n const recordMinDepositBaseUnits = erc20MinDepositBaseUnits(\n scopedMinDepositByChain,\n record.chain_id\n )\n if (\n recordMinDepositBaseUnits !== undefined &&\n delivered.amount < recordMinDepositBaseUnits\n ) {\n emitDebug('verification:below-minimum', {\n deliveredAmount: delivered.amount.toString(),\n minDepositBaseUnits: String(recordMinDepositBaseUnits),\n })\n throw new Error(\n `Delivered amount (${delivered.amount} base units) is below the minimum deposit.`\n )\n }\n\n if (\n activeIntentIdRef.current &&\n matchesOnRampTransaction(record, activeIntentIdRef.current)\n ) {\n setStatus('verifying')\n }\n emitDebug('verification:check-deposit-request', {\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount: delivered.amount.toString(),\n logIndex: delivered.logIndex,\n })\n await verify({\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount: delivered.amount,\n logIndex: delivered.logIndex,\n })\n } catch (err) {\n if (flowSessionRef.current !== flowSession) return\n triggeredVerificationKeysRef.current.delete(verificationKey)\n if (activeVerificationKeyRef.current === verificationKey) {\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n activeVerificationSurfacesFailureRef.current = false\n setActiveVerificationId(null)\n }\n throw err\n }\n },\n [emitDebug, enabledTokens, flowSession, scopedMinDepositByChain, verify, wagmiConfig]\n )\n\n const handleProviderEvent = useCallback(\n async (event: OnRampProviderEvent) => {\n if (flowSessionRef.current !== flowSession) return\n let target: OnRampProviderEventTarget | undefined\n try {\n target = resolveOnRampProviderEventTarget(\n adapter.provider,\n activeIntentIdRef.current,\n event\n )\n emitDebug(`provider:${event.kind}`, {\n provider: event.provider,\n intentIdPresent: Boolean(target.intentId),\n providerTransactionIdPresent: Boolean(event.providerTransactionId),\n stale: target.isStale,\n })\n\n if (target.isActive) purchaseInitiatedRef.current = true\n if (event.kind === 'transaction-created') {\n await registerProviderTransaction(event, target.intentId)\n if (flowSessionRef.current !== flowSession) return\n if (target.isStale) await refreshPending()\n return\n }\n\n if (target.isActive || activeIntentIdRef.current === null) {\n statusRef.current = 'awaiting-delivery'\n setStatus('awaiting-delivery')\n }\n await registerProviderTransaction(event, target.intentId)\n if (flowSessionRef.current !== flowSession) return\n if (target.isStale) {\n // A late event from an older checkout must not hijack the active\n // purchase. Provider reads will recover it through the normal queue.\n await refreshPending()\n return\n }\n\n const record = await waitForOnChainHash(target.intentId)\n if (flowSessionRef.current !== flowSession) return\n if (!record) {\n const deliveryError = new Error(\n 'Backend has not yet confirmed delivery. You can finish from the pending list.'\n )\n emitDebug('provider:completed-without-backend-row', {\n provider: event.provider,\n message: deliveryError.message,\n })\n if (target.isActive || activeIntentIdRef.current === null) {\n statusRef.current = 'failed'\n setStatus('failed')\n setError(deliveryError)\n onErrorRef.current?.(deliveryError)\n }\n return\n }\n await triggerVerification(record, true)\n } catch (err) {\n if (flowSessionRef.current !== flowSession) return\n const providerError = err instanceof Error ? err : new Error('Verification failed')\n emitDebug('provider:event-error', {\n provider: event.provider,\n kind: event.kind,\n ...errorPayload(providerError),\n })\n if (!target?.isStale) {\n statusRef.current = 'failed'\n setStatus('failed')\n setError(providerError)\n onErrorRef.current?.(providerError)\n }\n }\n },\n [\n adapter.provider,\n emitDebug,\n flowSession,\n refreshPending,\n registerProviderTransaction,\n triggerVerification,\n waitForOnChainHash,\n ]\n )\n\n const handleProviderClosed = useCallback(async () => {\n if (flowSessionRef.current !== flowSession) return\n const existing = closeReconcilePromiseRef.current\n if (existing?.flowSession === flowSession) return existing.promise\n\n const promise = (async () => {\n const previousStatus = statusRef.current\n const transactionId = activeIntentIdRef.current\n const action = getOnRampCloseRecoveryAction(transactionId, purchaseInitiatedRef.current)\n emitDebug('provider:closed-reconcile', {\n provider: adapter.provider,\n previousStatus,\n intentPresent: Boolean(transactionId),\n action,\n })\n\n if (action === 'refresh') {\n await refreshPending()\n return\n }\n\n if (action === 'refresh-and-retain') {\n emitDebug('provider:closed-without-event', {\n provider: adapter.provider,\n previousStatus,\n recoveryRetained: true,\n })\n await refreshPending()\n if (flowSessionRef.current !== flowSession) return\n if (previousStatus === 'awaiting-purchase' || previousStatus === 'awaiting-delivery') {\n statusRef.current = 'idle'\n setStatus('idle')\n }\n return\n }\n\n try {\n statusRef.current = 'awaiting-delivery'\n setStatus('awaiting-delivery')\n const record = await waitForOnChainHash(transactionId!)\n if (flowSessionRef.current !== flowSession) return\n if (record) {\n await triggerVerification(record, true)\n return\n }\n await refreshPending()\n if (flowSessionRef.current !== flowSession) return\n if (previousStatus === 'awaiting-purchase' || previousStatus === 'awaiting-delivery') {\n statusRef.current = 'idle'\n setStatus('idle')\n }\n } catch (err) {\n if (flowSessionRef.current !== flowSession) return\n const e = err instanceof Error ? err : new Error('On-ramp reconciliation failed')\n emitDebug('provider:closed-reconcile-error', {\n provider: adapter.provider,\n ...errorPayload(e),\n })\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n }\n })()\n const entry = { flowSession, promise }\n closeReconcilePromiseRef.current = entry\n\n try {\n await promise\n } finally {\n if (closeReconcilePromiseRef.current === entry) {\n closeReconcilePromiseRef.current = null\n }\n }\n }, [\n adapter.provider,\n emitDebug,\n flowSession,\n refreshPending,\n triggerVerification,\n waitForOnChainHash,\n ])\n\n const finishPendingVerification = useCallback(\n async (record: OnRampRecord) => {\n try {\n emitDebug('pending:finish-verification', {\n record: summariseOnRampRecord(record),\n })\n await triggerVerification(record, true)\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Verification failed')\n emitDebug('pending:finish-verification-error', errorPayload(e))\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n throw e\n }\n },\n [emitDebug, triggerVerification]\n )\n\n const triggerVerificationRef = useRef(triggerVerification)\n useEffect(() => {\n triggerVerificationRef.current = triggerVerification\n }, [triggerVerification])\n\n useEffect(() => {\n let cancelled = false\n void (async () => {\n await verifyPendingOnRampsSequentially({\n records: pending,\n shouldStop: () => cancelled,\n wasTriggered: (key) => triggeredVerificationKeysRef.current.has(key),\n trigger: (record) => triggerVerificationRef.current(record),\n // verify() resolves after scheduling status polling. Waiting for its\n // terminal callback prevents the next record from cancelling it.\n waitForTerminal: (key) =>\n activeVerificationKeyRef.current === key\n ? new Promise<void>((resolve) => {\n activeVerificationDoneRef.current = resolve\n })\n : Promise.resolve(),\n })\n })()\n return () => {\n cancelled = true\n }\n }, [pending])\n\n return {\n status,\n activeIntentId,\n pending,\n activeVerificationId,\n error,\n finalityProgress,\n depositAddress: scopedDepositAddress,\n minDepositBaseUnits: scopedMinDepositBaseUnits,\n selectedToken,\n prepareOnRampIntent,\n handleProviderLaunchReady,\n handleProviderLaunchFailed,\n handleProviderEvent,\n finishPendingVerification,\n handleProviderClosed,\n refreshPending,\n }\n}\n\nfunction summariseToken(token: {\n id: string\n chainId: number\n symbol?: string\n decimals?: number\n}) {\n return {\n tokenId: token.id,\n chainId: token.chainId,\n symbol: token.symbol ?? null,\n decimals: token.decimals ?? null,\n }\n}\n\nfunction summariseOnRampRecord(record: OnRampRecord): Record<string, unknown> {\n return {\n provider: record.provider,\n provider_asset_code: record.provider_asset_code,\n status: record.status,\n token_id: record.token_id,\n chain_id: record.chain_id,\n moonpay_currency_code: record.moonpay_currency_code ?? null,\n external_transaction_id_present: Boolean(record.external_transaction_id),\n provider_transaction_id_present: Boolean(record.provider_transaction_id),\n moonpay_transaction_id_present: Boolean(record.moonpay_transaction_id),\n wallet_address_present: Boolean(record.wallet_address),\n quote_currency_amount_present: record.quote_currency_amount != null,\n on_chain_tx_hash_present: Boolean(record.on_chain_tx_hash),\n deposit_id_present: Boolean(record.deposit_id),\n deposit_tx_hash_present: Boolean(record.deposit_tx_hash),\n deposit_triggered_at: record.deposit_triggered_at ?? null,\n credited_at: record.credited_at ?? null,\n }\n}\n\nasync function resolveDeliveredTransfer({\n onChainTxHash,\n chainId,\n walletAddress,\n token,\n wagmiConfig,\n emitDebug,\n}: {\n onChainTxHash: HexString\n chainId: number\n walletAddress: HexString\n token: TokenConfig\n wagmiConfig: ReturnType<typeof useConfig>\n emitDebug: (event: string, payload?: Record<string, unknown>) => void\n}): Promise<OnRampDeliveredTransfer> {\n assertErc20OnRampToken(token.contract)\n\n try {\n const receipt = await waitForTransactionReceipt(wagmiConfig, {\n hash: onChainTxHash as `0x${string}`,\n chainId,\n timeout: 60_000,\n pollingInterval: 4_000,\n })\n\n const delivered = resolveErc20OnRampTransfer(receipt.logs, token.contract, walletAddress)\n emitDebug('verification:amount-from-receipt', {\n amount: delivered.amount.toString(),\n logIndex: delivered.logIndex,\n tokenAddress: token.contract,\n depositAddressMatched: true,\n })\n return delivered\n } catch (err) {\n emitDebug('verification:amount-from-receipt-error', errorPayload(err))\n const errorDetail = err instanceof Error ? err.message : String(err)\n throw new Error(\n `Unable to derive delivered ${token.symbol} transfer from its receipt: ${errorDetail}`\n )\n }\n}\n\nfunction errorPayload(err: unknown): Record<string, unknown> {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n stack: err.stack?.split('\\n').slice(0, 4).join('\\n'),\n }\n }\n return { message: String(err) }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef } from 'react'\nimport type { MoonPayBuyWidget } from '@moonpay/moonpay-react'\nimport { moonPayOnRampAdapter, normalizeMoonPayProviderEvent } from '../on-ramp/moonpay-adapter'\nimport {\n useOnRamp,\n type OnRampDebugEvent,\n type OnRampFlowStatus,\n type UseOnRampOptions,\n type UseOnRampResult,\n} from './use-on-ramp'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { OnRampRecord } from '../types'\n\ntype MoonPayBuyProps = Parameters<typeof MoonPayBuyWidget>[0]\ntype OnTransactionCompletedProps = Parameters<\n NonNullable<MoonPayBuyProps['onTransactionCompleted']>\n>[0]\ntype OnTransactionCreatedProps = Parameters<NonNullable<MoonPayBuyProps['onTransactionCreated']>>[0]\n\nexport type FiatOnRampStatus = OnRampFlowStatus\nexport type FiatOnRampDebugEvent = OnRampDebugEvent\nexport type UseFiatOnRampOptions = Omit<UseOnRampOptions, 'adapter'>\n\nexport interface UseFiatOnRampResult extends Omit<\n UseOnRampResult,\n | 'prepareOnRampIntent'\n | 'handleProviderLaunchReady'\n | 'handleProviderLaunchFailed'\n | 'handleProviderEvent'\n | 'handleProviderClosed'\n> {\n prepareOnRampIntent: (request: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n quoteCurrencyAmount?: string\n }) => Promise<OnRampRecord>\n signUrl: (url: string) => Promise<string>\n handleTransactionCreated: (props: OnTransactionCreatedProps) => Promise<void>\n handleTransactionCompleted: (props: OnTransactionCompletedProps) => Promise<void>\n handleWidgetClosed: () => Promise<void>\n}\n\n/** Thin MoonPay compatibility adapter over the shared on-ramp state machine. */\nexport function useFiatOnRamp(options: UseFiatOnRampOptions): UseFiatOnRampResult {\n const { executePrivateRead } = usePrivateReadRequest()\n const core = useOnRamp({ ...options, adapter: moonPayOnRampAdapter })\n const {\n prepareOnRampIntent: prepareProviderIntent,\n handleProviderLaunchReady,\n handleProviderLaunchFailed,\n handleProviderEvent,\n handleProviderClosed,\n } = core\n const debugRef = useRef(options.onDebugEvent)\n const statusRef = useRef(core.status)\n\n useEffect(() => {\n debugRef.current = options.onDebugEvent\n statusRef.current = core.status\n }, [core.status, options.onDebugEvent])\n\n const emitDebug = useCallback(\n (event: string, payload?: Record<string, unknown>) => {\n debugRef.current?.({\n at: new Date().toISOString(),\n event,\n status: statusRef.current,\n tokenId: options.tokenId,\n payload,\n })\n },\n [options.tokenId]\n )\n\n const prepareOnRampIntent = useCallback(\n ({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n quoteCurrencyAmount,\n }: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n quoteCurrencyAmount?: string\n }) =>\n prepareProviderIntent({\n providerAssetCode: currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n quoteCurrencyAmount,\n }),\n [prepareProviderIntent]\n )\n\n const signUrl = useCallback(\n async (url: string): Promise<string> => {\n emitDebug('moonpay:onUrlSignatureRequested', summariseMoonPayUrl(url))\n try {\n const { signature } = await executePrivateRead((readClient) =>\n readClient.signOnRampUrl({ url })\n )\n handleProviderLaunchReady()\n emitDebug('sign-url:success', { signatureLength: signature.length })\n return signature\n } catch (error) {\n const launchError = error instanceof Error ? error : new Error('Failed to sign on-ramp URL')\n handleProviderLaunchFailed(launchError)\n emitDebug('sign-url:error', errorPayload(launchError))\n throw launchError\n }\n },\n [emitDebug, executePrivateRead, handleProviderLaunchFailed, handleProviderLaunchReady]\n )\n\n const handleTransactionCreated = useCallback(\n async (props: OnTransactionCreatedProps) => {\n emitDebug('moonpay:onTransactionCreated', summariseMoonPayEventProps(props))\n await handleProviderEvent(normalizeMoonPayProviderEvent('transaction-created', props))\n },\n [emitDebug, handleProviderEvent]\n )\n\n const handleTransactionCompleted = useCallback(\n async (props: OnTransactionCompletedProps) => {\n emitDebug('moonpay:onTransactionCompleted', summariseMoonPayEventProps(props))\n await handleProviderEvent(normalizeMoonPayProviderEvent('transaction-completed', props))\n },\n [emitDebug, handleProviderEvent]\n )\n\n return {\n status: core.status,\n activeIntentId: core.activeIntentId,\n pending: core.pending,\n activeVerificationId: core.activeVerificationId,\n error: core.error,\n finalityProgress: core.finalityProgress,\n depositAddress: core.depositAddress,\n minDepositBaseUnits: core.minDepositBaseUnits,\n selectedToken: core.selectedToken,\n finishPendingVerification: core.finishPendingVerification,\n refreshPending: core.refreshPending,\n prepareOnRampIntent,\n signUrl,\n handleTransactionCreated,\n handleTransactionCompleted,\n handleWidgetClosed: handleProviderClosed,\n }\n}\n\nfunction summariseMoonPayEventProps(props: Record<string, unknown>): Record<string, unknown> {\n return {\n transactionIdPresent: Boolean(props.id),\n externalTransactionIdPresent: Boolean(props.externalTransactionId),\n status: props.status,\n baseCurrency: props.baseCurrency,\n quoteCurrency: props.quoteCurrency,\n walletAddressPresent: Boolean(props.walletAddress),\n }\n}\n\nfunction summariseMoonPayUrl(url: string): Record<string, unknown> {\n try {\n const parsed = new URL(url)\n const params = parsed.searchParams\n return {\n origin: parsed.origin,\n pathname: parsed.pathname,\n apiKeyPresent: params.has('apiKey'),\n currencyCode: params.get('currencyCode'),\n baseCurrencyCode: params.get('baseCurrencyCode'),\n baseCurrencyAmountPresent: params.has('baseCurrencyAmount'),\n walletAddressPresent: params.has('walletAddress'),\n externalCustomerIdPresent: params.has('externalCustomerId'),\n externalTransactionIdPresent: params.has('externalTransactionId'),\n redirectURLPresent: params.has('redirectURL'),\n signaturePresent: params.has('signature'),\n }\n } catch {\n return { parseError: true, length: url.length }\n }\n}\n\nfunction errorPayload(error: Error): Record<string, unknown> {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack?.split('\\n').slice(0, 4).join('\\n'),\n }\n}\n","'use client'\n\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { MoonPayBuyWidget } from '@moonpay/moonpay-react'\nimport { moonPayOnRampAdapter } from '@/sdk/on-ramp/moonpay-adapter'\nimport { MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS } from '@/sdk/on-ramp/recovery'\n\ntype MoonPayBuyWidgetProps = Parameters<typeof MoonPayBuyWidget>[0]\n\nexport interface UseMoonPayOnRampAdapterOptions {\n variant: 'overlay' | 'embedded'\n visible: boolean\n autoStart: boolean\n canBuy: boolean\n /** Prepares the on-ramp intent and flips `visible` on success. */\n openWidget: () => Promise<void>\n /** Poll only until the shared delivery poll takes ownership. */\n shouldPollPending: boolean\n refreshPending: () => Promise<void>\n theme?: 'light' | 'dark'\n themeId?: string\n colorCode?: string\n baseCurrencyCode: string\n baseCurrencyAmount: string\n /**\n * Exact crypto amount the purchase should deliver. Takes precedence over\n * `baseCurrencyAmount` inside MoonPay — the widget derives the fiat total\n * (including fees) so the delivered amount matches the quote.\n */\n quoteCurrencyAmount?: string\n lockAmount?: boolean\n paymentMethod?: string\n currencyCode: string\n /** MoonPay delivery target — the Privana deposit address, NOT the connected wallet. */\n depositAddress: `0x${string}` | undefined\n /** Connected wallet address; only used for SIWE auth, not the on-chain transfer. */\n externalCustomerId: string | undefined\n externalTransactionId: string | null\n onClose: () => Promise<void>\n onCloseOverlay: () => Promise<void>\n onReady: () => Promise<void>\n onUrlSignatureRequested: (url: string) => Promise<string>\n onTransactionCreated: NonNullable<MoonPayBuyWidgetProps['onTransactionCreated']>\n onTransactionCompleted: NonNullable<MoonPayBuyWidgetProps['onTransactionCompleted']>\n}\n\n/**\n * Thin MoonPay launch-UI adapter. It contains the widget quirks and returns the widget element:\n *\n * - MoonPayBuyWidget rebuilds its internal config from the raw props object on\n * every render (its useMemo keys on `props`), and its useSdk effect closes and\n * re-inits the iframe whenever that config changes — so ANY re-render of the\n * host component restarts the checkout. The element is therefore memoized on\n * data props only, with callbacks routed through a ref.\n * - The embedded iframe doesn't reliably deliver onTransactionCompleted (the\n * overlay flow also has onClose as a fallback trigger; embedded has neither),\n * so provider reads are polled while the widget is open — once a completed\n * order is visible, it surfaces in `pending` and verification auto-starts.\n * - `autoStart` opens the widget once, as soon as the flow allows it.\n */\nexport function useMoonPayOnRampAdapter({\n variant,\n visible,\n autoStart,\n canBuy,\n openWidget,\n shouldPollPending,\n refreshPending,\n theme,\n themeId,\n colorCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n quoteCurrencyAmount,\n lockAmount,\n paymentMethod,\n currencyCode,\n depositAddress,\n externalCustomerId,\n externalTransactionId,\n onClose,\n onCloseOverlay,\n onReady,\n onUrlSignatureRequested,\n onTransactionCreated,\n onTransactionCompleted,\n}: UseMoonPayOnRampAdapterOptions): ReactNode {\n const autoStartedRef = useRef(false)\n useEffect(() => {\n if (!autoStart || autoStartedRef.current || !canBuy) return\n autoStartedRef.current = true\n void openWidget()\n }, [autoStart, canBuy, openWidget])\n\n useEffect(() => {\n if (\n !moonPayOnRampAdapter.pollPendingWhileOpen ||\n variant !== 'embedded' ||\n !visible ||\n !shouldPollPending\n ) {\n return\n }\n const id = setInterval(() => void refreshPending(), MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS)\n return () => clearInterval(id)\n }, [variant, visible, shouldPollPending, refreshPending])\n\n const callbacksRef = useRef({\n onClose,\n onCloseOverlay,\n onReady,\n onUrlSignatureRequested,\n onTransactionCreated,\n onTransactionCompleted,\n })\n useEffect(() => {\n callbacksRef.current = {\n onClose,\n onCloseOverlay,\n onReady,\n onUrlSignatureRequested,\n onTransactionCreated,\n onTransactionCompleted,\n }\n })\n\n // MoonPay's overlayNode wants a Node, not React.\n const overlayNode = useMemo(\n () => (variant === 'overlay' ? buildOverlayNode() : undefined),\n [variant]\n )\n\n return useMemo(() => {\n if (!visible || !depositAddress || !externalTransactionId) return null\n return (\n <MoonPayBuyWidget\n variant={variant}\n visible\n theme={theme}\n themeId={themeId}\n colorCode={colorCode}\n overlayNode={overlayNode}\n baseCurrencyCode={baseCurrencyCode}\n baseCurrencyAmount={baseCurrencyAmount}\n quoteCurrencyAmount={quoteCurrencyAmount}\n lockAmount={lockAmount ? 'true' : undefined}\n paymentMethod={paymentMethod}\n currencyCode={currencyCode}\n walletAddress={depositAddress}\n externalCustomerId={externalCustomerId}\n externalTransactionId={externalTransactionId}\n onClose={() => callbacksRef.current.onClose()}\n onCloseOverlay={() => callbacksRef.current.onCloseOverlay()}\n onReady={() => callbacksRef.current.onReady()}\n onUrlSignatureRequested={(url) => callbacksRef.current.onUrlSignatureRequested(url)}\n onTransactionCreated={(props) => callbacksRef.current.onTransactionCreated(props)}\n onTransactionCompleted={(props) => callbacksRef.current.onTransactionCompleted(props)}\n />\n )\n }, [\n visible,\n depositAddress,\n externalTransactionId,\n variant,\n theme,\n themeId,\n colorCode,\n overlayNode,\n baseCurrencyCode,\n baseCurrencyAmount,\n quoteCurrencyAmount,\n lockAmount,\n paymentMethod,\n currencyCode,\n externalCustomerId,\n ])\n}\n\nfunction buildOverlayNode(): HTMLDivElement | undefined {\n if (typeof document === 'undefined') return undefined\n const wrap = document.createElement('div')\n wrap.style.cssText = 'display:flex;flex-direction:column;align-items:center;gap:12px'\n wrap.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"139\" height=\"20.61\" viewBox=\"0 0 139 20.61\"><path d=\"M15.08,20.61L10.49,20.61L10.49,0.00L17.96,0.00L18.81,0.02L19.62,0.10L20.38,0.22L21.11,0.39L21.79,0.60L22.43,0.87L23.03,1.18L23.58,1.53L24.08,1.92L24.53,2.35L24.93,2.82L25.29,3.33L25.59,3.88L25.84,4.47L26.03,5.09L26.17,5.75L26.25,6.44L26.28,7.17L26.28,7.17L26.28,7.62L26.25,8.33L26.17,9.01L26.03,9.66L25.84,10.27L25.59,10.86L25.29,11.41L24.93,11.93L24.53,12.40L24.08,12.83L23.58,13.23L23.03,13.58L22.43,13.89L21.79,14.15L21.11,14.37L20.38,14.54L19.62,14.66L18.81,14.73L17.96,14.76L17.96,14.76L15.08,14.76L15.08,20.61ZM18.19,3.98L15.08,3.98L15.08,10.78L18.19,10.78L18.53,10.77L18.87,10.73L19.18,10.68L19.48,10.59L19.76,10.49L20.02,10.36L20.27,10.21L20.50,10.04L20.70,9.85L20.89,9.64L21.06,9.42L21.21,9.17L21.34,8.91L21.45,8.63L21.53,8.34L21.59,8.04L21.62,7.72L21.63,7.39L21.63,7.39L21.62,7.05L21.59,6.72L21.53,6.40L21.45,6.10L21.34,5.82L21.21,5.56L21.06,5.31L20.89,5.09L20.70,4.88L20.50,4.69L20.27,4.53L20.02,4.38L19.76,4.26L19.48,4.16L19.18,4.08L18.87,4.02L18.53,3.99L18.19,3.98L18.19,3.98ZM31.76,20.61L27.16,20.61L27.16,0.00L35.20,0.00L36.03,0.02L36.82,0.09L37.58,0.19L38.30,0.34L38.98,0.53L39.62,0.77L40.23,1.05L40.78,1.37L41.28,1.73L41.74,2.13L42.15,2.57L42.51,3.05L42.82,3.58L43.07,4.15L43.26,4.76L43.40,5.42L43.49,6.12L43.52,6.86L43.52,6.86L43.52,7.31L43.49,8.04L43.40,8.73L43.26,9.38L43.07,9.98L42.82,10.54L42.51,11.06L42.51,11.06L42.15,11.53L41.75,11.97L41.30,12.36L40.80,12.72L40.26,13.03L39.68,13.30L39.68,13.30L44.89,20.61L39.57,20.61L35.12,14.06L31.76,14.06L31.76,20.61ZM35.56,3.89L31.76,3.89L31.76,10.44L35.56,10.44L35.89,10.43L36.21,10.40L36.51,10.34L36.79,10.26L37.06,10.16L37.31,10.04L37.55,9.89L37.77,9.73L37.97,9.55L38.15,9.35L38.32,9.13L38.46,8.89L38.59,8.64L38.69,8.37L38.77,8.09L38.82,7.79L38.86,7.49L38.87,7.17L38.86,6.85L38.82,6.54L38.77,6.25L38.69,5.97L38.59,5.70L38.46,5.45L38.32,5.21L38.15,4.99L37.97,4.79L37.77,4.61L37.55,4.44L37.31,4.30L37.06,4.17L36.79,4.07L36.51,3.99L36.21,3.94L35.89,3.90L35.56,3.89L35.56,3.89ZM50.25,20.61L45.66,20.61L45.66,0.17L50.25,0.17L50.25,20.61ZM64.88,20.61L57.41,20.61L51.19,0.17L55.92,0.17L60.71,16.88L61.66,16.88L66.09,0.17L70.68,0.17L64.88,20.61ZM71.44,20.61L66.85,20.61L73.60,0.17L81.02,0.17L88.02,20.61L83.26,20.61L81.61,15.54L73.07,15.54L71.44,20.61ZM74.27,11.73L80.35,11.73L77.80,3.92L76.76,3.92L74.27,11.73ZM92.94,20.61L88.68,20.61L88.68,0.17L96.21,0.17L103.91,16.88L104.30,16.88L104.30,0.17L108.62,0.17L108.62,20.61L101.03,20.61L93.33,3.89L92.94,3.89L92.94,20.61ZM113.87,20.61L109.28,20.61L116.02,0.17L123.44,0.17L130.44,20.61L125.68,20.61L124.03,15.54L115.49,15.54L113.87,20.61ZM116.70,11.73L122.77,11.73L120.22,3.92L119.19,3.92L116.70,11.73Z\" fill=\"#ffffff\"/></svg><span>Your secure checkout is loading</span>`\n return wrap\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { CircleCheckIcon, Loader2 } from 'lucide-react'\nimport { formatUnits, parseUnits } from 'viem'\nimport { useAccount } from 'wagmi'\nimport { Button } from '@/components/ui/button'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { useFiatOnRamp, type FiatOnRampDebugEvent } from '@/sdk/hooks/use-fiat-on-ramp'\nimport type { OnRampPostDepositLockConfig, PostDepositLockError } from '@/sdk/hooks/pending-lock'\nimport type { Bytes32, OnRampRecord, TransactionSubmissionResponse } from '@/sdk/types'\nimport { canRetryOnRampVerification, matchesOnRampTransaction } from '@/sdk/on-ramp/provider'\nimport { matchesFrozenOnRampToken } from '@/sdk/on-ramp/product-config'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { useMoonPayOnRampAdapter } from './use-moonpay-on-ramp-adapter'\n\nexport interface FiatOnRampFormProps {\n /** Privana token id to deposit into after the on-ramp completes. */\n tokenId: Bytes32\n /**\n * MoonPay currency code, e.g. 'usdc_base' (prod) or 'usdc_base_sepolia' (sandbox).\n * MoonPay maintains the canonical list at /v3/currencies.\n */\n currencyCode: string\n /** Fiat currency code (default: 'usd'). */\n baseCurrencyCode?: string\n /** Pre-filled fiat amount the user can still edit in MoonPay (default: '100'). */\n defaultBaseCurrencyAmount?: string\n /**\n * Exact crypto amount (human units) the purchase should deliver. Takes\n * precedence over `defaultBaseCurrencyAmount` inside MoonPay. Required when\n * `postDepositLock` is set.\n */\n quoteCurrencyAmount?: string\n /** Override the display symbol. Defaults to the resolved token's symbol, then `currencyCode`. */\n tokenSymbol?: string\n /** Enable dark mode or light mode as the default appearance for the widget. Possible values are dark, light. */\n theme?: 'light' | 'dark'\n /** Theme created via MoonPay dashboard theme builder */\n themeId?: string\n /** Widget main color. It is used for buttons, links and highlighted text. Only hexadecimal codes are accepted. */\n colorCode?: string\n /**\n * - 'overlay' (default): full-screen modal over the page with the Privana splash screen.\n * - 'embedded': iframe injected inline where this component renders.\n * other variants are intentionally not supported - they require `window.open` to fire synchronously inside the\n * click handler, but this form awaits `prepareOnRampIntent` before mounting the widget, so the popup would be blocked by the browser.\n */\n variant?: 'overlay' | 'embedded'\n /**\n * Prepare on-ramp intent and mount widget automatically on load. Intended for flows where the purchase was already confirmed.\n */\n autoStart?: boolean\n /**\n * When true, the user cannot edit the fiat amount inside MoonPay.\n * Requires `defaultBaseCurrencyAmount` to take effect — MoonPay silently\n * skips this when no amount is set.\n */\n lockAmount?: boolean\n /** Pre-selects a payment method tab in MoonPay */\n paymentMethod?: string\n /**\n * Pre-sign a `Lock` for the buffered `quoteCurrencyAmount` before the\n * purchase; the SDK submits it once the delivered deposit credits.\n */\n postDepositLock?: OnRampPostDepositLockConfig\n /** Fired when the resulting Privana deposit is credited. */\n onCredited?: (depositTxHash: string) => void\n /** Fired when the pre-signed post-deposit lock is accepted by the API. */\n onLockSubmitted?: (response: TransactionSubmissionResponse) => void\n /** Fired when the deposit credited but the pre-signed lock failed — re-prompt. */\n onLockFailed?: (error: PostDepositLockError) => void\n onError?: (error: Error) => void\n /** Leave product UI while retaining its signed intent for exact recovery. */\n onLeaveFlow?: () => void\n /** Optional diagnostic event stream for previews/tests. */\n onDebugEvent?: (event: FiatOnRampDebugEvent) => void\n /** Product modals must not route callbacks from unrelated recovered rows. */\n onlyRouteActiveIntentCallbacks?: boolean\n /**\n * Product flows freeze the launch token when the purchase starts. When set,\n * a live-config drift away from this snapshot fails closed instead of\n * launching against a silently different token.\n */\n frozenToken?: TokenConfig\n onUnsafeToCloseChange?: (unsafe: boolean) => void\n onActiveFlowChange?: (active: boolean) => void\n}\n\nexport function FiatOnRampForm({\n tokenId,\n currencyCode,\n baseCurrencyCode = 'usd',\n defaultBaseCurrencyAmount = '100',\n quoteCurrencyAmount,\n tokenSymbol,\n theme,\n themeId,\n colorCode,\n variant = 'overlay',\n autoStart = false,\n lockAmount,\n paymentMethod,\n postDepositLock,\n onCredited,\n onLockSubmitted,\n onLockFailed,\n onError,\n onLeaveFlow,\n onDebugEvent,\n onlyRouteActiveIntentCallbacks = false,\n frozenToken,\n onUnsafeToCloseChange,\n onActiveFlowChange,\n}: FiatOnRampFormProps) {\n const { address } = useAccount()\n const [visible, setVisible] = useState(false)\n const [isPreparing, setIsPreparing] = useState(false)\n const [rowError, setRowError] = useState<{ id: string; message: string } | null>(null)\n // The purchase credited but the pre-signed lock didn't apply — rendered\n // inline so the failure is visible even when the host wires no callback.\n const [lockError, setLockError] = useState<string | null>(null)\n // With a lock configured the flow's promise is locked funds, not just a\n // credit — hold the terminal success panel until the lock settles.\n const [lockSettled, setLockSettled] = useState(false)\n const [ownedTerminal, setOwnedTerminal] = useState(false)\n const ownedIntentIdRef = useRef<string | null>(null)\n\n const ownsRecord = useCallback(\n (record: OnRampRecord) =>\n Boolean(\n ownedIntentIdRef.current && matchesOnRampTransaction(record, ownedIntentIdRef.current)\n ),\n []\n )\n\n const {\n status,\n activeIntentId,\n pending,\n activeVerificationId,\n error,\n finalityProgress,\n depositAddress,\n minDepositBaseUnits,\n selectedToken,\n prepareOnRampIntent,\n signUrl,\n handleTransactionCreated,\n handleTransactionCompleted,\n finishPendingVerification,\n handleWidgetClosed,\n refreshPending,\n } = useFiatOnRamp({\n tokenId,\n postDepositLock,\n onCredited: (depositTxHash, record) => {\n if (!onlyRouteActiveIntentCallbacks || ownsRecord(record)) {\n onCredited?.(depositTxHash)\n }\n if (ownsRecord(record) && !postDepositLock) {\n setOwnedTerminal(true)\n onActiveFlowChange?.(false)\n }\n },\n // Product modals route only the snapshotted intent. Standalone consumers\n // retain the legacy behavior of receiving recovered-row callbacks.\n onLockSubmitted: (response, record) => {\n const routesToCurrentFlow = !onlyRouteActiveIntentCallbacks || ownsRecord(record)\n if (!routesToCurrentFlow) return\n setLockError(null)\n setLockSettled(true)\n onLockSubmitted?.(response)\n if (ownsRecord(record)) {\n setOwnedTerminal(true)\n onActiveFlowChange?.(false)\n }\n },\n onLockFailed: (err, record) => {\n const routesToCurrentFlow = !onlyRouteActiveIntentCallbacks || ownsRecord(record)\n if (!routesToCurrentFlow) return\n setLockError(err.message)\n onLockFailed?.(err)\n if (ownsRecord(record)) {\n setOwnedTerminal(true)\n onActiveFlowChange?.(false)\n }\n },\n onError,\n onDebugEvent,\n })\n\n const decimals = selectedToken?.decimals\n const displaySymbol = tokenSymbol ?? selectedToken?.symbol ?? currencyCode.toUpperCase()\n\n const emitFormDebug = useCallback(\n (event: string, payload?: Record<string, unknown>) => {\n onDebugEvent?.({\n at: new Date().toISOString(),\n event,\n status,\n tokenId,\n payload,\n })\n },\n [onDebugEvent, status, tokenId]\n )\n\n // Approximate the fiat floor we need to clear the minimum-deposit check.\n // Pads the token's base-units minimum by 5% (MoonPay's worst-case card fee\n // is ~4.5%) so the post-fee delivered amount doesn't fall below Privana's\n // minimum and strand the user's funds. Only used to gate the buy button\n // when the user is at the bottom of the range — actual MoonPay fees are\n // variable by payment method and apply inside the widget regardless.\n const minFiatGate =\n minDepositBaseUnits !== undefined && decimals !== undefined\n ? Number(formatUnits(minDepositBaseUnits, decimals)) * 1.05\n : undefined\n // Quote-driven purchases target the exact crypto amount (fees come out of\n // the fiat total), so the minimum check compares base units directly. A\n // quote that fails to parse must block the purchase, not silently fall back\n // to the fiat gate — MoonPay would receive the malformed quote as-is.\n const { units: quoteBaseUnits, failed: quoteParseFailed } = (() => {\n if (!quoteCurrencyAmount || decimals === undefined) return { units: undefined, failed: false }\n try {\n return { units: parseUnits(quoteCurrencyAmount, decimals), failed: false }\n } catch {\n return { units: undefined, failed: true }\n }\n })()\n const isBelowMin =\n quoteBaseUnits !== undefined && minDepositBaseUnits !== undefined\n ? quoteBaseUnits < minDepositBaseUnits\n : minFiatGate !== undefined && Number(defaultBaseCurrencyAmount) < minFiatGate\n // Fail closed on an unknown minimum: an unverifiable-below-minimum purchase\n // is only discovered after the user has already paid.\n const minimumUnknown = minDepositBaseUnits === undefined\n const tokenMismatch =\n frozenToken !== undefined && !matchesFrozenOnRampToken(frozenToken, selectedToken)\n const isBusy = isPreparing || status === 'awaiting-purchase'\n // Credited with a lock configured but neither settled nor failed yet: the\n // submission is in flight, so the terminal success panel would overpromise.\n const lockPending = !!postDepositLock && status === 'credited' && !lockSettled && !lockError\n const isInitializing = !!address && !depositAddress\n const isPrePurchase = status === 'idle' || status === 'awaiting-purchase'\n const isVerifying = status === 'awaiting-delivery' || status === 'verifying'\n const blockReasons = useMemo(\n () =>\n [\n !address ? 'wallet-not-connected' : null,\n !depositAddress ? 'deposit-address-not-loaded' : null,\n isBusy ? `busy:${isPreparing ? 'preparing' : status}` : null,\n visible ? 'widget-open' : null,\n minimumUnknown ? 'minimum-unknown' : null,\n isBelowMin ? 'below-minimum' : null,\n tokenMismatch ? 'token-drift' : null,\n quoteParseFailed ? 'invalid-quote-amount' : null,\n ].filter((reason): reason is string => Boolean(reason)),\n [\n address,\n depositAddress,\n isBelowMin,\n isBusy,\n isPreparing,\n minimumUnknown,\n quoteParseFailed,\n status,\n tokenMismatch,\n visible,\n ]\n )\n const canBuy = blockReasons.length === 0\n\n const handleOpen = useCallback(async () => {\n if (!canBuy) {\n emitFormDebug('form:open-blocked', {\n reasons: blockReasons,\n currencyCode,\n tokenSymbol: displaySymbol,\n tokenDecimals: decimals ?? null,\n baseCurrencyCode,\n baseCurrencyAmountPresent: Boolean(defaultBaseCurrencyAmount),\n depositAddressReady: Boolean(depositAddress),\n walletConnected: Boolean(address),\n status,\n })\n return\n }\n\n setIsPreparing(true)\n setOwnedTerminal(false)\n ownedIntentIdRef.current = null\n // A fresh purchase gets a fresh lock — drop the previous one's outcome.\n setLockError(null)\n setLockSettled(false)\n emitFormDebug('form:open-click', {\n currencyCode,\n tokenSymbol: displaySymbol,\n tokenDecimals: decimals ?? null,\n baseCurrencyCode,\n baseCurrencyAmountPresent: Boolean(defaultBaseCurrencyAmount),\n depositAddressReady: Boolean(depositAddress),\n walletConnected: Boolean(address),\n })\n try {\n const intent = await prepareOnRampIntent({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount: defaultBaseCurrencyAmount,\n quoteCurrencyAmount,\n })\n ownedIntentIdRef.current = intent.transaction_id\n onActiveFlowChange?.(true)\n emitFormDebug('form:intent-ready', {\n transactionIdPresent: Boolean(intent.transaction_id),\n externalTransactionIdPresent: Boolean(intent.external_transaction_id),\n })\n setVisible(true)\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to prepare MoonPay on-ramp')\n emitFormDebug('form:intent-error', {\n name: error.name,\n message: error.message,\n })\n } finally {\n setIsPreparing(false)\n }\n }, [\n address,\n baseCurrencyCode,\n blockReasons,\n canBuy,\n currencyCode,\n decimals,\n displaySymbol,\n defaultBaseCurrencyAmount,\n quoteCurrencyAmount,\n depositAddress,\n emitFormDebug,\n prepareOnRampIntent,\n status,\n onActiveFlowChange,\n ])\n\n const handleClose = useCallback(async () => {\n emitFormDebug('moonpay:onClose')\n setVisible(false)\n await handleWidgetClosed()\n }, [emitFormDebug, handleWidgetClosed])\n\n const handleCloseOverlay = useCallback(async () => {\n emitFormDebug('moonpay:onCloseOverlay')\n setVisible(false)\n await handleWidgetClosed()\n }, [emitFormDebug, handleWidgetClosed])\n\n const handleReady = useCallback(async () => {\n emitFormDebug('moonpay:onReady')\n }, [emitFormDebug])\n\n const handleLeaveFlow = useCallback(() => {\n // Unmounting closes the provider UI. Do not wait for delivery polling here:\n // the signed intent is already durable and the next mount resumes recovery.\n setVisible(false)\n onActiveFlowChange?.(false)\n onLeaveFlow?.()\n }, [onActiveFlowChange, onLeaveFlow])\n\n const widgetElement = useMoonPayOnRampAdapter({\n variant,\n visible,\n autoStart,\n canBuy,\n openWidget: handleOpen,\n shouldPollPending: status === 'awaiting-purchase',\n refreshPending,\n theme,\n themeId,\n colorCode,\n baseCurrencyCode,\n baseCurrencyAmount: defaultBaseCurrencyAmount,\n quoteCurrencyAmount,\n lockAmount,\n paymentMethod,\n currencyCode,\n depositAddress,\n externalCustomerId: address?.toLowerCase(),\n externalTransactionId: activeIntentId,\n onClose: handleClose,\n onCloseOverlay: handleCloseOverlay,\n onReady: handleReady,\n onUrlSignatureRequested: signUrl,\n onTransactionCreated: handleTransactionCreated,\n onTransactionCompleted: handleTransactionCompleted,\n })\n\n const ownsActiveIntent = Boolean(\n activeIntentId && ownedIntentIdRef.current && activeIntentId === ownedIntentIdRef.current\n )\n const ownsPending = Boolean(\n ownedIntentIdRef.current &&\n pending.some((record) => matchesOnRampTransaction(record, ownedIntentIdRef.current!))\n )\n const ownedFlowActive = !ownedTerminal && (ownsActiveIntent || ownsPending || lockPending)\n\n useEffect(() => {\n onActiveFlowChange?.(ownedFlowActive)\n }, [onActiveFlowChange, ownedFlowActive])\n\n const unsafeToClose = isPreparing || lockPending\n useEffect(() => {\n onUnsafeToCloseChange?.(unsafeToClose)\n return () => onUnsafeToCloseChange?.(false)\n }, [onUnsafeToCloseChange, unsafeToClose])\n\n // A scope switch or definitive intent rejection clears the core's active\n // intent. Close the now-unrenderable widget shell so a fresh purchase is not\n // left blocked by stale local visibility state.\n useEffect(() => {\n if (visible && !activeIntentId && status === 'idle') setVisible(false)\n }, [activeIntentId, status, visible])\n\n // The embedded widget doesn't self-close on completion (the overlay does, which\n // is what surfaces the finality/verification status). Once the purchase settles,\n // hide it and refresh once so the pending/finality UI takes over.\n useEffect(() => {\n if (variant !== 'embedded' || !visible) return\n if (isVerifying || status === 'credited') {\n setVisible(false)\n void refreshPending()\n }\n }, [variant, visible, isVerifying, status, refreshPending])\n\n return (\n <div data-privana className=\"flex flex-col gap-4\">\n {pending.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-foreground text-sm font-medium\">Validating purchases</p>\n {pending.map((record) => {\n const progress = parseFinalityProgress(finalityProgress[record.transaction_id])\n const isActivelyVerifying = record.transaction_id === activeVerificationId\n const showRetry = canRetryOnRampVerification(record, activeVerificationId)\n return (\n <div\n key={record.transaction_id}\n className=\"border-border flex flex-col gap-1 rounded-md border p-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-muted-foreground flex items-center gap-1 text-xs\">\n <Loader2 className=\"size-3 animate-spin\" aria-hidden />\n {record.on_chain_tx_hash\n ? (progress ?? (isActivelyVerifying ? 'Verifying…' : 'Ready to verify'))\n : 'Waiting for provider delivery…'}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {record.quote_currency_amount ?? '?'} {displaySymbol}\n </p>\n </div>\n {rowError?.id === record.transaction_id && (\n <p className=\"text-destructive text-xs\">{rowError.message}</p>\n )}\n {showRetry && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={async () => {\n setRowError(null)\n try {\n await finishPendingVerification(record)\n } catch (err) {\n setRowError({\n id: record.transaction_id,\n message: err instanceof Error ? err.message : 'Verification failed',\n })\n }\n }}\n >\n Retry verification\n </Button>\n )}\n {!record.on_chain_tx_hash && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refreshPending()}\n >\n Refresh delivery\n </Button>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {status === 'credited' && !lockPending && !lockError && (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <CircleCheckIcon className=\"text-primary size-8\" aria-hidden />\n <p className=\"text-foreground text-sm font-medium\">Purchase credited</p>\n <p className=\"text-muted-foreground text-sm\">\n Your {displaySymbol} deposit is now available in your balance.\n </p>\n </div>\n )}\n\n {lockPending && (\n <p className=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n Purchase credited. Locking your funds…\n </p>\n )}\n\n {autoStart ? (\n !visible && isPrePurchase && <Skeleton className=\"h-[656px] w-full rounded-md\" />\n ) : isInitializing ? (\n <Skeleton className=\"h-9 w-full rounded-md\" />\n ) : (\n <Button type=\"button\" onClick={handleOpen} disabled={!canBuy}>\n {(isBusy || visible) && <Loader2 className=\"animate-spin\" aria-hidden />}\n Buy\n </Button>\n )}\n\n {widgetElement}\n\n {onLeaveFlow && ownedFlowActive && !unsafeToClose && (\n <div className=\"flex flex-col gap-1\">\n <Button type=\"button\" variant=\"outline\" onClick={handleLeaveFlow}>\n Leave checkout\n </Button>\n <p className=\"text-muted-foreground text-xs\">\n Privana will keep this signed purchase available for exact recovery.\n </p>\n </div>\n )}\n\n {error && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error.message}\n </p>\n )}\n\n {lockError && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n Purchase credited to your account, but locking the funds to a service failed: {lockError}\n </p>\n )}\n\n {isBelowMin && minFiatGate !== undefined && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n Minimum purchase is ~${minFiatGate.toFixed(2)}.\n </p>\n )}\n\n {tokenMismatch && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n The token configuration changed. Close this purchase and start again.\n </p>\n )}\n {!tokenMismatch && depositAddress && minimumUnknown && !error && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n The minimum purchase amount is unavailable. Close this purchase and try again.\n </p>\n )}\n\n {isVerifying && pending.length === 0 && (\n <p className=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n Verifying your purchase…\n </p>\n )}\n </div>\n )\n}\n\nfunction parseFinalityProgress(message: string | undefined): string | null {\n if (!message) return null\n const match = message.match(/(\\d+\\/\\d+)\\s+confirmations/i)\n return match ? `${match[1]} confirmations` : null\n}\n","import type { PrivanaClient } from '../client'\nimport type { OnRampIpAttestation, OnRampSessionResponse } from '../types'\nimport type { OnRampProviderAdapter, OnRampProviderEvent } from './provider'\n\nconst MAX_INTENT_ID_LENGTH = 512\nconst MAX_WIDGET_URL_LENGTH = 8192\nconst TRANSAK_IP_ATTESTATION_PATH = '/__onramp-ip-attest'\nconst TRANSAK_IP_ATTESTATION_TIMEOUT_MS = 10_000\n\ntype TransakAttestationFetcher = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>\n\nconst TRANSAK_WIDGET_ORIGINS = new Set([\n 'https://global-stg.transak.com',\n 'https://global.transak.com',\n])\n\nexport const transakOnRampAdapter: OnRampProviderAdapter = {\n provider: 'transak',\n pollPendingWhileOpen: true,\n buildIntentRequest: ({ walletAddress, tokenId, chainId }) => ({\n wallet_address: walletAddress,\n token_id: tokenId,\n chain_id: chainId,\n }),\n}\n\nexport interface TransakWidgetSession {\n provider: 'transak'\n /** Kept in memory only and used byte-for-byte as the iframe source. */\n url: string\n origin: string\n expiresAt: number\n intentId: string\n generation: number\n}\n\nexport type TransakWidgetAction =\n | { type: 'ready' }\n | { type: 'refresh' }\n | { type: 'close' }\n | { type: 'provider-event'; event: OnRampProviderEvent }\n\nexport interface TransakMessageEvent {\n origin: string\n source: MessageEventSource | null\n data: unknown\n}\n\nexport async function requestTransakWidgetSession({\n client,\n intentId,\n generation,\n now = Date.now,\n fetcher = globalThis.fetch,\n}: {\n client: Pick<PrivanaClient, 'createOnRampSession'>\n intentId: string\n generation: number\n now?: () => number\n fetcher?: TransakAttestationFetcher\n}): Promise<TransakWidgetSession> {\n if (!intentId || intentId.length > MAX_INTENT_ID_LENGTH) {\n throw new Error('Transak session requires a valid on-ramp intent')\n }\n const ipAttestation = await fetchTransakIpAttestation({\n intentId,\n fetcher,\n })\n const response = await client.createOnRampSession({\n transaction_id: intentId,\n ip_attestation: ipAttestation,\n })\n return validateTransakWidgetSession(response, intentId, generation, now())\n}\n\nasync function fetchTransakIpAttestation({\n intentId,\n fetcher,\n}: {\n intentId: string\n fetcher: TransakAttestationFetcher\n}): Promise<OnRampIpAttestation> {\n const subtleCrypto = globalThis.crypto?.subtle\n const origin = globalThis.location?.origin\n if (typeof fetcher !== 'function' || !subtleCrypto || !origin || origin === 'null') {\n throw new Error('Secure client-IP attestation is unavailable')\n }\n\n const digest = await subtleCrypto.digest('SHA-256', new TextEncoder().encode(intentId))\n const intentHash = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0')\n ).join('')\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TRANSAK_IP_ATTESTATION_TIMEOUT_MS)\n try {\n let response: Response\n try {\n response = await fetcher(`${origin}${TRANSAK_IP_ATTESTATION_PATH}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ intentHash }),\n cache: 'no-store',\n credentials: 'omit',\n redirect: 'error',\n signal: controller.signal,\n })\n } catch (error) {\n throw new Error('Client-IP attestation request failed', { cause: error })\n }\n if (!response.ok) {\n throw new Error(`Client-IP attestation request failed with HTTP ${response.status}`)\n }\n\n try {\n return (await response.json()) as OnRampIpAttestation\n } catch (error) {\n throw new Error('Client-IP attestation response is malformed', { cause: error })\n }\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nexport function validateTransakWidgetSession(\n response: OnRampSessionResponse,\n intentId: string,\n generation: number,\n now: number = Date.now()\n): TransakWidgetSession {\n if (!isPlainRecord(response) || response.provider !== 'transak') {\n throw new Error('On-ramp session provider does not match Transak')\n }\n if (!Number.isSafeInteger(response.expires_at) || response.expires_at * 1000 <= now) {\n throw new Error('Transak session is expired or malformed')\n }\n\n const origin = validateTransakWidgetUrl(response.url)\n return {\n provider: 'transak',\n url: response.url,\n origin,\n expiresAt: response.expires_at,\n intentId,\n generation,\n }\n}\n\nexport function isTransakWidgetSessionLoadable(\n session: TransakWidgetSession,\n now: number = Date.now()\n): boolean {\n return session.expiresAt * 1000 > now\n}\n\n/**\n * Accept a widget message only from the currently mounted iframe at the exact\n * origin of its validated, backend-issued session URL.\n */\nexport function resolveTransakWidgetMessage({\n message,\n iframeWindow,\n session,\n currentGeneration,\n}: {\n message: TransakMessageEvent\n iframeWindow: MessageEventSource | null\n session: TransakWidgetSession\n currentGeneration: number\n}): TransakWidgetAction | null {\n if (session.generation !== currentGeneration) return null\n if (!iframeWindow || message.source !== iframeWindow) return null\n if (message.origin !== session.origin) return null\n return normalizeTransakWidgetMessage(message.data, session.intentId)\n}\n\nexport function normalizeTransakWidgetMessage(\n data: unknown,\n intentId: string\n): TransakWidgetAction | null {\n if (!isPlainRecord(data) || typeof data.event_id !== 'string') return null\n\n switch (data.event_id) {\n case 'TRANSAK_WIDGET_INITIALISED':\n case 'TRANSAK_WIDGET_OPEN':\n return { type: 'ready' }\n case 'TRANSAK_ORDER_CREATED':\n return {\n type: 'provider-event',\n event: {\n provider: 'transak',\n kind: 'transaction-created',\n providerTransactionId: intentId,\n intentId,\n },\n }\n case 'TRANSAK_ORDER_SUCCESSFUL':\n return {\n type: 'provider-event',\n event: {\n provider: 'transak',\n kind: 'transaction-completed',\n providerTransactionId: intentId,\n intentId,\n },\n }\n case 'TRANSAK_ORDER_CANCELLED':\n case 'TRANSAK_ORDER_FAILED':\n return { type: 'refresh' }\n case 'TRANSAK_WIDGET_CLOSE':\n return { type: 'close' }\n default:\n return null\n }\n}\n\nfunction validateTransakWidgetUrl(url: string): string {\n if (\n typeof url !== 'string' ||\n url.length === 0 ||\n url.length > MAX_WIDGET_URL_LENGTH ||\n !/^[\\x21-\\x7e]+$/.test(url) ||\n url.includes('\\\\')\n ) {\n throw new Error('Transak widget URL is malformed')\n }\n\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n throw new Error('Transak widget URL is malformed')\n }\n if (parsed.protocol !== 'https:' || parsed.username || parsed.password) {\n throw new Error('Transak widget URL is malformed')\n }\n if (!TRANSAK_WIDGET_ORIGINS.has(parsed.origin)) {\n throw new Error('Transak widget URL origin is not allowed')\n }\n return parsed.origin\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef } from 'react'\nimport { MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS } from './recovery'\nimport {\n isTransakWidgetSessionLoadable,\n resolveTransakWidgetMessage,\n transakOnRampAdapter,\n type TransakWidgetAction,\n type TransakWidgetSession,\n} from './transak-adapter'\n\nexport interface TransakWidgetFrameProps {\n session: TransakWidgetSession\n getCurrentGeneration: () => number\n shouldPollPending: boolean\n refreshPending: () => Promise<void>\n onReady: (generation: number) => void\n onAction: (generation: number, action: TransakWidgetAction) => void | Promise<void>\n onExpired: (generation: number) => void\n title?: string\n className?: string\n}\n\nexport function isTransakWidgetFrameRenderable(\n session: TransakWidgetSession,\n loadedGeneration: number | null,\n now: number = Date.now()\n): boolean {\n return loadedGeneration === session.generation || isTransakWidgetSessionLoadable(session, now)\n}\n\n/** The provider-specific browser boundary. It never interprets order data. */\nexport function TransakWidgetFrame({\n session,\n getCurrentGeneration,\n shouldPollPending,\n refreshPending,\n onReady,\n onAction,\n onExpired,\n title = 'Transak secure checkout',\n className,\n}: TransakWidgetFrameProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null)\n const loadedGenerationRef = useRef<number | null>(null)\n const renderable = isTransakWidgetFrameRenderable(session, loadedGenerationRef.current)\n const readyRef = useRef(false)\n const expiryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const callbacksRef = useRef({\n getCurrentGeneration,\n refreshPending,\n onReady,\n onAction,\n onExpired,\n })\n callbacksRef.current = {\n getCurrentGeneration,\n refreshPending,\n onReady,\n onAction,\n onExpired,\n }\n\n const expireUnloadedSession = useCallback(() => {\n if (loadedGenerationRef.current === session.generation) return\n callbacksRef.current.onExpired(session.generation)\n }, [session.generation])\n\n useEffect(() => {\n loadedGenerationRef.current = null\n readyRef.current = false\n const remaining = session.expiresAt * 1000 - Date.now()\n if (remaining <= 0) {\n expireUnloadedSession()\n return\n }\n expiryTimerRef.current = setTimeout(expireUnloadedSession, remaining)\n return () => {\n if (expiryTimerRef.current) clearTimeout(expiryTimerRef.current)\n expiryTimerRef.current = null\n }\n }, [expireUnloadedSession, session.expiresAt])\n\n useEffect(() => {\n const handleMessage = (message: MessageEvent<unknown>) => {\n const action = resolveTransakWidgetMessage({\n message,\n iframeWindow: iframeRef.current?.contentWindow ?? null,\n session,\n currentGeneration: callbacksRef.current.getCurrentGeneration(),\n })\n if (!action) return\n // A valid message from the exact frame proves the single-use URL loaded,\n // even if it raced the iframe's load event.\n loadedGenerationRef.current = session.generation\n if (expiryTimerRef.current) clearTimeout(expiryTimerRef.current)\n expiryTimerRef.current = null\n void callbacksRef.current.onAction(session.generation, action)\n }\n window.addEventListener('message', handleMessage)\n return () => window.removeEventListener('message', handleMessage)\n }, [session])\n\n useEffect(() => {\n if (!renderable || !transakOnRampAdapter.pollPendingWhileOpen || !shouldPollPending) return\n const id = setInterval(\n () => void callbacksRef.current.refreshPending(),\n MIN_ONRAMP_PENDING_REQUEST_INTERVAL_MS\n )\n return () => clearInterval(id)\n }, [renderable, shouldPollPending])\n\n const handleLoad = useCallback(() => {\n if (!isTransakWidgetSessionLoadable(session)) {\n expireUnloadedSession()\n return\n }\n loadedGenerationRef.current = session.generation\n if (expiryTimerRef.current) clearTimeout(expiryTimerRef.current)\n expiryTimerRef.current = null\n if (readyRef.current) return\n readyRef.current = true\n callbacksRef.current.onReady(session.generation)\n }, [expireUnloadedSession, session])\n\n if (!renderable) return null\n\n return (\n <iframe\n ref={iframeRef}\n src={session.url}\n title={title}\n className={className}\n allow=\"camera; microphone; payment\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n onLoad={handleLoad}\n data-privana-transak-widget\n />\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { TransakWidgetFrame } from '../on-ramp/transak-frame'\nimport {\n requestTransakWidgetSession,\n transakOnRampAdapter,\n type TransakWidgetAction,\n type TransakWidgetSession,\n} from '../on-ramp/transak-adapter'\nimport { matchesOnRampTransaction } from '../on-ramp/provider'\nimport { getOnRampTokenFingerprint } from '../on-ramp/product-config'\nimport type { OnRampRecord } from '../types'\nimport {\n useOnRamp,\n type OnRampDebugEvent,\n type OnRampFlowStatus,\n type UseOnRampOptions,\n type UseOnRampResult,\n} from './use-on-ramp'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport type TransakOnRampStatus = OnRampFlowStatus\nexport type TransakOnRampDebugEvent = OnRampDebugEvent\n\nexport interface UseTransakOnRampOptions extends Omit<UseOnRampOptions, 'adapter'> {\n iframeTitle?: string\n iframeClassName?: string\n}\n\nexport interface TransakOnRampLaunchRequest {\n /** Canonical configured Transak asset code, currently `usdc`. */\n providerAssetCode: string\n /** Required only when `postDepositLock` needs an amount to pre-sign. */\n quoteCurrencyAmount?: string\n}\n\nexport interface UseTransakOnRampResult extends Omit<\n UseOnRampResult,\n | 'prepareOnRampIntent'\n | 'handleProviderLaunchReady'\n | 'handleProviderLaunchFailed'\n | 'handleProviderEvent'\n | 'handleProviderClosed'\n> {\n isLaunching: boolean\n isWidgetOpen: boolean\n /** True only while the current intent has never reached a provider UI. */\n canRecreateSession: boolean\n /** Hardened iframe for the current in-memory session, or null when closed. */\n widget: ReactNode\n /** Create a fresh intent and session from an explicit user launch. */\n launch: (request: TransakOnRampLaunchRequest) => Promise<void>\n /** Explicitly request a new single-use URL for the current unresolved intent. */\n recreateSession: () => Promise<void>\n closeWidget: () => Promise<void>\n}\n\ninterface TransakSessionRequest {\n generation: number\n promise: Promise<void>\n}\n\nexport type TransakSessionRecreationState = 'none' | 'preload-only' | 'blocked'\nexport type TransakSessionRecreationEvent =\n | 'reset'\n | 'intent-created'\n | 'provider-ui-activated'\n | 'provider-evidence'\n\nexport function transitionTransakSessionRecreation(\n state: TransakSessionRecreationState,\n event: TransakSessionRecreationEvent\n): TransakSessionRecreationState {\n if (event === 'reset') return 'none'\n if (event === 'intent-created') return 'preload-only'\n if (state === 'none') return 'none'\n return 'blocked'\n}\n\nexport function getMountedTransakSessionError(\n action: 'launch' | 'reopen',\n hasMountedSession: boolean\n): Error | null {\n if (!hasMountedSession) return null\n return action === 'launch'\n ? new Error('Close the current Transak checkout before launching another')\n : new Error('Close or expire the current Transak checkout before reopening')\n}\n\nexport function getTransakRecreateSessionError({\n hasMountedSession,\n activeIntentId,\n canRecreateSession,\n}: {\n hasMountedSession: boolean\n activeIntentId: string | null\n canRecreateSession: boolean\n}): Error | null {\n const mountedError = getMountedTransakSessionError('reopen', hasMountedSession)\n if (mountedError) return mountedError\n if (!activeIntentId) {\n return new Error('No unresolved Transak intent is available to reopen')\n }\n if (!canRecreateSession) {\n return new Error(\n 'This Transak purchase may already be in progress; continue recovery instead of reopening checkout'\n )\n }\n return null\n}\n\nexport function getTransakSessionContextError({\n currentGeneration,\n expectedGeneration,\n scopeChanged,\n}: {\n currentGeneration: number\n expectedGeneration: number\n scopeChanged: boolean\n}): Error | null {\n if (currentGeneration !== expectedGeneration) {\n return new Error('Transak checkout request was cancelled')\n }\n if (scopeChanged) {\n return new Error('On-ramp account or network changed while creating the session')\n }\n return null\n}\n\nexport function getTransakSessionRequestError({\n currentGeneration,\n expectedGeneration,\n scopeChanged,\n activeIntentId,\n expectedIntentId,\n}: {\n currentGeneration: number\n expectedGeneration: number\n scopeChanged: boolean\n activeIntentId: string | null\n expectedIntentId: string\n}): Error | null {\n const contextError = getTransakSessionContextError({\n currentGeneration,\n expectedGeneration,\n scopeChanged,\n })\n if (contextError) return contextError\n if (activeIntentId !== expectedIntentId) {\n return new Error('The Transak purchase intent is no longer active')\n }\n return null\n}\n\nexport function shouldSurfaceTransakSessionFailure({\n status,\n activeIntentId,\n activeVerificationId,\n activeVerificationRecord,\n expectedIntentId,\n}: {\n status: TransakOnRampStatus\n activeIntentId: string | null\n activeVerificationId: string | null\n activeVerificationRecord: OnRampRecord | null\n expectedIntentId: string | null\n}): boolean {\n if (!expectedIntentId || activeIntentId !== expectedIntentId) return false\n\n // Delivery polling starts before a provider row exists, so there is no\n // active verification ID to compare yet.\n if (status === 'awaiting-delivery') return false\n\n const ownsActiveVerification = activeVerificationRecord\n ? matchesOnRampTransaction(activeVerificationRecord, expectedIntentId)\n : activeVerificationId === expectedIntentId\n return !(ownsActiveVerification && (status === 'verifying' || status === 'credited'))\n}\n\nexport function hasTransakProviderEvidence({\n status,\n activeIntentId,\n pending,\n activeVerificationRecord,\n}: {\n status: TransakOnRampStatus\n activeIntentId: string | null\n pending: readonly OnRampRecord[]\n activeVerificationRecord: OnRampRecord | null\n}): boolean {\n if (!activeIntentId) return false\n const ownsRecord = (record: OnRampRecord) => matchesOnRampTransaction(record, activeIntentId)\n\n return (\n pending.some(ownsRecord) ||\n (activeVerificationRecord !== null && ownsRecord(activeVerificationRecord)) ||\n status === 'awaiting-delivery' ||\n status === 'credited'\n )\n}\n\n/** Thin Transak session and iframe adapter over the shared on-ramp state machine. */\nexport function useTransakOnRamp(options: UseTransakOnRampOptions): UseTransakOnRampResult {\n const { iframeTitle, iframeClassName, ...coreOptions } = options\n const { executePrivateRead, privateReadQueryScope } = usePrivateReadRequest()\n const core = useOnRamp({ ...coreOptions, adapter: transakOnRampAdapter })\n const {\n prepareOnRampIntent,\n handleProviderLaunchReady,\n handleProviderLaunchFailed,\n handleProviderEvent,\n handleProviderClosed,\n refreshPending,\n } = core\n\n const [session, setSessionState] = useState<TransakWidgetSession | null>(null)\n const [isLaunching, setIsLaunching] = useState(false)\n const [sessionRecreationState, setSessionRecreationState] =\n useState<TransakSessionRecreationState>('none')\n const sessionRecreationStateRef = useRef<TransakSessionRecreationState>('none')\n const sessionRef = useRef<TransakWidgetSession | null>(null)\n const mountedSessionScopeRef = useRef<symbol | null>(null)\n const generationRef = useRef(0)\n const sessionRequestRef = useRef<TransakSessionRequest | null>(null)\n const activeIntentIdRef = useRef(core.activeIntentId)\n activeIntentIdRef.current = core.activeIntentId\n const activeVerificationIdRef = useRef(core.activeVerificationId)\n activeVerificationIdRef.current = core.activeVerificationId\n const activeVerificationRecord = useMemo(\n () =>\n core.activeVerificationId\n ? (core.pending.find((record) => record.transaction_id === core.activeVerificationId) ??\n null)\n : null,\n [core.activeVerificationId, core.pending]\n )\n const activeVerificationRecordRef = useRef(activeVerificationRecord)\n activeVerificationRecordRef.current = activeVerificationRecord\n const pendingRef = useRef(core.pending)\n pendingRef.current = core.pending\n const coreStatusRef = useRef(core.status)\n coreStatusRef.current = core.status\n const [apiUrl, chainId, privateReadAddress] = privateReadQueryScope\n const scopeIdentity = [\n apiUrl,\n chainId,\n privateReadAddress?.toLowerCase() ?? '',\n coreOptions.tokenId.toLowerCase(),\n getOnRampTokenFingerprint(core.selectedToken),\n ].join('\\u0000')\n // A new symbol for every account/API/chain/token transition also catches\n // A -> B -> A changes. It prevents an old iframe or session response from\n // becoming actionable during the render before the shared core resets.\n const scopeSession = useMemo(() => Symbol(scopeIdentity), [scopeIdentity])\n const scopeSessionRef = useRef(scopeSession)\n scopeSessionRef.current = scopeSession\n\n const setSession = useCallback((next: TransakWidgetSession | null, nextScope: symbol | null) => {\n sessionRef.current = next\n mountedSessionScopeRef.current = nextScope\n setSessionState(next)\n }, [])\n\n const updateSessionRecreation = useCallback((event: TransakSessionRecreationEvent) => {\n const next = transitionTransakSessionRecreation(sessionRecreationStateRef.current, event)\n sessionRecreationStateRef.current = next\n setSessionRecreationState(next)\n }, [])\n const hasProviderEvidence = hasTransakProviderEvidence({\n status: core.status,\n activeIntentId: core.activeIntentId,\n pending: core.pending,\n activeVerificationRecord,\n })\n const canRecreateSession = sessionRecreationState === 'preload-only' && !hasProviderEvidence\n\n const requestSession = useCallback(\n (intentId: string, generation: number) =>\n executePrivateRead((readClient) =>\n requestTransakWidgetSession({\n client: readClient,\n intentId,\n generation,\n })\n ),\n [executePrivateRead]\n )\n\n const launch = useCallback(\n (request: TransakOnRampLaunchRequest): Promise<void> => {\n const currentRequest = sessionRequestRef.current\n if (currentRequest?.generation === generationRef.current) return currentRequest.promise\n const mountedSessionError = getMountedTransakSessionError(\n 'launch',\n sessionRef.current !== null\n )\n if (mountedSessionError) return Promise.reject(mountedSessionError)\n\n const generation = ++generationRef.current\n setIsLaunching(true)\n updateSessionRecreation('reset')\n let launchedIntentId: string | null = null\n const pendingRequest = (async () => {\n try {\n const intent = await prepareOnRampIntent({\n providerAssetCode: request.providerAssetCode,\n quoteCurrencyAmount: request.quoteCurrencyAmount,\n })\n launchedIntentId = intent.transaction_id\n // A failed or expired session can be recreated only until the first\n // provider frame becomes interactive.\n updateSessionRecreation('intent-created')\n // `prepareOnRampIntent` synchronously owns this intent in the shared\n // core, but React may not have committed the wrapper's render-time\n // `activeIntentId` yet. Guard only request ownership here; the full\n // active-intent guard runs after the asynchronous session request.\n const beforeSessionError = getTransakSessionContextError({\n currentGeneration: generationRef.current,\n expectedGeneration: generation,\n scopeChanged: scopeSessionRef.current !== scopeSession,\n })\n if (beforeSessionError) throw beforeSessionError\n\n const next = await requestSession(intent.transaction_id, generation)\n const afterSessionError = getTransakSessionRequestError({\n currentGeneration: generationRef.current,\n expectedGeneration: generation,\n scopeChanged: scopeSessionRef.current !== scopeSession,\n activeIntentId: activeIntentIdRef.current,\n expectedIntentId: intent.transaction_id,\n })\n if (afterSessionError) throw afterSessionError\n setSession(next, scopeSession)\n } catch (error) {\n const launchError =\n error instanceof Error ? error : new Error('Failed to launch Transak checkout')\n if (\n generationRef.current === generation &&\n shouldSurfaceTransakSessionFailure({\n status: coreStatusRef.current,\n activeIntentId: activeIntentIdRef.current,\n activeVerificationId: activeVerificationIdRef.current,\n activeVerificationRecord: activeVerificationRecordRef.current,\n expectedIntentId: launchedIntentId,\n })\n ) {\n handleProviderLaunchFailed(launchError)\n }\n throw launchError\n } finally {\n if (generationRef.current === generation) setIsLaunching(false)\n if (sessionRequestRef.current?.generation === generation) {\n sessionRequestRef.current = null\n }\n }\n })()\n sessionRequestRef.current = { generation, promise: pendingRequest }\n return pendingRequest\n },\n [\n handleProviderLaunchFailed,\n prepareOnRampIntent,\n requestSession,\n scopeSession,\n setSession,\n updateSessionRecreation,\n ]\n )\n\n const recreateSession = useCallback((): Promise<void> => {\n const currentRequest = sessionRequestRef.current\n if (currentRequest?.generation === generationRef.current) return currentRequest.promise\n const intentId = activeIntentIdRef.current\n const hasProviderEvidence = hasTransakProviderEvidence({\n status: coreStatusRef.current,\n activeIntentId: intentId,\n pending: pendingRef.current,\n activeVerificationRecord: activeVerificationRecordRef.current,\n })\n const recreateError = getTransakRecreateSessionError({\n hasMountedSession: sessionRef.current !== null,\n activeIntentId: intentId,\n canRecreateSession:\n sessionRecreationStateRef.current === 'preload-only' && !hasProviderEvidence,\n })\n if (recreateError) return Promise.reject(recreateError)\n if (!intentId) return Promise.reject(new Error('No unresolved Transak intent is available'))\n\n const generation = ++generationRef.current\n setIsLaunching(true)\n const pendingRequest = (async () => {\n try {\n const next = await requestSession(intentId, generation)\n const requestError = getTransakSessionRequestError({\n currentGeneration: generationRef.current,\n expectedGeneration: generation,\n scopeChanged: scopeSessionRef.current !== scopeSession,\n activeIntentId: activeIntentIdRef.current,\n expectedIntentId: intentId,\n })\n if (requestError) throw requestError\n setSession(next, scopeSession)\n } catch (error) {\n const launchError =\n error instanceof Error ? error : new Error('Failed to recreate Transak checkout')\n if (\n generationRef.current === generation &&\n shouldSurfaceTransakSessionFailure({\n status: coreStatusRef.current,\n activeIntentId: activeIntentIdRef.current,\n activeVerificationId: activeVerificationIdRef.current,\n activeVerificationRecord: activeVerificationRecordRef.current,\n expectedIntentId: intentId,\n })\n ) {\n handleProviderLaunchFailed(launchError)\n }\n throw launchError\n } finally {\n if (generationRef.current === generation) setIsLaunching(false)\n if (sessionRequestRef.current?.generation === generation) {\n sessionRequestRef.current = null\n }\n }\n })()\n sessionRequestRef.current = { generation, promise: pendingRequest }\n return pendingRequest\n }, [handleProviderLaunchFailed, requestSession, scopeSession, setSession])\n\n const closeWidget = useCallback(async () => {\n generationRef.current++\n const shouldReconcile = Boolean(sessionRef.current || activeIntentIdRef.current)\n setSession(null, null)\n setIsLaunching(false)\n if (shouldReconcile) await handleProviderClosed()\n }, [handleProviderClosed, setSession])\n\n const getCurrentGeneration = useCallback(() => generationRef.current, [])\n\n const handleFrameReady = useCallback(\n (generation: number) => {\n const current = sessionRef.current\n if (!current || current.generation !== generation || generationRef.current !== generation)\n return\n updateSessionRecreation('provider-ui-activated')\n handleProviderLaunchReady()\n },\n [handleProviderLaunchReady, updateSessionRecreation]\n )\n\n const handleFrameExpired = useCallback(\n (generation: number) => {\n const current = sessionRef.current\n if (!current || current.generation !== generation || generationRef.current !== generation)\n return\n const shouldSurfaceFailure = shouldSurfaceTransakSessionFailure({\n status: coreStatusRef.current,\n activeIntentId: activeIntentIdRef.current,\n activeVerificationId: activeVerificationIdRef.current,\n activeVerificationRecord: activeVerificationRecordRef.current,\n expectedIntentId: current.intentId,\n })\n generationRef.current++\n setSession(null, null)\n if (shouldSurfaceFailure) {\n handleProviderLaunchFailed(\n new Error(\n 'Transak checkout session expired before it could be loaded; reopen to continue'\n )\n )\n }\n },\n [handleProviderLaunchFailed, setSession]\n )\n\n const handleFrameAction = useCallback(\n async (generation: number, action: TransakWidgetAction) => {\n const current = sessionRef.current\n if (!current || current.generation !== generation || generationRef.current !== generation)\n return\n\n // Any authenticated action proves that the provider UI loaded. Never\n // create a second provider order under this signed intent.\n updateSessionRecreation('provider-ui-activated')\n\n switch (action.type) {\n case 'ready':\n handleProviderLaunchReady()\n return\n case 'refresh':\n await refreshPending()\n return\n case 'provider-event':\n await handleProviderEvent(action.event)\n return\n case 'close':\n await closeWidget()\n }\n },\n [\n closeWidget,\n handleProviderEvent,\n handleProviderLaunchReady,\n refreshPending,\n updateSessionRecreation,\n ]\n )\n\n useEffect(() => {\n const current = sessionRef.current\n if (!current || core.activeIntentId === current.intentId) return\n generationRef.current++\n setSession(null, null)\n }, [core.activeIntentId, setSession])\n\n useEffect(() => {\n if (!core.activeIntentId) {\n updateSessionRecreation('reset')\n return\n }\n if (hasProviderEvidence) {\n updateSessionRecreation('provider-evidence')\n }\n }, [core.activeIntentId, hasProviderEvidence, updateSessionRecreation])\n\n useEffect(() => {\n generationRef.current++\n setSession(null, null)\n setIsLaunching(false)\n updateSessionRecreation('reset')\n }, [scopeSession, setSession, updateSessionRecreation])\n\n useEffect(\n () => () => {\n generationRef.current++\n sessionRef.current = null\n mountedSessionScopeRef.current = null\n },\n []\n )\n\n const scopedSession = mountedSessionScopeRef.current === scopeSession ? session : null\n const widget = useMemo(\n () =>\n scopedSession ? (\n <TransakWidgetFrame\n key={scopedSession.generation}\n session={scopedSession}\n getCurrentGeneration={getCurrentGeneration}\n shouldPollPending={core.status === 'awaiting-purchase'}\n refreshPending={refreshPending}\n onReady={handleFrameReady}\n onAction={handleFrameAction}\n onExpired={handleFrameExpired}\n title={iframeTitle}\n className={iframeClassName}\n />\n ) : null,\n [\n core.status,\n getCurrentGeneration,\n handleFrameAction,\n handleFrameExpired,\n handleFrameReady,\n iframeClassName,\n iframeTitle,\n refreshPending,\n scopedSession,\n ]\n )\n\n return {\n status: core.status,\n activeIntentId: core.activeIntentId,\n pending: core.pending,\n activeVerificationId: core.activeVerificationId,\n error: core.error,\n finalityProgress: core.finalityProgress,\n depositAddress: core.depositAddress,\n minDepositBaseUnits: core.minDepositBaseUnits,\n selectedToken: core.selectedToken,\n finishPendingVerification: core.finishPendingVerification,\n refreshPending,\n isLaunching,\n isWidgetOpen: scopedSession !== null,\n canRecreateSession,\n widget,\n launch,\n recreateSession,\n closeWidget,\n }\n}\n"]}