@zkp2p/cash 0.1.0-dev.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +40 -31
- package/README.md +69 -30
- package/dist/{chunk-4DRZRWWS.js → chunk-FKVPZVFH.js} +14 -2
- package/dist/chunk-FKVPZVFH.js.map +1 -0
- package/dist/{createCashClient-DpAx9A1A.d.cts → createCashClient-iHuGgjH_.d.cts} +169 -6
- package/dist/{createCashClient-DpAx9A1A.d.ts → createCashClient-iHuGgjH_.d.ts} +169 -6
- package/dist/index.cjs +600 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +801 -55
- package/dist/index.d.ts +801 -55
- package/dist/index.js +592 -30
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +23 -5
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +11 -3
- package/dist/react.d.ts +11 -3
- package/dist/react.js +24 -6
- package/dist/react.js.map +1 -1
- package/dist/tools.cjs +103 -7
- package/dist/tools.cjs.map +1 -1
- package/dist/tools.d.cts +2 -2
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +103 -7
- package/dist/tools.js.map +1 -1
- package/llms.txt +64 -0
- package/package.json +14 -5
- package/skills/peer-cash-integration/SKILL.md +119 -0
- package/dist/chunk-4DRZRWWS.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/marketRate.ts","../src/internal/convert.ts","../src/engine/amounts.ts","../src/engine/orderState.ts","../src/engine/payouts.ts","../src/engine/buyerProfile.ts","../src/engine/resolveDeposit.ts","../src/client/capabilities.ts","../src/client/estimate.ts","../src/client/createCashClient.ts","../src/codecs/schemas.ts","../src/codecs/json.ts"],"names":["base","getCurrencyCodeFromHash","getPaymentMethodsCatalog","currencies","onchainDepositId","escrowArg","withdrawTxHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Peer Cash - market-rate (0% spread) deposit construction.\n *\n * The user sells at the prevailing live Chainlink oracle rate with `spreadBps: 0`.\n * This requires EscrowV2 \"override mode\" (the only `createDeposit` path that can\n * attach an `oracleRateConfig`), so we build the three override arrays ourselves\n * - exactly mirroring the SDK's auto-mode (`data: '0x'`, gating service, payee\n * hash) but injecting the oracle config.\n */\nimport type { Address } from 'viem';\nimport {\n currencyInfo,\n getSpreadOracleConfig,\n getPaymentMethodsCatalog,\n getGatingServiceAddress,\n resolvePaymentMethodHashFromCatalog,\n} from '@zkp2p/sdk';\nimport type {\n Zkp2pClient,\n CurrencyType,\n OracleAdapterOverrides,\n OnchainCurrency,\n DepositVerifierData,\n CreateDepositParamsArg,\n} from '../sdk-types';\nimport {\n BASE_USDC_ADDRESS,\n CASH_RETAIN_ON_EMPTY,\n MARKET_SPREAD_BPS,\n ORACLE_MIN_CONVERSION_RATE_SENTINEL,\n} from './constants';\nimport type { CashDepositInput } from './types';\n\n/**\n * Whether a currency can be priced at the live market rate. Only currencies with\n * a Chainlink feed (`supportsSpreadOracle`) get oracle pricing; others would fall\n * back to a fixed rate, which Peer Cash does not offer.\n */\nexport function isMarketRateSupported(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): boolean {\n return getSpreadOracleConfig(currency, adapters) != null;\n}\n\n/**\n * Build a single oracle-backed currency tuple priced at market (0% spread).\n * Returns `null` for currencies without a Chainlink feed.\n */\nexport function buildMarketRateCurrencyOverride(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): OnchainCurrency | null {\n const code = currencyInfo[currency]?.currencyCodeHash as `0x${string}` | undefined;\n const oracle = getSpreadOracleConfig(currency, adapters);\n if (!code || !oracle) return null;\n\n return {\n code,\n minConversionRate: ORACLE_MIN_CONVERSION_RATE_SENTINEL,\n oracleRateConfig: {\n adapter: oracle.adapter,\n adapterConfig: oracle.adapterConfig,\n spreadBps: MARKET_SPREAD_BPS,\n maxStaleness: oracle.maxStaleness,\n },\n } as OnchainCurrency;\n}\n\n/**\n * Default per-order range. Allows partial fills down to a small floor while\n * letting a single buyer take the whole deposit. Never forces `min == max`\n * unless the deposit itself is below the floor (which would otherwise starve\n * matching). Contract invariants: `min != 0`, `min <= max`, `amount >= min`.\n */\nconst DEFAULT_MIN_ORDER_FLOOR = 1_000_000n; // 1 USDC\n\nexport function buildIntentAmountRange(amount: bigint): { min: bigint; max: bigint } {\n if (amount <= 0n) throw new Error('Cash-out amount must be positive');\n const min = amount < DEFAULT_MIN_ORDER_FLOOR ? amount : DEFAULT_MIN_ORDER_FLOOR;\n return { min, max: amount };\n}\n\n/**\n * Prepare the full `createDeposit` params for a market-rate cash-out.\n *\n * Registers payee details with the curator (no auth), resolves payment-method\n * hashes + the gating service from the catalog, and assembles the override\n * arrays with `spreadBps: 0` oracle configs. Throws if any payout currency lacks\n * a live oracle feed (Peer Cash is market-rate only).\n */\nexport async function prepareCashDepositParams(\n client: Zkp2pClient,\n input: CashDepositInput,\n adapters?: OracleAdapterOverrides,\n): Promise<CreateDepositParamsArg> {\n const { payouts } = input;\n if (!payouts.length) throw new Error('At least one payout is required');\n\n const chainId = client.chainId;\n const runtimeEnv = client.runtimeEnv;\n const catalog = getPaymentMethodsCatalog(chainId, runtimeEnv);\n const intentGatingService = getGatingServiceAddress(chainId, runtimeEnv) as Address;\n\n // Validate every currency is oracle-priceable before any network call.\n for (const payout of payouts) {\n if (!isMarketRateSupported(payout.currency, adapters)) {\n throw new Error(\n `${payout.currency} has no live market-rate oracle feed; Peer Cash supports market-rate currencies only.`,\n );\n }\n }\n\n const processorNames = payouts.map((p) => p.processorName);\n\n // Register payee details with the curator to obtain on-chain payee hashes.\n const { hashedOnchainIds } = await client.registerPayeeDetails({\n processorNames,\n payeeData: payouts.map((p) => p.payeeData),\n });\n if (hashedOnchainIds.length !== payouts.length) {\n throw new Error('Payee registration returned an unexpected number of hashes');\n }\n\n const paymentMethodsOverride = processorNames.map((name) =>\n resolvePaymentMethodHashFromCatalog(name, catalog),\n );\n\n const paymentMethodDataOverride: DepositVerifierData[] = hashedOnchainIds.map((hid) => ({\n intentGatingService,\n payeeDetails: hid,\n data: '0x',\n }));\n\n const currenciesOverride: OnchainCurrency[][] = payouts.map((p) => {\n const tuple = buildMarketRateCurrencyOverride(p.currency, adapters);\n if (!tuple) throw new Error(`Failed to build market-rate config for ${p.currency}`);\n return [tuple];\n });\n\n // `conversionRates` is required for the length/shape check but is unused in\n // override mode - the on-chain tuple comes from `currenciesOverride`.\n const conversionRates = payouts.map((p) => [\n { currency: p.currency, conversionRate: ORACLE_MIN_CONVERSION_RATE_SENTINEL.toString() },\n ]);\n\n const intentAmountRange = input.intentAmountRange ?? buildIntentAmountRange(input.amount);\n\n return {\n token: (input.token ?? BASE_USDC_ADDRESS) as Address,\n amount: input.amount,\n intentAmountRange,\n processorNames,\n conversionRates,\n paymentMethodsOverride,\n paymentMethodDataOverride,\n currenciesOverride,\n retainOnEmpty: CASH_RETAIN_ON_EMPTY,\n } as CreateDepositParamsArg;\n}\n","/**\n * Coercion helpers for raw indexer values (string | number | null | missing).\n * Internal - not part of the public API.\n */\n\n/** Coerce to bigint, treating null/undefined/empty/malformed as 0n. */\nexport function toBigInt(value: unknown): bigint {\n return toBigIntOrUndefined(value) ?? 0n;\n}\n\n/** Coerce to bigint, or undefined when absent/malformed (caller decides the fallback). */\nexport function toBigIntOrUndefined(value: unknown): bigint | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n try {\n return BigInt(typeof value === 'number' ? Math.trunc(value) : String(value));\n } catch {\n return undefined;\n }\n}\n","import { USDC_DECIMALS } from './constants';\n\n/**\n * Convert a human USDC amount to base units (6 decimals).\n *\n * @example\n * usdc(1000) // 1_000_000_000n\n * usdc('12.34') // 12_340_000n\n */\nexport function usdc(amount: number | string): bigint {\n const text = typeof amount === 'number' ? amount.toString() : amount.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(text)) {\n throw new Error(`Invalid USDC amount: '${amount}'`);\n }\n const [whole = '0', frac = ''] = text.split('.');\n if (frac.length > USDC_DECIMALS) {\n throw new Error(`USDC has ${USDC_DECIMALS} decimals; '${amount}' has too many`);\n }\n return (\n BigInt(whole) * 10n ** BigInt(USDC_DECIMALS) + BigInt(frac.padEnd(USDC_DECIMALS, '0') || '0')\n );\n}\n\n/** Format USDC base units back to a decimal string (no trailing zeros). */\nexport function formatUsdc(amount: bigint): string {\n const negative = amount < 0n;\n const abs = negative ? -amount : amount;\n const whole = abs / 10n ** BigInt(USDC_DECIMALS);\n const frac = (abs % 10n ** BigInt(USDC_DECIMALS)).toString().padStart(USDC_DECIMALS, '0');\n const trimmed = frac.replace(/0+$/, '');\n return `${negative ? '-' : ''}${whole}${trimmed ? `.${trimmed}` : ''}`;\n}\n\n/** Protocol rate precision - conversion rates are fiat-per-USDC scaled by 1e18. */\nexport const RATE_PRECISION = 10n ** 18n;\n\n/**\n * Fiat owed for a USDC amount at a locked 1e18 conversion rate, in fiat base\n * units (6 decimals), rounded UP to the nearest cent - the same math the\n * protocol clients use, so the number matches what the buyer is told to pay.\n */\nexport function fiatFromUsdc(amount: bigint, conversionRate: bigint): bigint {\n const raw = (amount * conversionRate) / RATE_PRECISION;\n const penny = 10n ** BigInt(USDC_DECIMALS - 2);\n const remainder = raw % penny;\n return remainder > 0n ? raw - remainder + penny : raw;\n}\n\n/** Decode a 1e18 conversion rate to a plain number (fiat per USDC). */\nexport function rateToNumber(conversionRate: bigint): number {\n return Number(conversionRate) / 1e18;\n}\n\n/** Decode fiat base units (6 decimals) to a plain number. */\nexport function fiatToNumber(fiat: bigint): number {\n return Number(fiat) / 10 ** USDC_DECIMALS;\n}\n\n/** Decode fiat cents (verified `paymentAmount` precision) to a plain number. */\nexport function centsToNumber(cents: bigint): number {\n return Number(cents) / 100;\n}\n","/**\n * Peer Cash - pure order-state derivation.\n *\n * The indexer's Deposit entity has NO `amount` field; the real numbers live in\n * `remainingDeposits`, `outstandingIntentAmount`, `totalAmountTaken`,\n * `totalWithdrawn` plus intent counts and `status`. We derive both the order's\n * size (original = remaining + outstanding + taken + withdrawn) and its\n * signal-backed state from those aggregates, using the fetched intents (when\n * present) for buyer/fill detail. Every state maps to a real on-chain signal.\n */\nimport { getCurrencyCodeFromHash } from '@zkp2p/sdk';\nimport type { IntentEntity, IntentStatus } from '../sdk-types';\nimport { toBigInt, toBigIntOrUndefined } from '../internal/convert';\nimport { centsToNumber, fiatFromUsdc, fiatToNumber, formatUsdc, rateToNumber } from './amounts';\nimport type { CashFill, CashNextAction, CashOrder, CashOrderState, CashPayoutInfo } from './types';\n\n/** Below this (USDC base units) a leftover balance is treated as dust, not \"available\". */\nconst DUST_THRESHOLD = 10_000n; // $0.01\n\ninterface IntentLike {\n intentHash: string;\n status: IntentStatus;\n amount?: string | number | bigint | null;\n owner?: string | null;\n fiatCurrency?: string | null;\n conversionRate?: string | number | bigint | null;\n isExpired?: boolean | null;\n paymentAmount?: string | number | bigint | null;\n paymentCurrency?: string | null;\n paymentTimestamp?: string | number | null;\n paymentId?: string | null;\n releasedAmount?: string | number | bigint | null;\n signalTimestamp?: string | number | null;\n expiryTime?: string | number | null;\n fulfillTimestamp?: string | number | null;\n prunedTimestamp?: string | number | null;\n pruneTimestamp?: string | number | null;\n}\n\nfunction toUnixSeconds(value: unknown): number | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\nconst FULFILLED_STATUSES: ReadonlySet<IntentStatus> = new Set<IntentStatus>([\n 'FULFILLED',\n 'MANUALLY_RELEASED',\n]);\n\nfunction toFill(intent: IntentLike): CashFill {\n const signaledAt = toUnixSeconds(intent.signalTimestamp);\n const expiresAt = toUnixSeconds(intent.expiryTime);\n const fulfilledAt = toUnixSeconds(intent.fulfillTimestamp);\n const prunedAt = toUnixSeconds(intent.prunedTimestamp ?? intent.pruneTimestamp);\n const paidAt = toUnixSeconds(intent.paymentTimestamp);\n\n const amount = toBigInt(intent.amount);\n const conversionRate = toBigIntOrUndefined(intent.conversionRate);\n const currency =\n intent.fiatCurrency != null ? getCurrencyCodeFromHash(intent.fiatCurrency) : undefined;\n const paidCurrency =\n intent.paymentCurrency != null ? getCurrencyCodeFromHash(intent.paymentCurrency) : undefined;\n // Verified fiat paid arrives in cents from the payment proof.\n const paymentCents = toBigIntOrUndefined(intent.paymentAmount);\n const releasedAmount = toBigIntOrUndefined(intent.releasedAmount);\n const fillLatencySeconds =\n signaledAt !== undefined && fulfilledAt !== undefined && fulfilledAt >= signaledAt\n ? fulfilledAt - signaledAt\n : undefined;\n\n return {\n intentHash: intent.intentHash,\n status: intent.status,\n amount,\n buyer: (intent.owner ?? '').toLowerCase(),\n ...(currency !== undefined ? { currency } : {}),\n ...(intent.fiatCurrency != null ? { currencyHash: intent.fiatCurrency } : {}),\n ...(conversionRate !== undefined && conversionRate > 0n\n ? {\n conversionRate,\n rate: rateToNumber(conversionRate),\n fiatOwed: fiatToNumber(fiatFromUsdc(amount, conversionRate)),\n }\n : {}),\n ...(paymentCents !== undefined && paymentCents > 0n\n ? { fiatPaid: centsToNumber(paymentCents) }\n : {}),\n ...(paidCurrency !== undefined ? { paidCurrency } : {}),\n ...(intent.paymentId != null && intent.paymentId !== '' ? { paymentId: intent.paymentId } : {}),\n ...(paidAt !== undefined ? { paidAt } : {}),\n ...(releasedAmount !== undefined && releasedAmount > 0n ? { releasedAmount } : {}),\n ...(fillLatencySeconds !== undefined ? { fillLatencySeconds } : {}),\n ...(intent.isExpired != null ? { isExpired: intent.isExpired } : {}),\n ...(signaledAt !== undefined ? { signaledAt } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(fulfilledAt !== undefined ? { fulfilledAt } : {}),\n ...(prunedAt !== undefined ? { prunedAt } : {}),\n };\n}\n\n/**\n * Whether a signaled fill can still be completed by its buyer. Uses the\n * indexer's reconciler flag when present, belt-and-braces with the local\n * clock (the reconciler can lag; the clock can skew - either signal counts).\n */\nexport function isFillLive(fill: CashFill, nowSeconds: number): boolean {\n if (fill.status !== 'SIGNALED') return false;\n if (fill.isExpired === true) return false;\n return fill.expiresAt === undefined || fill.expiresAt > nowSeconds;\n}\n\nexport interface DeriveCashOrderOptions {\n /** Original deposit amount, when already computed (else derived from the parts below). */\n totalAmount?: bigint;\n /** `remainingDeposits` - currently available, unlocked balance. */\n remainingAmount?: bigint;\n /** `outstandingIntentAmount` - currently locked by an active (SIGNALED) intent. */\n outstandingAmount?: bigint;\n /** `totalAmountTaken` - cumulative amount delivered to buyers (cashed out). */\n takenAmount?: bigint;\n /** `totalWithdrawn` - cumulative amount returned to the maker. */\n withdrawnAmount?: bigint;\n /** Deposit status from the indexer: `ACTIVE` | `CLOSED`. */\n status?: string;\n /** Total intent count from the indexer aggregate. */\n intentCount?: number;\n /** Unix seconds of the deposit's last on-chain change. */\n updatedAt?: number;\n /** Payout legs reconstructed from the deposit relations (see `derivePayouts`). */\n payouts?: CashPayoutInfo[];\n /** Deposit quality signal (basis points) from the indexer aggregate. */\n successRateBps?: number;\n /**\n * Whether per-fill intent detail is present. Defaults to `intents.length > 0`.\n * Pass `false` on list rows (deposits fetched without their intents) so\n * `nextActions` treats a positive outstanding amount as a live lock rather\n * than offering a withdraw that would revert.\n */\n fillsIncluded?: boolean;\n /** Unix seconds \"now\" for expiry-sensitive `nextActions` (defaults to wall clock). */\n nowSeconds?: number;\n}\n\n/** Human dollar string for `explain()` sentences. */\nfunction fmtUsdc(amount: bigint): string {\n return `${formatUsdc(amount)} USDC`;\n}\n\n/** Plain-data view of {@link CashOrder} (everything except the `explain` method). */\nexport type CashOrderData = Omit<CashOrder, 'explain'>;\n\n/**\n * One honest sentence from live data - never a fake countdown. The binding\n * rate resolves at the oracle when a buyer fills, and buyer arrival time is\n * unknowable, so the sentence only ever states what the chain actually shows.\n */\nexport function explainOrder(order: CashOrderData): string {\n switch (order.state) {\n case 'awaiting-buyer':\n return `Your ${fmtUsdc(order.totalAmount)} cash-out is live and waiting for a buyer; you can withdraw it any time before a buyer commits.`;\n case 'matched':\n return `A buyer committed to ${fmtUsdc(order.pendingAmount)} and is sending fiat now; funds release automatically once their payment is proven.`;\n case 'delivering':\n return `${fmtUsdc(order.filledAmount)} of ${fmtUsdc(order.totalAmount)} has been delivered; the rest is ${\n order.pendingAmount > 0n ? 'locked by an active buyer' : 'still waiting for a buyer'\n }.`;\n case 'delivered':\n return `Cash-out complete: ${fmtUsdc(order.filledAmount)} was delivered to ${\n order.fills.filter((f) => f.fulfilledAt !== undefined).length || 'your'\n } buyer fill(s).`;\n case 'returned':\n return order.filledAmount > 0n\n ? `${fmtUsdc(order.filledAmount)} was delivered and the remaining ${fmtUsdc(order.returnedAmount)} was returned to your wallet.`\n : `No buyer delivered; ${fmtUsdc(order.returnedAmount)} was returned to your wallet.`;\n }\n}\n\n/** Attach the `explain()` method to plain order data (used by codecs on parse). */\nexport function withExplain(data: CashOrderData): CashOrder {\n return { ...data, explain: () => explainOrder(data) };\n}\n\n/**\n * What the caller can do next. Withdrawal is legal while no live (unexpired)\n * SIGNALED intent locks the funds - `withdraw()` prunes expired intents first\n * when needed, so an order whose only active intents have expired is\n * withdrawable again.\n *\n * `hasLiveIntent` is resolved by the caller: from per-fill liveness when the\n * intents were fetched, or conservatively from the outstanding aggregate on a\n * list row where fills weren't loaded (assume live → do not tempt a withdraw\n * that would revert).\n */\nfunction deriveNextActions(state: CashOrderState, hasLiveIntent: boolean): CashNextAction[] {\n if (state === 'delivered' || state === 'returned') return [];\n if (state === 'awaiting-buyer') return ['wait', 'withdraw'];\n // matched | delivering - funds are locked while a signaled intent is live.\n return hasLiveIntent ? ['wait'] : ['wait', 'withdraw'];\n}\n\n/**\n * Derive the resumable {@link CashOrder} view for one deposit. Pure and\n * deterministic - safe on every poll, list render, or cold page load.\n */\nexport function deriveCashOrder(\n depositId: string,\n intents: ReadonlyArray<IntentEntity>,\n options: DeriveCashOrderOptions = {},\n): CashOrder {\n const fills = (intents as ReadonlyArray<IntentLike>).map(toFill);\n\n // Prefer indexer aggregates; fall back to summing the fetched intents.\n const taken =\n options.takenAmount ??\n fills.filter((f) => FULFILLED_STATUSES.has(f.status)).reduce((a, f) => a + f.amount, 0n);\n const outstanding =\n options.outstandingAmount ??\n fills.filter((f) => f.status === 'SIGNALED').reduce((a, f) => a + f.amount, 0n);\n const withdrawn = options.withdrawnAmount ?? 0n;\n const remaining = options.remainingAmount ?? 0n;\n\n const total = options.totalAmount ?? remaining + outstanding + taken + withdrawn;\n\n const status = options.status;\n // The indexer's DepositStatus is ACTIVE | CLOSED; a fully-withdrawn deposit\n // is CLOSED (never a 'WITHDRAWN' status - that value exists only on the\n // fund-activity log). 'WITHDRAWN' is tolerated here purely for forward-compat.\n const isTerminal = status === 'CLOSED' || status === 'WITHDRAWN';\n const hasLiveFunds = remaining > DUST_THRESHOLD || outstanding > 0n;\n\n let state: CashOrderState;\n if (outstanding > 0n) {\n // A buyer is signaled right now (funds locked, mid-delivery).\n state = taken > 0n ? 'delivering' : 'matched';\n } else if (taken > 0n && !hasLiveFunds) {\n state = 'delivered';\n } else if (taken > 0n && hasLiveFunds) {\n state = 'delivering';\n } else if (!hasLiveFunds && (withdrawn > 0n || isTerminal)) {\n state = 'returned';\n } else if (hasLiveFunds) {\n state = 'awaiting-buyer';\n } else {\n state = taken > 0n ? 'delivered' : 'returned';\n }\n\n let matchedAt: number | undefined;\n let deliveredAt: number | undefined;\n for (const fill of fills) {\n if (fill.signaledAt && (!matchedAt || fill.signaledAt < matchedAt)) matchedAt = fill.signaledAt;\n if (FULFILLED_STATUSES.has(fill.status) && fill.fulfilledAt) {\n if (!deliveredAt || fill.fulfilledAt > deliveredAt) deliveredAt = fill.fulfilledAt;\n }\n }\n\n const primary =\n fills.find((f) => f.status === 'SIGNALED') ??\n fills.find((f) => FULFILLED_STATUSES.has(f.status)) ??\n fills[0];\n\n const isInFlight = state === 'awaiting-buyer' || state === 'matched' || state === 'delivering';\n const nowSeconds = options.nowSeconds ?? Math.floor(Date.now() / 1000);\n\n // Was fill-level intent detail available? Explicitly signalled by the caller,\n // else inferred from whether any intents were passed. When absent (list rows),\n // a positive `outstanding` is assumed to be a live lock - the conservative,\n // money-safe default for `nextActions`.\n const fillsIncluded = options.fillsIncluded ?? fills.length > 0;\n const hasLiveIntent = fillsIncluded\n ? fills.some((f) => isFillLive(f, nowSeconds))\n : outstanding > 0n;\n\n return withExplain({\n depositId,\n state,\n fills,\n totalAmount: total,\n filledAmount: taken,\n pendingAmount: outstanding,\n returnedAmount: withdrawn,\n nextActions: deriveNextActions(state, hasLiveIntent),\n ...(primary?.intentHash !== undefined ? { primaryIntentHash: primary.intentHash } : {}),\n ...(matchedAt !== undefined ? { matchedAt } : {}),\n ...(deliveredAt !== undefined ? { deliveredAt } : {}),\n ...(options.updatedAt !== undefined ? { updatedAt: options.updatedAt } : {}),\n intentCount: options.intentCount ?? fills.length,\n ...(options.payouts !== undefined ? { payouts: options.payouts } : {}),\n ...(options.successRateBps !== undefined ? { successRateBps: options.successRateBps } : {}),\n isInFlight,\n withdrawn: isTerminal,\n });\n}\n","/**\n * Peer Cash - payout-leg reconstruction from indexed deposit relations.\n *\n * A deposit's payment methods and per-method currency tuples live on-chain as\n * hashes. This decodes them back to human units (platform id, currency code)\n * via the protocol catalogs and surfaces the pricing state - including the\n * verifiable zero-spread invariant every cash order carries.\n */\nimport { getCurrencyCodeFromHash, resolvePaymentMethodNameFromHash } from '@zkp2p/sdk';\nimport type { PaymentMethodCatalog } from '@zkp2p/sdk';\nimport { toBigIntOrUndefined } from '../internal/convert';\nimport { rateToNumber } from './amounts';\nimport type { CashPayoutInfo, CashPayoutPricing } from './types';\n\n/** The raw indexed shape of a deposit's payment method (relation row). */\nexport interface PaymentMethodLike {\n paymentMethodHash?: string | null;\n payeeDetailsHash?: string | null;\n active?: boolean | null;\n}\n\n/** The raw indexed shape of a per-method currency tuple (relation row). */\nexport interface MethodCurrencyLike {\n paymentMethodHash?: string | null;\n currencyCode?: string | null;\n spreadBps?: number | string | null;\n kind?: string | null;\n rateSource?: string | null;\n oracleRate?: string | number | bigint | null;\n lastOracleUpdatedAt?: string | number | null;\n}\n\nconst ORACLE_KINDS = new Set(['oracle_chainlink', 'oracle_pyth']);\n\nfunction toPricing(tuple: MethodCurrencyLike | undefined): CashPayoutPricing {\n if (!tuple) return { marketRate: false };\n\n const spreadBps = tuple.spreadBps != null ? Number(tuple.spreadBps) : undefined;\n const oracleRate = toBigIntOrUndefined(tuple.oracleRate);\n const lastOracleUpdatedAt =\n tuple.lastOracleUpdatedAt != null ? Number(tuple.lastOracleUpdatedAt) : undefined;\n\n return {\n ...(spreadBps !== undefined && Number.isFinite(spreadBps) ? { spreadBps } : {}),\n ...(tuple.kind != null ? { kind: tuple.kind } : {}),\n ...(tuple.rateSource != null ? { rateSource: tuple.rateSource } : {}),\n ...(oracleRate !== undefined && oracleRate > 0n\n ? { oracleRate: rateToNumber(oracleRate) }\n : {}),\n ...(lastOracleUpdatedAt !== undefined && Number.isFinite(lastOracleUpdatedAt)\n ? { lastOracleUpdatedAt }\n : {}),\n marketRate: spreadBps === 0 && tuple.kind != null && ORACLE_KINDS.has(tuple.kind),\n };\n}\n\n/**\n * Decode a deposit's payment methods + currency tuples into payout legs.\n * Pure - the environment arrives via the catalog. One leg per\n * (method, currency) pair; cash orders create exactly one in v1.\n */\nexport function derivePayouts(\n paymentMethods: ReadonlyArray<PaymentMethodLike>,\n currencies: ReadonlyArray<MethodCurrencyLike>,\n catalog: PaymentMethodCatalog,\n): CashPayoutInfo[] {\n return paymentMethods.flatMap((method) => {\n const platformHash = method.paymentMethodHash ?? '';\n if (!platformHash) return [];\n\n let platform: string | undefined;\n try {\n platform = resolvePaymentMethodNameFromHash(platformHash, catalog);\n } catch {\n // Malformed / non-bytes32 hash - keep the raw value, no decoded name.\n platform = undefined;\n }\n const tuples = currencies.filter(\n (c) => (c.paymentMethodHash ?? '').toLowerCase() === platformHash.toLowerCase(),\n );\n const base = {\n ...(platform !== undefined ? { platform } : {}),\n platformHash,\n payeeHash: method.payeeDetailsHash ?? '',\n active: method.active ?? true,\n };\n\n if (tuples.length === 0) return [{ ...base, pricing: toPricing(undefined) }];\n\n return tuples.map((tuple) => {\n const currency =\n tuple.currencyCode != null ? getCurrencyCodeFromHash(tuple.currencyCode) : undefined;\n return {\n ...base,\n ...(currency !== undefined ? { currency } : {}),\n ...(tuple.currencyCode != null ? { currencyHash: tuple.currencyCode } : {}),\n pricing: toPricing(tuple),\n };\n });\n });\n}\n","/**\n * Peer Cash - buyer reputation, derived purely from the buyer's own intent\n * history. The anxious moment in a cash-out is `matched`: a stranger's\n * address is holding your order. This turns that address into a track record.\n */\nimport type { IntentEntity } from '../sdk-types';\nimport type { CashBuyerProfile } from './types';\n\ninterface BuyerIntentLike {\n status?: string | null;\n signalTimestamp?: string | number | null;\n}\n\nfunction toSeconds(value: string | number | null | undefined): number | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\n/** Aggregate a buyer's full intent history into a profile. Pure and deterministic. */\nexport function deriveBuyerProfile(\n address: string,\n intents: ReadonlyArray<IntentEntity>,\n): CashBuyerProfile {\n let fulfilled = 0;\n let pruned = 0;\n let signaled = 0;\n let firstSeenAt: number | undefined;\n let lastSeenAt: number | undefined;\n\n for (const intent of intents as ReadonlyArray<BuyerIntentLike>) {\n const status = intent.status ?? '';\n if (status === 'FULFILLED' || status === 'MANUALLY_RELEASED') fulfilled += 1;\n else if (status === 'PRUNED') pruned += 1;\n else if (status === 'SIGNALED') signaled += 1;\n\n const at = toSeconds(intent.signalTimestamp);\n if (at !== undefined) {\n if (firstSeenAt === undefined || at < firstSeenAt) firstSeenAt = at;\n if (lastSeenAt === undefined || at > lastSeenAt) lastSeenAt = at;\n }\n }\n\n const settled = fulfilled + pruned;\n\n return {\n address: address.toLowerCase(),\n totalIntents: intents.length,\n fulfilled,\n pruned,\n signaled,\n ...(settled > 0 ? { successRateBps: Math.round((fulfilled / settled) * 10_000) } : {}),\n ...(firstSeenAt !== undefined ? { firstSeenAt } : {}),\n ...(lastSeenAt !== undefined ? { lastSeenAt } : {}),\n };\n}\n","/**\n * Peer Cash - resolve the composite deposit id from a `createDeposit` receipt.\n *\n * `createDeposit` returns only a tx hash; the on-chain `depositId` is assigned by\n * the contract and emitted in `DepositReceived` (indexed). We decode it from the\n * receipt logs using the real escrow ABI so the order can be keyed on the\n * composite id (`escrow_onchainId`) the indexer uses.\n */\nimport { parseEventLogs, type Abi, type Log } from 'viem';\nimport { createCompositeDepositId } from '@zkp2p/sdk';\n\nexport interface ResolvedCashDeposit {\n onchainDepositId: bigint;\n escrowAddress: string;\n compositeId: string;\n}\n\nexport function resolveCashDepositId(params: {\n logs: Log[];\n abi: Abi;\n}): ResolvedCashDeposit | null {\n let events: Array<{ address: string; args: Record<string, unknown> }>;\n try {\n events = parseEventLogs({\n abi: params.abi,\n eventName: 'DepositReceived',\n logs: params.logs,\n }) as unknown as Array<{ address: string; args: Record<string, unknown> }>;\n } catch {\n return null;\n }\n\n const event = events[0];\n if (!event) return null;\n\n const rawId = event.args.depositId;\n if (rawId === undefined || rawId === null) return null;\n const onchainDepositId = BigInt(rawId as string | number | bigint);\n // Normalize to the indexer's canonical lowercase form so the escrow address,\n // the composite id, and every subsequent indexer query agree exactly.\n const escrowAddress = event.address.toLowerCase();\n\n return {\n onchainDepositId,\n escrowAddress,\n compositeId: createCompositeDepositId(escrowAddress, onchainDepositId),\n };\n}\n\n/** Split a composite deposit id (`escrow_onchainId`) back into its parts. */\nexport function parseCompositeDepositId(compositeId: string): {\n escrowAddress: string;\n onchainDepositId: bigint;\n} {\n const idx = compositeId.lastIndexOf('_');\n if (idx === -1) {\n // No escrow prefix - treat the whole string as the on-chain id.\n return { escrowAddress: '', onchainDepositId: BigInt(compositeId) };\n }\n const escrowAddress = compositeId.slice(0, idx);\n const onchainDepositId = BigInt(compositeId.slice(idx + 1) || '0');\n return { escrowAddress, onchainDepositId };\n}\n","/**\n * Discovery - sync, static. Platforms × currencies × oracle support × amount\n * bounds × payee format hints, all derivable without a network call.\n */\nimport { getPaymentMethodsCatalog, getCurrencyCodeFromHash } from '@zkp2p/sdk';\nimport type { CurrencyType, RuntimeEnv } from '../sdk-types';\nimport { BASE_CHAIN_ID, BASE_USDC_ADDRESS, USDC_DECIMALS } from '../engine/constants';\nimport { isMarketRateSupported } from '../engine/marketRate';\n\n/** Hard floor: below one cent a deposit is dust and can never fill. */\nexport const MIN_CASHOUT_AMOUNT = 10_000n; // $0.01\n/** Recommended floor: sub-1-USDC deposits force min==max fills and starve matching. */\nexport const RECOMMENDED_MIN_CASHOUT_AMOUNT = 1_000_000n; // 1 USDC\n\n/**\n * Payee handle format hints per platform, for input UX and agent validation.\n * Purely informational - the curator validates authoritatively at registration.\n */\nconst PAYEE_HINTS: Record<string, string> = {\n venmo: 'Venmo username, with or without the leading @ (e.g. @andrew-w)',\n cashapp: 'Cashtag, with or without the leading $ (e.g. $andrew)',\n revolut: 'Revtag (e.g. andrew1abc)',\n wise: 'Wisetag or the email on the Wise account',\n zelle: 'Email address or US phone number enrolled with Zelle',\n paypal: 'PayPal.Me handle or account email',\n mercadopago: 'Mercado Pago alias or CVU',\n monzo: 'Monzo.me username',\n chime: 'ChimeSign (e.g. $andrew)',\n luxon: 'Luxon Pay ID or account email',\n n26: 'MoneyBeam email or phone number',\n};\n\n/**\n * Platforms whose curator payee registration requires a signed maker identity\n * attestation - a bare handle is rejected. The attestation is produced by the\n * ZKP2P app / extension, not this SDK, so a cash-out to these platforms needs\n * the payee registered there first (see `PAYEE_VERIFICATION_REQUIRED`).\n */\nconst IDENTITY_ATTESTATION_PLATFORMS = new Set(['wise', 'paypal']);\n\n/** Whether a platform's curator registration needs a signed identity attestation. */\nexport function platformRequiresIdentityAttestation(platform: string): boolean {\n return IDENTITY_ATTESTATION_PLATFORMS.has(platform);\n}\n\nexport interface CashPlatformCapability {\n /** Platform id, e.g. `'venmo'` - the value `receive.platform` accepts. */\n platform: string;\n /** Market-rate (oracle-priced) currencies this platform can pay out. */\n currencies: CurrencyType[];\n /** Human hint for the payee handle format. */\n payeeHint: string;\n /**\n * When true, registering a payee for this platform requires a signed maker\n * identity attestation the SDK cannot produce - register the payee via the\n * ZKP2P app/extension first. A bare-handle `cashout()` throws\n * `PAYEE_VERIFICATION_REQUIRED`.\n */\n requiresIdentityAttestation: boolean;\n}\n\nexport interface CashCapabilities {\n chainId: number;\n token: { address: string; symbol: 'USDC'; decimals: number };\n environment: RuntimeEnv;\n /** Every payout corridor: platform × oracle-priced currencies. */\n platforms: CashPlatformCapability[];\n /** All oracle-priced (market-rate) currencies across platforms. */\n currencies: CurrencyType[];\n /** Amount bounds in USDC base units. */\n amount: { min: bigint; recommendedMin: bigint; max: null };\n /** Pricing is always the live oracle at fill time - never a committed quote. */\n pricing: { kind: 'oracle-market-rate'; spreadBps: 0 };\n}\n\nexport function buildCapabilities(environment: RuntimeEnv): CashCapabilities {\n const catalog = getPaymentMethodsCatalog(BASE_CHAIN_ID, environment);\n\n const platforms: CashPlatformCapability[] = Object.entries(catalog)\n .map(([platform, entry]) => {\n const currencies = (entry.currencies ?? [])\n .map((hash) => getCurrencyCodeFromHash(hash))\n .filter(\n (code): code is CurrencyType =>\n code != null && isMarketRateSupported(code as CurrencyType),\n );\n return {\n platform,\n currencies: [...new Set(currencies)],\n payeeHint: PAYEE_HINTS[platform] ?? 'Your payment handle for this platform',\n requiresIdentityAttestation: IDENTITY_ATTESTATION_PLATFORMS.has(platform),\n };\n })\n .filter((p) => p.currencies.length > 0)\n .sort((a, b) => a.platform.localeCompare(b.platform));\n\n const currencies = [...new Set(platforms.flatMap((p) => p.currencies))].sort();\n\n return {\n chainId: BASE_CHAIN_ID,\n token: { address: BASE_USDC_ADDRESS, symbol: 'USDC', decimals: USDC_DECIMALS },\n environment,\n platforms,\n currencies,\n amount: { min: MIN_CASHOUT_AMOUNT, recommendedMin: RECOMMENDED_MIN_CASHOUT_AMOUNT, max: null },\n pricing: { kind: 'oracle-market-rate', spreadBps: 0 },\n };\n}\n","/**\n * Estimate - currency + amount only. No payee, no side effects, no expiry,\n * idempotent, cacheable. \"≈ at whatever the oracle says when a buyer fills.\"\n *\n * Reads the same Chainlink feed the protocol prices the deposit against, so\n * there is no external FX dependency. USD is a zero-address passthrough\n * (USDC ≈ USD). The binding rate resolves on-chain at fill time.\n */\nimport type { Address, PublicClient } from 'viem';\nimport { CHAINLINK_ORACLE_FEEDS } from '@zkp2p/sdk';\nimport type { CurrencyType } from '../sdk-types';\nimport { USDC_DECIMALS } from '../engine/constants';\nimport { isMarketRateSupported } from '../engine/marketRate';\nimport { errors } from './errors';\nimport { MIN_CASHOUT_AMOUNT } from './capabilities';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst CHAINLINK_LATEST_ROUND_ABI = [\n {\n name: 'latestRoundData',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n },\n] as const;\n\nexport interface EstimateInput {\n /** Amount to cash out, USDC base units (6 decimals). Use `usdc()` to build it. */\n amount: bigint;\n /** Target fiat currency. */\n currency: CurrencyType;\n}\n\n/**\n * Chainlink feeds should update at least daily; a reading older than this is\n * flagged `stale` so a consumer can warn rather than quote a frozen rate. The\n * on-chain fill enforces the deposit's own `maxStaleness` regardless - this is\n * a display-side signal only.\n */\nconst DEFAULT_MAX_STALENESS_SECONDS = 86_400;\n\nexport interface CashEstimate {\n /** Always `'oracle-estimate'` - there is no committed quote in Peer Cash. */\n kind: 'oracle-estimate';\n currency: CurrencyType;\n /** The input amount, USDC base units. */\n amount: bigint;\n /** Target-currency units per 1 USDC at the time of the read. */\n rate: number;\n /** `amount × rate` in target-currency units. */\n receiveAmount: number;\n /** Unix seconds when the oracle was read. */\n asOf: number;\n /** Unix seconds the Chainlink feed last updated (absent for the USD passthrough). */\n oracleUpdatedAt?: number;\n /** True when the feed reading is older than a day - treat the rate with caution. */\n stale?: boolean;\n}\n\nexport async function readEstimate(\n publicClient: PublicClient,\n input: EstimateInput,\n): Promise<CashEstimate> {\n const { amount, currency } = input;\n if (amount < MIN_CASHOUT_AMOUNT) {\n throw errors.amountBelowMinimum(amount, MIN_CASHOUT_AMOUNT);\n }\n if (!isMarketRateSupported(currency)) {\n throw errors.oracleUnsupportedCurrency(currency);\n }\n\n const feedConfig = CHAINLINK_ORACLE_FEEDS[currency];\n const asOf = Math.floor(Date.now() / 1000);\n\n let rate: number;\n let oracleUpdatedAt: number | undefined;\n if (!feedConfig || feedConfig.feed.toLowerCase() === ZERO_ADDRESS) {\n // USD passthrough - USDC ≈ USD.\n rate = 1;\n } else {\n const result = (await publicClient.readContract({\n address: feedConfig.feed as Address,\n abi: CHAINLINK_LATEST_ROUND_ABI,\n functionName: 'latestRoundData',\n })) as readonly [bigint, bigint, bigint, bigint, bigint];\n\n const answer = Number(result[1]);\n const price = answer / 10 ** feedConfig.decimals;\n if (!Number.isFinite(price) || price <= 0) {\n throw errors.oracleUnsupportedCurrency(currency);\n }\n const updatedAt = Number(result[3]);\n if (Number.isFinite(updatedAt) && updatedAt > 0) oracleUpdatedAt = updatedAt;\n // invert: feed is CCY/USD (USD per CCY) → target per USDC = 1/price.\n // else: feed is USD/CCY (CCY per USD) → target per USDC = price.\n rate = feedConfig.invert ? 1 / price : price;\n }\n\n const stale =\n oracleUpdatedAt !== undefined && asOf - oracleUpdatedAt > DEFAULT_MAX_STALENESS_SECONDS;\n\n return {\n kind: 'oracle-estimate',\n currency,\n amount,\n rate,\n receiveAmount: (Number(amount) / 10 ** USDC_DECIMALS) * rate,\n asOf,\n ...(oracleUpdatedAt !== undefined ? { oracleUpdatedAt } : {}),\n ...(stale ? { stale: true } : {}),\n };\n}\n","/**\n * `createCashClient` - the eight-verb facade over a read-only `Zkp2pClient`.\n *\n * The facade keeps the outward surface tiny (capabilities / estimate / cashout\n * / order / orders / watch / withdraw / topUp) while reusing the published\n * SDK's battle-tested internals. A React app, a Node service, and an AI agent\n * are equal consumers: every mutating verb has an unsigned `prepare` path,\n * every wire type is serializable, and every transaction carries ERC-8021\n * attribution ({@link CASH_ATTRIBUTION_CODE}).\n */\nimport {\n createWalletClient,\n encodeFunctionData,\n http,\n parseAbi,\n type Address,\n type Hash,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { base } from 'viem/chains';\nimport { Zkp2pClient, getPaymentMethodsCatalog, appendAttributionToCalldata } from '@zkp2p/sdk';\nimport type {\n CurrencyType,\n CuratorPayeeDataInput,\n PreparedTransaction,\n RuntimeEnv,\n TxOverrides,\n} from '../sdk-types';\nimport { BASE_CHAIN_ID, BASE_USDC_ADDRESS, CASH_ORDER_STATUSES } from '../engine/constants';\nimport { isMarketRateSupported, prepareCashDepositParams } from '../engine/marketRate';\nimport { deriveCashOrder, isFillLive, type DeriveCashOrderOptions } from '../engine/orderState';\nimport { derivePayouts } from '../engine/payouts';\nimport { deriveBuyerProfile } from '../engine/buyerProfile';\nimport { toBigIntOrUndefined } from '../internal/convert';\nimport { parseCompositeDepositId, resolveCashDepositId } from '../engine/resolveDeposit';\nimport type { CashBuyerProfile, CashDepositInput, CashOrder } from '../engine/types';\nimport {\n buildCapabilities,\n platformRequiresIdentityAttestation,\n MIN_CASHOUT_AMOUNT,\n type CashCapabilities,\n} from './capabilities';\nimport { readEstimate, type CashEstimate, type EstimateInput } from './estimate';\nimport { CashError, errors, isCashError, mapChainError } from './errors';\n\nconst DEFAULT_RPC_URL = 'https://mainnet.base.org';\n\n/**\n * ERC-8021 attribution code stamped on every transaction this package\n * produces (signed and prepare paths, including approves). Integrator codes\n * from `CashClientOptions.referrer` are appended after it; the SDK always\n * appends the Base builder code last.\n */\nexport const CASH_ATTRIBUTION_CODE = 'peer-cash';\n\n/**\n * The SDK selects the indexer from `runtimeEnv` but defaults the curator to\n * production; staging has its own curator deployment (same convention as the\n * first-party clients).\n */\nconst DEFAULT_CURATOR_URLS: Partial<Record<RuntimeEnv, string>> = {\n staging: 'https://api-staging.zkp2p.xyz',\n};\nconst ERC20_APPROVE_ABI = parseAbi([\n 'function approve(address spender, uint256 amount) returns (bool)',\n]);\nconst ERC20_ALLOWANCE_ABI = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n]);\n\nexport interface CashClientOptions {\n /** `'production' | 'preproduction' | 'staging'` - selects contracts, curator, and indexer. */\n environment: RuntimeEnv;\n /** viem transport for RPC reads; defaults to the public Base RPC. */\n transport?: Transport;\n /** Convenience alternative to `transport`. */\n rpcUrl?: string;\n /** Indexer URL override. */\n indexerUrl?: string;\n /** Curator (ZKP2P API) URL override. */\n curatorUrl?: string;\n /** Optional ZKP2P API key. */\n apiKey?: string;\n /**\n * Your own ERC-8021 attribution code(s), appended after\n * {@link CASH_ATTRIBUTION_CODE} on every transaction (e.g. `'acme-app'`).\n */\n referrer?: string | string[];\n}\n\n/** One payout leg: platform + currency + payee handle. */\nexport interface CashLeg {\n /** Platform id from `capabilities()`, e.g. `'venmo'`. */\n platform: string;\n /** Fiat currency to receive. */\n currency: CurrencyType;\n /** Payee details, e.g. `{ offchainId: '@andrew' }`. */\n payee: CuratorPayeeDataInput;\n}\n\nexport interface CashoutInput {\n /** Amount to cash out, USDC base units. Use `usdc()` to build it. */\n amount: bigint;\n /** Where the fiat should arrive. Multi-payout is a deliberate v1 cut. */\n receive: CashLeg;\n /** Per-order min/max override (USDC base units). */\n intentAmountRange?: { min: bigint; max: bigint };\n}\n\nexport interface SignerOptions {\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient;\n}\n\nexport interface WithdrawOptions extends SignerOptions {\n /**\n * Partial amount to withdraw (USDC base units). Only unlocked funds are\n * withdrawable partially - a live buyer intent does not block it. Omit to\n * close the order fully (prunes expired intents first when needed).\n */\n amount?: bigint;\n}\n\nexport interface TopUpResult {\n depositId: string;\n txHash: Hash;\n}\n\nexport type CashPreparedStepKind =\n | 'approve'\n | 'createDeposit'\n | 'pruneExpiredIntents'\n | 'withdrawDeposit'\n | 'removeFunds'\n | 'addFunds';\n\nexport interface CashPreparedStep {\n /** Stable action label for the transaction at the same index in `txs[]`. */\n kind: CashPreparedStepKind;\n /** Human-readable reason to show in approval UIs, logs, or policy reviews. */\n description: string;\n}\n\nexport interface CashoutResult {\n /** Composite deposit id (`escrow_onchainId`) - the resume key. Bind it to your user. */\n depositId: string;\n txHash: Hash;\n escrowAddress: string;\n onchainDepositId: bigint;\n /** Optimistic snapshot (`awaiting-buyer`); poll `order(depositId)` for live state. */\n order: CashOrder;\n}\n\nexport interface PrepareResult {\n /**\n * Unsigned transactions in submission order: `[approve, createDeposit]`.\n * Submit with any signer - agent wallet, AA bundler, server key. Drop the\n * approve when the escrow already has sufficient allowance.\n */\n txs: PreparedTransaction[];\n /** One label per transaction in `txs[]`, same order. */\n steps: CashPreparedStep[];\n /** Curator payee registration output - the payee hashes now live on the deposit params. */\n register: { hashedOnchainIds: string[] };\n}\n\nexport interface WithdrawResult {\n depositId: string;\n /** Present when expired intents had to be pruned before withdrawal. */\n pruneTxHash?: Hash;\n withdrawTxHash: Hash;\n}\n\nexport interface WatchOptions {\n signal?: AbortSignal;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface OrdersOptions {\n /** Only orders still needing attention (`awaiting-buyer` / `matched` / `delivering`). */\n inFlight?: boolean;\n /** Max deposits to scan (default 100). */\n limit?: number;\n}\n\nexport interface CashClient {\n /** 0 - Discovery: sync, static. */\n capabilities(): CashCapabilities;\n /** 1 - Estimate: currency + amount only. No payee, no side effects, no expiry. */\n estimate(input: EstimateInput): Promise<CashEstimate>;\n /** 2 - Cash out: payee registration + deposit params + submission happen here. */\n cashout(input: CashoutInput, opts: SignerOptions): Promise<CashoutResult>;\n /** 2b - Unsigned path: `txs[]` for agent wallets, AA, server keys, policy layers. */\n prepare(input: CashoutInput): Promise<PrepareResult>;\n /** 3 - Observe: resumable from `depositId` alone; no session state anywhere. */\n order(depositId: string): Promise<CashOrder>;\n /**\n * 3b - Observe helper: a buyer's protocol track record from their full\n * intent history. Answers \"who just matched my order?\" during `matched`.\n */\n buyer(address: string): Promise<CashBuyerProfile>;\n /** 4 - List: indexer-native. A cash order IS a deposit; the chain is the database. */\n orders(owner: string, opts?: OrdersOptions): Promise<CashOrder[]>;\n /** 5 - Watch: yields on change; ends at a terminal state, abort, or timeout. */\n watch(depositId: string, opts?: WatchOptions): AsyncGenerator<CashOrder, void, void>;\n /**\n * 6 - Withdraw: ONE unwind verb. With `amount`, withdraws that much of the\n * unlocked balance (partial; a live buyer intent does not block it).\n * Without, closes the order fully - pruning expired intents first when\n * needed.\n */\n withdraw(depositId: string, opts: WithdrawOptions): Promise<WithdrawResult>;\n /**\n * 6b - Unsigned path for the unwind verb (agent surface): the same state\n * checks as `withdraw()`, returning `txs[]` for host-side signing.\n */\n prepareWithdraw(\n depositId: string,\n opts?: { amount?: bigint },\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }>;\n /** 7 - Top up: add USDC to a live order (same payee, same market rate). */\n topUp(depositId: string, amount: bigint, opts: SignerOptions): Promise<TopUpResult>;\n /** 7b - Unsigned path: `[approve, addFunds]` for host-side signing. */\n prepareTopUp(\n depositId: string,\n amount: bigint,\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }>;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n signal?.removeEventListener('abort', done);\n clearTimeout(timer);\n resolve();\n }\n signal?.addEventListener('abort', done, { once: true });\n });\n}\n\nfunction orderFingerprint(order: CashOrder): string {\n return [\n order.state,\n order.filledAmount,\n order.pendingAmount,\n order.returnedAmount,\n order.intentCount ?? 0,\n order.nextActions.join('+'),\n ].join('|');\n}\n\n/**\n * Send a mutating on-chain call, then wait for and verify its receipt.\n * Submission errors are mapped to typed `CashError`s; a reverted receipt\n * throws `TRANSACTION_FAILED` - a mutating verb never reports success for a\n * transaction that did not land, and never leaks a raw RPC error to the caller.\n */\nasync function submitAndConfirm(\n client: Zkp2pClient,\n verb: string,\n send: () => Promise<`0x${string}`>,\n): Promise<Hash> {\n let hash: Hash;\n try {\n hash = (await send()) as Hash;\n } catch (err) {\n throw mapChainError(verb, err);\n }\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(hash);\n return hash;\n}\n\n/** The indexer aggregate fields both deposit queries share. */\ntype DepositAggregates = {\n remainingDeposits?: string | number | null;\n outstandingIntentAmount?: string | number | null;\n totalAmountTaken?: string | number | null;\n totalWithdrawn?: string | number | null;\n status?: string | null;\n totalIntents?: number | null;\n updatedAt?: string | number | null;\n};\n\n/** The indexer aggregate fields both deposit queries share. */\ntype DepositAggregatesWithQuality = DepositAggregates & {\n successRateBps?: number | null;\n};\n\n/** Map raw indexer deposit aggregates to `deriveCashOrder` options. */\nfunction depositOrderOptions(deposit: DepositAggregatesWithQuality): DeriveCashOrderOptions {\n const remaining = toBigIntOrUndefined(deposit.remainingDeposits);\n const outstanding = toBigIntOrUndefined(deposit.outstandingIntentAmount);\n const taken = toBigIntOrUndefined(deposit.totalAmountTaken);\n const withdrawn = toBigIntOrUndefined(deposit.totalWithdrawn);\n const updatedAt = deposit.updatedAt != null ? Number(deposit.updatedAt) : undefined;\n return {\n ...(remaining !== undefined ? { remainingAmount: remaining } : {}),\n ...(outstanding !== undefined ? { outstandingAmount: outstanding } : {}),\n ...(taken !== undefined ? { takenAmount: taken } : {}),\n ...(withdrawn !== undefined ? { withdrawnAmount: withdrawn } : {}),\n ...(deposit.status != null ? { status: deposit.status } : {}),\n ...(deposit.totalIntents != null ? { intentCount: deposit.totalIntents } : {}),\n ...(deposit.successRateBps != null ? { successRateBps: deposit.successRateBps } : {}),\n ...(updatedAt !== undefined && Number.isFinite(updatedAt) ? { updatedAt } : {}),\n };\n}\n\nexport function createCashClient(options: CashClientOptions): CashClient {\n const { environment } = options;\n const transport = options.transport ?? http(options.rpcUrl ?? DEFAULT_RPC_URL);\n\n // ERC-8021: 'peer-cash' first, then integrator codes; the SDK appends the\n // Base builder code last. Applied to every mutating call on both paths.\n const referrerCodes = [\n CASH_ATTRIBUTION_CODE,\n ...(options.referrer === undefined\n ? []\n : Array.isArray(options.referrer)\n ? options.referrer\n : [options.referrer]),\n ];\n const attribution: TxOverrides = { referrer: referrerCodes };\n\n function buildSdkClient(walletClient: WalletClient): Zkp2pClient {\n return new Zkp2pClient({\n walletClient,\n chainId: BASE_CHAIN_ID,\n runtimeEnv: environment,\n rpcTransport: transport,\n ...(options.rpcUrl ? { rpcUrl: options.rpcUrl } : {}),\n ...(options.indexerUrl ? { indexerUrl: options.indexerUrl } : {}),\n ...((options.curatorUrl ?? DEFAULT_CURATOR_URLS[environment])\n ? { baseApiUrl: options.curatorUrl ?? DEFAULT_CURATOR_URLS[environment] }\n : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n });\n }\n\n // Read-only client - indexer, curator registration, oracle reads.\n const readClient = buildSdkClient(createWalletClient({ chain: base, transport }));\n\n // Signing clients are built lazily and cached per WalletClient identity.\n const signingClients = new WeakMap<WalletClient, Zkp2pClient>();\n function signingClient(verb: string, opts?: SignerOptions): Zkp2pClient {\n const signer = opts?.signer;\n if (!signer?.account) throw errors.signerRequired(verb);\n let client = signingClients.get(signer);\n if (!client) {\n client = buildSdkClient(signer);\n signingClients.set(signer, client);\n }\n return client;\n }\n\n function validateInput(input: CashoutInput): CashDepositInput {\n const { amount, receive } = input;\n if (amount < MIN_CASHOUT_AMOUNT) throw errors.amountBelowMinimum(amount, MIN_CASHOUT_AMOUNT);\n const catalog = getPaymentMethodsCatalog(BASE_CHAIN_ID, environment);\n if (!catalog[receive.platform]) throw errors.unsupportedPlatform(receive.platform);\n if (!isMarketRateSupported(receive.currency)) {\n throw errors.oracleUnsupportedCurrency(receive.currency);\n }\n // Wise/PayPal require a signed maker identity attestation the SDK can't\n // mint. Reject early unless the caller supplied one on the payee.\n if (\n platformRequiresIdentityAttestation(receive.platform) &&\n !(receive.payee as { identityAttestation?: unknown }).identityAttestation\n ) {\n throw errors.payeeVerificationRequired(receive.platform);\n }\n return {\n amount,\n payouts: [\n {\n processorName: receive.platform,\n currency: receive.currency,\n payeeData: receive.payee,\n },\n ],\n ...(input.intentAmountRange ? { intentAmountRange: input.intentAmountRange } : {}),\n };\n }\n\n async function buildDepositParams(client: Zkp2pClient, depositInput: CashDepositInput) {\n try {\n return await prepareCashDepositParams(client, depositInput);\n } catch (err) {\n if (isCashError(err)) throw err;\n // The curator rejects Wise/PayPal payees that lack a signed attestation.\n const message = err instanceof Error ? err.message : String(err);\n if (/identityAttestation is required|identity attestation/i.test(message)) {\n const platform = depositInput.payouts[0]?.processorName ?? 'this platform';\n throw errors.payeeVerificationRequired(platform, err);\n }\n throw errors.payeeRegistrationFailed(err);\n }\n }\n\n async function fetchOrder(depositId: string): Promise<CashOrder> {\n const deposits = await readClient.indexer.getDepositsByIdsWithRelations([depositId], {\n includeIntents: true,\n intentStatuses: CASH_ORDER_STATUSES,\n });\n const deposit = deposits[0];\n\n if (!deposit) {\n // Deposit not yet indexed (lag right after creation) - read intents directly.\n const intents = await readClient.indexer.getIntentsForDeposits(\n [depositId],\n CASH_ORDER_STATUSES,\n );\n if (intents.length === 0) throw errors.orderNotFound(depositId);\n return deriveCashOrder(depositId, intents);\n }\n\n // Reconstruct the payout legs (platform, currency, payee hash, pricing\n // proof) from the relations the same query already returned.\n const payouts = derivePayouts(\n deposit.paymentMethods ?? [],\n deposit.currencies ?? [],\n getPaymentMethodsCatalog(BASE_CHAIN_ID, environment),\n );\n\n return deriveCashOrder(depositId, deposit.intents ?? [], {\n ...depositOrderOptions(deposit),\n ...(payouts.length > 0 ? { payouts } : {}),\n });\n }\n\n /** Parse the composite id into the on-chain id + optional escrow override. */\n function escrowContext(depositId: string): {\n onchainDepositId: bigint;\n escrowArg: { escrowAddress?: Address };\n } {\n const { escrowAddress, onchainDepositId } = parseCompositeDepositId(depositId);\n return {\n onchainDepositId,\n escrowArg: escrowAddress ? { escrowAddress: escrowAddress as Address } : {},\n };\n }\n\n /** Available (unlocked, undelivered) balance of an order. */\n function availableAmount(order: CashOrder): bigint {\n return order.totalAmount - order.filledAmount - order.pendingAmount - order.returnedAmount;\n }\n\n /**\n * State gate for the full-close withdraw paths: throws when withdrawal is\n * blocked or pointless, and reports whether an expired intent must be\n * pruned first.\n */\n async function withdrawContext(depositId: string): Promise<{\n expiredIntent: boolean;\n onchainDepositId: bigint;\n escrowArg: { escrowAddress?: Address };\n }> {\n const order = await fetchOrder(depositId);\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n const signaled = order.fills.filter((f) => f.status === 'SIGNALED');\n const liveIntent = signaled.some((f) => isFillLive(f, nowSeconds));\n const expiredIntent = signaled.length > 0 && !liveIntent;\n\n if (order.pendingAmount > 0n && liveIntent) {\n throw errors.activeIntentBlocksWithdrawal(depositId);\n }\n if (availableAmount(order) <= 0n && order.pendingAmount === 0n) {\n throw errors.nothingToWithdraw(depositId);\n }\n\n return { expiredIntent, ...escrowContext(depositId) };\n }\n\n /**\n * State gate for partial withdrawal: only the unlocked balance is\n * withdrawable, but a live buyer intent does not block it.\n */\n async function partialWithdrawContext(\n depositId: string,\n amount: bigint,\n ): Promise<{ onchainDepositId: bigint; escrowArg: { escrowAddress?: Address } }> {\n if (amount <= 0n) throw errors.amountBelowMinimum(amount, 1n);\n const order = await fetchOrder(depositId);\n const available = availableAmount(order);\n if (amount > available) {\n throw errors.insufficientAvailableFunds(depositId, amount, available);\n }\n return escrowContext(depositId);\n }\n\n /** State gate for top-ups: the order must still be live. */\n async function topUpContext(\n depositId: string,\n amount: bigint,\n ): Promise<{ onchainDepositId: bigint; escrowArg: { escrowAddress?: Address } }> {\n if (amount < MIN_CASHOUT_AMOUNT) throw errors.amountBelowMinimum(amount, MIN_CASHOUT_AMOUNT);\n const order = await fetchOrder(depositId);\n if (!order.isInFlight) throw errors.orderNotActive(depositId);\n return escrowContext(depositId);\n }\n\n /**\n * Ensure the escrow can pull the deposit amount, and make the allowance\n * durable before returning: `ensureAllowance` sends the approve without\n * waiting for it to mine, and load-balanced RPC replicas can serve stale\n * `eth_call` state even after the receipt lands - so wait for the receipt,\n * then poll until the allowance is visible on the read path.\n */\n async function settleAllowance(\n client: Zkp2pClient,\n token: Address,\n owner: Address,\n escrow: Address,\n amount: bigint,\n ): Promise<void> {\n let allowance: { hadAllowance: boolean; hash?: Hash };\n try {\n allowance = await client.ensureAllowance({\n token,\n amount,\n spender: escrow,\n txOverrides: attribution,\n });\n } catch (err) {\n throw mapChainError('approve', err);\n }\n if (allowance.hadAllowance || !allowance.hash) return;\n\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash: allowance.hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(allowance.hash);\n\n for (let attempt = 0; attempt < 15; attempt++) {\n const visible = (await client.publicClient.readContract({\n address: token,\n abi: ERC20_ALLOWANCE_ABI,\n functionName: 'allowance',\n args: [owner, escrow],\n })) as bigint;\n if (visible >= amount) return;\n await sleep(1_000);\n }\n // The approve mined but the allowance never surfaced on the read path -\n // surface it as retryable rather than blindly submitting a doomed deposit.\n throw errors.allowanceNotVisible(amount);\n }\n\n return {\n capabilities(): CashCapabilities {\n return buildCapabilities(environment);\n },\n\n async estimate(input: EstimateInput): Promise<CashEstimate> {\n return readEstimate(readClient.publicClient, input);\n },\n\n async cashout(input: CashoutInput, opts: SignerOptions): Promise<CashoutResult> {\n const depositInput = validateInput(input);\n const client = signingClient('cashout', opts);\n\n const params = await buildDepositParams(client, depositInput);\n\n // Spender must be the escrow createDeposit will target - the default can\n // point at the legacy escrow while deposits go to EscrowV2.\n const escrow = client.escrowV2Address ?? client.escrowAddress;\n const owner = opts.signer.account!.address;\n await settleAllowance(client, params.token, owner, escrow, depositInput.amount);\n\n const attributedParams = { ...params, txOverrides: attribution };\n // Submit the deposit; one retry for the replica-lag case the allowance\n // visibility loop cannot fully rule out. All other failures map to typed\n // errors and a reverted receipt throws - no raw errors, no false success.\n const send = async (): Promise<`0x${string}`> => {\n try {\n return (await client.createDeposit(attributedParams)).hash;\n } catch (err) {\n if (err instanceof Error && /exceeds allowance/i.test(err.message)) {\n await sleep(2_000);\n return (await client.createDeposit(attributedParams)).hash;\n }\n throw err;\n }\n };\n\n let hash: Hash;\n try {\n hash = (await send()) as Hash;\n } catch (err) {\n throw mapChainError('createDeposit', err);\n }\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(hash);\n\n const abi = client.escrowV2Abi ?? client.escrowAbi;\n const resolved = resolveCashDepositId({ logs: receipt.logs, abi });\n if (!resolved) throw errors.depositResolutionFailed(hash);\n\n const order = deriveCashOrder(resolved.compositeId, [], {\n remainingAmount: depositInput.amount,\n status: 'ACTIVE',\n });\n\n return {\n depositId: resolved.compositeId,\n txHash: hash,\n escrowAddress: resolved.escrowAddress,\n onchainDepositId: resolved.onchainDepositId,\n order,\n };\n },\n\n async prepare(input: CashoutInput): Promise<PrepareResult> {\n const depositInput = validateInput(input);\n const params = await buildDepositParams(readClient, depositInput);\n\n const { prepared } = await readClient.prepareCreateDeposit({\n ...params,\n txOverrides: attribution,\n });\n\n const approve: PreparedTransaction = {\n to: params.token,\n data: appendAttributionToCalldata(\n encodeFunctionData({\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [prepared.to as Address, depositInput.amount],\n }),\n referrerCodes,\n ),\n value: 0n,\n chainId: BASE_CHAIN_ID,\n };\n\n const hashedOnchainIds = (params.paymentMethodDataOverride ?? []).map((d) => d.payeeDetails);\n\n return {\n txs: [approve, prepared],\n steps: [\n {\n kind: 'approve',\n description: 'Approve Base USDC for the Peer Cash escrow.',\n },\n {\n kind: 'createDeposit',\n description: 'Create the protocol-held cash-out order.',\n },\n ],\n register: { hashedOnchainIds },\n };\n },\n\n async order(depositId: string): Promise<CashOrder> {\n return fetchOrder(depositId);\n },\n\n async buyer(address: string): Promise<CashBuyerProfile> {\n const intents = await readClient.indexer.getOwnerIntents(address, CASH_ORDER_STATUSES);\n return deriveBuyerProfile(address, intents);\n },\n\n async orders(owner: string, opts: OrdersOptions = {}): Promise<CashOrder[]> {\n const { inFlight = false, limit = 100 } = opts;\n const deposits = await readClient.indexer.getDeposits({ depositor: owner }, { limit });\n\n const derived = deposits\n // List rows carry no intent detail - flag it so `nextActions` treats a\n // live outstanding amount conservatively (no false \"withdraw\" offer).\n .map((d) => deriveCashOrder(d.id, [], { ...depositOrderOptions(d), fillsIncluded: false }))\n // Drop dust/empty deposits that never represented a real cash-out.\n .filter((o) => o.totalAmount > 10_000n)\n .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\n return inFlight ? derived.filter((o) => o.isInFlight) : derived;\n },\n\n async *watch(\n depositId: string,\n opts: WatchOptions = {},\n ): AsyncGenerator<CashOrder, void, void> {\n const { signal, pollIntervalMs = 5_000, timeoutMs } = opts;\n const startedAt = Date.now();\n let lastFingerprint: string | undefined;\n\n while (true) {\n if (signal?.aborted) return;\n if (timeoutMs !== undefined && Date.now() - startedAt >= timeoutMs) {\n throw errors.watchTimeout(depositId, timeoutMs);\n }\n\n let order: CashOrder | null = null;\n try {\n order = await fetchOrder(depositId);\n } catch (err) {\n // Right after cashout the indexer may not have the deposit yet - keep polling.\n if (!(isCashError(err) && err.code === 'ORDER_NOT_FOUND')) throw err;\n }\n\n if (order) {\n const fingerprint = orderFingerprint(order);\n if (fingerprint !== lastFingerprint) {\n lastFingerprint = fingerprint;\n yield order;\n }\n if (!order.isInFlight) return;\n }\n\n await sleep(pollIntervalMs, signal);\n }\n },\n\n async withdraw(depositId: string, opts: WithdrawOptions): Promise<WithdrawResult> {\n const client = signingClient('withdraw', opts);\n\n if (opts.amount !== undefined) {\n const { onchainDepositId, escrowArg } = await partialWithdrawContext(\n depositId,\n opts.amount,\n );\n const withdrawTxHash = await submitAndConfirm(client, 'removeFunds', () =>\n client.removeFunds({\n depositId: onchainDepositId,\n amount: opts.amount!,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n return { depositId, withdrawTxHash };\n }\n\n const { expiredIntent, onchainDepositId, escrowArg } = await withdrawContext(depositId);\n\n let pruneTxHash: Hash | undefined;\n if (expiredIntent) {\n // Free the expired intent's locked amount back to the deposit first -\n // withdrawDeposit reverts while any intent is still recorded as active.\n pruneTxHash = await submitAndConfirm(client, 'pruneExpiredIntents', () =>\n client.pruneExpiredIntents({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n }\n\n const withdrawTxHash = await submitAndConfirm(client, 'withdrawDeposit', () =>\n client.withdrawDeposit({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n\n return {\n depositId,\n ...(pruneTxHash !== undefined ? { pruneTxHash } : {}),\n withdrawTxHash,\n };\n },\n\n async prepareWithdraw(\n depositId: string,\n opts: { amount?: bigint } = {},\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }> {\n if (opts.amount !== undefined) {\n const { onchainDepositId, escrowArg } = await partialWithdrawContext(\n depositId,\n opts.amount,\n );\n const tx = await readClient.removeFunds.prepare({\n depositId: onchainDepositId,\n amount: opts.amount,\n ...escrowArg,\n txOverrides: attribution,\n });\n return {\n txs: [tx],\n steps: [\n {\n kind: 'removeFunds',\n description: 'Withdraw the requested unlocked USDC amount.',\n },\n ],\n };\n }\n\n const { expiredIntent, onchainDepositId, escrowArg } = await withdrawContext(depositId);\n\n const txs: PreparedTransaction[] = [];\n const steps: CashPreparedStep[] = [];\n if (expiredIntent) {\n txs.push(\n await readClient.pruneExpiredIntents.prepare({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n steps.push({\n kind: 'pruneExpiredIntents',\n description: 'Prune expired buyer intents so the locked amount becomes withdrawable.',\n });\n }\n txs.push(\n await readClient.withdrawDeposit.prepare({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n steps.push({\n kind: 'withdrawDeposit',\n description: 'Close the order and withdraw all remaining USDC.',\n });\n return { txs, steps };\n },\n\n async topUp(depositId: string, amount: bigint, opts: SignerOptions): Promise<TopUpResult> {\n const client = signingClient('topUp', opts);\n const { onchainDepositId, escrowArg } = await topUpContext(depositId, amount);\n\n // Cash deposits are always Base USDC (enforced at creation); the escrow\n // pulling the top-up is the one the composite id points at.\n const owner = opts.signer.account!.address;\n const escrow = (escrowArg.escrowAddress ??\n client.escrowV2Address ??\n client.escrowAddress) as Address;\n await settleAllowance(client, BASE_USDC_ADDRESS as Address, owner, escrow, amount);\n\n const txHash = await submitAndConfirm(client, 'addFunds', () =>\n client.addFunds({\n depositId: onchainDepositId,\n amount,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n\n return { depositId, txHash };\n },\n\n async prepareTopUp(\n depositId: string,\n amount: bigint,\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }> {\n const { onchainDepositId, escrowArg } = await topUpContext(depositId, amount);\n\n const prepared = await readClient.addFunds.prepare({\n depositId: onchainDepositId,\n amount,\n ...escrowArg,\n txOverrides: attribution,\n });\n\n const approve: PreparedTransaction = {\n to: BASE_USDC_ADDRESS as Address,\n data: appendAttributionToCalldata(\n encodeFunctionData({\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [prepared.to as Address, amount],\n }),\n referrerCodes,\n ),\n value: 0n,\n chainId: BASE_CHAIN_ID,\n };\n\n return {\n txs: [approve, prepared],\n steps: [\n {\n kind: 'approve',\n description: 'Approve additional Base USDC for the Peer Cash escrow.',\n },\n {\n kind: 'addFunds',\n description: 'Add USDC to the live cash-out order.',\n },\n ],\n };\n },\n };\n}\n\nexport { CashError, isCashError, errors };\n","/**\n * zod schemas for every wire type. The wire format encodes bigints as decimal\n * strings so orders, estimates, and prepared txs cross tool-call and process\n * boundaries losslessly.\n */\nimport { z } from 'zod';\n\nexport const bigintString = z.string().regex(/^-?\\d+$/, 'expected a decimal bigint string');\n\nexport const cashOrderStateSchema = z.enum([\n 'awaiting-buyer',\n 'matched',\n 'delivering',\n 'delivered',\n 'returned',\n]);\n\nexport const cashNextActionSchema = z.enum(['wait', 'withdraw']);\n\nexport const intentStatusSchema = z.enum(['SIGNALED', 'FULFILLED', 'PRUNED', 'MANUALLY_RELEASED']);\n\nexport const cashFillJsonSchema = z.object({\n intentHash: z.string(),\n status: intentStatusSchema,\n amount: bigintString,\n buyer: z.string(),\n currency: z.string().optional(),\n currencyHash: z.string().optional(),\n rate: z.number().optional(),\n conversionRate: bigintString.optional(),\n fiatOwed: z.number().optional(),\n fiatPaid: z.number().optional(),\n paidCurrency: z.string().optional(),\n paymentId: z.string().optional(),\n paidAt: z.number().optional(),\n releasedAmount: bigintString.optional(),\n fillLatencySeconds: z.number().optional(),\n isExpired: z.boolean().optional(),\n signaledAt: z.number().optional(),\n expiresAt: z.number().optional(),\n fulfilledAt: z.number().optional(),\n prunedAt: z.number().optional(),\n});\n\nexport const cashPayoutPricingJsonSchema = z.object({\n spreadBps: z.number().optional(),\n kind: z.string().optional(),\n rateSource: z.string().optional(),\n oracleRate: z.number().optional(),\n lastOracleUpdatedAt: z.number().optional(),\n marketRate: z.boolean(),\n});\n\nexport const cashPayoutInfoJsonSchema = z.object({\n platform: z.string().optional(),\n platformHash: z.string(),\n currency: z.string().optional(),\n currencyHash: z.string().optional(),\n payeeHash: z.string(),\n active: z.boolean(),\n pricing: cashPayoutPricingJsonSchema,\n});\n\nexport const cashBuyerProfileJsonSchema = z.object({\n address: z.string(),\n totalIntents: z.number(),\n fulfilled: z.number(),\n pruned: z.number(),\n signaled: z.number(),\n successRateBps: z.number().optional(),\n firstSeenAt: z.number().optional(),\n lastSeenAt: z.number().optional(),\n});\n\nexport const cashOrderJsonSchema = z.object({\n depositId: z.string(),\n state: cashOrderStateSchema,\n fills: z.array(cashFillJsonSchema),\n totalAmount: bigintString,\n filledAmount: bigintString,\n pendingAmount: bigintString,\n returnedAmount: bigintString,\n nextActions: z.array(cashNextActionSchema),\n primaryIntentHash: z.string().optional(),\n matchedAt: z.number().optional(),\n deliveredAt: z.number().optional(),\n updatedAt: z.number().optional(),\n intentCount: z.number().optional(),\n payouts: z.array(cashPayoutInfoJsonSchema).optional(),\n successRateBps: z.number().optional(),\n isInFlight: z.boolean(),\n withdrawn: z.boolean().optional(),\n});\n\nexport const cashEstimateJsonSchema = z.object({\n kind: z.literal('oracle-estimate'),\n currency: z.string(),\n amount: bigintString,\n rate: z.number(),\n receiveAmount: z.number(),\n asOf: z.number(),\n oracleUpdatedAt: z.number().optional(),\n stale: z.boolean().optional(),\n});\n\nexport const preparedTransactionJsonSchema = z.object({\n to: z.string(),\n data: z.string(),\n value: bigintString,\n chainId: z.number(),\n});\n\nexport const cashPreparedStepJsonSchema = z.object({\n kind: z.enum([\n 'approve',\n 'createDeposit',\n 'pruneExpiredIntents',\n 'withdrawDeposit',\n 'removeFunds',\n 'addFunds',\n ]),\n description: z.string(),\n});\n\nexport const cashoutResultJsonSchema = z.object({\n depositId: z.string(),\n txHash: z.string(),\n escrowAddress: z.string(),\n onchainDepositId: bigintString,\n order: cashOrderJsonSchema,\n});\n\nexport const prepareResultJsonSchema = z.object({\n txs: z.array(preparedTransactionJsonSchema),\n steps: z.array(cashPreparedStepJsonSchema),\n register: z.object({ hashedOnchainIds: z.array(z.string()) }),\n});\n\nexport const withdrawResultJsonSchema = z.object({\n depositId: z.string(),\n pruneTxHash: z.string().optional(),\n withdrawTxHash: z.string(),\n});\n\nexport const topUpResultJsonSchema = z.object({\n depositId: z.string(),\n txHash: z.string(),\n});\n\nexport const cashCapabilitiesJsonSchema = z.object({\n chainId: z.number(),\n token: z.object({ address: z.string(), symbol: z.literal('USDC'), decimals: z.number() }),\n environment: z.enum(['production', 'preproduction', 'staging']),\n platforms: z.array(\n z.object({\n platform: z.string(),\n currencies: z.array(z.string()),\n payeeHint: z.string(),\n requiresIdentityAttestation: z.boolean(),\n }),\n ),\n currencies: z.array(z.string()),\n amount: z.object({ min: bigintString, recommendedMin: bigintString, max: z.null() }),\n pricing: z.object({ kind: z.literal('oracle-market-rate'), spreadBps: z.literal(0) }),\n});\n\nexport const cashErrorJsonSchema = z.object({\n code: z.string(),\n message: z.string(),\n retryable: z.boolean(),\n remediation: z.string(),\n});\n\nexport type CashOrderJson = z.infer<typeof cashOrderJsonSchema>;\nexport type CashFillJson = z.infer<typeof cashFillJsonSchema>;\nexport type CashEstimateJson = z.infer<typeof cashEstimateJsonSchema>;\nexport type PreparedTransactionJson = z.infer<typeof preparedTransactionJsonSchema>;\nexport type CashoutResultJson = z.infer<typeof cashoutResultJsonSchema>;\nexport type PrepareResultJson = z.infer<typeof prepareResultJsonSchema>;\nexport type WithdrawResultJson = z.infer<typeof withdrawResultJsonSchema>;\nexport type TopUpResultJson = z.infer<typeof topUpResultJsonSchema>;\nexport type CashPreparedStepJson = z.infer<typeof cashPreparedStepJsonSchema>;\nexport type CashPayoutInfoJson = z.infer<typeof cashPayoutInfoJsonSchema>;\nexport type CashBuyerProfileJson = z.infer<typeof cashBuyerProfileJsonSchema>;\nexport type CashCapabilitiesJson = z.infer<typeof cashCapabilitiesJsonSchema>;\n","/**\n * JSON codecs - lossless (de)serialization for every wire type. bigints encode\n * as decimal strings; `parse*` validates with the zod schema and re-attaches\n * derived behavior (`order.explain()`).\n */\nimport type { CurrencyType, PreparedTransaction } from '../sdk-types';\nimport type { CashBuyerProfile, CashFill, CashOrder } from '../engine/types';\nimport { withExplain, type CashOrderData } from '../engine/orderState';\nimport type { CashEstimate } from '../client/estimate';\nimport type { CashCapabilities } from '../client/capabilities';\nimport type {\n CashPreparedStep,\n CashoutResult,\n PrepareResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\nimport {\n cashCapabilitiesJsonSchema,\n cashEstimateJsonSchema,\n cashOrderJsonSchema,\n cashoutResultJsonSchema,\n cashPreparedStepJsonSchema,\n prepareResultJsonSchema,\n preparedTransactionJsonSchema,\n withdrawResultJsonSchema,\n topUpResultJsonSchema,\n cashBuyerProfileJsonSchema,\n type CashBuyerProfileJson,\n type CashCapabilitiesJson,\n type CashEstimateJson,\n type CashFillJson,\n type CashOrderJson,\n type CashPreparedStepJson,\n type CashoutResultJson,\n type PrepareResultJson,\n type PreparedTransactionJson,\n type WithdrawResultJson,\n type TopUpResultJson,\n} from './schemas';\n\nfunction omitUndefined<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n\n// --- CashFill ---\n\nexport function fillToJson(fill: CashFill): CashFillJson {\n return omitUndefined({\n intentHash: fill.intentHash,\n status: fill.status,\n amount: fill.amount.toString(),\n buyer: fill.buyer,\n currency: fill.currency,\n currencyHash: fill.currencyHash,\n rate: fill.rate,\n conversionRate: fill.conversionRate?.toString(),\n fiatOwed: fill.fiatOwed,\n fiatPaid: fill.fiatPaid,\n paidCurrency: fill.paidCurrency,\n paymentId: fill.paymentId,\n paidAt: fill.paidAt,\n releasedAmount: fill.releasedAmount?.toString(),\n fillLatencySeconds: fill.fillLatencySeconds,\n isExpired: fill.isExpired,\n signaledAt: fill.signaledAt,\n expiresAt: fill.expiresAt,\n fulfilledAt: fill.fulfilledAt,\n prunedAt: fill.prunedAt,\n }) as CashFillJson;\n}\n\nexport function fillFromJson(json: CashFillJson): CashFill {\n return omitUndefined({\n ...json,\n amount: BigInt(json.amount),\n conversionRate: json.conversionRate !== undefined ? BigInt(json.conversionRate) : undefined,\n releasedAmount: json.releasedAmount !== undefined ? BigInt(json.releasedAmount) : undefined,\n }) as unknown as CashFill;\n}\n\n// --- CashOrder ---\n\nexport function orderToJson(order: CashOrder): CashOrderJson {\n return omitUndefined({\n depositId: order.depositId,\n state: order.state,\n fills: order.fills.map(fillToJson),\n totalAmount: order.totalAmount.toString(),\n filledAmount: order.filledAmount.toString(),\n pendingAmount: order.pendingAmount.toString(),\n returnedAmount: order.returnedAmount.toString(),\n nextActions: order.nextActions,\n primaryIntentHash: order.primaryIntentHash,\n matchedAt: order.matchedAt,\n deliveredAt: order.deliveredAt,\n updatedAt: order.updatedAt,\n intentCount: order.intentCount,\n payouts: order.payouts?.map((p) =>\n omitUndefined({ ...p, pricing: omitUndefined({ ...p.pricing }) }),\n ),\n successRateBps: order.successRateBps,\n isInFlight: order.isInFlight,\n withdrawn: order.withdrawn,\n }) as CashOrderJson;\n}\n\nexport function orderFromJson(json: unknown): CashOrder {\n const parsed = cashOrderJsonSchema.parse(json);\n const data = omitUndefined({\n ...parsed,\n fills: parsed.fills.map(fillFromJson),\n totalAmount: BigInt(parsed.totalAmount),\n filledAmount: BigInt(parsed.filledAmount),\n pendingAmount: BigInt(parsed.pendingAmount),\n returnedAmount: BigInt(parsed.returnedAmount),\n }) as unknown as CashOrderData;\n return withExplain(data);\n}\n\n// --- CashEstimate ---\n\nexport function estimateToJson(estimate: CashEstimate): CashEstimateJson {\n return { ...estimate, amount: estimate.amount.toString() };\n}\n\nexport function estimateFromJson(json: unknown): CashEstimate {\n const parsed = cashEstimateJsonSchema.parse(json);\n return omitUndefined({\n ...parsed,\n currency: parsed.currency as CurrencyType,\n amount: BigInt(parsed.amount),\n }) as unknown as CashEstimate;\n}\n\n// --- PreparedTransaction ---\n\nexport function preparedTxToJson(tx: PreparedTransaction): PreparedTransactionJson {\n return { to: tx.to, data: tx.data, value: tx.value.toString(), chainId: tx.chainId };\n}\n\nexport function preparedTxFromJson(json: unknown): PreparedTransaction {\n const parsed = preparedTransactionJsonSchema.parse(json);\n return {\n to: parsed.to as PreparedTransaction['to'],\n data: parsed.data as PreparedTransaction['data'],\n value: BigInt(parsed.value),\n chainId: parsed.chainId,\n };\n}\n\nexport function preparedStepToJson(step: CashPreparedStep): CashPreparedStepJson {\n return { kind: step.kind, description: step.description };\n}\n\nexport function preparedStepFromJson(json: unknown): CashPreparedStep {\n return cashPreparedStepJsonSchema.parse(json);\n}\n\n// --- CashoutResult ---\n\nexport function cashoutResultToJson(result: CashoutResult): CashoutResultJson {\n return {\n depositId: result.depositId,\n txHash: result.txHash,\n escrowAddress: result.escrowAddress,\n onchainDepositId: result.onchainDepositId.toString(),\n order: orderToJson(result.order),\n };\n}\n\nexport function cashoutResultFromJson(json: unknown): CashoutResult {\n const parsed = cashoutResultJsonSchema.parse(json);\n return {\n depositId: parsed.depositId,\n txHash: parsed.txHash as CashoutResult['txHash'],\n escrowAddress: parsed.escrowAddress,\n onchainDepositId: BigInt(parsed.onchainDepositId),\n order: orderFromJson(parsed.order),\n };\n}\n\n// --- PrepareResult ---\n\nexport function prepareResultToJson(result: PrepareResult): PrepareResultJson {\n return {\n txs: result.txs.map(preparedTxToJson),\n steps: result.steps.map(preparedStepToJson),\n register: result.register,\n };\n}\n\nexport function prepareResultFromJson(json: unknown): PrepareResult {\n const parsed = prepareResultJsonSchema.parse(json);\n return {\n txs: parsed.txs.map(preparedTxFromJson),\n steps: parsed.steps.map(preparedStepFromJson),\n register: parsed.register,\n };\n}\n\n// --- WithdrawResult ---\n\nexport function withdrawResultToJson(result: WithdrawResult): WithdrawResultJson {\n return omitUndefined({\n depositId: result.depositId,\n pruneTxHash: result.pruneTxHash,\n withdrawTxHash: result.withdrawTxHash,\n }) as WithdrawResultJson;\n}\n\nexport function withdrawResultFromJson(json: unknown): WithdrawResult {\n const parsed = withdrawResultJsonSchema.parse(json);\n return omitUndefined({\n depositId: parsed.depositId,\n pruneTxHash: parsed.pruneTxHash,\n withdrawTxHash: parsed.withdrawTxHash,\n }) as unknown as WithdrawResult;\n}\n\n// --- CashBuyerProfile ---\n\nexport function buyerProfileToJson(profile: CashBuyerProfile): CashBuyerProfileJson {\n return omitUndefined({ ...profile }) as CashBuyerProfileJson;\n}\n\nexport function buyerProfileFromJson(json: unknown): CashBuyerProfile {\n return omitUndefined(cashBuyerProfileJsonSchema.parse(json)) as unknown as CashBuyerProfile;\n}\n\n// --- TopUpResult ---\n\nexport function topUpResultToJson(result: TopUpResult): TopUpResultJson {\n return { depositId: result.depositId, txHash: result.txHash };\n}\n\nexport function topUpResultFromJson(json: unknown): TopUpResult {\n const parsed = topUpResultJsonSchema.parse(json);\n return { depositId: parsed.depositId, txHash: parsed.txHash as TopUpResult['txHash'] };\n}\n\n// --- CashCapabilities ---\n\nexport function capabilitiesToJson(caps: CashCapabilities): CashCapabilitiesJson {\n return {\n ...caps,\n amount: {\n min: caps.amount.min.toString(),\n recommendedMin: caps.amount.recommendedMin.toString(),\n max: null,\n },\n };\n}\n\nexport function capabilitiesFromJson(json: unknown): CashCapabilities {\n const parsed = cashCapabilitiesJsonSchema.parse(json);\n return {\n ...parsed,\n platforms: parsed.platforms.map((p) => ({\n ...p,\n currencies: p.currencies as CurrencyType[],\n })),\n currencies: parsed.currencies as CurrencyType[],\n amount: {\n min: BigInt(parsed.amount.min),\n recommendedMin: BigInt(parsed.amount.recommendedMin),\n max: null,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/marketRate.ts","../src/internal/convert.ts","../src/engine/amounts.ts","../src/engine/orderState.ts","../src/engine/payouts.ts","../src/engine/buyerProfile.ts","../src/engine/resolveDeposit.ts","../src/client/capabilities.ts","../src/client/fillEta.ts","../src/client/relay.ts","../src/client/estimate.ts","../src/client/createCashClient.ts","../src/codecs/schemas.ts","../src/codecs/json.ts"],"names":["base","getCurrencyCodeFromHash","getPaymentMethodsCatalog","currencies","toUnixSeconds","createRelaySdkClient","depositInput","params","escrow","attributedParams","send","hash","receipt","abi","resolved","order","onchainDepositId","escrowArg","withdrawTxHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Peer Cash - market-rate (0% spread) deposit construction.\n *\n * The user sells at the prevailing live Chainlink oracle rate with `spreadBps: 0`.\n * This requires EscrowV2 \"override mode\" (the only `createDeposit` path that can\n * attach an `oracleRateConfig`), so we build the three override arrays ourselves\n * - exactly mirroring the SDK's auto-mode (`data: '0x'`, gating service, payee\n * hash) but injecting the oracle config.\n */\nimport type { Address } from 'viem';\nimport {\n currencyInfo,\n getSpreadOracleConfig,\n getPaymentMethodsCatalog,\n getGatingServiceAddress,\n resolvePaymentMethodHashFromCatalog,\n} from '@zkp2p/sdk';\nimport type {\n Zkp2pClient,\n CurrencyType,\n OracleAdapterOverrides,\n OnchainCurrency,\n DepositVerifierData,\n CreateDepositParamsArg,\n} from '../sdk-types';\nimport {\n BASE_USDC_ADDRESS,\n CASH_RETAIN_ON_EMPTY,\n MARKET_SPREAD_BPS,\n ORACLE_MIN_CONVERSION_RATE_SENTINEL,\n} from './constants';\nimport type { CashDepositInput } from './types';\n\n/**\n * Whether a currency can be priced at the live market rate. Only currencies with\n * a Chainlink feed (`supportsSpreadOracle`) get oracle pricing; others would fall\n * back to a fixed rate, which Peer Cash does not offer.\n */\nexport function isMarketRateSupported(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): boolean {\n return getSpreadOracleConfig(currency, adapters) != null;\n}\n\n/**\n * Build a single oracle-backed currency tuple priced at market (0% spread).\n * Returns `null` for currencies without a Chainlink feed.\n */\nexport function buildMarketRateCurrencyOverride(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): OnchainCurrency | null {\n const code = currencyInfo[currency]?.currencyCodeHash as `0x${string}` | undefined;\n const oracle = getSpreadOracleConfig(currency, adapters);\n if (!code || !oracle) return null;\n\n return {\n code,\n minConversionRate: ORACLE_MIN_CONVERSION_RATE_SENTINEL,\n oracleRateConfig: {\n adapter: oracle.adapter,\n adapterConfig: oracle.adapterConfig,\n spreadBps: MARKET_SPREAD_BPS,\n maxStaleness: oracle.maxStaleness,\n },\n } as OnchainCurrency;\n}\n\n/**\n * Default per-order range. Allows partial fills down to a small floor while\n * letting a single buyer take the whole deposit. Never forces `min == max`\n * unless the deposit itself is below the floor (which would otherwise starve\n * matching). Contract invariants: `min != 0`, `min <= max`, `amount >= min`.\n */\nconst DEFAULT_MIN_ORDER_FLOOR = 1_000_000n; // 1 USDC\n\nexport function buildIntentAmountRange(amount: bigint): { min: bigint; max: bigint } {\n if (amount <= 0n) throw new Error('Cash-out amount must be positive');\n const min = amount < DEFAULT_MIN_ORDER_FLOOR ? amount : DEFAULT_MIN_ORDER_FLOOR;\n return { min, max: amount };\n}\n\n/**\n * Prepare the full `createDeposit` params for a market-rate cash-out.\n *\n * Registers payee details with the curator (no auth), resolves payment-method\n * hashes + the gating service from the catalog, and assembles the override\n * arrays with `spreadBps: 0` oracle configs. Throws if any payout currency lacks\n * a live oracle feed (Peer Cash is market-rate only).\n */\nexport async function prepareCashDepositParams(\n client: Zkp2pClient,\n input: CashDepositInput,\n adapters?: OracleAdapterOverrides,\n): Promise<CreateDepositParamsArg> {\n const { payouts } = input;\n if (!payouts.length) throw new Error('At least one payout is required');\n\n const chainId = client.chainId;\n const runtimeEnv = client.runtimeEnv;\n const catalog = getPaymentMethodsCatalog(chainId, runtimeEnv);\n const intentGatingService = getGatingServiceAddress(chainId, runtimeEnv) as Address;\n\n // Validate every currency is oracle-priceable before any network call.\n for (const payout of payouts) {\n if (!isMarketRateSupported(payout.currency, adapters)) {\n throw new Error(\n `${payout.currency} has no live market-rate oracle feed; Peer Cash supports market-rate currencies only.`,\n );\n }\n }\n\n const processorNames = payouts.map((p) => p.processorName);\n\n // Register payee details with the curator to obtain on-chain payee hashes.\n const { hashedOnchainIds } = await client.registerPayeeDetails({\n processorNames,\n payeeData: payouts.map((p) => p.payeeData),\n });\n if (hashedOnchainIds.length !== payouts.length) {\n throw new Error('Payee registration returned an unexpected number of hashes');\n }\n\n const paymentMethodsOverride = processorNames.map((name) =>\n resolvePaymentMethodHashFromCatalog(name, catalog),\n );\n\n const paymentMethodDataOverride: DepositVerifierData[] = hashedOnchainIds.map((hid) => ({\n intentGatingService,\n payeeDetails: hid,\n data: '0x',\n }));\n\n const currenciesOverride: OnchainCurrency[][] = payouts.map((p) => {\n const tuple = buildMarketRateCurrencyOverride(p.currency, adapters);\n if (!tuple) throw new Error(`Failed to build market-rate config for ${p.currency}`);\n return [tuple];\n });\n\n // `conversionRates` is required for the length/shape check but is unused in\n // override mode - the on-chain tuple comes from `currenciesOverride`.\n const conversionRates = payouts.map((p) => [\n { currency: p.currency, conversionRate: ORACLE_MIN_CONVERSION_RATE_SENTINEL.toString() },\n ]);\n\n const intentAmountRange = input.intentAmountRange ?? buildIntentAmountRange(input.amount);\n\n return {\n token: (input.token ?? BASE_USDC_ADDRESS) as Address,\n amount: input.amount,\n intentAmountRange,\n processorNames,\n conversionRates,\n paymentMethodsOverride,\n paymentMethodDataOverride,\n currenciesOverride,\n retainOnEmpty: CASH_RETAIN_ON_EMPTY,\n } as CreateDepositParamsArg;\n}\n","/**\n * Coercion helpers for raw indexer values (string | number | null | missing).\n * Internal - not part of the public API.\n */\n\n/** Coerce to bigint, treating null/undefined/empty/malformed as 0n. */\nexport function toBigInt(value: unknown): bigint {\n return toBigIntOrUndefined(value) ?? 0n;\n}\n\n/** Coerce to bigint, or undefined when absent/malformed (caller decides the fallback). */\nexport function toBigIntOrUndefined(value: unknown): bigint | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n try {\n return BigInt(typeof value === 'number' ? Math.trunc(value) : String(value));\n } catch {\n return undefined;\n }\n}\n","import { USDC_DECIMALS } from './constants';\n\n/**\n * Convert a human USDC amount to base units (6 decimals).\n *\n * @example\n * usdc(1000) // 1_000_000_000n\n * usdc('12.34') // 12_340_000n\n */\nexport function usdc(amount: number | string): bigint {\n const text = typeof amount === 'number' ? amount.toString() : amount.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(text)) {\n throw new Error(`Invalid USDC amount: '${amount}'`);\n }\n const [whole = '0', frac = ''] = text.split('.');\n if (frac.length > USDC_DECIMALS) {\n throw new Error(`USDC has ${USDC_DECIMALS} decimals; '${amount}' has too many`);\n }\n return (\n BigInt(whole) * 10n ** BigInt(USDC_DECIMALS) + BigInt(frac.padEnd(USDC_DECIMALS, '0') || '0')\n );\n}\n\n/** Format USDC base units back to a decimal string (no trailing zeros). */\nexport function formatUsdc(amount: bigint): string {\n const negative = amount < 0n;\n const abs = negative ? -amount : amount;\n const whole = abs / 10n ** BigInt(USDC_DECIMALS);\n const frac = (abs % 10n ** BigInt(USDC_DECIMALS)).toString().padStart(USDC_DECIMALS, '0');\n const trimmed = frac.replace(/0+$/, '');\n return `${negative ? '-' : ''}${whole}${trimmed ? `.${trimmed}` : ''}`;\n}\n\n/** Protocol rate precision - conversion rates are fiat-per-USDC scaled by 1e18. */\nexport const RATE_PRECISION = 10n ** 18n;\n\n/**\n * Fiat owed for a USDC amount at a locked 1e18 conversion rate, in fiat base\n * units (6 decimals), rounded UP to the nearest cent - the same math the\n * protocol clients use, so the number matches what the buyer is told to pay.\n */\nexport function fiatFromUsdc(amount: bigint, conversionRate: bigint): bigint {\n const raw = (amount * conversionRate) / RATE_PRECISION;\n const penny = 10n ** BigInt(USDC_DECIMALS - 2);\n const remainder = raw % penny;\n return remainder > 0n ? raw - remainder + penny : raw;\n}\n\n/** Decode a 1e18 conversion rate to a plain number (fiat per USDC). */\nexport function rateToNumber(conversionRate: bigint): number {\n return Number(conversionRate) / 1e18;\n}\n\n/** Decode fiat base units (6 decimals) to a plain number. */\nexport function fiatToNumber(fiat: bigint): number {\n return Number(fiat) / 10 ** USDC_DECIMALS;\n}\n\n/** Decode fiat cents (verified `paymentAmount` precision) to a plain number. */\nexport function centsToNumber(cents: bigint): number {\n return Number(cents) / 100;\n}\n","/**\n * Peer Cash - pure order-state derivation.\n *\n * The indexer's Deposit entity has NO `amount` field; the real numbers live in\n * `remainingDeposits`, `outstandingIntentAmount`, `totalAmountTaken`,\n * `totalWithdrawn` plus intent counts and `status`. We derive both the order's\n * size (original = remaining + outstanding + taken + withdrawn) and its\n * signal-backed state from those aggregates, using the fetched intents (when\n * present) for buyer/fill detail. Every state maps to a real on-chain signal.\n */\nimport { getCurrencyCodeFromHash } from '@zkp2p/sdk';\nimport type { IntentEntity, IntentStatus } from '../sdk-types';\nimport { toBigInt, toBigIntOrUndefined } from '../internal/convert';\nimport { centsToNumber, fiatFromUsdc, fiatToNumber, formatUsdc, rateToNumber } from './amounts';\nimport type { CashFill, CashNextAction, CashOrder, CashOrderState, CashPayoutInfo } from './types';\n\n/** Below this (USDC base units) a leftover balance is treated as dust, not \"available\". */\nconst DUST_THRESHOLD = 10_000n; // $0.01\n\ninterface IntentLike {\n intentHash: string;\n status: IntentStatus;\n amount?: string | number | bigint | null;\n owner?: string | null;\n fiatCurrency?: string | null;\n conversionRate?: string | number | bigint | null;\n isExpired?: boolean | null;\n paymentAmount?: string | number | bigint | null;\n paymentCurrency?: string | null;\n paymentTimestamp?: string | number | null;\n paymentId?: string | null;\n releasedAmount?: string | number | bigint | null;\n signalTimestamp?: string | number | null;\n expiryTime?: string | number | null;\n fulfillTimestamp?: string | number | null;\n prunedTimestamp?: string | number | null;\n pruneTimestamp?: string | number | null;\n}\n\nfunction toUnixSeconds(value: unknown): number | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\nconst FULFILLED_STATUSES: ReadonlySet<IntentStatus> = new Set<IntentStatus>([\n 'FULFILLED',\n 'MANUALLY_RELEASED',\n]);\n\nfunction toFill(intent: IntentLike): CashFill {\n const signaledAt = toUnixSeconds(intent.signalTimestamp);\n const expiresAt = toUnixSeconds(intent.expiryTime);\n const fulfilledAt = toUnixSeconds(intent.fulfillTimestamp);\n const prunedAt = toUnixSeconds(intent.prunedTimestamp ?? intent.pruneTimestamp);\n const paidAt = toUnixSeconds(intent.paymentTimestamp);\n\n const amount = toBigInt(intent.amount);\n const conversionRate = toBigIntOrUndefined(intent.conversionRate);\n const currency =\n intent.fiatCurrency != null ? getCurrencyCodeFromHash(intent.fiatCurrency) : undefined;\n const paidCurrency =\n intent.paymentCurrency != null ? getCurrencyCodeFromHash(intent.paymentCurrency) : undefined;\n // Verified fiat paid arrives in cents from the payment proof.\n const paymentCents = toBigIntOrUndefined(intent.paymentAmount);\n const releasedAmount = toBigIntOrUndefined(intent.releasedAmount);\n const fillLatencySeconds =\n signaledAt !== undefined && fulfilledAt !== undefined && fulfilledAt >= signaledAt\n ? fulfilledAt - signaledAt\n : undefined;\n\n return {\n intentHash: intent.intentHash,\n status: intent.status,\n amount,\n buyer: (intent.owner ?? '').toLowerCase(),\n ...(currency !== undefined ? { currency } : {}),\n ...(intent.fiatCurrency != null ? { currencyHash: intent.fiatCurrency } : {}),\n ...(conversionRate !== undefined && conversionRate > 0n\n ? {\n conversionRate,\n rate: rateToNumber(conversionRate),\n fiatOwed: fiatToNumber(fiatFromUsdc(amount, conversionRate)),\n }\n : {}),\n ...(paymentCents !== undefined && paymentCents > 0n\n ? { fiatPaid: centsToNumber(paymentCents) }\n : {}),\n ...(paidCurrency !== undefined ? { paidCurrency } : {}),\n ...(intent.paymentId != null && intent.paymentId !== '' ? { paymentId: intent.paymentId } : {}),\n ...(paidAt !== undefined ? { paidAt } : {}),\n ...(releasedAmount !== undefined && releasedAmount > 0n ? { releasedAmount } : {}),\n ...(fillLatencySeconds !== undefined ? { fillLatencySeconds } : {}),\n ...(intent.isExpired != null ? { isExpired: intent.isExpired } : {}),\n ...(signaledAt !== undefined ? { signaledAt } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(fulfilledAt !== undefined ? { fulfilledAt } : {}),\n ...(prunedAt !== undefined ? { prunedAt } : {}),\n };\n}\n\n/**\n * Whether a signaled fill can still be completed by its buyer. Uses the\n * indexer's reconciler flag when present, belt-and-braces with the local\n * clock (the reconciler can lag; the clock can skew - either signal counts).\n */\nexport function isFillLive(fill: CashFill, nowSeconds: number): boolean {\n if (fill.status !== 'SIGNALED') return false;\n if (fill.isExpired === true) return false;\n return fill.expiresAt === undefined || fill.expiresAt > nowSeconds;\n}\n\nexport interface DeriveCashOrderOptions {\n /** Original deposit amount, when already computed (else derived from the parts below). */\n totalAmount?: bigint;\n /** `remainingDeposits` - currently available, unlocked balance. */\n remainingAmount?: bigint;\n /** `outstandingIntentAmount` - currently locked by an active (SIGNALED) intent. */\n outstandingAmount?: bigint;\n /** `totalAmountTaken` - cumulative amount delivered to buyers (cashed out). */\n takenAmount?: bigint;\n /** `totalWithdrawn` - cumulative amount returned to the maker. */\n withdrawnAmount?: bigint;\n /** Deposit status from the indexer: `ACTIVE` | `CLOSED`. */\n status?: string;\n /** Total intent count from the indexer aggregate. */\n intentCount?: number;\n /** Unix seconds of the deposit's last on-chain change. */\n updatedAt?: number;\n /** Payout legs reconstructed from the deposit relations (see `derivePayouts`). */\n payouts?: CashPayoutInfo[];\n /** Deposit quality signal (basis points) from the indexer aggregate. */\n successRateBps?: number;\n /**\n * Whether per-fill intent detail is present. Defaults to `intents.length > 0`.\n * Pass `false` on list rows (deposits fetched without their intents) so\n * `nextActions` treats a positive outstanding amount as a live lock rather\n * than offering a withdraw that would revert.\n */\n fillsIncluded?: boolean;\n /** Unix seconds \"now\" for expiry-sensitive `nextActions` (defaults to wall clock). */\n nowSeconds?: number;\n}\n\n/** Human dollar string for `explain()` sentences. */\nfunction fmtUsdc(amount: bigint): string {\n return `${formatUsdc(amount)} USDC`;\n}\n\n/** Plain-data view of {@link CashOrder} (everything except the `explain` method). */\nexport type CashOrderData = Omit<CashOrder, 'explain'>;\n\n/**\n * One honest sentence from live data - never a fake countdown. The binding\n * rate resolves at the oracle when a buyer fills, and buyer arrival time is\n * unknowable, so the sentence only ever states what the chain actually shows.\n */\nexport function explainOrder(order: CashOrderData): string {\n switch (order.state) {\n case 'awaiting-buyer':\n return `Your ${fmtUsdc(order.totalAmount)} cash-out is live and waiting for a buyer; you can withdraw it any time before a buyer commits.`;\n case 'matched':\n return `A buyer committed to ${fmtUsdc(order.pendingAmount)} and is sending fiat now; funds release automatically once their payment is proven.`;\n case 'delivering':\n return `${fmtUsdc(order.filledAmount)} of ${fmtUsdc(order.totalAmount)} has been delivered; the rest is ${\n order.pendingAmount > 0n ? 'locked by an active buyer' : 'still waiting for a buyer'\n }.`;\n case 'delivered':\n return `Cash-out complete: ${fmtUsdc(order.filledAmount)} was delivered to ${\n order.fills.filter((f) => f.fulfilledAt !== undefined).length || 'your'\n } buyer fill(s).`;\n case 'returned':\n return order.filledAmount > 0n\n ? `${fmtUsdc(order.filledAmount)} was delivered and the remaining ${fmtUsdc(order.returnedAmount)} was returned to your wallet.`\n : `No buyer delivered; ${fmtUsdc(order.returnedAmount)} was returned to your wallet.`;\n }\n}\n\n/** Attach the `explain()` method to plain order data (used by codecs on parse). */\nexport function withExplain(data: CashOrderData): CashOrder {\n return { ...data, explain: () => explainOrder(data) };\n}\n\n/**\n * What the caller can do next. Withdrawal is legal while no live (unexpired)\n * SIGNALED intent locks the funds - `withdraw()` prunes expired intents first\n * when needed, so an order whose only active intents have expired is\n * withdrawable again.\n *\n * `hasLiveIntent` is resolved by the caller: from per-fill liveness when the\n * intents were fetched, or conservatively from the outstanding aggregate on a\n * list row where fills weren't loaded (assume live → do not tempt a withdraw\n * that would revert).\n */\nfunction deriveNextActions(state: CashOrderState, hasLiveIntent: boolean): CashNextAction[] {\n if (state === 'delivered' || state === 'returned') return [];\n if (state === 'awaiting-buyer') return ['wait', 'withdraw'];\n // matched | delivering - funds are locked while a signaled intent is live.\n return hasLiveIntent ? ['wait'] : ['wait', 'withdraw'];\n}\n\n/**\n * Derive the resumable {@link CashOrder} view for one deposit. Pure and\n * deterministic - safe on every poll, list render, or cold page load.\n */\nexport function deriveCashOrder(\n depositId: string,\n intents: ReadonlyArray<IntentEntity>,\n options: DeriveCashOrderOptions = {},\n): CashOrder {\n const fills = (intents as ReadonlyArray<IntentLike>).map(toFill);\n\n // Prefer indexer aggregates; fall back to summing the fetched intents.\n const taken =\n options.takenAmount ??\n fills.filter((f) => FULFILLED_STATUSES.has(f.status)).reduce((a, f) => a + f.amount, 0n);\n const outstanding =\n options.outstandingAmount ??\n fills.filter((f) => f.status === 'SIGNALED').reduce((a, f) => a + f.amount, 0n);\n const withdrawn = options.withdrawnAmount ?? 0n;\n const remaining = options.remainingAmount ?? 0n;\n\n const total = options.totalAmount ?? remaining + outstanding + taken + withdrawn;\n\n const status = options.status;\n // The indexer's DepositStatus is ACTIVE | CLOSED; a fully-withdrawn deposit\n // is CLOSED (never a 'WITHDRAWN' status - that value exists only on the\n // fund-activity log). 'WITHDRAWN' is tolerated here purely for forward-compat.\n const isTerminal = status === 'CLOSED' || status === 'WITHDRAWN';\n const hasLiveFunds = remaining > DUST_THRESHOLD || outstanding > 0n;\n\n let state: CashOrderState;\n if (outstanding > 0n) {\n // A buyer is signaled right now (funds locked, mid-delivery).\n state = taken > 0n ? 'delivering' : 'matched';\n } else if (taken > 0n && !hasLiveFunds) {\n state = 'delivered';\n } else if (taken > 0n && hasLiveFunds) {\n state = 'delivering';\n } else if (!hasLiveFunds && (withdrawn > 0n || isTerminal)) {\n state = 'returned';\n } else if (hasLiveFunds) {\n state = 'awaiting-buyer';\n } else {\n state = taken > 0n ? 'delivered' : 'returned';\n }\n\n let matchedAt: number | undefined;\n let deliveredAt: number | undefined;\n for (const fill of fills) {\n if (fill.signaledAt && (!matchedAt || fill.signaledAt < matchedAt)) matchedAt = fill.signaledAt;\n if (FULFILLED_STATUSES.has(fill.status) && fill.fulfilledAt) {\n if (!deliveredAt || fill.fulfilledAt > deliveredAt) deliveredAt = fill.fulfilledAt;\n }\n }\n\n const primary =\n fills.find((f) => f.status === 'SIGNALED') ??\n fills.find((f) => FULFILLED_STATUSES.has(f.status)) ??\n fills[0];\n\n const isInFlight = state === 'awaiting-buyer' || state === 'matched' || state === 'delivering';\n const nowSeconds = options.nowSeconds ?? Math.floor(Date.now() / 1000);\n\n // Was fill-level intent detail available? Explicitly signalled by the caller,\n // else inferred from whether any intents were passed. When absent (list rows),\n // a positive `outstanding` is assumed to be a live lock - the conservative,\n // money-safe default for `nextActions`.\n const fillsIncluded = options.fillsIncluded ?? fills.length > 0;\n const hasLiveIntent = fillsIncluded\n ? fills.some((f) => isFillLive(f, nowSeconds))\n : outstanding > 0n;\n\n return withExplain({\n depositId,\n state,\n fills,\n totalAmount: total,\n filledAmount: taken,\n pendingAmount: outstanding,\n returnedAmount: withdrawn,\n nextActions: deriveNextActions(state, hasLiveIntent),\n ...(primary?.intentHash !== undefined ? { primaryIntentHash: primary.intentHash } : {}),\n ...(matchedAt !== undefined ? { matchedAt } : {}),\n ...(deliveredAt !== undefined ? { deliveredAt } : {}),\n ...(options.updatedAt !== undefined ? { updatedAt: options.updatedAt } : {}),\n intentCount: options.intentCount ?? fills.length,\n ...(options.payouts !== undefined ? { payouts: options.payouts } : {}),\n ...(options.successRateBps !== undefined ? { successRateBps: options.successRateBps } : {}),\n isInFlight,\n withdrawn: isTerminal,\n });\n}\n","/**\n * Peer Cash - payout-leg reconstruction from indexed deposit relations.\n *\n * A deposit's payment methods and per-method currency tuples live on-chain as\n * hashes. This decodes them back to human units (platform id, currency code)\n * via the protocol catalogs and surfaces the pricing state - including the\n * verifiable zero-spread invariant every cash order carries.\n */\nimport { getCurrencyCodeFromHash, resolvePaymentMethodNameFromHash } from '@zkp2p/sdk';\nimport type { PaymentMethodCatalog } from '@zkp2p/sdk';\nimport { toBigIntOrUndefined } from '../internal/convert';\nimport { rateToNumber } from './amounts';\nimport type { CashPayoutInfo, CashPayoutPricing } from './types';\n\n/** The raw indexed shape of a deposit's payment method (relation row). */\nexport interface PaymentMethodLike {\n paymentMethodHash?: string | null;\n payeeDetailsHash?: string | null;\n active?: boolean | null;\n}\n\n/** The raw indexed shape of a per-method currency tuple (relation row). */\nexport interface MethodCurrencyLike {\n paymentMethodHash?: string | null;\n currencyCode?: string | null;\n spreadBps?: number | string | null;\n kind?: string | null;\n rateSource?: string | null;\n oracleRate?: string | number | bigint | null;\n lastOracleUpdatedAt?: string | number | null;\n}\n\nconst ORACLE_KINDS = new Set(['oracle_chainlink', 'oracle_pyth']);\n\nfunction toPricing(tuple: MethodCurrencyLike | undefined): CashPayoutPricing {\n if (!tuple) return { marketRate: false };\n\n const spreadBps = tuple.spreadBps != null ? Number(tuple.spreadBps) : undefined;\n const oracleRate = toBigIntOrUndefined(tuple.oracleRate);\n const lastOracleUpdatedAt =\n tuple.lastOracleUpdatedAt != null ? Number(tuple.lastOracleUpdatedAt) : undefined;\n\n return {\n ...(spreadBps !== undefined && Number.isFinite(spreadBps) ? { spreadBps } : {}),\n ...(tuple.kind != null ? { kind: tuple.kind } : {}),\n ...(tuple.rateSource != null ? { rateSource: tuple.rateSource } : {}),\n ...(oracleRate !== undefined && oracleRate > 0n\n ? { oracleRate: rateToNumber(oracleRate) }\n : {}),\n ...(lastOracleUpdatedAt !== undefined && Number.isFinite(lastOracleUpdatedAt)\n ? { lastOracleUpdatedAt }\n : {}),\n marketRate: spreadBps === 0 && tuple.kind != null && ORACLE_KINDS.has(tuple.kind),\n };\n}\n\n/**\n * Decode a deposit's payment methods + currency tuples into payout legs.\n * Pure - the environment arrives via the catalog. One leg per\n * (method, currency) pair; cash orders create exactly one in v1.\n */\nexport function derivePayouts(\n paymentMethods: ReadonlyArray<PaymentMethodLike>,\n currencies: ReadonlyArray<MethodCurrencyLike>,\n catalog: PaymentMethodCatalog,\n): CashPayoutInfo[] {\n return paymentMethods.flatMap((method) => {\n const platformHash = method.paymentMethodHash ?? '';\n if (!platformHash) return [];\n\n let platform: string | undefined;\n try {\n platform = resolvePaymentMethodNameFromHash(platformHash, catalog);\n } catch {\n // Malformed / non-bytes32 hash - keep the raw value, no decoded name.\n platform = undefined;\n }\n const tuples = currencies.filter(\n (c) => (c.paymentMethodHash ?? '').toLowerCase() === platformHash.toLowerCase(),\n );\n const base = {\n ...(platform !== undefined ? { platform } : {}),\n platformHash,\n payeeHash: method.payeeDetailsHash ?? '',\n active: method.active ?? true,\n };\n\n if (tuples.length === 0) return [{ ...base, pricing: toPricing(undefined) }];\n\n return tuples.map((tuple) => {\n const currency =\n tuple.currencyCode != null ? getCurrencyCodeFromHash(tuple.currencyCode) : undefined;\n return {\n ...base,\n ...(currency !== undefined ? { currency } : {}),\n ...(tuple.currencyCode != null ? { currencyHash: tuple.currencyCode } : {}),\n pricing: toPricing(tuple),\n };\n });\n });\n}\n","/**\n * Peer Cash - buyer reputation, derived purely from the buyer's own intent\n * history. The anxious moment in a cash-out is `matched`: a stranger's\n * address is holding your order. This turns that address into a track record.\n */\nimport type { IntentEntity } from '../sdk-types';\nimport type { CashBuyerProfile } from './types';\n\ninterface BuyerIntentLike {\n status?: string | null;\n signalTimestamp?: string | number | null;\n}\n\nfunction toSeconds(value: string | number | null | undefined): number | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\n/** Aggregate a buyer's full intent history into a profile. Pure and deterministic. */\nexport function deriveBuyerProfile(\n address: string,\n intents: ReadonlyArray<IntentEntity>,\n): CashBuyerProfile {\n let fulfilled = 0;\n let pruned = 0;\n let signaled = 0;\n let firstSeenAt: number | undefined;\n let lastSeenAt: number | undefined;\n\n for (const intent of intents as ReadonlyArray<BuyerIntentLike>) {\n const status = intent.status ?? '';\n if (status === 'FULFILLED' || status === 'MANUALLY_RELEASED') fulfilled += 1;\n else if (status === 'PRUNED') pruned += 1;\n else if (status === 'SIGNALED') signaled += 1;\n\n const at = toSeconds(intent.signalTimestamp);\n if (at !== undefined) {\n if (firstSeenAt === undefined || at < firstSeenAt) firstSeenAt = at;\n if (lastSeenAt === undefined || at > lastSeenAt) lastSeenAt = at;\n }\n }\n\n const settled = fulfilled + pruned;\n\n return {\n address: address.toLowerCase(),\n totalIntents: intents.length,\n fulfilled,\n pruned,\n signaled,\n ...(settled > 0 ? { successRateBps: Math.round((fulfilled / settled) * 10_000) } : {}),\n ...(firstSeenAt !== undefined ? { firstSeenAt } : {}),\n ...(lastSeenAt !== undefined ? { lastSeenAt } : {}),\n };\n}\n","/**\n * Peer Cash - resolve the composite deposit id from a `createDeposit` receipt.\n *\n * `createDeposit` returns only a tx hash; the on-chain `depositId` is assigned by\n * the contract and emitted in `DepositReceived` (indexed). We decode it from the\n * receipt logs using the real escrow ABI so the order can be keyed on the\n * composite id (`escrow_onchainId`) the indexer uses.\n */\nimport { parseEventLogs, type Abi, type Log } from 'viem';\nimport { createCompositeDepositId } from '@zkp2p/sdk';\n\nexport interface ResolvedCashDeposit {\n onchainDepositId: bigint;\n escrowAddress: string;\n compositeId: string;\n}\n\nexport function resolveCashDepositId(params: {\n logs: Log[];\n abi: Abi;\n}): ResolvedCashDeposit | null {\n let events: Array<{ address: string; args: Record<string, unknown> }>;\n try {\n events = parseEventLogs({\n abi: params.abi,\n eventName: 'DepositReceived',\n logs: params.logs,\n }) as unknown as Array<{ address: string; args: Record<string, unknown> }>;\n } catch {\n return null;\n }\n\n const event = events[0];\n if (!event) return null;\n\n const rawId = event.args.depositId;\n if (rawId === undefined || rawId === null) return null;\n const onchainDepositId = BigInt(rawId as string | number | bigint);\n // Normalize to the indexer's canonical lowercase form so the escrow address,\n // the composite id, and every subsequent indexer query agree exactly.\n const escrowAddress = event.address.toLowerCase();\n\n return {\n onchainDepositId,\n escrowAddress,\n compositeId: createCompositeDepositId(escrowAddress, onchainDepositId),\n };\n}\n\n/** Split a composite deposit id (`escrow_onchainId`) back into its parts. */\nexport function parseCompositeDepositId(compositeId: string): {\n escrowAddress: string;\n onchainDepositId: bigint;\n} {\n const idx = compositeId.lastIndexOf('_');\n if (idx === -1) {\n // No escrow prefix - treat the whole string as the on-chain id.\n return { escrowAddress: '', onchainDepositId: BigInt(compositeId) };\n }\n const escrowAddress = compositeId.slice(0, idx);\n const onchainDepositId = BigInt(compositeId.slice(idx + 1) || '0');\n return { escrowAddress, onchainDepositId };\n}\n","/**\n * Discovery - sync, static. Platforms × currencies × oracle support × amount\n * bounds × payee format hints, all derivable without a network call.\n */\nimport { getPaymentMethodsCatalog, getCurrencyCodeFromHash } from '@zkp2p/sdk';\nimport type { CurrencyType, RuntimeEnv } from '../sdk-types';\nimport { BASE_CHAIN_ID, BASE_USDC_ADDRESS, USDC_DECIMALS } from '../engine/constants';\nimport { isMarketRateSupported } from '../engine/marketRate';\nimport type { CashSourceCapabilities } from './relay';\n\n/** Hard floor: below one cent a deposit is dust and can never fill. */\nexport const MIN_CASHOUT_AMOUNT = 10_000n; // $0.01\n/** Recommended floor: sub-1-USDC deposits force min==max fills and starve matching. */\nexport const RECOMMENDED_MIN_CASHOUT_AMOUNT = 1_000_000n; // 1 USDC\n\n/**\n * Payee handle format hints per platform, for input UX and agent validation.\n * Purely informational - the curator validates authoritatively at registration.\n */\nconst PAYEE_HINTS: Record<string, string> = {\n venmo: 'Venmo username, with or without the leading @ (e.g. @andrew-w)',\n cashapp: 'Cashtag, with or without the leading $ (e.g. $andrew)',\n revolut: 'Revtag (e.g. andrew1abc)',\n wise: 'Wisetag or the email on the Wise account',\n zelle: 'Email address or US phone number enrolled with Zelle',\n paypal: 'PayPal.Me handle or account email',\n mercadopago: 'Mercado Pago alias or CVU',\n monzo: 'Monzo.me username',\n chime: 'ChimeSign (e.g. $andrew)',\n luxon: 'Luxon Pay ID or account email',\n n26: 'MoneyBeam email or phone number',\n};\n\n/**\n * Platforms whose curator payee registration requires a signed maker identity\n * attestation - a bare handle is rejected. The attestation is produced by the\n * ZKP2P app / extension, not this SDK, so a cash-out to these platforms needs\n * the payee registered there first (see `PAYEE_VERIFICATION_REQUIRED`).\n */\nconst IDENTITY_ATTESTATION_PLATFORMS = new Set(['wise', 'paypal']);\n\n/** Whether a platform's curator registration needs a signed identity attestation. */\nexport function platformRequiresIdentityAttestation(platform: string): boolean {\n return IDENTITY_ATTESTATION_PLATFORMS.has(platform);\n}\n\nexport interface CashPlatformCapability {\n /** Platform id, e.g. `'venmo'` - the value `receive.platform` accepts. */\n platform: string;\n /** Market-rate (oracle-priced) currencies this platform can pay out. */\n currencies: CurrencyType[];\n /** Human hint for the payee handle format. */\n payeeHint: string;\n /**\n * When true, registering a payee for this platform requires a signed maker\n * identity attestation the SDK cannot produce - register the payee via the\n * ZKP2P app/extension first. A bare-handle `cashout()` throws\n * `PAYEE_VERIFICATION_REQUIRED`.\n */\n requiresIdentityAttestation: boolean;\n}\n\nexport interface CashCapabilities {\n chainId: number;\n token: { address: string; symbol: 'USDC'; decimals: number };\n environment: RuntimeEnv;\n /** Destination asset for every Peer Cash order. */\n destination: { chainId: number; token: { address: string; symbol: 'USDC'; decimals: number } };\n /**\n * Source discovery. The sync default is Base USDC only; pass\n * `{ includeRelaySources: true }` to `capabilities()` for live Relay EVM sources.\n */\n source: {\n default: { chainId: number; token: { address: string; symbol: 'USDC'; decimals: number } };\n relay?: CashSourceCapabilities;\n };\n /** Every payout corridor: platform × oracle-priced currencies. */\n platforms: CashPlatformCapability[];\n /** All oracle-priced (market-rate) currencies across platforms. */\n currencies: CurrencyType[];\n /** Amount bounds in USDC base units. */\n amount: { min: bigint; recommendedMin: bigint; max: null };\n /** Pricing is always the live oracle at fill time - never a committed quote. */\n pricing: { kind: 'oracle-market-rate'; spreadBps: 0 };\n}\n\nexport function buildCapabilities(environment: RuntimeEnv): CashCapabilities {\n const catalog = getPaymentMethodsCatalog(BASE_CHAIN_ID, environment);\n\n const platforms: CashPlatformCapability[] = Object.entries(catalog)\n .map(([platform, entry]) => {\n const currencies = (entry.currencies ?? [])\n .map((hash) => getCurrencyCodeFromHash(hash))\n .filter(\n (code): code is CurrencyType =>\n code != null && isMarketRateSupported(code as CurrencyType),\n );\n return {\n platform,\n currencies: [...new Set(currencies)],\n payeeHint: PAYEE_HINTS[platform] ?? 'Your payment handle for this platform',\n requiresIdentityAttestation: IDENTITY_ATTESTATION_PLATFORMS.has(platform),\n };\n })\n .filter((p) => p.currencies.length > 0)\n .sort((a, b) => a.platform.localeCompare(b.platform));\n\n const currencies = [...new Set(platforms.flatMap((p) => p.currencies))].sort();\n\n const baseUsdc = { address: BASE_USDC_ADDRESS, symbol: 'USDC' as const, decimals: USDC_DECIMALS };\n\n return {\n chainId: BASE_CHAIN_ID,\n token: baseUsdc,\n environment,\n destination: { chainId: BASE_CHAIN_ID, token: baseUsdc },\n source: { default: { chainId: BASE_CHAIN_ID, token: baseUsdc } },\n platforms,\n currencies,\n amount: { min: MIN_CASHOUT_AMOUNT, recommendedMin: RECOMMENDED_MIN_CASHOUT_AMOUNT, max: null },\n pricing: { kind: 'oracle-market-rate', spreadBps: 0 },\n };\n}\n","import { getPaymentMethodsCatalog } from '@zkp2p/sdk';\nimport type { Zkp2pClient } from '@zkp2p/sdk';\nimport { BASE_CHAIN_ID } from '../engine/constants';\nimport { derivePayouts } from '../engine/payouts';\nimport type { CurrencyType, RuntimeEnv } from '../sdk-types';\n\nconst ETA_WINDOW_DAYS = 7;\nconst ETA_WINDOW_SECONDS = ETA_WINDOW_DAYS * 24 * 60 * 60;\nconst ETA_SAMPLE_LIMIT = 250;\n\nconst FULFILLED = new Set(['FULFILLED', 'MANUALLY_RELEASED']);\n\nexport interface CashFillEta {\n /** Simple headline ETA from recent deposits. Undefined when no recent sample exists. */\n seconds?: number;\n /** Display-ready copy. Historical, not a guarantee. */\n label: string;\n}\n\ninterface IntentLike {\n status?: string | null;\n amount?: string | number | bigint | null;\n fulfillTimestamp?: string | number | null;\n}\n\ninterface DepositLike {\n id?: string | null;\n createdAt?: string | number | Date | null;\n timestamp?: string | number | null;\n remainingDeposits?: string | number | bigint | null;\n outstandingIntentAmount?: string | number | bigint | null;\n totalAmountTaken?: string | number | bigint | null;\n totalWithdrawn?: string | number | bigint | null;\n paymentMethods?: unknown[];\n currencies?: unknown[];\n intents?: IntentLike[];\n}\n\nfunction toUnixSeconds(value: unknown): number | undefined {\n if (value === null || value === undefined || value === '') return undefined;\n if (value instanceof Date) {\n const seconds = Math.floor(value.getTime() / 1000);\n return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;\n }\n if (typeof value === 'string' && /[TZ:-]/.test(value)) {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return Math.floor(parsed / 1000);\n }\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\nfunction median(values: number[]): number | undefined {\n if (values.length === 0) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 1 ? sorted[mid] : Math.round((sorted[mid - 1]! + sorted[mid]!) / 2);\n}\n\nfunction etaLabel(seconds: number | undefined): string {\n if (seconds === undefined) return 'Recent fill time unavailable';\n if (seconds < 60) return 'Usually starts in under a minute';\n const minutes = Math.max(1, Math.round(seconds / 60));\n if (minutes < 60) return `Usually starts in about ${minutes} min`;\n const hours = Math.max(1, Math.round(minutes / 60));\n return `Usually starts in about ${hours} hr`;\n}\n\nfunction matchesPayout(\n deposit: DepositLike,\n environment: RuntimeEnv,\n platform?: string,\n currency?: string,\n) {\n const payouts = derivePayouts(\n (deposit.paymentMethods ?? []) as never,\n (deposit.currencies ?? []) as never,\n getPaymentMethodsCatalog(BASE_CHAIN_ID, environment),\n );\n if (payouts.length === 0) return true;\n return payouts.some(\n (payout) =>\n (platform === undefined || payout.platform === platform) &&\n (currency === undefined || payout.currency === currency),\n );\n}\n\nexport async function readFillEta(\n client: Zkp2pClient,\n input: { environment: RuntimeEnv; platform?: string; currency: CurrencyType },\n): Promise<CashFillEta> {\n const now = Math.floor(Date.now() / 1000);\n const windowStart = now - ETA_WINDOW_SECONDS;\n const deposits = (await client.indexer.getDepositsWithRelations(\n { chainId: BASE_CHAIN_ID },\n { limit: ETA_SAMPLE_LIMIT, orderBy: 'updatedAt', orderDirection: 'desc' },\n { includeIntents: true, intentStatuses: ['FULFILLED', 'MANUALLY_RELEASED'] },\n )) as DepositLike[];\n\n const firstFillLatencies: number[] = [];\n for (const deposit of deposits) {\n const createdAt = toUnixSeconds(deposit.createdAt ?? deposit.timestamp);\n if (createdAt === undefined || createdAt < windowStart) continue;\n if (!matchesPayout(deposit, input.environment, input.platform, input.currency)) continue;\n\n const fulfilled = (deposit.intents ?? [])\n .filter((intent) => intent.status != null && FULFILLED.has(intent.status))\n .map((intent) => ({\n fulfilledAt: toUnixSeconds(intent.fulfillTimestamp),\n }))\n .filter(\n (intent): intent is { fulfilledAt: number } =>\n intent.fulfilledAt !== undefined && intent.fulfilledAt >= createdAt,\n )\n .sort((a, b) => a.fulfilledAt - b.fulfilledAt);\n\n if (fulfilled.length === 0) continue;\n firstFillLatencies.push(fulfilled[0]!.fulfilledAt - createdAt);\n }\n\n const seconds = median(firstFillLatencies);\n\n return {\n ...(seconds !== undefined ? { seconds } : {}),\n label: etaLabel(seconds),\n };\n}\n","import {\n createClient as createRelaySdkClient,\n MAINNET_RELAY_API,\n type Execute,\n type ProgressData,\n type RelayChain,\n type RelayClient,\n} from '@relayprotocol/relay-sdk';\nimport { configureDynamicChains, fetchChainConfigs } from '@relayprotocol/relay-sdk/chain-utils';\nimport type { WalletClient } from 'viem';\nimport { BASE_CHAIN_ID, BASE_USDC_ADDRESS, USDC_DECIMALS } from '../engine/constants';\nimport type { PreparedTransaction } from '../sdk-types';\n\nexport const RELAY_API_URL = MAINNET_RELAY_API;\n\nconst NATIVE_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport interface CashAsset {\n chainId: number;\n address: string;\n symbol: string;\n decimals: number;\n name?: string;\n isNative?: boolean;\n}\n\nexport interface CashChain {\n id: number;\n name: string;\n displayName: string;\n disabled: boolean;\n depositEnabled: boolean;\n blockProductionLagging: boolean;\n vmType?: string;\n tokens: CashAsset[];\n}\n\nexport interface CashSourceCapabilities {\n destination: CashAsset;\n chains: CashChain[];\n source: 'relay-sdk';\n asOf: number;\n}\n\nexport interface RelayOptions {\n apiUrl?: string;\n apiKey?: string;\n source?: string;\n client?: RelayClient;\n chains?: RelayChain[];\n}\n\nexport interface RelaySourceInput {\n chainId: number;\n currency: string;\n}\n\nexport interface RelayQuoteInput {\n user: string;\n amount: bigint;\n source: RelaySourceInput;\n recipient?: string;\n tradeType?: 'EXACT_INPUT' | 'EXACT_OUTPUT' | 'EXPECTED_OUTPUT';\n}\n\nexport interface RelayQuote {\n requestId?: string;\n source: CashAsset;\n destination: CashAsset;\n inputAmount: bigint;\n outputAmount: bigint;\n rate?: number;\n timeEstimateSeconds?: number;\n fees?: unknown;\n txs: PreparedTransaction[];\n raw: Execute;\n}\n\nexport interface RelayExecutionResult {\n requestId?: string;\n txHashes: string[];\n quote: Execute;\n}\n\nexport interface RelayStatus {\n requestId: string;\n status: 'refund' | 'waiting' | 'depositing' | 'failure' | 'pending' | 'submitted' | 'success';\n details?: string;\n inTxHashes: string[];\n txHashes: string[];\n updatedAt?: number;\n originChainId?: number;\n destinationChainId?: number;\n quoteCreatedAt?: number;\n raw: unknown;\n}\n\nexport const BASE_USDC_ASSET: CashAsset = {\n chainId: BASE_CHAIN_ID,\n address: BASE_USDC_ADDRESS,\n symbol: 'USDC',\n decimals: USDC_DECIMALS,\n name: 'USD Coin',\n};\n\nfunction relayClient(options: RelayOptions = {}): RelayClient {\n if (options.client) return options.client;\n return createRelaySdkClient({\n baseApiUrl: options.apiUrl ?? RELAY_API_URL,\n source: options.source ?? 'peer-cash',\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.chains ? { chains: options.chains } : {}),\n });\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction normalizeToken(chainId: number, token: unknown): CashAsset | null {\n const row = asRecord(token);\n const address = asString(row.address);\n const symbol = asString(row.symbol);\n const decimals = asNumber(row.decimals);\n const name = asString(row.name);\n if (!address || !symbol || decimals === undefined) return null;\n const metadata = asRecord(row.metadata);\n return {\n chainId,\n address,\n symbol,\n decimals,\n ...(name ? { name } : {}),\n ...(metadata.isNative === true || address.toLowerCase() === NATIVE_TOKEN_ADDRESS\n ? { isNative: true }\n : {}),\n };\n}\n\nfunction normalizeTx(data: unknown, chainId: number): PreparedTransaction | null {\n const row = asRecord(data);\n const to = asString(row.to);\n const calldata = asString(row.data) ?? '0x';\n if (!to) return null;\n return {\n to: to as PreparedTransaction['to'],\n data: calldata as PreparedTransaction['data'],\n value: BigInt(String(row.value ?? '0')),\n chainId: asNumber(row.chainId) ?? chainId,\n };\n}\n\nfunction normalizeChain(chain: RelayChain): CashChain {\n const row = asRecord(chain);\n const tokenRows = [\n chain.currency,\n ...(chain.featuredTokens ?? []),\n ...(chain.erc20Currencies ?? []),\n ...(chain.solverCurrencies ?? []),\n ];\n const tokens = new Map<string, CashAsset>();\n for (const token of tokenRows) {\n const normalizedToken = normalizeToken(chain.id, token);\n if (normalizedToken) tokens.set(normalizedToken.address.toLowerCase(), normalizedToken);\n }\n return {\n id: chain.id,\n name: chain.name,\n displayName: chain.displayName,\n disabled: row.disabled === true,\n depositEnabled: chain.depositEnabled ?? false,\n blockProductionLagging: chain.blockProductionLagging ?? false,\n ...(chain.vmType ? { vmType: chain.vmType } : {}),\n tokens: [...tokens.values()].sort((a, b) => a.symbol.localeCompare(b.symbol)),\n };\n}\n\nfunction isSupportedEvmChain(chain: CashChain): boolean {\n // RelayChain.vmType is optional in the SDK type and older/custom EVM chain\n // configs may omit it. Exclude chains only when Relay explicitly marks a\n // non-EVM VM that a viem WalletClient cannot execute.\n return chain.vmType === undefined || chain.vmType === 'evm';\n}\n\nfunction quoteRequestId(quote: Execute): string | undefined {\n return quote.steps.map((step) => step.requestId).find((id): id is string => id !== undefined);\n}\n\nfunction quoteSourceChainId(quote: Execute): number | undefined {\n const details = asRecord(quote.details);\n const currencyIn = asRecord(details.currencyIn);\n const sourceCurrency = asRecord(currencyIn.currency);\n return asNumber(sourceCurrency.chainId);\n}\n\nexport function sanitizeRelayQuoteRaw(quote: Execute): Execute {\n if (!quote.request) return quote;\n const request = { ...quote.request };\n delete request.headers;\n return { ...quote, request };\n}\n\nasync function resolveRelayChains(\n options: RelayOptions,\n client: RelayClient,\n config: { preferInjectedClientChains?: boolean } = {},\n): Promise<RelayChain[]> {\n const preferInjectedClientChains = config.preferInjectedClientChains ?? true;\n const chains =\n options.chains ??\n (preferInjectedClientChains && options.client?.chains?.length\n ? options.client.chains\n : undefined) ??\n (options.client\n ? await fetchChainConfigs(client.baseApiUrl, client.source, client.apiKey)\n : await configureDynamicChains());\n client.chains = chains;\n return chains;\n}\n\nfunction relayQuoteFromExecute(input: RelayQuoteInput, quote: Execute): RelayQuote {\n const details = asRecord(quote.details);\n const currencyIn = asRecord(details.currencyIn);\n const currencyOut = asRecord(details.currencyOut);\n const sourceCurrency = asRecord(currencyIn.currency);\n const destinationCurrency = asRecord(currencyOut.currency);\n const source = normalizeToken(input.source.chainId, sourceCurrency) ?? {\n chainId: input.source.chainId,\n address: input.source.currency,\n symbol: 'TOKEN',\n decimals: 0,\n };\n const destination = normalizeToken(BASE_CHAIN_ID, destinationCurrency) ?? BASE_USDC_ASSET;\n const txs = quote.steps.flatMap((step) =>\n step.items\n .map((item) => normalizeTx(item.data, input.source.chainId))\n .filter((tx): tx is PreparedTransaction => tx !== null),\n );\n const outputAmount = BigInt(\n String(currencyOut.minimumAmount ?? currencyOut.amount ?? input.amount.toString()),\n );\n const requestId = quoteRequestId(quote);\n const rate = asNumber(details.rate);\n const timeEstimateSeconds = asNumber(details.timeEstimate);\n return {\n ...(requestId ? { requestId } : {}),\n source,\n destination,\n inputAmount: BigInt(String(currencyIn.amount ?? input.amount.toString())),\n outputAmount,\n ...(rate !== undefined ? { rate } : {}),\n ...(timeEstimateSeconds !== undefined ? { timeEstimateSeconds } : {}),\n ...(quote.fees !== undefined ? { fees: quote.fees } : {}),\n txs,\n raw: sanitizeRelayQuoteRaw(quote),\n };\n}\n\nexport async function readRelaySourceCapabilities(\n options: RelayOptions = {},\n): Promise<CashSourceCapabilities> {\n const client = relayClient(options);\n const chains = await resolveRelayChains(options, client);\n return {\n destination: BASE_USDC_ASSET,\n chains: chains\n .map(normalizeChain)\n .filter((chain) => chain.tokens.length > 0 && isSupportedEvmChain(chain))\n .sort((a, b) => a.displayName.localeCompare(b.displayName)),\n source: 'relay-sdk',\n asOf: Math.floor(Date.now() / 1000),\n };\n}\n\nexport async function quoteRelayToBaseUsdc(\n input: RelayQuoteInput,\n options: RelayOptions = {},\n): Promise<RelayQuote> {\n const client = relayClient(options);\n const quote = await client.actions.getQuote(\n {\n chainId: input.source.chainId,\n currency: input.source.currency,\n toChainId: BASE_CHAIN_ID,\n toCurrency: BASE_USDC_ADDRESS,\n user: input.user,\n recipient: input.recipient ?? input.user,\n amount: input.amount.toString(),\n tradeType: input.tradeType ?? 'EXACT_INPUT',\n },\n false,\n );\n return relayQuoteFromExecute(input, quote);\n}\n\nexport async function executeRelayQuote(\n quote: Execute,\n wallet: WalletClient,\n options: {\n relay?: RelayOptions;\n onProgress?: (data: ProgressData) => void;\n disableCapabilitiesCheck?: boolean;\n } = {},\n): Promise<RelayExecutionResult> {\n const client = relayClient(options.relay);\n const sourceChainId = quoteSourceChainId(quote);\n if (\n sourceChainId !== undefined &&\n !(client.chains ?? []).some((chain) => chain.id === sourceChainId)\n ) {\n await resolveRelayChains(options.relay ?? {}, client, { preferInjectedClientChains: false });\n }\n const { data } = await client.actions.execute({\n quote,\n wallet,\n ...(options.onProgress ? { onProgress: options.onProgress } : {}),\n ...(options.disableCapabilitiesCheck !== undefined\n ? { disableCapabilitiesCheck: options.disableCapabilitiesCheck }\n : {}),\n });\n const requestId = quoteRequestId(data);\n return {\n ...(requestId ? { requestId } : {}),\n txHashes: data.steps.flatMap((step) =>\n step.items.flatMap((item) => (item.txHashes ?? []).map((tx) => tx.txHash)),\n ),\n quote: data,\n };\n}\n\nexport async function readRelayStatus(\n requestId: string,\n options: RelayOptions = {},\n): Promise<RelayStatus> {\n const client = relayClient(options);\n const response = await client.utils.request({\n url: `${client.baseApiUrl}/intents/status/v3`,\n method: 'get',\n params: { requestId },\n });\n const root = asRecord(response.data);\n const status = asString(root.status);\n if (\n status !== 'refund' &&\n status !== 'waiting' &&\n status !== 'depositing' &&\n status !== 'failure' &&\n status !== 'pending' &&\n status !== 'submitted' &&\n status !== 'success'\n ) {\n throw new Error(`Relay returned unknown status: ${String(root.status)}`);\n }\n const details = asString(root.details);\n const updatedAt = asNumber(root.updatedAt);\n const originChainId = asNumber(root.originChainId);\n const destinationChainId = asNumber(root.destinationChainId);\n const quoteCreatedAt = asNumber(root.quoteCreatedAt);\n return {\n requestId,\n status,\n ...(details ? { details } : {}),\n inTxHashes: Array.isArray(root.inTxHashes) ? root.inTxHashes.map(String) : [],\n txHashes: Array.isArray(root.txHashes) ? root.txHashes.map(String) : [],\n ...(updatedAt !== undefined ? { updatedAt } : {}),\n ...(originChainId !== undefined ? { originChainId } : {}),\n ...(destinationChainId !== undefined ? { destinationChainId } : {}),\n ...(quoteCreatedAt !== undefined ? { quoteCreatedAt } : {}),\n raw: response.data,\n };\n}\n","/**\n * Estimate - currency + amount only. No payee, no side effects, no expiry,\n * idempotent, cacheable. \"≈ at whatever the oracle says when a buyer fills.\"\n *\n * Reads the same Chainlink feed the protocol prices the deposit against, so\n * there is no external FX dependency. USD is a zero-address passthrough\n * (USDC ≈ USD). The binding rate resolves on-chain at fill time.\n */\nimport type { Address, PublicClient } from 'viem';\nimport type { Zkp2pClient } from '@zkp2p/sdk';\nimport { CHAINLINK_ORACLE_FEEDS } from '@zkp2p/sdk';\nimport type { CurrencyType } from '../sdk-types';\nimport { USDC_DECIMALS } from '../engine/constants';\nimport { isMarketRateSupported } from '../engine/marketRate';\nimport { errors } from './errors';\nimport { MIN_CASHOUT_AMOUNT } from './capabilities';\nimport { readFillEta, type CashFillEta } from './fillEta';\nimport {\n quoteRelayToBaseUsdc,\n type CashAsset,\n type RelayOptions,\n type RelayQuote,\n type RelaySourceInput,\n} from './relay';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst CHAINLINK_LATEST_ROUND_ABI = [\n {\n name: 'latestRoundData',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n },\n] as const;\n\nexport interface EstimateInput {\n /** Amount to cash out. Defaults to Base USDC base units; when `source` is set it is source-token base units. */\n amount: bigint;\n /** Target fiat currency. */\n currency: CurrencyType;\n /** Optional payout platform for platform-specific fill ETA sampling. */\n platform?: string;\n /** Optional Relay EVM source asset. Omit for the current Base USDC default path. */\n source?: RelaySourceInput & {\n /** Source wallet that will submit Relay's origin transaction. Required by Relay quote. */\n user: string;\n /** Base recipient for bridged USDC; defaults to `user`. */\n recipient?: string;\n tradeType?: 'EXACT_INPUT' | 'EXACT_OUTPUT' | 'EXPECTED_OUTPUT';\n };\n}\n\n/**\n * Chainlink feeds should update at least daily; a reading older than this is\n * flagged `stale` so a consumer can warn rather than quote a frozen rate. The\n * on-chain fill enforces the deposit's own `maxStaleness` regardless - this is\n * a display-side signal only.\n */\nconst DEFAULT_MAX_STALENESS_SECONDS = 86_400;\n\nexport interface CashEstimate {\n /** Always `'oracle-estimate'` - there is no committed quote in Peer Cash. */\n kind: 'oracle-estimate';\n currency: CurrencyType;\n /** Base USDC amount that Peer Cash would deposit after any source routing. */\n amount: bigint;\n /** Target-currency units per 1 USDC at the time of the read. */\n rate: number;\n /** `amount × rate` in target-currency units. */\n receiveAmount: number;\n /** Unix seconds when the oracle was read. */\n asOf: number;\n /** Unix seconds the Chainlink feed last updated (absent for the USD passthrough). */\n oracleUpdatedAt?: number;\n /** True when the feed reading is older than a day - treat the rate with caution. */\n stale?: boolean;\n /** Optional source asset route. Absent means same-chain Base USDC. */\n source?: {\n kind: 'relay';\n asset: CashAsset;\n inputAmount: bigint;\n relayQuote: RelayQuote;\n };\n /** Simple recent-fill ETA from indexer history. */\n eta?: CashFillEta;\n}\n\nexport async function readEstimate(\n publicClient: PublicClient,\n input: EstimateInput,\n context: {\n indexerClient?: Zkp2pClient;\n environment?: Parameters<typeof readFillEta>[1]['environment'];\n relay?: RelayOptions;\n } = {},\n): Promise<CashEstimate> {\n const { currency } = input;\n if (!isMarketRateSupported(currency)) {\n throw errors.oracleUnsupportedCurrency(currency);\n }\n\n const relayQuote =\n input.source !== undefined\n ? await quoteRelayToBaseUsdc(\n {\n user: input.source.user,\n amount: input.amount,\n source: { chainId: input.source.chainId, currency: input.source.currency },\n ...(input.source.recipient ? { recipient: input.source.recipient } : {}),\n ...(input.source.tradeType ? { tradeType: input.source.tradeType } : {}),\n },\n context.relay,\n )\n : undefined;\n\n const amount = relayQuote?.outputAmount ?? input.amount;\n if (amount < MIN_CASHOUT_AMOUNT) {\n throw errors.amountBelowMinimum(amount, MIN_CASHOUT_AMOUNT);\n }\n\n const feedConfig = CHAINLINK_ORACLE_FEEDS[currency];\n const asOf = Math.floor(Date.now() / 1000);\n\n let rate: number;\n let oracleUpdatedAt: number | undefined;\n if (!feedConfig || feedConfig.feed.toLowerCase() === ZERO_ADDRESS) {\n // USD passthrough - USDC ≈ USD.\n rate = 1;\n } else {\n const result = (await publicClient.readContract({\n address: feedConfig.feed as Address,\n abi: CHAINLINK_LATEST_ROUND_ABI,\n functionName: 'latestRoundData',\n })) as readonly [bigint, bigint, bigint, bigint, bigint];\n\n const answer = Number(result[1]);\n const price = answer / 10 ** feedConfig.decimals;\n if (!Number.isFinite(price) || price <= 0) {\n throw errors.oracleUnsupportedCurrency(currency);\n }\n const updatedAt = Number(result[3]);\n if (Number.isFinite(updatedAt) && updatedAt > 0) oracleUpdatedAt = updatedAt;\n // invert: feed is CCY/USD (USD per CCY) → target per USDC = 1/price.\n // else: feed is USD/CCY (CCY per USD) → target per USDC = price.\n rate = feedConfig.invert ? 1 / price : price;\n }\n\n const stale =\n oracleUpdatedAt !== undefined && asOf - oracleUpdatedAt > DEFAULT_MAX_STALENESS_SECONDS;\n\n const estimate: CashEstimate = {\n kind: 'oracle-estimate',\n currency,\n amount,\n rate,\n receiveAmount: (Number(amount) / 10 ** USDC_DECIMALS) * rate,\n asOf,\n ...(oracleUpdatedAt !== undefined ? { oracleUpdatedAt } : {}),\n ...(stale ? { stale: true } : {}),\n ...(relayQuote\n ? {\n source: {\n kind: 'relay',\n asset: relayQuote.source,\n inputAmount: relayQuote.inputAmount,\n relayQuote,\n },\n }\n : {}),\n };\n\n if (context.indexerClient && context.environment) {\n try {\n estimate.eta = await readFillEta(context.indexerClient, {\n environment: context.environment,\n currency,\n ...(input.platform ? { platform: input.platform } : {}),\n });\n } catch {\n // ETA is historical garnish; the oracle estimate remains usable without it.\n }\n }\n\n return estimate;\n}\n","/**\n * `createCashClient` - the eight-verb facade over a read-only `Zkp2pClient`.\n *\n * The facade keeps the outward surface tiny (capabilities / estimate / cashout\n * / order / orders / watch / withdraw / topUp) while reusing the published\n * SDK's battle-tested internals. A React app, a Node service, and an AI agent\n * are equal consumers: every mutating verb has an unsigned `prepare` path,\n * every wire type is serializable, and every transaction carries ERC-8021\n * attribution ({@link CASH_ATTRIBUTION_CODE}).\n */\nimport {\n createWalletClient,\n encodeFunctionData,\n http,\n parseAbi,\n type Address,\n type Hash,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { base } from 'viem/chains';\nimport { Zkp2pClient, getPaymentMethodsCatalog, appendAttributionToCalldata } from '@zkp2p/sdk';\nimport type {\n CurrencyType,\n CuratorPayeeDataInput,\n PreparedTransaction,\n RuntimeEnv,\n TxOverrides,\n} from '../sdk-types';\nimport { BASE_CHAIN_ID, BASE_USDC_ADDRESS, CASH_ORDER_STATUSES } from '../engine/constants';\nimport { isMarketRateSupported, prepareCashDepositParams } from '../engine/marketRate';\nimport { deriveCashOrder, isFillLive, type DeriveCashOrderOptions } from '../engine/orderState';\nimport { derivePayouts } from '../engine/payouts';\nimport { deriveBuyerProfile } from '../engine/buyerProfile';\nimport { toBigIntOrUndefined } from '../internal/convert';\nimport { parseCompositeDepositId, resolveCashDepositId } from '../engine/resolveDeposit';\nimport type { CashBuyerProfile, CashDepositInput, CashOrder } from '../engine/types';\nimport {\n buildCapabilities,\n platformRequiresIdentityAttestation,\n MIN_CASHOUT_AMOUNT,\n type CashCapabilities,\n} from './capabilities';\nimport { readEstimate, type CashEstimate, type EstimateInput } from './estimate';\nimport { CashError, errors, isCashError, mapChainError } from './errors';\nimport {\n readRelaySourceCapabilities,\n readRelayStatus,\n quoteRelayToBaseUsdc,\n executeRelayQuote,\n type CashSourceCapabilities,\n type RelayOptions,\n type RelayExecutionResult,\n type RelayQuote,\n type RelayQuoteInput,\n type RelaySourceInput,\n type RelayStatus,\n} from './relay';\nimport type { Execute, ProgressData } from '@relayprotocol/relay-sdk';\n\nconst DEFAULT_RPC_URL = 'https://mainnet.base.org';\n\n/**\n * ERC-8021 attribution code stamped on every transaction this package\n * produces (signed and prepare paths, including approves). Integrator codes\n * from `CashClientOptions.referrer` are appended after it; the SDK always\n * appends the Base builder code last.\n */\nexport const CASH_ATTRIBUTION_CODE = 'peer-cash';\n\n/**\n * The SDK selects the indexer from `runtimeEnv` but defaults the curator to\n * production; staging has its own curator deployment (same convention as the\n * first-party clients).\n */\nconst DEFAULT_CURATOR_URLS: Partial<Record<RuntimeEnv, string>> = {\n staging: 'https://api-staging.zkp2p.xyz',\n};\nconst ERC20_APPROVE_ABI = parseAbi([\n 'function approve(address spender, uint256 amount) returns (bool)',\n]);\nconst ERC20_ALLOWANCE_ABI = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n]);\n\nexport interface CashClientOptions {\n /** `'production' | 'preproduction' | 'staging'` - selects contracts, curator, and indexer. */\n environment: RuntimeEnv;\n /** viem transport for RPC reads; defaults to the public Base RPC. */\n transport?: Transport;\n /** Convenience alternative to `transport`. */\n rpcUrl?: string;\n /** Indexer URL override. */\n indexerUrl?: string;\n /** Curator (ZKP2P API) URL override. */\n curatorUrl?: string;\n /** Optional ZKP2P API key. */\n apiKey?: string;\n /** Relay API configuration for source assets outside Base USDC. */\n relay?: RelayOptions;\n /**\n * Your own ERC-8021 attribution code(s), appended after\n * {@link CASH_ATTRIBUTION_CODE} on every transaction (e.g. `'acme-app'`).\n */\n referrer?: string | string[];\n}\n\n/** One payout leg: platform + currency + payee handle. */\nexport interface CashLeg {\n /** Platform id from `capabilities()`, e.g. `'venmo'`. */\n platform: string;\n /** Fiat currency to receive. */\n currency: CurrencyType;\n /** Payee details, e.g. `{ offchainId: '@andrew' }`. */\n payee: CuratorPayeeDataInput;\n}\n\nexport interface CashoutInput {\n /**\n * Amount to cash out. Defaults to Base USDC base units. When `source` is set,\n * this is source-token base units and Relay routes it into Base USDC first.\n */\n amount: bigint;\n /** Optional Relay source asset. Omit for the Base USDC default path. */\n source?: RelaySourceInput & {\n /** Base recipient for bridged USDC; defaults to the signer address. */\n recipient?: string;\n tradeType?: 'EXACT_INPUT' | 'EXACT_OUTPUT' | 'EXPECTED_OUTPUT';\n };\n /** Where the fiat should arrive. Multi-payout is a deliberate v1 cut. */\n receive: CashLeg;\n /** Per-order min/max override (USDC base units). */\n intentAmountRange?: { min: bigint; max: bigint };\n}\n\nexport interface SignerOptions {\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient;\n}\n\nexport interface CashoutOptions extends SignerOptions {\n /** Source-chain signer for Relay. Required when `input.source.chainId` is not Base. */\n sourceSigner?: WalletClient;\n /** Relay execution progress callback when `input.source` is present. */\n onSourceProgress?: (data: ProgressData) => void;\n /** Forwarded to Relay SDK for wallets with broken EIP-5792 capability calls. */\n disableSourceCapabilitiesCheck?: boolean;\n}\n\nexport interface WithdrawOptions extends SignerOptions {\n /**\n * Partial amount to withdraw (USDC base units). Only unlocked funds are\n * withdrawable partially - a live buyer intent does not block it. Omit to\n * close the order fully (prunes expired intents first when needed).\n */\n amount?: bigint;\n}\n\nexport interface TopUpResult {\n depositId: string;\n txHash: Hash;\n}\n\nexport type CashPreparedStepKind =\n | 'approve'\n | 'createDeposit'\n | 'pruneExpiredIntents'\n | 'withdrawDeposit'\n | 'removeFunds'\n | 'addFunds';\n\nexport interface CashPreparedStep {\n /** Stable action label for the transaction at the same index in `txs[]`. */\n kind: CashPreparedStepKind;\n /** Human-readable reason to show in approval UIs, logs, or policy reviews. */\n description: string;\n}\n\nexport interface CashoutResult {\n /** Composite deposit id (`escrow_onchainId`) - the resume key. Bind it to your user. */\n depositId: string;\n txHash: Hash;\n escrowAddress: string;\n onchainDepositId: bigint;\n /** Optimistic snapshot (`awaiting-buyer`); poll `order(depositId)` for live state. */\n order: CashOrder;\n /** Present when `cashout()` first routed a source asset through Relay. */\n source?: { amount: bigint; requestId?: string; txHashes: string[] };\n}\n\nexport interface PrepareResult {\n /**\n * Unsigned transactions in submission order: `[approve, createDeposit]`.\n * Submit with any signer - agent wallet, AA bundler, server key. Drop the\n * approve when the escrow already has sufficient allowance.\n */\n txs: PreparedTransaction[];\n /** One label per transaction in `txs[]`, same order. */\n steps: CashPreparedStep[];\n /** Curator payee registration output - the payee hashes now live on the deposit params. */\n register: { hashedOnchainIds: string[] };\n}\n\nexport interface WithdrawResult {\n depositId: string;\n /** Present when expired intents had to be pruned before withdrawal. */\n pruneTxHash?: Hash;\n withdrawTxHash: Hash;\n}\n\nexport interface WatchOptions {\n signal?: AbortSignal;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface OrdersOptions {\n /** Only orders still needing attention (`awaiting-buyer` / `matched` / `delivering`). */\n inFlight?: boolean;\n /** Max deposits to scan (default 100). */\n limit?: number;\n}\n\nexport interface CashClient {\n /** 0 - Discovery: sync, static. */\n capabilities(): CashCapabilities;\n /** 0b - Discovery with live Relay-supported EVM source chains/tokens. */\n capabilities(options: { includeRelaySources: true }): Promise<CashCapabilities>;\n /** Relay-only source discovery helper. */\n sourceCapabilities(): Promise<CashSourceCapabilities>;\n /** Quote any Relay-supported EVM source asset into Base USDC. */\n quoteSource(input: RelayQuoteInput): Promise<RelayQuote>;\n /** Execute a Relay SDK quote into Base USDC before starting the Peer Cash order. */\n executeSourceQuote(\n quote: Execute,\n opts: SignerOptions & {\n onProgress?: (data: ProgressData) => void;\n disableCapabilitiesCheck?: boolean;\n },\n ): Promise<RelayExecutionResult>;\n /** Track Relay execution status by quote/request id. */\n relayStatus(requestId: string): Promise<RelayStatus>;\n /** 1 - Estimate: currency + amount only. No payee, no side effects, no expiry. */\n estimate(input: EstimateInput): Promise<CashEstimate>;\n /** 2 - Cash out: payee registration + deposit params + submission happen here. */\n cashout(input: CashoutInput, opts: CashoutOptions): Promise<CashoutResult>;\n /** 2b - Unsigned path: `txs[]` for agent wallets, AA, server keys, policy layers. */\n prepare(input: CashoutInput): Promise<PrepareResult>;\n /** 3 - Observe: resumable from `depositId` alone; no session state anywhere. */\n order(depositId: string): Promise<CashOrder>;\n /**\n * 3b - Observe helper: a buyer's protocol track record from their full\n * intent history. Answers \"who just matched my order?\" during `matched`.\n */\n buyer(address: string): Promise<CashBuyerProfile>;\n /** 4 - List: indexer-native. A cash order IS a deposit; the chain is the database. */\n orders(owner: string, opts?: OrdersOptions): Promise<CashOrder[]>;\n /** 5 - Watch: yields on change; ends at a terminal state, abort, or timeout. */\n watch(depositId: string, opts?: WatchOptions): AsyncGenerator<CashOrder, void, void>;\n /**\n * 6 - Withdraw: ONE unwind verb. With `amount`, withdraws that much of the\n * unlocked balance (partial; a live buyer intent does not block it).\n * Without, closes the order fully - pruning expired intents first when\n * needed.\n */\n withdraw(depositId: string, opts: WithdrawOptions): Promise<WithdrawResult>;\n /**\n * 6b - Unsigned path for the unwind verb (agent surface): the same state\n * checks as `withdraw()`, returning `txs[]` for host-side signing.\n */\n prepareWithdraw(\n depositId: string,\n opts?: { amount?: bigint },\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }>;\n /** 7 - Top up: add USDC to a live order (same payee, same market rate). */\n topUp(depositId: string, amount: bigint, opts: SignerOptions): Promise<TopUpResult>;\n /** 7b - Unsigned path: `[approve, addFunds]` for host-side signing. */\n prepareTopUp(\n depositId: string,\n amount: bigint,\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }>;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n signal?.removeEventListener('abort', done);\n clearTimeout(timer);\n resolve();\n }\n signal?.addEventListener('abort', done, { once: true });\n });\n}\n\nfunction orderFingerprint(order: CashOrder): string {\n return [\n order.state,\n order.filledAmount,\n order.pendingAmount,\n order.returnedAmount,\n order.intentCount ?? 0,\n order.nextActions.join('+'),\n ].join('|');\n}\n\n/**\n * Send a mutating on-chain call, then wait for and verify its receipt.\n * Submission errors are mapped to typed `CashError`s; a reverted receipt\n * throws `TRANSACTION_FAILED` - a mutating verb never reports success for a\n * transaction that did not land, and never leaks a raw RPC error to the caller.\n */\nasync function submitAndConfirm(\n client: Zkp2pClient,\n verb: string,\n send: () => Promise<`0x${string}`>,\n): Promise<Hash> {\n let hash: Hash;\n try {\n hash = (await send()) as Hash;\n } catch (err) {\n throw mapChainError(verb, err);\n }\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(hash);\n return hash;\n}\n\n/** The indexer aggregate fields both deposit queries share. */\ntype DepositAggregates = {\n remainingDeposits?: string | number | null;\n outstandingIntentAmount?: string | number | null;\n totalAmountTaken?: string | number | null;\n totalWithdrawn?: string | number | null;\n status?: string | null;\n totalIntents?: number | null;\n updatedAt?: string | number | null;\n};\n\n/** The indexer aggregate fields both deposit queries share. */\ntype DepositAggregatesWithQuality = DepositAggregates & {\n successRateBps?: number | null;\n};\n\n/** Map raw indexer deposit aggregates to `deriveCashOrder` options. */\nfunction depositOrderOptions(deposit: DepositAggregatesWithQuality): DeriveCashOrderOptions {\n const remaining = toBigIntOrUndefined(deposit.remainingDeposits);\n const outstanding = toBigIntOrUndefined(deposit.outstandingIntentAmount);\n const taken = toBigIntOrUndefined(deposit.totalAmountTaken);\n const withdrawn = toBigIntOrUndefined(deposit.totalWithdrawn);\n const updatedAt = deposit.updatedAt != null ? Number(deposit.updatedAt) : undefined;\n return {\n ...(remaining !== undefined ? { remainingAmount: remaining } : {}),\n ...(outstanding !== undefined ? { outstandingAmount: outstanding } : {}),\n ...(taken !== undefined ? { takenAmount: taken } : {}),\n ...(withdrawn !== undefined ? { withdrawnAmount: withdrawn } : {}),\n ...(deposit.status != null ? { status: deposit.status } : {}),\n ...(deposit.totalIntents != null ? { intentCount: deposit.totalIntents } : {}),\n ...(deposit.successRateBps != null ? { successRateBps: deposit.successRateBps } : {}),\n ...(updatedAt !== undefined && Number.isFinite(updatedAt) ? { updatedAt } : {}),\n };\n}\n\nexport function createCashClient(options: CashClientOptions): CashClient {\n const { environment } = options;\n const transport = options.transport ?? http(options.rpcUrl ?? DEFAULT_RPC_URL);\n\n // ERC-8021: 'peer-cash' first, then integrator codes; the SDK appends the\n // Base builder code last. Applied to every mutating call on both paths.\n const referrerCodes = [\n CASH_ATTRIBUTION_CODE,\n ...(options.referrer === undefined\n ? []\n : Array.isArray(options.referrer)\n ? options.referrer\n : [options.referrer]),\n ];\n const attribution: TxOverrides = { referrer: referrerCodes };\n\n function buildSdkClient(walletClient: WalletClient): Zkp2pClient {\n return new Zkp2pClient({\n walletClient,\n chainId: BASE_CHAIN_ID,\n runtimeEnv: environment,\n rpcTransport: transport,\n ...(options.rpcUrl ? { rpcUrl: options.rpcUrl } : {}),\n ...(options.indexerUrl ? { indexerUrl: options.indexerUrl } : {}),\n ...((options.curatorUrl ?? DEFAULT_CURATOR_URLS[environment])\n ? { baseApiUrl: options.curatorUrl ?? DEFAULT_CURATOR_URLS[environment] }\n : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n });\n }\n\n // Read-only client - indexer, curator registration, oracle reads.\n const readClient = buildSdkClient(createWalletClient({ chain: base, transport }));\n\n // Signing clients are built lazily and cached per WalletClient identity.\n const signingClients = new WeakMap<WalletClient, Zkp2pClient>();\n function signingClient(verb: string, opts?: SignerOptions): Zkp2pClient {\n const signer = opts?.signer;\n if (!signer?.account) throw errors.signerRequired(verb);\n let client = signingClients.get(signer);\n if (!client) {\n client = buildSdkClient(signer);\n signingClients.set(signer, client);\n }\n return client;\n }\n\n function validatePayout(input: CashoutInput): Omit<CashDepositInput, 'amount'> {\n const { receive } = input;\n const catalog = getPaymentMethodsCatalog(BASE_CHAIN_ID, environment);\n if (!catalog[receive.platform]) throw errors.unsupportedPlatform(receive.platform);\n if (!isMarketRateSupported(receive.currency)) {\n throw errors.oracleUnsupportedCurrency(receive.currency);\n }\n // Wise/PayPal require a signed maker identity attestation the SDK can't\n // mint. Reject early unless the caller supplied one on the payee.\n if (\n platformRequiresIdentityAttestation(receive.platform) &&\n !(receive.payee as { identityAttestation?: unknown }).identityAttestation\n ) {\n throw errors.payeeVerificationRequired(receive.platform);\n }\n return {\n payouts: [\n {\n processorName: receive.platform,\n currency: receive.currency,\n payeeData: receive.payee,\n },\n ],\n ...(input.intentAmountRange ? { intentAmountRange: input.intentAmountRange } : {}),\n };\n }\n\n function validateInput(input: CashoutInput): CashDepositInput {\n if (input.amount < MIN_CASHOUT_AMOUNT) {\n throw errors.amountBelowMinimum(input.amount, MIN_CASHOUT_AMOUNT);\n }\n return { amount: input.amount, ...validatePayout(input) };\n }\n\n async function buildDepositParams(client: Zkp2pClient, depositInput: CashDepositInput) {\n try {\n return await prepareCashDepositParams(client, depositInput);\n } catch (err) {\n if (isCashError(err)) throw err;\n // The curator rejects Wise/PayPal payees that lack a signed attestation.\n const message = err instanceof Error ? err.message : String(err);\n if (/identityAttestation is required|identity attestation/i.test(message)) {\n const platform = depositInput.payouts[0]?.processorName ?? 'this platform';\n throw errors.payeeVerificationRequired(platform, err);\n }\n throw errors.payeeRegistrationFailed(err);\n }\n }\n\n async function fetchOrder(depositId: string): Promise<CashOrder> {\n const deposits = await readClient.indexer.getDepositsByIdsWithRelations([depositId], {\n includeIntents: true,\n intentStatuses: CASH_ORDER_STATUSES,\n });\n const deposit = deposits[0];\n\n if (!deposit) {\n // Deposit not yet indexed (lag right after creation) - read intents directly.\n const intents = await readClient.indexer.getIntentsForDeposits(\n [depositId],\n CASH_ORDER_STATUSES,\n );\n if (intents.length === 0) throw errors.orderNotFound(depositId);\n return deriveCashOrder(depositId, intents);\n }\n\n // Reconstruct the payout legs (platform, currency, payee hash, pricing\n // proof) from the relations the same query already returned.\n const payouts = derivePayouts(\n deposit.paymentMethods ?? [],\n deposit.currencies ?? [],\n getPaymentMethodsCatalog(BASE_CHAIN_ID, environment),\n );\n\n return deriveCashOrder(depositId, deposit.intents ?? [], {\n ...depositOrderOptions(deposit),\n ...(payouts.length > 0 ? { payouts } : {}),\n });\n }\n\n /** Parse the composite id into the on-chain id + optional escrow override. */\n function escrowContext(depositId: string): {\n onchainDepositId: bigint;\n escrowArg: { escrowAddress?: Address };\n } {\n const { escrowAddress, onchainDepositId } = parseCompositeDepositId(depositId);\n return {\n onchainDepositId,\n escrowArg: escrowAddress ? { escrowAddress: escrowAddress as Address } : {},\n };\n }\n\n /** Available (unlocked, undelivered) balance of an order. */\n function availableAmount(order: CashOrder): bigint {\n return order.totalAmount - order.filledAmount - order.pendingAmount - order.returnedAmount;\n }\n\n /**\n * State gate for the full-close withdraw paths: throws when withdrawal is\n * blocked or pointless, and reports whether an expired intent must be\n * pruned first.\n */\n async function withdrawContext(depositId: string): Promise<{\n expiredIntent: boolean;\n onchainDepositId: bigint;\n escrowArg: { escrowAddress?: Address };\n }> {\n const order = await fetchOrder(depositId);\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n const signaled = order.fills.filter((f) => f.status === 'SIGNALED');\n const liveIntent = signaled.some((f) => isFillLive(f, nowSeconds));\n const expiredIntent = signaled.length > 0 && !liveIntent;\n\n if (order.pendingAmount > 0n && liveIntent) {\n throw errors.activeIntentBlocksWithdrawal(depositId);\n }\n if (availableAmount(order) <= 0n && order.pendingAmount === 0n) {\n throw errors.nothingToWithdraw(depositId);\n }\n\n return { expiredIntent, ...escrowContext(depositId) };\n }\n\n /**\n * State gate for partial withdrawal: only the unlocked balance is\n * withdrawable, but a live buyer intent does not block it.\n */\n async function partialWithdrawContext(\n depositId: string,\n amount: bigint,\n ): Promise<{ onchainDepositId: bigint; escrowArg: { escrowAddress?: Address } }> {\n if (amount <= 0n) throw errors.amountBelowMinimum(amount, 1n);\n const order = await fetchOrder(depositId);\n const available = availableAmount(order);\n if (amount > available) {\n throw errors.insufficientAvailableFunds(depositId, amount, available);\n }\n return escrowContext(depositId);\n }\n\n /** State gate for top-ups: the order must still be live. */\n async function topUpContext(\n depositId: string,\n amount: bigint,\n ): Promise<{ onchainDepositId: bigint; escrowArg: { escrowAddress?: Address } }> {\n if (amount < MIN_CASHOUT_AMOUNT) throw errors.amountBelowMinimum(amount, MIN_CASHOUT_AMOUNT);\n const order = await fetchOrder(depositId);\n if (!order.isInFlight) throw errors.orderNotActive(depositId);\n return escrowContext(depositId);\n }\n\n function capabilities(): CashCapabilities;\n function capabilities(capabilityOptions: {\n includeRelaySources: true;\n }): Promise<CashCapabilities>;\n function capabilities(capabilityOptions?: {\n includeRelaySources?: true;\n }): CashCapabilities | Promise<CashCapabilities> {\n const baseCapabilities = buildCapabilities(environment);\n if (!capabilityOptions?.includeRelaySources) return baseCapabilities;\n return readRelaySourceCapabilities(options.relay).then((relay) => ({\n ...baseCapabilities,\n source: { ...baseCapabilities.source, relay },\n }));\n }\n\n /**\n * Ensure the escrow can pull the deposit amount, and make the allowance\n * durable before returning: `ensureAllowance` sends the approve without\n * waiting for it to mine, and load-balanced RPC replicas can serve stale\n * `eth_call` state even after the receipt lands - so wait for the receipt,\n * then poll until the allowance is visible on the read path.\n */\n async function settleAllowance(\n client: Zkp2pClient,\n token: Address,\n owner: Address,\n escrow: Address,\n amount: bigint,\n ): Promise<void> {\n let allowance: { hadAllowance: boolean; hash?: Hash };\n try {\n allowance = await client.ensureAllowance({\n token,\n amount,\n spender: escrow,\n txOverrides: attribution,\n });\n } catch (err) {\n throw mapChainError('approve', err);\n }\n if (allowance.hadAllowance || !allowance.hash) return;\n\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash: allowance.hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(allowance.hash);\n\n for (let attempt = 0; attempt < 15; attempt++) {\n const visible = (await client.publicClient.readContract({\n address: token,\n abi: ERC20_ALLOWANCE_ABI,\n functionName: 'allowance',\n args: [owner, escrow],\n })) as bigint;\n if (visible >= amount) return;\n await sleep(1_000);\n }\n // The approve mined but the allowance never surfaced on the read path -\n // surface it as retryable rather than blindly submitting a doomed deposit.\n throw errors.allowanceNotVisible(amount);\n }\n\n return {\n capabilities,\n\n async sourceCapabilities(): Promise<CashSourceCapabilities> {\n return readRelaySourceCapabilities(options.relay);\n },\n\n async quoteSource(input: RelayQuoteInput): Promise<RelayQuote> {\n return quoteRelayToBaseUsdc(input, options.relay);\n },\n\n async executeSourceQuote(\n quote: Execute,\n opts: SignerOptions & {\n onProgress?: (data: ProgressData) => void;\n disableCapabilitiesCheck?: boolean;\n },\n ): Promise<RelayExecutionResult> {\n return executeRelayQuote(quote, opts.signer, {\n ...(options.relay ? { relay: options.relay } : {}),\n ...(opts.onProgress ? { onProgress: opts.onProgress } : {}),\n ...(opts.disableCapabilitiesCheck !== undefined\n ? { disableCapabilitiesCheck: opts.disableCapabilitiesCheck }\n : {}),\n });\n },\n\n async relayStatus(requestId: string): Promise<RelayStatus> {\n return readRelayStatus(requestId, options.relay);\n },\n\n async estimate(input: EstimateInput): Promise<CashEstimate> {\n return readEstimate(readClient.publicClient, input, {\n indexerClient: readClient,\n environment,\n ...(options.relay ? { relay: options.relay } : {}),\n });\n },\n\n async cashout(input: CashoutInput, opts: CashoutOptions): Promise<CashoutResult> {\n const client = signingClient('cashout', opts);\n const owner = opts.signer.account!.address;\n const payoutInput = validatePayout(input);\n\n let sourceResult: CashoutResult['source'];\n let cashoutAmount = input.amount;\n if (input.source) {\n const sourceSigner =\n opts.sourceSigner ?? (input.source.chainId === BASE_CHAIN_ID ? opts.signer : undefined);\n if (!sourceSigner?.account) throw errors.signerRequired('source cashout');\n if (\n input.source.recipient !== undefined &&\n input.source.recipient.toLowerCase() !== owner.toLowerCase()\n ) {\n throw errors.sourceRecipientMismatch(input.source.recipient, owner);\n }\n const relayQuote = await quoteRelayToBaseUsdc(\n {\n user: sourceSigner.account.address,\n amount: input.amount,\n source: { chainId: input.source.chainId, currency: input.source.currency },\n recipient: owner,\n ...(input.source.tradeType ? { tradeType: input.source.tradeType } : {}),\n },\n options.relay,\n );\n if (relayQuote.outputAmount < MIN_CASHOUT_AMOUNT) {\n throw errors.amountBelowMinimum(relayQuote.outputAmount, MIN_CASHOUT_AMOUNT);\n }\n cashoutAmount = relayQuote.outputAmount;\n const depositInput: CashDepositInput = { amount: cashoutAmount, ...payoutInput };\n const params = await buildDepositParams(client, depositInput);\n\n // Spender must be the escrow createDeposit will target - the default can\n // point at the legacy escrow while deposits go to EscrowV2.\n const escrow = client.escrowV2Address ?? client.escrowAddress;\n await settleAllowance(client, params.token, owner, escrow, depositInput.amount);\n\n const executed = await executeRelayQuote(relayQuote.raw, sourceSigner, {\n ...(options.relay ? { relay: options.relay } : {}),\n ...(opts.onSourceProgress ? { onProgress: opts.onSourceProgress } : {}),\n ...(opts.disableSourceCapabilitiesCheck !== undefined\n ? { disableCapabilitiesCheck: opts.disableSourceCapabilitiesCheck }\n : {}),\n });\n sourceResult = {\n amount: cashoutAmount,\n ...(executed.requestId ? { requestId: executed.requestId } : {}),\n txHashes: executed.txHashes,\n };\n\n const attributedParams = { ...params, txOverrides: attribution };\n // Submit the deposit; one retry for the replica-lag case the allowance\n // visibility loop cannot fully rule out. All other failures map to typed\n // errors and a reverted receipt throws - no raw errors, no false success.\n const send = async (): Promise<`0x${string}`> => {\n try {\n return (await client.createDeposit(attributedParams)).hash;\n } catch (err) {\n if (err instanceof Error && /exceeds allowance/i.test(err.message)) {\n await sleep(2_000);\n return (await client.createDeposit(attributedParams)).hash;\n }\n throw err;\n }\n };\n\n let hash: Hash;\n try {\n hash = (await send()) as Hash;\n } catch (err) {\n throw mapChainError('createDeposit', err);\n }\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(hash);\n\n const abi = client.escrowV2Abi ?? client.escrowAbi;\n const resolved = resolveCashDepositId({ logs: receipt.logs, abi });\n if (!resolved) throw errors.depositResolutionFailed(hash);\n\n const order = deriveCashOrder(resolved.compositeId, [], {\n remainingAmount: depositInput.amount,\n status: 'ACTIVE',\n });\n\n return {\n depositId: resolved.compositeId,\n txHash: hash,\n escrowAddress: resolved.escrowAddress,\n onchainDepositId: resolved.onchainDepositId,\n order,\n source: sourceResult,\n };\n }\n\n const depositInput = validateInput(input);\n const params = await buildDepositParams(client, depositInput);\n\n // Spender must be the escrow createDeposit will target - the default can\n // point at the legacy escrow while deposits go to EscrowV2.\n const escrow = client.escrowV2Address ?? client.escrowAddress;\n await settleAllowance(client, params.token, owner, escrow, depositInput.amount);\n\n const attributedParams = { ...params, txOverrides: attribution };\n // Submit the deposit; one retry for the replica-lag case the allowance\n // visibility loop cannot fully rule out. All other failures map to typed\n // errors and a reverted receipt throws - no raw errors, no false success.\n const send = async (): Promise<`0x${string}`> => {\n try {\n return (await client.createDeposit(attributedParams)).hash;\n } catch (err) {\n if (err instanceof Error && /exceeds allowance/i.test(err.message)) {\n await sleep(2_000);\n return (await client.createDeposit(attributedParams)).hash;\n }\n throw err;\n }\n };\n\n let hash: Hash;\n try {\n hash = (await send()) as Hash;\n } catch (err) {\n throw mapChainError('createDeposit', err);\n }\n const receipt = await client.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status === 'reverted') throw errors.transactionFailed(hash);\n\n const abi = client.escrowV2Abi ?? client.escrowAbi;\n const resolved = resolveCashDepositId({ logs: receipt.logs, abi });\n if (!resolved) throw errors.depositResolutionFailed(hash);\n\n const order = deriveCashOrder(resolved.compositeId, [], {\n remainingAmount: depositInput.amount,\n status: 'ACTIVE',\n });\n\n return {\n depositId: resolved.compositeId,\n txHash: hash,\n escrowAddress: resolved.escrowAddress,\n onchainDepositId: resolved.onchainDepositId,\n order,\n ...(sourceResult ? { source: sourceResult } : {}),\n };\n },\n\n async prepare(input: CashoutInput): Promise<PrepareResult> {\n if (input.source) throw errors.sourceRouteUnsupportedInPrepare();\n const depositInput = validateInput(input);\n const params = await buildDepositParams(readClient, depositInput);\n\n const { prepared } = await readClient.prepareCreateDeposit({\n ...params,\n txOverrides: attribution,\n });\n\n const approve: PreparedTransaction = {\n to: params.token,\n data: appendAttributionToCalldata(\n encodeFunctionData({\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [prepared.to as Address, depositInput.amount],\n }),\n referrerCodes,\n ),\n value: 0n,\n chainId: BASE_CHAIN_ID,\n };\n\n const hashedOnchainIds = (params.paymentMethodDataOverride ?? []).map((d) => d.payeeDetails);\n\n return {\n txs: [approve, prepared],\n steps: [\n {\n kind: 'approve',\n description: 'Approve Base USDC for the Peer Cash escrow.',\n },\n {\n kind: 'createDeposit',\n description: 'Create the protocol-held cash-out order.',\n },\n ],\n register: { hashedOnchainIds },\n };\n },\n\n async order(depositId: string): Promise<CashOrder> {\n return fetchOrder(depositId);\n },\n\n async buyer(address: string): Promise<CashBuyerProfile> {\n const intents = await readClient.indexer.getOwnerIntents(address, CASH_ORDER_STATUSES);\n return deriveBuyerProfile(address, intents);\n },\n\n async orders(owner: string, opts: OrdersOptions = {}): Promise<CashOrder[]> {\n const { inFlight = false, limit = 100 } = opts;\n const deposits = await readClient.indexer.getDeposits({ depositor: owner }, { limit });\n\n const derived = deposits\n // List rows carry no intent detail - flag it so `nextActions` treats a\n // live outstanding amount conservatively (no false \"withdraw\" offer).\n .map((d) => deriveCashOrder(d.id, [], { ...depositOrderOptions(d), fillsIncluded: false }))\n // Drop dust/empty deposits that never represented a real cash-out.\n .filter((o) => o.totalAmount > 10_000n)\n .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\n return inFlight ? derived.filter((o) => o.isInFlight) : derived;\n },\n\n async *watch(\n depositId: string,\n opts: WatchOptions = {},\n ): AsyncGenerator<CashOrder, void, void> {\n const { signal, pollIntervalMs = 5_000, timeoutMs } = opts;\n const startedAt = Date.now();\n let lastFingerprint: string | undefined;\n\n while (true) {\n if (signal?.aborted) return;\n if (timeoutMs !== undefined && Date.now() - startedAt >= timeoutMs) {\n throw errors.watchTimeout(depositId, timeoutMs);\n }\n\n let order: CashOrder | null = null;\n try {\n order = await fetchOrder(depositId);\n } catch (err) {\n // Right after cashout the indexer may not have the deposit yet - keep polling.\n if (!(isCashError(err) && err.code === 'ORDER_NOT_FOUND')) throw err;\n }\n\n if (order) {\n const fingerprint = orderFingerprint(order);\n if (fingerprint !== lastFingerprint) {\n lastFingerprint = fingerprint;\n yield order;\n }\n if (!order.isInFlight) return;\n }\n\n await sleep(pollIntervalMs, signal);\n }\n },\n\n async withdraw(depositId: string, opts: WithdrawOptions): Promise<WithdrawResult> {\n const client = signingClient('withdraw', opts);\n\n if (opts.amount !== undefined) {\n const { onchainDepositId, escrowArg } = await partialWithdrawContext(\n depositId,\n opts.amount,\n );\n const withdrawTxHash = await submitAndConfirm(client, 'removeFunds', () =>\n client.removeFunds({\n depositId: onchainDepositId,\n amount: opts.amount!,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n return { depositId, withdrawTxHash };\n }\n\n const { expiredIntent, onchainDepositId, escrowArg } = await withdrawContext(depositId);\n\n let pruneTxHash: Hash | undefined;\n if (expiredIntent) {\n // Free the expired intent's locked amount back to the deposit first -\n // withdrawDeposit reverts while any intent is still recorded as active.\n pruneTxHash = await submitAndConfirm(client, 'pruneExpiredIntents', () =>\n client.pruneExpiredIntents({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n }\n\n const withdrawTxHash = await submitAndConfirm(client, 'withdrawDeposit', () =>\n client.withdrawDeposit({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n\n return {\n depositId,\n ...(pruneTxHash !== undefined ? { pruneTxHash } : {}),\n withdrawTxHash,\n };\n },\n\n async prepareWithdraw(\n depositId: string,\n opts: { amount?: bigint } = {},\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }> {\n if (opts.amount !== undefined) {\n const { onchainDepositId, escrowArg } = await partialWithdrawContext(\n depositId,\n opts.amount,\n );\n const tx = await readClient.removeFunds.prepare({\n depositId: onchainDepositId,\n amount: opts.amount,\n ...escrowArg,\n txOverrides: attribution,\n });\n return {\n txs: [tx],\n steps: [\n {\n kind: 'removeFunds',\n description: 'Withdraw the requested unlocked USDC amount.',\n },\n ],\n };\n }\n\n const { expiredIntent, onchainDepositId, escrowArg } = await withdrawContext(depositId);\n\n const txs: PreparedTransaction[] = [];\n const steps: CashPreparedStep[] = [];\n if (expiredIntent) {\n txs.push(\n await readClient.pruneExpiredIntents.prepare({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n steps.push({\n kind: 'pruneExpiredIntents',\n description: 'Prune expired buyer intents so the locked amount becomes withdrawable.',\n });\n }\n txs.push(\n await readClient.withdrawDeposit.prepare({\n depositId: onchainDepositId,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n steps.push({\n kind: 'withdrawDeposit',\n description: 'Close the order and withdraw all remaining USDC.',\n });\n return { txs, steps };\n },\n\n async topUp(depositId: string, amount: bigint, opts: SignerOptions): Promise<TopUpResult> {\n const client = signingClient('topUp', opts);\n const { onchainDepositId, escrowArg } = await topUpContext(depositId, amount);\n\n // Cash deposits are always Base USDC (enforced at creation); the escrow\n // pulling the top-up is the one the composite id points at.\n const owner = opts.signer.account!.address;\n const escrow = (escrowArg.escrowAddress ??\n client.escrowV2Address ??\n client.escrowAddress) as Address;\n await settleAllowance(client, BASE_USDC_ADDRESS as Address, owner, escrow, amount);\n\n const txHash = await submitAndConfirm(client, 'addFunds', () =>\n client.addFunds({\n depositId: onchainDepositId,\n amount,\n ...escrowArg,\n txOverrides: attribution,\n }),\n );\n\n return { depositId, txHash };\n },\n\n async prepareTopUp(\n depositId: string,\n amount: bigint,\n ): Promise<{ txs: PreparedTransaction[]; steps: CashPreparedStep[] }> {\n const { onchainDepositId, escrowArg } = await topUpContext(depositId, amount);\n\n const prepared = await readClient.addFunds.prepare({\n depositId: onchainDepositId,\n amount,\n ...escrowArg,\n txOverrides: attribution,\n });\n\n const approve: PreparedTransaction = {\n to: BASE_USDC_ADDRESS as Address,\n data: appendAttributionToCalldata(\n encodeFunctionData({\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [prepared.to as Address, amount],\n }),\n referrerCodes,\n ),\n value: 0n,\n chainId: BASE_CHAIN_ID,\n };\n\n return {\n txs: [approve, prepared],\n steps: [\n {\n kind: 'approve',\n description: 'Approve additional Base USDC for the Peer Cash escrow.',\n },\n {\n kind: 'addFunds',\n description: 'Add USDC to the live cash-out order.',\n },\n ],\n };\n },\n };\n}\n\nexport { CashError, isCashError, errors };\n","/**\n * zod schemas for every wire type. The wire format encodes bigints as decimal\n * strings so orders, estimates, and prepared txs cross tool-call and process\n * boundaries losslessly.\n */\nimport { z } from 'zod';\n\nexport const bigintString = z.string().regex(/^-?\\d+$/, 'expected a decimal bigint string');\n\nexport const cashOrderStateSchema = z.enum([\n 'awaiting-buyer',\n 'matched',\n 'delivering',\n 'delivered',\n 'returned',\n]);\n\nexport const cashNextActionSchema = z.enum(['wait', 'withdraw']);\n\nexport const intentStatusSchema = z.enum(['SIGNALED', 'FULFILLED', 'PRUNED', 'MANUALLY_RELEASED']);\n\nexport const cashFillJsonSchema = z.object({\n intentHash: z.string(),\n status: intentStatusSchema,\n amount: bigintString,\n buyer: z.string(),\n currency: z.string().optional(),\n currencyHash: z.string().optional(),\n rate: z.number().optional(),\n conversionRate: bigintString.optional(),\n fiatOwed: z.number().optional(),\n fiatPaid: z.number().optional(),\n paidCurrency: z.string().optional(),\n paymentId: z.string().optional(),\n paidAt: z.number().optional(),\n releasedAmount: bigintString.optional(),\n fillLatencySeconds: z.number().optional(),\n isExpired: z.boolean().optional(),\n signaledAt: z.number().optional(),\n expiresAt: z.number().optional(),\n fulfilledAt: z.number().optional(),\n prunedAt: z.number().optional(),\n});\n\nexport const cashPayoutPricingJsonSchema = z.object({\n spreadBps: z.number().optional(),\n kind: z.string().optional(),\n rateSource: z.string().optional(),\n oracleRate: z.number().optional(),\n lastOracleUpdatedAt: z.number().optional(),\n marketRate: z.boolean(),\n});\n\nexport const cashPayoutInfoJsonSchema = z.object({\n platform: z.string().optional(),\n platformHash: z.string(),\n currency: z.string().optional(),\n currencyHash: z.string().optional(),\n payeeHash: z.string(),\n active: z.boolean(),\n pricing: cashPayoutPricingJsonSchema,\n});\n\nexport const cashBuyerProfileJsonSchema = z.object({\n address: z.string(),\n totalIntents: z.number(),\n fulfilled: z.number(),\n pruned: z.number(),\n signaled: z.number(),\n successRateBps: z.number().optional(),\n firstSeenAt: z.number().optional(),\n lastSeenAt: z.number().optional(),\n});\n\nexport const cashOrderJsonSchema = z.object({\n depositId: z.string(),\n state: cashOrderStateSchema,\n fills: z.array(cashFillJsonSchema),\n totalAmount: bigintString,\n filledAmount: bigintString,\n pendingAmount: bigintString,\n returnedAmount: bigintString,\n nextActions: z.array(cashNextActionSchema),\n primaryIntentHash: z.string().optional(),\n matchedAt: z.number().optional(),\n deliveredAt: z.number().optional(),\n updatedAt: z.number().optional(),\n intentCount: z.number().optional(),\n payouts: z.array(cashPayoutInfoJsonSchema).optional(),\n successRateBps: z.number().optional(),\n isInFlight: z.boolean(),\n withdrawn: z.boolean().optional(),\n});\n\nexport const cashEstimateJsonSchema = z.object({\n kind: z.literal('oracle-estimate'),\n currency: z.string(),\n amount: bigintString,\n rate: z.number(),\n receiveAmount: z.number(),\n asOf: z.number(),\n oracleUpdatedAt: z.number().optional(),\n stale: z.boolean().optional(),\n source: z\n .object({\n kind: z.literal('relay'),\n asset: z.object({\n chainId: z.number(),\n address: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n name: z.string().optional(),\n isNative: z.boolean().optional(),\n }),\n inputAmount: bigintString,\n relayQuote: z.object({\n requestId: z.string().optional(),\n source: z.object({\n chainId: z.number(),\n address: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n name: z.string().optional(),\n isNative: z.boolean().optional(),\n }),\n destination: z.object({\n chainId: z.number(),\n address: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n name: z.string().optional(),\n isNative: z.boolean().optional(),\n }),\n inputAmount: bigintString,\n outputAmount: bigintString,\n rate: z.number().optional(),\n timeEstimateSeconds: z.number().optional(),\n fees: z.unknown().optional(),\n txs: z.array(\n z.object({\n to: z.string(),\n data: z.string(),\n value: bigintString,\n chainId: z.number(),\n }),\n ),\n raw: z.unknown(),\n }),\n })\n .optional(),\n eta: z\n .object({\n seconds: z.number().optional(),\n label: z.string(),\n })\n .optional(),\n});\n\nexport const preparedTransactionJsonSchema = z.object({\n to: z.string(),\n data: z.string(),\n value: bigintString,\n chainId: z.number(),\n});\n\nexport const cashPreparedStepJsonSchema = z.object({\n kind: z.enum([\n 'approve',\n 'createDeposit',\n 'pruneExpiredIntents',\n 'withdrawDeposit',\n 'removeFunds',\n 'addFunds',\n ]),\n description: z.string(),\n});\n\nexport const cashoutResultJsonSchema = z.object({\n depositId: z.string(),\n txHash: z.string(),\n escrowAddress: z.string(),\n onchainDepositId: bigintString,\n order: cashOrderJsonSchema,\n source: z\n .object({\n amount: bigintString,\n requestId: z.string().optional(),\n txHashes: z.array(z.string()),\n })\n .optional(),\n});\n\nexport const prepareResultJsonSchema = z.object({\n txs: z.array(preparedTransactionJsonSchema),\n steps: z.array(cashPreparedStepJsonSchema),\n register: z.object({ hashedOnchainIds: z.array(z.string()) }),\n});\n\nexport const withdrawResultJsonSchema = z.object({\n depositId: z.string(),\n pruneTxHash: z.string().optional(),\n withdrawTxHash: z.string(),\n});\n\nexport const topUpResultJsonSchema = z.object({\n depositId: z.string(),\n txHash: z.string(),\n});\n\nexport const cashCapabilitiesJsonSchema = z.object({\n chainId: z.number(),\n token: z.object({ address: z.string(), symbol: z.literal('USDC'), decimals: z.number() }),\n environment: z.enum(['production', 'preproduction', 'staging']),\n destination: z.object({\n chainId: z.number(),\n token: z.object({ address: z.string(), symbol: z.literal('USDC'), decimals: z.number() }),\n }),\n source: z.object({\n default: z.object({\n chainId: z.number(),\n token: z.object({ address: z.string(), symbol: z.literal('USDC'), decimals: z.number() }),\n }),\n relay: z\n .object({\n destination: z.object({\n chainId: z.number(),\n address: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n name: z.string().optional(),\n isNative: z.boolean().optional(),\n }),\n chains: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n displayName: z.string(),\n disabled: z.boolean(),\n depositEnabled: z.boolean(),\n blockProductionLagging: z.boolean(),\n vmType: z.string().optional(),\n tokens: z.array(\n z.object({\n chainId: z.number(),\n address: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n name: z.string().optional(),\n isNative: z.boolean().optional(),\n }),\n ),\n }),\n ),\n source: z.literal('relay-sdk'),\n asOf: z.number(),\n })\n .optional(),\n }),\n platforms: z.array(\n z.object({\n platform: z.string(),\n currencies: z.array(z.string()),\n payeeHint: z.string(),\n requiresIdentityAttestation: z.boolean(),\n }),\n ),\n currencies: z.array(z.string()),\n amount: z.object({ min: bigintString, recommendedMin: bigintString, max: z.null() }),\n pricing: z.object({ kind: z.literal('oracle-market-rate'), spreadBps: z.literal(0) }),\n});\n\nexport const cashErrorJsonSchema = z.object({\n code: z.string(),\n message: z.string(),\n retryable: z.boolean(),\n remediation: z.string(),\n});\n\nexport type CashOrderJson = z.infer<typeof cashOrderJsonSchema>;\nexport type CashFillJson = z.infer<typeof cashFillJsonSchema>;\nexport type CashEstimateJson = z.infer<typeof cashEstimateJsonSchema>;\nexport type PreparedTransactionJson = z.infer<typeof preparedTransactionJsonSchema>;\nexport type CashoutResultJson = z.infer<typeof cashoutResultJsonSchema>;\nexport type PrepareResultJson = z.infer<typeof prepareResultJsonSchema>;\nexport type WithdrawResultJson = z.infer<typeof withdrawResultJsonSchema>;\nexport type TopUpResultJson = z.infer<typeof topUpResultJsonSchema>;\nexport type CashPreparedStepJson = z.infer<typeof cashPreparedStepJsonSchema>;\nexport type CashPayoutInfoJson = z.infer<typeof cashPayoutInfoJsonSchema>;\nexport type CashBuyerProfileJson = z.infer<typeof cashBuyerProfileJsonSchema>;\nexport type CashCapabilitiesJson = z.infer<typeof cashCapabilitiesJsonSchema>;\n","/**\n * JSON codecs - lossless (de)serialization for every wire type. bigints encode\n * as decimal strings; `parse*` validates with the zod schema and re-attaches\n * derived behavior (`order.explain()`).\n */\nimport type { CurrencyType, PreparedTransaction } from '../sdk-types';\nimport type { CashBuyerProfile, CashFill, CashOrder } from '../engine/types';\nimport { withExplain, type CashOrderData } from '../engine/orderState';\nimport type { CashEstimate } from '../client/estimate';\nimport { sanitizeRelayQuoteRaw } from '../client/relay';\nimport type { CashCapabilities } from '../client/capabilities';\nimport type {\n CashPreparedStep,\n CashoutResult,\n PrepareResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\nimport {\n cashCapabilitiesJsonSchema,\n cashEstimateJsonSchema,\n cashOrderJsonSchema,\n cashoutResultJsonSchema,\n cashPreparedStepJsonSchema,\n prepareResultJsonSchema,\n preparedTransactionJsonSchema,\n withdrawResultJsonSchema,\n topUpResultJsonSchema,\n cashBuyerProfileJsonSchema,\n type CashBuyerProfileJson,\n type CashCapabilitiesJson,\n type CashEstimateJson,\n type CashFillJson,\n type CashOrderJson,\n type CashPreparedStepJson,\n type CashoutResultJson,\n type PrepareResultJson,\n type PreparedTransactionJson,\n type WithdrawResultJson,\n type TopUpResultJson,\n} from './schemas';\n\nfunction omitUndefined<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n\n// --- CashFill ---\n\nexport function fillToJson(fill: CashFill): CashFillJson {\n return omitUndefined({\n intentHash: fill.intentHash,\n status: fill.status,\n amount: fill.amount.toString(),\n buyer: fill.buyer,\n currency: fill.currency,\n currencyHash: fill.currencyHash,\n rate: fill.rate,\n conversionRate: fill.conversionRate?.toString(),\n fiatOwed: fill.fiatOwed,\n fiatPaid: fill.fiatPaid,\n paidCurrency: fill.paidCurrency,\n paymentId: fill.paymentId,\n paidAt: fill.paidAt,\n releasedAmount: fill.releasedAmount?.toString(),\n fillLatencySeconds: fill.fillLatencySeconds,\n isExpired: fill.isExpired,\n signaledAt: fill.signaledAt,\n expiresAt: fill.expiresAt,\n fulfilledAt: fill.fulfilledAt,\n prunedAt: fill.prunedAt,\n }) as CashFillJson;\n}\n\nexport function fillFromJson(json: CashFillJson): CashFill {\n return omitUndefined({\n ...json,\n amount: BigInt(json.amount),\n conversionRate: json.conversionRate !== undefined ? BigInt(json.conversionRate) : undefined,\n releasedAmount: json.releasedAmount !== undefined ? BigInt(json.releasedAmount) : undefined,\n }) as unknown as CashFill;\n}\n\n// --- CashOrder ---\n\nexport function orderToJson(order: CashOrder): CashOrderJson {\n return omitUndefined({\n depositId: order.depositId,\n state: order.state,\n fills: order.fills.map(fillToJson),\n totalAmount: order.totalAmount.toString(),\n filledAmount: order.filledAmount.toString(),\n pendingAmount: order.pendingAmount.toString(),\n returnedAmount: order.returnedAmount.toString(),\n nextActions: order.nextActions,\n primaryIntentHash: order.primaryIntentHash,\n matchedAt: order.matchedAt,\n deliveredAt: order.deliveredAt,\n updatedAt: order.updatedAt,\n intentCount: order.intentCount,\n payouts: order.payouts?.map((p) =>\n omitUndefined({ ...p, pricing: omitUndefined({ ...p.pricing }) }),\n ),\n successRateBps: order.successRateBps,\n isInFlight: order.isInFlight,\n withdrawn: order.withdrawn,\n }) as CashOrderJson;\n}\n\nexport function orderFromJson(json: unknown): CashOrder {\n const parsed = cashOrderJsonSchema.parse(json);\n const data = omitUndefined({\n ...parsed,\n fills: parsed.fills.map(fillFromJson),\n totalAmount: BigInt(parsed.totalAmount),\n filledAmount: BigInt(parsed.filledAmount),\n pendingAmount: BigInt(parsed.pendingAmount),\n returnedAmount: BigInt(parsed.returnedAmount),\n }) as unknown as CashOrderData;\n return withExplain(data);\n}\n\n// --- CashEstimate ---\n\nexport function estimateToJson(estimate: CashEstimate): CashEstimateJson {\n return omitUndefined({\n ...estimate,\n amount: estimate.amount.toString(),\n source: estimate.source\n ? {\n ...estimate.source,\n inputAmount: estimate.source.inputAmount.toString(),\n relayQuote: {\n ...estimate.source.relayQuote,\n inputAmount: estimate.source.relayQuote.inputAmount.toString(),\n outputAmount: estimate.source.relayQuote.outputAmount.toString(),\n txs: estimate.source.relayQuote.txs.map(preparedTxToJson),\n raw: sanitizeRelayQuoteRaw(estimate.source.relayQuote.raw),\n },\n }\n : undefined,\n }) as CashEstimateJson;\n}\n\nexport function estimateFromJson(json: unknown): CashEstimate {\n const parsed = cashEstimateJsonSchema.parse(json);\n return omitUndefined({\n ...parsed,\n currency: parsed.currency as CurrencyType,\n amount: BigInt(parsed.amount),\n source: parsed.source\n ? {\n ...parsed.source,\n inputAmount: BigInt(parsed.source.inputAmount),\n relayQuote: {\n ...parsed.source.relayQuote,\n inputAmount: BigInt(parsed.source.relayQuote.inputAmount),\n outputAmount: BigInt(parsed.source.relayQuote.outputAmount),\n txs: parsed.source.relayQuote.txs.map(preparedTxFromJson),\n },\n }\n : undefined,\n }) as unknown as CashEstimate;\n}\n\n// --- PreparedTransaction ---\n\nexport function preparedTxToJson(tx: PreparedTransaction): PreparedTransactionJson {\n return { to: tx.to, data: tx.data, value: tx.value.toString(), chainId: tx.chainId };\n}\n\nexport function preparedTxFromJson(json: unknown): PreparedTransaction {\n const parsed = preparedTransactionJsonSchema.parse(json);\n return {\n to: parsed.to as PreparedTransaction['to'],\n data: parsed.data as PreparedTransaction['data'],\n value: BigInt(parsed.value),\n chainId: parsed.chainId,\n };\n}\n\nexport function preparedStepToJson(step: CashPreparedStep): CashPreparedStepJson {\n return { kind: step.kind, description: step.description };\n}\n\nexport function preparedStepFromJson(json: unknown): CashPreparedStep {\n return cashPreparedStepJsonSchema.parse(json);\n}\n\n// --- CashoutResult ---\n\nexport function cashoutResultToJson(result: CashoutResult): CashoutResultJson {\n return omitUndefined({\n depositId: result.depositId,\n txHash: result.txHash,\n escrowAddress: result.escrowAddress,\n onchainDepositId: result.onchainDepositId.toString(),\n order: orderToJson(result.order),\n source: result.source\n ? {\n ...result.source,\n amount: result.source.amount.toString(),\n }\n : undefined,\n }) as CashoutResultJson;\n}\n\nexport function cashoutResultFromJson(json: unknown): CashoutResult {\n const parsed = cashoutResultJsonSchema.parse(json);\n return omitUndefined({\n depositId: parsed.depositId,\n txHash: parsed.txHash as CashoutResult['txHash'],\n escrowAddress: parsed.escrowAddress,\n onchainDepositId: BigInt(parsed.onchainDepositId),\n order: orderFromJson(parsed.order),\n source: parsed.source\n ? {\n ...parsed.source,\n amount: BigInt(parsed.source.amount),\n }\n : undefined,\n }) as unknown as CashoutResult;\n}\n\n// --- PrepareResult ---\n\nexport function prepareResultToJson(result: PrepareResult): PrepareResultJson {\n return {\n txs: result.txs.map(preparedTxToJson),\n steps: result.steps.map(preparedStepToJson),\n register: result.register,\n };\n}\n\nexport function prepareResultFromJson(json: unknown): PrepareResult {\n const parsed = prepareResultJsonSchema.parse(json);\n return {\n txs: parsed.txs.map(preparedTxFromJson),\n steps: parsed.steps.map(preparedStepFromJson),\n register: parsed.register,\n };\n}\n\n// --- WithdrawResult ---\n\nexport function withdrawResultToJson(result: WithdrawResult): WithdrawResultJson {\n return omitUndefined({\n depositId: result.depositId,\n pruneTxHash: result.pruneTxHash,\n withdrawTxHash: result.withdrawTxHash,\n }) as WithdrawResultJson;\n}\n\nexport function withdrawResultFromJson(json: unknown): WithdrawResult {\n const parsed = withdrawResultJsonSchema.parse(json);\n return omitUndefined({\n depositId: parsed.depositId,\n pruneTxHash: parsed.pruneTxHash,\n withdrawTxHash: parsed.withdrawTxHash,\n }) as unknown as WithdrawResult;\n}\n\n// --- CashBuyerProfile ---\n\nexport function buyerProfileToJson(profile: CashBuyerProfile): CashBuyerProfileJson {\n return omitUndefined({ ...profile }) as CashBuyerProfileJson;\n}\n\nexport function buyerProfileFromJson(json: unknown): CashBuyerProfile {\n return omitUndefined(cashBuyerProfileJsonSchema.parse(json)) as unknown as CashBuyerProfile;\n}\n\n// --- TopUpResult ---\n\nexport function topUpResultToJson(result: TopUpResult): TopUpResultJson {\n return { depositId: result.depositId, txHash: result.txHash };\n}\n\nexport function topUpResultFromJson(json: unknown): TopUpResult {\n const parsed = topUpResultJsonSchema.parse(json);\n return { depositId: parsed.depositId, txHash: parsed.txHash as TopUpResult['txHash'] };\n}\n\n// --- CashCapabilities ---\n\nexport function capabilitiesToJson(caps: CashCapabilities): CashCapabilitiesJson {\n return {\n ...caps,\n amount: {\n min: caps.amount.min.toString(),\n recommendedMin: caps.amount.recommendedMin.toString(),\n max: null,\n },\n };\n}\n\nexport function capabilitiesFromJson(json: unknown): CashCapabilities {\n const parsed = cashCapabilitiesJsonSchema.parse(json);\n return {\n ...parsed,\n source: {\n default: parsed.source.default,\n ...(parsed.source.relay ? { relay: parsed.source.relay } : {}),\n },\n platforms: parsed.platforms.map((p) => ({\n ...p,\n currencies: p.currencies as CurrencyType[],\n })),\n currencies: parsed.currencies as CurrencyType[],\n amount: {\n min: BigInt(parsed.amount.min),\n recommendedMin: BigInt(parsed.amount.recommendedMin),\n max: null,\n },\n } as unknown as CashCapabilities;\n}\n"]}
|