@zkp2p/cash 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +40 -30
- package/README.md +59 -26
- 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 +609 -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 +601 -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 +22 -17
- package/package.json +5 -4
- package/skills/peer-cash-integration/SKILL.md +19 -8
- package/dist/chunk-4DRZRWWS.js.map +0 -1
package/dist/react.cjs
CHANGED
|
@@ -7,6 +7,8 @@ function useEstimate({
|
|
|
7
7
|
client,
|
|
8
8
|
amount,
|
|
9
9
|
currency,
|
|
10
|
+
platform,
|
|
11
|
+
source,
|
|
10
12
|
refreshIntervalMs = 0
|
|
11
13
|
}) {
|
|
12
14
|
const [estimate, setEstimate] = react.useState(null);
|
|
@@ -22,7 +24,12 @@ function useEstimate({
|
|
|
22
24
|
setIsLoading(true);
|
|
23
25
|
setError(null);
|
|
24
26
|
try {
|
|
25
|
-
const result = await client.estimate({
|
|
27
|
+
const result = await client.estimate({
|
|
28
|
+
amount,
|
|
29
|
+
currency,
|
|
30
|
+
...platform ? { platform } : {},
|
|
31
|
+
...source ? { source } : {}
|
|
32
|
+
});
|
|
26
33
|
if (mountedRef.current) setEstimate(result);
|
|
27
34
|
} catch (err) {
|
|
28
35
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
@@ -33,7 +40,7 @@ function useEstimate({
|
|
|
33
40
|
} finally {
|
|
34
41
|
if (mountedRef.current) setIsLoading(false);
|
|
35
42
|
}
|
|
36
|
-
}, [client, currency, amount]);
|
|
43
|
+
}, [client, currency, amount, platform, source]);
|
|
37
44
|
react.useEffect(() => {
|
|
38
45
|
mountedRef.current = true;
|
|
39
46
|
void refresh();
|
|
@@ -47,7 +54,14 @@ function useEstimate({
|
|
|
47
54
|
}, [refresh, refreshIntervalMs]);
|
|
48
55
|
return { estimate, isLoading, error, refresh };
|
|
49
56
|
}
|
|
50
|
-
function useCashout({
|
|
57
|
+
function useCashout({
|
|
58
|
+
client,
|
|
59
|
+
signer,
|
|
60
|
+
sourceSigner,
|
|
61
|
+
onSourceProgress,
|
|
62
|
+
onCashout,
|
|
63
|
+
onError
|
|
64
|
+
}) {
|
|
51
65
|
const [pending, setPending] = react.useState(null);
|
|
52
66
|
const [result, setResult] = react.useState(null);
|
|
53
67
|
const [error, setError] = react.useState(null);
|
|
@@ -63,7 +77,11 @@ function useCashout({ client, signer, onCashout, onError }) {
|
|
|
63
77
|
setError(null);
|
|
64
78
|
setResult(null);
|
|
65
79
|
try {
|
|
66
|
-
const cashoutResult = await client.cashout(input, {
|
|
80
|
+
const cashoutResult = await client.cashout(input, {
|
|
81
|
+
signer,
|
|
82
|
+
...sourceSigner ? { sourceSigner } : {},
|
|
83
|
+
...onSourceProgress ? { onSourceProgress } : {}
|
|
84
|
+
});
|
|
67
85
|
setResult(cashoutResult);
|
|
68
86
|
onCashout?.(cashoutResult);
|
|
69
87
|
return cashoutResult;
|
|
@@ -76,7 +94,7 @@ function useCashout({ client, signer, onCashout, onError }) {
|
|
|
76
94
|
setPending(null);
|
|
77
95
|
}
|
|
78
96
|
},
|
|
79
|
-
[client, signer, onCashout, onError]
|
|
97
|
+
[client, signer, sourceSigner, onSourceProgress, onCashout, onError]
|
|
80
98
|
);
|
|
81
99
|
const withdraw = react.useCallback(
|
|
82
100
|
async (depositId, amount) => {
|
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/useEstimate.ts","../src/react/useCashout.ts","../src/engine/constants.ts","../src/client/errors.ts","../src/react/usePoll.ts","../src/react/useMountedRef.ts","../src/react/useOrder.ts","../src/react/useOrders.ts"],"names":["useState","useRef","useCallback","useEffect","useMemo"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CurrencyType } from '../sdk-types';\nimport type { CashClient } from '../client/createCashClient';\nimport type { CashEstimate } from '../client/estimate';\n\nexport interface UseEstimateOptions {\n client: CashClient | null;\n /** Amount to convert, USDC base units. Estimate is skipped while null/0. */\n amount: bigint | null | undefined;\n currency: CurrencyType | null | undefined;\n /** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */\n refreshIntervalMs?: number;\n}\n\n/**\n * Live market-rate estimate for a screen-1 display. The figure is a `≈`\n * estimate; the binding rate resolves at the Chainlink oracle when a buyer\n * fills - there is no committed quote to show.\n */\nexport function useEstimate({\n client,\n amount,\n currency,\n refreshIntervalMs = 0,\n}: UseEstimateOptions) {\n const [estimate, setEstimate] = useState<CashEstimate | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n if (!client || !currency || !amount || amount <= 0n) {\n if (mountedRef.current) setEstimate(null);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.estimate({ amount, currency });\n if (mountedRef.current) setEstimate(result);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) {\n setEstimate(null);\n setError(e);\n }\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client, currency, amount]);\n\n useEffect(() => {\n mountedRef.current = true;\n void refresh();\n if (refreshIntervalMs > 0) {\n timerRef.current = setInterval(() => void refresh(), refreshIntervalMs);\n }\n return () => {\n mountedRef.current = false;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [refresh, refreshIntervalMs]);\n\n return { estimate, isLoading, error, refresh };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport type { WalletClient } from 'viem';\nimport type {\n CashClient,\n CashoutInput,\n CashoutResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\n\nexport interface UseCashoutOptions {\n client: CashClient | null;\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient | null | undefined;\n onCashout?: (result: CashoutResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Orchestrate a cash-out end to end on the maker side:\n * - `cashout(input)` → create the market-rate deposit, resolve its composite id.\n * - `topUp(depositId, amount)` → add USDC to a live order.\n * - `withdraw(depositId, amount?)` → the ONE unwind verb; partial with an\n * amount, full close without. The caller never chooses between\n * cancel/recover - expired intents are pruned automatically.\n */\nexport function useCashout({ client, signer, onCashout, onError }: UseCashoutOptions) {\n const [pending, setPending] = useState<null | 'cashout' | 'withdraw' | 'topUp'>(null);\n const [result, setResult] = useState<CashoutResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const cashout = useCallback(\n async (input: CashoutInput): Promise<CashoutResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('cashout');\n setError(null);\n setResult(null);\n try {\n const cashoutResult = await client.cashout(input, { signer });\n setResult(cashoutResult);\n onCashout?.(cashoutResult);\n return cashoutResult;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onCashout, onError],\n );\n\n const withdraw = useCallback(\n async (depositId: string, amount?: bigint): Promise<WithdrawResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('withdraw');\n setError(null);\n try {\n return await client.withdraw(depositId, {\n signer,\n ...(amount !== undefined ? { amount } : {}),\n });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n const topUp = useCallback(\n async (depositId: string, amount: bigint): Promise<TopUpResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('topUp');\n setError(null);\n try {\n return await client.topUp(depositId, amount, { signer });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n return useMemo(\n () => ({ cashout, topUp, withdraw, pending, result, error }),\n [cashout, topUp, withdraw, pending, result, error],\n );\n}\n","/**\n * Peer Cash - engine constants.\n *\n * Peer Cash is an async crypto→fiat offramp built on the maker/deposit side of\n * the protocol: the cashing-out user IS the maker. They create a deposit at the\n * live oracle/market rate (0% spread); a buyer (a standard taker) signals an\n * intent, pays fiat, and proves it via the standard TEE-TLS flow, releasing the\n * user's crypto. The protocol is reused in its existing direction - no proof\n * inversion, no sell-side quote.\n */\nimport type { IntentStatus } from '../sdk-types';\n\n/** Base chain id - Peer Cash settles in Base USDC. */\nexport const BASE_CHAIN_ID = 8453;\n\n/** Canonical USDC on Base (6 decimals). The deposit asset for every cash-out. */\nexport const BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' as const;\n\n/** USDC has 6 decimals. */\nexport const USDC_DECIMALS = 6;\n\n/**\n * Market rate = the live Chainlink oracle with **zero spread**. The user sets no\n * rate; selling at market is the fast-fill incentive (the deposit is the best\n * deal on the book, so buyers have reason to take it quickly).\n */\nexport const MARKET_SPREAD_BPS = 0;\n\n/**\n * EscrowV2 rejects a zero `minConversionRate` even when an oracle-backed rate\n * config is attached. Use the smallest non-zero sentinel so the oracle rate\n * still fully determines pricing while satisfying the on-chain invariant.\n */\nexport const ORACLE_MIN_CONVERSION_RATE_SENTINEL = 1n;\n\n/**\n * The full intent-status set a cash-out order can pass through. The indexer's\n * `getIntentsForDeposits` defaults to `['SIGNALED']` only - passing this\n * explicit set is REQUIRED, otherwise `delivered`/`returned` states are\n * silently filtered out.\n */\nexport const CASH_ORDER_STATUSES: IntentStatus[] = [\n 'SIGNALED',\n 'FULFILLED',\n 'PRUNED',\n 'MANUALLY_RELEASED',\n];\n\n/** Default polling cadence for an in-flight order (ms). Matches the protocol's active-intent polling. */\nexport const CASH_ORDER_POLL_INTERVAL_MS = 5_000;\n\n/**\n * Default deposit config for every Peer Cash deposit: a one-shot cash-out\n * cleans up when fully filled rather than lingering empty.\n */\nexport const CASH_RETAIN_ON_EMPTY = false;\n","/**\n * Typed errors - every failure carries a `code`, whether it is `retryable`,\n * and a `remediation` sentence so agents can self-drive recovery.\n */\nexport type CashErrorCode =\n | 'ORACLE_UNSUPPORTED_CURRENCY'\n | 'UNSUPPORTED_PLATFORM'\n | 'AMOUNT_BELOW_MINIMUM'\n | 'ACTIVE_INTENT_BLOCKS_WITHDRAWAL'\n | 'NOTHING_TO_WITHDRAW'\n | 'INSUFFICIENT_AVAILABLE_FUNDS'\n | 'ORDER_NOT_ACTIVE'\n | 'ESCROW_PAUSED'\n | 'INDEXER_LAG'\n | 'ORDER_NOT_FOUND'\n | 'PAYEE_REGISTRATION_FAILED'\n | 'PAYEE_VERIFICATION_REQUIRED'\n | 'DEPOSIT_RESOLUTION_FAILED'\n | 'ALLOWANCE_NOT_VISIBLE'\n | 'SIGNER_REQUIRED'\n | 'WATCH_TIMEOUT'\n | 'TRANSACTION_FAILED';\n\nexport interface CashErrorShape {\n code: CashErrorCode;\n message: string;\n retryable: boolean;\n remediation: string;\n}\n\nexport class CashError extends Error implements CashErrorShape {\n readonly code: CashErrorCode;\n readonly retryable: boolean;\n readonly remediation: string;\n\n constructor(shape: CashErrorShape, options?: { cause?: unknown }) {\n super(shape.message, options);\n this.name = 'CashError';\n this.code = shape.code;\n this.retryable = shape.retryable;\n this.remediation = shape.remediation;\n }\n\n /** Serializable view (for tool results and logs). */\n toJSON(): CashErrorShape {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n remediation: this.remediation,\n };\n }\n}\n\nexport function isCashError(value: unknown): value is CashError {\n return value instanceof CashError;\n}\n\n/** Factory helpers keep call sites one-liners and remediation copy consistent. */\nexport const errors = {\n oracleUnsupportedCurrency: (currency: string) =>\n new CashError({\n code: 'ORACLE_UNSUPPORTED_CURRENCY',\n message: `${currency} has no live Chainlink oracle feed; Peer Cash is market-rate only.`,\n retryable: false,\n remediation: `Pick a currency listed in capabilities() - each one is priced by a live oracle feed.`,\n }),\n unsupportedPlatform: (platform: string) =>\n new CashError({\n code: 'UNSUPPORTED_PLATFORM',\n message: `'${platform}' is not a supported payout platform in this environment.`,\n retryable: false,\n remediation: `Pick a platform listed in capabilities().`,\n }),\n amountBelowMinimum: (amount: bigint, min: bigint) =>\n new CashError({\n code: 'AMOUNT_BELOW_MINIMUM',\n message: `Amount ${amount} is below the minimum cash-out of ${min} USDC base units.`,\n retryable: false,\n remediation: `Increase the amount to at least ${min} base units (${Number(min) / 1e6} USDC).`,\n }),\n activeIntentBlocksWithdrawal: (depositId: string) =>\n new CashError({\n code: 'ACTIVE_INTENT_BLOCKS_WITHDRAWAL',\n message: `Order ${depositId} has a live buyer intent; escrow blocks withdrawal while a buyer may still deliver.`,\n retryable: true,\n remediation: `Wait for the buyer to complete or for their intent to expire, then call withdraw() again - it prunes expired intents automatically.`,\n }),\n insufficientAvailableFunds: (depositId: string, requested: bigint, available: bigint) =>\n new CashError({\n code: 'INSUFFICIENT_AVAILABLE_FUNDS',\n message: `Order ${depositId} has ${available} base units available; ${requested} requested.`,\n retryable: true,\n remediation: `Withdraw at most the available (unlocked) amount, or omit the amount to close the order fully once no buyer intent is live.`,\n }),\n orderNotActive: (depositId: string) =>\n new CashError({\n code: 'ORDER_NOT_ACTIVE',\n message: `Order ${depositId} is closed (delivered or returned); it cannot be topped up.`,\n retryable: false,\n remediation: `Start a new cash-out with cashout() instead.`,\n }),\n nothingToWithdraw: (depositId: string) =>\n new CashError({\n code: 'NOTHING_TO_WITHDRAW',\n message: `Order ${depositId} holds no withdrawable funds (already delivered or returned).`,\n retryable: false,\n remediation: `Check order(depositId).state - this order is terminal.`,\n }),\n indexerLag: (depositId: string) =>\n new CashError({\n code: 'INDEXER_LAG',\n message: `Order ${depositId} is not indexed yet (the deposit may be seconds old).`,\n retryable: true,\n remediation: `Retry in a few seconds; on-chain state is ahead of the indexer right after a transaction.`,\n }),\n orderNotFound: (depositId: string) =>\n new CashError({\n code: 'ORDER_NOT_FOUND',\n message: `No deposit found for id ${depositId}.`,\n retryable: true,\n remediation: `Verify the composite depositId (escrow_onchainId). If the deposit was created seconds ago this is indexer lag - retry shortly.`,\n }),\n payeeRegistrationFailed: (cause: unknown) =>\n new CashError(\n {\n code: 'PAYEE_REGISTRATION_FAILED',\n message: `Registering payee details with the curator failed.`,\n retryable: true,\n remediation: `Check the payee handle format for the platform (see capabilities() hints) and retry.`,\n },\n { cause },\n ),\n payeeVerificationRequired: (platform: string, cause?: unknown) =>\n new CashError(\n {\n code: 'PAYEE_VERIFICATION_REQUIRED',\n message: `${platform} requires a verified maker identity attestation to register a payee; a bare handle is not accepted.`,\n retryable: false,\n remediation: `Register this ${platform} payee through the ZKP2P app / extension (which produces the signed identity attestation) before cashing out. capabilities() flags such platforms with requiresIdentityAttestation: true.`,\n },\n { cause },\n ),\n allowanceNotVisible: (amount: bigint) =>\n new CashError({\n code: 'ALLOWANCE_NOT_VISIBLE',\n message: `USDC approval for ${amount} base units did not become visible on the read path in time.`,\n retryable: true,\n remediation: `The approve transaction mined but a load-balanced RPC is serving stale state. Retry the same call in a few seconds.`,\n }),\n depositResolutionFailed: (txHash: string) =>\n new CashError({\n code: 'DEPOSIT_RESOLUTION_FAILED',\n message: `Deposit transaction ${txHash} succeeded but no DepositReceived event was found in the receipt.`,\n retryable: false,\n remediation: `Inspect the transaction on Basescan; recover the depositId from the DepositReceived log manually, then resume with order(depositId).`,\n }),\n signerRequired: (verb: string) =>\n new CashError({\n code: 'SIGNER_REQUIRED',\n message: `${verb}() mutates on-chain state and needs a signer.`,\n retryable: false,\n remediation: `Pass { signer } (a viem WalletClient with an account), or use prepare() and submit the returned txs with your own signing infrastructure.`,\n }),\n watchTimeout: (depositId: string, timeoutMs: number) =>\n new CashError({\n code: 'WATCH_TIMEOUT',\n message: `watch(${depositId}) exceeded ${timeoutMs}ms without reaching a terminal state.`,\n retryable: true,\n remediation: `The order is still live - resume any time with watch(depositId) or order(depositId).`,\n }),\n transactionFailed: (txHash: string, cause?: unknown) =>\n new CashError(\n {\n code: 'TRANSACTION_FAILED',\n message: `Transaction ${txHash} reverted.`,\n retryable: false,\n remediation: `Inspect the transaction on Basescan; the deposit state is unchanged if the revert happened before escrow accepted funds.`,\n },\n { cause },\n ),\n escrowPaused: () =>\n new CashError({\n code: 'ESCROW_PAUSED',\n message: `The escrow contract is paused; deposits are temporarily disabled.`,\n retryable: true,\n remediation: `Wait for the protocol to unpause and retry. Existing funds remain withdrawable.`,\n }),\n /** Generic fallback for an on-chain call that failed for an unrecognized reason. */\n chainCallFailed: (verb: string, cause?: unknown) =>\n new CashError(\n {\n code: 'TRANSACTION_FAILED',\n message: `The on-chain ${verb} call failed.`,\n retryable: false,\n remediation: `Inspect the error cause and the wallet on Basescan. Deposit state is unchanged if the call reverted before escrow accepted funds.`,\n },\n { cause },\n ),\n};\n\n/**\n * Map a raw SDK/RPC/viem error from a mutating on-chain call to a typed\n * `CashError`, so the package's error contract holds even when the underlying\n * call reverts. Recognized reverts get specific codes; everything else falls\n * back to a wrapped `TRANSACTION_FAILED` (never a raw error to the consumer).\n */\nexport function mapChainError(verb: string, err: unknown): CashError {\n if (isCashError(err)) return err;\n const message = err instanceof Error ? err.message : String(err);\n if (/\\bpaused\\b/i.test(message)) return errors.escrowPaused();\n if (/exceeds allowance|insufficient allowance|transfer amount exceeds/i.test(message)) {\n return errors.allowanceNotVisible(0n);\n }\n return errors.chainCallFailed(verb, err);\n}\n","import { useEffect } from 'react';\n\n/**\n * Shared polling loop for the order hooks: runs `tick` immediately, then every\n * `intervalMs` for as long as `tick` resolves true. Cancels cleanly on unmount\n * or dependency change; `isActive()` lets the tick guard its own setState\n * calls against a stale run. Internal - not exported from the package.\n */\nexport function usePoll(\n enabled: boolean,\n intervalMs: number,\n tick: (isActive: () => boolean) => Promise<boolean>,\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const isActive = () => !cancelled;\n\n const run = async () => {\n const keepPolling = await tick(isActive);\n if (cancelled) return;\n if (keepPolling) timer = setTimeout(run, intervalMs);\n };\n void run();\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [enabled, intervalMs, tick]);\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * A ref that is `true` while the component is mounted. Used to guard `setState`\n * in the manually-triggered `refresh()` paths (the poll loop guards itself).\n * Internal - not exported from the package.\n */\nexport function useMountedRef(): { readonly current: boolean } {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { isCashError } from '../client/errors';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrderOptions {\n client: CashClient | null;\n /** Composite deposit id (`escrow_onchainId`). The resumable anchor. */\n depositId: string | null | undefined;\n /** Poll cadence while the order is in flight (ms). */\n pollIntervalMs?: number;\n /** Disable automatic polling (manual `refresh()` only). */\n paused?: boolean;\n}\n\n/**\n * Observe a cash-out order's lifecycle, keyed by `depositId`.\n *\n * Fully resumable: the order is reconstructed from on-chain data on every load,\n * so it survives a closed tab, a new device, or a wallet reconnect. Polls while\n * the order is in flight and stops once it reaches a terminal state.\n * `ORDER_NOT_FOUND` right after creation is indexer lag - polling continues.\n */\nexport function useOrder({\n client,\n depositId,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrderOptions) {\n const [order, setOrder] = useState<CashOrder | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrder = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder | null> => {\n if (!client || !depositId) return null;\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.order(depositId);\n if (isActive()) setOrder(derived);\n return derived;\n } catch (err) {\n if (isCashError(err) && err.code === 'ORDER_NOT_FOUND') {\n // Indexer lag right after creation - not an error, keep polling.\n return null;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return null;\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, depositId],\n );\n\n usePoll(\n Boolean(client && depositId && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrder(isActive);\n // Keep polling while in flight (or while state is still unknown).\n return !result || result.isInFlight;\n },\n [fetchOrder],\n ),\n );\n\n const refresh = useCallback(() => fetchOrder(() => mounted.current), [fetchOrder, mounted]);\n\n return { order, isLoading, error, refresh };\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrdersOptions {\n client: CashClient | null;\n /** The connected user's address (the maker / depositor). */\n owner: string | null | undefined;\n /** Max deposits to scan. */\n limit?: number;\n /** Poll cadence (ms) while any order is in flight. */\n pollIntervalMs?: number;\n paused?: boolean;\n}\n\n/**\n * List the user's cash-out orders (the Transactions-feed pattern). Reads\n * deposits by depositor and derives real amounts + states from the indexer\n * aggregates. Polls while any order is in flight.\n */\nexport function useOrders({\n client,\n owner,\n limit = 100,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrdersOptions) {\n const [orders, setOrders] = useState<CashOrder[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrders = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder[]> => {\n if (!client || !owner) return [];\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.orders(owner, { limit });\n if (isActive()) setOrders(derived);\n return derived;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return [];\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, owner, limit],\n );\n\n usePoll(\n Boolean(client && owner && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrders(isActive);\n return result.some((o) => o.isInFlight);\n },\n [fetchOrders],\n ),\n );\n\n const refresh = useCallback(() => fetchOrders(() => mounted.current), [fetchOrders, mounted]);\n\n const inFlightCount = orders.filter((o) => o.isInFlight).length;\n /** Lifetime cashed-out total (USDC base units) across the feed. */\n const totalCashedOut = orders.reduce((sum, o) => sum + o.filledAmount, 0n);\n\n return { orders, inFlightCount, totalCashedOut, isLoading, error, refresh };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/useEstimate.ts","../src/react/useCashout.ts","../src/engine/constants.ts","../src/client/errors.ts","../src/react/usePoll.ts","../src/react/useMountedRef.ts","../src/react/useOrder.ts","../src/react/useOrders.ts"],"names":["useState","useRef","useCallback","useEffect","useMemo"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CurrencyType } from '../sdk-types';\nimport type { CashClient } from '../client/createCashClient';\nimport type { CashEstimate, EstimateInput } from '../client/estimate';\n\nexport interface UseEstimateOptions {\n client: CashClient | null;\n /** Amount to convert, USDC base units. Estimate is skipped while null/0. */\n amount: bigint | null | undefined;\n currency: CurrencyType | null | undefined;\n /** Optional payout platform for platform-specific ETA sampling. */\n platform?: string | null | undefined;\n /** Optional Relay source. Omit for the Base USDC default path. */\n source?: EstimateInput['source'] | null | undefined;\n /** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */\n refreshIntervalMs?: number;\n}\n\n/**\n * Live market-rate estimate for a screen-1 display. The figure is a `≈`\n * estimate; the binding rate resolves at the Chainlink oracle when a buyer\n * fills - there is no committed quote to show.\n */\nexport function useEstimate({\n client,\n amount,\n currency,\n platform,\n source,\n refreshIntervalMs = 0,\n}: UseEstimateOptions) {\n const [estimate, setEstimate] = useState<CashEstimate | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n if (!client || !currency || !amount || amount <= 0n) {\n if (mountedRef.current) setEstimate(null);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.estimate({\n amount,\n currency,\n ...(platform ? { platform } : {}),\n ...(source ? { source } : {}),\n });\n if (mountedRef.current) setEstimate(result);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) {\n setEstimate(null);\n setError(e);\n }\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client, currency, amount, platform, source]);\n\n useEffect(() => {\n mountedRef.current = true;\n void refresh();\n if (refreshIntervalMs > 0) {\n timerRef.current = setInterval(() => void refresh(), refreshIntervalMs);\n }\n return () => {\n mountedRef.current = false;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [refresh, refreshIntervalMs]);\n\n return { estimate, isLoading, error, refresh };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport type { WalletClient } from 'viem';\nimport type {\n CashClient,\n CashoutOptions,\n CashoutInput,\n CashoutResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\n\nexport interface UseCashoutOptions {\n client: CashClient | null;\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient | null | undefined;\n /** Source-chain signer for Relay source routing. Required when the source chain is not Base. */\n sourceSigner?: WalletClient | null | undefined;\n onSourceProgress?: CashoutOptions['onSourceProgress'];\n onCashout?: (result: CashoutResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Orchestrate a cash-out end to end on the maker side:\n * - `cashout(input)` → create the market-rate deposit, resolve its composite id.\n * - `topUp(depositId, amount)` → add USDC to a live order.\n * - `withdraw(depositId, amount?)` → the ONE unwind verb; partial with an\n * amount, full close without. The caller never chooses between\n * cancel/recover - expired intents are pruned automatically.\n */\nexport function useCashout({\n client,\n signer,\n sourceSigner,\n onSourceProgress,\n onCashout,\n onError,\n}: UseCashoutOptions) {\n const [pending, setPending] = useState<null | 'cashout' | 'withdraw' | 'topUp'>(null);\n const [result, setResult] = useState<CashoutResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const cashout = useCallback(\n async (input: CashoutInput): Promise<CashoutResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('cashout');\n setError(null);\n setResult(null);\n try {\n const cashoutResult = await client.cashout(input, {\n signer,\n ...(sourceSigner ? { sourceSigner } : {}),\n ...(onSourceProgress ? { onSourceProgress } : {}),\n });\n setResult(cashoutResult);\n onCashout?.(cashoutResult);\n return cashoutResult;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, sourceSigner, onSourceProgress, onCashout, onError],\n );\n\n const withdraw = useCallback(\n async (depositId: string, amount?: bigint): Promise<WithdrawResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('withdraw');\n setError(null);\n try {\n return await client.withdraw(depositId, {\n signer,\n ...(amount !== undefined ? { amount } : {}),\n });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n const topUp = useCallback(\n async (depositId: string, amount: bigint): Promise<TopUpResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('topUp');\n setError(null);\n try {\n return await client.topUp(depositId, amount, { signer });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n return useMemo(\n () => ({ cashout, topUp, withdraw, pending, result, error }),\n [cashout, topUp, withdraw, pending, result, error],\n );\n}\n","/**\n * Peer Cash - engine constants.\n *\n * Peer Cash is an async crypto→fiat offramp built on the maker/deposit side of\n * the protocol: the cashing-out user IS the maker. They create a deposit at the\n * live oracle/market rate (0% spread); a buyer (a standard taker) signals an\n * intent, pays fiat, and proves it via the standard TEE-TLS flow, releasing the\n * user's crypto. The protocol is reused in its existing direction - no proof\n * inversion, no sell-side quote.\n */\nimport type { IntentStatus } from '../sdk-types';\n\n/** Base chain id - Peer Cash settles in Base USDC. */\nexport const BASE_CHAIN_ID = 8453;\n\n/** Canonical USDC on Base (6 decimals). The deposit asset for every cash-out. */\nexport const BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' as const;\n\n/** USDC has 6 decimals. */\nexport const USDC_DECIMALS = 6;\n\n/**\n * Market rate = the live Chainlink oracle with **zero spread**. The user sets no\n * rate; selling at market is the fast-fill incentive (the deposit is the best\n * deal on the book, so buyers have reason to take it quickly).\n */\nexport const MARKET_SPREAD_BPS = 0;\n\n/**\n * EscrowV2 rejects a zero `minConversionRate` even when an oracle-backed rate\n * config is attached. Use the smallest non-zero sentinel so the oracle rate\n * still fully determines pricing while satisfying the on-chain invariant.\n */\nexport const ORACLE_MIN_CONVERSION_RATE_SENTINEL = 1n;\n\n/**\n * The full intent-status set a cash-out order can pass through. The indexer's\n * `getIntentsForDeposits` defaults to `['SIGNALED']` only - passing this\n * explicit set is REQUIRED, otherwise `delivered`/`returned` states are\n * silently filtered out.\n */\nexport const CASH_ORDER_STATUSES: IntentStatus[] = [\n 'SIGNALED',\n 'FULFILLED',\n 'PRUNED',\n 'MANUALLY_RELEASED',\n];\n\n/** Default polling cadence for an in-flight order (ms). Matches the protocol's active-intent polling. */\nexport const CASH_ORDER_POLL_INTERVAL_MS = 5_000;\n\n/**\n * Default deposit config for every Peer Cash deposit: a one-shot cash-out\n * cleans up when fully filled rather than lingering empty.\n */\nexport const CASH_RETAIN_ON_EMPTY = false;\n","/**\n * Typed errors - every failure carries a `code`, whether it is `retryable`,\n * and a `remediation` sentence so agents can self-drive recovery.\n */\nexport type CashErrorCode =\n | 'ORACLE_UNSUPPORTED_CURRENCY'\n | 'UNSUPPORTED_PLATFORM'\n | 'AMOUNT_BELOW_MINIMUM'\n | 'ACTIVE_INTENT_BLOCKS_WITHDRAWAL'\n | 'NOTHING_TO_WITHDRAW'\n | 'INSUFFICIENT_AVAILABLE_FUNDS'\n | 'ORDER_NOT_ACTIVE'\n | 'ESCROW_PAUSED'\n | 'INDEXER_LAG'\n | 'ORDER_NOT_FOUND'\n | 'PAYEE_REGISTRATION_FAILED'\n | 'PAYEE_VERIFICATION_REQUIRED'\n | 'SOURCE_ROUTE_UNSUPPORTED_IN_PREPARE'\n | 'SOURCE_RECIPIENT_MISMATCH'\n | 'DEPOSIT_RESOLUTION_FAILED'\n | 'ALLOWANCE_NOT_VISIBLE'\n | 'SIGNER_REQUIRED'\n | 'WATCH_TIMEOUT'\n | 'TRANSACTION_FAILED';\n\nexport interface CashErrorShape {\n code: CashErrorCode;\n message: string;\n retryable: boolean;\n remediation: string;\n}\n\nexport class CashError extends Error implements CashErrorShape {\n readonly code: CashErrorCode;\n readonly retryable: boolean;\n readonly remediation: string;\n\n constructor(shape: CashErrorShape, options?: { cause?: unknown }) {\n super(shape.message, options);\n this.name = 'CashError';\n this.code = shape.code;\n this.retryable = shape.retryable;\n this.remediation = shape.remediation;\n }\n\n /** Serializable view (for tool results and logs). */\n toJSON(): CashErrorShape {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n remediation: this.remediation,\n };\n }\n}\n\nexport function isCashError(value: unknown): value is CashError {\n return value instanceof CashError;\n}\n\n/** Factory helpers keep call sites one-liners and remediation copy consistent. */\nexport const errors = {\n oracleUnsupportedCurrency: (currency: string) =>\n new CashError({\n code: 'ORACLE_UNSUPPORTED_CURRENCY',\n message: `${currency} has no live Chainlink oracle feed; Peer Cash is market-rate only.`,\n retryable: false,\n remediation: `Pick a currency listed in capabilities() - each one is priced by a live oracle feed.`,\n }),\n unsupportedPlatform: (platform: string) =>\n new CashError({\n code: 'UNSUPPORTED_PLATFORM',\n message: `'${platform}' is not a supported payout platform in this environment.`,\n retryable: false,\n remediation: `Pick a platform listed in capabilities().`,\n }),\n amountBelowMinimum: (amount: bigint, min: bigint) =>\n new CashError({\n code: 'AMOUNT_BELOW_MINIMUM',\n message: `Amount ${amount} is below the minimum cash-out of ${min} USDC base units.`,\n retryable: false,\n remediation: `Increase the amount to at least ${min} base units (${Number(min) / 1e6} USDC).`,\n }),\n activeIntentBlocksWithdrawal: (depositId: string) =>\n new CashError({\n code: 'ACTIVE_INTENT_BLOCKS_WITHDRAWAL',\n message: `Order ${depositId} has a live buyer intent; escrow blocks withdrawal while a buyer may still deliver.`,\n retryable: true,\n remediation: `Wait for the buyer to complete or for their intent to expire, then call withdraw() again - it prunes expired intents automatically.`,\n }),\n insufficientAvailableFunds: (depositId: string, requested: bigint, available: bigint) =>\n new CashError({\n code: 'INSUFFICIENT_AVAILABLE_FUNDS',\n message: `Order ${depositId} has ${available} base units available; ${requested} requested.`,\n retryable: true,\n remediation: `Withdraw at most the available (unlocked) amount, or omit the amount to close the order fully once no buyer intent is live.`,\n }),\n orderNotActive: (depositId: string) =>\n new CashError({\n code: 'ORDER_NOT_ACTIVE',\n message: `Order ${depositId} is closed (delivered or returned); it cannot be topped up.`,\n retryable: false,\n remediation: `Start a new cash-out with cashout() instead.`,\n }),\n nothingToWithdraw: (depositId: string) =>\n new CashError({\n code: 'NOTHING_TO_WITHDRAW',\n message: `Order ${depositId} holds no withdrawable funds (already delivered or returned).`,\n retryable: false,\n remediation: `Check order(depositId).state - this order is terminal.`,\n }),\n indexerLag: (depositId: string) =>\n new CashError({\n code: 'INDEXER_LAG',\n message: `Order ${depositId} is not indexed yet (the deposit may be seconds old).`,\n retryable: true,\n remediation: `Retry in a few seconds; on-chain state is ahead of the indexer right after a transaction.`,\n }),\n orderNotFound: (depositId: string) =>\n new CashError({\n code: 'ORDER_NOT_FOUND',\n message: `No deposit found for id ${depositId}.`,\n retryable: true,\n remediation: `Verify the composite depositId (escrow_onchainId). If the deposit was created seconds ago this is indexer lag - retry shortly.`,\n }),\n payeeRegistrationFailed: (cause: unknown) =>\n new CashError(\n {\n code: 'PAYEE_REGISTRATION_FAILED',\n message: `Registering payee details with the curator failed.`,\n retryable: true,\n remediation: `Check the payee handle format for the platform (see capabilities() hints) and retry.`,\n },\n { cause },\n ),\n payeeVerificationRequired: (platform: string, cause?: unknown) =>\n new CashError(\n {\n code: 'PAYEE_VERIFICATION_REQUIRED',\n message: `${platform} requires a verified maker identity attestation to register a payee; a bare handle is not accepted.`,\n retryable: false,\n remediation: `Register this ${platform} payee through the ZKP2P app / extension (which produces the signed identity attestation) before cashing out. capabilities() flags such platforms with requiresIdentityAttestation: true.`,\n },\n { cause },\n ),\n sourceRouteUnsupportedInPrepare: () =>\n new CashError({\n code: 'SOURCE_ROUTE_UNSUPPORTED_IN_PREPARE',\n message: `prepare() cannot execute a Relay source route before creating the Base USDC cash-out.`,\n retryable: false,\n remediation: `Use cashout(inputWithSource, { signer }) for the one-call bridge-then-cashout flow, or call quoteSource()/executeSourceQuote() first and then prepare() a Base USDC cash-out.`,\n }),\n sourceRecipientMismatch: (recipient: string, owner: string) =>\n new CashError({\n code: 'SOURCE_RECIPIENT_MISMATCH',\n message: `Source recipient ${recipient} does not match the cash-out depositor ${owner}.`,\n retryable: false,\n remediation: `For one-call source cashout, deliver Relay output to the depositor address. For a different recipient, bridge first and then cash out from that recipient's signer.`,\n }),\n allowanceNotVisible: (amount: bigint) =>\n new CashError({\n code: 'ALLOWANCE_NOT_VISIBLE',\n message: `USDC approval for ${amount} base units did not become visible on the read path in time.`,\n retryable: true,\n remediation: `The approve transaction mined but a load-balanced RPC is serving stale state. Retry the same call in a few seconds.`,\n }),\n depositResolutionFailed: (txHash: string) =>\n new CashError({\n code: 'DEPOSIT_RESOLUTION_FAILED',\n message: `Deposit transaction ${txHash} succeeded but no DepositReceived event was found in the receipt.`,\n retryable: false,\n remediation: `Inspect the transaction on Basescan; recover the depositId from the DepositReceived log manually, then resume with order(depositId).`,\n }),\n signerRequired: (verb: string) =>\n new CashError({\n code: 'SIGNER_REQUIRED',\n message: `${verb}() mutates on-chain state and needs a signer.`,\n retryable: false,\n remediation: `Pass { signer } (a viem WalletClient with an account), or use prepare() and submit the returned txs with your own signing infrastructure.`,\n }),\n watchTimeout: (depositId: string, timeoutMs: number) =>\n new CashError({\n code: 'WATCH_TIMEOUT',\n message: `watch(${depositId}) exceeded ${timeoutMs}ms without reaching a terminal state.`,\n retryable: true,\n remediation: `The order is still live - resume any time with watch(depositId) or order(depositId).`,\n }),\n transactionFailed: (txHash: string, cause?: unknown) =>\n new CashError(\n {\n code: 'TRANSACTION_FAILED',\n message: `Transaction ${txHash} reverted.`,\n retryable: false,\n remediation: `Inspect the transaction on Basescan; the deposit state is unchanged if the revert happened before escrow accepted funds.`,\n },\n { cause },\n ),\n escrowPaused: () =>\n new CashError({\n code: 'ESCROW_PAUSED',\n message: `The escrow contract is paused; deposits are temporarily disabled.`,\n retryable: true,\n remediation: `Wait for the protocol to unpause and retry. Existing funds remain withdrawable.`,\n }),\n /** Generic fallback for an on-chain call that failed for an unrecognized reason. */\n chainCallFailed: (verb: string, cause?: unknown) =>\n new CashError(\n {\n code: 'TRANSACTION_FAILED',\n message: `The on-chain ${verb} call failed.`,\n retryable: false,\n remediation: `Inspect the error cause and the wallet on Basescan. Deposit state is unchanged if the call reverted before escrow accepted funds.`,\n },\n { cause },\n ),\n};\n\n/**\n * Map a raw SDK/RPC/viem error from a mutating on-chain call to a typed\n * `CashError`, so the package's error contract holds even when the underlying\n * call reverts. Recognized reverts get specific codes; everything else falls\n * back to a wrapped `TRANSACTION_FAILED` (never a raw error to the consumer).\n */\nexport function mapChainError(verb: string, err: unknown): CashError {\n if (isCashError(err)) return err;\n const message = err instanceof Error ? err.message : String(err);\n if (/\\bpaused\\b/i.test(message)) return errors.escrowPaused();\n if (/exceeds allowance|insufficient allowance|transfer amount exceeds/i.test(message)) {\n return errors.allowanceNotVisible(0n);\n }\n return errors.chainCallFailed(verb, err);\n}\n","import { useEffect } from 'react';\n\n/**\n * Shared polling loop for the order hooks: runs `tick` immediately, then every\n * `intervalMs` for as long as `tick` resolves true. Cancels cleanly on unmount\n * or dependency change; `isActive()` lets the tick guard its own setState\n * calls against a stale run. Internal - not exported from the package.\n */\nexport function usePoll(\n enabled: boolean,\n intervalMs: number,\n tick: (isActive: () => boolean) => Promise<boolean>,\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const isActive = () => !cancelled;\n\n const run = async () => {\n const keepPolling = await tick(isActive);\n if (cancelled) return;\n if (keepPolling) timer = setTimeout(run, intervalMs);\n };\n void run();\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [enabled, intervalMs, tick]);\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * A ref that is `true` while the component is mounted. Used to guard `setState`\n * in the manually-triggered `refresh()` paths (the poll loop guards itself).\n * Internal - not exported from the package.\n */\nexport function useMountedRef(): { readonly current: boolean } {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { isCashError } from '../client/errors';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrderOptions {\n client: CashClient | null;\n /** Composite deposit id (`escrow_onchainId`). The resumable anchor. */\n depositId: string | null | undefined;\n /** Poll cadence while the order is in flight (ms). */\n pollIntervalMs?: number;\n /** Disable automatic polling (manual `refresh()` only). */\n paused?: boolean;\n}\n\n/**\n * Observe a cash-out order's lifecycle, keyed by `depositId`.\n *\n * Fully resumable: the order is reconstructed from on-chain data on every load,\n * so it survives a closed tab, a new device, or a wallet reconnect. Polls while\n * the order is in flight and stops once it reaches a terminal state.\n * `ORDER_NOT_FOUND` right after creation is indexer lag - polling continues.\n */\nexport function useOrder({\n client,\n depositId,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrderOptions) {\n const [order, setOrder] = useState<CashOrder | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrder = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder | null> => {\n if (!client || !depositId) return null;\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.order(depositId);\n if (isActive()) setOrder(derived);\n return derived;\n } catch (err) {\n if (isCashError(err) && err.code === 'ORDER_NOT_FOUND') {\n // Indexer lag right after creation - not an error, keep polling.\n return null;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return null;\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, depositId],\n );\n\n usePoll(\n Boolean(client && depositId && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrder(isActive);\n // Keep polling while in flight (or while state is still unknown).\n return !result || result.isInFlight;\n },\n [fetchOrder],\n ),\n );\n\n const refresh = useCallback(() => fetchOrder(() => mounted.current), [fetchOrder, mounted]);\n\n return { order, isLoading, error, refresh };\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrdersOptions {\n client: CashClient | null;\n /** The connected user's address (the maker / depositor). */\n owner: string | null | undefined;\n /** Max deposits to scan. */\n limit?: number;\n /** Poll cadence (ms) while any order is in flight. */\n pollIntervalMs?: number;\n paused?: boolean;\n}\n\n/**\n * List the user's cash-out orders (the Transactions-feed pattern). Reads\n * deposits by depositor and derives real amounts + states from the indexer\n * aggregates. Polls while any order is in flight.\n */\nexport function useOrders({\n client,\n owner,\n limit = 100,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrdersOptions) {\n const [orders, setOrders] = useState<CashOrder[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrders = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder[]> => {\n if (!client || !owner) return [];\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.orders(owner, { limit });\n if (isActive()) setOrders(derived);\n return derived;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return [];\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, owner, limit],\n );\n\n usePoll(\n Boolean(client && owner && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrders(isActive);\n return result.some((o) => o.isInFlight);\n },\n [fetchOrders],\n ),\n );\n\n const refresh = useCallback(() => fetchOrders(() => mounted.current), [fetchOrders, mounted]);\n\n const inFlightCount = orders.filter((o) => o.isInFlight).length;\n /** Lifetime cashed-out total (USDC base units) across the feed. */\n const totalCashedOut = orders.reduce((sum, o) => sum + o.filledAmount, 0n);\n\n return { orders, inFlightCount, totalCashedOut, isLoading, error, refresh };\n}\n"]}
|
package/dist/react.d.cts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { CurrencyType } from '@zkp2p/sdk';
|
|
2
|
-
import {
|
|
2
|
+
import { n as CashClient, E as EstimateInput, i as CashEstimate, z as CashoutOptions, h as CashoutResult, y as CashoutInput, T as TopUpResult, W as WithdrawResult, e as CashOrder } from './createCashClient-iHuGgjH_.cjs';
|
|
3
3
|
import { WalletClient } from 'viem';
|
|
4
|
+
import '@relayprotocol/relay-sdk';
|
|
4
5
|
|
|
5
6
|
interface UseEstimateOptions {
|
|
6
7
|
client: CashClient | null;
|
|
7
8
|
/** Amount to convert, USDC base units. Estimate is skipped while null/0. */
|
|
8
9
|
amount: bigint | null | undefined;
|
|
9
10
|
currency: CurrencyType | null | undefined;
|
|
11
|
+
/** Optional payout platform for platform-specific ETA sampling. */
|
|
12
|
+
platform?: string | null | undefined;
|
|
13
|
+
/** Optional Relay source. Omit for the Base USDC default path. */
|
|
14
|
+
source?: EstimateInput['source'] | null | undefined;
|
|
10
15
|
/** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */
|
|
11
16
|
refreshIntervalMs?: number;
|
|
12
17
|
}
|
|
@@ -15,7 +20,7 @@ interface UseEstimateOptions {
|
|
|
15
20
|
* estimate; the binding rate resolves at the Chainlink oracle when a buyer
|
|
16
21
|
* fills - there is no committed quote to show.
|
|
17
22
|
*/
|
|
18
|
-
declare function useEstimate({ client, amount, currency, refreshIntervalMs, }: UseEstimateOptions): {
|
|
23
|
+
declare function useEstimate({ client, amount, currency, platform, source, refreshIntervalMs, }: UseEstimateOptions): {
|
|
19
24
|
estimate: CashEstimate | null;
|
|
20
25
|
isLoading: boolean;
|
|
21
26
|
error: Error | null;
|
|
@@ -26,6 +31,9 @@ interface UseCashoutOptions {
|
|
|
26
31
|
client: CashClient | null;
|
|
27
32
|
/** A viem WalletClient with an account, on Base. */
|
|
28
33
|
signer: WalletClient | null | undefined;
|
|
34
|
+
/** Source-chain signer for Relay source routing. Required when the source chain is not Base. */
|
|
35
|
+
sourceSigner?: WalletClient | null | undefined;
|
|
36
|
+
onSourceProgress?: CashoutOptions['onSourceProgress'];
|
|
29
37
|
onCashout?: (result: CashoutResult) => void;
|
|
30
38
|
onError?: (error: Error) => void;
|
|
31
39
|
}
|
|
@@ -37,7 +45,7 @@ interface UseCashoutOptions {
|
|
|
37
45
|
* amount, full close without. The caller never chooses between
|
|
38
46
|
* cancel/recover - expired intents are pruned automatically.
|
|
39
47
|
*/
|
|
40
|
-
declare function useCashout({ client, signer, onCashout, onError }: UseCashoutOptions): {
|
|
48
|
+
declare function useCashout({ client, signer, sourceSigner, onSourceProgress, onCashout, onError, }: UseCashoutOptions): {
|
|
41
49
|
cashout: (input: CashoutInput) => Promise<CashoutResult | null>;
|
|
42
50
|
topUp: (depositId: string, amount: bigint) => Promise<TopUpResult | null>;
|
|
43
51
|
withdraw: (depositId: string, amount?: bigint) => Promise<WithdrawResult | null>;
|
package/dist/react.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { CurrencyType } from '@zkp2p/sdk';
|
|
2
|
-
import {
|
|
2
|
+
import { n as CashClient, E as EstimateInput, i as CashEstimate, z as CashoutOptions, h as CashoutResult, y as CashoutInput, T as TopUpResult, W as WithdrawResult, e as CashOrder } from './createCashClient-iHuGgjH_.js';
|
|
3
3
|
import { WalletClient } from 'viem';
|
|
4
|
+
import '@relayprotocol/relay-sdk';
|
|
4
5
|
|
|
5
6
|
interface UseEstimateOptions {
|
|
6
7
|
client: CashClient | null;
|
|
7
8
|
/** Amount to convert, USDC base units. Estimate is skipped while null/0. */
|
|
8
9
|
amount: bigint | null | undefined;
|
|
9
10
|
currency: CurrencyType | null | undefined;
|
|
11
|
+
/** Optional payout platform for platform-specific ETA sampling. */
|
|
12
|
+
platform?: string | null | undefined;
|
|
13
|
+
/** Optional Relay source. Omit for the Base USDC default path. */
|
|
14
|
+
source?: EstimateInput['source'] | null | undefined;
|
|
10
15
|
/** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */
|
|
11
16
|
refreshIntervalMs?: number;
|
|
12
17
|
}
|
|
@@ -15,7 +20,7 @@ interface UseEstimateOptions {
|
|
|
15
20
|
* estimate; the binding rate resolves at the Chainlink oracle when a buyer
|
|
16
21
|
* fills - there is no committed quote to show.
|
|
17
22
|
*/
|
|
18
|
-
declare function useEstimate({ client, amount, currency, refreshIntervalMs, }: UseEstimateOptions): {
|
|
23
|
+
declare function useEstimate({ client, amount, currency, platform, source, refreshIntervalMs, }: UseEstimateOptions): {
|
|
19
24
|
estimate: CashEstimate | null;
|
|
20
25
|
isLoading: boolean;
|
|
21
26
|
error: Error | null;
|
|
@@ -26,6 +31,9 @@ interface UseCashoutOptions {
|
|
|
26
31
|
client: CashClient | null;
|
|
27
32
|
/** A viem WalletClient with an account, on Base. */
|
|
28
33
|
signer: WalletClient | null | undefined;
|
|
34
|
+
/** Source-chain signer for Relay source routing. Required when the source chain is not Base. */
|
|
35
|
+
sourceSigner?: WalletClient | null | undefined;
|
|
36
|
+
onSourceProgress?: CashoutOptions['onSourceProgress'];
|
|
29
37
|
onCashout?: (result: CashoutResult) => void;
|
|
30
38
|
onError?: (error: Error) => void;
|
|
31
39
|
}
|
|
@@ -37,7 +45,7 @@ interface UseCashoutOptions {
|
|
|
37
45
|
* amount, full close without. The caller never chooses between
|
|
38
46
|
* cancel/recover - expired intents are pruned automatically.
|
|
39
47
|
*/
|
|
40
|
-
declare function useCashout({ client, signer, onCashout, onError }: UseCashoutOptions): {
|
|
48
|
+
declare function useCashout({ client, signer, sourceSigner, onSourceProgress, onCashout, onError, }: UseCashoutOptions): {
|
|
41
49
|
cashout: (input: CashoutInput) => Promise<CashoutResult | null>;
|
|
42
50
|
topUp: (depositId: string, amount: bigint) => Promise<TopUpResult | null>;
|
|
43
51
|
withdraw: (depositId: string, amount?: bigint) => Promise<WithdrawResult | null>;
|
package/dist/react.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { isCashError, CASH_ORDER_POLL_INTERVAL_MS } from './chunk-
|
|
1
|
+
import { isCashError, CASH_ORDER_POLL_INTERVAL_MS } from './chunk-FKVPZVFH.js';
|
|
2
2
|
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
3
3
|
|
|
4
4
|
function useEstimate({
|
|
5
5
|
client,
|
|
6
6
|
amount,
|
|
7
7
|
currency,
|
|
8
|
+
platform,
|
|
9
|
+
source,
|
|
8
10
|
refreshIntervalMs = 0
|
|
9
11
|
}) {
|
|
10
12
|
const [estimate, setEstimate] = useState(null);
|
|
@@ -20,7 +22,12 @@ function useEstimate({
|
|
|
20
22
|
setIsLoading(true);
|
|
21
23
|
setError(null);
|
|
22
24
|
try {
|
|
23
|
-
const result = await client.estimate({
|
|
25
|
+
const result = await client.estimate({
|
|
26
|
+
amount,
|
|
27
|
+
currency,
|
|
28
|
+
...platform ? { platform } : {},
|
|
29
|
+
...source ? { source } : {}
|
|
30
|
+
});
|
|
24
31
|
if (mountedRef.current) setEstimate(result);
|
|
25
32
|
} catch (err) {
|
|
26
33
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
@@ -31,7 +38,7 @@ function useEstimate({
|
|
|
31
38
|
} finally {
|
|
32
39
|
if (mountedRef.current) setIsLoading(false);
|
|
33
40
|
}
|
|
34
|
-
}, [client, currency, amount]);
|
|
41
|
+
}, [client, currency, amount, platform, source]);
|
|
35
42
|
useEffect(() => {
|
|
36
43
|
mountedRef.current = true;
|
|
37
44
|
void refresh();
|
|
@@ -45,7 +52,14 @@ function useEstimate({
|
|
|
45
52
|
}, [refresh, refreshIntervalMs]);
|
|
46
53
|
return { estimate, isLoading, error, refresh };
|
|
47
54
|
}
|
|
48
|
-
function useCashout({
|
|
55
|
+
function useCashout({
|
|
56
|
+
client,
|
|
57
|
+
signer,
|
|
58
|
+
sourceSigner,
|
|
59
|
+
onSourceProgress,
|
|
60
|
+
onCashout,
|
|
61
|
+
onError
|
|
62
|
+
}) {
|
|
49
63
|
const [pending, setPending] = useState(null);
|
|
50
64
|
const [result, setResult] = useState(null);
|
|
51
65
|
const [error, setError] = useState(null);
|
|
@@ -61,7 +75,11 @@ function useCashout({ client, signer, onCashout, onError }) {
|
|
|
61
75
|
setError(null);
|
|
62
76
|
setResult(null);
|
|
63
77
|
try {
|
|
64
|
-
const cashoutResult = await client.cashout(input, {
|
|
78
|
+
const cashoutResult = await client.cashout(input, {
|
|
79
|
+
signer,
|
|
80
|
+
...sourceSigner ? { sourceSigner } : {},
|
|
81
|
+
...onSourceProgress ? { onSourceProgress } : {}
|
|
82
|
+
});
|
|
65
83
|
setResult(cashoutResult);
|
|
66
84
|
onCashout?.(cashoutResult);
|
|
67
85
|
return cashoutResult;
|
|
@@ -74,7 +92,7 @@ function useCashout({ client, signer, onCashout, onError }) {
|
|
|
74
92
|
setPending(null);
|
|
75
93
|
}
|
|
76
94
|
},
|
|
77
|
-
[client, signer, onCashout, onError]
|
|
95
|
+
[client, signer, sourceSigner, onSourceProgress, onCashout, onError]
|
|
78
96
|
);
|
|
79
97
|
const withdraw = useCallback(
|
|
80
98
|
async (depositId, amount) => {
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/useEstimate.ts","../src/react/useCashout.ts","../src/react/usePoll.ts","../src/react/useMountedRef.ts","../src/react/useOrder.ts","../src/react/useOrders.ts"],"names":["useState","useCallback","useEffect","useRef"],"mappings":"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","file":"react.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CurrencyType } from '../sdk-types';\nimport type { CashClient } from '../client/createCashClient';\nimport type { CashEstimate } from '../client/estimate';\n\nexport interface UseEstimateOptions {\n client: CashClient | null;\n /** Amount to convert, USDC base units. Estimate is skipped while null/0. */\n amount: bigint | null | undefined;\n currency: CurrencyType | null | undefined;\n /** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */\n refreshIntervalMs?: number;\n}\n\n/**\n * Live market-rate estimate for a screen-1 display. The figure is a `≈`\n * estimate; the binding rate resolves at the Chainlink oracle when a buyer\n * fills - there is no committed quote to show.\n */\nexport function useEstimate({\n client,\n amount,\n currency,\n refreshIntervalMs = 0,\n}: UseEstimateOptions) {\n const [estimate, setEstimate] = useState<CashEstimate | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n if (!client || !currency || !amount || amount <= 0n) {\n if (mountedRef.current) setEstimate(null);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.estimate({ amount, currency });\n if (mountedRef.current) setEstimate(result);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) {\n setEstimate(null);\n setError(e);\n }\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client, currency, amount]);\n\n useEffect(() => {\n mountedRef.current = true;\n void refresh();\n if (refreshIntervalMs > 0) {\n timerRef.current = setInterval(() => void refresh(), refreshIntervalMs);\n }\n return () => {\n mountedRef.current = false;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [refresh, refreshIntervalMs]);\n\n return { estimate, isLoading, error, refresh };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport type { WalletClient } from 'viem';\nimport type {\n CashClient,\n CashoutInput,\n CashoutResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\n\nexport interface UseCashoutOptions {\n client: CashClient | null;\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient | null | undefined;\n onCashout?: (result: CashoutResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Orchestrate a cash-out end to end on the maker side:\n * - `cashout(input)` → create the market-rate deposit, resolve its composite id.\n * - `topUp(depositId, amount)` → add USDC to a live order.\n * - `withdraw(depositId, amount?)` → the ONE unwind verb; partial with an\n * amount, full close without. The caller never chooses between\n * cancel/recover - expired intents are pruned automatically.\n */\nexport function useCashout({ client, signer, onCashout, onError }: UseCashoutOptions) {\n const [pending, setPending] = useState<null | 'cashout' | 'withdraw' | 'topUp'>(null);\n const [result, setResult] = useState<CashoutResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const cashout = useCallback(\n async (input: CashoutInput): Promise<CashoutResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('cashout');\n setError(null);\n setResult(null);\n try {\n const cashoutResult = await client.cashout(input, { signer });\n setResult(cashoutResult);\n onCashout?.(cashoutResult);\n return cashoutResult;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onCashout, onError],\n );\n\n const withdraw = useCallback(\n async (depositId: string, amount?: bigint): Promise<WithdrawResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('withdraw');\n setError(null);\n try {\n return await client.withdraw(depositId, {\n signer,\n ...(amount !== undefined ? { amount } : {}),\n });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n const topUp = useCallback(\n async (depositId: string, amount: bigint): Promise<TopUpResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('topUp');\n setError(null);\n try {\n return await client.topUp(depositId, amount, { signer });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n return useMemo(\n () => ({ cashout, topUp, withdraw, pending, result, error }),\n [cashout, topUp, withdraw, pending, result, error],\n );\n}\n","import { useEffect } from 'react';\n\n/**\n * Shared polling loop for the order hooks: runs `tick` immediately, then every\n * `intervalMs` for as long as `tick` resolves true. Cancels cleanly on unmount\n * or dependency change; `isActive()` lets the tick guard its own setState\n * calls against a stale run. Internal - not exported from the package.\n */\nexport function usePoll(\n enabled: boolean,\n intervalMs: number,\n tick: (isActive: () => boolean) => Promise<boolean>,\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const isActive = () => !cancelled;\n\n const run = async () => {\n const keepPolling = await tick(isActive);\n if (cancelled) return;\n if (keepPolling) timer = setTimeout(run, intervalMs);\n };\n void run();\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [enabled, intervalMs, tick]);\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * A ref that is `true` while the component is mounted. Used to guard `setState`\n * in the manually-triggered `refresh()` paths (the poll loop guards itself).\n * Internal - not exported from the package.\n */\nexport function useMountedRef(): { readonly current: boolean } {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { isCashError } from '../client/errors';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrderOptions {\n client: CashClient | null;\n /** Composite deposit id (`escrow_onchainId`). The resumable anchor. */\n depositId: string | null | undefined;\n /** Poll cadence while the order is in flight (ms). */\n pollIntervalMs?: number;\n /** Disable automatic polling (manual `refresh()` only). */\n paused?: boolean;\n}\n\n/**\n * Observe a cash-out order's lifecycle, keyed by `depositId`.\n *\n * Fully resumable: the order is reconstructed from on-chain data on every load,\n * so it survives a closed tab, a new device, or a wallet reconnect. Polls while\n * the order is in flight and stops once it reaches a terminal state.\n * `ORDER_NOT_FOUND` right after creation is indexer lag - polling continues.\n */\nexport function useOrder({\n client,\n depositId,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrderOptions) {\n const [order, setOrder] = useState<CashOrder | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrder = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder | null> => {\n if (!client || !depositId) return null;\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.order(depositId);\n if (isActive()) setOrder(derived);\n return derived;\n } catch (err) {\n if (isCashError(err) && err.code === 'ORDER_NOT_FOUND') {\n // Indexer lag right after creation - not an error, keep polling.\n return null;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return null;\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, depositId],\n );\n\n usePoll(\n Boolean(client && depositId && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrder(isActive);\n // Keep polling while in flight (or while state is still unknown).\n return !result || result.isInFlight;\n },\n [fetchOrder],\n ),\n );\n\n const refresh = useCallback(() => fetchOrder(() => mounted.current), [fetchOrder, mounted]);\n\n return { order, isLoading, error, refresh };\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrdersOptions {\n client: CashClient | null;\n /** The connected user's address (the maker / depositor). */\n owner: string | null | undefined;\n /** Max deposits to scan. */\n limit?: number;\n /** Poll cadence (ms) while any order is in flight. */\n pollIntervalMs?: number;\n paused?: boolean;\n}\n\n/**\n * List the user's cash-out orders (the Transactions-feed pattern). Reads\n * deposits by depositor and derives real amounts + states from the indexer\n * aggregates. Polls while any order is in flight.\n */\nexport function useOrders({\n client,\n owner,\n limit = 100,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrdersOptions) {\n const [orders, setOrders] = useState<CashOrder[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrders = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder[]> => {\n if (!client || !owner) return [];\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.orders(owner, { limit });\n if (isActive()) setOrders(derived);\n return derived;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return [];\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, owner, limit],\n );\n\n usePoll(\n Boolean(client && owner && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrders(isActive);\n return result.some((o) => o.isInFlight);\n },\n [fetchOrders],\n ),\n );\n\n const refresh = useCallback(() => fetchOrders(() => mounted.current), [fetchOrders, mounted]);\n\n const inFlightCount = orders.filter((o) => o.isInFlight).length;\n /** Lifetime cashed-out total (USDC base units) across the feed. */\n const totalCashedOut = orders.reduce((sum, o) => sum + o.filledAmount, 0n);\n\n return { orders, inFlightCount, totalCashedOut, isLoading, error, refresh };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/useEstimate.ts","../src/react/useCashout.ts","../src/react/usePoll.ts","../src/react/useMountedRef.ts","../src/react/useOrder.ts","../src/react/useOrders.ts"],"names":["useState","useCallback","useEffect","useRef"],"mappings":"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","file":"react.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CurrencyType } from '../sdk-types';\nimport type { CashClient } from '../client/createCashClient';\nimport type { CashEstimate, EstimateInput } from '../client/estimate';\n\nexport interface UseEstimateOptions {\n client: CashClient | null;\n /** Amount to convert, USDC base units. Estimate is skipped while null/0. */\n amount: bigint | null | undefined;\n currency: CurrencyType | null | undefined;\n /** Optional payout platform for platform-specific ETA sampling. */\n platform?: string | null | undefined;\n /** Optional Relay source. Omit for the Base USDC default path. */\n source?: EstimateInput['source'] | null | undefined;\n /** Re-fetch interval (ms) so the displayed rate tracks the market. 0 = no auto-refresh. */\n refreshIntervalMs?: number;\n}\n\n/**\n * Live market-rate estimate for a screen-1 display. The figure is a `≈`\n * estimate; the binding rate resolves at the Chainlink oracle when a buyer\n * fills - there is no committed quote to show.\n */\nexport function useEstimate({\n client,\n amount,\n currency,\n platform,\n source,\n refreshIntervalMs = 0,\n}: UseEstimateOptions) {\n const [estimate, setEstimate] = useState<CashEstimate | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n if (!client || !currency || !amount || amount <= 0n) {\n if (mountedRef.current) setEstimate(null);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.estimate({\n amount,\n currency,\n ...(platform ? { platform } : {}),\n ...(source ? { source } : {}),\n });\n if (mountedRef.current) setEstimate(result);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) {\n setEstimate(null);\n setError(e);\n }\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client, currency, amount, platform, source]);\n\n useEffect(() => {\n mountedRef.current = true;\n void refresh();\n if (refreshIntervalMs > 0) {\n timerRef.current = setInterval(() => void refresh(), refreshIntervalMs);\n }\n return () => {\n mountedRef.current = false;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [refresh, refreshIntervalMs]);\n\n return { estimate, isLoading, error, refresh };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport type { WalletClient } from 'viem';\nimport type {\n CashClient,\n CashoutOptions,\n CashoutInput,\n CashoutResult,\n TopUpResult,\n WithdrawResult,\n} from '../client/createCashClient';\n\nexport interface UseCashoutOptions {\n client: CashClient | null;\n /** A viem WalletClient with an account, on Base. */\n signer: WalletClient | null | undefined;\n /** Source-chain signer for Relay source routing. Required when the source chain is not Base. */\n sourceSigner?: WalletClient | null | undefined;\n onSourceProgress?: CashoutOptions['onSourceProgress'];\n onCashout?: (result: CashoutResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Orchestrate a cash-out end to end on the maker side:\n * - `cashout(input)` → create the market-rate deposit, resolve its composite id.\n * - `topUp(depositId, amount)` → add USDC to a live order.\n * - `withdraw(depositId, amount?)` → the ONE unwind verb; partial with an\n * amount, full close without. The caller never chooses between\n * cancel/recover - expired intents are pruned automatically.\n */\nexport function useCashout({\n client,\n signer,\n sourceSigner,\n onSourceProgress,\n onCashout,\n onError,\n}: UseCashoutOptions) {\n const [pending, setPending] = useState<null | 'cashout' | 'withdraw' | 'topUp'>(null);\n const [result, setResult] = useState<CashoutResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const cashout = useCallback(\n async (input: CashoutInput): Promise<CashoutResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('cashout');\n setError(null);\n setResult(null);\n try {\n const cashoutResult = await client.cashout(input, {\n signer,\n ...(sourceSigner ? { sourceSigner } : {}),\n ...(onSourceProgress ? { onSourceProgress } : {}),\n });\n setResult(cashoutResult);\n onCashout?.(cashoutResult);\n return cashoutResult;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, sourceSigner, onSourceProgress, onCashout, onError],\n );\n\n const withdraw = useCallback(\n async (depositId: string, amount?: bigint): Promise<WithdrawResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('withdraw');\n setError(null);\n try {\n return await client.withdraw(depositId, {\n signer,\n ...(amount !== undefined ? { amount } : {}),\n });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n const topUp = useCallback(\n async (depositId: string, amount: bigint): Promise<TopUpResult | null> => {\n if (!client || !signer) {\n const err = new Error('Cash client or signer is not ready');\n setError(err);\n onError?.(err);\n return null;\n }\n setPending('topUp');\n setError(null);\n try {\n return await client.topUp(depositId, amount, { signer });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(e);\n return null;\n } finally {\n setPending(null);\n }\n },\n [client, signer, onError],\n );\n\n return useMemo(\n () => ({ cashout, topUp, withdraw, pending, result, error }),\n [cashout, topUp, withdraw, pending, result, error],\n );\n}\n","import { useEffect } from 'react';\n\n/**\n * Shared polling loop for the order hooks: runs `tick` immediately, then every\n * `intervalMs` for as long as `tick` resolves true. Cancels cleanly on unmount\n * or dependency change; `isActive()` lets the tick guard its own setState\n * calls against a stale run. Internal - not exported from the package.\n */\nexport function usePoll(\n enabled: boolean,\n intervalMs: number,\n tick: (isActive: () => boolean) => Promise<boolean>,\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const isActive = () => !cancelled;\n\n const run = async () => {\n const keepPolling = await tick(isActive);\n if (cancelled) return;\n if (keepPolling) timer = setTimeout(run, intervalMs);\n };\n void run();\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [enabled, intervalMs, tick]);\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * A ref that is `true` while the component is mounted. Used to guard `setState`\n * in the manually-triggered `refresh()` paths (the poll loop guards itself).\n * Internal - not exported from the package.\n */\nexport function useMountedRef(): { readonly current: boolean } {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { isCashError } from '../client/errors';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrderOptions {\n client: CashClient | null;\n /** Composite deposit id (`escrow_onchainId`). The resumable anchor. */\n depositId: string | null | undefined;\n /** Poll cadence while the order is in flight (ms). */\n pollIntervalMs?: number;\n /** Disable automatic polling (manual `refresh()` only). */\n paused?: boolean;\n}\n\n/**\n * Observe a cash-out order's lifecycle, keyed by `depositId`.\n *\n * Fully resumable: the order is reconstructed from on-chain data on every load,\n * so it survives a closed tab, a new device, or a wallet reconnect. Polls while\n * the order is in flight and stops once it reaches a terminal state.\n * `ORDER_NOT_FOUND` right after creation is indexer lag - polling continues.\n */\nexport function useOrder({\n client,\n depositId,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrderOptions) {\n const [order, setOrder] = useState<CashOrder | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrder = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder | null> => {\n if (!client || !depositId) return null;\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.order(depositId);\n if (isActive()) setOrder(derived);\n return derived;\n } catch (err) {\n if (isCashError(err) && err.code === 'ORDER_NOT_FOUND') {\n // Indexer lag right after creation - not an error, keep polling.\n return null;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return null;\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, depositId],\n );\n\n usePoll(\n Boolean(client && depositId && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrder(isActive);\n // Keep polling while in flight (or while state is still unknown).\n return !result || result.isInFlight;\n },\n [fetchOrder],\n ),\n );\n\n const refresh = useCallback(() => fetchOrder(() => mounted.current), [fetchOrder, mounted]);\n\n return { order, isLoading, error, refresh };\n}\n","import { useCallback, useState } from 'react';\nimport { CASH_ORDER_POLL_INTERVAL_MS } from '../engine/constants';\nimport type { CashOrder } from '../engine/types';\nimport type { CashClient } from '../client/createCashClient';\nimport { usePoll } from './usePoll';\nimport { useMountedRef } from './useMountedRef';\n\nexport interface UseOrdersOptions {\n client: CashClient | null;\n /** The connected user's address (the maker / depositor). */\n owner: string | null | undefined;\n /** Max deposits to scan. */\n limit?: number;\n /** Poll cadence (ms) while any order is in flight. */\n pollIntervalMs?: number;\n paused?: boolean;\n}\n\n/**\n * List the user's cash-out orders (the Transactions-feed pattern). Reads\n * deposits by depositor and derives real amounts + states from the indexer\n * aggregates. Polls while any order is in flight.\n */\nexport function useOrders({\n client,\n owner,\n limit = 100,\n pollIntervalMs = CASH_ORDER_POLL_INTERVAL_MS,\n paused = false,\n}: UseOrdersOptions) {\n const [orders, setOrders] = useState<CashOrder[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useMountedRef();\n\n const fetchOrders = useCallback(\n async (isActive: () => boolean = () => true): Promise<CashOrder[]> => {\n if (!client || !owner) return [];\n setIsLoading(true);\n setError(null);\n try {\n const derived = await client.orders(owner, { limit });\n if (isActive()) setOrders(derived);\n return derived;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (isActive()) setError(e);\n return [];\n } finally {\n if (isActive()) setIsLoading(false);\n }\n },\n [client, owner, limit],\n );\n\n usePoll(\n Boolean(client && owner && !paused),\n pollIntervalMs,\n useCallback(\n async (isActive: () => boolean) => {\n const result = await fetchOrders(isActive);\n return result.some((o) => o.isInFlight);\n },\n [fetchOrders],\n ),\n );\n\n const refresh = useCallback(() => fetchOrders(() => mounted.current), [fetchOrders, mounted]);\n\n const inFlightCount = orders.filter((o) => o.isInFlight).length;\n /** Lifetime cashed-out total (USDC base units) across the feed. */\n const totalCashedOut = orders.reduce((sum, o) => sum + o.filledAmount, 0n);\n\n return { orders, inFlightCount, totalCashedOut, isLoading, error, refresh };\n}\n"]}
|