@oasisprotocol/privana-sdk 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/hooks/use-fiat-on-ramp.ts","../src/components/privana/fiat-on-ramp-form.tsx"],"names":["parseAbiItem","usePrivanaContext","usePrivateReadRequest","useConfig","useState","useRef","useEffect","useCallback","useDepositVerification","zeroAddress","parseUnits","getTransactionReceipt","decodeEventLog","useAccount","formatUnits","useMemo","error","jsxs","jsx","Button","MoonPayBuyWidget"],"mappings":"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","file":"on-ramp.cjs","sourcesContent":["'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { decodeEventLog, parseAbiItem, parseUnits, zeroAddress } from 'viem'\nimport { getTransactionReceipt } from '@wagmi/core'\nimport { useConfig } from 'wagmi'\nimport type { MoonPayBuyWidget } from '@moonpay/moonpay-react'\n\n// MoonPay doesn't export these types directly\ntype MoonPayBuyProps = Parameters<typeof MoonPayBuyWidget>[0]\ntype OnTransactionCompletedProps = Parameters<\n NonNullable<MoonPayBuyProps['onTransactionCompleted']>\n>[0]\ntype OnTransactionCreatedProps = Parameters<NonNullable<MoonPayBuyProps['onTransactionCreated']>>[0]\n\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useDepositVerification } from './use-deposit-verification'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { Bytes32, HexString, OnRampRecord, TokenConfig } 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\nconst ERC20_TRANSFER_EVENT = parseAbiItem(\n 'event Transfer(address indexed from, address indexed to, uint256 value)'\n)\n\nexport type FiatOnRampStatus =\n | 'idle'\n /** Sign-URL succeeded; MoonPay widget shown and user is completing the purchase. */\n | 'awaiting-purchase'\n /** MoonPay reported completion; waiting for the backend webhook to surface the on-chain tx hash. */\n | 'awaiting-delivery'\n /** checkDeposit fired; polling getDepositStatus until credited. */\n | 'verifying'\n | 'credited'\n | 'failed'\n\nexport interface FiatOnRampDebugEvent {\n at: string\n event: string\n status: FiatOnRampStatus\n tokenId: Bytes32\n payload?: Record<string, unknown>\n}\n\nexport interface UseFiatOnRampOptions {\n /** Privana token the on-ramp will deposit into. */\n tokenId: Bytes32\n /** Fired when the deposit is credited inside the Privana accounting module. */\n onCredited?: (txHash: string) => void\n onError?: (error: Error) => void\n /** Optional diagnostic event stream for previews/tests. No auth tokens or signatures are emitted. */\n onDebugEvent?: (event: FiatOnRampDebugEvent) => void\n /**\n * Max time in ms to wait for the backend to surface the on-chain tx hash\n * after MoonPay reports `transaction_completed` or the 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 /** Polling interval in ms while waiting for the on-chain tx hash (default: 3000). */\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 UseFiatOnRampResult {\n status: FiatOnRampStatus\n /** Privana intent id passed to MoonPay as externalTransactionId. */\n activeIntentId: string | null\n /** Completed on-ramps that still need Privana verification. */\n pending: OnRampRecord[]\n error: Error | null\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 MoonPay will echo through externalTransactionId. */\n prepareOnRampIntent: (request: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n }) => Promise<OnRampRecord>\n /** Wire to `<MoonPayBuyWidget onUrlSignatureRequested>`. */\n signUrl: (url: string) => Promise<string>\n /**\n * Wire to `<MoonPayBuyWidget onTransactionCreated>`. Fire-and-forget - records the Privana\n * `token_id` + `chain_id` against the MoonPay transaction so the backend can credit the\n * right balance when the delivery webhook arrives.\n */\n handleTransactionCreated: (props: OnTransactionCreatedProps) => Promise<void>\n /** Wire to `<MoonPayBuyWidget onTransactionCompleted>`. */\n handleTransactionCompleted: (props: OnTransactionCompletedProps) => Promise<void>\n /** Trigger Privana verification for a row returned by `pending`. */\n finishPendingVerification: (record: OnRampRecord) => Promise<void>\n /** Reconcile local state after the MoonPay widget closes. */\n handleWidgetClosed: () => Promise<void>\n refreshPending: () => Promise<void>\n}\n\n/**\n * Buy crypto via MoonPay and credit it to a Privana balance in one flow.\n *\n * Architecture: MoonPay delivers USDC directly to the user's Privana deposit\n * address (NOT the connected wallet) — the wallet is only used for SIWE auth\n * and signs no on-chain transfer. After MoonPay reports the purchase complete,\n * the on-chain tx hash arrives via the MoonPay→backend webhook (not the widget\n * event), so this hook polls `/onramp/pending` until the row's\n * `on_chain_tx_hash` is populated and then triggers Privana verification\n * (`checkDeposit` + `getDepositStatus` poll, delegated to\n * `useDepositVerification`).\n *\n * Wire the returned callbacks to `<MoonPayBuyWidget>`:\n *\n * onUrlSignatureRequested = signUrl\n * onTransactionCreated = handleTransactionCreated\n * onTransactionCompleted = handleTransactionCompleted\n * onClose / onCloseOverlay = handleWidgetClosed\n *\n * Use `<FiatOnRampForm>` if you don't need custom UI around the widget.\n */\nexport function useFiatOnRamp(options: UseFiatOnRampOptions): UseFiatOnRampResult {\n const { tokenId, onCredited, onError, onDebugEvent } = options\n const deliveryTimeout = options.deliveryTimeout ?? DEFAULT_DELIVERY_TIMEOUT_MS\n const deliveryPollInterval = options.deliveryPollInterval ?? 3_000\n const verificationTimeout = options.verificationTimeout ?? DEFAULT_VERIFICATION_TIMEOUT_MS\n const finalityRetryInterval = options.finalityRetryInterval ?? DEFAULT_FINALITY_RETRY_INTERVAL_MS\n\n const { client, enabledTokens } = usePrivanaContext()\n const { executePrivateRead, privateReadReady } = usePrivateReadRequest()\n const wagmiConfig = useConfig()\n\n const selectedToken = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n\n const [status, setStatus] = useState<FiatOnRampStatus>('idle')\n const [pending, setPending] = useState<OnRampRecord[]>([])\n const [error, setError] = useState<Error | null>(null)\n const [depositAddress, setDepositAddress] = useState<`0x${string}` | undefined>()\n const [minDepositBaseUnits, setMinDepositBaseUnits] = useState<bigint | undefined>()\n const [activeIntentId, setActiveIntentId] = useState<string | null>(null)\n\n const onCreditedRef = useRef(onCredited)\n const onErrorRef = useRef(onError)\n const onDebugEventRef = useRef(onDebugEvent)\n const statusRef = useRef(status)\n const activeIntentIdRef = useRef<string | null>(null)\n const activeVerificationRecordRef = useRef<OnRampRecord | null>(null)\n const activeVerificationKeyRef = useRef<string | null>(null)\n const triggeredVerificationKeysRef = useRef<Set<string>>(new Set())\n const closeReconcilePromiseRef = useRef<Promise<void> | null>(null)\n useEffect(() => {\n onCreditedRef.current = onCredited\n onErrorRef.current = onError\n onDebugEventRef.current = onDebugEvent\n }, [onCredited, onError, onDebugEvent])\n\n useEffect(() => {\n statusRef.current = status\n }, [status])\n\n useEffect(() => {\n activeIntentIdRef.current = activeIntentId\n }, [activeIntentId])\n\n useEffect(() => {\n activeIntentIdRef.current = null\n setActiveIntentId(null)\n }, [tokenId])\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 // Fetch the Privana deposit address once. MoonPay needs this to deliver directly to Privana, bypassing the user's wallet.\n useEffect(() => {\n if (!privateReadReady) {\n emitDebug('deposit-address:skip', { reason: 'private-read-not-ready' })\n setDepositAddress(undefined)\n setMinDepositBaseUnits(undefined)\n return\n }\n\n let cancelled = false\n void (async () => {\n try {\n emitDebug('deposit-address:request')\n const resp = await executePrivateRead(() => client.getDepositAddress())\n if (cancelled) return\n setDepositAddress(resp.deposit_address)\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n const mins = token ? resp.min_deposit?.[String(token.chainId)] : undefined\n if (mins?.erc20) setMinDepositBaseUnits(BigInt(mins.erc20))\n emitDebug('deposit-address:success', {\n depositAddress: resp.deposit_address,\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 }, [client, emitDebug, enabledTokens, executePrivateRead, privateReadReady, tokenId])\n\n const refreshPending = useCallback(async () => {\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 { pending: rows } = await executePrivateRead(() => client.getPendingOnRamps())\n setPending(rows)\n emitDebug('pending:success', {\n count: rows.length,\n rows: rows.map(summariseOnRampRecord),\n })\n } catch (err) {\n emitDebug('pending:error', errorPayload(err))\n console.warn('Failed to load pending on-ramps:', err)\n }\n }, [client, emitDebug, executePrivateRead, privateReadReady])\n\n useEffect(() => {\n refreshPending()\n }, [refreshPending])\n\n const clearActiveVerification = useCallback(() => {\n const key = activeVerificationKeyRef.current\n if (key) triggeredVerificationKeysRef.current.delete(key)\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n }, [])\n\n const { verify } = useDepositVerification({\n pollTimeout: verificationTimeout,\n pollInterval: options.verificationPollInterval,\n finalityRetryInterval,\n onCredited: (depositTxHash) => {\n const record = activeVerificationRecordRef.current\n emitDebug('verification:credited', {\n depositTxHash,\n record: record ? summariseOnRampRecord(record) : null,\n })\n setStatus('credited')\n void (async () => {\n try {\n if (record && depositTxHash.startsWith('0x')) {\n emitDebug('onramp:mark-deposit-triggered-request', {\n transactionId: record.transaction_id,\n depositTxHash,\n })\n const updated = await executePrivateRead(() =>\n client.updateOnRamp(record.transaction_id, {\n deposit_tx_hash: depositTxHash as HexString,\n })\n )\n emitDebug('onramp:mark-deposit-triggered-success', {\n record: summariseOnRampRecord(updated),\n })\n }\n } catch (err) {\n emitDebug('onramp:mark-deposit-triggered-error', errorPayload(err))\n console.warn('Failed to mark on-ramp row complete:', err)\n } finally {\n clearActiveVerification()\n if (record && activeIntentIdRef.current === record.transaction_id) {\n activeIntentIdRef.current = null\n setActiveIntentId(null)\n }\n void refreshPending()\n }\n })()\n onCreditedRef.current?.(depositTxHash)\n },\n onCheckTimeout: (depositTxHash) => {\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 setStatus('failed')\n setError(err)\n void refreshPending()\n onErrorRef.current?.(err)\n },\n onError: (err) => {\n emitDebug('verification:error', errorPayload(err))\n clearActiveVerification()\n setStatus('failed')\n setError(err)\n onErrorRef.current?.(err)\n },\n })\n\n const prepareOnRampIntent = useCallback(\n async ({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n }: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n }) => {\n try {\n setError(null)\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token: ${tokenId}`)\n if (!depositAddress) throw new Error('Privana deposit address is not ready')\n\n emitDebug('intent:create-request', {\n tokenId,\n chainId: token.chainId,\n currencyCode,\n baseCurrencyCode: baseCurrencyCode ?? null,\n baseCurrencyAmount: baseCurrencyAmount ?? null,\n depositAddress,\n })\n const record = await executePrivateRead(() =>\n client.createOnRampIntent({\n wallet_address: depositAddress,\n token_id: tokenId,\n chain_id: token.chainId,\n moonpay_currency_code: currencyCode,\n base_currency_code: baseCurrencyCode,\n base_currency_amount: baseCurrencyAmount,\n })\n )\n activeIntentIdRef.current = record.transaction_id\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 setStatus('failed')\n setError(e)\n emitDebug('intent:create-error', errorPayload(e))\n onErrorRef.current?.(e)\n throw e\n }\n },\n [client, depositAddress, emitDebug, enabledTokens, executePrivateRead, tokenId]\n )\n\n // Fire-and-forget: register Privana token_id + chain_id against the MoonPay\n // transaction the moment it's created. The webhook handler create-or-updates\n // so timing isn't gating — if this fails, the row still lands later via the\n // webhook and the user can still finish from the pending list.\n const registerOnRampTokenMapping = useCallback(\n async (moonpayTransactionId: string) => {\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n if (!token) {\n emitDebug('register-token-mapping:skip', {\n moonpayTransactionId,\n reason: 'selected-token-not-found',\n })\n return\n }\n const transactionId = activeIntentIdRef.current ?? moonpayTransactionId\n try {\n emitDebug('register-token-mapping:request', {\n transactionId,\n moonpayTransactionId,\n tokenId,\n chainId: token.chainId,\n })\n const record = await executePrivateRead(() =>\n client.updateOnRamp(transactionId, {\n token_id: tokenId,\n chain_id: token.chainId,\n moonpay_transaction_id:\n transactionId === moonpayTransactionId ? undefined : moonpayTransactionId,\n })\n )\n emitDebug('register-token-mapping:success', {\n transactionId,\n moonpayTransactionId,\n record: summariseOnRampRecord(record),\n })\n } catch (err) {\n emitDebug('register-token-mapping:error', {\n transactionId,\n moonpayTransactionId,\n ...errorPayload(err),\n })\n console.warn('Failed to register on-ramp token mapping:', err)\n }\n },\n [client, emitDebug, enabledTokens, executePrivateRead, tokenId]\n )\n\n const handleTransactionCreated = useCallback(\n async (props: OnTransactionCreatedProps) => {\n emitDebug('moonpay:onTransactionCreated', summariseMoonPayEventProps(props))\n await registerOnRampTokenMapping(props.id)\n },\n [emitDebug, registerOnRampTokenMapping]\n )\n\n const signUrl = useCallback(\n async (url: string): Promise<string> => {\n setError(null)\n try {\n emitDebug('moonpay:onUrlSignatureRequested', summariseMoonPayUrl(url))\n const { signature } = await executePrivateRead(() => client.signOnRampUrl({ url }))\n setStatus('awaiting-purchase')\n emitDebug('sign-url:success', {\n signatureLength: signature.length,\n })\n return signature\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Failed to sign on-ramp URL')\n setStatus('failed')\n setError(e)\n emitDebug('sign-url:error', errorPayload(e))\n onErrorRef.current?.(e)\n throw err\n }\n },\n [client, emitDebug, executePrivateRead]\n )\n\n // After MoonPay reports completion the on-chain tx hash isn't in the widget\n // event — it arrives via the MoonPay→backend webhook. Poll `/pending` until\n // the row for this Privana intent or MoonPay id has `on_chain_tx_hash`\n // populated, then proceed.\n const waitForOnChainHash = useCallback(\n async (transactionId: string): Promise<OnRampRecord | null> => {\n const startTime = Date.now()\n emitDebug('delivery-poll:start', {\n transactionId,\n deliveryTimeout,\n deliveryPollInterval,\n })\n while (Date.now() - startTime < deliveryTimeout) {\n try {\n const { pending: rows } = await executePrivateRead(() => client.getPendingOnRamps())\n setPending(rows)\n const record = rows.find((r) => matchesOnRampTransaction(r, transactionId))\n emitDebug('delivery-poll:tick', {\n transactionId,\n count: rows.length,\n matchingRecord: record ? summariseOnRampRecord(record) : null,\n })\n if (record?.on_chain_tx_hash && record.quote_currency_amount) {\n emitDebug('delivery-poll:success', {\n transactionId,\n record: summariseOnRampRecord(record),\n })\n return record\n }\n } catch (err) {\n emitDebug('delivery-poll:error', {\n transactionId,\n ...errorPayload(err),\n })\n console.warn('Polling pending on-ramps failed:', err)\n }\n await new Promise((r) => setTimeout(r, deliveryPollInterval))\n }\n emitDebug('delivery-poll:timeout', { transactionId })\n return null\n },\n [client, deliveryPollInterval, deliveryTimeout, emitDebug, executePrivateRead]\n )\n\n const triggerVerification = useCallback(\n async (record: OnRampRecord) => {\n const verificationKey = getOnRampVerificationKey(record)\n if (triggeredVerificationKeysRef.current.has(verificationKey)) {\n emitDebug('verification:skip-duplicate', {\n verificationKey,\n record: summariseOnRampRecord(record),\n })\n return\n }\n triggeredVerificationKeysRef.current.add(verificationKey)\n activeVerificationKeyRef.current = verificationKey\n activeVerificationRecordRef.current = record\n\n emitDebug('verification:start', {\n verificationKey,\n record: summariseOnRampRecord(record),\n })\n try {\n if (!record.on_chain_tx_hash || !record.quote_currency_amount) {\n throw new Error('On-ramp record missing on-chain tx hash or delivered amount')\n }\n if (record.chain_id === undefined || !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 amount = await resolveDeliveredAmount({\n onChainTxHash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n walletAddress: record.wallet_address,\n token,\n fallbackAmount: record.quote_currency_amount,\n wagmiConfig,\n emitDebug,\n })\n\n // Post-completion safety net: if MoonPay's fees ate more than expected,\n // the delivered amount might fall below Privana's minimum. Surface a\n // clean error rather than letting checkDeposit reject server-side.\n // (MoonPay's own minimum is usually higher than ours, so this is rare.)\n if (minDepositBaseUnits !== undefined && amount < minDepositBaseUnits) {\n emitDebug('verification:below-minimum', {\n quoteCurrencyAmount: record.quote_currency_amount,\n minDepositBaseUnits: String(minDepositBaseUnits),\n })\n throw new Error(\n `Delivered amount (${record.quote_currency_amount}) is below the minimum deposit.`\n )\n }\n\n setStatus('verifying')\n emitDebug('verification:check-deposit-request', {\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount: amount.toString(),\n })\n await verify({\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount,\n })\n } catch (err) {\n triggeredVerificationKeysRef.current.delete(verificationKey)\n if (activeVerificationKeyRef.current === verificationKey) {\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n }\n throw err\n }\n },\n [emitDebug, enabledTokens, minDepositBaseUnits, verify, wagmiConfig]\n )\n\n const handleTransactionCompleted = useCallback(\n async (props: OnTransactionCompletedProps) => {\n emitDebug('moonpay:onTransactionCompleted', summariseMoonPayEventProps(props))\n try {\n setStatus('awaiting-delivery')\n await registerOnRampTokenMapping(props.id)\n const transactionId = activeIntentIdRef.current ?? props.id\n const record = await waitForOnChainHash(transactionId)\n if (!record) {\n // Backend hasn't received MoonPay's webhook within the timeout. The\n // purchase is real and recovery is available via `pending` - surface\n // a non-terminal error so the form can prompt the user to retry from\n // the pending list once the webhook lands.\n const err = new Error(\n 'Backend has not yet confirmed delivery. You can finish from the pending list.'\n )\n emitDebug('moonpay:completed-without-backend-row', {\n transactionId,\n moonpayTransactionId: props.id,\n message: err.message,\n })\n setStatus('failed')\n setError(err)\n onErrorRef.current?.(err)\n return\n }\n await triggerVerification(record)\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Verification failed')\n emitDebug('moonpay:onTransactionCompleted-error', errorPayload(e))\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n }\n },\n [emitDebug, registerOnRampTokenMapping, triggerVerification, waitForOnChainHash]\n )\n\n const handleWidgetClosed = useCallback(async () => {\n if (closeReconcilePromiseRef.current) return closeReconcilePromiseRef.current\n\n closeReconcilePromiseRef.current = (async () => {\n const previousStatus = statusRef.current\n const transactionId = activeIntentIdRef.current\n emitDebug('moonpay:widget-closed-reconcile', {\n previousStatus,\n transactionId,\n })\n\n if (!transactionId) {\n await refreshPending()\n return\n }\n\n try {\n setStatus('awaiting-delivery')\n const record = await waitForOnChainHash(transactionId)\n if (record) {\n await triggerVerification(record)\n return\n }\n await refreshPending()\n if (previousStatus === 'awaiting-purchase' || previousStatus === 'awaiting-delivery') {\n setStatus('idle')\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error('On-ramp reconciliation failed')\n emitDebug('moonpay:widget-closed-reconcile-error', errorPayload(e))\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n }\n })()\n\n try {\n await closeReconcilePromiseRef.current\n } finally {\n closeReconcilePromiseRef.current = null\n }\n }, [emitDebug, refreshPending, triggerVerification, waitForOnChainHash])\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)\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 }\n },\n [emitDebug, triggerVerification]\n )\n\n return {\n status,\n activeIntentId,\n pending,\n error,\n depositAddress,\n minDepositBaseUnits,\n selectedToken,\n prepareOnRampIntent,\n signUrl,\n handleTransactionCreated,\n handleTransactionCompleted,\n finishPendingVerification,\n handleWidgetClosed,\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 transaction_id: record.transaction_id,\n external_transaction_id: record.external_transaction_id ?? null,\n moonpay_transaction_id: record.moonpay_transaction_id ?? null,\n status: record.status,\n wallet_address: record.wallet_address,\n token_id: record.token_id,\n chain_id: record.chain_id,\n moonpay_currency_code: record.moonpay_currency_code ?? null,\n quote_currency_amount: record.quote_currency_amount ?? null,\n on_chain_tx_hash: record.on_chain_tx_hash ?? null,\n deposit_tx_hash: record.deposit_tx_hash ?? null,\n deposit_triggered_at: record.deposit_triggered_at ?? null,\n credited_at: record.credited_at ?? null,\n }\n}\n\nasync function resolveDeliveredAmount({\n onChainTxHash,\n chainId,\n walletAddress,\n token,\n fallbackAmount,\n wagmiConfig,\n emitDebug,\n}: {\n onChainTxHash: HexString\n chainId: number\n walletAddress: HexString\n token: TokenConfig\n fallbackAmount: string\n wagmiConfig: ReturnType<typeof useConfig>\n emitDebug: (event: string, payload?: Record<string, unknown>) => void\n}): Promise<bigint> {\n if (token.contract === zeroAddress) {\n return parseUnits(fallbackAmount, token.decimals)\n }\n\n let receiptError: unknown\n try {\n const receipt = await getTransactionReceipt(wagmiConfig, {\n hash: onChainTxHash as `0x${string}`,\n chainId,\n })\n\n let delivered = 0n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== token.contract.toLowerCase()) continue\n\n try {\n const decoded = decodeEventLog({\n abi: [ERC20_TRANSFER_EVENT],\n data: log.data,\n topics: log.topics,\n })\n if (decoded.eventName !== 'Transfer') continue\n\n const to = decoded.args.to.toLowerCase()\n if (to !== walletAddress.toLowerCase()) continue\n\n delivered += decoded.args.value\n } catch {\n // Not an ERC-20 Transfer log for this token.\n }\n }\n\n if (delivered > 0n) {\n emitDebug('verification:amount-from-receipt', {\n amount: delivered.toString(),\n tokenAddress: token.contract,\n walletAddress,\n moonpayQuoteCurrencyAmount: fallbackAmount,\n })\n return delivered\n }\n\n emitDebug('verification:amount-from-receipt-missing', {\n tokenAddress: token.contract,\n walletAddress,\n moonpayQuoteCurrencyAmount: fallbackAmount,\n })\n } catch (err) {\n emitDebug('verification:amount-from-receipt-error', errorPayload(err))\n receiptError = err\n }\n\n const errorDetail =\n receiptError instanceof Error\n ? receiptError.message\n : receiptError === undefined\n ? `no ${token.symbol} Transfer to ${walletAddress} found`\n : String(receiptError)\n throw new Error(\n `Unable to derive delivered ${token.symbol} amount from ${onChainTxHash}: ${errorDetail}`\n )\n}\n\nfunction matchesOnRampTransaction(record: OnRampRecord, transactionId: string): boolean {\n return (\n record.transaction_id === transactionId ||\n record.external_transaction_id === transactionId ||\n record.moonpay_transaction_id === transactionId\n )\n}\n\nfunction getOnRampVerificationKey(record: OnRampRecord): string {\n return record.on_chain_tx_hash ?? record.transaction_id\n}\n\nfunction summariseMoonPayEventProps(props: Record<string, unknown>): Record<string, unknown> {\n return {\n id: props.id,\n externalTransactionId: props.externalTransactionId,\n status: props.status,\n walletAddress: props.walletAddress,\n walletAddressTag: props.walletAddressTag,\n baseCurrencyAmount: props.baseCurrencyAmount,\n quoteCurrencyAmount: props.quoteCurrencyAmount,\n baseCurrency: props.baseCurrency,\n quoteCurrency: props.quoteCurrency,\n createdAt: props.createdAt,\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 apiKeyPrefix: params.get('apiKey')?.slice(0, 8) ?? null,\n currencyCode: params.get('currencyCode'),\n baseCurrencyCode: params.get('baseCurrencyCode'),\n baseCurrencyAmount: params.get('baseCurrencyAmount'),\n walletAddress: params.get('walletAddress'),\n externalCustomerId: params.get('externalCustomerId'),\n externalTransactionId: params.get('externalTransactionId'),\n redirectURL: params.get('redirectURL'),\n signaturePresent: params.has('signature'),\n }\n } catch {\n return { parseError: true, length: url.length }\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, useMemo, useState } from 'react'\nimport { formatUnits } from 'viem'\nimport { useAccount } from 'wagmi'\nimport { MoonPayBuyWidget } from '@moonpay/moonpay-react'\nimport { Button } from '@/components/ui/button'\nimport { useFiatOnRamp, type FiatOnRampDebugEvent } from '@/sdk/hooks/use-fiat-on-ramp'\nimport type { Bytes32 } from '@/sdk/types'\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 /** Override the display symbol. Defaults to the resolved token's symbol, then `currencyCode`. */\n tokenSymbol?: string\n /** Fired when the resulting Privana deposit is credited. */\n onCredited?: (depositTxHash: string) => void\n onError?: (error: Error) => void\n /** Optional diagnostic event stream for previews/tests. */\n onDebugEvent?: (event: FiatOnRampDebugEvent) => void\n}\n\nexport function FiatOnRampForm({\n tokenId,\n currencyCode,\n baseCurrencyCode = 'usd',\n defaultBaseCurrencyAmount = '100',\n tokenSymbol,\n onCredited,\n onError,\n onDebugEvent,\n}: FiatOnRampFormProps) {\n const { address } = useAccount()\n const [visible, setVisible] = useState(false)\n const [isPreparing, setIsPreparing] = useState(false)\n\n const {\n status,\n activeIntentId,\n pending,\n error,\n depositAddress,\n minDepositBaseUnits,\n selectedToken,\n prepareOnRampIntent,\n signUrl,\n handleTransactionCreated,\n handleTransactionCompleted,\n finishPendingVerification,\n handleWidgetClosed,\n } = useFiatOnRamp({ tokenId, onCredited, onError, onDebugEvent })\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 const isBelowMin = minFiatGate !== undefined && Number(defaultBaseCurrencyAmount) < minFiatGate\n\n const isBusy =\n isPreparing ||\n status === 'awaiting-purchase' ||\n status === 'awaiting-delivery' ||\n 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 isBelowMin ? 'below-minimum' : null,\n ].filter((reason): reason is string => Boolean(reason)),\n [address, depositAddress, isBelowMin, isBusy, isPreparing, status]\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 defaultBaseCurrencyAmount,\n depositAddress: depositAddress ?? null,\n walletAddress: address ?? null,\n status,\n })\n return\n }\n\n setIsPreparing(true)\n emitFormDebug('form:open-click', {\n currencyCode,\n tokenSymbol: displaySymbol,\n tokenDecimals: decimals ?? null,\n baseCurrencyCode,\n defaultBaseCurrencyAmount,\n depositAddress: depositAddress ?? null,\n walletConnected: Boolean(address),\n })\n try {\n const intent = await prepareOnRampIntent({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount: defaultBaseCurrencyAmount,\n })\n emitFormDebug('form:intent-ready', {\n transactionId: intent.transaction_id,\n externalTransactionId: intent.external_transaction_id ?? null,\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 depositAddress,\n emitFormDebug,\n prepareOnRampIntent,\n status,\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 return (\n <div className=\"flex flex-col gap-4\">\n <Button type=\"button\" onClick={handleOpen}>\n {isPreparing ? 'Preparing MoonPay…' : isBusy ? statusLabel(status) : `Buy ${displaySymbol}`}\n </Button>\n\n {!canBuy && !isBusy && (\n <p className=\"text-muted-foreground text-xs\">Button blocked: {blockReasons.join(', ')}</p>\n )}\n\n {error && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error.message}\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 {pending.length > 0 && (\n <div className=\"flex flex-col gap-2 rounded-md border p-3\">\n <p className=\"text-sm font-medium\">Finish verification</p>\n <p className=\"text-muted-foreground text-xs\">\n MoonPay delivered your purchase, but Privana hasn&apos;t verified it yet. Resume\n verification now to credit your balance.\n </p>\n {pending.map((record) => (\n <Button\n key={record.transaction_id}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isBusy}\n onClick={() => finishPendingVerification(record)}\n >\n {record.quote_currency_amount ?? '?'} {displaySymbol}\n </Button>\n ))}\n </div>\n )}\n\n {visible && depositAddress && activeIntentId && (\n <MoonPayBuyWidget\n variant=\"overlay\"\n visible\n baseCurrencyCode={baseCurrencyCode}\n baseCurrencyAmount={defaultBaseCurrencyAmount}\n currencyCode={currencyCode}\n // MoonPay delivers directly to the Privana deposit address; the connected wallet is only used for SIWE auth and not involved in the on-chain transfer.\n walletAddress={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 </div>\n )\n}\n\nfunction statusLabel(status: ReturnType<typeof useFiatOnRamp>['status']): string {\n switch (status) {\n case 'awaiting-purchase':\n return 'Complete your purchase…'\n case 'awaiting-delivery':\n return 'Waiting for on-chain delivery…'\n case 'verifying':\n return 'Verifying with Privana…'\n case 'credited':\n return 'Credited'\n case 'failed':\n return 'Failed'\n default:\n return ''\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/sdk/hooks/use-fiat-on-ramp.ts","../src/components/privana/fiat-on-ramp-form.tsx"],"names":["parseAbiItem","usePrivanaContext","usePrivateReadRequest","useConfig","useState","useRef","useEffect","useCallback","useDepositVerification","zeroAddress","parseUnits","waitForTransactionReceipt","decodeEventLog","useAccount","useMemo","formatUnits","error","jsxs","jsx","Skeleton","Button","Loader2","MoonPayBuyWidget"],"mappings":"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","file":"on-ramp.cjs","sourcesContent":["'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { decodeEventLog, parseAbiItem, parseUnits, zeroAddress } from 'viem'\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { useConfig } from 'wagmi'\nimport type { MoonPayBuyWidget } from '@moonpay/moonpay-react'\n\n// MoonPay doesn't export these types directly\ntype MoonPayBuyProps = Parameters<typeof MoonPayBuyWidget>[0]\ntype OnTransactionCompletedProps = Parameters<\n NonNullable<MoonPayBuyProps['onTransactionCompleted']>\n>[0]\ntype OnTransactionCreatedProps = Parameters<NonNullable<MoonPayBuyProps['onTransactionCreated']>>[0]\n\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useDepositVerification } from './use-deposit-verification'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { Bytes32, HexString, OnRampRecord, TokenConfig } 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\nconst ERC20_TRANSFER_EVENT = parseAbiItem(\n 'event Transfer(address indexed from, address indexed to, uint256 value)'\n)\n\nexport type FiatOnRampStatus =\n | 'idle'\n /** Sign-URL succeeded; MoonPay widget shown and user is completing the purchase. */\n | 'awaiting-purchase'\n /** MoonPay reported completion; waiting for the backend webhook to surface the on-chain tx hash. */\n | 'awaiting-delivery'\n /** checkDeposit fired; polling getDepositStatus until credited. */\n | 'verifying'\n | 'credited'\n | 'failed'\n\nexport interface FiatOnRampDebugEvent {\n at: string\n event: string\n status: FiatOnRampStatus\n tokenId: Bytes32\n payload?: Record<string, unknown>\n}\n\nexport interface UseFiatOnRampOptions {\n /** Privana token the on-ramp will deposit into. */\n tokenId: Bytes32\n /** Fired when the deposit is credited inside the Privana accounting module. */\n onCredited?: (txHash: string) => void\n onError?: (error: Error) => void\n /** Optional diagnostic event stream for previews/tests. No auth tokens or signatures are emitted. */\n onDebugEvent?: (event: FiatOnRampDebugEvent) => void\n /**\n * Max time in ms to wait for the backend to surface the on-chain tx hash\n * after MoonPay reports `transaction_completed` or the 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 /** Polling interval in ms while waiting for the on-chain tx hash (default: 3000). */\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 UseFiatOnRampResult {\n status: FiatOnRampStatus\n /** Privana intent id passed to MoonPay as externalTransactionId. */\n activeIntentId: string | null\n /** Completed on-ramps that still need Privana verification. */\n pending: OnRampRecord[]\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 MoonPay will echo through externalTransactionId. */\n prepareOnRampIntent: (request: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: string\n }) => Promise<OnRampRecord>\n /** Wire to `<MoonPayBuyWidget onUrlSignatureRequested>`. */\n signUrl: (url: string) => Promise<string>\n /**\n * Wire to `<MoonPayBuyWidget onTransactionCreated>`. Fire-and-forget - records the Privana\n * `token_id` + `chain_id` against the MoonPay transaction so the backend can credit the\n * right balance when the delivery webhook arrives.\n */\n handleTransactionCreated: (props: OnTransactionCreatedProps) => Promise<void>\n /** Wire to `<MoonPayBuyWidget onTransactionCompleted>`. */\n handleTransactionCompleted: (props: OnTransactionCompletedProps) => Promise<void>\n /** Trigger Privana verification for a row returned by `pending`. */\n finishPendingVerification: (record: OnRampRecord) => Promise<void>\n /** Reconcile local state after the MoonPay widget closes. */\n handleWidgetClosed: () => Promise<void>\n refreshPending: () => Promise<void>\n}\n\n/**\n * Buy crypto via MoonPay and credit it to a Privana balance in one flow.\n *\n * Architecture: MoonPay delivers USDC directly to the user's Privana deposit\n * address (NOT the connected wallet) — the wallet is only used for SIWE auth\n * and signs no on-chain transfer. After MoonPay reports the purchase complete,\n * the on-chain tx hash arrives via the MoonPay→backend webhook (not the widget\n * event), so this hook polls `/onramp/pending` until the row's\n * `on_chain_tx_hash` is populated and then triggers Privana verification\n * (`checkDeposit` + `getDepositStatus` poll, delegated to\n * `useDepositVerification`).\n *\n * Wire the returned callbacks to `<MoonPayBuyWidget>`:\n *\n * onUrlSignatureRequested = signUrl\n * onTransactionCreated = handleTransactionCreated\n * onTransactionCompleted = handleTransactionCompleted\n * onClose / onCloseOverlay = handleWidgetClosed\n *\n * Use `<FiatOnRampForm>` if you don't need custom UI around the widget.\n */\nexport function useFiatOnRamp(options: UseFiatOnRampOptions): UseFiatOnRampResult {\n const { tokenId, onCredited, onError, onDebugEvent } = options\n const deliveryTimeout = options.deliveryTimeout ?? DEFAULT_DELIVERY_TIMEOUT_MS\n const deliveryPollInterval = options.deliveryPollInterval ?? 3_000\n const verificationTimeout = options.verificationTimeout ?? DEFAULT_VERIFICATION_TIMEOUT_MS\n const finalityRetryInterval = options.finalityRetryInterval ?? DEFAULT_FINALITY_RETRY_INTERVAL_MS\n\n const { client, enabledTokens } = usePrivanaContext()\n const { executePrivateRead, privateReadReady } = usePrivateReadRequest()\n const wagmiConfig = useConfig()\n\n const selectedToken = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n\n const [status, setStatus] = useState<FiatOnRampStatus>('idle')\n const [pending, setPending] = useState<OnRampRecord[]>([])\n const [error, setError] = useState<Error | null>(null)\n const [depositAddress, setDepositAddress] = useState<`0x${string}` | undefined>()\n const [minDepositBaseUnits, setMinDepositBaseUnits] = useState<bigint | undefined>()\n const [activeIntentId, setActiveIntentId] = useState<string | null>(null)\n const [finalityProgress, setFinalityProgress] = useState<Record<string, string>>({})\n\n const onCreditedRef = useRef(onCredited)\n const onErrorRef = useRef(onError)\n const onDebugEventRef = useRef(onDebugEvent)\n const statusRef = useRef(status)\n const activeIntentIdRef = useRef<string | null>(null)\n const activeVerificationRecordRef = useRef<OnRampRecord | null>(null)\n const activeVerificationKeyRef = useRef<string | null>(null)\n const triggeredVerificationKeysRef = useRef<Set<string>>(new Set())\n const closeReconcilePromiseRef = useRef<Promise<void> | null>(null)\n const purchaseInitiatedRef = useRef(false)\n useEffect(() => {\n onCreditedRef.current = onCredited\n onErrorRef.current = onError\n onDebugEventRef.current = onDebugEvent\n }, [onCredited, onError, onDebugEvent])\n\n useEffect(() => {\n statusRef.current = status\n }, [status])\n\n useEffect(() => {\n activeIntentIdRef.current = activeIntentId\n }, [activeIntentId])\n\n useEffect(() => {\n activeIntentIdRef.current = null\n setActiveIntentId(null)\n }, [tokenId])\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 // Fetch the Privana deposit address once. MoonPay needs this to deliver directly to Privana, bypassing the user's wallet.\n useEffect(() => {\n if (!privateReadReady) {\n emitDebug('deposit-address:skip', { reason: 'private-read-not-ready' })\n setDepositAddress(undefined)\n setMinDepositBaseUnits(undefined)\n return\n }\n\n let cancelled = false\n void (async () => {\n try {\n emitDebug('deposit-address:request')\n const resp = await executePrivateRead(() => client.getDepositAddress())\n if (cancelled) return\n setDepositAddress(resp.deposit_address)\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n const mins = token ? resp.min_deposit?.[String(token.chainId)] : undefined\n if (mins?.erc20) setMinDepositBaseUnits(BigInt(mins.erc20))\n emitDebug('deposit-address:success', {\n depositAddress: resp.deposit_address,\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 }, [client, emitDebug, enabledTokens, executePrivateRead, privateReadReady, tokenId])\n\n const refreshPending = useCallback(async () => {\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 { pending: rows } = await executePrivateRead(() => client.getPendingOnRamps())\n setPending(rows)\n emitDebug('pending:success', {\n count: rows.length,\n rows: rows.map(summariseOnRampRecord),\n })\n } catch (err) {\n emitDebug('pending:error', errorPayload(err))\n console.warn('Failed to load pending on-ramps:', err)\n }\n }, [client, emitDebug, executePrivateRead, privateReadReady])\n\n useEffect(() => {\n refreshPending()\n }, [refreshPending])\n\n const clearActiveVerification = useCallback(() => {\n const key = activeVerificationKeyRef.current\n if (key) triggeredVerificationKeysRef.current.delete(key)\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n }, [])\n\n const { verify } = 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) => {\n const record = activeVerificationRecordRef.current\n emitDebug('verification:credited', {\n depositTxHash,\n record: record ? summariseOnRampRecord(record) : null,\n })\n if (record && activeIntentIdRef.current === record.transaction_id) {\n setStatus('credited')\n }\n if (record) {\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 void (async () => {\n try {\n if (record && depositTxHash.startsWith('0x')) {\n emitDebug('onramp:mark-deposit-triggered-request', {\n transactionId: record.transaction_id,\n depositTxHash,\n })\n const updated = await executePrivateRead(() =>\n client.updateOnRamp(record.transaction_id, {\n deposit_tx_hash: depositTxHash as HexString,\n })\n )\n emitDebug('onramp:mark-deposit-triggered-success', {\n record: summariseOnRampRecord(updated),\n })\n }\n } catch (err) {\n emitDebug('onramp:mark-deposit-triggered-error', errorPayload(err))\n console.warn('Failed to mark on-ramp row complete:', err)\n } finally {\n clearActiveVerification()\n if (record && activeIntentIdRef.current === record.transaction_id) {\n activeIntentIdRef.current = null\n setActiveIntentId(null)\n }\n void refreshPending()\n }\n })()\n onCreditedRef.current?.(depositTxHash)\n },\n onCheckTimeout: (depositTxHash) => {\n const record = activeVerificationRecordRef.current\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 (!record || activeIntentIdRef.current === record.transaction_id) {\n setStatus('failed')\n setError(err)\n }\n void refreshPending()\n onErrorRef.current?.(err)\n },\n onError: (err) => {\n const record = activeVerificationRecordRef.current\n emitDebug('verification:error', errorPayload(err))\n clearActiveVerification()\n if (!record || activeIntentIdRef.current === record.transaction_id) {\n setStatus('failed')\n setError(err)\n }\n onErrorRef.current?.(err)\n },\n })\n\n const prepareOnRampIntent = useCallback(\n async ({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount,\n }: {\n currencyCode: string\n baseCurrencyCode?: string\n baseCurrencyAmount?: 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 (!depositAddress) throw new Error('Privana deposit address is not ready')\n\n emitDebug('intent:create-request', {\n tokenId,\n chainId: token.chainId,\n currencyCode,\n baseCurrencyCode: baseCurrencyCode ?? null,\n baseCurrencyAmount: baseCurrencyAmount ?? null,\n depositAddress,\n })\n const record = await executePrivateRead(() =>\n client.createOnRampIntent({\n wallet_address: depositAddress,\n token_id: tokenId,\n chain_id: token.chainId,\n moonpay_currency_code: currencyCode,\n base_currency_code: baseCurrencyCode,\n base_currency_amount: baseCurrencyAmount,\n })\n )\n activeIntentIdRef.current = record.transaction_id\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 setStatus('failed')\n setError(e)\n emitDebug('intent:create-error', errorPayload(e))\n onErrorRef.current?.(e)\n throw e\n }\n },\n [client, depositAddress, emitDebug, enabledTokens, executePrivateRead, tokenId]\n )\n\n // Fire-and-forget: register Privana token_id + chain_id against the MoonPay\n // transaction the moment it's created. The webhook handler create-or-updates\n // so timing isn't gating — if this fails, the row still lands later via the\n // webhook and the user can still finish from the pending list.\n const registerOnRampTokenMapping = useCallback(\n async (moonpayTransactionId: string) => {\n const token = enabledTokens.find((t) => t.id.toLowerCase() === tokenId.toLowerCase())\n if (!token) {\n emitDebug('register-token-mapping:skip', {\n moonpayTransactionId,\n reason: 'selected-token-not-found',\n })\n return\n }\n const transactionId = activeIntentIdRef.current ?? moonpayTransactionId\n try {\n emitDebug('register-token-mapping:request', {\n transactionId,\n moonpayTransactionId,\n tokenId,\n chainId: token.chainId,\n })\n const record = await executePrivateRead(() =>\n client.updateOnRamp(transactionId, {\n token_id: tokenId,\n chain_id: token.chainId,\n moonpay_transaction_id:\n transactionId === moonpayTransactionId ? undefined : moonpayTransactionId,\n })\n )\n emitDebug('register-token-mapping:success', {\n transactionId,\n moonpayTransactionId,\n record: summariseOnRampRecord(record),\n })\n } catch (err) {\n emitDebug('register-token-mapping:error', {\n transactionId,\n moonpayTransactionId,\n ...errorPayload(err),\n })\n console.warn('Failed to register on-ramp token mapping:', err)\n }\n },\n [client, emitDebug, enabledTokens, executePrivateRead, tokenId]\n )\n\n const handleTransactionCreated = useCallback(\n async (props: OnTransactionCreatedProps) => {\n emitDebug('moonpay:onTransactionCreated', summariseMoonPayEventProps(props))\n purchaseInitiatedRef.current = true\n await registerOnRampTokenMapping(props.id)\n },\n [emitDebug, registerOnRampTokenMapping]\n )\n\n const signUrl = useCallback(\n async (url: string): Promise<string> => {\n setError(null)\n try {\n emitDebug('moonpay:onUrlSignatureRequested', summariseMoonPayUrl(url))\n const { signature } = await executePrivateRead(() => client.signOnRampUrl({ url }))\n setStatus('awaiting-purchase')\n emitDebug('sign-url:success', {\n signatureLength: signature.length,\n })\n return signature\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Failed to sign on-ramp URL')\n setStatus('failed')\n setError(e)\n emitDebug('sign-url:error', errorPayload(e))\n onErrorRef.current?.(e)\n throw err\n }\n },\n [client, emitDebug, executePrivateRead]\n )\n\n // After MoonPay reports completion the on-chain tx hash isn't in the widget\n // event — it arrives via the MoonPay→backend webhook. Poll `/pending` until\n // the row for this Privana intent or MoonPay id has `on_chain_tx_hash`\n // populated, then proceed.\n const waitForOnChainHash = useCallback(\n async (transactionId: string): Promise<OnRampRecord | null> => {\n const startTime = Date.now()\n emitDebug('delivery-poll:start', {\n transactionId,\n deliveryTimeout,\n deliveryPollInterval,\n })\n while (Date.now() - startTime < deliveryTimeout) {\n try {\n const { pending: rows } = await executePrivateRead(() => client.getPendingOnRamps())\n setPending(rows)\n const record = rows.find((r) => matchesOnRampTransaction(r, transactionId))\n emitDebug('delivery-poll:tick', {\n transactionId,\n count: rows.length,\n matchingRecord: record ? summariseOnRampRecord(record) : null,\n })\n if (record?.on_chain_tx_hash && record.quote_currency_amount) {\n emitDebug('delivery-poll:success', {\n transactionId,\n record: summariseOnRampRecord(record),\n })\n return record\n }\n } catch (err) {\n emitDebug('delivery-poll:error', {\n transactionId,\n ...errorPayload(err),\n })\n console.warn('Polling pending on-ramps failed:', err)\n }\n await new Promise((r) => setTimeout(r, deliveryPollInterval))\n }\n emitDebug('delivery-poll:timeout', { transactionId })\n return null\n },\n [client, deliveryPollInterval, deliveryTimeout, emitDebug, executePrivateRead]\n )\n\n const triggerVerification = useCallback(\n async (record: OnRampRecord) => {\n const verificationKey = getOnRampVerificationKey(record)\n if (triggeredVerificationKeysRef.current.has(verificationKey)) {\n emitDebug('verification:skip-duplicate', {\n verificationKey,\n record: summariseOnRampRecord(record),\n })\n return\n }\n triggeredVerificationKeysRef.current.add(verificationKey)\n activeVerificationKeyRef.current = verificationKey\n activeVerificationRecordRef.current = record\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 verificationKey,\n record: summariseOnRampRecord(record),\n })\n try {\n if (!record.on_chain_tx_hash || !record.quote_currency_amount) {\n throw new Error('On-ramp record missing on-chain tx hash or delivered amount')\n }\n if (record.chain_id === undefined || !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 amount = await resolveDeliveredAmount({\n onChainTxHash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n walletAddress: record.wallet_address,\n token,\n fallbackAmount: record.quote_currency_amount,\n wagmiConfig,\n emitDebug,\n })\n\n // Post-completion safety net: if MoonPay's fees ate more than expected,\n // the delivered amount might fall below Privana's minimum. Surface a\n // clean error rather than letting checkDeposit reject server-side.\n // (MoonPay's own minimum is usually higher than ours, so this is rare.)\n if (minDepositBaseUnits !== undefined && amount < minDepositBaseUnits) {\n emitDebug('verification:below-minimum', {\n quoteCurrencyAmount: record.quote_currency_amount,\n minDepositBaseUnits: String(minDepositBaseUnits),\n })\n throw new Error(\n `Delivered amount (${record.quote_currency_amount}) is below the minimum deposit.`\n )\n }\n\n if (activeIntentIdRef.current === record.transaction_id) {\n setStatus('verifying')\n }\n emitDebug('verification:check-deposit-request', {\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount: amount.toString(),\n })\n await verify({\n hash: record.on_chain_tx_hash,\n chainId: record.chain_id,\n amount,\n })\n } catch (err) {\n triggeredVerificationKeysRef.current.delete(verificationKey)\n if (activeVerificationKeyRef.current === verificationKey) {\n activeVerificationKeyRef.current = null\n activeVerificationRecordRef.current = null\n }\n throw err\n }\n },\n [emitDebug, enabledTokens, minDepositBaseUnits, verify, wagmiConfig]\n )\n\n const handleTransactionCompleted = useCallback(\n async (props: OnTransactionCompletedProps) => {\n emitDebug('moonpay:onTransactionCompleted', summariseMoonPayEventProps(props))\n try {\n setStatus('awaiting-delivery')\n await registerOnRampTokenMapping(props.id)\n const transactionId = activeIntentIdRef.current ?? props.id\n const record = await waitForOnChainHash(transactionId)\n if (!record) {\n // Backend hasn't received MoonPay's webhook within the timeout. The\n // purchase is real and recovery is available via `pending` - surface\n // a non-terminal error so the form can prompt the user to retry from\n // the pending list once the webhook lands.\n const err = new Error(\n 'Backend has not yet confirmed delivery. You can finish from the pending list.'\n )\n emitDebug('moonpay:completed-without-backend-row', {\n transactionId,\n moonpayTransactionId: props.id,\n message: err.message,\n })\n setStatus('failed')\n setError(err)\n onErrorRef.current?.(err)\n return\n }\n await triggerVerification(record)\n } catch (err) {\n const e = err instanceof Error ? err : new Error('Verification failed')\n emitDebug('moonpay:onTransactionCompleted-error', errorPayload(e))\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n }\n },\n [emitDebug, registerOnRampTokenMapping, triggerVerification, waitForOnChainHash]\n )\n\n const handleWidgetClosed = useCallback(async () => {\n if (closeReconcilePromiseRef.current) return closeReconcilePromiseRef.current\n\n closeReconcilePromiseRef.current = (async () => {\n const previousStatus = statusRef.current\n const transactionId = activeIntentIdRef.current\n emitDebug('moonpay:widget-closed-reconcile', {\n previousStatus,\n transactionId,\n })\n\n if (!transactionId) {\n await refreshPending()\n return\n }\n\n if (!purchaseInitiatedRef.current) {\n emitDebug('moonpay:widget-closed-without-purchase', {\n previousStatus,\n transactionId,\n })\n await refreshPending()\n if (previousStatus === 'awaiting-purchase' || previousStatus === 'awaiting-delivery') {\n setStatus('idle')\n }\n return\n }\n\n try {\n setStatus('awaiting-delivery')\n const record = await waitForOnChainHash(transactionId)\n if (record) {\n await triggerVerification(record)\n return\n }\n await refreshPending()\n if (previousStatus === 'awaiting-purchase' || previousStatus === 'awaiting-delivery') {\n setStatus('idle')\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error('On-ramp reconciliation failed')\n emitDebug('moonpay:widget-closed-reconcile-error', errorPayload(e))\n setStatus('failed')\n setError(e)\n onErrorRef.current?.(e)\n }\n })()\n\n try {\n await closeReconcilePromiseRef.current\n } finally {\n closeReconcilePromiseRef.current = null\n }\n }, [emitDebug, refreshPending, triggerVerification, waitForOnChainHash])\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)\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 for (const record of pending) {\n if (cancelled) break\n if (!record.on_chain_tx_hash || !record.quote_currency_amount) continue\n const key = getOnRampVerificationKey(record)\n if (triggeredVerificationKeysRef.current.has(key)) continue\n try {\n await triggerVerificationRef.current(record)\n } catch {\n // Error is surfaced via finalityProgress / global error; loop on.\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [pending])\n\n return {\n status,\n activeIntentId,\n pending,\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 }\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 transaction_id: record.transaction_id,\n external_transaction_id: record.external_transaction_id ?? null,\n moonpay_transaction_id: record.moonpay_transaction_id ?? null,\n status: record.status,\n wallet_address: record.wallet_address,\n token_id: record.token_id,\n chain_id: record.chain_id,\n moonpay_currency_code: record.moonpay_currency_code ?? null,\n quote_currency_amount: record.quote_currency_amount ?? null,\n on_chain_tx_hash: record.on_chain_tx_hash ?? null,\n deposit_tx_hash: record.deposit_tx_hash ?? null,\n deposit_triggered_at: record.deposit_triggered_at ?? null,\n credited_at: record.credited_at ?? null,\n }\n}\n\nasync function resolveDeliveredAmount({\n onChainTxHash,\n chainId,\n walletAddress,\n token,\n fallbackAmount,\n wagmiConfig,\n emitDebug,\n}: {\n onChainTxHash: HexString\n chainId: number\n walletAddress: HexString\n token: TokenConfig\n fallbackAmount: string\n wagmiConfig: ReturnType<typeof useConfig>\n emitDebug: (event: string, payload?: Record<string, unknown>) => void\n}): Promise<bigint> {\n if (token.contract === zeroAddress) {\n return parseUnits(fallbackAmount, token.decimals)\n }\n\n let receiptError: unknown\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 let delivered = 0n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== token.contract.toLowerCase()) continue\n\n try {\n const decoded = decodeEventLog({\n abi: [ERC20_TRANSFER_EVENT],\n data: log.data,\n topics: log.topics,\n })\n if (decoded.eventName !== 'Transfer') continue\n\n const to = decoded.args.to.toLowerCase()\n if (to !== walletAddress.toLowerCase()) continue\n\n delivered += decoded.args.value\n } catch {\n // Not an ERC-20 Transfer log for this token.\n }\n }\n\n if (delivered > 0n) {\n emitDebug('verification:amount-from-receipt', {\n amount: delivered.toString(),\n tokenAddress: token.contract,\n walletAddress,\n moonpayQuoteCurrencyAmount: fallbackAmount,\n })\n return delivered\n }\n\n emitDebug('verification:amount-from-receipt-missing', {\n tokenAddress: token.contract,\n walletAddress,\n moonpayQuoteCurrencyAmount: fallbackAmount,\n })\n } catch (err) {\n emitDebug('verification:amount-from-receipt-error', errorPayload(err))\n receiptError = err\n }\n\n const errorDetail =\n receiptError instanceof Error\n ? receiptError.message\n : receiptError === undefined\n ? `no ${token.symbol} Transfer to ${walletAddress} found`\n : String(receiptError)\n throw new Error(\n `Unable to derive delivered ${token.symbol} amount from ${onChainTxHash}: ${errorDetail}`\n )\n}\n\nfunction matchesOnRampTransaction(record: OnRampRecord, transactionId: string): boolean {\n return (\n record.transaction_id === transactionId ||\n record.external_transaction_id === transactionId ||\n record.moonpay_transaction_id === transactionId\n )\n}\n\nfunction getOnRampVerificationKey(record: OnRampRecord): string {\n return record.on_chain_tx_hash ?? record.transaction_id\n}\n\nfunction summariseMoonPayEventProps(props: Record<string, unknown>): Record<string, unknown> {\n return {\n id: props.id,\n externalTransactionId: props.externalTransactionId,\n status: props.status,\n walletAddress: props.walletAddress,\n walletAddressTag: props.walletAddressTag,\n baseCurrencyAmount: props.baseCurrencyAmount,\n quoteCurrencyAmount: props.quoteCurrencyAmount,\n baseCurrency: props.baseCurrency,\n quoteCurrency: props.quoteCurrency,\n createdAt: props.createdAt,\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 apiKeyPrefix: params.get('apiKey')?.slice(0, 8) ?? null,\n currencyCode: params.get('currencyCode'),\n baseCurrencyCode: params.get('baseCurrencyCode'),\n baseCurrencyAmount: params.get('baseCurrencyAmount'),\n walletAddress: params.get('walletAddress'),\n externalCustomerId: params.get('externalCustomerId'),\n externalTransactionId: params.get('externalTransactionId'),\n redirectURL: params.get('redirectURL'),\n signaturePresent: params.has('signature'),\n }\n } catch {\n return { parseError: true, length: url.length }\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, useMemo, useState } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { formatUnits } from 'viem'\nimport { useAccount } from 'wagmi'\nimport { MoonPayBuyWidget } from '@moonpay/moonpay-react'\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 { Bytes32 } from '@/sdk/types'\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 /** 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 * 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 /** Fired when the resulting Privana deposit is credited. */\n onCredited?: (depositTxHash: string) => void\n onError?: (error: Error) => void\n /** Optional diagnostic event stream for previews/tests. */\n onDebugEvent?: (event: FiatOnRampDebugEvent) => void\n}\n\nexport function FiatOnRampForm({\n tokenId,\n currencyCode,\n baseCurrencyCode = 'usd',\n defaultBaseCurrencyAmount = '100',\n tokenSymbol,\n theme,\n themeId,\n colorCode,\n variant = 'overlay',\n lockAmount,\n paymentMethod,\n onCredited,\n onError,\n onDebugEvent,\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\n const {\n status,\n activeIntentId,\n pending,\n error,\n finalityProgress,\n depositAddress,\n minDepositBaseUnits,\n selectedToken,\n prepareOnRampIntent,\n signUrl,\n handleTransactionCreated,\n handleTransactionCompleted,\n finishPendingVerification,\n handleWidgetClosed,\n } = useFiatOnRamp({ tokenId, onCredited, onError, onDebugEvent })\n\n const decimals = selectedToken?.decimals\n const displaySymbol = tokenSymbol ?? selectedToken?.symbol ?? currencyCode.toUpperCase()\n // MoonPay's overlayNode wants a Node, not React.\n const overlayNode = useMemo(\n () => (variant === 'overlay' ? buildOverlayNode() : undefined),\n [variant]\n )\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 const isBelowMin = minFiatGate !== undefined && Number(defaultBaseCurrencyAmount) < minFiatGate\n const isBusy = isPreparing || status === 'awaiting-purchase'\n const isInitializing = !!address && !depositAddress\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 isBelowMin ? 'below-minimum' : null,\n ].filter((reason): reason is string => Boolean(reason)),\n [address, depositAddress, isBelowMin, isBusy, isPreparing, status, visible]\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 defaultBaseCurrencyAmount,\n depositAddress: depositAddress ?? null,\n walletAddress: address ?? null,\n status,\n })\n return\n }\n\n setIsPreparing(true)\n emitFormDebug('form:open-click', {\n currencyCode,\n tokenSymbol: displaySymbol,\n tokenDecimals: decimals ?? null,\n baseCurrencyCode,\n defaultBaseCurrencyAmount,\n depositAddress: depositAddress ?? null,\n walletConnected: Boolean(address),\n })\n try {\n const intent = await prepareOnRampIntent({\n currencyCode,\n baseCurrencyCode,\n baseCurrencyAmount: defaultBaseCurrencyAmount,\n })\n emitFormDebug('form:intent-ready', {\n transactionId: intent.transaction_id,\n externalTransactionId: intent.external_transaction_id ?? null,\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 depositAddress,\n emitFormDebug,\n prepareOnRampIntent,\n status,\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 return (\n <div data-privana className=\"flex flex-col gap-4\">\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 {error && (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error.message}\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 {pending.length > 0 && (\n <div className=\"flex flex-col gap-2 rounded-md border p-3\">\n <p className=\"text-sm font-medium\">Pending payments</p>\n {pending.map((record) => {\n const progress = parseFinalityProgress(finalityProgress[record.transaction_id])\n const hasProgress = !!finalityProgress[record.transaction_id]\n const isStalled = !hasProgress && Date.now() / 1000 - (record.updated_at ?? 0) > 60\n const showRetry = rowError?.id === record.transaction_id || isStalled\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 {progress ?? 'Verifying…'}\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\n </Button>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {visible && depositAddress && activeIntentId && (\n <MoonPayBuyWidget\n variant={variant}\n visible\n theme={theme}\n themeId={themeId}\n colorCode={colorCode}\n overlayNode={overlayNode}\n baseCurrencyCode={baseCurrencyCode}\n baseCurrencyAmount={defaultBaseCurrencyAmount}\n lockAmount={lockAmount ? 'true' : undefined}\n paymentMethod={paymentMethod}\n currencyCode={currencyCode}\n // MoonPay delivers directly to the Privana deposit address; the connected wallet is only used for SIWE auth and not involved in the on-chain transfer.\n walletAddress={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 </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\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"]}
@@ -52,6 +52,12 @@ interface UseFiatOnRampResult {
52
52
  /** Completed on-ramps that still need Privana verification. */
53
53
  pending: OnRampRecord[];
54
54
  error: Error | null;
55
+ /**
56
+ * Per-row finality progress messages (e.g. "Insufficient finality: 4/32 confirmations
57
+ * on chain 11155111"), keyed by `transaction_id`. Updated each time `checkDeposit`
58
+ * sees the row isn't deep enough yet — non-terminal; cleared on credit.
59
+ */
60
+ finalityProgress: Record<string, string>;
55
61
  /** Per-user Privana deposit address. */
56
62
  depositAddress: `0x${string}` | undefined;
57
63
  /**
@@ -126,12 +132,33 @@ interface FiatOnRampFormProps {
126
132
  defaultBaseCurrencyAmount?: string;
127
133
  /** Override the display symbol. Defaults to the resolved token's symbol, then `currencyCode`. */
128
134
  tokenSymbol?: string;
135
+ /** Enable dark mode or light mode as the default appearance for the widget. Possible values are dark, light. */
136
+ theme?: 'light' | 'dark';
137
+ /** Theme created via MoonPay dashboard theme builder */
138
+ themeId?: string;
139
+ /** Widget main color. It is used for buttons, links and highlighted text. Only hexadecimal codes are accepted. */
140
+ colorCode?: string;
141
+ /**
142
+ * - 'overlay' (default): full-screen modal over the page with the Privana splash screen.
143
+ * - 'embedded': iframe injected inline where this component renders.
144
+ * other variants are intentionally not supported - they require `window.open` to fire synchronously inside the
145
+ * click handler, but this form awaits `prepareOnRampIntent` before mounting the widget, so the popup would be blocked by the browser.
146
+ */
147
+ variant?: 'overlay' | 'embedded';
148
+ /**
149
+ * When true, the user cannot edit the fiat amount inside MoonPay.
150
+ * Requires `defaultBaseCurrencyAmount` to take effect — MoonPay silently
151
+ * skips this when no amount is set.
152
+ */
153
+ lockAmount?: boolean;
154
+ /** Pre-selects a payment method tab in MoonPay */
155
+ paymentMethod?: string;
129
156
  /** Fired when the resulting Privana deposit is credited. */
130
157
  onCredited?: (depositTxHash: string) => void;
131
158
  onError?: (error: Error) => void;
132
159
  /** Optional diagnostic event stream for previews/tests. */
133
160
  onDebugEvent?: (event: FiatOnRampDebugEvent) => void;
134
161
  }
135
- declare function FiatOnRampForm({ tokenId, currencyCode, baseCurrencyCode, defaultBaseCurrencyAmount, tokenSymbol, onCredited, onError, onDebugEvent, }: FiatOnRampFormProps): react_jsx_runtime.JSX.Element;
162
+ declare function FiatOnRampForm({ tokenId, currencyCode, baseCurrencyCode, defaultBaseCurrencyAmount, tokenSymbol, theme, themeId, colorCode, variant, lockAmount, paymentMethod, onCredited, onError, onDebugEvent, }: FiatOnRampFormProps): react_jsx_runtime.JSX.Element;
136
163
 
137
164
  export { type FiatOnRampDebugEvent, FiatOnRampForm, type FiatOnRampFormProps, type FiatOnRampStatus, OnRampRecord, type UseFiatOnRampOptions, type UseFiatOnRampResult, useFiatOnRamp };
package/dist/on-ramp.d.ts CHANGED
@@ -52,6 +52,12 @@ interface UseFiatOnRampResult {
52
52
  /** Completed on-ramps that still need Privana verification. */
53
53
  pending: OnRampRecord[];
54
54
  error: Error | null;
55
+ /**
56
+ * Per-row finality progress messages (e.g. "Insufficient finality: 4/32 confirmations
57
+ * on chain 11155111"), keyed by `transaction_id`. Updated each time `checkDeposit`
58
+ * sees the row isn't deep enough yet — non-terminal; cleared on credit.
59
+ */
60
+ finalityProgress: Record<string, string>;
55
61
  /** Per-user Privana deposit address. */
56
62
  depositAddress: `0x${string}` | undefined;
57
63
  /**
@@ -126,12 +132,33 @@ interface FiatOnRampFormProps {
126
132
  defaultBaseCurrencyAmount?: string;
127
133
  /** Override the display symbol. Defaults to the resolved token's symbol, then `currencyCode`. */
128
134
  tokenSymbol?: string;
135
+ /** Enable dark mode or light mode as the default appearance for the widget. Possible values are dark, light. */
136
+ theme?: 'light' | 'dark';
137
+ /** Theme created via MoonPay dashboard theme builder */
138
+ themeId?: string;
139
+ /** Widget main color. It is used for buttons, links and highlighted text. Only hexadecimal codes are accepted. */
140
+ colorCode?: string;
141
+ /**
142
+ * - 'overlay' (default): full-screen modal over the page with the Privana splash screen.
143
+ * - 'embedded': iframe injected inline where this component renders.
144
+ * other variants are intentionally not supported - they require `window.open` to fire synchronously inside the
145
+ * click handler, but this form awaits `prepareOnRampIntent` before mounting the widget, so the popup would be blocked by the browser.
146
+ */
147
+ variant?: 'overlay' | 'embedded';
148
+ /**
149
+ * When true, the user cannot edit the fiat amount inside MoonPay.
150
+ * Requires `defaultBaseCurrencyAmount` to take effect — MoonPay silently
151
+ * skips this when no amount is set.
152
+ */
153
+ lockAmount?: boolean;
154
+ /** Pre-selects a payment method tab in MoonPay */
155
+ paymentMethod?: string;
129
156
  /** Fired when the resulting Privana deposit is credited. */
130
157
  onCredited?: (depositTxHash: string) => void;
131
158
  onError?: (error: Error) => void;
132
159
  /** Optional diagnostic event stream for previews/tests. */
133
160
  onDebugEvent?: (event: FiatOnRampDebugEvent) => void;
134
161
  }
135
- declare function FiatOnRampForm({ tokenId, currencyCode, baseCurrencyCode, defaultBaseCurrencyAmount, tokenSymbol, onCredited, onError, onDebugEvent, }: FiatOnRampFormProps): react_jsx_runtime.JSX.Element;
162
+ declare function FiatOnRampForm({ tokenId, currencyCode, baseCurrencyCode, defaultBaseCurrencyAmount, tokenSymbol, theme, themeId, colorCode, variant, lockAmount, paymentMethod, onCredited, onError, onDebugEvent, }: FiatOnRampFormProps): react_jsx_runtime.JSX.Element;
136
163
 
137
164
  export { type FiatOnRampDebugEvent, FiatOnRampForm, type FiatOnRampFormProps, type FiatOnRampStatus, OnRampRecord, type UseFiatOnRampOptions, type UseFiatOnRampResult, useFiatOnRamp };