@provex/react 1.6.1-rc.20260513021016.1d8cdf8 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ProvexProvider-BQ5vZkHO.d.cts → ProvexProvider-BaBM1MFq.d.cts} +0 -7
- package/dist/{ProvexProvider-BQ5vZkHO.d.ts → ProvexProvider-BaBM1MFq.d.ts} +0 -7
- package/dist/{chunk-VWWANYB2.js → chunk-G2MNNKUF.js} +2 -3
- package/dist/chunk-G2MNNKUF.js.map +1 -0
- package/dist/index.cjs +0 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/wagmi.cjs +0 -1
- package/dist/wagmi.cjs.map +1 -1
- package/dist/wagmi.d.cts +1 -1
- package/dist/wagmi.d.ts +1 -1
- package/dist/wagmi.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-VWWANYB2.js.map +0 -1
|
@@ -155,12 +155,6 @@ interface IndexedIntent {
|
|
|
155
155
|
status: 'pending' | 'signalled' | 'fulfilled' | 'pruned';
|
|
156
156
|
/** When the intent was pruned (unix seconds), null if not pruned */
|
|
157
157
|
prunedAt: bigint | null;
|
|
158
|
-
/**
|
|
159
|
-
* On-chain `fulfillIntent` transaction hash, populated when status is
|
|
160
|
-
* `fulfilled`. Null otherwise. Used by the success surface to link the
|
|
161
|
-
* receipt on the block explorer (intentHash itself is NOT a tx hash).
|
|
162
|
-
*/
|
|
163
|
-
fulfillTxHash: Hex | null;
|
|
164
158
|
}
|
|
165
159
|
/** Pre-computed reputation data for tier calculation. */
|
|
166
160
|
interface ReputationData {
|
|
@@ -799,7 +793,6 @@ declare function usePayeeDetails({ intentHash, chainId, }: {
|
|
|
799
793
|
isPruned: boolean;
|
|
800
794
|
prunedAt: bigint | null;
|
|
801
795
|
isFulfilled: boolean;
|
|
802
|
-
fulfillTxHash: `0x${string}` | null;
|
|
803
796
|
refetch: () => void;
|
|
804
797
|
refetchAll: () => Promise<IntentStatus | null>;
|
|
805
798
|
};
|
|
@@ -155,12 +155,6 @@ interface IndexedIntent {
|
|
|
155
155
|
status: 'pending' | 'signalled' | 'fulfilled' | 'pruned';
|
|
156
156
|
/** When the intent was pruned (unix seconds), null if not pruned */
|
|
157
157
|
prunedAt: bigint | null;
|
|
158
|
-
/**
|
|
159
|
-
* On-chain `fulfillIntent` transaction hash, populated when status is
|
|
160
|
-
* `fulfilled`. Null otherwise. Used by the success surface to link the
|
|
161
|
-
* receipt on the block explorer (intentHash itself is NOT a tx hash).
|
|
162
|
-
*/
|
|
163
|
-
fulfillTxHash: Hex | null;
|
|
164
158
|
}
|
|
165
159
|
/** Pre-computed reputation data for tier calculation. */
|
|
166
160
|
interface ReputationData {
|
|
@@ -799,7 +793,6 @@ declare function usePayeeDetails({ intentHash, chainId, }: {
|
|
|
799
793
|
isPruned: boolean;
|
|
800
794
|
prunedAt: bigint | null;
|
|
801
795
|
isFulfilled: boolean;
|
|
802
|
-
fulfillTxHash: `0x${string}` | null;
|
|
803
796
|
refetch: () => void;
|
|
804
797
|
refetchAll: () => Promise<IntentStatus | null>;
|
|
805
798
|
};
|
|
@@ -1376,7 +1376,6 @@ function usePayeeDetails({
|
|
|
1376
1376
|
isPruned: indexedIntent?.status === "pruned",
|
|
1377
1377
|
prunedAt: indexedIntent?.prunedAt ?? null,
|
|
1378
1378
|
isFulfilled: indexedIntent?.status === "fulfilled",
|
|
1379
|
-
fulfillTxHash: indexedIntent?.fulfillTxHash ?? null,
|
|
1380
1379
|
refetch,
|
|
1381
1380
|
refetchAll
|
|
1382
1381
|
}), [
|
|
@@ -2177,5 +2176,5 @@ function ProvexBuyRoot({
|
|
|
2177
2176
|
}
|
|
2178
2177
|
|
|
2179
2178
|
export { BrowsePhase, CommittedPhase, CompletePhase, ProveXClient, ProveXError, ProvexBuy, ProvexBuyProvider, ProvexProvider, ProvingPhase, checkMutation, checkTransactionIndexed, createApiClient, createProveXClient, getRate, getTierDisplayInfo, getTransactionGasInputs, getUserFriendlyErrorMessage, intentStatuses, isUserRejectionError, useContractRead, useDeposits, useOptionalProvex, useOptionalProvexPublicClient, useOptionalProvexWallet, useOrchestratorAddress, usePayeeDetails, useProtocolFeePercentage, useProtocolFees, useProvex, useProvexBuy, useProvexBuyContext, useProvexPublicClient, useProvexWallet, useReputation, useReputationLimits, useSignalIntent };
|
|
2180
|
-
//# sourceMappingURL=chunk-
|
|
2181
|
-
//# sourceMappingURL=chunk-
|
|
2179
|
+
//# sourceMappingURL=chunk-G2MNNKUF.js.map
|
|
2180
|
+
//# sourceMappingURL=chunk-G2MNNKUF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/api.ts","../src/ProvexProvider.tsx","../src/hooks/useDeposits.ts","../src/client/types.ts","../src/lib/block.ts","../src/lib/updates.ts","../src/lib/errors.ts","../src/client/ProveXClient.ts","../src/hooks/useSignalIntent.ts","../src/hooks/useReputation.ts","../src/hooks/useReputationLimits.ts","../src/hooks/usePayeeDetails.ts","../src/lib/contractRead.ts","../src/hooks/useOrchestratorAddress.ts","../src/hooks/useProtocolFees.ts","../src/useProvexBuy.ts","../src/ProvexBuyContext.tsx","../src/phases/BrowsePhase.tsx","../src/phases/CommittedPhase.tsx","../src/phases/ProvingPhase.tsx","../src/phases/CompletePhase.tsx","../src/ProvexBuy.tsx"],"names":["publicClient","base","useMemo","providerConfigs","providerKeyToContractId","createPublicClient","http","ERROR_PATTERNS","getUserFriendlyErrorMessage","useCallback","useQueryClient","useQuery","V3EscrowAbi","OrchestratorAbi","normalizeFeePrecision","parseUnits","useState","SUPPORTED_CURRENCIES","verifiablePaymentMethods","getLatestContract","convertCurrencyToTokenOutput","DEFAULT_REPUTATION","createContext","useContext","jsx","Fragment","getPaymentMethodName","jsxs"],"mappings":"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","file":"chunk-G2MNNKUF.js","sourcesContent":["/**\n * @fileoverview Thin API client for @provex/react.\n *\n * Provides typed get/post methods for the Provex backend API.\n * No external dependencies — uses the Fetch API directly.\n */\n\n/** API client for making typed requests to the Provex backend. */\nexport interface ApiClient {\n /** Send a GET request and parse the JSON response. */\n get: <T>(path: string, options?: RequestInit) => Promise<T>\n /** Send a POST request with a JSON body and parse the response. */\n post: <T>(path: string, body: unknown, options?: RequestInit) => Promise<T>\n}\n\n/** Create an API client that targets the given base URL. */\nexport function createApiClient(apiUrl: string): ApiClient {\n async function request<T>(path: string, options: RequestInit): Promise<T> {\n const url = `${apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText} (${url})`)\n }\n\n return response.json() as Promise<T>\n }\n\n return {\n get: <T>(path: string, options?: RequestInit) =>\n request<T>(path, { ...options, method: 'GET' }),\n\n post: <T>(path: string, body: unknown, options?: RequestInit) =>\n request<T>(path, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n }),\n }\n}\n","/**\n * @fileoverview ProvexProvider — React context for the Provex protocol.\n *\n * Provides config, indexer adapter, API client, and (optionally) a viem\n * public client + wallet adapter that Provex hooks use to talk to chains.\n *\n * Consumers wire this up one of three ways:\n *\n * 1. **Bare viem** — pass a `publicClient` (and optional `wallet`). Works\n * with any wallet library (walletkit, Privy, ethers).\n * 2. **Wagmi** — use `WagmiProvexProvider` from `@provex/react/wagmi`; it\n * reads wagmi's client + wallet and pipes them into ProvexProvider.\n * 3. **Defaults** — omit `publicClient` entirely. ProvexProvider falls\n * back to `createPublicClient({ chain, transport: http() })` using the\n * chain's default RPC. Good for reads; writes still need a `wallet`.\n */\n\nimport React, { createContext, useContext, useMemo } from 'react'\nimport {\n QueryClient,\n QueryClientProvider,\n} from '@tanstack/react-query'\nimport { createPublicClient, http, type PublicClient } from 'viem'\nimport type { ProvexConfig } from './types'\nimport type { IndexerAdapter } from './lib/indexerAdapter'\nimport { createApiClient, type ApiClient } from './lib/api'\nimport type { WalletAdapter } from './client/types'\n\n/** Shape of the context value provided by ProvexProvider. */\nexport interface ProvexContextValue {\n /** User-supplied configuration (apiUrl, chain). */\n config: ProvexConfig\n /** Data source adapter for indexer queries. */\n indexer: IndexerAdapter\n /** Thin fetch wrapper for the Provex backend API. */\n apiClient: ApiClient\n /** Public clients keyed by chain ID. Always contains at least `config.chain.id`. */\n publicClients: Record<number, PublicClient>\n /** Optional wallet adapter for write operations. */\n wallet?: WalletAdapter\n}\n\nconst ProvexContext = createContext<ProvexContextValue | null>(null)\n\n/** Props for the ProvexProvider component. */\nexport interface ProvexProviderProps {\n /** Protocol configuration. */\n config: ProvexConfig\n /**\n * Data source adapter. Implement IndexerAdapter against any backend:\n * - `createPonderAdapter()` from `@provex/indexer-client` (default for Provex apps)\n * - Custom REST, Graph, or RPC implementation\n */\n indexer: IndexerAdapter\n /** Optional external QueryClient — if omitted, a default one is created. */\n queryClient?: QueryClient\n /**\n * Viem public client for the primary chain (`config.chain.id`).\n * Shorthand for `publicClients={{ [config.chain.id]: client }}`.\n */\n publicClient?: PublicClient\n /**\n * Viem public clients keyed by chain ID. Use when your app reads from\n * multiple chains (e.g., cross-chain deposits).\n */\n publicClients?: Record<number, PublicClient>\n /**\n * Wallet adapter for write operations (signalIntent, createDeposit, etc).\n * Omit for read-only apps.\n */\n wallet?: WalletAdapter\n /** Child components that consume the context. */\n children: React.ReactNode\n}\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n refetchOnWindowFocus: false,\n },\n },\n})\n\n/**\n * ProvexProvider — wrap your app (or a subtree) with this to enable\n * Provex hooks and components.\n *\n * @example\n * ```tsx\n * import { createPonderAdapter } from '@provex/indexer-client'\n * import { createPublicClient, http } from 'viem'\n * import { base } from 'viem/chains'\n *\n * const publicClient = createPublicClient({ chain: base, transport: http() })\n *\n * <ProvexProvider\n * config={{ apiUrl: 'https://app.provex.com', chain: base }}\n * indexer={createPonderAdapter()}\n * publicClient={publicClient}\n * wallet={myWalletAdapter}\n * >\n * <App />\n * </ProvexProvider>\n * ```\n */\nexport function ProvexProvider({\n config,\n indexer,\n queryClient,\n publicClient,\n publicClients,\n wallet,\n children,\n}: ProvexProviderProps) {\n const resolvedQueryClient = queryClient ?? defaultQueryClient\n\n const contextValue = useMemo<ProvexContextValue>(() => {\n const apiClient = createApiClient(config.apiUrl)\n const chainId = config.chain.id\n\n // Resolve public clients: explicit map > single shorthand > http fallback\n const base = publicClients ?? {}\n const resolved: Record<number, PublicClient> = { ...base }\n if (publicClient && !resolved[chainId]) {\n resolved[chainId] = publicClient\n }\n if (!resolved[chainId]) {\n resolved[chainId] = createPublicClient({ chain: config.chain, transport: http() })\n }\n\n return { config, indexer, apiClient, publicClients: resolved, wallet }\n }, [config, indexer, publicClient, publicClients, wallet])\n\n return (\n <ProvexContext.Provider value={contextValue}>\n <QueryClientProvider client={resolvedQueryClient}>\n {children}\n </QueryClientProvider>\n </ProvexContext.Provider>\n )\n}\n\n/**\n * useProvex — access the Provex context (config, indexer, apiClient,\n * publicClients, wallet).\n *\n * Must be called within a ProvexProvider. Throws if used outside the provider.\n */\nexport function useProvex(): ProvexContextValue {\n const context = useContext(ProvexContext)\n if (!context) {\n throw new Error('useProvex must be used within a <ProvexProvider>')\n }\n return context\n}\n\n/**\n * useOptionalProvex — access the Provex context if available, or null.\n *\n * Safe to call outside a ProvexProvider.\n */\nexport function useOptionalProvex(): ProvexContextValue | null {\n return useContext(ProvexContext)\n}\n\n/**\n * Get the public client for a specific chain, or the primary chain if omitted.\n * Returns `undefined` if no client is registered for that chain.\n */\nexport function useProvexPublicClient(chainId?: number): PublicClient | undefined {\n const { config, publicClients } = useProvex()\n const target = chainId ?? config.chain.id\n return publicClients[target]\n}\n\n/**\n * Get the optional public client without requiring ProvexProvider.\n * Returns `undefined` outside the provider or when no client is registered.\n */\nexport function useOptionalProvexPublicClient(chainId?: number): PublicClient | undefined {\n const ctx = useOptionalProvex()\n if (!ctx) return undefined\n const target = chainId ?? ctx.config.chain.id\n return ctx.publicClients[target]\n}\n\n/**\n * Get the configured wallet adapter, if any. Returns `undefined` for\n * read-only apps that did not pass a wallet to ProvexProvider.\n */\nexport function useProvexWallet(): WalletAdapter | undefined {\n return useProvex().wallet\n}\n\n/**\n * Get the optional wallet adapter without requiring ProvexProvider.\n */\nexport function useOptionalProvexWallet(): WalletAdapter | undefined {\n return useOptionalProvex()?.wallet\n}\n","/**\n * @fileoverview Hook for fetching deposits that match a buyer's criteria.\n *\n * Queries the IndexerAdapter for active V3 deposits that:\n * - Support the specified payment method\n * - Support the specified fiat currency\n * - Have sufficient liquidity for the requested amount\n * - Are accepting intents\n *\n * @see {@link @provex/utils/payment} for provider configuration\n */\n\nimport { useMemo, useCallback } from 'react'\nimport { type Hex } from 'viem'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { TokenInfo } from '@provex/utils/tokens'\nimport type { ChainId } from '@provex/utils/chain'\nimport { Currency, SUPPORTED_CURRENCIES } from '@provex/utils/currencies'\nimport { parseUnits } from '@provex/utils/units'\nimport {\n providerConfigs,\n providerKeyToContractId,\n type ProviderKey,\n type SubProviderKey,\n} from '@provex/utils/payment'\nimport { convertCurrencyToTokenOutput } from '@provex/utils/conversionRates'\nimport { useProvex } from '../ProvexProvider'\nimport type { IndexedDeposit } from '../lib/indexerAdapter'\n\n/** Default polling interval for deposit updates (5 seconds). */\nconst DEFAULT_REFETCH_INTERVAL_MS = 5_000\n\n/**\n * Lightweight deposit info returned by the hook.\n * Maps from IndexedDeposit — same shape the UI already consumes.\n */\nexport interface DepositInfo {\n escrow: Hex\n localId: bigint\n chainId: number\n participantAddress: Hex\n token: Hex\n remaining: bigint\n deposited: bigint\n minAmount: bigint\n maxAmount: bigint\n status: string\n acceptingIntents: boolean\n availableFunds: bigint\n conversionRates: Map<string, Map<string, bigint>>\n verifierPaymentMethodIds: Set<string>\n}\n\n/** Options for the useDeposits hook. */\ninterface UseDepositsOptions {\n token: TokenInfo\n paymentMethod: ProviderKey\n currency?: Currency\n refetchIntervalMs?: number\n}\n\n/**\n * Get the best (lowest) conversion rate for a deposit across the main provider\n * and all sub-providers.\n *\n * Returns 0n when the deposit has no rate for the given payment method / currency.\n */\nexport function getRate({\n deposit,\n paymentMethod,\n currency,\n}: {\n deposit: DepositInfo | null | undefined\n paymentMethod: ProviderKey | SubProviderKey\n currency: Currency\n}): bigint {\n if (!deposit) return 0n\n\n const paymentConfig = providerConfigs(deposit.chainId as ChainId)[paymentMethod as ProviderKey]\n const candidateKeys = [\n paymentMethod,\n ...Array.from(paymentConfig?.subProviders ?? []).map(sp => sp.key),\n ]\n\n let minRate: bigint | null = null\n for (const key of candidateKeys) {\n const contractId = providerKeyToContractId(key as ProviderKey).toLowerCase()\n const value = deposit.conversionRates.get(contractId)?.get(currency.contractId.toLowerCase())\n if (value) {\n if (minRate === null || value < minRate) {\n minRate = value\n }\n }\n }\n\n return minRate ?? 0n\n}\n\n/** Map IndexedDeposit to DepositInfo */\nfunction toDepositInfo(deposit: IndexedDeposit): DepositInfo {\n return {\n escrow: deposit.escrow,\n localId: deposit.localId,\n chainId: deposit.chainId,\n participantAddress: deposit.participantAddress,\n token: deposit.token,\n remaining: deposit.remaining,\n deposited: deposit.deposited,\n minAmount: deposit.minAmount,\n maxAmount: deposit.maxAmount,\n status: deposit.status,\n acceptingIntents: deposit.acceptingIntents,\n availableFunds: deposit.availableFunds,\n conversionRates: deposit.conversionRates,\n verifierPaymentMethodIds: deposit.paymentMethodIds,\n }\n}\n\n/**\n * Hook to fetch matchable deposits from the indexer.\n *\n * @example\n * ```ts\n * const { deposits, isLoading, getMatchableDeposits } = useDeposits({\n * token: usdcToken,\n * paymentMethod: 'venmo',\n * })\n *\n * const matches = getMatchableDeposits(parseUnits('100', { decimals: 2 }))\n * ```\n */\nexport function useDeposits(options: UseDepositsOptions) {\n const {\n token,\n currency = SUPPORTED_CURRENCIES.USD,\n paymentMethod,\n refetchIntervalMs = DEFAULT_REFETCH_INTERVAL_MS,\n } = options\n\n const { indexer } = useProvex()\n const queryClient = useQueryClient()\n\n // Build payment method IDs for client-side filtering\n const paymentMethodIds = useMemo(() => {\n const paymentConfig = providerConfigs(token.chainId)[paymentMethod]\n return new Set([\n providerKeyToContractId(paymentMethod).toLowerCase(),\n ...paymentConfig.v2Verifiers.map(v => v.toLowerCase()),\n ...Array.from(paymentConfig.subProviders).flatMap(subProvider => [\n providerKeyToContractId(subProvider.key).toLowerCase(),\n ...subProvider.v2Verifiers(token.chainId).map(v => v.toLowerCase()),\n ]),\n ])\n }, [token.chainId, paymentMethod])\n\n const depositsQuery = useQuery({\n queryKey: ['provex', 'deposits', token.address, token.chainId, currency.contractId, paymentMethod],\n queryFn: async () => {\n const result = await indexer.getMatchableDeposits({\n chainId: token.chainId,\n token: token.address as Hex,\n currencyId: currency.contractId as Hex,\n })\n\n // Client-side filter by payment method\n return result.items\n .filter(d => {\n for (const id of d.paymentMethodIds) {\n if (paymentMethodIds.has(id)) return true\n }\n return false\n })\n .map(toDepositInfo)\n },\n staleTime: refetchIntervalMs,\n refetchInterval: refetchIntervalMs,\n })\n\n const deposits = useMemo(() => depositsQuery.data ?? [], [depositsQuery.data])\n\n const canAcceptAmount = useCallback((deposit: DepositInfo, amount: bigint): boolean => {\n return amount <= deposit.availableFunds && amount >= deposit.minAmount && amount <= deposit.maxAmount\n }, [])\n\n const filterDepositsByAmount = useCallback((amountInInt: bigint): DepositInfo[] => {\n if (!amountInInt || !currency) return []\n\n const matchable: { deposit: DepositInfo; rate: bigint }[] = []\n\n for (const deposit of deposits) {\n const rate = getRate({ deposit, paymentMethod, currency })\n if (rate === 0n) continue\n\n const amountToken = convertCurrencyToTokenOutput({\n token,\n currency,\n currencyAmountInt: amountInInt,\n rate,\n })\n\n if (canAcceptAmount(deposit, amountToken)) {\n matchable.push({ deposit, rate })\n }\n }\n\n return matchable\n .sort((a, b) => {\n if (a.rate < b.rate) return -1\n if (a.rate > b.rate) return 1\n if (a.deposit.localId < b.deposit.localId) return -1\n if (a.deposit.localId > b.deposit.localId) return 1\n return 0\n })\n .map(m => m.deposit)\n }, [deposits, currency, paymentMethod, token, canAcceptAmount])\n\n const refetch = useCallback(() => {\n queryClient.invalidateQueries({\n queryKey: ['provex', 'deposits', token.address, token.chainId, currency.contractId, paymentMethod],\n })\n }, [queryClient, token.address, token.chainId, currency.contractId, paymentMethod])\n\n return {\n deposits,\n isLoading: depositsQuery.isLoading,\n isUpdating: depositsQuery.isFetching && !depositsQuery.isLoading,\n error: depositsQuery.error,\n refetch,\n filterDepositsByAmount,\n getMatchableDeposits: (amountInInt: bigint | null | string) => {\n if (typeof amountInInt === 'string') {\n amountInInt = parseUnits(amountInInt, { decimals: currency?.decimals || 2 })\n }\n if (!amountInInt) return []\n return filterDepositsByAmount(amountInInt)\n },\n }\n}\n","/**\n * @fileoverview Types for the ProveXClient — framework-agnostic protocol client.\n */\n\nimport type { Hex, TransactionReceipt, Chain } from 'viem'\nimport type { WriteHookParams } from '@valve-tech/wallet-adapter'\nimport type { IndexerAdapter } from '../lib/indexerAdapter'\n\nexport type { WriteHookParams }\n\n// ─── Config ────────────────────────────────────────────────────────────────\n\n/** Default service URLs per chain ID. */\nexport const PROVEX_DEFAULTS: Record<number, { apiUrl: string; indexerUrl: string }> = {\n 8453: { apiUrl: 'https://app.provex.com', indexerUrl: 'https://indexer.provex.com' },\n 369: { apiUrl: 'https://app.provex.com', indexerUrl: 'https://indexer.provex.com' },\n}\n\nexport interface ProveXClientConfig {\n /**\n * The viem Chain object to operate on. Provides chain ID, RPC URLs,\n * block explorers, and native currency config.\n *\n * Import from `viem/chains` or define your own for custom RPCs / testnets.\n *\n * @example\n * ```ts\n * import { base, pulsechain } from 'viem/chains'\n *\n * // Standard chain\n * createProveXClient({ chain: base })\n *\n * // Custom RPC\n * createProveXClient({\n * chain: { ...base, rpcUrls: { default: { http: ['https://my-rpc.com'] } } }\n * })\n *\n * // Testnet\n * createProveXClient({ chain: pulsechainV4, escrowAddress: '0x...' })\n * ```\n */\n chain: Chain\n /**\n * Backend API URL. Defaults to `https://app.provex.com`.\n * Override for self-hosted or staging deployments.\n */\n apiUrl?: string\n /**\n * Wallet adapter for signing transactions.\n * Omit for prepare-only mode (`.prepare()` works without a wallet).\n */\n wallet?: WalletAdapter\n /**\n * Data source adapter for indexer queries.\n * Omit if you only need on-chain reads and `.prepare()`.\n */\n indexer?: IndexerAdapter\n /** Override the default V3 escrow address for this chain. */\n escrowAddress?: Hex\n /** Called with the tx hash immediately after wallet submission. */\n onTransactionHash?: (hash: Hex) => void\n /** Called when indexer sync takes longer than expected. */\n onSlowSync?: () => void\n}\n\n// ─── Wallet Adapter ────────────────────────────────────────────────────────\n\n/** Framework-agnostic wallet interface. Works with wagmi, ethers, or custom. */\nexport interface WalletAdapter {\n /** Connected address, or undefined if disconnected. */\n address?: Hex\n /** Sign and send a transaction. Returns the tx hash. */\n sendTransaction(tx: {\n to: Hex\n data: Hex\n value?: bigint\n chainId: number\n maxFeePerGas?: bigint\n maxPriorityFeePerGas?: bigint\n }): Promise<Hex>\n /** Read from a contract (optional — falls back to public RPC). */\n readContract?(params: {\n address: Hex\n abi: readonly unknown[]\n functionName: string\n args?: readonly unknown[]\n chainId?: number\n }): Promise<unknown>\n}\n\n// ─── Transactions ──────────────────────────────────────────────────────────\n\n/**\n * Unsigned transaction data. Pass to any wallet, multisig, relayer, or batch builder.\n *\n * @example\n * ```ts\n * const prepared = await client.addFunds.prepare({ depositId: 1n, amount: 100n })\n * // Hand to Safe SDK, Privy, gasless relay, etc.\n * await safeSDK.createTransaction({ transactions: [prepared] })\n * ```\n */\nexport interface PreparedTransaction {\n to: Hex\n data: Hex\n value: bigint\n chainId: number\n}\n\n/** Result of a fully executed transaction. */\nexport interface TransactionResult {\n hash: Hex\n receipt: TransactionReceipt\n}\n\n// ─── Writable Method ───────────────────────────────────────────────────────\n\n/**\n * A protocol write operation. Callable to execute the full lifecycle,\n * or use `.prepare()` to get unsigned transaction data.\n *\n * @example\n * ```ts\n * // Full execute: gas → wallet → receipt → indexer sync\n * const { hash } = await client.addFunds({ depositId: 1n, amount: 100n })\n *\n * // Prepare only: returns { to, data, value, chainId }\n * const prepared = await client.addFunds.prepare({ depositId: 1n, amount: 100n })\n * ```\n */\nexport interface WritableMethod<TParams> {\n /**\n * Execute the full transaction lifecycle. Requires a wallet.\n *\n * Accepts optional per-call lifecycle hooks (`WriteHookParams` from\n * `@valve-tech/wallet-adapter`): `onAwaitingSignature` fires immediately\n * before the wallet popup opens; `onTransactionHash` fires the moment\n * `wallet.sendTransaction` resolves, before the SDK awaits the receipt.\n * Wire these into a tx-flight UI to transition the strip at real SDK\n * boundaries instead of stalling on `awaiting-signature` for the full\n * receipt-confirmation window.\n */\n (params: TParams & WriteHookParams): Promise<TransactionResult>\n /** Return unsigned transaction data only. No wallet needed. */\n prepare(params: TParams): Promise<PreparedTransaction>\n}\n\n// ─── Errors ────────────────────────────────────────────────────────────────\n\nexport type ProveXErrorCode =\n | 'WALLET_REJECTED'\n | 'WALLET_NOT_CONNECTED'\n | 'TX_REVERTED'\n | 'INSUFFICIENT_FUNDS'\n | 'INSUFFICIENT_LIQUIDITY'\n | 'INDEXER_TIMEOUT'\n | 'INDEXER_NOT_CONFIGURED'\n | 'CONTRACT_ERROR'\n | 'API_ERROR'\n | 'VALIDATION_ERROR'\n | 'UNKNOWN'\n\n/**\n * Typed error for ProveX protocol operations.\n * Non-React consumers catch these directly; React hooks map them to UI state.\n */\nexport class ProveXError extends Error {\n readonly code: ProveXErrorCode\n readonly cause?: Error\n\n constructor(code: ProveXErrorCode, message: string, cause?: Error) {\n super(message)\n this.name = 'ProveXError'\n this.code = code\n this.cause = cause\n }\n\n /** Check if this error was caused by the user rejecting in their wallet. */\n get isRejection(): boolean {\n return this.code === 'WALLET_REJECTED'\n }\n}\n\n// ─── Maker Registration ────────────────────────────────────────────────────\n\n/** Options for registering or validating a maker's payment identity. */\nexport interface MakerRegistrationParams {\n /** Payment provider key (e.g. 'venmo', 'zelle', 'revolut') */\n providerKey: string\n /** Provider-specific user ID (e.g. Venmo username, Zelle phone) */\n providerId: string\n /** Optional Telegram handle for contact */\n telegramHandle?: string\n}\n\n/** Payee details returned by the API. */\nexport interface PayeeDetails {\n payeeId?: string\n name?: string\n platformName?: string\n [key: string]: unknown\n}\n\n/** Attestation request for zkTLS proof submission. */\nexport interface AttestationParams {\n /** Payment platform (e.g. 'chase', 'venmo') */\n platform: string\n /** Action type (e.g. 'transfer_zelle', 'transfer_venmo') */\n actionType: string\n /** Reclaim proofs */\n proofs: unknown[]\n /** Chain ID for the attestation */\n chainId: number\n /** Verifying contract address */\n verifyingContract: Hex\n /** Intent data for the attestation */\n intent: unknown\n}\n\n/** Attestation response with signed payment proof. */\nexport interface AttestationResponse {\n success: boolean\n message?: string\n statusCode?: number\n responseObject: {\n paymentProof?: unknown\n [key: string]: unknown\n }\n}\n\n// ─── Signal Intent Params ──────────────────────────────────────────────────\n\n/**\n * Human-readable params for signaling an intent (buyer side).\n *\n * The SDK handles:\n * 1. Looking up payee details from the indexer\n * 2. Requesting a gating service signature from the API\n * 3. Building and simulating the on-chain transaction\n * 4. Extracting the intent hash from the IntentSignaled event\n *\n * @example\n * ```ts\n * const { hash, intentHash } = await client.signalIntent({\n * deposit: { escrow: '0x...', localId: 1n },\n * paymentMethod: '0x...', // bytes32 payment method hash\n * tokenAmount: 100_000000n,\n * toAddress: '0x...',\n * fiatCurrencyCode: '0x...', // bytes32 currency code hash\n * conversionRate: 1_000000000000000000n,\n * })\n * ```\n */\nexport interface SignalIntentParams {\n deposit: { escrow: Hex; localId: bigint }\n paymentMethod: Hex\n tokenAmount: bigint\n toAddress: Hex\n fiatCurrencyCode: Hex\n conversionRate: bigint\n subProvider?: string\n /**\n * Called once, immediately before the wallet popup is opened (i.e. just\n * before `wallet.sendTransaction`). Lets callers transition their tx-state\n * UI from \"preparing\" to \"awaiting wallet signature\" at the precise\n * boundary, without guessing where inside the multi-step SDK flow the\n * actual signature prompt is happening.\n *\n * Implementation note: `signalIntent` does several pre-wallet steps\n * (indexer fetch, gating-service signature, simulation). Without this\n * callback, callers can only flip to \"awaiting signature\" before the\n * whole call (sticks too long after the user signs) or after (never\n * shows). This hook fires at the right moment.\n */\n onAwaitingSignature?: () => void\n /**\n * Called once with the on-chain tx hash, immediately after the wallet\n * returns it from `sendTransaction` and before the SDK begins awaiting\n * the receipt. Lets callers transition their tx-state UI from\n * \"awaiting wallet signature\" to \"waiting for inclusion\" the moment\n * the hash exists, instead of staying in the awaiting state for the\n * full receipt-confirmation window (which is what happens if the\n * caller only attaches the hash after `signalIntent` resolves).\n */\n onTransactionHash?: (hash: Hex) => void\n}\n\n/** Result of a signalIntent call. Extends TransactionResult with the intent hash. */\nexport interface SignalIntentResult extends TransactionResult {\n /** The on-chain intent hash, extracted from the IntentSignaled event. */\n intentHash: Hex\n}\n\n/** Raw on-chain params matching the Orchestrator's signalIntent signature. */\nexport interface SignalIntentRawParams {\n escrow: Hex\n depositId: bigint\n amount: bigint\n to: Hex\n paymentMethod: Hex\n fiatCurrency: Hex\n conversionRate: bigint\n referrer: Hex\n referrerFee: bigint\n gatingServiceSignature: Hex\n signatureExpiration: bigint\n postIntentHook: Hex\n data: Hex\n}\n\n// ─── Escrow Params ─────────────────────────────────────────────────────────\n\n/** Raw contract-level params matching the V3 Escrow's createDeposit signature. */\nexport interface CreateDepositRawParams {\n token: Hex\n amount: bigint\n intentAmountRange: { min: bigint; max: bigint }\n paymentMethods: Hex[]\n paymentMethodData: Array<{\n intentGatingService: Hex\n payeeDetails: Hex\n data: Hex\n }>\n currencies: Array<Array<{ code: Hex; minConversionRate: bigint }>>\n delegate: Hex\n intentGuardian: Hex\n retainOnEmpty: boolean\n}\n\n/** A payment method to include in a new deposit. */\nexport interface DepositPaymentMethod {\n /** Provider key (e.g., 'venmo', 'zelle', 'revolut', 'wise'). */\n provider: string\n /** Plaintext payee identifier — SDK hashes and registers it automatically. */\n payeeId: string\n /**\n * Currencies this payment method accepts, with minimum conversion rates.\n *\n * @example\n * ```ts\n * currencies: [\n * { code: 'USD', minRate: 0n }, // accept any rate\n * { code: 'EUR', minRate: 980000000000000000n }, // min 0.98 EUR/USDC\n * ]\n * ```\n */\n currencies: Array<{ code: string; minRate: bigint }>\n /**\n * Custom intent gating service address. Defaults to the protocol's\n * standard Reclaim gating service for this chain.\n */\n intentGatingService?: Hex\n /**\n * Custom data field for the payment method (encoded ABI params).\n * Defaults to the standard Reclaim witness signer encoding.\n */\n data?: Hex\n}\n\n/**\n * Human-readable params for creating a deposit.\n * The SDK handles hashing, sub-provider expansion, maker registration, and\n * all the encoding needed to build the on-chain transaction.\n *\n * @example\n * ```ts\n * await client.createDeposit({\n * token: USDC_ADDRESS,\n * amount: 1000_000000n,\n * intentRange: { min: 10_000000n, max: 500_000000n },\n * paymentMethods: [\n * { provider: 'venmo', payeeId: '@myvenmo', currencies: [{ code: 'USD', minRate: 0n }] },\n * ],\n * })\n * ```\n */\nexport interface CreateDepositParams {\n /** ERC-20 token address (e.g., USDC). */\n token: Hex\n /** Deposit amount in the token's smallest unit (e.g., 6 decimals for USDC). */\n amount: bigint\n /**\n * Min/max intent amount range buyers can signal.\n * `min` defaults to 1_000000n (1 USDC). `max` defaults to `amount`.\n */\n intentRange?: { min?: bigint; max?: bigint }\n /** Payment methods the depositor accepts. */\n paymentMethods: DepositPaymentMethod[]\n /** Optional Telegram handle for buyer-seller contact. */\n telegramHandle?: string\n /** Delegate address that can manage this deposit. Defaults to zero (no delegate). */\n delegate?: Hex\n /** Guardian address for intent gating. Defaults to zero (no guardian). */\n intentGuardian?: Hex\n /** Keep deposit active even when fully claimed. Defaults to false. */\n retainOnEmpty?: boolean\n}\n","/**\n * @fileoverview Block and gas utilities for transaction preparation.\n *\n * Provides functions to calculate appropriate gas parameters based on\n * current network conditions.\n */\n\nimport { publicClient } from \"@provex/utils/tokens\"\nimport { chainIdToChain, type ChainId } from \"@provex/utils/chain\"\n\n/**\n * Gets the gas inputs for a transaction on the specified chain.\n * Calculates maxFeePerGas and maxPriorityFeePerGas based on the latest block's baseFeePerGas.\n * @param chainId - The chain ID to get gas inputs for\n * @returns Gas parameters for transactions\n * @throws Error if chainId is not supported\n */\nexport const getTransactionGasInputs = async (chainId: ChainId) => {\n const chain = chainIdToChain.get(chainId)\n if (!chain) {\n throw new Error(`Unsupported chainId: ${chainId}`)\n }\n\n const block = await publicClient(chain).getBlock({\n blockTag: 'latest'\n })\n\n if (!block.baseFeePerGas) {\n throw new Error(`No baseFeePerGas available for chainId: ${chainId}`)\n }\n\n return {\n maxFeePerGas: block.baseFeePerGas * 2n,\n maxPriorityFeePerGas: block.baseFeePerGas / 5n,\n }\n}\n","/**\n * @fileoverview Indexer sync utilities for waiting on blockchain state.\n *\n * Provides polling functions to wait for transactions and state changes\n * to be indexed before updating the UI.\n *\n * @remarks\n * These functions accept query callbacks instead of importing a specific\n * indexer implementation. This allows consumers to bring their own data\n * source (Ponder, The Graph, custom API, etc.).\n *\n * @see {@link useTransactionWithIndexer} for the React hook wrapper\n */\n\nimport type { Hex } from \"viem\"\nexport type { IndexerAdapter } from \"./indexerAdapter\"\nimport type { IndexerAdapter } from \"./indexerAdapter\"\n\n/** Default polling interval in milliseconds. */\nconst POLL_INTERVAL_MS = 1000\n\n/** Default threshold before firing slow sync warning (in milliseconds) */\nconst SLOW_SYNC_THRESHOLD_MS = 15000\n\n/**\n * Poll until a deposit reaches a specific status.\n *\n * @param queryDeposit - Function to query deposit state (from IndexerAdapter)\n * @param depositIdHex - Serialized deposit orderId hex\n * @param status - Target status to wait for\n * @param onSuccess - Called when status is reached\n * @param onSlowSync - Called once if sync exceeds threshold\n */\nexport const checkMutation = async ({\n queryDeposit,\n depositIdHex,\n status,\n onSuccess,\n onSlowSync,\n slowSyncThresholdMs = SLOW_SYNC_THRESHOLD_MS,\n}: {\n queryDeposit: IndexerAdapter['getDepositById']\n depositIdHex: Hex\n status: string\n onSuccess?: () => void\n onSlowSync?: () => void\n slowSyncThresholdMs?: number\n}) => {\n const startTime = Date.now()\n let slowSyncFired = false\n\n while (true) {\n const result = await queryDeposit(depositIdHex)\n if (result?.status === status) {\n break\n }\n\n if (!slowSyncFired && onSlowSync && Date.now() - startTime > slowSyncThresholdMs) {\n slowSyncFired = true\n onSlowSync()\n }\n\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n setTimeout(() => {\n onSuccess?.()\n }, POLL_INTERVAL_MS)\n}\n\n/**\n * Poll until a transaction is indexed.\n *\n * @param queryTransaction - Function to query transaction state (from IndexerAdapter)\n * @param hash - Transaction hash to wait for\n * @param onSuccess - Called when the transaction is found\n * @param onSlowSync - Called once if sync exceeds threshold\n */\nexport const checkTransactionIndexed = async ({\n queryTransaction,\n hash,\n onSuccess,\n onSlowSync,\n slowSyncThresholdMs = SLOW_SYNC_THRESHOLD_MS,\n}: {\n queryTransaction: IndexerAdapter['getTransactionByHash']\n hash: Hex\n onSuccess?: () => void\n onSlowSync?: () => void\n slowSyncThresholdMs?: number\n}) => {\n const startTime = Date.now()\n let slowSyncFired = false\n\n while (true) {\n const result = await queryTransaction(hash)\n if (result) {\n break\n }\n\n if (!slowSyncFired && onSlowSync && Date.now() - startTime > slowSyncThresholdMs) {\n slowSyncFired = true\n onSlowSync()\n }\n\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n onSuccess?.()\n}\n","/**\n * @fileoverview Centralized error message parsing for user-facing display.\n *\n * Converts raw viem/wagmi/wallet errors into short, human-readable messages.\n * All user-facing error text should flow through getUserFriendlyErrorMessage()\n * so that changes to error copy only need to happen in one place.\n */\n\n/**\n * Pattern-to-message mapping. Checked in order — first match wins.\n * Patterns are matched case-insensitively against the raw error string.\n */\nconst ERROR_PATTERNS: readonly { pattern: RegExp; message: string }[] = [\n // Wallet / signer rejections\n { pattern: /user rejected|user denied|rejected the request|user cancelled|user canceled/i, message: 'Transaction was cancelled.' },\n\n // On-chain reverts — specific errors first (first match wins)\n { pattern: /InsufficientDepositLiquidity|0xc3df48f3/i, message: 'This deposit no longer has enough available liquidity. Please try a smaller amount or a different deposit.' },\n { pattern: /execution reverted/i, message: 'Transaction failed on-chain. The order may no longer be available.' },\n\n // Gas / balance issues\n { pattern: /insufficient funds/i, message: 'Insufficient funds for gas fees.' },\n { pattern: /gas required exceeds/i, message: 'Transaction requires more gas than allowed.' },\n\n // Transaction replacement / nonce issues\n { pattern: /could not replace existing tx|replacement transaction underpriced|nonce too low/i, message: 'A previous transaction is still pending. Please wait for it to confirm or speed it up in your wallet.' },\n\n // Deposit state errors\n { pattern: /DepositNotAcceptingIntents|0x67688c1a/i, message: 'This deposit is currently paused. Please try a different deposit.' },\n\n // Network / RPC errors\n { pattern: /could not detect network|network changed/i, message: 'Network connection issue. Please check your wallet network.' },\n { pattern: /disconnected|not connected/i, message: 'Wallet disconnected. Please reconnect and try again.' },\n { pattern: /timeout|etimedout/i, message: 'Request timed out. Please try again.' },\n { pattern: /fetch failed|econnrefused|enotfound/i, message: 'Unable to reach the server. Please check your connection.' },\n\n // Rate limiting / service unavailable\n { pattern: /429|too many requests/i, message: 'Too many requests. Please wait a moment and try again.' },\n { pattern: /503|service unavailable/i, message: 'Service temporarily unavailable. Please try again shortly.' },\n\n // Nullifier / double-spend (keep the original — it's already user-friendly)\n { pattern: /nullifier has already been used/i, message: 'This payment has already been verified and cannot be used again.' },\n { pattern: /already been verified/i, message: 'This payment has already been verified and cannot be used again.' },\n]\n\n/**\n * Convert a raw error into a short, user-friendly message.\n *\n * @param error - The caught error (Error object, string, or unknown)\n * @returns A concise message safe to display in the UI\n */\nexport function getUserFriendlyErrorMessage(error: unknown): string {\n const raw = extractErrorString(error)\n\n for (const { pattern, message } of ERROR_PATTERNS) {\n if (pattern.test(raw)) {\n return message\n }\n }\n\n // Fallback — keep it generic so we never leak internals\n return 'Something went wrong. Please try again.'\n}\n\n/** Toast-friendly message shown when the user rejects a wallet prompt. */\nexport const USER_REJECTION_MESSAGE = 'Transaction was rejected in wallet.'\n\n/**\n * Check whether an error represents a user-initiated wallet rejection.\n * Useful when callers want to show a subtle toast rather than an error state.\n */\nexport function isUserRejectionError(error: unknown): boolean {\n const raw = extractErrorString(error)\n return /user rejected|user denied|rejected the request|user cancelled|user canceled/i.test(raw)\n}\n\n/**\n * Centralized error handler for wallet interactions (wagmi onError callbacks\n * and catch blocks). Encapsulates the rejection-detection + friendly-message\n * pattern so every call site is a single line.\n */\nexport function handleWalletError(\n error: unknown,\n options: {\n setStatus?: (status: 'idle' | 'error') => void\n setErrorMessage?: (msg: string | null) => void\n toast?: { error: (msg: string) => void; info: (msg: string) => void }\n onError?: (error: Error) => void\n } = {},\n): void {\n const { setStatus, setErrorMessage, toast, onError } = options\n\n if (isUserRejectionError(error)) {\n setStatus?.('idle')\n setErrorMessage?.(null)\n toast?.info(USER_REJECTION_MESSAGE)\n } else {\n const message = getUserFriendlyErrorMessage(error)\n setStatus?.('error')\n setErrorMessage?.(message)\n toast?.error(message)\n }\n\n onError?.(error instanceof Error ? error : new Error(String(error)))\n}\n\n/**\n * Normalise any thrown value into a string for pattern matching.\n */\nfunction extractErrorString(error: unknown): string {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n","/**\n * @fileoverview ProveXClient — framework-agnostic protocol client.\n *\n * Works in any JavaScript runtime: Node.js, React, Vue, Svelte, serverless.\n * Every write method supports `.prepare()` for smart accounts and relayers.\n *\n * @example\n * ```ts\n * import { createProveXClient } from '@provex/react'\n * import { createPonderAdapter } from '@provex/indexer-client'\n *\n * // Full client (reads + writes)\n * const client = createProveXClient({\n * chainId: 8453,\n * apiUrl: 'https://app.provex.com',\n * wallet: myWalletAdapter,\n * indexer: createPonderAdapter(),\n * })\n *\n * // Prepare-only mode (no wallet, no indexer)\n * const client = createProveXClient({ chainId: 8453, apiUrl: 'https://app.provex.com' })\n * const prepared = await client.addFunds.prepare({ depositId: 1n, amount: 100_000000n })\n * ```\n */\n\nimport { encodeFunctionData, encodeAbiParameters, parseAbiParameters, decodeEventLog, createPublicClient, http, zeroAddress, type Hex, type Chain, type PublicClient } from 'viem'\nimport type { ChainId } from '@provex/utils/chain'\nimport { getLatestContract, reclaimSigners } from '@provex/utils/contracts'\nimport { normalizeFeePrecision, type FeeInfo } from '@provex/utils/fees'\nimport { providerConfigs, providerKeyToContractId, computePayeeDetailsHash, type ProviderKey } from '@provex/utils/payment'\nimport { tickerToContractId } from '@provex/utils/currencies'\nimport { V3EscrowAbi, OrchestratorAbi, PaymentVerifierRegistryAbi, UnifiedPaymentVerifierAbi, NullifierRegistryAbi } from '@provex/abis'\nimport { getTransactionGasInputs } from '../lib/block'\nimport { checkTransactionIndexed } from '../lib/updates'\nimport { isUserRejectionError } from '../lib/errors'\nimport type { IndexerAdapter, PaginationOptions, PaginatedResult, IndexedDeposit, IndexedIntent, ReputationData } from '../lib/indexerAdapter'\nimport {\n type ProveXClientConfig,\n type WalletAdapter,\n type PreparedTransaction,\n type TransactionResult,\n type WritableMethod,\n type WriteHookParams,\n type CreateDepositParams,\n type CreateDepositRawParams,\n type SignalIntentParams,\n type SignalIntentResult,\n type MakerRegistrationParams,\n type PayeeDetails,\n type AttestationParams,\n type AttestationResponse,\n PROVEX_DEFAULTS,\n ProveXError,\n} from './types'\n\n/**\n * ProveXClient — the framework-agnostic core of the ProveX SDK.\n *\n * Encapsulates all protocol interactions: indexer reads, on-chain reads,\n * and contract writes. React hooks are thin wrappers around this class.\n */\nexport class ProveXClient {\n /** The viem Chain object — carries RPC URLs, chain ID, and metadata. */\n readonly chain: Chain\n /** Numeric chain ID (derived from chain.id). */\n readonly chainId: ChainId\n private readonly wallet?: WalletAdapter\n private readonly indexer?: IndexerAdapter\n private readonly escrowOverride?: Hex\n private readonly onTransactionHash?: (hash: Hex) => void\n readonly apiUrl: string\n private readonly onSlowSync?: () => void\n\n /** Lazily-created public client for RPC calls. */\n private _publicClient: PublicClient | null = null\n\n /** Cached orchestrator address (lazy-loaded). */\n private cachedOrchestratorAddress: Hex | null = null\n\n constructor(config: ProveXClientConfig) {\n this.chain = config.chain\n this.chainId = config.chain.id as ChainId\n\n const defaults = PROVEX_DEFAULTS[this.chainId]\n this.wallet = config.wallet\n this.indexer = config.indexer\n this.escrowOverride = config.escrowAddress\n this.onTransactionHash = config.onTransactionHash\n this.onSlowSync = config.onSlowSync\n this.apiUrl = config.apiUrl ?? defaults?.apiUrl ?? 'https://app.provex.com'\n\n // Bind all writable methods\n this.createDepositRaw = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'createDeposit',\n argsMapper: (params: CreateDepositRawParams) => [params],\n })\n\n this.addFunds = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'addFunds',\n argsMapper: (params: { depositId: bigint; amount: bigint }) => [params.depositId, params.amount],\n })\n\n this.removeFunds = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'removeFunds',\n argsMapper: (params: { depositId: bigint; amount: bigint }) => [params.depositId, params.amount],\n })\n\n this.withdrawDeposit = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'withdrawDeposit',\n argsMapper: (params: { depositId: bigint }) => [params.depositId],\n })\n\n this.pruneExpiredIntents = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'pruneExpiredIntents',\n argsMapper: (params: { depositId: bigint }) => [params.depositId],\n })\n\n this.setAcceptingIntents = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'setAcceptingIntents',\n argsMapper: (params: { depositId: bigint; accepting: boolean }) => [params.depositId, params.accepting],\n })\n\n this.setRetainOnEmpty = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'setRetainOnEmpty',\n argsMapper: (params: { depositId: bigint; retain: boolean }) => [params.depositId, params.retain],\n })\n\n this.setIntentRange = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'setIntentRange',\n argsMapper: (params: { depositId: bigint; min: bigint; max: bigint }) => [params.depositId, { min: params.min, max: params.max }],\n })\n\n this.setPaymentMethodActive = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'setPaymentMethodActive',\n argsMapper: (params: { depositId: bigint; paymentMethod: Hex; active: boolean }) => [params.depositId, params.paymentMethod, params.active],\n })\n\n this.setCurrencyMinRate = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'setCurrencyMinRate',\n argsMapper: (params: { depositId: bigint; paymentMethod: Hex; currency: Hex; rate: bigint }) => [params.depositId, params.paymentMethod, params.currency, params.rate],\n })\n\n this.addCurrencies = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'addCurrencies',\n argsMapper: (params: { depositId: bigint; paymentMethod: Hex; currencies: Array<{ code: Hex; minConversionRate: bigint }> }) => [params.depositId, params.paymentMethod, params.currencies],\n })\n\n this.deactivateCurrency = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'deactivateCurrency',\n argsMapper: (params: { depositId: bigint; paymentMethod: Hex; currencyCode: Hex }) => [params.depositId, params.paymentMethod, params.currencyCode],\n })\n\n this.addPaymentMethods = this.buildWritableMethod({\n abi: V3EscrowAbi,\n contractResolver: () => this.getEscrowAddress(),\n functionName: 'addPaymentMethods',\n argsMapper: (params: { depositId: bigint; paymentMethods: Hex[]; paymentMethodData: Array<{ intentGatingService: Hex; payeeDetails: Hex; data: Hex }>; currencies: Array<Array<{ code: Hex; minConversionRate: bigint }>> }) => [params.depositId, params.paymentMethods, params.paymentMethodData, params.currencies],\n })\n\n this.cancelIntent = this.buildWritableMethod({\n abi: OrchestratorAbi,\n contractResolver: () => this.getOrchestratorAddress(),\n functionName: 'cancelIntent',\n argsMapper: (params: { intentHash: Hex }) => [params.intentHash],\n })\n\n this.releaseFundsToPayer = this.buildWritableMethod({\n abi: OrchestratorAbi,\n contractResolver: () => this.getOrchestratorAddress(),\n functionName: 'releaseFundsToPayer',\n argsMapper: (params: { intentHash: Hex }) => [params.intentHash],\n })\n\n this.approve = this.buildWritableMethod({\n abi: [{ name: 'approve', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'spender', type: 'address' }, { name: 'amount', type: 'uint256' }], outputs: [{ name: '', type: 'bool' }] }] as const,\n contractResolver: (_params: { token: Hex; spender: Hex; amount?: bigint }) => _params.token,\n functionName: 'approve',\n argsMapper: (params: { token: Hex; spender: Hex; amount?: bigint }) => [params.spender, params.amount ?? BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')],\n })\n }\n\n // ─── Address Resolution ──────────────────────────────────────────────────\n\n /** Get the V3 escrow address for this client's chain. */\n getEscrowAddress(): Hex {\n if (this.escrowOverride) return this.escrowOverride\n const addr = getLatestContract(this.chainId, 'escrow', 'v3')\n if (!addr) throw new ProveXError('VALIDATION_ERROR', `No V3 escrow found for chain ${this.chainId}`)\n return addr\n }\n\n /** Get the orchestrator address (cached after first read). */\n async getOrchestratorAddress(): Promise<Hex> {\n if (this.cachedOrchestratorAddress) return this.cachedOrchestratorAddress\n\n const escrow = this.getEscrowAddress()\n const result = await this.readContract({\n address: escrow,\n abi: V3EscrowAbi,\n functionName: 'orchestrator',\n })\n\n this.cachedOrchestratorAddress = result as Hex\n return this.cachedOrchestratorAddress\n }\n\n // ─── Indexer Reads ───────────────────────────────────────────────────────\n\n private requireIndexer(): IndexerAdapter {\n if (!this.indexer) throw new ProveXError('INDEXER_NOT_CONFIGURED', 'No IndexerAdapter provided. Pass `indexer` to createProveXClient().')\n return this.indexer\n }\n\n async getMatchableDeposits(params: {\n token: Hex\n currencyId: Hex\n pagination?: PaginationOptions\n }): Promise<PaginatedResult<IndexedDeposit>> {\n return this.requireIndexer().getMatchableDeposits({ ...params, chainId: this.chainId })\n }\n\n async getDepositWithVerifiers(params: { escrow: Hex; localId: bigint }): Promise<IndexedDeposit | null> {\n return this.requireIndexer().getDepositWithVerifiers({ ...params, chainId: this.chainId })\n }\n\n async getIntent(intentHash: Hex): Promise<IndexedIntent | null> {\n return this.requireIndexer().getIntent({ intentHash, chainId: this.chainId })\n }\n\n async getPayeeDetailsHash(params: { escrow: Hex; localId: bigint; paymentMethodId: Hex }): Promise<Hex | null> {\n return this.requireIndexer().getPayeeDetailsHash({ ...params, chainId: this.chainId })\n }\n\n async getUserReputation(address: Hex): Promise<ReputationData> {\n return this.requireIndexer().getUserReputation({ address, chainId: this.chainId })\n }\n\n // ─── On-Chain Reads ──────────────────────────────────────────────────────\n\n async getProtocolFees(): Promise<{ feeRaw: bigint; feeInfo: FeeInfo; feeRecipient: Hex }> {\n const orchestrator = await this.getOrchestratorAddress()\n\n const [feeRaw, feeRecipient] = await Promise.all([\n this.readContract({ address: orchestrator, abi: OrchestratorAbi, functionName: 'protocolFee' }),\n this.readContract({ address: orchestrator, abi: OrchestratorAbi, functionName: 'protocolFeeRecipient' }),\n ])\n\n return {\n feeRaw: feeRaw as bigint,\n feeInfo: normalizeFeePrecision(feeRaw as bigint),\n feeRecipient: feeRecipient as Hex,\n }\n }\n\n async getDeposit(depositId: bigint): Promise<unknown> {\n return this.readContract({\n address: this.getEscrowAddress(),\n abi: V3EscrowAbi,\n functionName: 'getDeposit',\n args: [depositId],\n })\n }\n\n async getAccountDeposits(account: Hex): Promise<unknown> {\n return this.readContract({\n address: this.getEscrowAddress(),\n abi: V3EscrowAbi,\n functionName: 'getAccountDeposits',\n args: [account],\n })\n }\n\n async getDepositCounter(): Promise<bigint> {\n return this.readContract({\n address: this.getEscrowAddress(),\n abi: V3EscrowAbi,\n functionName: 'depositCounter',\n }) as Promise<bigint>\n }\n\n async getAllowance(params: { token: Hex; owner: Hex; spender: Hex }): Promise<bigint> {\n return this.readContract({\n address: params.token,\n abi: [{ name: 'allowance', type: 'function', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }, { name: 'spender', type: 'address' }], outputs: [{ name: '', type: 'uint256' }] }] as const,\n functionName: 'allowance',\n args: [params.owner, params.spender],\n }) as Promise<bigint>\n }\n\n async checkNullifierUsed(params: { paymentMethodId: Hex; nullifier: Hex }): Promise<boolean | null> {\n try {\n const orchestrator = await this.getOrchestratorAddress()\n const verifierRegistry = await this.readContract({ address: orchestrator, abi: OrchestratorAbi, functionName: 'paymentVerifierRegistry' }) as Hex\n const verifier = await this.readContract({ address: verifierRegistry, abi: PaymentVerifierRegistryAbi, functionName: 'getVerifier', args: [params.paymentMethodId] }) as Hex\n const nullifierRegistry = await this.readContract({ address: verifier, abi: UnifiedPaymentVerifierAbi, functionName: 'nullifierRegistry' }) as Hex\n return await this.readContract({ address: nullifierRegistry, abi: NullifierRegistryAbi, functionName: 'isNullified', args: [params.nullifier] }) as boolean\n } catch {\n return null\n }\n }\n\n // ─── Escrow Writes ───────────────────────────────────────────────────────\n\n /** Low-level deposit creation — pass pre-hashed contract params directly. */\n readonly createDepositRaw: WritableMethod<CreateDepositRawParams>\n readonly addFunds: WritableMethod<{ depositId: bigint; amount: bigint }>\n readonly removeFunds: WritableMethod<{ depositId: bigint; amount: bigint }>\n readonly withdrawDeposit: WritableMethod<{ depositId: bigint }>\n readonly pruneExpiredIntents: WritableMethod<{ depositId: bigint }>\n readonly setAcceptingIntents: WritableMethod<{ depositId: bigint; accepting: boolean }>\n readonly setRetainOnEmpty: WritableMethod<{ depositId: bigint; retain: boolean }>\n readonly setIntentRange: WritableMethod<{ depositId: bigint; min: bigint; max: bigint }>\n readonly setPaymentMethodActive: WritableMethod<{ depositId: bigint; paymentMethod: Hex; active: boolean }>\n readonly setCurrencyMinRate: WritableMethod<{ depositId: bigint; paymentMethod: Hex; currency: Hex; rate: bigint }>\n readonly addCurrencies: WritableMethod<{ depositId: bigint; paymentMethod: Hex; currencies: Array<{ code: Hex; minConversionRate: bigint }> }>\n readonly deactivateCurrency: WritableMethod<{ depositId: bigint; paymentMethod: Hex; currencyCode: Hex }>\n readonly addPaymentMethods: WritableMethod<{ depositId: bigint; paymentMethods: Hex[]; paymentMethodData: Array<{ intentGatingService: Hex; payeeDetails: Hex; data: Hex }>; currencies: Array<Array<{ code: Hex; minConversionRate: bigint }>> }>\n\n /**\n * Create a deposit with human-readable params.\n *\n * Handles all encoding internally:\n * 1. Registers payee details with the API (so buyers can discover them)\n * 2. Hashes provider keys and currency codes to bytes32\n * 3. Expands sub-providers (e.g., 'zelle' → zelle-chase, zelle-bofa, zelle-citi)\n * 4. Encodes gating service witness signers\n * 5. Submits the on-chain transaction\n *\n * @example\n * ```ts\n * await client.createDeposit({\n * token: USDC_ADDRESS,\n * amount: 1000_000000n,\n * intentRange: { min: 10_000000n, max: 500_000000n },\n * paymentMethods: [\n * { provider: 'venmo', payeeId: '@myvenmo', currencies: [{ code: 'USD', minRate: 0n }] },\n * ],\n * retainOnEmpty: true,\n * })\n * ```\n */\n async createDeposit(params: CreateDepositParams): Promise<TransactionResult> {\n // Step 1: Register all payee identities with the API (parallel)\n await Promise.all(\n params.paymentMethods.map(pm =>\n this.registerMaker({\n providerKey: pm.provider,\n providerId: pm.payeeId,\n telegramHandle: params.telegramHandle,\n }).catch(err => {\n // Non-fatal: deposit can still be created on-chain, but buyer lookup\n // will 404 until the maker is registered. Log and continue.\n console.warn(`[ProveXClient] Failed to register maker for ${pm.provider}:`, err)\n })\n )\n )\n\n // Step 2: Build raw contract params\n const rawParams = this.buildCreateDepositRawParams(params)\n\n // Step 3: Execute the on-chain transaction\n return this.createDepositRaw(rawParams)\n }\n\n /**\n * Prepare an unsigned createDeposit transaction (no API call, no wallet).\n *\n * Use this for smart accounts, multisig, gasless relayers, or offline signing.\n * Maker registration is NOT performed — call `registerMaker()` separately\n * if you need buyers to discover the payee.\n */\n async prepareCreateDeposit(params: CreateDepositParams): Promise<PreparedTransaction> {\n return this.createDepositRaw.prepare(this.buildCreateDepositRawParams(params))\n }\n\n /**\n * Convert human-readable deposit params to raw contract params.\n * Handles provider expansion, hashing, gating service encoding, and defaults.\n */\n private buildCreateDepositRawParams(params: CreateDepositParams): CreateDepositRawParams {\n // Expand providers — some have sub-providers (e.g., Zelle → chase, bofa, citi)\n const expanded: Array<{\n providerKey: string\n payeeDetailsHash: Hex\n currencies: Array<{ code: string; minRate: bigint }>\n intentGatingService?: Hex\n data?: Hex\n }> = []\n\n const configs = providerConfigs(this.chainId)\n\n for (const pm of params.paymentMethods) {\n const hash = computePayeeDetailsHash(pm.payeeId)\n const config = configs[pm.provider as ProviderKey]\n\n if (config?.subProviders && config.subProviders.size > 0) {\n // Expand into sub-providers, each gets the same payee hash and currencies\n for (const sub of config.subProviders) {\n expanded.push({\n providerKey: sub.key,\n payeeDetailsHash: hash,\n currencies: pm.currencies,\n intentGatingService: pm.intentGatingService,\n data: pm.data,\n })\n }\n } else {\n expanded.push({\n providerKey: pm.provider,\n payeeDetailsHash: hash,\n currencies: pm.currencies,\n intentGatingService: pm.intentGatingService,\n data: pm.data,\n })\n }\n }\n\n // Default gating data: encode the standard Reclaim witness signers\n const defaultGatingData = encodeAbiParameters(\n parseAbiParameters(['address[]']),\n [[reclaimSigners.peerWitnessSigner as Hex, reclaimSigners.reclaimWitnessSigner as Hex]]\n )\n\n // Default gating service address for this chain\n const defaultGatingService = getLatestContract(this.chainId, 'gatingService', 'v3') ?? zeroAddress as Hex\n\n return {\n token: params.token,\n amount: params.amount,\n intentAmountRange: {\n min: params.intentRange?.min ?? 1_000000n,\n max: params.intentRange?.max ?? params.amount,\n },\n paymentMethods: expanded.map(p => providerKeyToContractId(p.providerKey)),\n paymentMethodData: expanded.map(p => ({\n intentGatingService: p.intentGatingService ?? defaultGatingService,\n payeeDetails: p.payeeDetailsHash,\n data: p.data ?? defaultGatingData,\n })),\n currencies: expanded.map(p =>\n p.currencies.map(c => ({\n code: tickerToContractId(c.code),\n minConversionRate: c.minRate,\n }))\n ),\n delegate: params.delegate ?? zeroAddress as Hex,\n intentGuardian: params.intentGuardian ?? zeroAddress as Hex,\n retainOnEmpty: params.retainOnEmpty ?? false,\n }\n }\n\n // ─── Orchestrator Writes ─────────────────────────────────────────────────\n\n readonly cancelIntent: WritableMethod<{ intentHash: Hex }>\n readonly releaseFundsToPayer: WritableMethod<{ intentHash: Hex }>\n\n /**\n * Signal an intent to buy tokens from a deposit (buyer side).\n *\n * Handles the full multi-step flow:\n * 1. Fetches payee details hash from the indexer\n * 2. Requests a gating service signature from the API\n * 3. Simulates the transaction\n * 4. Submits to Orchestrator.signalIntent()\n * 5. Parses the IntentSignaled event to extract the intent hash\n *\n * @returns Transaction result with the on-chain intent hash.\n * @throws {ProveXError} VALIDATION_ERROR if payee details or gating signature missing.\n * @throws {ProveXError} API_ERROR if gating service rejects the intent.\n * @throws {ProveXError} WALLET_REJECTED if user cancels in wallet.\n *\n * @example\n * ```ts\n * const { hash, intentHash } = await client.signalIntent({\n * deposit: { escrow: '0x...', localId: 1n },\n * paymentMethod: providerKeyToContractId('venmo'),\n * tokenAmount: 100_000000n,\n * toAddress: wallet.address,\n * fiatCurrencyCode: tickerToContractId('USD'),\n * conversionRate: 1_000000000000000000n,\n * })\n * ```\n */\n async signalIntent(params: SignalIntentParams): Promise<SignalIntentResult> {\n const wallet = this.requireWallet()\n const orchestrator = await this.getOrchestratorAddress()\n const indexer = this.requireIndexer()\n\n // Step 1: Get payee details hash from indexer\n const payeeDetailsHash = await indexer.getPayeeDetailsHash({\n escrow: params.deposit.escrow,\n localId: params.deposit.localId,\n chainId: this.chainId,\n paymentMethodId: params.paymentMethod,\n })\n\n if (!payeeDetailsHash) {\n throw new ProveXError('VALIDATION_ERROR', 'No payee details found for this deposit and payment method.')\n }\n\n // Step 2: Request gating service signature\n const gatingResponse = await this.requestGatingSignature({\n processorName: params.subProvider ?? '',\n depositId: params.deposit.localId.toString(),\n amount: params.tokenAmount.toString(),\n payeeDetails: payeeDetailsHash,\n toAddress: params.toAddress,\n paymentMethod: params.paymentMethod,\n fiatCurrency: params.fiatCurrencyCode,\n conversionRate: params.conversionRate.toString(),\n chainId: this.chainId.toString(),\n orchestratorAddress: orchestrator,\n escrowAddress: params.deposit.escrow,\n })\n\n // Step 3: Build raw on-chain params\n const rawParams = {\n escrow: params.deposit.escrow,\n depositId: params.deposit.localId,\n amount: params.tokenAmount,\n to: params.toAddress,\n paymentMethod: params.paymentMethod,\n fiatCurrency: params.fiatCurrencyCode,\n conversionRate: params.conversionRate,\n referrer: zeroAddress as Hex,\n referrerFee: 0n,\n gatingServiceSignature: gatingResponse.signature,\n signatureExpiration: gatingResponse.expiration,\n postIntentHook: zeroAddress as Hex,\n data: '0x' as Hex,\n }\n\n // Step 4: Simulate\n const publicClient = this.getPublicClient()\n try {\n await publicClient.simulateContract({\n address: orchestrator,\n abi: OrchestratorAbi,\n functionName: 'signalIntent',\n args: [rawParams],\n account: params.toAddress,\n })\n } catch (simError) {\n throw new ProveXError('CONTRACT_ERROR', (simError as Error).message ?? 'Signal intent simulation failed', simError as Error)\n }\n\n // Step 5: Send transaction\n const gasInputs = await getTransactionGasInputs(this.chainId)\n const txData = encodeFunctionData({\n abi: OrchestratorAbi,\n functionName: 'signalIntent',\n args: [rawParams],\n })\n\n let txHash: Hex\n try {\n // Lifecycle hook: about to open the wallet popup. Callers flip their\n // strip/toast UI to \"awaiting wallet signature\" here so the label\n // tracks the actual signing window, not the entire SDK call.\n params.onAwaitingSignature?.()\n txHash = await wallet.sendTransaction({\n to: orchestrator,\n data: txData,\n chainId: this.chainId,\n ...gasInputs,\n })\n } catch (err) {\n if (isUserRejectionError(err)) {\n throw new ProveXError('WALLET_REJECTED', 'Transaction was rejected in wallet.', err as Error)\n }\n throw new ProveXError('CONTRACT_ERROR', (err as Error).message ?? 'Transaction failed', err as Error)\n }\n\n this.onTransactionHash?.(txHash)\n params.onTransactionHash?.(txHash)\n\n // Step 6: Wait for receipt and extract intent hash\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash })\n\n let intentHash: Hex | null = null\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: OrchestratorAbi,\n data: log.data,\n topics: log.topics,\n })\n if (decoded.eventName === 'IntentSignaled') {\n intentHash = (decoded.args as { intentHash: Hex }).intentHash\n break\n }\n } catch {\n // Not our event, skip\n }\n }\n\n if (!intentHash) {\n throw new ProveXError('CONTRACT_ERROR', 'Transaction succeeded but IntentSignaled event not found in receipt.')\n }\n\n // Step 7: Wait for indexer sync if available\n if (this.indexer) {\n await checkTransactionIndexed({\n queryTransaction: this.indexer.getTransactionByHash,\n hash: txHash,\n onSlowSync: this.onSlowSync,\n })\n }\n\n return { hash: txHash, receipt, intentHash }\n }\n\n /**\n * Request a gating service signature for intent signaling.\n * The gating service validates the intent and returns a signature\n * the Orchestrator contract verifies on-chain.\n */\n private async requestGatingSignature(params: {\n processorName: string\n depositId: string\n amount: string\n payeeDetails: Hex\n toAddress: Hex\n paymentMethod: Hex\n fiatCurrency: Hex\n conversionRate: string\n chainId: string\n orchestratorAddress: Hex\n escrowAddress: Hex\n }): Promise<{ signature: Hex; expiration: bigint }> {\n const res = await this.apiPost<{\n success: boolean\n message?: string\n responseObject: {\n intentData?: { gatingServiceSignature: Hex }\n signedIntent?: Hex\n signatureExpiration?: string\n }\n }>('/api/v0/attestation/verify/intent', params)\n\n if (!(res as { success: boolean }).success) {\n throw new ProveXError('API_ERROR', (res as { message?: string }).message ?? 'Gating service rejected the intent.')\n }\n\n const signature =\n res.responseObject.intentData?.gatingServiceSignature ??\n res.responseObject.signedIntent\n\n if (!signature) {\n throw new ProveXError('API_ERROR', 'No signature received from gating service.')\n }\n\n const expiration = res.responseObject.signatureExpiration\n ? BigInt(res.responseObject.signatureExpiration)\n : BigInt(Math.floor(Date.now() / 1000) + 3600)\n\n return { signature, expiration }\n }\n\n // ─── ERC20 ───────────────────────────────────────────────────────────────\n\n readonly approve: WritableMethod<{ token: Hex; spender: Hex; amount?: bigint }>\n\n // ─── API Methods (Maker Registration, Attestation) ──────────────────────\n\n /** Get payee details for a provider and user ID. */\n async getPayeeInfo(params: { provider: string; userId: string }): Promise<PayeeDetails | null> {\n try {\n const res = await fetch(`${this.apiUrl}/api/v0/makers/${params.provider}/${params.userId}`)\n if (!res.ok) return null\n const json = await res.json() as { responseObject?: PayeeDetails }\n return json.responseObject ?? null\n } catch {\n return null\n }\n }\n\n /** Validate a maker's payment identity before registration. */\n async validateMaker(params: MakerRegistrationParams): Promise<boolean> {\n const res = await this.apiPost<{ responseObject?: boolean }>('/api/v0/makers/validate', {\n processorName: params.providerKey,\n depositData: {\n [params.providerKey]: params.providerId,\n telegramUsername: params.telegramHandle ?? '',\n },\n })\n return res.responseObject ?? false\n }\n\n /** Register a maker's payment identity (e.g., Venmo username). Required before creating deposits. */\n async registerMaker(params: MakerRegistrationParams): Promise<{ id: string } | null> {\n const res = await this.apiPost<{ responseObject?: { id: string } }>('/api/v0/makers/create', {\n processorName: params.providerKey,\n depositData: {\n [params.providerKey]: params.providerId,\n telegramUsername: params.telegramHandle ?? '',\n },\n })\n return res.responseObject ?? null\n }\n\n /**\n * Submit zkTLS proofs and get a signed attestation for fulfillIntent.\n * This is the proof verification step — after the buyer makes payment and\n * generates proofs via the browser extension.\n */\n async getAttestation(params: AttestationParams): Promise<AttestationResponse> {\n const endpoint = `/api/v0/attestation/verify/${params.platform}/${params.actionType}`\n const proof = params.proofs.length === 1 ? params.proofs[0] : params.proofs\n\n const res = await fetch(`${this.apiUrl}${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n proofType: 'reclaim',\n proof: JSON.stringify(proof),\n chainId: params.chainId,\n verifyingContract: params.verifyingContract,\n intent: params.intent,\n }),\n })\n\n if (!res.ok) {\n let errorMessage = `Attestation error: ${res.status}`\n try {\n const errorJson = await res.json() as { message?: string }\n if (errorJson.message) errorMessage = errorJson.message\n } catch { /* not JSON */ }\n\n return {\n success: false,\n message: errorMessage,\n statusCode: res.status,\n responseObject: {} as AttestationResponse['responseObject'],\n }\n }\n\n return await res.json() as AttestationResponse\n }\n\n /** Make a POST request to the API. */\n private async apiPost<T>(path: string, body: unknown): Promise<T> {\n const res = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n if (!res.ok) {\n throw new ProveXError('API_ERROR', `API request failed: ${res.status}`)\n }\n return await res.json() as T\n }\n\n // ─── Indexer Sync ────────────────────────────────────────────────────────\n\n async waitForTransactionIndexed(hash: Hex): Promise<void> {\n const indexer = this.requireIndexer()\n await checkTransactionIndexed({\n queryTransaction: indexer.getTransactionByHash,\n hash,\n onSlowSync: this.onSlowSync,\n })\n }\n\n // ─── Internal Helpers ────────────────────────────────────────────────────\n\n /** Get or create a viem PublicClient for this chain. Cached after first use. */\n getPublicClient(): PublicClient {\n if (!this._publicClient) {\n this._publicClient = createPublicClient({ chain: this.chain, transport: http() })\n }\n return this._publicClient\n }\n\n /** Read from a contract using wallet adapter or public RPC. */\n private async readContract(params: {\n address: Hex\n abi: readonly unknown[]\n functionName: string\n args?: readonly unknown[]\n }): Promise<unknown> {\n // Prefer wallet adapter's readContract if available\n if (this.wallet?.readContract) {\n return this.wallet.readContract({ ...params, chainId: this.chainId })\n }\n\n // Fall back to public RPC using the chain's configured transport\n return this.getPublicClient().readContract(params as Parameters<PublicClient['readContract']>[0])\n }\n\n /** Require a connected wallet, or throw. */\n private requireWallet(): WalletAdapter {\n if (!this.wallet) throw new ProveXError('WALLET_NOT_CONNECTED', 'No wallet adapter provided. Pass `wallet` to createProveXClient().')\n if (!this.wallet.address) throw new ProveXError('WALLET_NOT_CONNECTED', 'Wallet is not connected.')\n return this.wallet\n }\n\n /**\n * Build a WritableMethod from an ABI definition.\n * The returned function supports both execute (full lifecycle) and .prepare() (unsigned tx).\n */\n private buildWritableMethod<TParams>({\n abi,\n contractResolver,\n functionName,\n argsMapper,\n }: {\n abi: readonly unknown[]\n contractResolver: (params: TParams) => Hex | Promise<Hex>\n functionName: string\n argsMapper: (params: TParams) => readonly unknown[]\n }): WritableMethod<TParams> {\n const prepare = async (params: TParams): Promise<PreparedTransaction> => {\n const to = await contractResolver(params)\n const args = argsMapper(params)\n const data = encodeFunctionData({\n abi: abi as Parameters<typeof encodeFunctionData>[0]['abi'],\n functionName,\n args: args as never,\n })\n return { to, data, value: 0n, chainId: this.chainId }\n }\n\n const execute = async (params: TParams & WriteHookParams): Promise<TransactionResult> => {\n const wallet = this.requireWallet()\n const prepared = await prepare(params)\n const gasInputs = await getTransactionGasInputs(this.chainId)\n const request = { ...prepared, ...gasInputs }\n const ctx = { chainId: this.chainId, request }\n\n let hash: Hex\n try {\n // Lifecycle: about to open the wallet popup. Callers flip their\n // strip/toast UI to \"awaiting wallet signature\" here so the label\n // tracks the actual signing window, not the entire SDK call.\n params.onAwaitingSignature?.(ctx)\n hash = await wallet.sendTransaction(request)\n } catch (err) {\n if (isUserRejectionError(err)) {\n throw new ProveXError('WALLET_REJECTED', 'Transaction was rejected in wallet.', err as Error)\n }\n throw new ProveXError('CONTRACT_ERROR', (err as Error).message ?? 'Transaction failed', err as Error)\n }\n\n // Two channels fire on the same line — complementary, not redundant.\n // Constructor-level is the global analytics observer; per-call is the\n // lifecycle hook that closes over the caller's TxFlight `trackedId`.\n this.onTransactionHash?.(hash)\n params.onTransactionHash?.({ ...ctx, hash })\n\n // Wait for receipt\n const receipt = await this.getPublicClient().waitForTransactionReceipt({ hash })\n\n // Wait for indexer sync if adapter provided\n if (this.indexer) {\n await checkTransactionIndexed({\n queryTransaction: this.indexer.getTransactionByHash,\n hash,\n onSlowSync: this.onSlowSync,\n })\n }\n\n return { hash, receipt }\n }\n\n // Attach .prepare() to the execute function\n execute.prepare = prepare\n return execute as WritableMethod<TParams>\n }\n}\n\n/**\n * Create a ProveXClient instance.\n *\n * @example\n * ```ts\n * // Full client\n * const client = createProveXClient({\n * chainId: 8453,\n * apiUrl: 'https://app.provex.com',\n * wallet: myWalletAdapter,\n * indexer: createPonderAdapter(),\n * })\n *\n * // Prepare-only mode\n * const client = createProveXClient({ chainId: 8453, apiUrl: 'https://app.provex.com' })\n * const tx = await client.addFunds.prepare({ depositId: 1n, amount: 100_000000n })\n * ```\n */\nexport function createProveXClient(config: ProveXClientConfig): ProveXClient {\n return new ProveXClient(config)\n}\n","/**\n * @fileoverview React hook for the V3 intent signaling flow.\n *\n * Thin state wrapper around ProveXClient.signalIntent() —\n * manages status, error messages, and loading state for the UI.\n */\n\nimport { useCallback, useMemo, useState } from 'react'\nimport type { Hex } from 'viem'\nimport type { SubProviderKey } from '@provex/utils/payment'\nimport type { ChainId } from '@provex/utils/chain'\nimport { useOptionalProvex } from '../ProvexProvider'\nimport { createProveXClient } from '../client/ProveXClient'\nimport { ProveXError } from '../client/types'\nimport type { WalletAdapter } from '../client/types'\nimport type { DepositInfo } from './useDeposits'\n\n/** Status of the signal intent flow. */\nexport type SignalIntentStatus =\n | 'input'\n | 'loading_payee'\n | 'loading_intent'\n | 'prompt_wallet_confirm'\n | 'writing_intent'\n | 'success'\n | 'error'\n\n/**\n * Pattern-to-message mapping for user-friendly error messages.\n * Checked in order — first match wins.\n */\nconst ERROR_PATTERNS: readonly { pattern: RegExp; message: string }[] = [\n { pattern: /user rejected|user denied|rejected the request|user cancelled|user canceled/i, message: 'Transaction was cancelled.' },\n { pattern: /InsufficientDepositLiquidity|0xc3df48f3/i, message: 'This deposit no longer has enough available liquidity. Please try a smaller amount or a different deposit.' },\n { pattern: /execution reverted/i, message: 'Transaction failed on-chain. The order may no longer be available.' },\n { pattern: /insufficient funds/i, message: 'Insufficient funds for gas fees.' },\n { pattern: /timeout|etimedout/i, message: 'Request timed out. Please try again.' },\n]\n\n/** Convert a raw error to a user-friendly message. */\nfunction getUserFriendlyErrorMessage(error: unknown): string {\n const raw = error instanceof Error ? error.message : String(error)\n for (const { pattern, message } of ERROR_PATTERNS) {\n if (pattern.test(raw)) return message\n }\n return 'Something went wrong. Please try again.'\n}\n\n/**\n * Hook for signaling intent to buy tokens via the V3 Orchestrator.\n *\n * Delegates to ProveXClient.signalIntent() for the full multi-step flow:\n * 1. Fetch payee details from indexer\n * 2. Request gating signature from API\n * 3. Simulate, submit, and parse IntentSignaled event\n *\n * @example\n * ```ts\n * const { startOrder, status, message, isLoading } = useSignalIntent({\n * wallet,\n * chainId: 369,\n * deposit: selectedDeposit,\n * onSuccess: (intentHash) => navigate(`/verify/${intentHash}`),\n * })\n * ```\n */\nexport function useSignalIntent({\n wallet,\n onSuccess,\n onFailure,\n deposit,\n refetchDeposits,\n}: {\n /** Wallet adapter for signing transactions. */\n wallet: WalletAdapter\n /** @deprecated Chain is resolved from ProvexProvider. Kept for API compat. */\n chainId?: ChainId\n /** Called when the intent is signaled successfully. */\n onSuccess: (intentHash: Hex) => void\n /** Called when the flow fails. */\n onFailure?: () => void\n /** The deposit to signal intent against. */\n deposit: DepositInfo | null\n /** Called on failure to refresh deposit data. */\n refetchDeposits?: () => void\n}) {\n const provex = useOptionalProvex()\n const [status, setStatus] = useState<SignalIntentStatus>('input')\n const [message, setMessage] = useState<string | null>(null)\n\n const client = useMemo(() => {\n if (!provex) return null\n return createProveXClient({\n chain: provex.config.chain,\n apiUrl: provex.config.apiUrl,\n wallet,\n indexer: provex.indexer,\n })\n }, [provex, wallet])\n\n const isLoading = useMemo(() => {\n return (\n status === 'loading_payee' ||\n status === 'loading_intent' ||\n status === 'prompt_wallet_confirm' ||\n status === 'writing_intent'\n )\n }, [status])\n\n const startOrder = useCallback(async ({\n paymentMethod,\n depositId,\n tokenAmount,\n toAddress,\n fiatCurrencyCode,\n conversionRate,\n subProvider,\n }: {\n paymentMethod: Hex\n depositId: bigint\n tokenAmount: bigint\n toAddress: Hex\n fiatCurrencyCode: Hex\n conversionRate: bigint\n subProvider?: SubProviderKey\n }) => {\n if (!client || !deposit) {\n setStatus('error')\n setMessage('Client or deposit not available')\n return\n }\n\n const escrow = deposit.escrow\n if (!escrow) {\n setStatus('error')\n setMessage('No escrow address found')\n return\n }\n\n setStatus('loading_intent')\n\n try {\n const result = await client.signalIntent({\n deposit: { escrow, localId: deposit.localId ?? depositId },\n paymentMethod,\n tokenAmount,\n toAddress,\n fiatCurrencyCode,\n conversionRate,\n subProvider,\n })\n\n setStatus('success')\n setMessage('Intent signaled successfully')\n onSuccess(result.intentHash)\n } catch (error) {\n if (error instanceof ProveXError && error.isRejection) {\n setStatus('input')\n setMessage(null)\n return\n }\n\n console.error('Failed to signal intent', error)\n setStatus('error')\n setMessage(getUserFriendlyErrorMessage(error))\n refetchDeposits?.()\n onFailure?.()\n }\n }, [client, deposit, onSuccess, onFailure, refetchDeposits])\n\n return {\n startOrder,\n status,\n message,\n isLoading,\n }\n}\n","/**\n * @fileoverview Hook for fetching user reputation (taker tier).\n *\n * Calculates the user's reputation tier based on:\n * - Fulfilled volume (in USDC, 1:1 with USD)\n * - Lock score (penalty for cancellations)\n * - Cooldown status\n *\n * Uses the IndexerAdapter for data — no direct Ponder queries.\n *\n * @see {@link @provex/utils/reputation} for tier definitions\n * @see {@link useReputationLimits} for applying limits to specific payments\n */\n\nimport { useMemo, useCallback } from 'react'\nimport { type Hex } from 'viem'\nimport { base } from 'viem/chains'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { ChainId } from '@provex/utils/chain'\nimport { type TakerTier, tiers } from '@provex/utils/payment'\nimport {\n getTierFromVolume,\n getVolumeRangeDisplay,\n TAKER_TIERS,\n TIER_ORDER,\n type UserReputation,\n DEFAULT_REPUTATION,\n} from '@provex/utils/reputation'\nimport { useProvex } from '../ProvexProvider'\n\n/**\n * Hook to fetch and calculate user reputation tier.\n *\n * @param address - User's wallet address\n * @param chainId - Current chain ID\n * @returns User reputation data and loading state\n */\nexport function useReputation({\n address,\n chainId,\n}: {\n address: Hex | undefined\n chainId: ChainId\n}): {\n reputation: UserReputation\n isLoading: boolean\n error: Error | null\n refetch: () => void\n} {\n const { indexer } = useProvex()\n const queryClient = useQueryClient()\n const isBase = chainId === base.id\n\n // Single query to the adapter — it handles all the SQL complexity\n const reputationQuery = useQuery({\n queryKey: ['provex', 'reputation', address, isBase ? base.id : 'all'],\n queryFn: async () => {\n if (!address) return null\n return indexer.getUserReputation({\n address,\n chainId: isBase ? (base.id as ChainId) : undefined,\n })\n },\n enabled: !!address,\n staleTime: 60_000,\n refetchInterval: 120_000,\n })\n\n // Calculate reputation from adapter data\n const reputation = useMemo<UserReputation>(() => {\n const data = reputationQuery.data\n if (!data) return DEFAULT_REPUTATION\n\n // Calculate tier from USDC volume\n let tier = getTierFromVolume(data.fulfilledVolumeUsdc)\n\n // Apply lock score penalties\n const lockScore = data.lateCancellations * 50\n const dilutedLockScore = data.fulfilledCount > 0\n ? lockScore / (1 + data.fulfilledCount * 0.1)\n : lockScore\n\n let tierPenalty = 0\n if (dilutedLockScore >= 1000) tierPenalty = 4\n else if (dilutedLockScore >= 500) tierPenalty = 3\n else if (dilutedLockScore >= 200) tierPenalty = 2\n else if (dilutedLockScore >= 50) tierPenalty = 1\n\n if (tierPenalty > 0) {\n const currentTierIndex = TIER_ORDER.indexOf(tier)\n const newTierIndex = Math.max(0, currentTierIndex - tierPenalty)\n tier = TIER_ORDER[newTierIndex] ?? 'peasant'\n }\n\n // Calculate cooldown from last signaled timestamps\n const cooldownHours = TAKER_TIERS[tier].cooldownHours\n let cooldownEndsAt: Date | null = null\n let isOnCooldown = false\n\n // On Base: only Base timestamp. On PulseChain: most recent from either chain.\n const baseTimestamp = data.lastSignaledAt[base.id as ChainId] ?? null\n const pulseTimestamp = data.lastSignaledAt[369 as ChainId] ?? null\n\n const candidateTimestamps = isBase\n ? [baseTimestamp]\n : [baseTimestamp, pulseTimestamp]\n const lastSignaledTimestamp = candidateTimestamps\n .filter((ts): ts is bigint => ts !== null)\n .sort((a, b) => Number(b) - Number(a))[0] ?? null\n\n if (cooldownHours > 0 && lastSignaledTimestamp) {\n const lastSignaledTime = Number(lastSignaledTimestamp) * 1000\n const cooldownMs = cooldownHours * 60 * 60 * 1000\n cooldownEndsAt = new Date(lastSignaledTime + cooldownMs)\n isOnCooldown = cooldownEndsAt > new Date()\n }\n\n return {\n tier,\n fulfilledVolumeUsdc: data.fulfilledVolumeUsdc,\n lockScore: dilutedLockScore,\n cooldownEndsAt,\n isOnCooldown,\n }\n }, [reputationQuery.data, isBase])\n\n const hasLoadedData = reputationQuery.data !== undefined\n const isLoading = reputationQuery.isLoading && !hasLoadedData\n\n const refetch = useCallback(() => {\n queryClient.invalidateQueries({\n queryKey: ['provex', 'reputation', address],\n })\n }, [queryClient, address])\n\n return {\n reputation,\n isLoading,\n error: reputationQuery.error,\n refetch,\n }\n}\n\n/**\n * Get display info for a tier.\n */\nexport function getTierDisplayInfo(tier: TakerTier): {\n name: string\n baseCap: number\n cooldownHours: number\n color: string\n volumeRangeDisplay: string\n} {\n const config = TAKER_TIERS[tier]\n const colors: Record<TakerTier, string> = {\n [tiers.PEASANT]: 'gray',\n [tiers.NEUTRAL]: 'blue',\n [tiers.PLUS]: 'green',\n [tiers.PRO]: 'purple',\n [tiers.PLATINUM]: 'yellow',\n [tiers.PRESIDENT]: 'cyan',\n }\n\n return {\n name: config.name,\n baseCap: config.baseCap,\n cooldownHours: config.cooldownHours,\n color: colors[tier],\n volumeRangeDisplay: getVolumeRangeDisplay(tier),\n }\n}\n","/**\n * @fileoverview Hook for calculating reputation-based trading limits.\n *\n * Applies tier-based restrictions on transaction caps and cooldowns.\n * Pure computation -- no Ponder, no contract reads.\n *\n * @see {@link useReputation} for fetching the user's tier\n * @see {@link @provex/utils/reputation} for tier definitions\n */\n\nimport { useMemo } from 'react'\nimport type { ChainId } from '@provex/utils/chain'\nimport {\n type ProviderKey,\n type TakerTier,\n verifiablePaymentMethods,\n providerConfigs,\n getPlatformRisk,\n} from '@provex/utils/payment'\nimport {\n getCooldownHours,\n getEffectiveCap,\n} from '@provex/utils/reputation'\n\n/** Input parameters for calculating reputation limits. */\nexport interface ReputationLimitsParams {\n /** Current chain ID */\n chainId: ChainId\n /** Currently selected payment method */\n selectedPaymentMethod: ProviderKey\n /** User's reputation tier */\n tier: TakerTier\n /** Amount in fiat currency (for cap exceeded check) - in token base units (e.g., 6 decimals for USDC) */\n amountInInt?: bigint | null\n /** When the user's cooldown ends (from useReputation) */\n cooldownEndsAt?: Date | null\n}\n\n/** Result of the useReputationLimits hook. */\nexport interface ReputationLimits {\n /** Whether reputation limits apply */\n hasLimits: boolean\n /** Alternative providers with no cooldown */\n noCooldownProviders: ProviderKey[]\n /** Cooldown hours for the selected payment method (category, not remaining) */\n selectedProviderCooldownHours: number\n /** Remaining cooldown time in formatted string (e.g., \"5h 30m\") - null if not on cooldown */\n cooldownRemaining: string | null\n /** Whether user is currently on cooldown for the selected payment method */\n isOnCooldown: boolean\n /** Effective cap in USD for the selected payment method (null if no cap) */\n effectiveCap: number | null\n /** Whether the current amount exceeds the cap */\n amountExceedsCap: boolean\n /** Error message when cap is exceeded */\n capExceededMessage: string | null\n}\n\n/**\n * Hook to calculate reputation-based limits for payment methods.\n *\n * @example\n * ```ts\n * const {\n * noCooldownProviders,\n * selectedProviderCooldownHours,\n * effectiveCap,\n * amountExceedsCap,\n * capExceededMessage,\n * } = useReputationLimits({\n * chainId,\n * selectedPaymentMethod,\n * tier: reputation.tier,\n * amountInInt,\n * })\n * ```\n */\nexport function useReputationLimits({\n chainId,\n selectedPaymentMethod,\n tier,\n amountInInt,\n cooldownEndsAt,\n}: ReputationLimitsParams): ReputationLimits {\n const hasLimits = true\n\n // Calculate cooldown remaining from cooldownEndsAt\n const { cooldownRemaining, isOnCooldown } = useMemo(() => {\n const providerCooldownHours = hasLimits\n ? getCooldownHours({ tier, providerKey: selectedPaymentMethod })\n : 0\n const providerHasCooldown = providerCooldownHours > 0\n\n if (!cooldownEndsAt || !providerHasCooldown) {\n return { cooldownRemaining: null, isOnCooldown: false }\n }\n\n const remainingMs = cooldownEndsAt.getTime() - Date.now()\n if (remainingMs <= 0) {\n return { cooldownRemaining: null, isOnCooldown: false }\n }\n\n const hours = Math.floor(remainingMs / (1000 * 60 * 60))\n const minutes = Math.floor((remainingMs % (1000 * 60 * 60)) / (1000 * 60))\n const formatted = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`\n return { cooldownRemaining: formatted, isOnCooldown: true }\n }, [cooldownEndsAt, hasLimits, tier, selectedPaymentMethod])\n\n // Alternative providers that have no cooldown but are subject to the gating system\n const noCooldownProviders = useMemo(() => {\n if (!hasLimits) return []\n const available = verifiablePaymentMethods(chainId)\n return available.filter(key => {\n if (key === selectedPaymentMethod) return false\n const platformRisk = getPlatformRisk(chainId, key)\n if (!platformRisk.hasCooldown) return false\n return getCooldownHours({ tier, providerKey: key }) === 0\n })\n }, [hasLimits, chainId, selectedPaymentMethod, tier])\n\n // Check if currently selected payment method has cooldown\n const selectedProviderCooldownHours = useMemo(() => {\n if (!hasLimits) return 0\n return getCooldownHours({ tier, providerKey: selectedPaymentMethod })\n }, [hasLimits, tier, selectedPaymentMethod])\n\n // Get effective cap for selected payment method\n const effectiveCap = useMemo(() => {\n if (!hasLimits) return null\n return getEffectiveCap({ tier, providerKey: selectedPaymentMethod })\n }, [hasLimits, tier, selectedPaymentMethod])\n\n // Check if amount exceeds effective cap\n const amountExceedsCap = useMemo(() => {\n if (effectiveCap === null) return false\n if (!amountInInt) return false\n const amountUsd = Number(amountInInt) / 1e6\n return amountUsd > effectiveCap\n }, [effectiveCap, amountInInt])\n\n // Error message for cap exceeded\n const capExceededMessage = useMemo(() => {\n if (!amountExceedsCap || effectiveCap === null) return null\n const providerName =\n providerConfigs(chainId)[selectedPaymentMethod]?.name ?? selectedPaymentMethod\n return `Amount exceeds your $${effectiveCap.toLocaleString()} limit for ${providerName}`\n }, [amountExceedsCap, effectiveCap, chainId, selectedPaymentMethod])\n\n return {\n hasLimits,\n noCooldownProviders,\n selectedProviderCooldownHours,\n cooldownRemaining,\n isOnCooldown,\n effectiveCap,\n amountExceedsCap,\n capExceededMessage,\n }\n}\n","/**\n * @fileoverview Hook for fetching intent details and payee information.\n *\n * Combines indexed data (from IndexerAdapter) with off-chain data\n * (from API) to provide complete intent information for the payment\n * verification flow.\n *\n * @see {@link useSignalIntent} for the preceding signaling step\n */\n\nimport { useMemo, useCallback } from 'react'\nimport { type Hex } from 'viem'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n verifierGetsKey,\n resolveApiProviderKey,\n} from '@provex/utils/payment'\nimport { type ChainId } from '@provex/utils/chain'\nimport { useProvex } from '../ProvexProvider'\n\n/** Intent status values representing the lifecycle state. */\nexport const intentStatuses = {\n pending: 'pending',\n signalled: 'signalled',\n fulfilled: 'fulfilled',\n pruned: 'pruned',\n} as const\n\nexport type IntentStatus = (typeof intentStatuses)[keyof typeof intentStatuses]\n\n/** Payee details from the API. */\nexport interface PayeeInfo {\n payeeId?: string\n name?: string\n platformName?: string\n [key: string]: unknown\n}\n\n/**\n * Hook to fetch intent details and payee information.\n *\n * @param intentHash - The intent hash to look up\n * @param chainId - The chain ID to query\n * @returns Intent details, payee info, and loading state\n */\nexport function usePayeeDetails({\n intentHash,\n chainId,\n}: {\n intentHash: Hex | null\n chainId: ChainId\n}) {\n const { indexer, apiClient } = useProvex()\n const queryClient = useQueryClient()\n\n // Fetch intent from adapter (combines signal + lock + status)\n const intentQuery = useQuery({\n queryKey: ['provex', 'intent', intentHash, chainId],\n queryFn: () => indexer.getIntent({ intentHash: intentHash!, chainId }),\n enabled: !!intentHash,\n staleTime: Infinity,\n refetchInterval: false,\n })\n\n const indexedIntent = intentQuery.data ?? null\n\n // Map to intent status\n const intentStatus = useMemo<IntentStatus | null>(() => {\n if (!indexedIntent) return null\n return indexedIntent.status as IntentStatus\n }, [indexedIntent])\n\n // Map to intent struct shape\n const intent = useMemo(() => {\n if (!indexedIntent) return null\n return {\n owner: indexedIntent.ownerAddress,\n to: indexedIntent.toAddress,\n escrow: indexedIntent.escrow,\n depositId: indexedIntent.depositLocalId,\n amount: indexedIntent.amount,\n timestamp: indexedIntent.timestamp,\n paymentMethod: indexedIntent.paymentMethodId,\n fiatCurrency: indexedIntent.fiatCurrency,\n conversionRate: indexedIntent.conversionRate,\n }\n }, [indexedIntent])\n\n const expiryTime = indexedIntent?.expiryTime ?? null\n\n // Fetch deposit with verifiers\n const depositQuery = useQuery({\n queryKey: ['provex', 'deposit', indexedIntent?.escrow, indexedIntent?.depositLocalId, chainId],\n queryFn: () => indexer.getDepositWithVerifiers({\n escrow: indexedIntent!.escrow,\n localId: indexedIntent!.depositLocalId,\n chainId,\n }),\n enabled: !!indexedIntent,\n staleTime: Infinity,\n })\n\n const deposit = depositQuery.data ?? null\n\n // Derive provider key from payment method\n const providerKey = useMemo(() => {\n if (!deposit || !indexedIntent) return null\n return verifierGetsKey(deposit.chainId, indexedIntent.paymentMethodId)\n }, [deposit, indexedIntent])\n\n // Get payee details hash from deposit verifiers\n const userId = useMemo(() => {\n if (!deposit || !providerKey) return null\n const verifier = deposit.verifiers.find(v =>\n verifierGetsKey(deposit.chainId, v.paymentMethodId) === providerKey\n )\n return verifier?.payeeDetailsHash ?? null\n }, [deposit, providerKey])\n\n // Get API provider key (parent for sub-providers)\n const apiProviderKey = useMemo(() => {\n if (!providerKey) return null\n return resolveApiProviderKey(providerKey)\n }, [providerKey])\n\n // Fetch payee details from API\n const payeeDetailsQuery = useQuery({\n queryKey: ['provex', 'payeeDetails', apiProviderKey, userId],\n queryFn: async () => {\n if (!userId || !apiProviderKey) return null\n try {\n const response = await apiClient.get<{ responseObject: PayeeInfo }>(\n `/api/v1/makers/${apiProviderKey}/${userId}`\n )\n return response.responseObject ?? null\n } catch {\n return null\n }\n },\n enabled: !!userId && !!apiProviderKey,\n staleTime: Infinity,\n retry: false,\n })\n\n const payeeDetails = payeeDetailsQuery.data ?? null\n\n const isFetching = intentQuery.isFetching || depositQuery.isFetching\n\n const refetch = useCallback(() => {\n queryClient.invalidateQueries({ queryKey: ['provex', 'intent', intentHash] })\n }, [queryClient, intentHash])\n\n const refetchAll = useCallback(async (): Promise<IntentStatus | null> => {\n const [intentResult] = await Promise.all([\n intentQuery.refetch(),\n depositQuery.refetch(),\n payeeDetailsQuery.refetch(),\n ])\n\n const updated = intentResult.data\n if (!updated) return null\n return updated.status as IntentStatus\n }, [intentQuery, depositQuery, payeeDetailsQuery])\n\n return useMemo(() => ({\n intentStatus,\n isFetching,\n isValid: !!intent,\n intent,\n providerKey,\n userId,\n payeeDetails,\n deposit,\n expiryTime,\n isV2Intent: false, // Adapter only returns V3 intents\n isPruned: indexedIntent?.status === 'pruned',\n prunedAt: indexedIntent?.prunedAt ?? null,\n isFulfilled: indexedIntent?.status === 'fulfilled',\n refetch,\n refetchAll,\n }), [\n intentStatus,\n isFetching,\n intent,\n providerKey,\n userId,\n payeeDetails,\n deposit,\n expiryTime,\n indexedIntent,\n refetch,\n refetchAll,\n ])\n}\n","/**\n * @fileoverview Viem-based contract read hooks.\n *\n * Drop-in replacements for wagmi's `useReadContract` and `useReadContracts`\n * that source their public client from `ProvexProvider` context instead of\n * WagmiProvider. Lets `@provex/react` ship without wagmi in its import graph.\n *\n * Return shape matches the subset of wagmi's API we use:\n * - `data`, `isLoading`, `isError`, `error`, `refetch`\n * - For batched reads, `data` is an array of `{ status, result, error }`.\n */\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query'\nimport type { Abi, Hex } from 'viem'\nimport { useOptionalProvexPublicClient } from '../ProvexProvider'\n\n/** Parameters for a single contract read. */\nexport interface UseContractReadParams {\n address?: Hex\n abi: Abi\n functionName: string\n args?: readonly unknown[]\n /** Chain to read from. Defaults to ProvexProvider's primary chain. */\n chainId?: number\n query?: {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n }\n}\n\n/**\n * Read a single contract function via the ProvexProvider's public client.\n *\n * Mirrors wagmi's `useReadContract` return shape so call sites migrate\n * by switching the import.\n */\nexport function useContractRead<TData = unknown>(\n params: UseContractReadParams,\n): UseQueryResult<TData, Error> {\n const publicClient = useOptionalProvexPublicClient(params.chainId)\n const enabled =\n (params.query?.enabled ?? true) &&\n !!publicClient &&\n !!params.address\n\n return useQuery<TData, Error>({\n queryKey: [\n 'provex',\n 'readContract',\n params.chainId,\n params.address,\n params.functionName,\n params.args,\n ],\n queryFn: async () => {\n if (!publicClient) throw new Error('No public client available')\n if (!params.address) throw new Error('Missing contract address')\n const result = await publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: (params.args ?? []) as readonly unknown[],\n })\n return result as TData\n },\n enabled,\n staleTime: params.query?.staleTime,\n gcTime: params.query?.gcTime,\n })\n}\n\n/** One call within a batched `useContractReads`. */\nexport interface ContractReadCall {\n address?: Hex\n abi: Abi\n functionName: string\n args?: readonly unknown[]\n chainId?: number\n}\n\n/** Per-call result, matching wagmi's shape. */\nexport type ContractReadResult<T = unknown> =\n | { status: 'success'; result: T; error?: undefined }\n | { status: 'failure'; result?: undefined; error: Error }\n\nexport interface UseContractReadsParams {\n contracts: readonly ContractReadCall[]\n query?: {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n }\n}\n\n/**\n * Batch-read multiple contract functions via the ProvexProvider's public\n * client. All calls must target the same chain for now (derived from the\n * first call's `chainId` or the primary chain).\n *\n * Returns an array of per-call `{ status, result, error }` objects —\n * identical shape to wagmi's `useReadContracts`.\n */\nexport function useContractReads<TResults extends readonly unknown[] = unknown[]>(\n params: UseContractReadsParams,\n): UseQueryResult<{ [K in keyof TResults]: ContractReadResult<TResults[K]> }, Error> {\n const firstChainId = params.contracts[0]?.chainId\n const publicClient = useOptionalProvexPublicClient(firstChainId)\n const allHaveAddresses = params.contracts.every((c) => !!c.address)\n const enabled =\n (params.query?.enabled ?? true) &&\n !!publicClient &&\n allHaveAddresses &&\n params.contracts.length > 0\n\n return useQuery({\n queryKey: [\n 'provex',\n 'readContracts',\n firstChainId,\n params.contracts.map((c) => [c.address, c.functionName, c.args]),\n ],\n queryFn: async () => {\n if (!publicClient) throw new Error('No public client available')\n const results = await Promise.all(\n params.contracts.map(async (call) => {\n if (!call.address) {\n return {\n status: 'failure',\n error: new Error('Missing contract address'),\n } as ContractReadResult\n }\n try {\n const result = await publicClient.readContract({\n address: call.address,\n abi: call.abi,\n functionName: call.functionName,\n args: (call.args ?? []) as readonly unknown[],\n })\n return { status: 'success', result } as ContractReadResult\n } catch (error) {\n return {\n status: 'failure',\n error: error instanceof Error ? error : new Error(String(error)),\n } as ContractReadResult\n }\n }),\n )\n return results as { [K in keyof TResults]: ContractReadResult<TResults[K]> }\n },\n enabled,\n staleTime: params.query?.staleTime,\n gcTime: params.query?.gcTime,\n })\n}\n","import type { Hex } from 'viem'\nimport { V3EscrowAbi } from '@provex/abis'\nimport { useContractRead } from '../lib/contractRead'\n\n/**\n * Resolve the Orchestrator contract address from a V3 escrow.\n *\n * The orchestrator address is governance-static — set once at escrow\n * deployment and never reassigned in practice. `staleTime: Infinity`\n * makes this a single-RPC-per-session lookup that every consumer\n * (intent flow, fee reads, nullifier resolution, address menu) shares\n * via the same TanStack Query cache key.\n *\n * Returns the standard react-query observable shape so callers can\n * gate dependent reads on `isLoading` / `data`.\n *\n * @param enabled - Additional gate on top of the `!!escrowAddress` guard.\n * Useful when the caller has its own enabled flag (e.g. useProtocolFees).\n */\nexport function useOrchestratorAddress({\n escrowAddress,\n chainId,\n enabled = true,\n}: {\n escrowAddress: Hex | undefined\n chainId: number\n /** Extra enable gate; the hook also guards on `!!escrowAddress`. */\n enabled?: boolean\n}) {\n return useContractRead<Hex>({\n address: escrowAddress,\n abi: V3EscrowAbi,\n functionName: 'orchestrator',\n chainId,\n query: {\n enabled: enabled && !!escrowAddress,\n staleTime: Infinity,\n },\n })\n}\n","/**\n * @fileoverview Hook for reading protocol fee configuration.\n *\n * Fetches the current protocol fee percentage and recipient address\n * from the Orchestrator contract via the ProvexProvider's public client.\n *\n * @remarks\n * Fees may be stored as basis points (bps) or 18-decimal precision\n * depending on the chain. This hook normalizes both to a consistent format.\n *\n * @see {@link @provex/utils/fees} for fee calculation utilities\n */\n\nimport { useMemo } from 'react'\nimport type { Hex } from 'viem'\nimport { useContractReads } from '../lib/contractRead'\nimport { OrchestratorAbi } from '@provex/abis'\nimport { useOrchestratorAddress } from './useOrchestratorAddress'\nimport { normalizeFeePrecision, type FeeInfo } from '@provex/utils/fees'\nimport type { ChainId } from '@provex/utils/chain'\n\n/**\n * 1 hour in milliseconds - stale time for fee data cache.\n * Protocol fees are governance-controlled and change infrequently.\n * Scoped per chain + escrow so multi-chain setups cache independently.\n */\nconst FEE_CACHE_STALE_TIME = 60 * 60 * 1000\n\n/** Result of the useProtocolFees hook. */\nexport interface ProtocolFeesResult {\n /** Raw protocol fee value from contract (may be bps or 18-decimal) */\n protocolFeeRaw: bigint | undefined\n /** Normalized fee info with percentage string and bps value */\n feeInfo: FeeInfo | undefined\n /** Address that receives protocol fees */\n protocolFeeRecipient: Hex | undefined\n /** Orchestrator contract address (read from escrow) */\n orchestratorAddress: Hex | undefined\n /** True while loading fee data */\n isLoading: boolean\n /** True if an error occurred */\n isError: boolean\n /** Error object if an error occurred */\n error: Error | null\n /** Refetch fee data */\n refetch: () => void\n}\n\n/** Hook parameters for useProtocolFees. */\nexport interface UseProtocolFeesParams {\n /** The chain ID to read fees from */\n chainId: ChainId\n /** V3 Escrow contract address (orchestrator is read from this) */\n escrowAddress: Hex\n /** Whether to enable the query (defaults to true) */\n enabled?: boolean\n}\n\n/**\n * Hook to read protocol fees from the V3 Orchestrator contract.\n *\n * The V3 Orchestrator charges a protocol fee on intent fulfillment.\n * This hook reads:\n * 1. Orchestrator address from the Escrow contract\n * 2. Protocol fee (as bps or 18-decimal precision)\n * 3. Protocol fee recipient address\n *\n * Fee precision is automatically detected and normalized to basis points.\n *\n * Requires a `ProvexProvider` ancestor.\n *\n * @param params - Hook parameters\n * @returns Protocol fee data and loading state\n *\n * @example\n * ```tsx\n * const { feeInfo, isLoading } = useProtocolFees({\n * chainId: 8453,\n * escrowAddress: '0x2f121CDDCA6d652f35e8B3E560f9760898888888',\n * })\n *\n * if (!isLoading && feeInfo) {\n * console.log(`Protocol fee: ${feeInfo.percentage}`) // \"0%\" or \"2%\"\n * }\n * ```\n */\nexport function useProtocolFees({\n chainId,\n escrowAddress,\n enabled = true,\n}: UseProtocolFeesParams): ProtocolFeesResult {\n // Step 1: Read orchestrator address from escrow\n const {\n data: orchestratorAddress,\n isLoading: isLoadingOrchestrator,\n isError: isErrorOrchestrator,\n error: errorOrchestrator,\n refetch: refetchOrchestrator,\n } = useOrchestratorAddress({\n escrowAddress,\n chainId,\n enabled,\n })\n\n // Step 2: Read protocolFee and protocolFeeRecipient from orchestrator\n const {\n data: feeData,\n isLoading: isLoadingFees,\n isError: isErrorFees,\n error: errorFees,\n refetch: refetchFees,\n } = useContractReads({\n contracts: [\n {\n address: orchestratorAddress,\n abi: OrchestratorAbi,\n functionName: 'protocolFee',\n chainId,\n },\n {\n address: orchestratorAddress,\n abi: OrchestratorAbi,\n functionName: 'protocolFeeRecipient',\n chainId,\n },\n ],\n query: {\n enabled: enabled && !!orchestratorAddress,\n staleTime: FEE_CACHE_STALE_TIME,\n gcTime: FEE_CACHE_STALE_TIME,\n },\n })\n\n // Extract and normalize fee data\n const protocolFeeRaw = feeData?.[0]?.result as bigint | undefined\n const protocolFeeRecipient = feeData?.[1]?.result as Hex | undefined\n\n // Normalize fee precision (detects bps vs 18-decimal)\n const feeInfo = useMemo(() => {\n if (protocolFeeRaw === undefined) return undefined\n return normalizeFeePrecision(protocolFeeRaw)\n }, [protocolFeeRaw])\n\n // Combined loading/error state\n // Include the gap between orchestrator resolving and fee query starting:\n // orchestrator done + fee data missing + no error = still loading\n const isFeeQueryPending = !!orchestratorAddress && protocolFeeRaw === undefined && !isErrorFees\n const isLoading = isLoadingOrchestrator || isLoadingFees || isFeeQueryPending\n const isError = isErrorOrchestrator || isErrorFees\n const error = errorOrchestrator || errorFees || null\n\n // Combined refetch function\n const refetch = () => {\n refetchOrchestrator()\n refetchFees()\n }\n\n return {\n protocolFeeRaw,\n feeInfo,\n protocolFeeRecipient,\n orchestratorAddress: orchestratorAddress as Hex | undefined,\n isLoading,\n isError,\n error,\n refetch,\n }\n}\n\n/**\n * Simplified hook to get just the protocol fee percentage for a chain.\n *\n * @param params - Hook parameters\n * @returns The fee percentage string (e.g., \"0%\", \"2%\") or undefined if loading\n */\nexport function useProtocolFeePercentage(\n params: UseProtocolFeesParams\n): string | undefined {\n const { feeInfo } = useProtocolFees(params)\n return feeInfo?.percentage\n}\n","/**\n * @fileoverview useProvexBuy — headless state machine for the buy flow.\n *\n * Layer 1 of the 3-layer architecture. Returns all state + actions\n * with zero rendering. The integrator builds their entire UI.\n *\n * @example\n * ```tsx\n * function MyBuyPage() {\n * const buy = useProvexBuy({ wallet })\n *\n * return (\n * <div>\n * <input value={buy.amount} onChange={e => buy.setAmount(e.target.value)} />\n * <button disabled={!buy.canSubmit} onClick={buy.submitOrder}>\n * Buy\n * </button>\n * </div>\n * )\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { Hex } from 'viem'\nimport type { ChainId } from '@provex/utils/chain'\nimport {\n verifiablePaymentMethods,\n providerKeyToContractId,\n type ProviderKey,\n} from '@provex/utils/payment'\nimport { SUPPORTED_CURRENCIES } from '@provex/utils/currencies'\nimport { getDefaultToken, type TokenInfo } from '@provex/utils/tokens'\nimport { parseUnits, formatUnits } from '@provex/utils/units'\nimport { convertCurrencyToTokenOutput } from '@provex/utils/conversionRates'\nimport { DEFAULT_REPUTATION } from '@provex/utils/reputation'\nimport { getLatestContract } from '@provex/utils/contracts'\nimport { useProvex } from './ProvexProvider'\nimport { useDeposits, getRate, type DepositInfo } from './hooks/useDeposits'\nimport { useSignalIntent } from './hooks/useSignalIntent'\nimport { useReputation } from './hooks/useReputation'\nimport { useReputationLimits } from './hooks/useReputationLimits'\nimport { usePayeeDetails } from './hooks/usePayeeDetails'\nimport { useProtocolFees } from './hooks/useProtocolFees'\nimport type {\n BuyPhase,\n UseProvexBuyOptions,\n UseProvexBuyReturn,\n} from './types'\n\n/**\n * Safely parse a user-entered amount string into bigint currency units.\n * Returns null for invalid or empty input.\n */\nfunction parseAmountSafe(value: string, decimals: number): bigint | null {\n if (!value || value === '.' || value === '0.') return null\n try {\n const parsed = parseUnits(value, { decimals })\n return parsed > 0n ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * useProvexBuy — headless buy-flow state machine.\n *\n * Encapsulates all state, derived data, validation, and actions for the\n * 4-phase buy flow. Returns a flat object that phase components (Layer 2)\n * or custom UIs (Layer 1) can consume.\n *\n * Must be called within a `<ProvexProvider>`.\n */\nexport function useProvexBuy({\n wallet,\n onIntentSignaled,\n onComplete,\n paymentMethods: allowedPaymentMethods,\n}: UseProvexBuyOptions): UseProvexBuyReturn {\n const { config } = useProvex()\n\n // ── Core state ──────────────────────────────────────────────────────────\n const [phase, setPhase] = useState<BuyPhase>('browse')\n const [amount, setAmountRaw] = useState('')\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<ProviderKey | ''>('')\n const [selectedDeposit, setSelectedDeposit] = useState<DepositInfo | null>(null)\n const [intentHash, setIntentHash] = useState<Hex | null>(null)\n const [errorMessage, setErrorMessage] = useState<string | null>(null)\n\n // ── Derived config ──────────────────────────────────────────────────────\n const chainId = (config.chain?.id ?? config.chainId) as ChainId\n const token = useMemo(() => getDefaultToken(chainId), [chainId])\n const currency = SUPPORTED_CURRENCIES.USD\n\n const availablePaymentMethods = useMemo(() => {\n const all = verifiablePaymentMethods(chainId)\n if (!allowedPaymentMethods || allowedPaymentMethods.length === 0) return all\n return all.filter(pm => allowedPaymentMethods.includes(pm))\n }, [chainId, allowedPaymentMethods])\n\n const activePaymentMethod = useMemo((): ProviderKey | null => {\n if (selectedPaymentMethod) return selectedPaymentMethod\n return availablePaymentMethods[0] ?? null\n }, [selectedPaymentMethod, availablePaymentMethods])\n\n // ── Protocol hooks ──────────────────────────────────────────────────────\n const depositsResult = useDeposits({\n token: token as TokenInfo,\n paymentMethod: activePaymentMethod as ProviderKey,\n currency,\n })\n\n const { reputation } = useReputation({\n address: wallet.address,\n chainId,\n })\n\n const amountBigInt = useMemo(\n () => parseAmountSafe(amount, currency.decimals),\n [amount, currency.decimals],\n )\n\n const limits = useReputationLimits({\n chainId,\n selectedPaymentMethod: activePaymentMethod as ProviderKey,\n tier: reputation.tier,\n amountInInt: amountBigInt,\n cooldownEndsAt: reputation.cooldownEndsAt,\n })\n\n const signalIntent = useSignalIntent({\n wallet,\n chainId,\n deposit: selectedDeposit,\n onSuccess: (hash) => {\n setIntentHash(hash)\n setPhase('committed')\n onIntentSignaled?.(hash, chainId)\n },\n onFailure: () => {\n setErrorMessage('Order failed. Please try again.')\n },\n refetchDeposits: depositsResult.refetch,\n })\n\n // ── Protocol fees ───────────────────────────────────────────────────────\n const escrowAddress = useMemo(\n () => getLatestContract(chainId, 'escrow') as Hex | null,\n [chainId],\n )\n\n const { feeInfo } = useProtocolFees({\n chainId,\n escrowAddress: escrowAddress ?? ('0x' as Hex),\n enabled: !!escrowAddress,\n })\n\n // ── Payee details + intent lifecycle ───────────────────────────────────\n const payeeResult = usePayeeDetails({\n intentHash,\n chainId,\n })\n\n // Poll intent status every 5s during committed/proving phases\n const refetchAllRef = useRef(payeeResult.refetchAll)\n refetchAllRef.current = payeeResult.refetchAll\n\n useEffect(() => {\n if (phase !== 'committed' && phase !== 'proving') return\n if (!intentHash) return\n\n const interval = setInterval(() => {\n refetchAllRef.current()\n }, 5000)\n return () => clearInterval(interval)\n }, [phase, intentHash])\n\n // Auto-transition: fulfilled → complete\n useEffect(() => {\n if (!payeeResult.isFulfilled) return\n if (phase === 'complete') return\n setPhase('complete')\n if (intentHash) onComplete?.(intentHash, chainId)\n }, [payeeResult.isFulfilled, phase, intentHash, chainId, onComplete])\n\n // Auto-transition: pruned → browse with error\n useEffect(() => {\n if (!payeeResult.isPruned) return\n if (phase === 'browse') return\n setErrorMessage('Order expired. Please try again.')\n setPhase('browse')\n }, [payeeResult.isPruned, phase])\n\n // Intent expiry time\n const intentExpiryTime = useMemo(() => {\n if (!payeeResult.expiryTime) return null\n return new Date(Number(payeeResult.expiryTime) * 1000)\n }, [payeeResult.expiryTime])\n\n // ── Computed values ─────────────────────────────────────────────────────\n const matchableDeposits = useMemo(() => {\n if (!amountBigInt) return []\n return depositsResult.getMatchableDeposits(amountBigInt)\n }, [amountBigInt, depositsResult])\n\n const bestDeposit = matchableDeposits[0] ?? null\n\n const bestRate = useMemo(() => {\n if (!bestDeposit || !activePaymentMethod) return null\n const r = getRate({ deposit: bestDeposit, paymentMethod: activePaymentMethod, currency })\n return r === 0n ? null : r\n }, [bestDeposit, activePaymentMethod, currency])\n\n const tokenAmount = useMemo(() => {\n if (!amountBigInt || !bestRate || !token) return null\n return convertCurrencyToTokenOutput({\n token,\n currency,\n currencyAmountInt: amountBigInt,\n rate: bestRate,\n })\n }, [amountBigInt, bestRate, token, currency])\n\n const rateDisplay = useMemo(() => {\n if (!bestRate || !token) return null\n const rateFloat = Number(bestRate) / 1e18\n return `1 ${token.symbol} = ${currency.symbol}${rateFloat.toFixed(currency.decimals)}`\n }, [bestRate, token, currency])\n\n const tokenAmountDisplay = useMemo(() => {\n if (!tokenAmount || !token) return null\n return formatUnits(tokenAmount, { decimals: token.decimals })\n }, [tokenAmount, token])\n\n // ── Validation ──────────────────────────────────────────────────────────\n const canSubmit = useMemo(() => {\n if (!wallet.address) return false\n if (!activePaymentMethod) return false\n if (!amountBigInt || amountBigInt <= 0n) return false\n if (!bestDeposit) return false\n if (limits.isOnCooldown) return false\n if (limits.amountExceedsCap) return false\n if (signalIntent.isLoading) return false\n return true\n }, [wallet.address, activePaymentMethod, amountBigInt, bestDeposit, limits, signalIntent.isLoading])\n\n const validationMessage = useMemo((): string | null => {\n if (!wallet.address) return 'Connect your wallet to continue'\n if (!activePaymentMethod) return 'Select a payment method'\n if (!amount) return null\n if (!amountBigInt || amountBigInt <= 0n) return 'Enter a valid amount'\n if (limits.isOnCooldown && limits.cooldownRemaining) {\n return `Cooldown active: ${limits.cooldownRemaining} remaining`\n }\n if (limits.capExceededMessage) return limits.capExceededMessage\n if (depositsResult.isLoading) return 'Loading available orders...'\n if (!bestDeposit && amount) return 'No orders available for this amount'\n return null\n }, [wallet.address, activePaymentMethod, amount, amountBigInt, limits, depositsResult.isLoading, bestDeposit])\n\n // ── Actions ─────────────────────────────────────────────────────────────\n const setAmount = useCallback((value: string) => {\n // Allow only digits and a single decimal point\n if (value === '' || /^\\d*\\.?\\d*$/.test(value)) {\n setAmountRaw(value)\n setErrorMessage(null)\n }\n }, [])\n\n const selectDeposit = useCallback((deposit: DepositInfo) => {\n setSelectedDeposit(deposit)\n }, [])\n\n const submitOrder = useCallback(async () => {\n if (!canSubmit || !bestDeposit || !tokenAmount || !activePaymentMethod || !wallet.address) return\n\n setSelectedDeposit(bestDeposit)\n setErrorMessage(null)\n\n const paymentMethodContractId = providerKeyToContractId(activePaymentMethod) as Hex\n\n await signalIntent.startOrder({\n paymentMethod: paymentMethodContractId,\n depositId: bestDeposit.localId,\n tokenAmount,\n toAddress: wallet.address,\n fiatCurrencyCode: currency.contractId as Hex,\n conversionRate: bestRate as bigint,\n })\n }, [canSubmit, bestDeposit, tokenAmount, activePaymentMethod, wallet.address, signalIntent, currency.contractId, bestRate])\n\n const confirmPayment = useCallback(() => {\n setPhase('proving')\n }, [])\n\n const reset = useCallback(() => {\n setPhase('browse')\n setAmountRaw('')\n setSelectedPaymentMethod('')\n setSelectedDeposit(null)\n setIntentHash(null)\n setErrorMessage(null)\n }, [])\n\n // ── Return ──────────────────────────────────────────────────────────────\n return {\n phase,\n\n amount,\n setAmount,\n selectedPaymentMethod,\n setSelectedPaymentMethod,\n availablePaymentMethods,\n\n deposits: depositsResult.deposits,\n selectedDeposit,\n selectDeposit,\n isLoadingDeposits: depositsResult.isLoading,\n\n rate: bestRate,\n rateDisplay,\n tokenAmount,\n tokenAmountDisplay,\n token,\n currency,\n\n reputation: reputation ?? DEFAULT_REPUTATION,\n limits,\n\n feePercentage: feeInfo?.percentage ?? null,\n\n payeeDetails: payeeResult.payeeDetails,\n payeeName: payeeResult.payeeDetails?.name ?? null,\n payeeId: payeeResult.payeeDetails?.payeeId ?? null,\n isPayeeLoading: payeeResult.isFetching,\n\n intentExpiryTime,\n isIntentExpired: payeeResult.isPruned,\n indexedIntentStatus: payeeResult.intentStatus,\n\n canSubmit,\n validationMessage,\n\n submitOrder,\n confirmPayment,\n reset,\n\n intentHash,\n intentStatus: signalIntent.status,\n intentError: errorMessage ?? signalIntent.message,\n isSubmitting: signalIntent.isLoading,\n\n chainId,\n }\n}\n","/**\n * @fileoverview ProvexBuyContext — React context for the buy-flow state machine.\n *\n * Layer 2 of the 3-layer architecture. Wraps `useProvexBuy()` in a context\n * so that individual phase sub-components can read from it without prop drilling.\n *\n * @example\n * ```tsx\n * <ProvexBuyProvider wallet={wallet} onComplete={handleDone}>\n * <BrowsePhase />\n * <CommittedPhase />\n * <ProvingPhase />\n * <CompletePhase />\n * </ProvexBuyProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { useProvexBuy } from './useProvexBuy'\nimport type { UseProvexBuyOptions, UseProvexBuyReturn } from './types'\n\nconst ProvexBuyContext = createContext<UseProvexBuyReturn | null>(null)\n\n/**\n * useProvexBuyContext — access the buy-flow state machine from within\n * a `<ProvexBuyProvider>`.\n *\n * Throws if called outside the provider.\n */\nexport function useProvexBuyContext(): UseProvexBuyReturn {\n const ctx = useContext(ProvexBuyContext)\n if (!ctx) {\n throw new Error(\n 'useProvexBuyContext must be used within a <ProvexBuyProvider>. ' +\n 'Wrap your component tree with <ProvexBuyProvider> or use useProvexBuy() directly.',\n )\n }\n return ctx\n}\n\n/** Props for the ProvexBuyProvider component. */\nexport interface ProvexBuyProviderProps extends UseProvexBuyOptions {\n /** Child components that consume the buy-flow context. */\n children: React.ReactNode\n}\n\n/**\n * ProvexBuyProvider — context provider that runs the buy-flow state machine\n * and makes it available to child phase components via `useProvexBuyContext()`.\n */\nexport function ProvexBuyProvider({\n children,\n ...options\n}: ProvexBuyProviderProps) {\n const buy = useProvexBuy(options)\n\n return (\n <ProvexBuyContext.Provider value={buy}>\n {children}\n </ProvexBuyContext.Provider>\n )\n}\n","/**\n * @fileoverview BrowsePhase — headless browse/input phase component.\n *\n * Renders the payment method selector, amount input, rate display, and buy\n * button using plain HTML with `data-provex-*` attributes.\n *\n * Only renders when the buy-flow phase is 'browse'.\n * Accepts an optional `render` prop for full customization.\n */\n\nimport { getPaymentMethodName } from '@provex/utils/payment'\nimport { useProvexBuyContext } from '../ProvexBuyContext'\nimport type { PhaseRenderProps, UseProvexBuyReturn } from '../types'\n\n/** State slice exposed to the BrowsePhase render prop. */\nexport interface BrowsePhaseState {\n amount: UseProvexBuyReturn['amount']\n setAmount: UseProvexBuyReturn['setAmount']\n selectedPaymentMethod: UseProvexBuyReturn['selectedPaymentMethod']\n setSelectedPaymentMethod: UseProvexBuyReturn['setSelectedPaymentMethod']\n availablePaymentMethods: UseProvexBuyReturn['availablePaymentMethods']\n chainId: UseProvexBuyReturn['chainId']\n rateDisplay: UseProvexBuyReturn['rateDisplay']\n tokenAmountDisplay: UseProvexBuyReturn['tokenAmountDisplay']\n token: UseProvexBuyReturn['token']\n currency: UseProvexBuyReturn['currency']\n canSubmit: UseProvexBuyReturn['canSubmit']\n isSubmitting: UseProvexBuyReturn['isSubmitting']\n validationMessage: UseProvexBuyReturn['validationMessage']\n intentError: UseProvexBuyReturn['intentError']\n intentStatus: UseProvexBuyReturn['intentStatus']\n isLoadingDeposits: UseProvexBuyReturn['isLoadingDeposits']\n deposits: UseProvexBuyReturn['deposits']\n submitOrder: UseProvexBuyReturn['submitOrder']\n}\n\n/** Status messages for each signal intent status. */\nconst STATUS_MESSAGES: Record<string, string> = {\n input: '',\n loading_payee: 'Loading payment details...',\n loading_intent: 'Requesting signature...',\n loading_orchestrator: 'Loading orchestrator...',\n prompt_wallet_confirm: 'Confirm in your wallet...',\n writing_intent: 'Submitting transaction...',\n success: 'Order placed successfully!',\n error: 'Something went wrong.',\n}\n\n/**\n * BrowsePhase — renders the browse/input phase of the buy flow.\n *\n * Reads state from ProvexBuyContext. Only renders when phase === 'browse'.\n */\nexport function BrowsePhase({\n className,\n style,\n render,\n}: PhaseRenderProps<BrowsePhaseState>) {\n const ctx = useProvexBuyContext()\n\n if (ctx.phase !== 'browse') return null\n\n const state: BrowsePhaseState = {\n amount: ctx.amount,\n setAmount: ctx.setAmount,\n selectedPaymentMethod: ctx.selectedPaymentMethod,\n setSelectedPaymentMethod: ctx.setSelectedPaymentMethod,\n availablePaymentMethods: ctx.availablePaymentMethods,\n chainId: ctx.chainId,\n rateDisplay: ctx.rateDisplay,\n tokenAmountDisplay: ctx.tokenAmountDisplay,\n token: ctx.token,\n currency: ctx.currency,\n canSubmit: ctx.canSubmit,\n isSubmitting: ctx.isSubmitting,\n validationMessage: ctx.validationMessage,\n intentError: ctx.intentError,\n intentStatus: ctx.intentStatus,\n isLoadingDeposits: ctx.isLoadingDeposits,\n deposits: ctx.deposits,\n submitOrder: ctx.submitOrder,\n }\n\n if (render) return <>{render(state)}</>\n\n const tokenSymbol = ctx.token?.symbol ?? 'USDC'\n const matchCount = ctx.deposits.length\n const statusMessage = STATUS_MESSAGES[ctx.intentStatus] ?? ''\n\n return (\n <div\n data-provex-phase=\"browse\"\n data-provex-section=\"browse\"\n className={className}\n style={style}\n >\n <div data-provex-field=\"payment-method\">\n <label data-provex-label=\"payment-method\" htmlFor=\"provex-payment-method\">\n Payment Method\n </label>\n <select\n data-provex-select=\"payment-method\"\n id=\"provex-payment-method\"\n value={ctx.selectedPaymentMethod || (ctx.availablePaymentMethods[0] ?? '')}\n onChange={(e) => ctx.setSelectedPaymentMethod(e.target.value as never)}\n >\n {ctx.availablePaymentMethods.map((pm) => (\n <option key={pm} value={pm}>\n {getPaymentMethodName(ctx.chainId, pm)}\n </option>\n ))}\n </select>\n </div>\n\n <div data-provex-field=\"amount\">\n <label data-provex-label=\"amount\" htmlFor=\"provex-amount\">\n Amount ({ctx.currency?.ticker ?? 'USD'})\n </label>\n <div data-provex-input-group=\"amount\">\n <span data-provex-input-prefix=\"\">{ctx.currency?.symbol ?? '$'}</span>\n <input\n data-provex-input=\"amount\"\n id=\"provex-amount\"\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"0.00\"\n value={ctx.amount}\n onChange={(e) => ctx.setAmount(e.target.value)}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n {ctx.rateDisplay && (\n <div data-provex-info=\"rate\">\n <span data-provex-label=\"rate\">Rate</span>\n <span data-provex-value=\"rate\">{ctx.rateDisplay}</span>\n </div>\n )}\n\n {ctx.tokenAmountDisplay && (\n <div data-provex-info=\"receive\">\n <span data-provex-label=\"receive\">You receive</span>\n <span data-provex-value=\"receive\">\n {ctx.tokenAmountDisplay} {tokenSymbol}\n </span>\n </div>\n )}\n\n {ctx.isLoadingDeposits && ctx.amount && (\n <div data-provex-info=\"loading\">\n <span data-provex-status=\"loading\">Searching for orders...</span>\n </div>\n )}\n\n {!ctx.isLoadingDeposits && ctx.amount && matchCount > 0 && (\n <div data-provex-info=\"match-count\">\n <span data-provex-value=\"match-count\">\n {matchCount} order{matchCount !== 1 ? 's' : ''} available\n </span>\n </div>\n )}\n\n {ctx.validationMessage && (\n <p data-provex-message=\"validation\">{ctx.validationMessage}</p>\n )}\n\n {ctx.intentError && (\n <p data-provex-message=\"error\">{ctx.intentError}</p>\n )}\n\n {ctx.isSubmitting && statusMessage && (\n <p data-provex-message=\"status\">{statusMessage}</p>\n )}\n\n <button\n data-provex-button=\"buy\"\n type=\"button\"\n disabled={!ctx.canSubmit}\n onClick={ctx.submitOrder}\n >\n {ctx.isSubmitting ? 'Processing...' : 'Buy'}\n </button>\n </div>\n )\n}\n","/**\n * @fileoverview CommittedPhase — headless committed/payment-pending phase.\n *\n * Renders the order summary, payment instructions, and \"I have paid\" button\n * using plain HTML with `data-provex-*` attributes.\n *\n * Only renders when the buy-flow phase is 'committed'.\n * Accepts an optional `render` prop for full customization.\n */\n\nimport { getPaymentMethodName } from '@provex/utils/payment'\nimport { useProvexBuyContext } from '../ProvexBuyContext'\nimport type { PhaseRenderProps, UseProvexBuyReturn } from '../types'\n\n/** State slice exposed to the CommittedPhase render prop. */\nexport interface CommittedPhaseState {\n intentHash: UseProvexBuyReturn['intentHash']\n amount: UseProvexBuyReturn['amount']\n currency: UseProvexBuyReturn['currency']\n selectedPaymentMethod: UseProvexBuyReturn['selectedPaymentMethod']\n chainId: UseProvexBuyReturn['chainId']\n tokenAmountDisplay: UseProvexBuyReturn['tokenAmountDisplay']\n token: UseProvexBuyReturn['token']\n confirmPayment: UseProvexBuyReturn['confirmPayment']\n payeeDetails: UseProvexBuyReturn['payeeDetails']\n payeeName: UseProvexBuyReturn['payeeName']\n payeeId: UseProvexBuyReturn['payeeId']\n isPayeeLoading: UseProvexBuyReturn['isPayeeLoading']\n intentExpiryTime: UseProvexBuyReturn['intentExpiryTime']\n}\n\n/**\n * CommittedPhase — renders the committed phase of the buy flow.\n *\n * Shows the order summary and payment instructions after the user has\n * successfully signaled intent on-chain.\n */\nexport function CommittedPhase({\n className,\n style,\n render,\n}: PhaseRenderProps<CommittedPhaseState>) {\n const ctx = useProvexBuyContext()\n\n if (ctx.phase !== 'committed') return null\n\n const state: CommittedPhaseState = {\n intentHash: ctx.intentHash,\n amount: ctx.amount,\n currency: ctx.currency,\n selectedPaymentMethod: ctx.selectedPaymentMethod,\n chainId: ctx.chainId,\n tokenAmountDisplay: ctx.tokenAmountDisplay,\n token: ctx.token,\n confirmPayment: ctx.confirmPayment,\n payeeDetails: ctx.payeeDetails,\n payeeName: ctx.payeeName,\n payeeId: ctx.payeeId,\n isPayeeLoading: ctx.isPayeeLoading,\n intentExpiryTime: ctx.intentExpiryTime,\n }\n\n if (render) return <>{render(state)}</>\n\n const tokenSymbol = ctx.token?.symbol ?? 'USDC'\n const paymentName = ctx.selectedPaymentMethod\n ? getPaymentMethodName(ctx.chainId, ctx.selectedPaymentMethod)\n : 'Unknown'\n\n return (\n <div\n data-provex-phase=\"committed\"\n data-provex-section=\"committed\"\n className={className}\n style={style}\n >\n <div data-provex-info=\"order-summary\">\n <p data-provex-heading=\"committed\">Order Placed</p>\n\n <div data-provex-detail=\"amount\">\n <span data-provex-label=\"amount\">Amount</span>\n <span data-provex-value=\"amount\">\n {ctx.currency?.symbol}{ctx.amount}\n </span>\n </div>\n\n <div data-provex-detail=\"receive\">\n <span data-provex-label=\"receive\">You receive</span>\n <span data-provex-value=\"receive\">\n {ctx.tokenAmountDisplay} {tokenSymbol}\n </span>\n </div>\n\n <div data-provex-detail=\"payment-method\">\n <span data-provex-label=\"payment-method\">Pay via</span>\n <span data-provex-value=\"payment-method\">{paymentName}</span>\n </div>\n\n {ctx.intentHash && (\n <div data-provex-detail=\"intent-hash\">\n <span data-provex-label=\"intent-hash\">Order ID</span>\n <span data-provex-value=\"intent-hash\" title={ctx.intentHash}>\n {ctx.intentHash.slice(0, 10)}...{ctx.intentHash.slice(-8)}\n </span>\n </div>\n )}\n </div>\n\n {ctx.isPayeeLoading && (\n <div data-provex-info=\"payee-loading\">\n <span data-provex-status=\"loading\">Loading seller details...</span>\n </div>\n )}\n\n {!ctx.isPayeeLoading && ctx.payeeId && (\n <div data-provex-info=\"payee\">\n {ctx.payeeName && (\n <div data-provex-detail=\"payee-name\">\n <span data-provex-label=\"payee-name\">Seller</span>\n <span data-provex-value=\"payee-name\">{ctx.payeeName}</span>\n </div>\n )}\n <div data-provex-detail=\"payee-id\">\n <span data-provex-label=\"payee-id\">Send to</span>\n <span data-provex-value=\"payee-id\">{ctx.payeeId}</span>\n </div>\n </div>\n )}\n\n <div data-provex-info=\"instructions\">\n <p data-provex-text=\"instructions\">\n Send {ctx.currency?.symbol}{ctx.amount} via {paymentName} to the seller,\n then verify your payment to release the {tokenSymbol}.\n </p>\n </div>\n\n <button\n data-provex-button=\"prove\"\n type=\"button\"\n disabled={ctx.isPayeeLoading}\n onClick={ctx.confirmPayment}\n >\n I have paid\n </button>\n </div>\n )\n}\n","/**\n * @fileoverview ProvingPhase — headless proof-generation phase.\n *\n * Renders the ZKP proof generation status using plain HTML with\n * `data-provex-*` attributes.\n *\n * Only renders when the buy-flow phase is 'proving'.\n * Accepts an optional `render` prop for full customization.\n */\n\nimport { useProvexBuyContext } from '../ProvexBuyContext'\nimport type { PhaseRenderProps, UseProvexBuyReturn } from '../types'\n\n/** State slice exposed to the ProvingPhase render prop. */\nexport interface ProvingPhaseState {\n intentHash: UseProvexBuyReturn['intentHash']\n intentExpiryTime: UseProvexBuyReturn['intentExpiryTime']\n isIntentExpired: UseProvexBuyReturn['isIntentExpired']\n indexedIntentStatus: UseProvexBuyReturn['indexedIntentStatus']\n}\n\n/**\n * ProvingPhase — renders the proving phase of the buy flow.\n *\n * Shows the ZKP proof generation progress after the user confirms payment.\n */\nexport function ProvingPhase({\n className,\n style,\n render,\n}: PhaseRenderProps<ProvingPhaseState>) {\n const ctx = useProvexBuyContext()\n\n if (ctx.phase !== 'proving') return null\n\n const state: ProvingPhaseState = {\n intentHash: ctx.intentHash,\n intentExpiryTime: ctx.intentExpiryTime,\n isIntentExpired: ctx.isIntentExpired,\n indexedIntentStatus: ctx.indexedIntentStatus,\n }\n\n if (render) return <>{render(state)}</>\n\n const statusText = ctx.indexedIntentStatus === 'fulfilled'\n ? 'Payment verified!'\n : 'Generating zero-knowledge proof of your payment...'\n\n return (\n <div\n data-provex-phase=\"proving\"\n data-provex-section=\"proving\"\n className={className}\n style={style}\n >\n <p data-provex-heading=\"proving\">Verifying Payment</p>\n <p data-provex-text=\"proving\">{statusText}</p>\n {ctx.intentHash && (\n <div data-provex-detail=\"intent-hash\">\n <span data-provex-label=\"intent-hash\">Order ID</span>\n <span data-provex-value=\"intent-hash\" title={ctx.intentHash}>\n {ctx.intentHash.slice(0, 10)}...{ctx.intentHash.slice(-8)}\n </span>\n </div>\n )}\n <div data-provex-info=\"status\">\n <span data-provex-status={ctx.indexedIntentStatus ?? 'proving'}>\n {ctx.indexedIntentStatus === 'fulfilled' ? 'Complete' : 'Processing...'}\n </span>\n </div>\n </div>\n )\n}\n","/**\n * @fileoverview CompletePhase — headless completion phase.\n *\n * Renders the success message and \"Buy More\" button using plain HTML\n * with `data-provex-*` attributes.\n *\n * Only renders when the buy-flow phase is 'complete'.\n * Accepts an optional `render` prop for full customization.\n */\n\nimport { useProvexBuyContext } from '../ProvexBuyContext'\nimport type { PhaseRenderProps, UseProvexBuyReturn } from '../types'\n\n/** State slice exposed to the CompletePhase render prop. */\nexport interface CompletePhaseState {\n intentHash: UseProvexBuyReturn['intentHash']\n chainId: UseProvexBuyReturn['chainId']\n reset: UseProvexBuyReturn['reset']\n}\n\n/**\n * CompletePhase — renders the completion phase of the buy flow.\n *\n * Shows a success message and a button to start a new purchase.\n */\nexport function CompletePhase({\n className,\n style,\n render,\n}: PhaseRenderProps<CompletePhaseState>) {\n const ctx = useProvexBuyContext()\n\n if (ctx.phase !== 'complete') return null\n\n const state: CompletePhaseState = {\n intentHash: ctx.intentHash,\n chainId: ctx.chainId,\n reset: ctx.reset,\n }\n\n if (render) return <>{render(state)}</>\n\n return (\n <div\n data-provex-phase=\"complete\"\n data-provex-section=\"complete\"\n className={className}\n style={style}\n >\n <p data-provex-heading=\"complete\">Purchase Complete</p>\n <p data-provex-text=\"complete\">\n Your tokens have been released to your wallet.\n </p>\n {ctx.intentHash && (\n <div data-provex-detail=\"intent-hash\">\n <span data-provex-label=\"intent-hash\">Order ID</span>\n <span data-provex-value=\"intent-hash\" title={ctx.intentHash}>\n {ctx.intentHash.slice(0, 10)}...{ctx.intentHash.slice(-8)}\n </span>\n </div>\n )}\n <button\n data-provex-button=\"buy-more\"\n type=\"button\"\n onClick={ctx.reset}\n >\n Buy More\n </button>\n </div>\n )\n}\n","/**\n * @fileoverview ProvexBuy — Layer 3 widget that composes Layers 1 + 2.\n *\n * One component, done. Wraps the buy-flow in a ProvexBuyProvider and\n * renders all four phase sub-components. Accepts an optional `theme`\n * prop to set CSS custom properties on the root element.\n *\n * For more control, use `useProvexBuy()` (Layer 1) or\n * `<ProvexBuyProvider>` + phase components (Layer 2) directly.\n *\n * @example\n * ```tsx\n * <ProvexBuy\n * wallet={walletAdapter}\n * onComplete={(hash, chainId) => console.log('Done!', hash)}\n * />\n * ```\n */\n\nimport React from 'react'\nimport { ProvexBuyProvider, useProvexBuyContext } from './ProvexBuyContext'\nimport { BrowsePhase, CommittedPhase, ProvingPhase, CompletePhase } from './phases'\nimport type { BuyProps, ProvexTheme } from './types'\n\n/**\n * Convert a ProvexTheme object to CSS custom properties.\n *\n * Each key is mapped to `--provex-{key}` (camelCase to kebab-case).\n * Merges with any existing inline styles.\n */\nfunction applyTheme(\n baseStyle: React.CSSProperties | undefined,\n theme: ProvexTheme | undefined,\n): React.CSSProperties | undefined {\n if (!theme) return baseStyle\n\n const vars: Record<string, string> = {}\n const themeEntries: [keyof ProvexTheme, string | undefined][] = [\n ['accent', theme.accent],\n ['background', theme.background],\n ['backgroundCard', theme.backgroundCard],\n ['text', theme.text],\n ['textMuted', theme.textMuted],\n ['border', theme.border],\n ['error', theme.error],\n ['radius', theme.radius],\n ['font', theme.font],\n ]\n\n for (const [key, value] of themeEntries) {\n if (value === undefined) continue\n const kebab = key.replace(/[A-Z]/g, (ch) => `-${ch.toLowerCase()}`)\n vars[`--provex-${kebab}`] = value\n }\n\n if (Object.keys(vars).length === 0) return baseStyle\n\n return { ...baseStyle, ...vars } as React.CSSProperties\n}\n\n/**\n * ProvexBuy — Layer 3 buy-flow widget.\n *\n * Renders a complete 4-phase buy flow (browse -> committed -> proving -> complete)\n * using plain HTML elements with `data-provex-*` attributes for CSS targeting.\n *\n * No UI framework dependencies. All styling via CSS custom properties and data attributes.\n */\nexport function ProvexBuy({\n wallet,\n onIntentSignaled,\n onComplete,\n paymentMethods,\n className,\n style,\n theme,\n}: BuyProps) {\n return (\n <ProvexBuyProvider\n wallet={wallet}\n onIntentSignaled={onIntentSignaled}\n onComplete={onComplete}\n paymentMethods={paymentMethods}\n >\n <ProvexBuyRoot\n className={className}\n style={applyTheme(style, theme)}\n />\n </ProvexBuyProvider>\n )\n}\n\n/**\n * Inner root element that reads phase from context so it can set\n * the `data-provex-phase` attribute on the root container.\n */\nfunction ProvexBuyRoot({\n className,\n style,\n}: {\n className?: string\n style?: React.CSSProperties\n}) {\n const { phase } = useProvexBuyContext()\n\n return (\n <div\n className={className}\n style={style}\n data-provex-root=\"\"\n data-provex-phase={phase}\n >\n <BrowsePhase />\n <CommittedPhase />\n <ProvingPhase />\n <CompletePhase />\n </div>\n )\n}\n"]}
|