@zkp2p/sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +547 -0
- package/dist/Zkp2pClient-CODjD_Kf.d.mts +1962 -0
- package/dist/Zkp2pClient-CODjD_Kf.d.ts +1962 -0
- package/dist/chunk-GHQK65J2.mjs +47 -0
- package/dist/chunk-GHQK65J2.mjs.map +1 -0
- package/dist/chunk-JLEW4EOG.mjs +178 -0
- package/dist/chunk-JLEW4EOG.mjs.map +1 -0
- package/dist/chunk-M6S5FL2X.mjs +75 -0
- package/dist/chunk-M6S5FL2X.mjs.map +1 -0
- package/dist/chunk-O7DHVBCL.mjs +244 -0
- package/dist/chunk-O7DHVBCL.mjs.map +1 -0
- package/dist/chunk-PBBMWRNE.mjs +131 -0
- package/dist/chunk-PBBMWRNE.mjs.map +1 -0
- package/dist/constants-DMJE2ALO.mjs +4 -0
- package/dist/constants-DMJE2ALO.mjs.map +1 -0
- package/dist/currency-ULYH5HL2.mjs +3 -0
- package/dist/currency-ULYH5HL2.mjs.map +1 -0
- package/dist/index.cjs +3080 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +435 -0
- package/dist/index.d.ts +435 -0
- package/dist/index.mjs +2205 -0
- package/dist/index.mjs.map +1 -0
- package/dist/paymentResolution-S6GZR3OY.mjs +3 -0
- package/dist/paymentResolution-S6GZR3OY.mjs.map +1 -0
- package/dist/protocolViewerParsers-DTJLHUCH.mjs +5 -0
- package/dist/protocolViewerParsers-DTJLHUCH.mjs.map +1 -0
- package/dist/react.cjs +798 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.mts +277 -0
- package/dist/react.d.ts +277 -0
- package/dist/react.mjs +774 -0
- package/dist/react.mjs.map +1 -0
- package/dist/timeout-QB7K5SOB.mjs +33 -0
- package/dist/timeout-QB7K5SOB.mjs.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts.ts","../src/errors/index.ts","../src/utils/timeout.ts","../src/utils/bytes32.ts","../src/utils/paymentResolution.ts","../src/utils/keccak.ts","../src/utils/currency.ts","../src/types/index.ts","../src/utils/constants.ts","../src/constants.ts","../src/utils/protocolViewerParsers.ts","../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/service.ts","../src/indexer/intentVerification.ts","../src/client/Zkp2pClient.ts","../src/adapters/verification.ts","../src/adapters/attestation.ts","../src/errors/utils.ts","../src/utils/encode.ts","../src/adapters/api.ts","../src/utils/erc20.ts","../src/utils/attribution.ts","../src/index.ts","../src/utils/logger.ts"],"names":["EscrowBase","OrchestratorBase","UnifiedPaymentVerifierBase","ProtocolViewerBase","EscrowBaseSepolia","OrchestratorBaseSepolia","UnifiedPaymentVerifierBaseSepolia","ProtocolViewerBaseSepolia","EscrowBaseStaging","OrchestratorBaseStaging","UnifiedPaymentVerifierBaseStaging","ProtocolViewerBaseStaging","baseAddressesRaw","baseSepoliaAddressesRaw","baseStagingAddressesRaw","basePaymentMethodsRaw","baseSepoliaPaymentMethodsRaw","baseStagingPaymentMethodsRaw","baseConstantsRaw","baseStagingConstantsRaw","ErrorCode","ZKP2PError","ValidationError","NetworkError","APIError","ContractError","hexToBytes","keccak256","toBytes","bytesToHex","baseStagingPaymentMethods","baseSepoliaPaymentMethods","_keccak256","stringToHex","Currency","currencyInfo","PAYMENT_PLATFORMS","PLATFORM_METADATA","SUPPORTED_CHAIN_IDS","TOKEN_METADATA","init_constants","toBigInt","base","headers","withTimeout","AbiCoder","Attribution","concatHex","encodeFunctionData","baseSepolia","hardhat","createPublicClient","http","mapConversionRatesToOnchainMinRate","resolvePaymentMethodNameFromHash","resolvePlatformAttestationConfig","parseDepositView","raw","parseIntentView","payee"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Contract resolution utilities for the SDK.\n *\n * Provides access to deployed contract addresses and ABIs for different\n * networks (Base, Base Sepolia) and environments (production, staging).\n *\n * @module contracts\n */\n\nimport type { Abi } from 'abitype';\n\n// Typed imports from @zkp2p/contracts-v2 (module declarations provided in src/@types)\n// Use *Raw suffix for imports that need runtime normalization (addresses, constants)\nimport baseAddressesRaw from '@zkp2p/contracts-v2/addresses/base';\nimport baseSepoliaAddressesRaw from '@zkp2p/contracts-v2/addresses/baseSepolia';\nimport baseStagingAddressesRaw from '@zkp2p/contracts-v2/addresses/baseStaging';\n\nimport EscrowBase from '@zkp2p/contracts-v2/abis/base/Escrow.json';\nimport OrchestratorBase from '@zkp2p/contracts-v2/abis/base/Orchestrator.json';\nimport ProtocolViewerBase from '@zkp2p/contracts-v2/abis/base/ProtocolViewer.json';\nimport UnifiedPaymentVerifierBase from '@zkp2p/contracts-v2/abis/base/UnifiedPaymentVerifier.json';\n\nimport EscrowBaseSepolia from '@zkp2p/contracts-v2/abis/baseSepolia/Escrow.json';\nimport OrchestratorBaseSepolia from '@zkp2p/contracts-v2/abis/baseSepolia/Orchestrator.json';\nimport ProtocolViewerBaseSepolia from '@zkp2p/contracts-v2/abis/baseSepolia/ProtocolViewer.json';\nimport UnifiedPaymentVerifierBaseSepolia from '@zkp2p/contracts-v2/abis/baseSepolia/UnifiedPaymentVerifier.json';\n\nimport EscrowBaseStaging from '@zkp2p/contracts-v2/abis/baseStaging/Escrow.json';\nimport OrchestratorBaseStaging from '@zkp2p/contracts-v2/abis/baseStaging/Orchestrator.json';\nimport UnifiedPaymentVerifierBaseStaging from '@zkp2p/contracts-v2/abis/baseStaging/UnifiedPaymentVerifier.json';\nimport ProtocolViewerBaseStaging from '@zkp2p/contracts-v2/abis/baseStaging/ProtocolViewer.json';\n\nimport baseConstantsRaw from '@zkp2p/contracts-v2/constants/base';\nimport baseStagingConstantsRaw from '@zkp2p/contracts-v2/constants/baseStaging';\n// Payment methods catalogs (JSON). Import statically so ESM bundlers include the data.\n// These modules are present in @zkp2p/contracts-v2; tsconfig sets resolveJsonModule: true\nimport basePaymentMethodsRaw from '@zkp2p/contracts-v2/paymentMethods/base.json';\nimport baseSepoliaPaymentMethodsRaw from '@zkp2p/contracts-v2/paymentMethods/baseSepolia.json';\nimport baseStagingPaymentMethodsRaw from '@zkp2p/contracts-v2/paymentMethods/baseStaging.json';\n\n// ---------------------------------------------------------------------------\n// Runtime normalization helpers for ESM/CJS interoperability\n// ---------------------------------------------------------------------------\n// In certain runtimes (tsx, Node ESM), deep imports from @zkp2p/contracts-v2\n// resolve as { default: [Getter] } or { default: { contracts: {...} } } instead\n// of the expected shape. These helpers unwrap the actual data regardless of shape.\n\n/**\n * Normalize address module shape. Handles:\n * - { contracts: {...} } (direct)\n * - { default: { contracts: {...} } } (wrapped)\n * - { default: [Getter] } (lazy)\n */\nfunction unwrapAddresses(mod: unknown): { name?: string; chainId?: number; contracts?: Record<string, `0x${string}`> } {\n if (!mod) return {} as ReturnType<typeof unwrapAddresses>;\n const m = mod as Record<string, unknown>;\n // Direct shape\n if (m.contracts) return m as ReturnType<typeof unwrapAddresses>;\n // Wrapped shape\n if ((m.default as Record<string, unknown>)?.contracts) return m.default as ReturnType<typeof unwrapAddresses>;\n // Lazy getter shape\n try {\n const d = typeof m.default === 'function' ? (m.default as () => unknown)() : m.default;\n if ((d as Record<string, unknown>)?.contracts) return d as ReturnType<typeof unwrapAddresses>;\n } catch {\n // ignore\n }\n return m as ReturnType<typeof unwrapAddresses>;\n}\n\n/**\n * Normalize payment methods module shape. Handles:\n * - { methods: {...} } (direct)\n * - { default: { methods: {...} } } (wrapped)\n * - { default: [Getter] } (lazy)\n */\nfunction unwrapMethods(mod: unknown): { methods?: Record<string, { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }> } {\n if (!mod) return {} as ReturnType<typeof unwrapMethods>;\n const m = mod as Record<string, unknown>;\n if (m.methods) return m as ReturnType<typeof unwrapMethods>;\n if ((m.default as Record<string, unknown>)?.methods) return m.default as ReturnType<typeof unwrapMethods>;\n try {\n const d = typeof m.default === 'function' ? (m.default as () => unknown)() : m.default;\n if ((d as Record<string, unknown>)?.methods) return d as ReturnType<typeof unwrapMethods>;\n } catch {\n // ignore\n }\n return m as ReturnType<typeof unwrapMethods>;\n}\n\n/**\n * Normalize constants module shape (for USDC address, etc.)\n */\nfunction unwrapConstants(mod: unknown): Record<string, unknown> {\n if (!mod) return {};\n const m = mod as Record<string, unknown>;\n if (m.USDC) return m;\n if ((m.default as Record<string, unknown>)?.USDC) return m.default as Record<string, unknown>;\n try {\n const d = typeof m.default === 'function' ? (m.default as () => unknown)() : m.default;\n if ((d as Record<string, unknown>)?.USDC) return d as Record<string, unknown>;\n } catch {\n // ignore\n }\n return m;\n}\n\n// Apply runtime normalization to all imports\nconst baseAddresses = unwrapAddresses(baseAddressesRaw);\nconst baseSepoliaAddresses = unwrapAddresses(baseSepoliaAddressesRaw);\nconst baseStagingAddresses = unwrapAddresses(baseStagingAddressesRaw);\nconst basePaymentMethods = unwrapMethods(basePaymentMethodsRaw);\nconst baseSepoliaPaymentMethods = unwrapMethods(baseSepoliaPaymentMethodsRaw);\nconst baseStagingPaymentMethods = unwrapMethods(baseStagingPaymentMethodsRaw);\nconst baseConstants = unwrapConstants(baseConstantsRaw);\nconst baseStagingConstants = unwrapConstants(baseStagingConstantsRaw);\n\n/**\n * Contract addresses for a specific deployment.\n */\nexport type V2ContractAddresses = {\n /** Escrow contract (holds deposits and manages intents) */\n escrow: `0x${string}`;\n /** Orchestrator contract (handles intent signaling and fulfillment) */\n orchestrator?: `0x${string}`;\n /** UnifiedPaymentVerifier contract (verifies payment proofs) */\n unifiedPaymentVerifier?: `0x${string}`;\n /** ProtocolViewer contract (batch read operations) */\n protocolViewer?: `0x${string}`;\n /** USDC token address */\n usdc?: `0x${string}`;\n};\n\n/**\n * Contract ABIs for a specific deployment.\n */\nexport type V2ContractAbis = {\n escrow: Abi;\n orchestrator?: Abi;\n unifiedPaymentVerifier?: Abi;\n protocolViewer?: Abi;\n};\n\n/**\n * Runtime environment: 'production' for mainnet, 'staging' for testnet/dev.\n */\nexport type RuntimeEnv = 'production' | 'staging';\n\n/**\n * Converts a chain ID to its network key.\n * @internal\n */\nexport function networkKeyFromChainId(chainId: number): 'base' | 'base_sepolia' {\n if (chainId === 84532) return 'base_sepolia';\n return 'base';\n}\n\n/**\n * Retrieves deployed contract addresses and ABIs for a given chain and environment.\n *\n * @param chainId - The chain ID (8453 for Base, 84532 for Base Sepolia)\n * @param env - Runtime environment ('production' or 'staging')\n * @returns Object containing addresses and ABIs\n *\n * @example\n * ```typescript\n * import { getContracts } from '@zkp2p/client-sdk';\n *\n * const { addresses, abis } = getContracts(8453, 'production');\n * console.log(addresses.escrow); // \"0x...\"\n * console.log(addresses.usdc); // \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"\n * ```\n */\nexport function getContracts(chainId: number, env: RuntimeEnv = 'production'): { addresses: V2ContractAddresses; abis: V2ContractAbis } {\n const key = networkKeyFromChainId(chainId);\n\n const addressesByKey: Record<'base' | 'base_sepolia', V2ContractAddresses> = {\n base: {\n escrow: (baseAddresses.contracts?.Escrow ?? '') as `0x${string}`,\n orchestrator: (baseAddresses.contracts?.Orchestrator ?? '') as `0x${string}`,\n unifiedPaymentVerifier: (baseAddresses.contracts?.UnifiedPaymentVerifier ?? '') as `0x${string}`,\n protocolViewer: (baseAddresses.contracts?.ProtocolViewer ?? '') as `0x${string}`,\n usdc: (baseConstants as any).USDC,\n },\n base_sepolia: {\n escrow: (baseSepoliaAddresses.contracts?.Escrow ?? '') as `0x${string}`,\n orchestrator: (baseSepoliaAddresses.contracts?.Orchestrator ?? '') as `0x${string}`,\n unifiedPaymentVerifier: (baseSepoliaAddresses.contracts?.UnifiedPaymentVerifier ?? '') as `0x${string}`,\n protocolViewer: (baseSepoliaAddresses.contracts?.ProtocolViewer ?? '') as `0x${string}`,\n // Prefer mock USDC when available on testnet\n usdc: (baseSepoliaAddresses.contracts as any)?.USDCMock as `0x${string}` | undefined,\n },\n };\n\n const abisByKey: Record<'base' | 'base_sepolia', V2ContractAbis> = {\n base: {\n escrow: EscrowBase as unknown as Abi,\n orchestrator: OrchestratorBase as unknown as Abi,\n unifiedPaymentVerifier: UnifiedPaymentVerifierBase as unknown as Abi,\n protocolViewer: ProtocolViewerBase as unknown as Abi,\n },\n base_sepolia: {\n escrow: EscrowBaseSepolia as unknown as Abi,\n orchestrator: OrchestratorBaseSepolia as unknown as Abi,\n unifiedPaymentVerifier: UnifiedPaymentVerifierBaseSepolia as unknown as Abi,\n protocolViewer: ProtocolViewerBaseSepolia as unknown as Abi,\n },\n };\n\n // Staging overrides (custom addresses/abis)\n if (env === 'staging') {\n return {\n addresses: {\n escrow: (baseStagingAddresses.contracts?.Escrow ?? '') as `0x${string}`,\n orchestrator: (baseStagingAddresses.contracts?.Orchestrator ?? '') as `0x${string}`,\n unifiedPaymentVerifier: (baseStagingAddresses.contracts?.UnifiedPaymentVerifier ?? '') as `0x${string}`,\n protocolViewer: (baseStagingAddresses.contracts?.ProtocolViewer ?? '') as `0x${string}`,\n usdc: (baseStagingConstants as any).USDC,\n },\n abis: {\n escrow: EscrowBaseStaging as unknown as Abi,\n orchestrator: OrchestratorBaseStaging as unknown as Abi,\n unifiedPaymentVerifier: UnifiedPaymentVerifierBaseStaging as unknown as Abi,\n protocolViewer: ProtocolViewerBaseStaging as unknown as Abi,\n },\n };\n }\n\n return { addresses: addressesByKey[key], abis: abisByKey[key] };\n}\n\n/**\n * Catalog of payment methods with their hashes and supported currencies.\n */\nexport type PaymentMethodCatalog = Record<string, { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }>;\n\n/**\n * Retrieves the payment methods catalog for a given chain and environment.\n *\n * The catalog maps payment platform names (e.g., 'wise', 'revolut') to their\n * on-chain hashes and supported currency hashes.\n *\n * @param chainId - The chain ID\n * @param env - Runtime environment\n * @returns Payment method catalog keyed by platform name\n *\n * @example\n * ```typescript\n * import { getPaymentMethodsCatalog } from '@zkp2p/client-sdk';\n *\n * const catalog = getPaymentMethodsCatalog(8453, 'production');\n * console.log(Object.keys(catalog)); // ['wise', 'venmo', 'revolut', ...]\n * console.log(catalog.wise.paymentMethodHash); // \"0x...\"\n * console.log(catalog.wise.currencies); // [\"0x...\", \"0x...\"] (currency hashes)\n * ```\n */\nexport function getPaymentMethodsCatalog(chainId: number, env: RuntimeEnv = 'production'): PaymentMethodCatalog {\n const isBaseSepolia = networkKeyFromChainId(chainId) === 'base_sepolia';\n const src = env === 'staging'\n ? (baseStagingPaymentMethods as any)\n : (isBaseSepolia ? (baseSepoliaPaymentMethods as any) : (basePaymentMethods as any));\n const methods = (src?.methods ?? src?.default?.methods ?? {}) as PaymentMethodCatalog;\n return methods;\n}\n\n/**\n * Returns the gating service address for a given chain and environment.\n *\n * The gating service signs intent parameters before they can be submitted\n * on-chain, providing an additional validation layer.\n *\n * @param chainId - The chain ID\n * @param env - Runtime environment\n * @returns Gating service signer address\n */\nexport function getGatingServiceAddress(chainId: number, env: RuntimeEnv = 'production'): `0x${string}` {\n // Base Staging & Production share the same gating service in current deployments\n if (env === 'staging') {\n return '0x396D31055Db28C0C6f36e8b36f18FE7227248a97' as `0x${string}`;\n }\n // Testnets / Base Sepolia often use a dev signer (Hardhat 0)\n if (networkKeyFromChainId(chainId) === 'base_sepolia') {\n return '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' as `0x${string}`;\n }\n // Base mainnet (production)\n return '0x396D31055Db28C0C6f36e8b36f18FE7227248a97' as `0x${string}`;\n}\n","/**\n * Error codes for categorizing SDK errors.\n */\nexport enum ErrorCode {\n /** Input validation failed */\n VALIDATION = 'VALIDATION',\n /** Network/RPC error */\n NETWORK = 'NETWORK',\n /** API request failed */\n API = 'API',\n /** Smart contract error */\n CONTRACT = 'CONTRACT',\n /** Unknown/uncategorized error */\n UNKNOWN = 'UNKNOWN'\n}\n\n/**\n * Base error class for all SDK errors.\n *\n * All SDK-specific errors extend this class, making it easy to catch\n * and handle SDK errors uniformly.\n *\n * @example\n * ```typescript\n * try {\n * await client.createDeposit(...);\n * } catch (error) {\n * if (error instanceof ZKP2PError) {\n * console.log('SDK Error:', error.code, error.message);\n * console.log('Details:', error.details);\n * }\n * }\n * ```\n */\nexport class ZKP2PError extends Error {\n /** Error category code */\n code: ErrorCode;\n /** Additional error details (varies by error type) */\n details?: unknown;\n /** Field that caused the error (for validation errors) */\n field?: string;\n\n constructor(message: string, code: ErrorCode = ErrorCode.UNKNOWN, details?: unknown, field?: string) {\n super(message);\n this.name = 'ZKP2PError';\n this.code = code;\n this.details = details;\n this.field = field;\n }\n}\n\n/**\n * Thrown when input validation fails.\n *\n * @example\n * ```typescript\n * throw new ValidationError('Amount must be positive', 'amount');\n * ```\n */\nexport class ValidationError extends ZKP2PError {\n constructor(message: string, field?: string, details?: unknown) {\n super(message, ErrorCode.VALIDATION, details, field);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when a network or RPC request fails.\n */\nexport class NetworkError extends ZKP2PError {\n constructor(message: string, details?: unknown) {\n super(message, ErrorCode.NETWORK, details);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Thrown when an API request fails.\n *\n * @example\n * ```typescript\n * catch (error) {\n * if (error instanceof APIError) {\n * console.log('HTTP Status:', error.status);\n * }\n * }\n * ```\n */\nexport class APIError extends ZKP2PError {\n /** HTTP status code (if applicable) */\n status?: number;\n\n constructor(message: string, status?: number, details?: unknown) {\n super(message, ErrorCode.API, details);\n this.status = status;\n this.name = 'APIError';\n }\n}\n\n/**\n * Thrown when a smart contract call fails.\n *\n * Check the `details` property for the underlying viem error.\n */\nexport class ContractError extends ZKP2PError {\n constructor(message: string, details?: unknown) {\n super(message, ErrorCode.CONTRACT, details);\n this.name = 'ContractError';\n }\n}\n\n","import { NetworkError } from '../errors';\n\n/**\n * Wraps a promise with a timeout\n * @param promise - The promise to wrap\n * @param timeoutMs - Timeout in milliseconds\n * @param timeoutMessage - Error message when timeout occurs\n * @returns Promise that rejects if timeout occurs\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n timeoutMessage: string\n): Promise<T> {\n let timeoutId: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new NetworkError(timeoutMessage, { timeout: timeoutMs }));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([promise, timeoutPromise]);\n if (timeoutId) clearTimeout(timeoutId);\n return result;\n } catch (error) {\n if (timeoutId) clearTimeout(timeoutId);\n throw error;\n }\n}\n\n/**\n * Default timeout values for different operation types\n */\nexport const DEFAULT_TIMEOUTS = {\n /** API call timeout (30 seconds) */\n API: 30000,\n /** Blockchain transaction timeout (60 seconds) */\n TRANSACTION: 60000,\n /** Proof generation timeout (120 seconds) */\n PROOF_GENERATION: 120000,\n /** Extension communication timeout (60 seconds) */\n EXTENSION: 60000,\n} as const;","import { keccak256, toBytes, hexToBytes, bytesToHex } from 'viem';\n\n/**\n * Ensure a value is 32 bytes hex (0x + 64 nibbles). If ascii, keccak256 by default when hash=true.\n */\nexport function ensureBytes32(value: string, { hashIfAscii = false }: { hashIfAscii?: boolean } = {}): `0x${string}` {\n if (value.startsWith('0x')) {\n const bytes = hexToBytes(value as `0x${string}`);\n if (bytes.length !== 32) throw new Error('Expected 32-byte hex value');\n return value as `0x${string}`;\n }\n if (!hashIfAscii) throw new Error('Expected 32-byte hex; received ascii string. Pass hashIfAscii=true to hash.');\n const hashed = keccak256(toBytes(value));\n return hashed as `0x${string}`;\n}\n\n/**\n * Encode ASCII (<=32 chars) left-aligned, right-padded with zeros to 32 bytes.\n */\nexport function asciiToBytes32(value: string): `0x${string}` {\n const b = toBytes(value);\n if (b.length > 32) throw new Error('ASCII input exceeds 32 bytes');\n const padded = new Uint8Array(32);\n padded.set(b);\n return (`0x${bytesToHex(padded)}`) as `0x${string}`;\n}\n\n","/**\n * Payment method resolution utilities.\n *\n * These functions convert between human-readable payment platform names\n * (e.g., 'wise', 'revolut') and their on-chain bytes32 hashes.\n *\n * @module paymentResolution\n */\n\nimport { ensureBytes32, asciiToBytes32 } from './bytes32';\nimport type { PaymentMethodCatalog } from '../contracts';\n\n// Optional JSON maps from @zkp2p/contracts-v2 (only provided on some envs)\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport baseSepoliaPaymentMethods from '@zkp2p/contracts-v2/paymentMethods/baseSepolia';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport baseStagingPaymentMethods from '@zkp2p/contracts-v2/paymentMethods/baseStaging';\n\ntype NetworkKey = 'base' | 'base_sepolia';\ntype RuntimeEnv = 'production' | 'staging';\n\nfunction getPaymentMethodMap(env: RuntimeEnv, network: NetworkKey): Record<string, { paymentMethodHash: `0x${string}` }> | null {\n if (env === 'staging') {\n const m = (baseStagingPaymentMethods?.methods ?? {}) as Record<string, { paymentMethodHash: `0x${string}` }>;\n return m && Object.keys(m).length ? m : null;\n }\n if (network === 'base_sepolia') {\n const m = (baseSepoliaPaymentMethods?.methods ?? {}) as Record<string, { paymentMethodHash: `0x${string}` }>;\n return m && Object.keys(m).length ? m : null;\n }\n return null;\n}\n\n/**\n * Resolves a payment method hash from a human-readable name.\n *\n * First attempts to look up the hash from contracts-v2 payment method maps.\n * Falls back to keccak256(name) when maps are unavailable.\n *\n * **Warning**: The fallback may not match on-chain mappings. Prefer using\n * `resolvePaymentMethodHashFromCatalog` with an explicit catalog.\n *\n * @param nameOrBytes - Payment method name ('wise') or existing bytes32 hash\n * @param opts.env - Runtime environment ('production' | 'staging')\n * @param opts.network - Network key ('base' | 'base_sepolia')\n * @returns bytes32 payment method hash\n *\n * @example\n * ```typescript\n * const hash = resolvePaymentMethodHash('wise', { env: 'production' });\n * ```\n */\nexport function resolvePaymentMethodHash(\n nameOrBytes: string,\n opts: { env?: RuntimeEnv; network?: NetworkKey } = {}\n): `0x${string}` {\n const { env = 'production', network = 'base' } = opts;\n if (nameOrBytes.startsWith('0x')) return ensureBytes32(nameOrBytes) as `0x${string}`;\n const mapping = getPaymentMethodMap(env, network);\n if (mapping) {\n const key = nameOrBytes.toLowerCase();\n const entry = mapping[key];\n if (entry?.paymentMethodHash) return entry.paymentMethodHash;\n }\n // Fallback: hash ascii name to bytes32\n return ensureBytes32(nameOrBytes, { hashIfAscii: true });\n}\n\n/**\n * Encodes a fiat currency code into bytes32 format (ASCII right-padded).\n *\n * If the input is already a hex string (0x-prefixed), it's normalized to bytes32.\n * Otherwise, the currency code is converted to uppercase ASCII bytes32.\n *\n * @param codeOrBytes - Currency code ('USD') or existing bytes32 hash\n * @returns bytes32 encoded currency\n *\n * @example\n * ```typescript\n * const bytes = resolveFiatCurrencyBytes32('USD');\n * // Returns: 0x5553440000000000000000000000000000000000000000000000000000000000\n * ```\n */\nexport function resolveFiatCurrencyBytes32(codeOrBytes: string): `0x${string}` {\n if (codeOrBytes.startsWith('0x')) return ensureBytes32(codeOrBytes) as `0x${string}`;\n return asciiToBytes32(codeOrBytes.toUpperCase());\n}\n\n/**\n * Resolves a payment method hash from a provided catalog.\n *\n * This is the recommended method for resolving payment methods as it uses\n * the exact catalog from `getPaymentMethodsCatalog()`, ensuring consistency\n * with on-chain registrations.\n *\n * @param processorName - Payment platform name ('wise', 'revolut', etc.)\n * @param catalog - Payment method catalog from `getPaymentMethodsCatalog()`\n * @returns bytes32 payment method hash\n * @throws Error with available processors if not found\n *\n * @example\n * ```typescript\n * import { getPaymentMethodsCatalog, resolvePaymentMethodHashFromCatalog } from '@zkp2p/client-sdk';\n *\n * const catalog = getPaymentMethodsCatalog(8453, 'production');\n * const hash = resolvePaymentMethodHashFromCatalog('wise', catalog);\n * ```\n */\nexport function resolvePaymentMethodHashFromCatalog(\n processorName: string,\n catalog: Record<string, { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }>\n): `0x${string}` {\n if (!processorName) {\n throw new Error('processorName is required to resolve paymentMethodHash');\n }\n if (processorName.startsWith('0x')) {\n return ensureBytes32(processorName) as `0x${string}`;\n }\n const key = processorName.toLowerCase();\n const entry = catalog?.[key];\n if (entry?.paymentMethodHash) return entry.paymentMethodHash;\n\n const available = Object.keys(catalog || {}).sort().join(', ');\n throw new Error(\n available\n ? `Unknown processorName: ${processorName}. Available: ${available}`\n : `Unknown processorName: ${processorName}. The payment methods catalog is empty or unavailable.`\n );\n}\n\n/**\n * Reverse-lookup: converts a payment method hash back to its name.\n *\n * @param hash - The payment method hash (bytes32)\n * @param catalog - Payment method catalog from `getPaymentMethodsCatalog()`\n * @returns Payment platform name (e.g., 'wise') or undefined if not found\n *\n * @example\n * ```typescript\n * const name = resolvePaymentMethodNameFromHash('0x...', catalog);\n * console.log(name); // \"wise\"\n * ```\n */\nexport function resolvePaymentMethodNameFromHash(\n hash: string,\n catalog: PaymentMethodCatalog\n): string | undefined {\n if (!hash) return undefined;\n const target = ensureBytes32(hash) as `0x${string}`;\n for (const [name, entry] of Object.entries(catalog || {})) {\n if (entry?.paymentMethodHash?.toLowerCase() === target.toLowerCase()) return name;\n }\n return undefined;\n}\n","import { keccak256 as _keccak256, sha256 as _sha256, encodePacked, stringToHex } from 'viem';\n\nexport const keccak256 = (inputString: string): string => {\n // Equivalent to solidityKeccak256(['string'], [inputString])\n return _keccak256(encodePacked(['string'], [inputString]));\n};\n\nexport const currencyKeccak256 = (inputString: string): string => {\n // Raw keccak of UTF-8 bytes\n return _keccak256(stringToHex(inputString));\n};\n\nexport const sha256 = (inputString: string): string => {\n // Equivalent to soliditySha256(['string'], [inputString])\n return _sha256(encodePacked(['string'], [inputString]));\n};\n","import { currencyKeccak256 } from './keccak';\n\n/**\n * Supported fiat currency codes.\n *\n * Use these constants when specifying currencies in conversion rates:\n *\n * @example\n * ```typescript\n * import { Currency } from '@zkp2p/client-sdk';\n *\n * const rates = [\n * { currency: Currency.USD, conversionRate: '1020000000000000000' },\n * { currency: Currency.EUR, conversionRate: '1100000000000000000' },\n * ];\n * ```\n */\nexport const Currency = {\n AED: 'AED',\n ARS: 'ARS',\n AUD: 'AUD',\n CAD: 'CAD',\n CHF: 'CHF',\n CNY: 'CNY',\n CZK: 'CZK',\n DKK: 'DKK',\n EUR: 'EUR',\n GBP: 'GBP',\n HKD: 'HKD',\n HUF: 'HUF',\n IDR: 'IDR',\n ILS: 'ILS',\n INR: 'INR',\n JPY: 'JPY',\n KES: 'KES',\n MXN: 'MXN',\n MYR: 'MYR',\n NOK: 'NOK',\n NZD: 'NZD',\n PHP: 'PHP',\n PLN: 'PLN',\n RON: 'RON',\n SAR: 'SAR',\n SEK: 'SEK',\n SGD: 'SGD',\n THB: 'THB',\n TRY: 'TRY',\n UGX: 'UGX',\n USD: 'USD',\n VND: 'VND',\n ZAR: 'ZAR'\n} as const;\n\n/**\n * Union type of all supported currency codes.\n */\nexport type CurrencyType = (typeof Currency)[keyof typeof Currency];\n\n/**\n * Complete currency information including name, symbol, and hash.\n */\nexport type CurrencyData = {\n currency: CurrencyType;\n currencyCode: string;\n currencyName: string;\n currencySymbol: string;\n currencyCodeHash: string;\n countryCode: string;\n};\n\n/**\n * Lookup table containing metadata for all supported currencies.\n *\n * Includes currency name, symbol, keccak256 hash (for on-chain use),\n * and ISO country code for flag display.\n *\n * @example\n * ```typescript\n * import { currencyInfo, Currency } from '@zkp2p/client-sdk';\n *\n * const usd = currencyInfo[Currency.USD];\n * console.log(usd.currencyName); // \"United States Dollar\"\n * console.log(usd.currencySymbol); // \"$\"\n * console.log(usd.currencyCodeHash); // \"0x...\"\n * ```\n */\nexport const currencyInfo: Record<CurrencyType, CurrencyData> = {\n AED: { currency: 'AED', currencyCode: 'AED', currencyName: 'United Arab Emirates Dirham', currencyCodeHash: currencyKeccak256('AED'), currencySymbol: 'د.إ', countryCode: 'ae' },\n ARS: { currency: 'ARS', currencyCode: 'ARS', currencyName: 'Argentine Peso', currencyCodeHash: currencyKeccak256('ARS'), currencySymbol: '$', countryCode: 'ar' },\n AUD: { currency: 'AUD', currencyCode: 'AUD', currencyName: 'Australian Dollar', currencyCodeHash: currencyKeccak256('AUD'), currencySymbol: 'A$', countryCode: 'au' },\n CAD: { currency: 'CAD', currencyCode: 'CAD', currencyName: 'Canadian Dollar', currencyCodeHash: currencyKeccak256('CAD'), currencySymbol: 'C$', countryCode: 'ca' },\n CHF: { currency: 'CHF', currencyCode: 'CHF', currencyName: 'Swiss Franc', currencyCodeHash: currencyKeccak256('CHF'), currencySymbol: 'Fr', countryCode: 'ch' },\n CNY: { currency: 'CNY', currencyCode: 'CNY', currencyName: 'Chinese Yuan', currencyCodeHash: currencyKeccak256('CNY'), currencySymbol: '¥', countryCode: 'cn' },\n CZK: { currency: 'CZK', currencyCode: 'CZK', currencyName: 'Czech Koruna', currencyCodeHash: currencyKeccak256('CZK'), currencySymbol: 'Kč', countryCode: 'cz' },\n DKK: { currency: 'DKK', currencyCode: 'DKK', currencyName: 'Danish Krone', currencyCodeHash: currencyKeccak256('DKK'), currencySymbol: 'kr', countryCode: 'dk' },\n EUR: { currency: 'EUR', currencyCode: 'EUR', currencyName: 'Euro', currencyCodeHash: currencyKeccak256('EUR'), currencySymbol: '€', countryCode: 'eu' },\n GBP: { currency: 'GBP', currencyCode: 'GBP', currencyName: 'British Pound', currencyCodeHash: currencyKeccak256('GBP'), currencySymbol: '£', countryCode: 'gb' },\n HKD: { currency: 'HKD', currencyCode: 'HKD', currencyName: 'Hong Kong Dollar', currencyCodeHash: currencyKeccak256('HKD'), currencySymbol: 'HK$', countryCode: 'hk' },\n HUF: { currency: 'HUF', currencyCode: 'HUF', currencyName: 'Hungarian Forint', currencyCodeHash: currencyKeccak256('HUF'), currencySymbol: 'Ft', countryCode: 'hu' },\n IDR: { currency: 'IDR', currencyCode: 'IDR', currencyName: 'Indonesian Rupiah', currencyCodeHash: currencyKeccak256('IDR'), currencySymbol: 'Rp', countryCode: 'id' },\n ILS: { currency: 'ILS', currencyCode: 'ILS', currencyName: 'Israeli New Shekel', currencyCodeHash: currencyKeccak256('ILS'), currencySymbol: '₪', countryCode: 'il' },\n INR: { currency: 'INR', currencyCode: 'INR', currencyName: 'Indian Rupee', currencyCodeHash: currencyKeccak256('INR'), currencySymbol: '₹', countryCode: 'in' },\n JPY: { currency: 'JPY', currencyCode: 'JPY', currencyName: 'Japanese Yen', currencyCodeHash: currencyKeccak256('JPY'), currencySymbol: '¥', countryCode: 'jp' },\n KES: { currency: 'KES', currencyCode: 'KES', currencyName: 'Kenyan Shilling', currencyCodeHash: currencyKeccak256('KES'), currencySymbol: 'KSh', countryCode: 'ke' },\n MXN: { currency: 'MXN', currencyCode: 'MXN', currencyName: 'Mexican Peso', currencyCodeHash: currencyKeccak256('MXN'), currencySymbol: '$', countryCode: 'mx' },\n MYR: { currency: 'MYR', currencyCode: 'MYR', currencyName: 'Malaysian Ringgit', currencyCodeHash: currencyKeccak256('MYR'), currencySymbol: 'RM', countryCode: 'my' },\n NOK: { currency: 'NOK', currencyCode: 'NOK', currencyName: 'Norwegian Krone', currencyCodeHash: currencyKeccak256('NOK'), currencySymbol: 'kr', countryCode: 'no' },\n NZD: { currency: 'NZD', currencyCode: 'NZD', currencyName: 'New Zealand Dollar', currencyCodeHash: currencyKeccak256('NZD'), currencySymbol: 'NZ$', countryCode: 'nz' },\n PHP: { currency: 'PHP', currencyCode: 'PHP', currencyName: 'Philippine Peso', currencyCodeHash: currencyKeccak256('PHP'), currencySymbol: '₱', countryCode: 'ph' },\n PLN: { currency: 'PLN', currencyCode: 'PLN', currencyName: 'Polish Złoty', currencyCodeHash: currencyKeccak256('PLN'), currencySymbol: 'zł', countryCode: 'pl' },\n RON: { currency: 'RON', currencyCode: 'RON', currencyName: 'Romanian Leu', currencyCodeHash: currencyKeccak256('RON'), currencySymbol: 'lei', countryCode: 'ro' },\n SAR: { currency: 'SAR', currencyCode: 'SAR', currencyName: 'Saudi Riyal', currencyCodeHash: currencyKeccak256('SAR'), currencySymbol: '﷼', countryCode: 'sa' },\n SEK: { currency: 'SEK', currencyCode: 'SEK', currencyName: 'Swedish Krona', currencyCodeHash: currencyKeccak256('SEK'), currencySymbol: 'kr', countryCode: 'se' },\n SGD: { currency: 'SGD', currencyCode: 'SGD', currencyName: 'Singapore Dollar', currencyCodeHash: currencyKeccak256('SGD'), currencySymbol: 'S$', countryCode: 'sg' },\n THB: { currency: 'THB', currencyCode: 'THB', currencyName: 'Thai Baht', currencyCodeHash: currencyKeccak256('THB'), currencySymbol: '฿', countryCode: 'th' },\n TRY: { currency: 'TRY', currencyCode: 'TRY', currencyName: 'Turkish Lira', currencyCodeHash: currencyKeccak256('TRY'), currencySymbol: '₺', countryCode: 'tr' },\n UGX: { currency: 'UGX', currencyCode: 'UGX', currencyName: 'Ugandan Shilling', currencyCodeHash: currencyKeccak256('UGX'), currencySymbol: 'USh', countryCode: 'ug' },\n USD: { currency: 'USD', currencyCode: 'USD', currencyName: 'United States Dollar', currencyCodeHash: currencyKeccak256('USD'), currencySymbol: '$', countryCode: 'us' },\n VND: { currency: 'VND', currencyCode: 'VND', currencyName: 'Vietnamese Dong', currencyCodeHash: currencyKeccak256('VND'), currencySymbol: '₫', countryCode: 'vn' },\n ZAR: { currency: 'ZAR', currencyCode: 'ZAR', currencyName: 'South African Rand', currencyCodeHash: currencyKeccak256('ZAR'), currencySymbol: 'R', countryCode: 'za' },\n} as unknown as Record<CurrencyType, CurrencyData>;\n\n/**\n * UI-friendly currency rate structure used in SDK methods.\n */\nexport type UICurrencyRate = { currency: CurrencyType; conversionRate: string };\n\n/**\n * On-chain currency structure with bytes32 code and bigint rate.\n */\nexport type OnchainCurrency = { code: `0x${string}`; conversionRate: bigint };\n\n/**\n * Maps UI currency rates to on-chain format.\n *\n * @param groups - Nested array of currency rates per payment method\n * @param expectedGroups - Expected number of groups (for validation)\n * @returns On-chain formatted currency arrays\n * @throws Error if groups structure is invalid or lengths don't match\n *\n * @internal Used by createDeposit internally\n */\nexport function mapConversionRatesToOnchain(\n groups: UICurrencyRate[][],\n expectedGroups?: number\n): OnchainCurrency[][] {\n if (!Array.isArray(groups) || !Array.isArray(groups[0])) {\n throw new Error('conversionRates must be a nested array per processor');\n }\n if (typeof expectedGroups === 'number' && groups.length !== expectedGroups) {\n throw new Error(`conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`);\n }\n return groups.map((group) => group.map((r) => {\n const info = currencyInfo[r.currency as CurrencyType];\n if (!info?.currencyCodeHash) throw new Error('Invalid currency');\n return { code: info.currencyCodeHash as `0x${string}`, conversionRate: BigInt(r.conversionRate) };\n }));\n}\n\n/**\n * On-chain currency structure with minimum conversion rate (V3 escrow format).\n */\nexport type OnchainCurrencyMinRate = { code: `0x${string}`; minConversionRate: bigint };\n\n/**\n * Maps UI currency rates to on-chain V3 escrow format with minConversionRate.\n *\n * @param groups - Nested array of currency rates per payment method\n * @param expectedGroups - Expected number of groups (for validation)\n * @returns On-chain formatted currency arrays for V3 escrow\n * @throws Error if groups structure is invalid or lengths don't match\n */\nexport function mapConversionRatesToOnchainMinRate(\n groups: UICurrencyRate[][],\n expectedGroups?: number\n): OnchainCurrencyMinRate[][] {\n if (!Array.isArray(groups) || !Array.isArray(groups[0])) {\n throw new Error('conversionRates must be a nested array per payment method');\n }\n if (typeof expectedGroups === 'number' && groups.length !== expectedGroups) {\n throw new Error(`conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`);\n }\n return groups.map((group) =>\n group.map((r) => {\n const info = currencyInfo[r.currency as CurrencyType];\n const hash = info?.currencyCodeHash as `0x${string}` | undefined;\n if (!hash) throw new Error(`Invalid currency: ${r.currency}`);\n return { code: hash, minConversionRate: BigInt(r.conversionRate) };\n })\n );\n}\n\n/**\n * Looks up currency info by its keccak256 hash.\n *\n * @param hash - The currency code hash (0x-prefixed)\n * @returns Currency data if found, undefined otherwise\n *\n * @example\n * ```typescript\n * const info = getCurrencyInfoFromHash('0x...');\n * if (info) {\n * console.log(info.currencyCode); // \"USD\"\n * }\n * ```\n */\nexport function getCurrencyInfoFromHash(hash: string): CurrencyData | undefined {\n if (!hash) return undefined;\n const h = hash.toLowerCase();\n for (const key of Object.keys(currencyInfo) as Array<keyof typeof currencyInfo>) {\n const info = currencyInfo[key];\n if (info?.currencyCodeHash?.toLowerCase() === h) return info;\n }\n return undefined;\n}\n\n/**\n * Looks up currency info by ISO country code.\n *\n * @param code - The ISO country code (e.g., 'US', 'GB')\n * @returns Currency data if found, undefined otherwise\n */\nexport function getCurrencyInfoFromCountryCode(code: string): CurrencyData | undefined {\n if (!code) return undefined;\n const upper = code.toUpperCase() as CurrencyType;\n return currencyInfo[upper];\n}\n\n/**\n * Converts a currency hash to its ISO currency code.\n *\n * @param hash - The currency code hash (0x-prefixed)\n * @returns Currency code string (e.g., 'USD') or undefined if not found\n *\n * @example\n * ```typescript\n * const code = getCurrencyCodeFromHash('0x...');\n * console.log(code); // \"USD\"\n * ```\n */\nexport function getCurrencyCodeFromHash(hash: string): string | undefined {\n return getCurrencyInfoFromHash(hash)?.currencyCode;\n}\n\n/**\n * Checks if a currency hash is recognized by the SDK.\n *\n * @param hash - The currency code hash to check\n * @returns true if the hash corresponds to a supported currency\n */\nexport function isSupportedCurrencyHash(hash: string): boolean {\n return Boolean(getCurrencyInfoFromHash(hash));\n}\n","// Minimal initial type surface for Offramp SDK\nimport type { AccessList, Address, AuthorizationList, Hash, WalletClient } from 'viem';\nimport type { CurrencyType } from '../utils/currency';\n\n/**\n * Timeout configuration for different operation types\n */\nexport type TimeoutConfig = {\n /** API call timeout in milliseconds (default: 30000) */\n api?: number;\n /** Transaction timeout in milliseconds (default: 60000) */\n transaction?: number;\n};\n\nexport type Zkp2pClientOptions = {\n walletClient: WalletClient;\n apiKey: string;\n chainId: number;\n environment?: 'production' | 'staging';\n baseApiUrl?: string;\n witnessUrl?: string;\n rpcUrl?: string;\n /** Optional bearer token for hybrid auth */\n authorizationToken?: string;\n /** Optional timeout configuration */\n timeouts?: TimeoutConfig;\n};\n\n/**\n * Callback function for transaction actions\n * @param params - Transaction callback parameters\n * @param params.hash - Transaction hash\n * @param params.data - Optional additional data from the transaction\n */\nexport type ActionCallback = (params: { hash: Hash; data?: unknown }) => void;\n\n/**\n * Safe transaction overrides including ERC-8021 referrers.\n * Referrer codes are prepended before the Base builder code (bc_nbn6qkni).\n */\nexport type TxOverrides = {\n gas?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n nonce?: number;\n value?: bigint;\n accessList?: AccessList;\n authorizationList?: AuthorizationList;\n /**\n * ERC-8021 referrer code(s) to prepend before the Base builder code.\n * Accepts a single code or multiple (e.g., ['zkp2p-bot', 'merchant-id']).\n */\n referrer?: string | string[];\n};\n\n/**\n * Parameters for fulfilling an intent with payment attestation\n */\nexport type FulfillIntentParams = {\n /** Hash of the intent to fulfill */\n intentHash: Hash;\n /** Attestation proof - object or stringified JSON from attestation service */\n proof: Record<string, unknown> | string;\n /** Optional attestation timestamp buffer override in milliseconds */\n timestampBufferMs?: number | string;\n /** Override the attestation service base URL */\n attestationServiceUrl?: string;\n /** Override the verifying contract (defaults to UnifiedPaymentVerifier) */\n verifyingContract?: Address;\n /** Optional hook payload passed to orchestrator */\n postIntentHookData?: `0x${string}`;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n /** Optional lifecycle callbacks */\n callbacks?: {\n onAttestationStart?: () => void;\n onTxSent?: (hash: Hash) => void;\n onTxMined?: (hash: Hash) => void;\n };\n};\n\n/**\n * Parameters for releasing funds back to the payer\n */\nexport type ReleaseFundsToPayerParams = {\n /** Hash of the intent to release funds for */\n intentHash: Hash;\n /** Callback when transaction is successfully sent */\n onSuccess?: ActionCallback;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when transaction is mined */\n onMined?: ActionCallback;\n};\n\n/**\n * Parameters for signaling an intent to use a deposit\n */\nexport type SignalIntentParams = {\n /** Payment processor name (e.g., 'wise', 'revolut') */\n processorName: string;\n /** ID of the deposit to use */\n depositId: string;\n /** Amount of tokens to transfer */\n tokenAmount: string;\n /** Payee details for the payment */\n payeeDetails: string;\n /** Recipient blockchain address */\n toAddress: string;\n /** Currency type for the payment */\n currency: CurrencyType;\n /** Callback when transaction is successfully sent */\n onSuccess?: ActionCallback;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when transaction is mined */\n onMined?: ActionCallback;\n};\n\n// (removed placeholder Create/Withdraw/Cancel types; see refined forms below)\n\n/**\n * Request structure for signaling an intent via the API\n */\nexport type IntentSignalRequest = {\n /** Payment processor name */\n processorName: string;\n /** ID of the deposit */\n depositId: string;\n /** Amount of tokens */\n tokenAmount: string;\n /** Payee details */\n payeeDetails: string;\n /** Recipient address */\n toAddress: string;\n /** Fiat currency code */\n fiatCurrencyCode: string;\n /** Chain ID as string */\n chainId: string;\n};\n\n/**\n * Response from signaling an intent via the API\n */\nexport type SignalIntentResponse = {\n /** Whether the request was successful */\n success: boolean;\n /** Response message */\n message: string;\n /** Response object containing intent details */\n responseObject: {\n /** Deposit data associated with the intent */\n depositData: Record<string, string | number | boolean>;\n /** Signed intent string */\n signedIntent: string;\n /** Intent data details */\n intentData: {\n /** Deposit ID */\n depositId: string;\n /** Token amount */\n tokenAmount: string;\n /** Recipient address */\n recipientAddress: string;\n /** Verifier contract address */\n verifierAddress: string;\n /** Hash of the currency code */\n currencyCodeHash: string;\n /** Signature from the gating service */\n gatingServiceSignature: string;\n };\n };\n /** HTTP status code */\n statusCode: number;\n};\n\n/**\n * Request structure for posting deposit details\n */\nexport type PostDepositDetailsRequest = {\n /** Deposit data key-value pairs */\n depositData: { [key: string]: string };\n /** Payment processor name */\n processorName: string;\n};\n\n/**\n * Response from posting deposit details\n */\nexport type PostDepositDetailsResponse = {\n /** Whether the request was successful */\n success: boolean;\n message: string;\n responseObject: {\n id: number;\n processorName: string;\n depositData: { [key: string]: string };\n hashedOnchainId: string;\n createdAt: string;\n };\n statusCode: number;\n};\n\n/**\n * Alias types for clarity when registering payee details (makers/create)\n */\nexport type RegisterPayeeDetailsRequest = PostDepositDetailsRequest;\nexport type RegisterPayeeDetailsResponse = PostDepositDetailsResponse;\n\nexport type QuoteRequest = {\n paymentPlatforms: string[];\n fiatCurrency: string;\n user: string;\n recipient: string;\n destinationChainId: number;\n destinationToken: string;\n referrer?: string;\n useMultihop?: boolean;\n quotesToReturn?: number;\n amount: string;\n isExactFiat?: boolean;\n /** Optional filter: limit quotes to these escrow contracts */\n escrowAddresses?: string[];\n /** Enable nearby quote discovery when exact match unavailable */\n includeNearbyQuotes?: boolean;\n /** Max % deviation to search for nearby quotes (e.g., 10 = ±10%) */\n nearbySearchRange?: number;\n /** Max suggestions per direction (1-10, default: 3) */\n nearbyQuotesCount?: number;\n};\n\nexport type FiatResponse = { currencyCode: string; currencyName: string; currencySymbol: string; countryCode: string };\nexport type TokenResponse = { token: string; decimals: number; name: string; symbol: string; chainId: number };\n/**\n * Intent details within a quote response\n */\nexport type QuoteIntentResponse = {\n /** Deposit ID */\n depositId: string;\n /** Payment processor name */\n processorName: string;\n /** Amount to transfer */\n amount: string;\n /** Recipient address */\n toAddress: string;\n /** Payee details */\n payeeDetails: string;\n /** Processor-specific intent data */\n processorIntentData: Record<string, unknown>;\n /** Fiat currency code */\n fiatCurrencyCode: string;\n /** Chain ID */\n chainId: string;\n};\nexport type QuoteSingleResponse = {\n fiatAmount: string;\n fiatAmountFormatted: string;\n tokenAmount: string;\n tokenAmountFormatted: string;\n paymentMethod: string;\n payeeAddress: string;\n conversionRate: string;\n intent: QuoteIntentResponse;\n payeeData?: Record<string, string>;\n};\nexport type QuoteFeesResponse = { zkp2pFee: string; zkp2pFeeFormatted: string; swapFee: string; swapFeeFormatted: string };\n\n/**\n * A nearby quote suggestion returned when no exact match is available.\n * Fields vary based on whether request was exact-token or exact-fiat mode.\n */\nexport type NearbyQuote = {\n /** For exact-token mode: suggested token amount */\n suggestedTokenAmount?: string;\n /** For exact-token mode: formatted suggested token amount */\n suggestedTokenAmountFormatted?: string;\n /** For exact-token mode: percentage difference from requested (e.g., \"-5.0%\" or \"+10.0%\") */\n tokenPercentDifference?: string;\n /** For exact-fiat mode: suggested fiat amount */\n suggestedFiatAmount?: string;\n /** For exact-fiat mode: formatted suggested fiat amount */\n suggestedFiatAmountFormatted?: string;\n /** For exact-fiat mode: percentage difference from requested */\n fiatPercentDifference?: string;\n /** The full quote at this suggested amount */\n quote: QuoteSingleResponse;\n};\n\n/**\n * Nearby quote suggestions when no exact match is available.\n * Only present in response when includeNearbyQuotes=true and no exact quotes found.\n */\nexport type NearbySuggestions = {\n /** Quotes at amounts below the requested amount (sorted by closest first) */\n below: NearbyQuote[];\n /** Quotes at amounts above the requested amount (sorted by closest first) */\n above: NearbyQuote[];\n};\n\nexport type QuoteResponseObject = {\n fiat: FiatResponse;\n token: TokenResponse;\n quotes: QuoteSingleResponse[];\n fees: QuoteFeesResponse;\n /** Nearby suggestions when no exact quotes available (only present with includeNearbyQuotes=true) */\n nearbySuggestions?: NearbySuggestions;\n};\n\nexport type QuoteResponse = {\n message: string;\n success: boolean;\n responseObject: QuoteResponseObject;\n statusCode: number;\n};\n\n/**\n * Request to fetch payee details\n * Prefer `processorName`; `platform` kept for backward compatibility.\n */\nexport type GetPayeeDetailsRequest = { hashedOnchainId: string; processorName: string };\nexport type GetPayeeDetailsResponse = {\n success: boolean;\n message: string;\n responseObject: {\n id: number;\n processorName: string;\n depositData: { [key: string]: string };\n hashedOnchainId: string;\n createdAt: string;\n};\n statusCode: number;\n};\n\n// Makers list (presented)\nexport type ListPayeesRequest = { processorName?: string };\nexport type PresentedMaker = { id?: number; processorName: string; hashedOnchainId: string; createdAt: string };\nexport type ListPayeesResponse = { success: boolean; message: string; responseObject: PresentedMaker[]; statusCode: number };\n\nexport type ValidatePayeeDetailsRequest = {\n processorName: string;\n depositData: { [key: string]: string };\n};\n\nexport type ValidatePayeeDetailsResponse = {\n success: boolean;\n message: string;\n responseObject: { isValid: boolean; errors?: string[] };\n statusCode: number;\n};\n\n// Onchain currency and deposit verifier types used in createDeposit action\nexport type OnchainCurrency = { code: `0x${string}`; conversionRate: bigint };\nexport type DepositVerifierData = {\n intentGatingService: `0x${string}`;\n payeeDetails: string;\n data: `0x${string}`;\n};\n\n// CreateDeposit refined inputs\nexport type Range = { min: bigint; max: bigint };\nexport type CreateDepositConversionRate = { currency: CurrencyType; conversionRate: string };\nexport type CreateDepositParams = {\n token: Address;\n amount: bigint;\n intentAmountRange: Range;\n conversionRates: CreateDepositConversionRate[][];\n processorNames: string[];\n depositData: { [key: string]: string }[];\n onSuccess?: ActionCallback;\n onError?: (error: Error) => void;\n onMined?: ActionCallback;\n};\n\nexport type WithdrawDepositParams = {\n depositId: string | number | bigint;\n onSuccess?: ActionCallback;\n onError?: (error: Error) => void;\n onMined?: ActionCallback;\n};\n\nexport type CancelIntentParams = {\n intentHash: Hash;\n onSuccess?: ActionCallback;\n onError?: (error: Error) => void;\n onMined?: ActionCallback;\n};\n\n\n// Historical Event Types (for deposits and intents)\nexport type DepositStatus = 'ACTIVE' | 'WITHDRAWN' | 'CLOSED';\n\nexport type Deposit = {\n id: string;\n owner: string;\n amount: string;\n minimumIntent: string;\n maximumIntent: string;\n status: DepositStatus;\n updatedAt: Date;\n createdAt: Date;\n processorPaymentData: Array<{\n processor: string;\n paymentDetailsHash: string;\n isHashed: boolean;\n paymentDetails: string;\n updatedAt: Date;\n createdAt: Date;\n }>;\n};\n\n// API Intent status per v1 Orders API\n// Note: MANUALLY_RELEASED can occur when maker releases funds without payment verification\nexport type ApiIntentStatus = 'SIGNALED' | 'FULFILLED' | 'PRUNED' | 'MANUALLY_RELEASED';\n\nexport type Intent = {\n id: number;\n intentHash: string;\n depositId: string;\n verifier: string;\n owner: string;\n toAddress: string;\n amount: string;\n fiatCurrency: string;\n conversionRate: string;\n sustainabilityFee: string | null;\n verifierFee: string | null;\n status: ApiIntentStatus;\n signalTxHash: string;\n signalTimestamp: Date;\n fulfillTxHash: string | null;\n fulfillTimestamp: Date | null;\n pruneTxHash: string | null;\n prunedTimestamp: Date | null;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type GetOwnerIntentsRequest = {\n ownerAddress: string;\n status?: ApiIntentStatus | ApiIntentStatus[];\n};\n\nexport type GetOwnerIntentsResponse = {\n success: boolean;\n message: string;\n responseObject: Intent[];\n statusCode: number;\n};\n\n// Orders API types\nexport type GetIntentsByDepositRequest = {\n depositId: string;\n status?: ApiIntentStatus | ApiIntentStatus[];\n};\n\nexport type GetIntentsByDepositResponse = {\n success: boolean;\n message: string;\n responseObject: Intent[];\n statusCode: number;\n};\n\nexport type GetIntentsByTakerRequest = {\n takerAddress: string;\n status?: ApiIntentStatus | ApiIntentStatus[];\n};\n\nexport type GetIntentsByTakerResponse = {\n success: boolean;\n message: string;\n responseObject: Intent[];\n statusCode: number;\n};\n\nexport type GetIntentsByRecipientRequest = {\n recipientAddress: string;\n status?: ApiIntentStatus | ApiIntentStatus[];\n};\n\nexport type GetIntentsByRecipientResponse = {\n success: boolean;\n message: string;\n responseObject: Intent[];\n statusCode: number;\n};\n\nexport type GetIntentByHashRequest = {\n intentHash: string;\n};\n\nexport type GetIntentByHashResponse = {\n success: boolean;\n message: string;\n responseObject: Intent;\n statusCode: number;\n};\n\n// Deposits API types aligned with v1\nexport type DepositVerifierCurrency = { id?: number; depositVerifierId?: number; currencyCode: string; conversionRate: string; createdAt?: Date; updatedAt?: Date };\nexport type DepositVerifier = { id?: number; depositId: number; verifier: string; intentGatingService: string; payeeDetailsHash: string; data: string; createdAt?: Date; updatedAt?: Date; currencies: DepositVerifierCurrency[] };\nexport type ApiDeposit = {\n id: number;\n depositor: string;\n token: string;\n amount: string;\n remainingDeposits: string;\n intentAmountMin: string;\n intentAmountMax: string;\n acceptingIntents: boolean;\n outstandingIntentAmount: string;\n availableLiquidity: string;\n status: 'ACTIVE' | 'WITHDRAWN' | 'CLOSED';\n totalIntents: number;\n signaledIntents: number;\n fulfilledIntents: number;\n prunedIntents: number;\n createdAt?: Date;\n updatedAt?: Date;\n verifiers: DepositVerifier[];\n};\n\nexport type GetOwnerDepositsRequest = {\n ownerAddress: string;\n /** Optional status filter: 'ACTIVE' | 'WITHDRAWN' | 'CLOSED' */\n status?: DepositStatus;\n};\n\nexport type GetOwnerDepositsResponse = {\n success: boolean;\n message: string;\n responseObject: ApiDeposit[];\n statusCode: number;\n};\n\nexport type GetDepositByIdRequest = { depositId: string };\nexport type GetDepositByIdResponse = { success: boolean; message: string; responseObject: ApiDeposit; statusCode: number };\n\n// Intent/order statistics returned by `/deposits/order-stats`\nexport type OrderStats = {\n id: number;\n totalIntents: number;\n signaledIntents: number;\n fulfilledIntents: number;\n prunedIntents: number;\n};\n\n// Kept for backward compatibility\nexport type DepositIntentStatistics = OrderStats;\nexport type GetDepositsOrderStatsRequest = { depositIds: number[] };\nexport type GetDepositsOrderStatsResponse = { success: boolean; message: string; responseObject: OrderStats[]; statusCode: number };\n\n// Taker tier API types\nexport type TakerTierStats = {\n lifetimeSignaledCount: number;\n lifetimeFulfilledCount: number;\n lifetimeManualReleaseCount: number;\n lifetimePruneCount: number;\n totalCancelledVolume: string;\n totalFulfilledVolume: string;\n lockScore: string;\n lockScoreDiluted: string;\n firstSeenAt: string;\n lastIntentAt: string;\n updatedAt: string;\n};\n\nexport type TakerTierLevel = 'PEASANT' | 'PEER' | 'PLUS' | 'PRO' | 'PLATINUM' | 'PEER_PRESIDENT';\nexport type PlatformRiskLevel = 'LOW' | 'MEDIUM_HIGH' | 'HIGH' | 'HIGHEST';\n\nexport type PlatformLimit = {\n paymentMethodHash: string;\n platformName: string;\n riskLevel: PlatformRiskLevel;\n capMultiplier: number;\n effectiveCap: string;\n effectiveCapDisplay: string;\n hasCooldown: boolean;\n cooldownHours: number;\n isLocked: boolean;\n minTierRequired: TakerTierLevel | null;\n};\n\nexport type TakerTier = {\n owner: string;\n chainId: number;\n tier: TakerTierLevel;\n perIntentCapBaseUnits: string;\n perIntentCapDisplay: string;\n lastUpdated: string;\n source: 'computed' | 'fallback';\n stats: TakerTierStats | null;\n cooldownHours: number;\n cooldownSeconds: number;\n cooldownActive: boolean;\n cooldownRemainingSeconds: number;\n nextIntentAvailableAt: string | null;\n platformLimits?: PlatformLimit[];\n};\n\nexport type GetTakerTierRequest = {\n owner: string;\n chainId: number;\n};\n\nexport type GetTakerTierResponse = {\n success: boolean;\n message: string;\n responseObject: TakerTier;\n statusCode?: number;\n};\n\n// Currency domain (ISO) and on-chain currency mapping\nexport { Currency } from '../utils/currency';\nexport type { CurrencyType } from '../utils/currency';\n\n// Payment platforms (derived as a closed union for safety)\nexport const PAYMENT_PLATFORMS = [\n 'wise',\n 'venmo',\n 'revolut',\n 'cashapp',\n 'mercadopago',\n 'zelle',\n 'paypal',\n 'monzo',\n] as const;\nexport type PaymentPlatformType = typeof PAYMENT_PLATFORMS[number];\n\n\n// On-chain views\nexport type { EscrowDepositView, EscrowIntentView } from './escrowViews';\n","import type { Address } from 'viem';\n\n// Unversioned base; callers/providers must append /v1 or /v2 in adapters\nexport const DEFAULT_BASE_API_URL = 'https://api.zkp2p.xyz';\nexport const DEFAULT_WITNESS_URL = 'https://witness-proxy.zkp2p.xyz';\n\n// Enabled payment platforms (verifiers) for enrichment and platform-aware logic\nexport const ENABLED_PLATFORMS = [\n 'venmo',\n 'revolut',\n 'cashapp',\n 'wise',\n 'mercadopago',\n 'zelle',\n 'paypal',\n 'monzo',\n] as const;\n\nexport type EnabledPlatform = (typeof ENABLED_PLATFORMS)[number];\n\ntype PlatformAddresses = { [P in EnabledPlatform]: Address };\n\nexport type ContractSet = PlatformAddresses & {\n usdc: Address;\n escrow: Address;\n gatingService: Address;\n zkp2pWitnessSigner: Address;\n};\n\ntype Contracts = {\n [chainId: number]:\n | ContractSet\n | {\n production: ContractSet;\n staging: ContractSet;\n };\n};\n\nexport const DEPLOYED_ADDRESSES: Contracts = {\n 8453: {\n production: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n \n // escrow + verifiers\n escrow: '0xCA38607D85E8F6294Dc10728669605E6664C2D70',\n \n // Processor names to deployed addresses\n venmo: '0x9a733B55a875D0DB4915c6B36350b24F8AB99dF5',\n revolut: '0xAA5A1B62B01781E789C900d616300717CD9A41aB',\n cashapp: '0x76D33A33068D86016B806dF02376dDBb23Dd3703',\n wise: '0xFF0149799631D7A5bdE2e7eA9b306c42b3d9a9ca',\n mercadopago: '0xf2AC5be14F32Cbe6A613CFF8931d95460D6c33A3',\n zelle: '0x431a078A5029146aAB239c768A615CD484519aF7',\n paypal: '0x03d17E9371C858072E171276979f6B44571C5DeA',\n monzo: '0x0dE46433bD251027f73eD8f28E01eF05DA36a2E0',\n \n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n staging: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n \n // escrow + verifiers\n escrow: '0xC8cd114C6274Ef1066840337E7678BC9731BEa68',\n \n // Processor names to deployed addresses\n venmo: '0xCE6454f272127ba69e8C8128B92F2388Ca343257',\n revolut: '0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b',\n cashapp: '0xdDB9d452180398F456Fe89A43Df9C65B19756CEa',\n wise: '0x79F35E2f65ff917BE35686d34932C8Ef5a30631f',\n mercadopago: '0xA2d54F983B8201c7b276C9705641C49C2FBD1A36',\n zelle: '0x0Ed3c3DB9CF8458e5D9991712552539675D2C896',\n paypal: '0xB07764999679a9136d6853a5D4c70449afbfc2f8',\n monzo: '0x179792F99C0eFBFa06c3F6747989a96c58544f6F',\n \n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n },\n 84532: {\n usdc: '0x17463cb89A62c7b4A5ecD949aFDEDBD0Aa047ad1',\n escrow: '0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7',\n venmo: '0x8499f2e7c4496Acfe0D7Ca5C7b6522514877b33F',\n revolut: '0x7E34909A1C1b2a4D2FAbA61c17a0F59ECAce6F29',\n cashapp: '0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec',\n wise: '0x54c92a8828A393C5A6D1DfbB71d0e9e97329b39C',\n mercadopago: '0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b',\n zelle: '0xbeeC239145b3c461422BC2fC45B78E5fd70862F1',\n paypal: '0xC8cd114C6274Ef1066840337E7678BC9731BEa68',\n monzo: '0xe2B378D9181046c84dB1156B0F90cF3108e25E9D',\n \n gatingService: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n 31337: {\n usdc: '0x5FbDB2315678afecb367f032d93F642f64180aa3',\n escrow: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512',\n venmo: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',\n revolut: '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853',\n cashapp: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788',\n wise: '0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82',\n mercadopago: '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1',\n zelle: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c',\n paypal: '0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E',\n monzo: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042',\n \n // offchain services\n gatingService: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', // Hardhat 0\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n};\n\nexport function getPlatformAddressMap(\n addresses: ContractSet\n): Record<EnabledPlatform, Address> {\n const entries = ENABLED_PLATFORMS.map((p) => [p, addresses[p]] as const);\n return Object.fromEntries(entries) as Record<EnabledPlatform, Address>;\n}\n\nexport function platformFromVerifierAddress(\n addresses: ContractSet,\n verifierAddress: string\n): EnabledPlatform | null {\n if (!verifierAddress) return null;\n const target = verifierAddress.toLowerCase();\n for (const p of ENABLED_PLATFORMS) {\n const addr = addresses[p]?.toLowerCase?.();\n if (addr && addr === target) return p;\n }\n return null;\n}\n","/**\n * SDK Constants\n *\n * This module exports all public constants for the SDK including:\n * - Payment platforms (Wise, Venmo, Revolut, etc.)\n * - Currencies (USD, EUR, GBP, etc.)\n * - Chain IDs and network configuration\n * - Token metadata\n *\n * @module constants\n */\n\n// Payment platforms\nexport { PAYMENT_PLATFORMS, type PaymentPlatformType } from './types';\n\n// Currencies\nexport { Currency, currencyInfo } from './utils/currency';\nexport type { CurrencyType, CurrencyData } from './utils/currency';\n\n// Contract addresses and deployment info\nexport { DEPLOYED_ADDRESSES } from './utils/constants';\n\n// API URLs\nexport { DEFAULT_BASE_API_URL, DEFAULT_WITNESS_URL } from './utils/constants';\n\n/**\n * Supported blockchain chain IDs.\n *\n * @example\n * ```typescript\n * import { SUPPORTED_CHAIN_IDS } from '@zkp2p/client-sdk';\n *\n * const client = new Zkp2pClient({\n * chainId: SUPPORTED_CHAIN_IDS.BASE_MAINNET,\n * // ...\n * });\n * ```\n */\nexport const SUPPORTED_CHAIN_IDS = {\n /** Base mainnet (8453) */\n BASE_MAINNET: 8453,\n /** Base Sepolia testnet (84532) */\n BASE_SEPOLIA: 84532,\n /** Scroll mainnet (534352) */\n SCROLL_MAINNET: 534352,\n /** Local Hardhat network (31337) */\n HARDHAT: 31337,\n} as const;\n\n/**\n * Union type of supported chain IDs.\n */\nexport type SupportedChainId = typeof SUPPORTED_CHAIN_IDS[keyof typeof SUPPORTED_CHAIN_IDS];\n\n/**\n * Metadata for each supported payment platform.\n *\n * Includes display names, logos, and the number of proofs required\n * for payment verification.\n */\nexport const PLATFORM_METADATA = {\n venmo: {\n name: 'Venmo',\n displayName: 'Venmo',\n logo: '💵',\n requiredProofs: 1,\n },\n revolut: {\n name: 'Revolut',\n displayName: 'Revolut',\n logo: '💳',\n requiredProofs: 1,\n },\n cashapp: {\n name: 'CashApp',\n displayName: 'Cash App',\n logo: '💸',\n requiredProofs: 1,\n },\n wise: {\n name: 'Wise',\n displayName: 'Wise',\n logo: '🌍',\n requiredProofs: 2,\n },\n mercadopago: {\n name: 'MercadoPago',\n displayName: 'Mercado Pago',\n logo: '💰',\n requiredProofs: 1,\n },\n zelle: {\n name: 'Zelle',\n displayName: 'Zelle',\n logo: '💲',\n requiredProofs: 1,\n },\n paypal: {\n name: 'PayPal',\n displayName: 'PayPal',\n logo: '💙',\n requiredProofs: 1,\n },\n monzo: {\n name: 'Monzo',\n displayName: 'Monzo',\n logo: '🏦',\n requiredProofs: 1,\n },\n} as const;\n\n/**\n * Token metadata for supported tokens.\n */\nexport const TOKEN_METADATA = {\n USDC: {\n symbol: 'USDC',\n decimals: 6,\n name: 'USD Coin',\n },\n} as const;\n\n/**\n * Attestation service configuration for each payment platform.\n *\n * Maps platform names to their corresponding action types for the\n * attestation service endpoints.\n *\n * @internal Used internally by fulfillIntent\n */\nexport const PLATFORM_ATTESTATION_CONFIG: Record<string, { actionType: string; actionPlatform: string }> = {\n wise: { actionType: 'transfer_wise', actionPlatform: 'wise' },\n venmo: { actionType: 'transfer_venmo', actionPlatform: 'venmo' },\n revolut: { actionType: 'transfer_revolut', actionPlatform: 'revolut' },\n cashapp: { actionType: 'transfer_cashapp', actionPlatform: 'cashapp' },\n mercadopago: { actionType: 'transfer_mercadopago', actionPlatform: 'mercadopago' },\n paypal: { actionType: 'transfer_paypal', actionPlatform: 'paypal' },\n monzo: { actionType: 'transfer_monzo', actionPlatform: 'monzo' },\n 'zelle-chase': { actionType: 'transfer_zelle', actionPlatform: 'chase' },\n 'zelle-bofa': { actionType: 'transfer_zelle', actionPlatform: 'bankofamerica' },\n 'zelle-citi': { actionType: 'transfer_zelle', actionPlatform: 'citi' },\n} as const;\n\n/**\n * Resolves attestation platform configuration for a given payment platform.\n *\n * @param platformName - The payment platform name (e.g., 'wise', 'venmo', 'zelle-citi')\n * @returns Attestation configuration with actionType and actionPlatform\n * @throws Error if the platform is not supported\n *\n * @internal Used internally by fulfillIntent\n */\nexport function resolvePlatformAttestationConfig(platformName: string): { actionType: string; actionPlatform: string } {\n const normalized = platformName.toLowerCase();\n const config = PLATFORM_ATTESTATION_CONFIG[normalized];\n if (!config) {\n throw new Error(`Unknown payment platform: ${platformName}`);\n }\n return config;\n}\n","function toBigInt(v: any): bigint {\n if (typeof v === 'bigint') return v;\n if (typeof v === 'number') return BigInt(v);\n if (typeof v === 'string') return BigInt(v);\n if (v && typeof v.toString === 'function') return BigInt(v.toString());\n throw new Error('Unsupported numeric type for bigint conversion');\n}\n\nexport type PV_Deposit = {\n depositor: string;\n delegate: string;\n token: string;\n amount: bigint;\n intentAmountRange: { min: bigint; max: bigint };\n acceptingIntents: boolean;\n remainingDeposits: bigint;\n outstandingIntentAmount: bigint;\n makerProtocolFee: bigint;\n reservedMakerFees: bigint;\n accruedMakerFees: bigint;\n accruedReferrerFees: bigint;\n intentGuardian: string;\n referrer: string;\n referrerFee: bigint;\n};\n\nexport type PV_Currency = { code: string; minConversionRate: bigint };\nexport type PV_PaymentMethodData = {\n paymentMethod: string; // bytes32\n verificationData: {\n intentGatingService: string;\n payeeDetails: string; // bytes32\n data: string; // bytes\n };\n currencies: PV_Currency[];\n};\n\nexport type PV_DepositView = {\n depositId: bigint;\n deposit: PV_Deposit;\n availableLiquidity: bigint;\n paymentMethods: PV_PaymentMethodData[];\n intentHashes: string[];\n};\n\nexport type PV_Intent = {\n owner: string;\n to: string;\n escrow: string;\n depositId: bigint;\n amount: bigint;\n timestamp: bigint;\n paymentMethod: string; // bytes32\n fiatCurrency: string; // bytes32\n conversionRate: bigint;\n referrer: string;\n referrerFee: bigint;\n postIntentHook: string;\n data: string;\n};\n\nexport type PV_IntentView = {\n intentHash: string;\n intent: PV_Intent;\n deposit: Omit<PV_DepositView, 'intentHashes'>;\n};\n\nexport function parseDepositView(raw: any): PV_DepositView {\n return {\n depositId: toBigInt(raw.depositId),\n deposit: {\n depositor: raw.deposit.depositor,\n delegate: raw.deposit.delegate,\n token: raw.deposit.token,\n amount: toBigInt(raw.deposit.amount),\n intentAmountRange: {\n min: toBigInt(raw.deposit.intentAmountRange.min),\n max: toBigInt(raw.deposit.intentAmountRange.max),\n },\n acceptingIntents: raw.deposit.acceptingIntents,\n remainingDeposits: toBigInt(raw.deposit.remainingDeposits),\n outstandingIntentAmount: toBigInt(raw.deposit.outstandingIntentAmount),\n makerProtocolFee: toBigInt(raw.deposit.makerProtocolFee ?? 0),\n reservedMakerFees: toBigInt(raw.deposit.reservedMakerFees ?? 0),\n accruedMakerFees: toBigInt(raw.deposit.accruedMakerFees ?? 0),\n accruedReferrerFees: toBigInt(raw.deposit.accruedReferrerFees ?? 0),\n intentGuardian: raw.deposit.intentGuardian,\n referrer: raw.deposit.referrer,\n referrerFee: toBigInt(raw.deposit.referrerFee ?? 0),\n },\n availableLiquidity: toBigInt(raw.availableLiquidity),\n paymentMethods: (raw.paymentMethods || []).map((pm: any) => ({\n paymentMethod: pm.paymentMethod,\n verificationData: {\n intentGatingService: pm.verificationData.intentGatingService,\n payeeDetails: pm.verificationData.payeeDetails,\n data: pm.verificationData.data,\n },\n currencies: (pm.currencies || []).map((c: any) => ({\n code: c.code,\n minConversionRate: toBigInt(c.minConversionRate),\n })),\n })),\n intentHashes: raw.intentHashes || [],\n };\n}\n\nexport function parseIntentView(raw: any): PV_IntentView {\n const parsedDeposit = parseDepositView(raw.deposit);\n const deposit: Omit<PV_DepositView, 'intentHashes'> = {\n depositId: parsedDeposit.depositId,\n deposit: parsedDeposit.deposit,\n availableLiquidity: parsedDeposit.availableLiquidity,\n paymentMethods: parsedDeposit.paymentMethods,\n };\n return {\n intentHash: raw.intentHash,\n intent: {\n owner: raw.intent.owner,\n to: raw.intent.to,\n escrow: raw.intent.escrow,\n depositId: toBigInt(raw.intent.depositId),\n amount: toBigInt(raw.intent.amount),\n timestamp: toBigInt(raw.intent.timestamp),\n paymentMethod: raw.intent.paymentMethod,\n fiatCurrency: raw.intent.fiatCurrency,\n conversionRate: toBigInt(raw.intent.conversionRate),\n referrer: raw.intent.referrer,\n referrerFee: toBigInt(raw.intent.referrerFee ?? 0),\n postIntentHook: raw.intent.postIntentHook,\n data: raw.intent.data,\n },\n deposit,\n };\n}\n\n// Enrichment helpers for dashboards/explorers\nimport { getPaymentMethodsCatalog, type RuntimeEnv } from '../contracts';\nimport { resolvePaymentMethodNameFromHash } from './paymentResolution';\nimport { getCurrencyInfoFromHash } from './currency';\n\nexport function enrichPvDepositView(view: PV_DepositView, chainId: number, env: RuntimeEnv = 'production') {\n const catalog = getPaymentMethodsCatalog(chainId, env);\n return {\n ...view,\n paymentMethods: view.paymentMethods.map((pm) => ({\n ...pm,\n processorName: resolvePaymentMethodNameFromHash(pm.paymentMethod, catalog),\n currencies: pm.currencies.map((c) => ({\n ...c,\n currencyInfo: getCurrencyInfoFromHash(c.code),\n })),\n })),\n };\n}\n\nexport function enrichPvIntentView(view: PV_IntentView, chainId: number, env: RuntimeEnv = 'production') {\n const catalog = getPaymentMethodsCatalog(chainId, env);\n return {\n ...view,\n intent: {\n ...view.intent,\n processorName: resolvePaymentMethodNameFromHash(view.intent.paymentMethod, catalog),\n currencyInfo: getCurrencyInfoFromHash(view.intent.fiatCurrency),\n },\n deposit: enrichPvDepositView(view.deposit as any, chainId, env),\n } as any;\n}\n","/**\n * Minimal fetch-based GraphQL client for the ZKP2P indexer.\n * No external GraphQL dependencies; works in Node and browser.\n */\n\nexport type GraphQLRequest = {\n query: string;\n variables?: Record<string, unknown>;\n};\n\nexport type GraphQLErrorShape = { message: string; extensions?: Record<string, unknown> };\n\nexport type GraphQLResponse<T = any> = {\n data?: T;\n errors?: GraphQLErrorShape[];\n};\n\nexport class IndexerClient {\n constructor(private endpoint: string) {}\n\n private async _post<T>(request: GraphQLRequest, init?: RequestInit): Promise<T> {\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n cache: 'no-store',\n ...init,\n });\n if (!res.ok) throw new Error(`Indexer request failed: ${res.status} ${res.statusText}`);\n const json: GraphQLResponse<T> = await res.json();\n if (json.errors?.length) {\n const msg = json.errors.map(e => e.message).join(', ');\n throw new Error(`GraphQL errors: ${msg}`);\n }\n if (!json.data) throw new Error('No data returned from indexer');\n return json.data;\n }\n\n async query<T = any>(request: GraphQLRequest, init?: RequestInit & { retries?: number }): Promise<T> {\n const retries = init?.retries ?? 1;\n let lastErr: unknown;\n for (let i = 0; i <= retries; i++) {\n try {\n return await this._post<T>(request, init);\n } catch (e) {\n lastErr = e;\n if (i === retries) break;\n await new Promise(r => setTimeout(r, 200 * (i + 1)));\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n}\n\nexport type DeploymentEnv = 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING' | 'DEV' | 'LOCAL' | 'STAGING_TESTNET';\n\nexport function defaultIndexerEndpoint(env: DeploymentEnv = 'PRODUCTION'): string {\n switch (env) {\n case 'PRODUCTION':\n return 'https://indexer.hyperindex.xyz/8fd74dc/v1/graphql';\n case 'PREPRODUCTION':\n return 'https://indexer.hyperindex.xyz/186c193/v1/graphql';\n case 'STAGING':\n return 'https://indexer.dev.hyperindex.xyz/3b6e163/v1/graphql';\n case 'DEV':\n case 'LOCAL':\n case 'STAGING_TESTNET':\n // Not used by consumers; map to staging endpoint by default\n return 'https://indexer.dev.hyperindex.xyz/3b6e163/v1/graphql';\n default:\n return 'https://indexer.hyperindex.xyz/8fd74dc/v1/graphql';\n }\n}\n","/**\n * GraphQL queries for Hasura-backed ZKP2P indexer\n */\n\nconst DEPOSIT_FIELDS = `\n id\n chainId\n escrowAddress\n depositId\n depositor\n token\n remainingDeposits\n intentAmountMin\n intentAmountMax\n acceptingIntents\n status\n outstandingIntentAmount\n totalAmountTaken\n totalWithdrawn\n successRateBps\n totalIntents\n signaledIntents\n fulfilledIntents\n prunedIntents\n blockNumber\n timestamp\n txHash\n updatedAt\n`;\n\nexport const DEPOSITS_QUERY = /* GraphQL */ `\n query GetDeposits(\n $where: Deposit_bool_exp\n $order_by: [Deposit_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Deposit(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const DEPOSITS_BY_IDS_QUERY = /* GraphQL */ `\n query GetDepositsByIds($ids: [String!]) {\n Deposit(where: { id: { _in: $ids } }) {\n ${DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositRelations($depositIds: [String!]) {\n DepositPaymentMethod(where: { depositId: { _in: $depositIds } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n }\n }\n`;\n\nexport const PAYMENT_METHODS_BY_PAYEE_HASH_QUERY = /* GraphQL */ `\n query GetPaymentMethodsByPayeeHash(\n $where: DepositPaymentMethod_bool_exp!\n $limit: Int\n ) {\n DepositPaymentMethod(where: $where, limit: $limit) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n }\n`;\n\nexport const DEPOSIT_WITH_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositWithRelations($id: String!) {\n Deposit_by_pk(id: $id) {\n ${DEPOSIT_FIELDS}\n }\n DepositPaymentMethod(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n }\n }\n`;\n\nexport const INTENTS_QUERY = /* GraphQL */ `\n query GetIntents(\n $where: Intent_bool_exp\n $order_by: [Intent_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Intent(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n id\n intentHash\n depositId\n orchestratorAddress\n verifier\n owner\n toAddress\n amount\n fiatCurrency\n conversionRate\n status\n isExpired\n signalTimestamp\n expiryTime\n fulfillTimestamp\n pruneTimestamp\n updatedAt\n signalTxHash\n fulfillTxHash\n pruneTxHash\n paymentMethodHash\n paymentAmount\n paymentCurrency\n paymentTimestamp\n paymentId\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const EXPIRED_INTENTS_QUERY = /* GraphQL */ `\n query GetExpiredIntents(\n $now: numeric!\n $limit: Int\n $depositIds: [String!]\n ) {\n Intent(\n where: {\n status: { _eq: \"SIGNALED\" }\n expiryTime: { _lt: $now }\n depositId: { _in: $depositIds }\n }\n order_by: { expiryTime: asc }\n limit: $limit\n ) {\n id\n intentHash\n depositId\n owner\n toAddress\n amount\n expiryTime\n isExpired\n updatedAt\n paymentMethodHash\n }\n }\n`;\n\nexport const INTENT_FULFILLMENTS_QUERY = /* GraphQL */ `\n query GetFulfilledIntents($intentHashes: [String!]) {\n Orchestrator_V21_IntentFulfilled(\n where: { intentHash: { _in: $intentHashes } }\n ) {\n intentHash\n isManualRelease\n fundsTransferredTo\n }\n }\n`;\n\nexport const FULFILLMENT_AND_PAYMENT_QUERY = /* GraphQL */ `\n query PaymentVerificationForFulfilledIntent($intentHash: String!) {\n Orchestrator_V21_IntentFulfilled(\n where: { intentHash: { _eq: $intentHash } }\n ) {\n id\n intentHash\n amount\n isManualRelease\n fundsTransferredTo\n }\n UnifiedVerifier_V21_PaymentVerified(\n where: { intentHash: { _eq: $intentHash } }\n ) {\n id\n intentHash\n method\n currency\n amount\n timestamp\n paymentId\n payeeId\n }\n }\n`;\n","import type { DepositWithRelations, IntentEntity } from './types';\nimport type { EscrowDepositView, EscrowIntentView } from '../types';\n\nconst ZERO = '0x0000000000000000000000000000000000000000';\n\nfunction toBigInt(value: string | number | bigint | null | undefined): bigint {\n if (value === null || value === undefined) return 0n;\n try { return typeof value === 'bigint' ? value : BigInt(value); } catch { return 0n; }\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return ZERO;\n return value.startsWith('0x') ? value : ZERO;\n}\n\nexport function extractDepositId(compositeId: string): string {\n const parts = compositeId.split('_');\n return parts[1] || '0';\n}\n\nexport function createCompositeDepositId(escrowAddress: string, depositId: string | bigint): string {\n return `${escrowAddress.toLowerCase()}_${depositId.toString()}`;\n}\n\nexport function convertIndexerDepositToEscrowView(deposit: DepositWithRelations, _chainId: number, _escrowAddress: string): EscrowDepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(pm => (pm as any).active !== false);\n const currencies = deposit.currencies ?? [];\n\n const currenciesByPaymentMethod = new Map<string, typeof currencies>();\n for (const c of currencies) {\n const bucket = currenciesByPaymentMethod.get(c.paymentMethodHash) ?? [];\n bucket.push(c);\n currenciesByPaymentMethod.set(c.paymentMethodHash, bucket);\n }\n\n const verifiers = paymentMethods.map(pm => ({\n verifier: normalizeAddress(pm.verifierAddress),\n verificationData: {\n intentGatingService: normalizeAddress(pm.intentGatingService),\n payeeDetails: pm.payeeDetailsHash ?? '',\n data: '' as `0x${string}`,\n },\n currencies: (currenciesByPaymentMethod.get(pm.paymentMethodHash) ?? []).map(cur => ({\n code: cur.currencyCode as `0x${string}`,\n conversionRate: toBigInt(cur.minConversionRate),\n })),\n methodHash: pm.paymentMethodHash as `0x${string}`,\n }));\n\n const uniqueIntentHashes = new Set((deposit.intents ?? []).map(i => i.intentHash));\n const remaining = toBigInt(deposit.remainingDeposits);\n const outstanding = toBigInt(deposit.outstandingIntentAmount);\n\n const depositAmount = remaining + outstanding + toBigInt(deposit.totalAmountTaken ?? 0) + toBigInt(deposit.totalWithdrawn ?? 0);\n\n return {\n depositId: toBigInt(deposit.depositId),\n deposit: {\n depositor: normalizeAddress(deposit.depositor),\n token: normalizeAddress(deposit.token),\n depositAmount,\n intentAmountRange: { min: toBigInt(deposit.intentAmountMin), max: toBigInt(deposit.intentAmountMax) },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDepositAmount: remaining,\n outstandingIntentAmount: outstanding,\n intentHashes: Array.from(uniqueIntentHashes),\n },\n verifiers,\n };\n}\n\nexport function convertDepositsForLiquidity(deposits: DepositWithRelations[], chainId: number, escrowAddress: string): EscrowDepositView[] {\n return deposits\n .filter(d => d.depositor && d.depositor.toLowerCase() !== ZERO && d.acceptingIntents && toBigInt(d.remainingDeposits) > 0n && d.status === 'ACTIVE')\n .map(d => convertIndexerDepositToEscrowView(d, chainId, escrowAddress));\n}\n\nexport function convertIndexerIntentsToEscrowViews(intents: IntentEntity[], depositViewsById: Map<string, EscrowDepositView>): EscrowIntentView[] {\n const result: EscrowIntentView[] = [];\n for (const intent of intents) {\n const depositView = depositViewsById.get(intent.depositId.toLowerCase());\n if (!depositView) continue;\n const rawDepositId = extractDepositId(intent.depositId);\n result.push({\n intentHash: intent.intentHash as `0x${string}`,\n intent: {\n owner: normalizeAddress(intent.owner),\n to: normalizeAddress(intent.toAddress),\n depositId: toBigInt(rawDepositId),\n amount: toBigInt(intent.amount),\n timestamp: toBigInt(intent.signalTimestamp),\n paymentVerifier: normalizeAddress(intent.verifier),\n fiatCurrency: intent.fiatCurrency,\n conversionRate: toBigInt(intent.conversionRate),\n },\n deposit: depositView,\n });\n }\n return result;\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSITS_QUERY,\n DEPOSITS_BY_IDS_QUERY,\n DEPOSIT_RELATIONS_QUERY,\n DEPOSIT_WITH_RELATIONS_QUERY,\n INTENTS_QUERY,\n EXPIRED_INTENTS_QUERY,\n INTENT_FULFILLMENTS_QUERY,\n PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n} from './queries';\nimport type {\n DepositEntity,\n DepositPaymentMethodEntity,\n MethodCurrencyEntity,\n IntentEntity,\n IntentStatus,\n DepositWithRelations,\n IntentFulfilledEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\n\nexport type DepositOrderField =\n | 'remainingDeposits'\n | 'outstandingIntentAmount'\n | 'totalAmountTaken'\n | 'totalWithdrawn'\n | 'updatedAt'\n | 'timestamp';\nexport type OrderDirection = 'asc' | 'desc';\n\nexport type DepositFilter = Partial<{\n status: 'ACTIVE' | 'CLOSED';\n depositor: string;\n chainId: number;\n escrowAddress: string;\n escrowAddresses: string[];\n minLiquidity: string;\n acceptingIntents: boolean;\n}>;\n\nexport type PaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: DepositOrderField;\n orderDirection: OrderDirection;\n}>;\n\nfunction groupByDepositId<T extends { depositId: string | null | undefined }>(items: T[]): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n if (!item.depositId) continue;\n const key = item.depositId.toLowerCase();\n const bucket = map.get(key);\n if (bucket) bucket.push(item); else map.set(key, [item]);\n }\n return map;\n}\n\nconst DEFAULT_LIMIT = 100;\nconst DEFAULT_ORDER_FIELD: NonNullable<PaginationOptions['orderBy']> = 'remainingDeposits';\n\nexport class IndexerDepositService {\n constructor(private client: IndexerClient) {}\n\n private buildDepositWhere(filter?: DepositFilter): Record<string, unknown> | undefined {\n if (!filter) return undefined;\n const where: Record<string, unknown> = {};\n if (filter.status) where.status = { _eq: filter.status };\n if (filter.depositor) where.depositor = { _ilike: filter.depositor };\n if (filter.chainId) where.chainId = { _eq: filter.chainId };\n if (filter.escrowAddresses && filter.escrowAddresses.length) {\n where.escrowAddress = { _in: filter.escrowAddresses };\n } else if (filter.escrowAddress) {\n where.escrowAddress = { _ilike: filter.escrowAddress };\n }\n if (filter.acceptingIntents !== undefined) where.acceptingIntents = { _eq: filter.acceptingIntents };\n // Filter by remainingDeposits; this is schema-stable across deployments.\n if (filter.minLiquidity) where.remainingDeposits = { _gte: filter.minLiquidity };\n return Object.keys(where).length ? where : undefined;\n }\n\n private buildOrderBy(pagination?: PaginationOptions): Array<Record<string, 'asc' | 'desc'>> {\n const field: NonNullable<PaginationOptions['orderBy']> = pagination?.orderBy ?? DEFAULT_ORDER_FIELD;\n const direction = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as any];\n }\n\n private async fetchRelations(depositIds: string[]) {\n if (!depositIds.length) {\n return {\n paymentMethodsByDeposit: new Map<string, DepositPaymentMethodEntity[]>(),\n currenciesByDeposit: new Map<string, MethodCurrencyEntity[]>(),\n };\n }\n\n const result = await this.client.query<{\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({ query: DEPOSIT_RELATIONS_QUERY, variables: { depositIds } });\n\n const paymentMethodsByDeposit = groupByDepositId(result.DepositPaymentMethod ?? []);\n const currenciesByDeposit = groupByDepositId(result.MethodCurrency ?? []);\n return { paymentMethodsByDeposit, currenciesByDeposit };\n }\n\n private async fetchIntents(params: { depositIds?: string[]; owner?: string; statuses?: IntentStatus[]; limit?: number; offset?: number }): Promise<IntentEntity[]> {\n const where: Record<string, unknown> = {};\n if (params.depositIds?.length) where.depositId = { _in: params.depositIds };\n if (params.owner) where.owner = { _ilike: params.owner };\n if (params.statuses?.length) where.status = { _in: params.statuses };\n if (!Object.keys(where).length) return [];\n\n const result = await this.client.query<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n variables: { where, order_by: [{ signalTimestamp: 'desc' }], limit: params.limit, offset: params.offset },\n });\n return result.Intent ?? [];\n }\n\n private async attachRelations(\n deposits: DepositEntity[],\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n if (!deposits.length) return [];\n const depositIds = deposits.map(d => d.id);\n const [{ paymentMethodsByDeposit, currenciesByDeposit }, intents] = await Promise.all([\n this.fetchRelations(depositIds),\n options.includeIntents ? this.fetchIntents({ depositIds, statuses: options.intentStatuses }) : Promise.resolve([]),\n ]);\n const intentsByDeposit = options.includeIntents ? groupByDepositId(intents) : new Map<string, IntentEntity[]>();\n return deposits.map(d => {\n const key = d.id.toLowerCase();\n return {\n ...d,\n paymentMethods: paymentMethodsByDeposit.get(key) ?? [],\n currencies: currenciesByDeposit.get(key) ?? [],\n intents: options.includeIntents ? intentsByDeposit.get(key) ?? [] : undefined,\n };\n });\n }\n\n async fetchDeposits(filter?: DepositFilter, pagination?: PaginationOptions): Promise<DepositEntity[]> {\n const result = await this.client.query<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_QUERY,\n variables: {\n where: this.buildDepositWhere(filter),\n order_by: this.buildOrderBy(pagination),\n limit: pagination?.limit ?? DEFAULT_LIMIT,\n offset: pagination?.offset ?? 0,\n },\n });\n return result.Deposit ?? [];\n }\n\n async fetchDepositsWithRelations(\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n const deposits = await this.fetchDeposits(filter, pagination);\n return this.attachRelations(deposits, options);\n }\n\n async fetchDepositsByIds(ids: string[]): Promise<DepositEntity[]> {\n if (!ids.length) return [];\n const result = await this.client.query<{ Deposit?: DepositEntity[] }>({ query: DEPOSITS_BY_IDS_QUERY, variables: { ids } });\n return result.Deposit ?? [];\n }\n\n async fetchDepositsByIdsWithRelations(\n ids: string[],\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n const deposits = await this.fetchDepositsByIds(ids);\n return this.attachRelations(deposits, options);\n }\n\n async fetchIntentsForDeposits(depositIds: string[], statuses?: IntentStatus[]): Promise<IntentEntity[]> {\n if (!depositIds.length) return [];\n return this.fetchIntents({ depositIds, statuses });\n }\n\n async fetchIntentsByOwner(owner: string, statuses?: IntentStatus[]): Promise<IntentEntity[]> {\n if (!owner) return [];\n return this.fetchIntents({ owner, statuses });\n }\n\n async fetchDepositWithRelations(id: string, options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations | null> {\n const result = await this.client.query<{\n Deposit_by_pk?: DepositEntity | null;\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({ query: DEPOSIT_WITH_RELATIONS_QUERY, variables: { id } });\n\n const deposit = result.Deposit_by_pk;\n if (!deposit) return null;\n const base: DepositWithRelations = { ...deposit, paymentMethods: result.DepositPaymentMethod ?? [], currencies: result.MethodCurrency ?? [] };\n if (!options.includeIntents) return base;\n const intents = await this.fetchIntents({ depositIds: [deposit.id], statuses: options.intentStatuses });\n return { ...base, intents };\n }\n\n async fetchExpiredIntents(params: { now: bigint | string; depositIds: string[]; limit?: number }): Promise<IntentEntity[]> {\n const depositIds = params.depositIds.map(id => id.toLowerCase());\n if (!depositIds.length) return [];\n\n const result = await this.client.query<{ Intent?: IntentEntity[] }>({\n query: EXPIRED_INTENTS_QUERY,\n variables: {\n now: typeof params.now === 'bigint' ? params.now.toString() : params.now,\n limit: params.limit ?? 1000,\n depositIds,\n },\n });\n\n return result.Intent ?? [];\n }\n\n async fetchFulfilledIntentEvents(intentHashes: string[]): Promise<IntentFulfilledEntity[]> {\n if (!intentHashes.length) return [];\n\n const uniqueHashes = Array.from(new Set(intentHashes)).filter(Boolean);\n if (!uniqueHashes.length) return [];\n\n const result = await this.client.query<{ Orchestrator_V21_IntentFulfilled?: IntentFulfilledEntity[] }>({\n query: INTENT_FULFILLMENTS_QUERY,\n variables: { intentHashes: uniqueHashes },\n });\n\n return result.Orchestrator_V21_IntentFulfilled ?? [];\n }\n\n async resolvePayeeHash(params: { escrowAddress?: string | null; depositId?: string | number | bigint | null; paymentMethodHash?: string | null }): Promise<string | null> {\n try {\n const { escrowAddress, depositId, paymentMethodHash } = params;\n if (!escrowAddress || depositId === null || depositId === undefined || !paymentMethodHash) return null;\n const compositeId = createCompositeDepositId(\n escrowAddress,\n typeof depositId === 'bigint' ? depositId : depositId?.toString() ?? ''\n );\n const detail = await this.fetchDepositWithRelations(compositeId, { includeIntents: false });\n if (!detail?.paymentMethods?.length) return null;\n const target = paymentMethodHash.toLowerCase();\n const match = detail.paymentMethods.find(pm => (pm.paymentMethodHash ?? '').toLowerCase() === target);\n return match?.payeeDetailsHash ?? null;\n } catch {\n return null;\n }\n }\n\n async fetchDepositsByPayeeHash(payeeHash: string, options: { paymentMethodHash?: string; limit?: number; includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations[]> {\n if (!payeeHash) return [];\n const normalizedHash = payeeHash.toLowerCase();\n\n const where: Record<string, unknown> = {\n payeeDetailsHash: { _ilike: normalizedHash },\n };\n if (options.paymentMethodHash) {\n where.paymentMethodHash = { _eq: options.paymentMethodHash.toLowerCase?.() ?? options.paymentMethodHash };\n }\n\n const result = await this.client.query<{ DepositPaymentMethod?: DepositPaymentMethodEntity[] }>({\n query: PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n variables: { where, limit: options.limit },\n });\n\n const seen = new Set<string>();\n const depositIds: string[] = [];\n for (const pm of result.DepositPaymentMethod ?? []) {\n const id = pm.depositId;\n if (!id) continue;\n const key = id.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n depositIds.push(id);\n }\n\n if (!depositIds.length) return [];\n return this.fetchDepositsByIdsWithRelations(depositIds, {\n includeIntents: options.includeIntents,\n intentStatuses: options.intentStatuses,\n });\n }\n}\n","import { IndexerClient } from './client';\nimport { FULFILLMENT_AND_PAYMENT_QUERY } from './queries';\n\nexport type FulfillmentRecord = {\n id: string;\n intentHash: string;\n amount: string;\n isManualRelease: boolean;\n fundsTransferredTo: string | null;\n};\n\nexport type PaymentVerifiedRecord = {\n id: string;\n intentHash: string;\n method: string;\n currency: string;\n amount: string;\n timestamp: string;\n paymentId: string | null;\n payeeId: string | null;\n};\n\nexport type FulfillmentAndPaymentResponse = {\n Orchestrator_V21_IntentFulfilled: FulfillmentRecord[];\n UnifiedVerifier_V21_PaymentVerified: PaymentVerifiedRecord[];\n};\n\nexport async function fetchFulfillmentAndPayment(\n client: IndexerClient,\n intentHash: string\n): Promise<FulfillmentAndPaymentResponse> {\n return client.query<FulfillmentAndPaymentResponse>({\n query: FULFILLMENT_AND_PAYMENT_QUERY,\n variables: { intentHash },\n });\n}\n","import type { Address, Hash, PublicClient, WalletClient } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport { base, baseSepolia, hardhat } from 'viem/chains';\nimport type { Abi } from 'abitype';\n\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport { defaultIndexerEndpoint, IndexerClient } from '../indexer/client';\nimport { IndexerDepositService, type DepositFilter, type PaginationOptions } from '../indexer/service';\nimport type { DepositEntity, DepositWithRelations, IntentEntity, IntentStatus, IntentFulfilledEntity } from '../indexer/types';\nimport { fetchFulfillmentAndPayment, type FulfillmentAndPaymentResponse } from '../indexer/intentVerification';\nimport { getContracts, type RuntimeEnv } from '../contracts';\nimport { apiSignIntentV2 } from '../adapters/verification';\nimport { apiCreatePaymentAttestation } from '../adapters/attestation';\nimport { encodeAddressAsBytes, encodePaymentAttestation, encodeVerifyPaymentData } from '../utils/encode';\nimport { apiGetQuote, apiGetTakerTier, apiPostDepositDetails } from '../adapters/api';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolveFiatCurrencyBytes32, resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { currencyKeccak256 } from '../utils/keccak';\nimport type { QuoteRequest, QuoteResponse, PostDepositDetailsRequest, GetTakerTierRequest, GetTakerTierResponse } from '../types';\nimport { ERC20_ABI } from '../utils/erc20';\nimport { sendTransactionWithAttribution } from '../utils/attribution';\nimport type { TxOverrides } from '../types';\n\n/**\n * Configuration options for creating a Zkp2pClient instance.\n *\n * @example\n * ```typescript\n * const options: Zkp2pNextOptions = {\n * walletClient,\n * chainId: 8453, // Base mainnet\n * runtimeEnv: 'production',\n * apiKey: 'your-api-key',\n * };\n * ```\n */\nexport type Zkp2pNextOptions = {\n /** viem WalletClient instance with an account for signing transactions */\n walletClient: WalletClient;\n /** Chain ID (8453 for Base mainnet, 84532 for Base Sepolia) */\n chainId: number;\n /** Optional RPC URL override (defaults to wallet's chain RPC, then https://mainnet.base.org for Base or https://sepolia.base.org for Base Sepolia) */\n rpcUrl?: string;\n /** Runtime environment: 'production' or 'staging' (defaults to 'production') */\n runtimeEnv?: RuntimeEnv;\n /** Optional indexer URL override */\n indexerUrl?: string;\n /** Base API URL for ZKP2P services (defaults to https://api.zkp2p.xyz) */\n baseApiUrl?: string;\n /** API key for authenticated endpoints (required for createDeposit, signalIntent) */\n apiKey?: string;\n /** Optional bearer token for hybrid authentication */\n authorizationToken?: string;\n /** Timeout configuration */\n timeouts?: {\n /** API call timeout in milliseconds (default: 15000) */\n api?: number;\n };\n};\n\n/**\n * SDK client for ZKP2P liquidity providers (offramp peers).\n *\n * This SDK is designed for **liquidity providers** who want to:\n * - Create and manage USDC deposits that accept fiat payments\n * - Configure payment methods, currencies, and conversion rates\n * - Monitor deposit utilization and manage liquidity\n *\n * ## Core Functionality (Deposit Management)\n *\n * The primary use case is managing deposits as a liquidity provider:\n *\n * | Method | Description |\n * |--------|-------------|\n * | `createDeposit()` | Create a new USDC deposit |\n * | `addFunds()` / `removeFunds()` | Adjust deposit balance |\n * | `withdrawDeposit()` | Fully withdraw a deposit |\n * | `setAcceptingIntents()` | Enable/disable new intents |\n * | `setIntentRange()` | Set min/max intent amounts |\n * | `setCurrencyMinRate()` | Update conversion rates |\n * | `addPaymentMethods()` | Add payment platforms |\n * | `getDeposits()` | Query your deposits |\n *\n * ## Supporting Functionality\n *\n * These methods support the broader ZKP2P ecosystem but are not the\n * primary focus of this SDK:\n *\n * - **Intent Operations**: `signalIntent()`, `fulfillIntent()`, `cancelIntent()`\n * (typically used by takers/buyers, not liquidity providers)\n * - **Quote API**: `getQuote()` (used by frontends to find available liquidity)\n *\n * @example Creating a Deposit (Primary Use Case)\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { base } from 'viem/chains';\n * import { privateKeyToAccount } from 'viem/accounts';\n * import { Zkp2pClient } from '@zkp2p/client-sdk';\n *\n * const walletClient = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: base,\n * transport: http(),\n * });\n *\n * const client = new OfframpClient({\n * walletClient,\n * chainId: base.id,\n * apiKey: 'your-api-key',\n * });\n *\n * // Create a 1000 USDC deposit accepting Wise payments\n * const { hash } = await client.createDeposit({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', // USDC\n * amount: 1000_000000n,\n * intentAmountRange: { min: 10_000000n, max: 500_000000n },\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * conversionRates: [[\n * { currency: 'USD', conversionRate: '1020000000000000000' },\n * { currency: 'EUR', conversionRate: '1100000000000000000' },\n * ]],\n * });\n *\n * // Monitor your deposits\n * const deposits = await client.getDeposits({ owner: walletClient.account.address });\n * ```\n */\nexport class Zkp2pClient {\n /** The viem WalletClient used for signing transactions */\n readonly walletClient: WalletClient;\n /** The viem PublicClient used for reading contract state */\n readonly publicClient: PublicClient;\n /** The chain ID this client is configured for */\n readonly chainId: number;\n /** Runtime environment ('production' or 'staging') */\n readonly runtimeEnv: RuntimeEnv;\n\n /** Escrow contract address */\n readonly escrowAddress: Address;\n /** Escrow contract ABI */\n readonly escrowAbi: Abi;\n /** Orchestrator contract address (handles intent signaling/fulfillment) */\n readonly orchestratorAddress?: Address;\n /** Orchestrator contract ABI */\n readonly orchestratorAbi?: Abi;\n /** UnifiedPaymentVerifier contract address */\n readonly unifiedPaymentVerifier?: Address;\n /** ProtocolViewer contract address (for batch reads) */\n readonly protocolViewerAddress?: Address;\n /** ProtocolViewer contract ABI */\n readonly protocolViewerAbi?: Abi;\n\n /** Base API URL for ZKP2P services */\n readonly baseApiUrl?: string;\n /** API key for authenticated endpoints */\n readonly apiKey?: string;\n /** Bearer token for hybrid authentication */\n readonly authorizationToken?: string;\n /** API timeout in milliseconds */\n readonly apiTimeoutMs: number;\n private _usdcAddress?: Address;\n\n // Indexer for advanced/historical queries\n private readonly _indexerClient: IndexerClient;\n private readonly _indexerService: IndexerDepositService;\n\n /**\n * Creates a new Zkp2pClient instance.\n *\n * @param opts - Configuration options\n * @throws Error if walletClient is missing an account\n */\n constructor(opts: Zkp2pNextOptions) {\n this.walletClient = opts.walletClient;\n this.chainId = opts.chainId;\n this.runtimeEnv = opts.runtimeEnv ?? 'production';\n const inferredRpc = (this.walletClient as any)?.chain?.rpcUrls?.default?.http?.[0] as string | undefined;\n // Chain-specific default RPC URLs\n const defaultRpcUrls: Record<number, string> = {\n [base.id]: 'https://mainnet.base.org',\n [baseSepolia.id]: 'https://sepolia.base.org',\n [hardhat.id]: 'http://127.0.0.1:8545',\n };\n const rpc = opts.rpcUrl ?? inferredRpc ?? defaultRpcUrls[opts.chainId] ?? 'https://mainnet.base.org';\n const chainMap: Record<number, any> = { [base.id]: base, [baseSepolia.id]: baseSepolia, [hardhat.id]: hardhat };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({ chain: selectedChain as any, transport: http(rpc, { batch: false }) }) as unknown as PublicClient;\n\n // contracts-v3 resolution (via contracts-v2 package)\n const { addresses, abis } = getContracts(this.chainId, this.runtimeEnv);\n this.escrowAddress = addresses.escrow as Address;\n this.escrowAbi = abis.escrow;\n this.orchestratorAddress = addresses.orchestrator as Address | undefined;\n this.orchestratorAbi = abis.orchestrator;\n this.unifiedPaymentVerifier = addresses.unifiedPaymentVerifier as Address | undefined;\n this.protocolViewerAddress = (addresses as any).protocolViewer as Address | undefined;\n this.protocolViewerAbi = (abis as any).protocolViewer as Abi | undefined;\n // optional USDC convenience\n const maybeUsdc = (addresses as any).usdc as Address | undefined;\n if (maybeUsdc) (this as any)._usdcAddress = maybeUsdc;\n\n // Indexer for advanced/historical queries\n const indexerEndpoint = opts.indexerUrl ?? defaultIndexerEndpoint(this.runtimeEnv === 'staging' ? 'STAGING' : 'PRODUCTION');\n this._indexerClient = new IndexerClient(indexerEndpoint);\n this._indexerService = new IndexerDepositService(this._indexerClient);\n\n // http verification config\n this.baseApiUrl = opts.baseApiUrl;\n this.apiKey = opts.apiKey;\n this.authorizationToken = opts.authorizationToken;\n this.apiTimeoutMs = opts.timeouts?.api ?? 15000;\n }\n\n private isValidHexAddress(addr?: string | null): boolean {\n if (typeof addr !== 'string') return false;\n return /^0x[0-9a-fA-F]{40}$/.test(addr);\n }\n\n /**\n * Simulate a contract call (validation only) and send with ERC-8021 attribution.\n * Referrer codes are stripped from overrides for simulation and appended to calldata.\n */\n private async simulateAndSendWithAttribution(opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): Promise<Hash> {\n const { referrer, ...txOverrides } = opts.txOverrides ?? {};\n\n await this.publicClient.simulateContract({\n address: opts.address,\n abi: opts.abi,\n functionName: opts.functionName as any,\n args: (opts.args ?? []) as any,\n account: this.walletClient.account!,\n ...(txOverrides as any),\n });\n\n return sendTransactionWithAttribution(\n this.walletClient,\n {\n address: opts.address as `0x${string}`,\n abi: opts.abi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n value: opts.value ?? (txOverrides as any).value,\n },\n referrer,\n txOverrides\n );\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT QUERIES (RPC-first via ProtocolViewer) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Fetches all deposits owned by the connected wallet from on-chain.\n *\n * This is the primary method for liquidity providers to query their deposits.\n * Uses ProtocolViewer for instant on-chain reads (no indexer lag).\n *\n * @returns Array of deposit views with payment methods and currencies\n *\n * @example\n * ```typescript\n * const deposits = await client.getDeposits();\n * for (const d of deposits) {\n * console.log(`Deposit ${d.depositId}: ${d.availableLiquidity} available`);\n * }\n * ```\n */\n async getDeposits(): Promise<PV_DepositView[]> {\n const owner = this.walletClient.account?.address;\n if (!owner) throw new Error('Wallet client is missing account');\n return this.getAccountDeposits(owner);\n }\n\n /**\n * Fetches all deposits owned by a specific address from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @param owner - The owner's Ethereum address\n * @returns Array of deposit views with payment methods and currencies\n *\n * @example\n * ```typescript\n * const deposits = await client.getAccountDeposits('0x...');\n * ```\n */\n async getAccountDeposits(owner: Address): Promise<PV_DepositView[]> {\n return this.getPvAccountDeposits(owner);\n }\n\n /**\n * Fetches a single deposit by its numeric ID from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @param depositId - The deposit ID (numeric)\n * @returns Deposit view with payment methods, currencies, and intent hashes\n *\n * @example\n * ```typescript\n * const deposit = await client.getDeposit(42n);\n * console.log(`Available: ${deposit.availableLiquidity}`);\n * console.log(`Payment methods: ${deposit.paymentMethods.length}`);\n * ```\n */\n async getDeposit(depositId: bigint | number | string): Promise<PV_DepositView> {\n const id = typeof depositId === 'bigint' ? depositId : BigInt(depositId);\n return this.getPvDepositById(id);\n }\n\n /**\n * Fetches multiple deposits by their IDs from on-chain in a batch.\n *\n * @param depositIds - Array of deposit IDs\n * @returns Array of deposit views\n */\n async getDepositsById(depositIds: Array<bigint | number | string>): Promise<PV_DepositView[]> {\n const ids = depositIds.map(id => typeof id === 'bigint' ? id : BigInt(id));\n return this.getPvDepositsFromIds(ids);\n }\n\n /**\n * Fetches all intents created by the connected wallet from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @returns Array of intent views with deposit context\n *\n * @example\n * ```typescript\n * const intents = await client.getIntents();\n * for (const i of intents) {\n * console.log(`Intent ${i.intentHash}: ${i.intent.amount} tokens`);\n * }\n * ```\n */\n async getIntents(): Promise<PV_IntentView[]> {\n const owner = this.walletClient.account?.address;\n if (!owner) throw new Error('Wallet client is missing account');\n return this.getAccountIntents(owner);\n }\n\n /**\n * Fetches all intents created by a specific address from on-chain.\n *\n * @param owner - The owner's Ethereum address\n * @returns Array of intent views with deposit context\n */\n async getAccountIntents(owner: Address): Promise<PV_IntentView[]> {\n return this.getPvAccountIntents(owner);\n }\n\n /**\n * Fetches a single intent by its hash from on-chain.\n *\n * @param intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @returns Intent view with deposit context\n */\n async getIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n return this.getPvIntent(intentHash);\n }\n\n /**\n * Resolves the payee details hash for a deposit's payment method from on-chain.\n *\n * @param depositId - The deposit ID\n * @param paymentMethodHash - The payment method hash\n * @returns The payee details hash, or null if not found\n */\n async resolvePayeeHash(depositId: bigint | number | string, paymentMethodHash: string): Promise<string | null> {\n const deposit = await this.getDeposit(depositId);\n const pmLower = paymentMethodHash.toLowerCase();\n for (const pm of deposit.paymentMethods) {\n if (pm.paymentMethod.toLowerCase() === pmLower) {\n return pm.verificationData.payeeDetails;\n }\n }\n return null;\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ ADVANCED: INDEXER QUERIES (for historical/filtered data) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Access to the indexer for advanced queries.\n *\n * Use this for:\n * - Historical data (totalAmountTaken, totalWithdrawn)\n * - Filtered queries across all deposits (not just by owner)\n * - Pagination with ordering\n * - Fulfillment/verification records\n *\n * @example\n * ```typescript\n * // Query deposits with filters and pagination\n * const deposits = await client.indexer.getDeposits(\n * { status: 'ACTIVE', minLiquidity: '1000000' },\n * { limit: 50, orderBy: 'remainingDeposits', orderDirection: 'desc' }\n * );\n *\n * // Get historical fulfillment data\n * const fulfillments = await client.indexer.getFulfilledIntentEvents(['0x...']);\n * ```\n */\n get indexer() {\n const service = this._indexerService;\n const client = this._indexerClient;\n return {\n /** Raw GraphQL client for custom queries */\n client,\n\n /**\n * Fetches deposits from the indexer with optional filtering and pagination.\n * Use for advanced queries across all deposits, not just by owner.\n */\n getDeposits: (filter?: DepositFilter, pagination?: PaginationOptions): Promise<DepositEntity[]> => {\n return service.fetchDeposits(filter, pagination);\n },\n\n /**\n * Fetches deposits with their related payment methods and optionally intents.\n */\n getDepositsWithRelations: (filter?: DepositFilter, pagination?: PaginationOptions, options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] }): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsWithRelations(filter, pagination, options);\n },\n\n /**\n * Fetches a single deposit by its composite ID with all related data.\n * @param id - Composite ID format: \"chainId_escrowAddress_depositId\"\n */\n getDepositById: (id: string, options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] }): Promise<DepositWithRelations | null> => {\n return service.fetchDepositWithRelations(id, options);\n },\n\n /**\n * Fetches intents for multiple deposits.\n */\n getIntentsForDeposits: (depositIds: string[], statuses: IntentStatus[] = ['SIGNALED']): Promise<IntentEntity[]> => {\n return service.fetchIntentsForDeposits(depositIds, statuses);\n },\n\n /**\n * Fetches all intents created by a specific owner address.\n */\n getOwnerIntents: (owner: string, statuses?: IntentStatus[]): Promise<IntentEntity[]> => {\n return service.fetchIntentsByOwner(owner, statuses);\n },\n\n /**\n * Fetches intents that have expired.\n */\n getExpiredIntents: (params: { now: bigint | string; depositIds: string[]; limit?: number }): Promise<IntentEntity[]> => {\n return service.fetchExpiredIntents(params);\n },\n\n /**\n * Fetches fulfillment events for completed intents.\n */\n getFulfilledIntentEvents: (intentHashes: string[]): Promise<IntentFulfilledEntity[]> => {\n return service.fetchFulfilledIntentEvents(intentHashes);\n },\n\n /**\n * Fetches both the fulfillment record and payment verification for an intent.\n */\n getFulfillmentAndPayment: (intentHash: string): Promise<FulfillmentAndPaymentResponse> => {\n return fetchFulfillmentAndPayment(client, intentHash);\n },\n\n /**\n * Fetches deposits that match a specific payee details hash.\n */\n getDepositsByPayeeHash: (payeeHash: string, options: { paymentMethodHash?: string; limit?: number; includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByPayeeHash(payeeHash, options);\n },\n };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT CREATION ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Ensures ERC20 token allowance is sufficient for the Escrow contract.\n *\n * If the current allowance is less than the requested amount, this method\n * will submit an approval transaction. Use `maxApprove: true` for unlimited\n * approval to avoid repeated approval transactions.\n *\n * @param params.token - ERC20 token address to approve\n * @param params.amount - Minimum required allowance amount\n * @param params.spender - Spender address (defaults to Escrow contract)\n * @param params.maxApprove - If true, approves MaxUint256 instead of exact amount\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Object with `hadAllowance` (true if no approval needed) and optional `hash`\n *\n * @example\n * ```typescript\n * // Ensure allowance for 1000 USDC\n * const { hadAllowance, hash } = await client.ensureAllowance({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: 1000_000000n,\n * maxApprove: true,\n * });\n *\n * if (!hadAllowance) {\n * console.log('Approval tx:', hash);\n * }\n * ```\n */\n async ensureAllowance(params: { token: Address; amount: bigint; spender?: Address; maxApprove?: boolean; txOverrides?: TxOverrides }): Promise<{ hadAllowance: boolean; hash?: Hash }> {\n const owner = this.walletClient.account?.address as Address | undefined;\n if (!owner) throw new Error('Wallet client is missing account');\n const spender = params.spender ?? this.escrowAddress;\n const allowance = (await this.publicClient.readContract({ address: params.token, abi: ERC20_ABI as any, functionName: 'allowance', args: [owner, spender] })) as bigint;\n if (allowance >= params.amount) return { hadAllowance: true };\n const MAX = (1n << 256n) - 1n;\n const value = params.maxApprove ? MAX : params.amount;\n const hash = await this.simulateAndSendWithAttribution({\n address: params.token,\n abi: ERC20_ABI as any,\n functionName: 'approve',\n args: [spender, value],\n txOverrides: params.txOverrides,\n });\n return { hadAllowance: false, hash };\n }\n\n /**\n * Creates a new USDC deposit in the Escrow contract.\n *\n * This is the primary method for liquidity providers to add funds to the protocol.\n * The deposit can accept intents from multiple payment platforms with different\n * conversion rates per currency.\n *\n * **Important**: Requires `apiKey` or `authorizationToken` to be set.\n * Call `ensureAllowance()` first to approve USDC spending.\n *\n * @param params.token - Token address (USDC)\n * @param params.amount - Total deposit amount in token units (6 decimals for USDC)\n * @param params.intentAmountRange - Min/max amount per intent\n * @param params.processorNames - Payment platforms to accept (e.g., ['wise', 'revolut'])\n * @param params.depositData - Payee details per processor (e.g., [{ email: '...' }])\n * @param params.conversionRates - Conversion rates per processor, grouped by currency\n * @param params.delegate - Optional delegate address that can manage the deposit\n * @param params.intentGuardian - Optional guardian for intent approval\n * @param params.retainOnEmpty - Keep deposit active when balance reaches zero\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns The deposit details posted to API and the transaction hash\n *\n * @throws Error if apiKey/authorizationToken is missing\n * @throws Error if processorNames, depositData, and conversionRates lengths don't match\n * @throws Error if a currency is not supported by the specified processor\n *\n * @example\n * ```typescript\n * // Create a 1000 USDC deposit accepting Wise payments in USD and EUR\n * const { hash } = await client.createDeposit({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: 1000_000000n,\n * intentAmountRange: { min: 10_000000n, max: 500_000000n },\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * conversionRates: [[\n * { currency: 'USD', conversionRate: '1020000000000000000' }, // 1.02\n * { currency: 'EUR', conversionRate: '1100000000000000000' }, // 1.10\n * ]],\n * });\n * ```\n */\n async createDeposit(params: {\n token: Address;\n amount: bigint;\n intentAmountRange: { min: bigint; max: bigint };\n processorNames: string[];\n depositData: { [key: string]: string }[];\n conversionRates: { currency: string; conversionRate: string }[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; hash: Hash }> {\n const methods = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n if (!Array.isArray(params.processorNames) || params.processorNames.length === 0) {\n throw new Error('processorNames must be a non-empty array');\n }\n if (params.processorNames.length !== params.conversionRates.length) {\n throw new Error('processorNames and conversionRates length mismatch');\n }\n if (params.processorNames.length !== params.depositData.length) {\n throw new Error('processorNames and depositData length mismatch');\n }\n\n const paymentMethods = params.processorNames.map((name) => resolvePaymentMethodHashFromCatalog(name, methods));\n const intentGatingService = getGatingServiceAddress(this.chainId, this.runtimeEnv);\n // Post deposit details to API to produce hashed on-chain ids\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n if (!this.apiKey && !this.authorizationToken) {\n throw new Error('createDeposit requires apiKey or authorizationToken to post deposit details');\n }\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map((processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }));\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs))\n );\n if (!apiResponses.every((r) => (r as any)?.success)) {\n const failed = apiResponses.find((r) => !(r as any)?.success) as any;\n throw new Error(failed?.message || 'Failed to create deposit details');\n }\n const hashedOnchainIds = apiResponses.map((r: any) => r.responseObject?.hashedOnchainId as string);\n const paymentMethodData = hashedOnchainIds.map((hid) => ({ intentGatingService, payeeDetails: hid, data: '0x' as `0x${string}` }));\n\n // Validate currency support per processor when catalog lists allowed currencies\n // Note: catalog stores keccak256 hashes of currency codes, not ASCII-bytes32\n params.conversionRates.forEach((group, i) => {\n const key = params.processorNames[i]?.toLowerCase();\n const allowed = methods[key!]?.currencies?.map((c) => c.toLowerCase());\n if (allowed && allowed.length) {\n for (const { currency } of group) {\n const codeHash = currencyKeccak256(String(currency).toUpperCase()).toLowerCase();\n if (!allowed.includes(codeHash)) {\n throw new Error(`Currency ${currency} not supported by ${params.processorNames[i]}. Allowed: ${allowed.join(', ')}`);\n }\n }\n }\n });\n\n // Map UI currency groups to on-chain tuple[][] with minConversionRate\n const { mapConversionRatesToOnchainMinRate } = await import('../utils/currency');\n const normalized = params.conversionRates.map((group) => group.map((r) => ({ currency: r.currency as any, conversionRate: r.conversionRate })));\n const currencies = mapConversionRatesToOnchainMinRate(normalized as any, paymentMethods.length);\n\n const args = [{\n token: params.token,\n amount: params.amount,\n intentAmountRange: params.intentAmountRange,\n paymentMethods,\n paymentMethodData,\n currencies,\n delegate: (params.delegate ?? '0x0000000000000000000000000000000000000000') as Address,\n intentGuardian: (params.intentGuardian ?? '0x0000000000000000000000000000000000000000') as Address,\n retainOnEmpty: Boolean(params.retainOnEmpty ?? false),\n }];\n\n const hash = await this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'createDeposit',\n args,\n txOverrides: params.txOverrides,\n });\n return { depositDetails, hash };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT MANAGEMENT ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Enables or disables a deposit from accepting new intents.\n *\n * @param params.depositId - The deposit ID\n * @param params.accepting - Whether to accept new intents\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setAcceptingIntents(params: { depositId: bigint; accepting: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setAcceptingIntents',\n args: [params.depositId, params.accepting],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Updates the min/max intent amount range for a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.min - Minimum intent amount\n * @param params.max - Maximum intent amount\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setIntentRange(params: { depositId: bigint; min: bigint; max: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setIntentRange',\n args: [params.depositId, { min: params.min, max: params.max }],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Updates the minimum conversion rate for a specific currency on a payment method.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash (bytes32)\n * @param params.fiatCurrency - Fiat currency hash (bytes32)\n * @param params.minConversionRate - New minimum conversion rate (18 decimals)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setCurrencyMinRate(params: { depositId: bigint; paymentMethod: `0x${string}`; fiatCurrency: `0x${string}`; minConversionRate: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setCurrencyMinRate',\n args: [params.depositId, params.paymentMethod, params.fiatCurrency, params.minConversionRate],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Adds additional funds to an existing deposit.\n * Requires prior approval of the token amount.\n *\n * @param params.depositId - The deposit ID to add funds to\n * @param params.amount - Amount to add (in token units)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addFunds(params: { depositId: bigint; amount: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addFunds',\n args: [params.depositId, params.amount],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes funds from a deposit (partial withdrawal).\n * Can only withdraw available (non-locked) funds.\n *\n * @param params.depositId - The deposit ID\n * @param params.amount - Amount to remove (in token units)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeFunds(params: { depositId: bigint; amount: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'removeFunds',\n args: [params.depositId, params.amount],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Fully withdraws a deposit, returning all available funds to the owner.\n * The deposit must have no active intents.\n *\n * @param params.depositId - The deposit ID to withdraw\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async withdrawDeposit(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'withdrawDeposit',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ADVANCED DEPOSIT CONFIGURATION ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Sets whether a deposit should remain active when its balance reaches zero.\n *\n * @param params.depositId - The deposit ID\n * @param params.retain - If true, deposit stays active when empty\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setRetainOnEmpty(params: { depositId: bigint; retain: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setRetainOnEmpty',\n args: [params.depositId, params.retain],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Assigns a delegate address that can manage the deposit on behalf of the owner.\n *\n * @param params.depositId - The deposit ID\n * @param params.delegate - Address to delegate management to\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setDelegate(params: { depositId: bigint; delegate: Address; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setDelegate',\n args: [params.depositId, params.delegate],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes the delegate from a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeDelegate(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'removeDelegate',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Adds new payment methods to an existing deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethods - Array of payment method hashes to add\n * @param params.paymentMethodData - Corresponding payment method configuration\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addPaymentMethods(params: { depositId: bigint; paymentMethods: `0x${string}`[]; paymentMethodData: { intentGatingService: Address; payeeDetails: string; data: `0x${string}` }[]; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addPaymentMethods',\n args: [params.depositId, params.paymentMethods, params.paymentMethodData],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Activates or deactivates a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to modify\n * @param params.isActive - Whether the payment method should accept intents\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setPaymentMethodActive(params: { depositId: bigint; paymentMethod: `0x${string}`; isActive: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setPaymentMethodActive',\n args: [params.depositId, params.paymentMethod, params.isActive],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Deactivates a payment method on a deposit (convenience alias for setPaymentMethodActive).\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to deactivate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removePaymentMethod(params: { depositId: bigint; paymentMethod: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.setPaymentMethodActive({ depositId: params.depositId, paymentMethod: params.paymentMethod, isActive: false, txOverrides: params.txOverrides });\n }\n\n /**\n * Adds new currencies to a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to add currencies to\n * @param params.currencies - Array of currency configurations with code and min rate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addCurrencies(params: { depositId: bigint; paymentMethod: `0x${string}`; currencies: { code: `0x${string}`; minConversionRate: bigint }[]; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addCurrencies',\n args: [params.depositId, params.paymentMethod, params.currencies],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Deactivates a currency for a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash\n * @param params.currencyCode - Currency code hash to deactivate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async deactivateCurrency(params: { depositId: bigint; paymentMethod: `0x${string}`; currencyCode: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'deactivateCurrency',\n args: [params.depositId, params.paymentMethod, params.currencyCode],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes (deactivates) a currency from a payment method.\n * Alias for deactivateCurrency.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash\n * @param params.currencyCode - Currency code hash to remove\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeCurrency(params: { depositId: bigint; paymentMethod: `0x${string}`; currencyCode: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.deactivateCurrency(params);\n }\n\n /**\n * Removes expired intents from a deposit, freeing up locked funds.\n * Can be called by anyone (permissionless cleanup).\n *\n * @param params.depositId - The deposit ID to prune\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async pruneExpiredIntents(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'pruneExpiredIntents',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: INTENT OPERATIONS\n // (Used by takers/buyers - not primary SDK functionality)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Signals intent to use a deposit.\n *\n * > **Note**: This method is typically used by takers/buyers who want to\n * > purchase crypto by paying fiat. Liquidity providers generally don't\n * > need to call this method directly.\n *\n * This reserves funds from a deposit and creates an intent that must be\n * fulfilled (via `fulfillIntent`) or will expire. The taker commits to\n * sending fiat payment to the deposit's payee.\n *\n * If `gatingServiceSignature` is not provided, the SDK will automatically\n * fetch one from the API (requires `apiKey` or `authorizationToken`).\n *\n * @param params.depositId - The deposit to use\n * @param params.amount - Amount of tokens to claim (in token units)\n * @param params.toAddress - Address to receive the tokens when fulfilled\n * @param params.processorName - Payment platform (e.g., 'wise', 'revolut')\n * @param params.payeeDetails - Hashed payee details (from deposit)\n * @param params.fiatCurrencyCode - Fiat currency code (e.g., 'USD', 'EUR')\n * @param params.conversionRate - Agreed conversion rate (18 decimals)\n * @param params.referrer - Optional referrer address for fee sharing\n * @param params.referrerFee - Optional referrer fee amount\n * @param params.postIntentHook - Optional hook contract to call after signaling\n * @param params.data - Optional data to pass to the hook\n * @param params.gatingServiceSignature - Pre-obtained signature (if not auto-fetching)\n * @param params.signatureExpiration - Signature expiration timestamp\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const hash = await client.signalIntent({\n * depositId: 42n,\n * amount: 100_000000n, // 100 USDC\n * toAddress: '0x...',\n * processorName: 'wise',\n * payeeDetails: '0x...',\n * fiatCurrencyCode: 'USD',\n * conversionRate: 1_020000000000000000n, // 1.02\n * });\n * ```\n */\n async signalIntent(params: {\n depositId: bigint | string;\n amount: bigint | string;\n toAddress: Address;\n processorName: string;\n payeeDetails: string;\n fiatCurrencyCode: string;\n conversionRate: bigint | string;\n referrer?: Address;\n referrerFee?: bigint | string;\n postIntentHook?: Address;\n data?: `0x${string}`;\n gatingServiceSignature?: `0x${string}`;\n signatureExpiration?: bigint | string;\n txOverrides?: TxOverrides;\n }): Promise<Hash> {\n // Resolve missing addresses opportunistically before sending\n // await this.ensureContractsForSignal(params.depositId);\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n const catalog = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n const paymentMethod = resolvePaymentMethodHashFromCatalog(params.processorName, catalog);\n const fiatCurrency = resolveFiatCurrencyBytes32(params.fiatCurrencyCode);\n const depositId = typeof params.depositId === 'bigint' ? params.depositId : BigInt(params.depositId);\n const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);\n const conversionRate = typeof params.conversionRate === 'bigint' ? params.conversionRate : BigInt(params.conversionRate);\n const referrerFee = params.referrerFee === undefined ? 0n : (typeof params.referrerFee === 'bigint' ? params.referrerFee : BigInt(params.referrerFee));\n\n let { gatingServiceSignature, signatureExpiration } = params;\n if ((!gatingServiceSignature || !signatureExpiration) && this.baseApiUrl && (this.apiKey || this.authorizationToken)) {\n const resp = await apiSignIntentV2(\n {\n processorName: params.processorName,\n payeeDetails: params.payeeDetails,\n depositId: depositId.toString(),\n amount: amount.toString(),\n toAddress: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate: conversionRate.toString(),\n chainId: this.chainId.toString(),\n orchestratorAddress: this.orchestratorAddress!,\n escrowAddress: this.escrowAddress,\n },\n { baseApiUrl: this.baseApiUrl, apiKey: this.apiKey, authorizationToken: this.authorizationToken, timeoutMs: this.apiTimeoutMs }\n );\n gatingServiceSignature = resp.signature;\n signatureExpiration = resp.signatureExpiration;\n }\n\n if (!gatingServiceSignature || !signatureExpiration) throw new Error('Missing gatingServiceSignature/signatureExpiration');\n\n const args = [{\n escrow: this.escrowAddress,\n depositId,\n amount,\n to: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate,\n referrer: (params.referrer ?? ('0x0000000000000000000000000000000000000000' as Address)) as Address,\n referrerFee,\n gatingServiceSignature,\n signatureExpiration: typeof signatureExpiration === 'bigint' ? signatureExpiration : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ('0x0000000000000000000000000000000000000000' as Address)) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n }];\n\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'signalIntent',\n args,\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Cancels a signaled intent before fulfillment.\n *\n * Only the intent owner can cancel. Releases reserved funds back to the deposit.\n *\n * @param params.intentHash - The intent hash to cancel (0x-prefixed, 32 bytes)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async cancelIntent(params: { intentHash: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'cancelIntent',\n args: [params.intentHash],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Releases funds back to the deposit owner.\n *\n * Called by the deposit owner when they want to reject an intent\n * (e.g., payment verification failed or intent expired).\n *\n * @param params.intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async releaseFundsToPayer(params: { intentHash: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'releaseFundsToPayer',\n args: [params.intentHash],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Fulfills an intent by submitting a payment proof.\n *\n * > **Note**: This method is typically used by takers/buyers after they've\n * > sent fiat payment. Liquidity providers generally don't call this directly.\n *\n * This is the final step in the off-ramp flow. After the taker has sent\n * fiat payment, they generate a proof (via the browser extension) and\n * submit it here. The SDK handles attestation service calls automatically.\n *\n * **Flow:**\n * 1. Intent parameters are derived from the indexer/ProtocolViewer\n * 2. Proof is sent to the attestation service for verification\n * 3. Attestation response is encoded and submitted on-chain\n * 4. Funds are released to the intent's `toAddress`\n *\n * @param params.intentHash - The intent hash to fulfill (0x-prefixed, 32 bytes)\n * @param params.proof - Payment proof from Reclaim (object or JSON string)\n * @param params.timestampBufferMs - Allowed timestamp variance (default: 300000ms)\n * @param params.attestationServiceUrl - Override attestation service URL\n * @param params.verifyingContract - Override verifier contract address\n * @param params.postIntentHookData - Data to pass to post-intent hook\n * @param params.txOverrides - Optional viem transaction overrides\n * @param params.callbacks - Lifecycle callbacks for UI updates\n * @returns Transaction hash\n */\n async fulfillIntent(params: {\n intentHash: `0x${string}`;\n proof: Record<string, unknown> | string;\n timestampBufferMs?: string;\n attestationServiceUrl?: string;\n verifyingContract?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n callbacks?: { onAttestationStart?: () => void; onTxSent?: (hash: Hash) => void; onTxMined?: (hash: Hash) => void };\n }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n\n const intentHash: `0x${string}` = params.intentHash;\n const attUrl: string = (params.attestationServiceUrl ?? this.defaultAttestationService());\n const verifyingContract = (params.verifyingContract ?? this.unifiedPaymentVerifier) as Address | undefined;\n // Derive intent inputs via indexer/ProtocolViewer (source of truth)\n const inputs = await this.getFulfillIntentInputs(intentHash);\n const amount = inputs.amount;\n const fiatCurrency = inputs.fiatCurrency;\n const conversionRate = inputs.conversionRate;\n const payeeDetails = inputs.payeeDetails;\n const timestampMs = inputs.intentTimestampMs;\n const paymentMethodHash = inputs.paymentMethodHash || '0x';\n const timestampBufferMs = params.timestampBufferMs ?? '300000'; // note: service should default; keep explicit for now\n\n // Map paymentMethodHash -> platform/actionType for Attestation Service endpoint\n const catalog = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n const { resolvePaymentMethodNameFromHash } = await import('../utils/paymentResolution');\n const platformName = resolvePaymentMethodNameFromHash(paymentMethodHash, catalog);\n if (!platformName) throw new Error('Unknown paymentMethodHash for this network/env; update SDK catalogs.');\n const { resolvePlatformAttestationConfig } = await import('../constants');\n const cfg = resolvePlatformAttestationConfig(platformName);\n const platform = cfg.actionPlatform;\n const actionType = cfg.actionType;\n\n const zkTlsProof = typeof params.proof === 'string' ? params.proof : JSON.stringify(params.proof);\n const payload = {\n proofType: 'reclaim',\n proof: zkTlsProof,\n chainId: this.chainId,\n verifyingContract,\n intent: {\n intentHash,\n amount,\n timestampMs,\n paymentMethod: paymentMethodHash,\n fiatCurrency,\n conversionRate,\n payeeDetails,\n timestampBufferMs,\n },\n } as Record<string, unknown>;\n\n params?.callbacks?.onAttestationStart?.();\n const att = await apiCreatePaymentAttestation(payload, attUrl, platform, actionType);\n const paymentProof = encodePaymentAttestation(att);\n const verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(att.responseObject.signer),\n });\n\n const args = [{\n paymentProof,\n intentHash,\n verificationData,\n postIntentHookData: (params.postIntentHookData ?? '0x') as `0x${string}`,\n }];\n const txHash = await this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'fulfillIntent',\n args,\n txOverrides: params.txOverrides,\n });\n params?.callbacks?.onTxSent?.(txHash);\n // We do not wait for receipt here; caller can wait or use callback if we later add it\n return txHash;\n }\n\n private defaultAttestationService(): string {\n return this.runtimeEnv === 'staging'\n ? 'https://attestation-service-staging.zkp2p.xyz'\n : 'https://attestation-service.zkp2p.xyz';\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: QUOTES API\n // (Used by frontends to find available liquidity)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Fetches quotes for available liquidity.\n *\n * > **Note**: This method is typically used by frontend applications to\n * > display available off-ramp options to users. Liquidity providers can\n * > use it to see how their deposits appear to takers.\n *\n * Returns available quotes from liquidity providers matching the request\n * criteria. When authenticated, the API returns payee details in each quote.\n *\n * @param req - Quote request parameters\n * @param req.paymentPlatforms - Payment platforms to search (e.g., ['wise', 'revolut'])\n * @param req.fiatCurrency - Target fiat currency code (e.g., 'USD')\n * @param req.user - User's address\n * @param req.recipient - Token recipient address\n * @param req.destinationChainId - Chain ID for token delivery\n * @param req.destinationToken - Token address to receive\n * @param req.amount - Amount (in fiat if isExactFiat, else in tokens)\n * @param req.isExactFiat - If true, amount is in fiat; quotes return token amounts\n * @param req.escrowAddresses - Optional filter for specific escrow contracts\n * @param opts - Optional overrides for API URL and timeout\n * @returns Quote response with available options\n *\n * @example\n * ```typescript\n * const quote = await client.getQuote({\n * paymentPlatforms: ['wise'],\n * fiatCurrency: 'EUR',\n * user: '0x...',\n * recipient: '0x...',\n * destinationChainId: 8453,\n * destinationToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: '100',\n * isExactFiat: true,\n * });\n *\n * for (const q of quote.responseObject.quotes) {\n * console.log(`${q.tokenAmountFormatted} USDC for ${q.fiatAmountFormatted}`);\n * }\n * ```\n */\n async getQuote(req: QuoteRequest, opts?: { baseApiUrl?: string; timeoutMs?: number }): Promise<QuoteResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n // Include the native escrow only when caller did not provide filters\n const reqWithEscrow = { ...(req as any) } as QuoteRequest & { escrowAddresses?: string[] };\n if ((!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) && this.escrowAddress) {\n reqWithEscrow.escrowAddresses = [this.escrowAddress as string];\n }\n const quote = await apiGetQuote(reqWithEscrow as any, baseApiUrl, timeoutMs, this.apiKey, this.authorizationToken);\n // Extract maker.depositData from /v2/quote response into payeeData for backward compatibility\n // This eliminates the need for separate apiGetPayeeDetails calls\n const quotes = quote?.responseObject?.quotes ?? [];\n for (const q of quotes) {\n const maker = (q as any)?.maker;\n if (maker?.depositData && typeof q === 'object') {\n (q as any).payeeData = maker.depositData;\n }\n }\n return quote;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: TAKER TIER\n // (Used by frontends to display taker limits)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Fetches taker tier information for an address.\n *\n * > **Note**: Requires `apiKey` or `authorizationToken` to be set.\n *\n * @param req - Taker tier request parameters\n * @param req.owner - Taker address\n * @param req.chainId - Chain ID\n * @param opts - Optional overrides for API URL and timeout\n * @returns Taker tier response\n */\n async getTakerTier(req: GetTakerTierRequest, opts?: { baseApiUrl?: string; timeoutMs?: number }): Promise<GetTakerTierResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n if (!this.apiKey && !this.authorizationToken) {\n throw new Error('getTakerTier requires apiKey or authorizationToken');\n }\n return apiGetTakerTier(req, this.apiKey, baseApiUrl, this.authorizationToken, timeoutMs);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ON-CHAIN DEPOSIT VIEWS ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n private requireProtocolViewer() {\n if (!this.protocolViewerAddress || !this.protocolViewerAbi) {\n throw new Error('ProtocolViewer not available for this network');\n }\n return { address: this.protocolViewerAddress, abi: this.protocolViewerAbi } as const;\n }\n\n /**\n * Fetches a deposit directly from on-chain ProtocolViewer contract.\n * Falls back to Escrow.getDeposit if ProtocolViewer is unavailable.\n *\n * @param depositId - The deposit ID (string or bigint)\n * @returns Parsed deposit view with all payment methods and currencies\n */\n async getPvDepositById(depositId: string | bigint) {\n const id = typeof depositId === 'bigint' ? depositId : BigInt(depositId);\n try {\n const { address, abi } = this.requireProtocolViewer();\n const raw = await this.publicClient.readContract({ address, abi, functionName: 'getDeposit', args: [id] });\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return parseDepositView(raw);\n } catch (e) {\n // Fallback to Escrow.getDeposit\n const raw = await this.publicClient.readContract({ address: this.escrowAddress, abi: this.escrowAbi, functionName: 'getDeposit', args: [id] });\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return parseDepositView(raw);\n }\n }\n\n /**\n * Fetches multiple deposits by ID from on-chain in a batch call.\n *\n * @param ids - Array of deposit IDs\n * @returns Array of parsed deposit views\n */\n async getPvDepositsFromIds(ids: Array<string | bigint>) {\n // When ProtocolViewer is unavailable, fall back to per-id Escrow.getDeposit reads\n if (!this.protocolViewerAddress || !this.protocolViewerAbi) {\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n const results: any[] = [];\n for (const id of ids) {\n const raw = await this.publicClient.readContract({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'getDeposit',\n args: [typeof id === 'bigint' ? id : BigInt(id)],\n });\n results.push(parseDepositView(raw));\n }\n return results;\n }\n const bn = ids.map((id) => (typeof id === 'bigint' ? id : BigInt(id)));\n const raw = (await this.publicClient.readContract({\n address: this.protocolViewerAddress!,\n abi: this.protocolViewerAbi!,\n functionName: 'getDepositFromIds',\n args: [bn],\n })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n }\n\n /**\n * Fetches all deposits owned by an address from on-chain.\n *\n * @param owner - The owner address\n * @returns Array of parsed deposit views\n */\n async getPvAccountDeposits(owner: Address) {\n try {\n const { address, abi } = this.requireProtocolViewer();\n const raw = (await this.publicClient.readContract({ address, abi, functionName: 'getAccountDeposits', args: [owner] })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n } catch (e) {\n const raw = (await this.publicClient.readContract({ address: this.escrowAddress, abi: this.escrowAbi, functionName: 'getAccountDeposits', args: [owner] })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n }\n }\n\n /**\n * Fetches all intents created by an address from on-chain.\n * Requires ProtocolViewer to be available.\n *\n * @param owner - The owner address\n * @returns Array of parsed intent views\n */\n async getPvAccountIntents(owner: Address) {\n const { address, abi } = this.requireProtocolViewer();\n const raw = (await this.publicClient.readContract({\n address,\n abi,\n functionName: 'getAccountIntents',\n args: [owner],\n })) as any[];\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseIntentView);\n }\n\n /**\n * Fetches a single intent by hash from on-chain.\n *\n * @param intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @returns Parsed intent view with deposit context\n */\n async getPvIntent(intentHash: `0x${string}`) {\n const { address, abi } = this.requireProtocolViewer();\n const raw = await this.publicClient.readContract({\n address,\n abi,\n functionName: 'getIntent',\n args: [intentHash],\n });\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n return parseIntentView(raw);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: UTILITIES ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Returns the USDC token address for the current network (if known).\n *\n * @returns USDC address or undefined if not configured\n */\n getUsdcAddress(): Address | undefined {\n return this._usdcAddress;\n }\n\n /**\n * Returns all deployed contract addresses for the current network/environment.\n *\n * @returns Object with escrow, orchestrator, protocolViewer, verifier, and USDC addresses\n */\n getDeployedAddresses(): { escrow: Address; orchestrator?: Address; protocolViewer?: Address; unifiedPaymentVerifier?: Address; usdc?: Address } {\n return {\n escrow: this.escrowAddress,\n orchestrator: this.orchestratorAddress,\n protocolViewer: this.protocolViewerAddress,\n unifiedPaymentVerifier: this.unifiedPaymentVerifier,\n usdc: this._usdcAddress,\n };\n }\n\n /**\n * Resolves all parameters needed to fulfill an intent.\n *\n * Attempts to fetch from ProtocolViewer first (on-chain source of truth),\n * then falls back to the indexer. This is called internally by `fulfillIntent`\n * but exposed for advanced use cases.\n *\n * @param intentHash - The intent hash to resolve\n * @returns Intent parameters needed for fulfillment\n * @throws Error if intent not found or payee details cannot be resolved\n */\n async getFulfillIntentInputs(intentHash: `0x${string}`): Promise<{\n amount: string;\n fiatCurrency: `0x${string}`;\n conversionRate: string;\n payeeDetails: `0x${string}`;\n intentTimestampMs: string; // on-chain snapshot timestamp in ms\n paymentMethodHash: `0x${string}`;\n }> {\n // 1) Try ProtocolViewer when available\n try {\n if (this.protocolViewerAddress && this.protocolViewerAbi) {\n const view = await this.getPvIntent(intentHash);\n const pmHash = (view.intent.paymentMethod as string).toLowerCase();\n const matched = (view.deposit.paymentMethods || []).find((pm: any) => (pm.paymentMethod as string)?.toLowerCase?.() === pmHash);\n const payee = matched?.verificationData?.payeeDetails as `0x${string}` | undefined;\n if (payee) {\n return {\n amount: (view.intent.amount as bigint).toString(),\n fiatCurrency: view.intent.fiatCurrency as `0x${string}`,\n conversionRate: (view.intent.conversionRate as bigint).toString(),\n payeeDetails: payee,\n intentTimestampMs: (BigInt(view.intent.timestamp as any) * 1000n).toString(),\n paymentMethodHash: view.intent.paymentMethod as `0x${string}`,\n };\n }\n }\n } catch {/* fall through */ }\n\n // 2) Fallback: indexer — fetch intent + deposit relations to recover payeeDetails\n const query = /* GraphQL */ `\n query GetIntentMinimal($hash: String!) {\n Intent(where: { intentHash: { _eq: $hash } }, limit: 1) {\n amount\n fiatCurrency\n conversionRate\n paymentMethodHash\n depositId\n signalTimestamp\n }\n }\n `;\n const res = await this._indexerClient.query<{ Intent?: Array<{ amount: string; fiatCurrency: string; conversionRate: string; paymentMethodHash?: string | null; depositId: string; signalTimestamp?: string }> }>({\n query,\n variables: { hash: intentHash.toLowerCase() },\n });\n const rec = res?.Intent?.[0];\n if (!rec) throw new Error('Intent not found on indexer');\n if (!rec.signalTimestamp) throw new Error('Intent signal timestamp not found on indexer');\n const deposit = await this._indexerService.fetchDepositWithRelations(rec.depositId, { includeIntents: false });\n let payee: string | undefined;\n const pmHashLower = (rec.paymentMethodHash || '').toLowerCase();\n for (const pm of deposit?.paymentMethods || []) {\n if ((pm.paymentMethodHash || '').toLowerCase() === pmHashLower) {\n payee = pm.payeeDetailsHash;\n break;\n }\n }\n if (!payee) throw new Error('Payee details not found for intent');\n return {\n amount: rec.amount,\n fiatCurrency: rec.fiatCurrency as `0x${string}`,\n conversionRate: rec.conversionRate,\n payeeDetails: payee as `0x${string}`,\n intentTimestampMs: (BigInt(rec.signalTimestamp) * 1000n).toString(),\n paymentMethodHash: (rec.paymentMethodHash || '0x0000000000000000000000000000000000000000000000000000000000000000') as `0x${string}`,\n };\n }\n}\n","import type { Address } from 'viem';\n\nexport type SignIntentV2Request = {\n processorName: string;\n payeeDetails: string;\n depositId: string; // decimal string\n amount: string; // decimal string\n toAddress: Address;\n paymentMethod: `0x${string}`; // bytes32\n fiatCurrency: `0x${string}`; // bytes32\n conversionRate: string; // decimal string\n chainId: string; // decimal string\n orchestratorAddress: Address;\n escrowAddress: Address;\n};\n\nexport type SignIntentV2Response = {\n success: boolean;\n message: string;\n responseObject: {\n depositData?: Record<string, unknown>;\n signedIntent: `0x${string}`; // signature bytes\n intentData?: { signatureExpiration?: string };\n signatureExpiration?: string;\n };\n statusCode: number;\n};\n\nexport async function apiSignIntentV2(\n request: SignIntentV2Request,\n opts: { baseApiUrl: string; apiKey?: string; authorizationToken?: string; timeoutMs?: number }\n): Promise<{ signature: `0x${string}`; signatureExpiration: bigint }> {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (opts.apiKey) headers['x-api-key'] = opts.apiKey;\n if (opts.authorizationToken) headers['authorization'] = `Bearer ${opts.authorizationToken}`;\n\n const res = await fetch(`${opts.baseApiUrl.replace(/\\/$/, '')}/v2/verify/intent`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`verify/intent failed: ${res.status} ${res.statusText} ${text}`);\n }\n const json = (await res.json()) as SignIntentV2Response;\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr = json?.responseObject?.intentData?.signatureExpiration ?? json?.responseObject?.signatureExpiration;\n if (!sig || !expStr) throw new Error('verify/intent missing signature or expiration');\n return { signature: sig, signatureExpiration: BigInt(expStr) };\n } finally {\n clearTimeout(id);\n }\n}\n\n","import { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\n\nfunction headers() {\n return { 'Content-Type': 'application/json' } as const;\n}\n\n// Posts a zkTLS proof JSON string to the Attestation Service and returns the attestation response\n// Endpoint shape: /verify/:platform/:actionType\nexport async function apiCreatePaymentAttestation(\n payload: Record<string, unknown>,\n attestationServiceUrl: string,\n platform: string,\n actionType: string\n): Promise<any> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = `/verify/${encodeURIComponent(platform)}/${encodeURIComponent(actionType)}`;\n res = await fetch(`${attestationServiceUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(payload),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: `/verify/${platform}/${actionType}`,\n error,\n });\n }\n\n if (!res.ok) {\n const errorText = await res.text();\n throw parseAPIError(res, errorText);\n }\n\n return res.json();\n });\n}\n\n","import { APIError, NetworkError } from './index';\n\nexport function parseAPIError(response: Response, responseText?: string): APIError {\n let message = `Request failed: ${response.statusText}`;\n try {\n const parsed = responseText ? JSON.parse(responseText) : undefined;\n if (parsed && (parsed.error || parsed.message)) {\n message = parsed.error || parsed.message;\n }\n } catch {\n if (responseText && responseText.length < 200) message = responseText;\n }\n if (response.status === 429) {\n message = 'Too many requests. Please try again later.';\n }\n return new APIError(message, response.status, { url: response.url });\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n delayMs = 1000,\n timeoutMs?: number\n): Promise<T> {\n let lastErr: unknown;\n for (let i = 0; i < maxRetries; i++) {\n try {\n // Apply timeout if specified\n if (timeoutMs) {\n const { withTimeout } = await import('../utils/timeout');\n return await withTimeout(fn(), timeoutMs, `Operation timed out after ${timeoutMs}ms`);\n }\n return await fn();\n } catch (err) {\n lastErr = err;\n const isNetwork = err instanceof NetworkError;\n const isRateLimit = err instanceof APIError && err.status === 429;\n const retryable = isNetwork || isRateLimit;\n if (!retryable || i === maxRetries - 1) throw err;\n const base = isRateLimit ? delayMs * Math.pow(2, i) : delayMs;\n const jitter = Math.floor(Math.random() * Math.min(1000, base));\n await new Promise((r) => setTimeout(r, base + jitter));\n }\n }\n throw lastErr as Error;\n}\n","import { AbiCoder } from 'ethers';\n\nexport type Address = `0x${string}`;\n\nexport type AttestationTypedDataSpec = {\n primaryType: string;\n types: Record<string, { type: string; name: string }[]>;\n};\n\nexport type AttestationResponse = {\n success: boolean;\n message: string;\n responseObject: {\n platform: string;\n actionType: string;\n signature: string;\n signer: string;\n domainSeparator: string;\n typeHash: string;\n typedDataSpec: AttestationTypedDataSpec;\n typedDataValue: { intentHash: string; releaseAmount: string; dataHash: string };\n proofInput: string;\n encodedPaymentDetails: string;\n metadata: string;\n };\n statusCode: number;\n};\n\nconst abiCoder = AbiCoder.defaultAbiCoder();\n\nexport function encodeVerifyPaymentData(params: {\n intentHash: Address;\n paymentProof: Address;\n data: Address;\n}): Address {\n return abiCoder.encode(\n ['tuple(bytes32,bytes,bytes)'],\n [[params.intentHash, params.paymentProof, params.data]]\n ) as Address;\n}\n\nexport function encodeAddressAsBytes(addr: string): Address {\n return abiCoder.encode(['address'], [addr]) as Address;\n}\n\n// Encodes a PaymentAttestation struct into bytes consumable by UnifiedPaymentVerifier\nexport function encodePaymentAttestation(attestation: AttestationResponse): Address {\n const resp = attestation.responseObject;\n\n const td = resp.typedDataValue;\n const intentHash = td.intentHash as Address;\n const releaseAmount = BigInt(td.releaseAmount);\n const dataHash = td.dataHash as Address;\n const signatures: string[] = [resp.signature];\n const encodedPaymentDetails = resp.encodedPaymentDetails as Address;\n\n if (!intentHash || !releaseAmount || !dataHash || !encodedPaymentDetails) {\n throw new Error('Attestation response missing required fields');\n }\n\n return abiCoder.encode(\n ['tuple(bytes32,uint256,bytes32,bytes[],bytes,bytes)'],\n [[intentHash, releaseAmount, dataHash, signatures, encodedPaymentDetails, '0x']]\n ) as Address;\n}\n\n","import type {\n IntentSignalRequest,\n PostDepositDetailsRequest,\n SignalIntentResponse,\n PostDepositDetailsResponse,\n QuoteRequest,\n QuoteResponse,\n GetPayeeDetailsRequest,\n GetPayeeDetailsResponse,\n ValidatePayeeDetailsRequest,\n ValidatePayeeDetailsResponse,\n GetOwnerDepositsRequest,\n GetOwnerDepositsResponse,\n GetOwnerIntentsRequest,\n GetOwnerIntentsResponse,\n GetIntentsByDepositRequest,\n GetIntentsByDepositResponse,\n GetIntentsByTakerRequest,\n GetIntentsByTakerResponse,\n GetIntentByHashRequest,\n GetIntentByHashResponse,\n GetDepositByIdRequest,\n GetDepositByIdResponse,\n GetDepositsOrderStatsRequest,\n GetDepositsOrderStatsResponse,\n GetTakerTierRequest,\n GetTakerTierResponse,\n GetIntentsByRecipientRequest,\n GetIntentsByRecipientResponse,\n ListPayeesResponse,\n} from '../types';\nimport { NetworkError, ValidationError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\n\n/**\n * Creates headers for API requests with optional authentication\n */\nfunction createHeaders(apiKey?: string, authToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['x-api-key'] = apiKey;\n if (authToken) headers['Authorization'] = authToken.startsWith('Bearer ') ? authToken : `Bearer ${authToken}`;\n return headers;\n}\n\n// Normalize base API URL to avoid duplicate version segments (e.g., avoid /v1/v1, /v2/v2)\nfunction withApiBase(baseApiUrl: string): string {\n const trimmed = (baseApiUrl || '').trim();\n // remove trailing slashes\n let base = trimmed.replace(/\\/+$/, '');\n // remove trailing /v1 if a caller accidentally includes it\n base = base.replace(/\\/v1$/i, '');\n // remove trailing /v2 if a caller accidentally includes it\n base = base.replace(/\\/v2$/i, '');\n return base;\n}\n\n/**\n * Base fetch wrapper with common error handling and retry logic\n */\nasync function apiFetch<T>({\n url,\n method = 'GET',\n body,\n apiKey,\n authToken,\n timeoutMs,\n retryCount = 3,\n retryDelayMs = 1000,\n}: {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n body?: any;\n apiKey?: string;\n authToken?: string;\n timeoutMs?: number;\n retryCount?: number;\n retryDelayMs?: number;\n}): Promise<T> {\n const endpoint = url.replace(/^[^/]*\\/\\/[^/]*/, ''); // Extract endpoint for error messages\n\n return withRetry(async () => {\n let res: Response;\n try {\n const options: RequestInit = {\n method,\n headers: createHeaders(apiKey, authToken),\n };\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n res = await fetch(url, options);\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', { endpoint, error });\n }\n\n if (!res.ok) {\n const errorText = await res.text();\n throw parseAPIError(res, errorText);\n }\n\n return res.json();\n }, retryCount, retryDelayMs, timeoutMs);\n}\n\n/**\n * Process API response with optional date transformation\n */\nfunction processApiResponse<T extends Record<string, any>>(\n data: any,\n transformDates: boolean = true\n): T {\n if (!transformDates) return data;\n\n // Apply date transformation to responseObject if it exists\n if (data.responseObject) {\n if (Array.isArray(data.responseObject)) {\n data.responseObject = data.responseObject.map((item: any) => transformDatesToObjects(item));\n } else {\n data.responseObject = transformDatesToObjects(data.responseObject);\n }\n }\n\n return data;\n}\n\n/**\n * Build query string from status parameter\n */\nfunction buildStatusQuery(status?: string | string[]): string {\n if (!status) return '';\n const statusParam = Array.isArray(status) ? status.join(',') : status;\n return `?status=${statusParam}`;\n}\n\nexport async function apiSignalIntent(\n req: IntentSignalRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<SignalIntentResponse> {\n return apiFetch<SignalIntentResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v2/verify/intent`,\n method: 'POST',\n body: req,\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\n/**\n * Get intents by recipient address with optional status filter\n */\nexport async function apiGetIntentsByRecipient(\n req: GetIntentsByRecipientRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByRecipientResponse> {\n const endpoint = `/v1/orders/recipient/${req.recipientAddress}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByRecipientResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Makers list\nexport async function apiListPayees(\n processorName: string | undefined,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<ListPayeesResponse> {\n const endpoint = processorName ? `/v1/makers?processorName=${encodeURIComponent(processorName)}` : '/v1/makers';\n const data = await apiFetch<ListPayeesResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Deposit spreads\nexport async function apiGetDepositSpread(\n depositId: number,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiListDepositSpreads(\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiGetSpreadsByDepositIds(\n depositIds: number[],\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads/bulk`,\n method: 'POST',\n body: { depositIds },\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiCreateSpread(\n body: { depositId: number; spread: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads`,\n method: 'POST',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiUpdateSpread(\n depositId: number,\n body: { spread?: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'PUT',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiUpsertSpread(\n depositId: number,\n body: { spread?: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'POST',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiDeleteSpread(\n depositId: number,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n return apiFetch({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'DELETE',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\nexport async function apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/create`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuote(\n req: QuoteRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n authToken?: string\n): Promise<QuoteResponse> {\n if (req.quotesToReturn !== undefined) {\n if (!Number.isInteger(req.quotesToReturn) || (req.quotesToReturn as number) < 1) {\n throw new ValidationError('quotesToReturn must be a positive integer', 'quotesToReturn');\n }\n }\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'exact-fiat' : 'exact-token';\n // Use /v2/quote which returns maker.depositData when authenticated\n let url = `${withApiBase(baseApiUrl)}/v2/quote/${endpoint}`;\n if (req.quotesToReturn) url += `?quotesToReturn=${req.quotesToReturn}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: req.amount,\n amount: undefined,\n isExactFiat: undefined,\n quotesToReturn: undefined,\n };\n Object.keys(requestBody).forEach((k) => requestBody[k] === undefined && delete requestBody[k]);\n\n return apiFetch<QuoteResponse>({\n url,\n method: 'POST',\n body: requestBody,\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\nexport async function apiGetPayeeDetails(\n req: GetPayeeDetailsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetPayeeDetailsResponse> {\n return apiFetch<GetPayeeDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/${req.processorName}/${req.hashedOnchainId}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\nexport async function apiValidatePayeeDetails(\n req: ValidatePayeeDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number\n): Promise<ValidatePayeeDetailsResponse> {\n const data = await apiFetch<ValidatePayeeDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/validate`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n // Back-compat: some APIs may return boolean in responseObject. Normalize to { isValid }.\n if (typeof data?.responseObject === 'boolean') {\n return {\n ...data,\n responseObject: { isValid: data.responseObject },\n } as ValidatePayeeDetailsResponse;\n }\n return data;\n}\n\n\n// Helper function to transform date strings to Date objects\nfunction transformDatesToObjects<T extends Record<string, any>>(obj: T): T {\n const dateFields = ['createdAt', 'updatedAt', 'signalTimestamp', 'fulfillTimestamp', 'prunedTimestamp'];\n const transformed = { ...obj };\n\n for (const key in transformed) {\n const value = transformed[key];\n\n if (dateFields.includes(key) && typeof value === 'string') {\n transformed[key] = new Date(value) as any;\n } else if (Array.isArray(value)) {\n transformed[key] = value.map((item: any) =>\n typeof item === 'object' && item !== null\n ? transformDatesToObjects(item)\n : item\n ) as any;\n } else if (typeof value === 'object' && value !== null) {\n transformed[key] = transformDatesToObjects(value) as any;\n }\n }\n\n return transformed;\n}\n\nexport async function apiGetOwnerDeposits(\n req: GetOwnerDepositsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetOwnerDepositsResponse> {\n const statusQuery = req.status ? `?status=${encodeURIComponent(req.status)}` : '';\n const data = await apiFetch<GetOwnerDepositsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/maker/${req.ownerAddress}${statusQuery}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\nexport async function apiGetOwnerIntents(\n req: GetOwnerIntentsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetOwnerIntentsResponse> {\n const data = await apiFetch<GetOwnerIntentsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/orders/maker/${req.ownerAddress}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get intents by deposit ID with optional status filter\n */\nexport async function apiGetIntentsByDeposit(\n req: GetIntentsByDepositRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByDepositResponse> {\n const endpoint = `/v1/orders/deposit/${req.depositId}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByDepositResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get intents by taker address with optional status filter\n */\nexport async function apiGetIntentsByTaker(\n req: GetIntentsByTakerRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByTakerResponse> {\n const endpoint = `/v1/orders/taker/${req.takerAddress}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByTakerResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get a single intent by its hash\n */\nexport async function apiGetIntentByHash(\n req: GetIntentByHashRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentByHashResponse> {\n const data = await apiFetch<GetIntentByHashResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/orders/${req.intentHash}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Deposits API Functions\n\n/**\n * Get a single deposit by its ID\n */\nexport async function apiGetDepositById(\n req: GetDepositByIdRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetDepositByIdResponse> {\n const data = await apiFetch<GetDepositByIdResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${req.depositId}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get order statistics for multiple deposits\n */\nexport async function apiGetDepositsOrderStats(\n req: GetDepositsOrderStatsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetDepositsOrderStatsResponse> {\n return apiFetch<GetDepositsOrderStatsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/order-stats`,\n method: 'POST',\n body: { depositIds: req.depositIds },\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\n/**\n * Get taker tier information for a specific address.\n */\nexport async function apiGetTakerTier(\n req: GetTakerTierRequest,\n apiKey: string | undefined,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetTakerTierResponse> {\n const normalizedOwner = req.owner.toLowerCase();\n const query = new URLSearchParams({\n owner: normalizedOwner,\n chainId: String(req.chainId),\n });\n const endpoint = `/v2/taker/tier?${query.toString()}`;\n\n return apiFetch<GetTakerTierResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n","export const ERC20_ABI = [\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n ],\n outputs: [{ name: 'amount', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ name: 'success', type: 'bool' }],\n },\n] as const;\n\n","import { Attribution } from 'ox/erc8021';\nimport type { Abi } from 'abitype';\nimport {\n type Hash,\n type Hex,\n type WalletClient,\n concatHex,\n encodeFunctionData,\n} from 'viem';\nimport type { TxOverrides } from '../types';\n\n// =============================================================================\n// BASE BUILDER CODES - ERC-8021 Attribution\n// =============================================================================\n// Builder codes for Base Builder Rewards program.\n// https://docs.base.org/base-chain/quickstart/builder-codes\n// =============================================================================\n\n/**\n * Base Builder Code for ZKP2P app (registered with Base).\n * This is ALWAYS included as the last code in attribution and cannot be overridden.\n */\nexport const BASE_BUILDER_CODE = 'bc_nbn6qkni';\n\n/**\n * ZKP2P iOS app referrer code - pass via txOverrides.referrer\n */\nexport const ZKP2P_IOS_REFERRER = 'zkp2p-ios';\n\n/**\n * ZKP2P Android app referrer code - pass via txOverrides.referrer\n */\nexport const ZKP2P_ANDROID_REFERRER = 'zkp2p-android';\n\n/**\n * Generate the ERC-8021 attribution data suffix for transactions.\n *\n * The Base builder code (bc_nbn6qkni) is ALWAYS appended last and cannot be overridden.\n * Custom referrer codes are prepended before the base builder code.\n *\n * @param referrer - Optional referrer code(s) to prepend before the base builder code.\n * Can be a single string or array of strings.\n * These will appear BEFORE the base builder code in the attribution.\n * @returns Hex-encoded attribution suffix\n */\nexport function getAttributionDataSuffix(referrer?: string | string[]): Hex {\n const codes: string[] = [];\n\n if (referrer) {\n if (Array.isArray(referrer)) {\n codes.push(...referrer);\n } else {\n codes.push(referrer);\n }\n }\n\n // Base builder code is ALWAYS last\n codes.push(BASE_BUILDER_CODE);\n\n return Attribution.toDataSuffix({ codes });\n}\n\n/**\n * Append attribution data suffix to existing calldata\n *\n * @param calldata - Original transaction calldata\n * @param referrer - Optional referrer code(s) to prepend before the base builder code\n * @returns Calldata with attribution suffix appended\n */\nexport function appendAttributionToCalldata(calldata: Hex, referrer?: string | string[]): Hex {\n const suffix = getAttributionDataSuffix(referrer);\n return concatHex([calldata, suffix]);\n}\n\n/**\n * Request parameters for sendTransactionWithAttribution\n */\nexport interface AttributionRequest {\n address: `0x${string}`;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n value?: bigint;\n}\n\ntype OverrideFields = Omit<TxOverrides, 'referrer'>;\n\n/**\n * Send a contract transaction with ERC-8021 attribution.\n *\n * 1. Encodes the function call data using encodeFunctionData\n * 2. Appends the attribution suffix\n * 3. Sends via sendTransaction (wallet estimates gas automatically)\n *\n * @param walletClient - The viem wallet client\n * @param request - The request with abi, functionName, args, address, value\n * @param referrer - Optional referrer code(s) from txOverrides.referrer\n * @param overrides - Optional transaction overrides (gas, nonce, etc.)\n * @returns Transaction hash\n */\nexport async function sendTransactionWithAttribution(\n walletClient: WalletClient,\n request: AttributionRequest,\n referrer?: string | string[],\n overrides?: OverrideFields\n): Promise<Hash> {\n // Encode the function call data\n const functionData = encodeFunctionData({\n abi: request.abi,\n functionName: request.functionName as any,\n args: request.args || [],\n });\n\n // Append attribution suffix\n const dataWithAttribution = appendAttributionToCalldata(functionData, referrer);\n\n const {\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n value,\n accessList,\n authorizationList,\n } = overrides ?? {};\n\n const optionalOverrides = {\n ...(gas !== undefined ? { gas } : {}),\n ...(gasPrice !== undefined ? { gasPrice } : {}),\n ...(maxFeePerGas !== undefined ? { maxFeePerGas } : {}),\n ...(maxPriorityFeePerGas !== undefined ? { maxPriorityFeePerGas } : {}),\n ...(nonce !== undefined ? { nonce } : {}),\n ...(accessList !== undefined ? { accessList } : {}),\n ...(authorizationList !== undefined ? { authorizationList } : {}),\n };\n\n // Send transaction - wallet/RPC handles gas estimation\n return walletClient.sendTransaction({\n to: request.address,\n data: dataWithAttribution,\n value: value ?? request.value,\n account: walletClient.account!,\n chain: walletClient.chain,\n ...optionalOverrides,\n } as any) as Promise<Hash>;\n}\n","/**\n * @zkp2p/client-sdk\n *\n * ZKP2P Client SDK - TypeScript SDK for deposit management,\n * liquidity provision, and fiat off-ramping on Base.\n *\n * **RPC-first architecture**: All primary queries use on-chain reads via ProtocolViewer\n * for instant, real-time data with no indexer lag. Advanced historical queries are\n * available via `client.indexer.*`.\n *\n * @example\n * ```typescript\n * import { Zkp2pClient, Currency } from '@zkp2p/client-sdk';\n *\n * const client = new Zkp2pClient({\n * walletClient,\n * chainId: 8453,\n * });\n *\n * // Query deposits (RPC - instant, real-time)\n * const deposits = await client.getDeposits();\n * const deposit = await client.getDeposit(42n);\n *\n * // Query intents (RPC - instant, real-time)\n * const intents = await client.getIntents();\n *\n * // Create a deposit\n * await client.createDeposit({\n * token: USDC_ADDRESS,\n * amount: 10000000000n,\n * intentAmountRange: { min: 100000n, max: 1000000000n },\n * processorNames: ['wise', 'revolut'],\n * depositData: [{ email: 'you@example.com' }, { tag: '@you' }],\n * conversionRates: [[{ currency: Currency.USD, conversionRate: '1020000000000000000' }]], // 1.02 (18 decimals)\n * });\n *\n * // Advanced indexer queries (for historical/filtered data)\n * const activeDeposits = await client.indexer.getDeposits({ status: 'ACTIVE' });\n * ```\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Main Client\n// =============================================================================\n\nexport { Zkp2pClient as OfframpClient } from './client/Zkp2pClient';\nexport { Zkp2pClient } from './client/Zkp2pClient';\n\n// =============================================================================\n// Client Types\n// =============================================================================\n\nexport type {\n // Client configuration\n Zkp2pClientOptions,\n TimeoutConfig,\n ActionCallback,\n TxOverrides,\n\n // Deposit operations\n CreateDepositParams,\n CreateDepositConversionRate,\n Range,\n WithdrawDepositParams,\n\n // Intent operations\n SignalIntentParams,\n FulfillIntentParams,\n ReleaseFundsToPayerParams,\n CancelIntentParams,\n\n // API types\n QuoteRequest,\n QuoteResponse,\n QuoteResponseObject,\n QuoteSingleResponse,\n QuoteIntentResponse,\n QuoteFeesResponse,\n FiatResponse,\n TokenResponse,\n NearbyQuote,\n NearbySuggestions,\n\n // Deposit API types\n ApiDeposit,\n DepositVerifier,\n DepositVerifierCurrency,\n DepositStatus,\n GetOwnerDepositsRequest,\n GetOwnerDepositsResponse,\n GetDepositByIdRequest,\n GetDepositByIdResponse,\n\n // Intent API types\n Intent,\n ApiIntentStatus,\n GetOwnerIntentsRequest,\n GetOwnerIntentsResponse,\n GetIntentsByDepositRequest,\n GetIntentsByDepositResponse,\n GetIntentByHashRequest,\n GetIntentByHashResponse,\n\n // Payee details API\n ValidatePayeeDetailsRequest,\n ValidatePayeeDetailsResponse,\n PostDepositDetailsRequest,\n PostDepositDetailsResponse,\n RegisterPayeeDetailsRequest,\n RegisterPayeeDetailsResponse,\n GetPayeeDetailsRequest,\n GetPayeeDetailsResponse,\n\n // On-chain types\n OnchainCurrency,\n DepositVerifierData,\n EscrowDepositView,\n EscrowIntentView,\n\n // Statistics\n OrderStats,\n DepositIntentStatistics,\n\n // Taker tier API types\n TakerTier,\n TakerTierStats,\n TakerTierLevel,\n PlatformLimit,\n PlatformRiskLevel,\n GetTakerTierRequest,\n GetTakerTierResponse,\n} from './types';\n\n// =============================================================================\n// Indexer\n// =============================================================================\n\nexport { IndexerClient, defaultIndexerEndpoint } from './indexer/client';\nexport { IndexerDepositService } from './indexer/service';\nexport {\n createCompositeDepositId,\n convertIndexerDepositToEscrowView,\n convertDepositsForLiquidity,\n convertIndexerIntentsToEscrowViews,\n} from './indexer/converters';\nexport {\n fetchFulfillmentAndPayment as fetchIndexerFulfillmentAndPayment,\n} from './indexer/intentVerification';\n\n// Indexer types\nexport type {\n DepositEntity as IndexerDeposit,\n IntentEntity as IndexerIntent,\n DepositWithRelations as IndexerDepositWithRelations,\n IntentFulfilledEntity as IndexerIntentFulfilled,\n DepositPaymentMethodEntity as IndexerDepositPaymentMethod,\n MethodCurrencyEntity as IndexerMethodCurrency,\n IntentStatus as IndexerIntentStatus,\n} from './indexer/types';\nexport type {\n DepositFilter as IndexerDepositFilter,\n PaginationOptions as IndexerDepositPagination,\n DepositOrderField as IndexerDepositOrderField,\n OrderDirection as IndexerDepositOrderDirection,\n} from './indexer/service';\nexport type { DeploymentEnv as IndexerDeploymentEnv } from './indexer/client';\nexport type {\n FulfillmentRecord as IndexerFulfillmentRecord,\n PaymentVerifiedRecord as IndexerPaymentVerifiedRecord,\n FulfillmentAndPaymentResponse as IndexerFulfillmentAndPaymentResponse,\n} from './indexer/intentVerification';\n\n// =============================================================================\n// API Adapters\n// =============================================================================\n\nexport {\n apiValidatePayeeDetails,\n apiPostDepositDetails,\n apiGetPayeeDetails,\n apiGetTakerTier,\n} from './adapters/api';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport { PAYMENT_PLATFORMS, PLATFORM_METADATA, SUPPORTED_CHAIN_IDS, TOKEN_METADATA } from './constants';\nexport type { PaymentPlatformType, SupportedChainId } from './constants';\n\n// =============================================================================\n// Currency Utilities\n// =============================================================================\n\nexport {\n Currency,\n currencyInfo,\n getCurrencyInfoFromHash,\n getCurrencyInfoFromCountryCode,\n getCurrencyCodeFromHash,\n isSupportedCurrencyHash,\n mapConversionRatesToOnchainMinRate,\n} from './utils/currency';\nexport type { CurrencyType, CurrencyData } from './utils/currency';\n\n// =============================================================================\n// Payment Resolution\n// =============================================================================\n\nexport {\n resolvePaymentMethodHash,\n resolveFiatCurrencyBytes32,\n resolvePaymentMethodHashFromCatalog,\n resolvePaymentMethodNameFromHash,\n} from './utils/paymentResolution';\n\n// =============================================================================\n// Contract Helpers\n// =============================================================================\n\nexport { getContracts, getPaymentMethodsCatalog, getGatingServiceAddress } from './contracts';\nexport type { RuntimeEnv, PaymentMethodCatalog } from './contracts';\n\n// =============================================================================\n// Byte Utilities\n// =============================================================================\n\nexport { ensureBytes32, asciiToBytes32 } from './utils/bytes32';\n\n// =============================================================================\n// Attribution (ERC-8021)\n// =============================================================================\n\nexport {\n BASE_BUILDER_CODE,\n ZKP2P_IOS_REFERRER,\n ZKP2P_ANDROID_REFERRER,\n getAttributionDataSuffix,\n appendAttributionToCalldata,\n sendTransactionWithAttribution,\n} from './utils/attribution';\n\n// =============================================================================\n// Protocol Viewer Types (RPC responses)\n// =============================================================================\n\nexport {\n parseDepositView,\n parseIntentView,\n enrichPvDepositView,\n enrichPvIntentView,\n} from './utils/protocolViewerParsers';\n\nexport type {\n PV_DepositView as DepositView,\n PV_Deposit as Deposit,\n PV_PaymentMethodData as PaymentMethodData,\n PV_Currency as DepositCurrency,\n PV_IntentView as IntentView,\n PV_Intent as OnchainIntent,\n} from './utils/protocolViewerParsers';\n\n// =============================================================================\n// Logging\n// =============================================================================\n\nexport { logger, setLogLevel } from './utils/logger';\nexport type { LogLevel } from './utils/logger';\n\n// =============================================================================\n// Errors\n// =============================================================================\n\nexport * from './errors';\n","export type LogLevel = 'error' | 'info' | 'debug';\n\nlet currentLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel) {\n currentLevel = level;\n}\n\nfunction shouldLog(level: 'debug' | 'info' | 'error'): boolean {\n switch (currentLevel) {\n case 'debug':\n return true;\n case 'info':\n return level !== 'debug';\n case 'error':\n return level === 'error';\n default:\n return true;\n }\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog('debug')) {\n console.log('[DEBUG]', ...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog('info')) {\n console.log('[INFO]', ...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog('info')) {\n console.warn('[WARN]', ...args);\n }\n },\n error: (...args: any[]) => {\n // Always allow errors at any level above or equal to 'error'\n console.error('[ERROR]', ...args);\n },\n};"]}
|