@zkp2p/sdk 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +18 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +18 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/bigint.ts","../src/errors/index.ts","../src/utils/timeout.ts","../src/contracts.ts","../src/utils/bytes32.ts","../src/utils/currencyKeccak256.ts","../src/utils/paymentMethodHashes.ts","../src/utils/paymentResolution.ts","../src/utils/currency.ts","../src/utils/protocolViewerParsers.ts","../src/client/clientUtils.ts","../src/client/ContractRouter.ts","../src/adapters/verification.ts","../src/errors/utils.ts","../src/adapters/attestation.ts","../src/utils/encode.ts","../src/referrerFeeConfig.ts","../src/utils/attribution.ts","../src/client/IntentOperations.ts","../src/types/index.ts","../src/utils/oracles.ts","../src/constants.ts","../src/utils/logger.ts","../src/client/ProtocolViewerReader.ts","../src/client/VaultOperations.ts","../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/schemaCompatibility.ts","../src/indexer/service.ts","../src/indexer/rateManagerService.ts","../src/indexer/intentVerification.ts","../src/client/Zkp2pClient.ts","../src/adapters/api.ts","../src/utils/referrerFeeDisplay.ts","../src/utils/erc20.ts","../src/extension.ts","../src/index.ts","../src/react/hooks/vaultUtils.ts"],"names":["ErrorCode","ZKP2PError","ValidationError","NetworkError","APIError","ContractError","ZERO_ADDRESS","baseAbisRaw","ProtocolViewerBase","HISTORICAL_ESCROW_ADDRESSES","EscrowBase","OrchestratorBase","UnifiedPaymentVerifierBase","baseStagingAbisRaw","ProtocolViewerBaseStaging","EscrowBaseStaging","OrchestratorBaseStaging","UnifiedPaymentVerifierBaseStaging","baseAddressesRaw","baseStagingAddressesRaw","basePaymentMethodsRaw","baseStagingPaymentMethodsRaw","baseConstantsRaw","baseStagingConstantsRaw","hexToBytes","keccak256","toBytes","bytesToHex","viemKeccak256","lookups","baseStagingPaymentMethods","Currency","currencyInfo","withTimeout","base","headers","AbiCoder","Attribution","concatHex","encodeFunctionData","chainlinkFeeds","encodeAbiParameters","payee","parseDepositView","raw","results","attemptedRead","hadSuccessfulRead","lastError","parseIntentView","result","normalizeAddress","DEFAULT_LIMIT","createHeaders","formatUnits","hardhat","createPublicClient","http","mapConversionRatesToOnchainMinRate","normalizeRateManagerId"],"mappings":"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","file":"index.cjs","sourcesContent":["export function parseBigIntLike(\n value: unknown,\n errorMessage = 'Unsupported numeric value',\n): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number') return BigInt(value);\n if (typeof value === 'string') {\n const normalized = value.trim();\n if (!normalized) throw new Error(errorMessage);\n return BigInt(normalized);\n }\n\n if (value && typeof (value as { toString?: () => string }).toString === 'function') {\n const normalized = (value as { toString: () => string }).toString().trim();\n if (!normalized) throw new Error(errorMessage);\n return BigInt(normalized);\n }\n\n throw new Error(errorMessage);\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;","/**\n * Contract resolution utilities for the SDK.\n *\n * Provides access to deployed contract addresses and ABIs for different\n * networks (Base) 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 baseStagingAddressesRaw from '@zkp2p/contracts-v2/addresses/baseStaging';\nimport * as baseAbisRaw from '@zkp2p/contracts-v2/abis/base';\nimport * as baseStagingAbisRaw from '@zkp2p/contracts-v2/abis/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 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 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): {\n name?: string;\n chainId?: number;\n contracts?: Record<string, `0x${string}`>;\n} {\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)\n 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): {\n methods?: Record<string, { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }>;\n} {\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)\n 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// ---------------------------------------------------------------------------\n// Historical escrow addresses\n// ---------------------------------------------------------------------------\n// Escrow addresses from prior deployments. Merged into escrowAddresses so\n// deposits from retired escrows remain queryable. Current addresses come from\n// contracts-v2 dynamically.\n// Source of truth for what the indexer indexes:\n// STAGING: zkp2p-indexer releases/staging config.base_staging.yaml\n// PROD: zkp2p-indexer main config.base_prod.yaml\n\nexport const HISTORICAL_ESCROW_ADDRESSES: Record<string, `0x${string}`[]> = {\n base: [\n '0x2f121CDDCA6d652f35e8B3E560f9760898888888', // EscrowV2 production (contracts-v2 0.2.0-rc.6)\n ],\n base_staging: [\n '0x5C2a8D9246777eE4501B6C426a8B8C7635C7b5b5', // EscrowV2 staging (contracts-v2 0.2.0-rc.5)\n '0x18EAcBf3FF19528ABe8035CF5cA266F31A2e3f14', // EscrowV2 staging (contracts-v2 0.1.11-rc.3)\n '0x07Cc97c254A5Fb0957553E9F58E4040699357f28', // EscrowV2 staging (contracts-v2 0.1.11-rc.2)\n '0x8455b9a31041125C785044f45458eCf2cbB12eF7', // v2.1 staging Escrow (2025-10-18, PR #83)\n '0x21f007107269ea1c8Fe0730736548090F4945736', // v2.1 staging Escrow (2025-10-04, PR #71)\n ],\n};\n\nexport const HISTORICAL_ORCHESTRATOR_ADDRESSES: Record<string, `0x${string}`[]> = {\n base: [\n '0x88888883Ed048FF0a415271B28b2F52d431810D0', // OrchestratorV2 production (contracts-v2 0.2.0-rc.6)\n ],\n base_staging: [\n '0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e', // OrchestratorV2 staging (contracts-v2 0.2.0-rc.5)\n '0xC0389b3d7A4E6B823e361e562C4a29F04B6C4fB5', // OrchestratorV2 staging (contracts-v2 0.1.11-rc.3)\n ],\n};\n\nconst STAGING_ESCROW_V2_FALLBACK = '0x77e8f808FE201075e0bD651CD46fdF239fc83265';\nconst STAGING_ORCHESTRATOR_V2_FALLBACK = '0xc17a59227B136c45fAa153086a15EF87ED14bE00';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nfunction isValidAddress(value?: string | null): value is `0x${string}` {\n return (\n typeof value === 'string' &&\n /^0x[a-fA-F0-9]{40}$/.test(value) &&\n value.toLowerCase() !== ZERO_ADDRESS\n );\n}\n\nfunction pickAddress(\n contracts: Record<string, string> | undefined,\n keys: string[],\n): `0x${string}` | undefined {\n if (!contracts) return undefined;\n for (const key of keys) {\n const candidate = contracts[key];\n if (isValidAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction pickAbi(source: Record<string, unknown>, names: string[]): Abi | undefined {\n for (const name of names) {\n const candidate = source[name];\n if (Array.isArray(candidate)) return candidate as unknown as Abi;\n // ESM interop: import * as abis may yield { default: [...] } per entry\n if (\n candidate &&\n typeof candidate === 'object' &&\n Array.isArray((candidate as Record<string, unknown>).default)\n ) {\n return (candidate as Record<string, unknown>).default as unknown as Abi;\n }\n }\n return undefined;\n}\n\nfunction uniqueAddresses(...values: Array<string | undefined>): `0x${string}`[] {\n const seen = new Set<string>();\n const addresses: `0x${string}`[] = [];\n for (const value of values) {\n if (!isValidAddress(value)) continue;\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) continue;\n seen.add(normalized);\n addresses.push(value);\n }\n return addresses;\n}\n\nfunction addressesEqual(left?: string, right?: string): boolean {\n return Boolean(left && right && left.toLowerCase() === right.toLowerCase());\n}\n\nfunction readRuntimeEnv(key: string): string | undefined {\n try {\n const meta = import.meta as { env?: Record<string, string | undefined> };\n const fromVite = meta?.env?.[key];\n if (fromVite) return fromVite;\n } catch {\n // ignore\n }\n try {\n const proc = (\n globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process;\n return proc?.env?.[key];\n } catch {\n // ignore\n }\n return undefined;\n}\n\nfunction resolveRuntimeAddressOverride(envKeys: string[]): `0x${string}` | undefined {\n for (const key of envKeys) {\n const candidate = readRuntimeEnv(key);\n if (isValidAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\n// Apply runtime normalization to all imports\nconst baseAddresses = unwrapAddresses(baseAddressesRaw);\nconst baseStagingAddresses = unwrapAddresses(baseStagingAddressesRaw);\nconst basePaymentMethods = unwrapMethods(basePaymentMethodsRaw);\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 /** EscrowV2 contract (supports native rate-manager delegation) */\n escrowV2?: `0x${string}`;\n /** All supported upgraded escrow addresses (current first, then historical) */\n escrowAddresses?: `0x${string}`[];\n /** Orchestrator contract (handles intent signaling and fulfillment) */\n orchestrator?: `0x${string}`;\n /** OrchestratorV2 contract (queries EscrowV2 effective rates) */\n orchestratorV2?: `0x${string}`;\n /** All supported upgraded orchestrator addresses (current first, then historical) */\n orchestratorAddresses?: `0x${string}`[];\n /** UnifiedPaymentVerifier contract (verifies payment proofs) */\n unifiedPaymentVerifier?: `0x${string}`;\n /** UnifiedPaymentVerifierV2 contract (updated verifier) */\n unifiedPaymentVerifierV2?: `0x${string}`;\n /** ProtocolViewer contract (batch read operations) */\n protocolViewer?: `0x${string}`;\n /** Ordered list of all ProtocolViewer instances (primary first, legacy fallback after) */\n protocolViewerEntries?: Array<{ address: `0x${string}`; abi: Abi }>;\n /** USDC token address */\n usdc?: `0x${string}`;\n /** RateManagerV1 contract */\n rateManagerV1?: `0x${string}`;\n /** OrchestratorRegistry contract */\n orchestratorRegistry?: `0x${string}`;\n /** DepositRateManagerRegistryV1 contract */\n rateManagerRegistry?: `0x${string}`;\n /** DepositRateManagerController contract */\n rateManagerController?: `0x${string}`;\n /** ChainlinkOracleAdapter contract */\n chainlinkOracleAdapter?: `0x${string}`;\n /** PythOracleAdapter contract */\n pythOracleAdapter?: `0x${string}`;\n};\n\n/**\n * Contract ABIs for a specific deployment.\n */\nexport type V2ContractAbis = {\n escrow: Abi;\n escrowV2?: Abi;\n orchestrator?: Abi;\n orchestratorV2?: Abi;\n unifiedPaymentVerifier?: Abi;\n unifiedPaymentVerifierV2?: Abi;\n protocolViewer?: Abi;\n rateManagerV1?: Abi;\n orchestratorRegistry?: Abi;\n rateManagerRegistry?: Abi;\n rateManagerController?: Abi;\n};\n\n/**\n * Runtime environment: 'production' for mainnet, 'preproduction' for preprod\n * (production contracts + preprod indexer), 'staging' for testnet/dev.\n */\nexport type RuntimeEnv = 'production' | 'preproduction' | 'staging';\n\n/**\n * Converts a chain ID to its network key.\n * @internal\n */\nexport function networkKeyFromChainId(_chainId: number): 'base' {\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)\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/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(\n chainId: number,\n env: RuntimeEnv = 'production',\n): { addresses: V2ContractAddresses; abis: V2ContractAbis } {\n const key = networkKeyFromChainId(chainId);\n const baseContracts = (baseAddresses.contracts ?? {}) as Record<string, string>;\n const baseV2ProtocolViewerAbi = pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]);\n const baseV2ProtocolViewerAddress = pickAddress(baseContracts, ['ProtocolViewerV2']);\n const baseV1ProtocolViewerAddress = pickAddress(baseContracts, ['ProtocolViewer']);\n const baseProtocolViewerEntries = (() => {\n const entries: Array<{ address: `0x${string}`; abi: Abi }> = [];\n if (baseV2ProtocolViewerAddress && baseV2ProtocolViewerAbi) {\n entries.push({ address: baseV2ProtocolViewerAddress, abi: baseV2ProtocolViewerAbi });\n }\n if (\n baseV1ProtocolViewerAddress &&\n !addressesEqual(baseV1ProtocolViewerAddress, baseV2ProtocolViewerAddress)\n ) {\n entries.push({ address: baseV1ProtocolViewerAddress, abi: ProtocolViewerBase as Abi });\n }\n return entries.length > 0 ? entries : undefined;\n })();\n\n const addressesByKey: Record<'base', V2ContractAddresses> = {\n base: {\n escrow:\n pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']) ??\n pickAddress(baseContracts, ['Escrow']) ??\n ('' as `0x${string}`),\n escrowV2: pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']),\n escrowAddresses: uniqueAddresses(\n pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']),\n ...HISTORICAL_ESCROW_ADDRESSES.base,\n ),\n orchestrator:\n pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']) ??\n pickAddress(baseContracts, ['Orchestrator']),\n orchestratorV2: pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']),\n orchestratorAddresses: uniqueAddresses(\n pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']),\n ...HISTORICAL_ORCHESTRATOR_ADDRESSES.base,\n ),\n unifiedPaymentVerifier: pickAddress(baseContracts, [\n 'UnifiedPaymentVerifierV2',\n 'UnifiedPaymentVerifier',\n ]),\n unifiedPaymentVerifierV2: pickAddress(baseContracts, ['UnifiedPaymentVerifierV2']),\n protocolViewer:\n baseProtocolViewerEntries?.[0]?.address ??\n baseV1ProtocolViewerAddress ??\n baseV2ProtocolViewerAddress,\n protocolViewerEntries: baseProtocolViewerEntries,\n usdc: baseConstants.USDC as `0x${string}` | undefined,\n rateManagerV1: pickAddress(baseContracts, ['RateManagerV1', 'DepositRateManagerRegistryV1']),\n orchestratorRegistry: pickAddress(baseContracts, ['OrchestratorRegistry']),\n rateManagerRegistry: pickAddress(baseContracts, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAddress(baseContracts, ['DepositRateManagerController']),\n chainlinkOracleAdapter: pickAddress(baseContracts, ['ChainlinkOracleAdapter']),\n pythOracleAdapter: pickAddress(baseContracts, ['PythOracleAdapter']),\n },\n };\n\n const abisByKey: Record<'base', V2ContractAbis> = {\n base: {\n escrow: EscrowBase as unknown as Abi,\n escrowV2: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, ['EscrowV2']) ??\n (EscrowBase as unknown as Abi)) as Abi,\n orchestrator: OrchestratorBase as unknown as Abi,\n orchestratorV2: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorV2',\n ]) ?? (OrchestratorBase as unknown as Abi)) as Abi,\n unifiedPaymentVerifier: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]) ?? (UnifiedPaymentVerifierBase as unknown as Abi)) as Abi,\n unifiedPaymentVerifierV2: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]),\n protocolViewer: (baseProtocolViewerEntries?.[0]?.abi ??\n (ProtocolViewerBase as unknown as Abi)) as Abi,\n rateManagerV1: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'RateManagerV1',\n 'DepositRateManagerRegistryV1',\n ]),\n orchestratorRegistry: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorRegistry',\n ]),\n rateManagerRegistry: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerController',\n ]),\n },\n };\n\n // Staging overrides (addresses/abis from contracts-v2 baseStaging deployment)\n if (env === 'staging') {\n const sc = baseStagingAddresses.contracts as Record<string, string> | undefined;\n const stagingEscrowV2Override = resolveRuntimeAddressOverride([\n 'VITE_BASE_STAGING_ESCROW_V2_ADDRESS',\n 'VITE_ESCROW_V2_ADDRESS',\n ]);\n const stagingEscrowCurrent =\n stagingEscrowV2Override ??\n pickAddress(sc, ['EscrowV2', 'Escrow_V2']) ??\n pickAddress(sc, ['Escrow']) ??\n STAGING_ESCROW_V2_FALLBACK;\n const stagingOrchestratorV2Override = resolveRuntimeAddressOverride([\n 'VITE_BASE_STAGING_ORCHESTRATOR_V2_ADDRESS',\n 'VITE_ORCHESTRATOR_V2_ADDRESS',\n 'VITE_ORCHESTRATORV2_ADDRESS',\n ]);\n const stagingOrchestratorCurrent =\n stagingOrchestratorV2Override ??\n pickAddress(sc, ['OrchestratorV2', 'Orchestrator_V2']) ??\n pickAddress(sc, ['Orchestrator']) ??\n STAGING_ORCHESTRATOR_V2_FALLBACK;\n const stagingRateManagerV1 = pickAddress(sc, ['RateManagerV1', 'DepositRateManagerRegistryV1']);\n\n return {\n addresses: {\n escrow: stagingEscrowCurrent as `0x${string}`,\n escrowV2: stagingEscrowCurrent,\n escrowAddresses: uniqueAddresses(\n stagingEscrowCurrent,\n ...HISTORICAL_ESCROW_ADDRESSES.base_staging,\n ),\n orchestrator: stagingOrchestratorCurrent,\n orchestratorV2: stagingOrchestratorCurrent,\n orchestratorAddresses: uniqueAddresses(\n stagingOrchestratorCurrent,\n ...HISTORICAL_ORCHESTRATOR_ADDRESSES.base_staging,\n ),\n unifiedPaymentVerifier: pickAddress(sc, [\n 'UnifiedPaymentVerifierV2',\n 'UnifiedPaymentVerifier',\n ]),\n unifiedPaymentVerifierV2: pickAddress(sc, ['UnifiedPaymentVerifierV2']),\n protocolViewer: pickAddress(sc, ['ProtocolViewerV2', 'ProtocolViewer']),\n protocolViewerEntries: (() => {\n const entries: Array<{ address: `0x${string}`; abi: Abi }> = [];\n // Primary: V2 PV (reads from V2 orchestrator)\n const pvV2Address = pickAddress(sc, ['ProtocolViewerV2']);\n const pvV2Abi = pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]) as Abi | undefined;\n if (pvV2Address && pvV2Abi) {\n entries.push({ address: pvV2Address, abi: pvV2Abi });\n }\n // Fallback: V1 PV (reads V1 orchestrator intents via 1-input functions)\n const pvV1Address = pickAddress(sc, ['ProtocolViewer']);\n const pvV1Abi = ProtocolViewerBaseStaging as unknown as Abi;\n if (pvV1Address && !addressesEqual(pvV1Address, pvV2Address) && pvV1Abi) {\n entries.push({ address: pvV1Address, abi: pvV1Abi });\n }\n return entries.length > 0 ? entries : undefined;\n })(),\n usdc: baseStagingConstants.USDC as `0x${string}` | undefined,\n rateManagerV1: stagingRateManagerV1,\n orchestratorRegistry: pickAddress(sc, ['OrchestratorRegistry']),\n rateManagerRegistry: (pickAddress(sc, ['DepositRateManagerRegistryV1']) ??\n stagingRateManagerV1) as `0x${string}` | undefined,\n rateManagerController: pickAddress(sc, ['DepositRateManagerController']),\n chainlinkOracleAdapter: pickAddress(sc, ['ChainlinkOracleAdapter']),\n pythOracleAdapter: pickAddress(sc, ['PythOracleAdapter']),\n },\n abis: {\n escrow: EscrowBaseStaging as unknown as Abi,\n escrowV2: (addressesEqual(stagingEscrowCurrent, pickAddress(sc, ['Escrow']))\n ? (EscrowBaseStaging as unknown as Abi)\n : (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, ['EscrowV2']) ??\n (EscrowBaseStaging as unknown as Abi))) as Abi,\n orchestrator: OrchestratorBaseStaging as unknown as Abi,\n orchestratorV2: (addressesEqual(\n stagingOrchestratorCurrent,\n pickAddress(sc, ['Orchestrator']),\n )\n ? (OrchestratorBaseStaging as unknown as Abi)\n : (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorV2',\n ]) ?? (OrchestratorBaseStaging as unknown as Abi))) as Abi,\n unifiedPaymentVerifier: (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]) ?? (UnifiedPaymentVerifierBaseStaging as unknown as Abi)) as Abi,\n unifiedPaymentVerifierV2: pickAbi(\n baseStagingAbisRaw as unknown as Record<string, unknown>,\n ['UnifiedPaymentVerifierV2'],\n ),\n protocolViewer: (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]) ?? (ProtocolViewerBaseStaging as unknown as Abi)) as Abi,\n rateManagerV1: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'RateManagerV1',\n 'DepositRateManagerRegistryV1',\n ]),\n orchestratorRegistry: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorRegistry',\n ]),\n rateManagerRegistry: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerController',\n ]),\n },\n };\n }\n\n const result = { addresses: addressesByKey[key], abis: abisByKey[key] };\n\n return result;\n}\n\n/**\n * Catalog of payment methods with their hashes and supported currencies.\n */\nexport type PaymentMethodCatalog = Record<\n string,\n { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }\n>;\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/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(\n _chainId: number,\n env: RuntimeEnv = 'production',\n): PaymentMethodCatalog {\n const src = env === 'staging' ? baseStagingPaymentMethods : basePaymentMethods;\n const methods = (src?.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(\n _chainId: number,\n env: RuntimeEnv = 'production',\n): `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 // Base mainnet (production)\n return '0x396D31055Db28C0C6f36e8b36f18FE7227248a97' as `0x${string}`;\n}\n\nexport function getRateManagerContracts(\n chainId: number,\n env: RuntimeEnv = 'production',\n): {\n addresses: { registry: `0x${string}`; controller?: `0x${string}` };\n abis: { registry: Abi; controller?: Abi };\n} {\n const { addresses, abis } = getContracts(chainId, env);\n const registryAddress = addresses.rateManagerV1 ?? addresses.rateManagerRegistry;\n const registryAbi = abis.rateManagerV1 ?? abis.rateManagerRegistry;\n if (!registryAddress || !registryAbi) {\n throw new Error(`Rate manager contracts not available for chainId=${chainId}, env=${env}`);\n }\n const controllerAddress = addresses.rateManagerController;\n const controllerAbi = controllerAddress ? abis.rateManagerController : undefined;\n\n return {\n addresses: {\n registry: registryAddress,\n ...(controllerAddress ? { controller: controllerAddress } : {}),\n },\n abis: {\n registry: registryAbi,\n ...(controllerAbi ? { controller: controllerAbi } : {}),\n },\n };\n}\n","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(\n value: string,\n { hashIfAscii = false }: { hashIfAscii?: boolean } = {},\n): `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)\n 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 bytesToHex(padded);\n}\n","import { keccak256 as viemKeccak256 } from 'viem';\n\nexport const currencyKeccak256 = (inputString: string): string => {\n const bytes = new TextEncoder().encode(inputString);\n return viemKeccak256(bytes);\n};\n","import lookups from '@zkp2p/contracts-v2/paymentMethods/lookups.json';\n\n/**\n * Canonical payment-method hash map sourced from contracts.\n */\nexport const METHOD_NAME_TO_HASH = lookups.nameToHash;\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 } from './bytes32';\nimport { currencyKeccak256 } from './currencyKeccak256';\nimport { METHOD_NAME_TO_HASH } from './paymentMethodHashes';\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 baseStagingPaymentMethods from '@zkp2p/contracts-v2/paymentMethods/baseStaging';\n\ntype NetworkKey = 'base';\ntype RuntimeEnv = 'production' | 'preproduction' | 'staging';\n\nfunction getPaymentMethodMap(\n env: RuntimeEnv,\n _network: NetworkKey,\n): Record<string, { paymentMethodHash: `0x${string}` }> | null {\n if (env === 'staging') {\n const m = (baseStagingPaymentMethods?.methods ?? {}) as Record<\n string,\n { paymentMethodHash: `0x${string}` }\n >;\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')\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 (keccak256 hash).\n *\n * If the input is already a hex string (0x-prefixed), it's normalized to bytes32.\n * Otherwise, the currency code is hashed using keccak256.\n *\n * @param codeOrBytes - Currency code ('USD') or existing bytes32 hash\n * @returns bytes32 keccak256 hash of the currency code\n *\n * @example\n * ```typescript\n * const bytes = resolveFiatCurrencyBytes32('USD');\n * // Returns: 0xc4ae21aac0c6549d71dd96035b7e0bdb6c79ebdba8891b666115bc976d16a29e\n * ```\n */\nexport function resolveFiatCurrencyBytes32(codeOrBytes: string): `0x${string}` {\n if (codeOrBytes.startsWith('0x')) return ensureBytes32(codeOrBytes) as `0x${string}`;\n return currencyKeccak256(codeOrBytes.toUpperCase()) as `0x${string}`;\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 * If the processor is not found in the catalog, falls back to the known\n * protocol payment method hashes before throwing an error.\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 in catalog or fallback\n *\n * @example\n * ```typescript\n * import { getPaymentMethodsCatalog, resolvePaymentMethodHashFromCatalog } from '@zkp2p/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 // Fallback to known protocol payment method hashes when catalog is missing the entry\n const fallbackHash = METHOD_NAME_TO_HASH[key as keyof typeof METHOD_NAME_TO_HASH];\n if (fallbackHash) return fallbackHash as `0x${string}`;\n\n const available = Object.keys(catalog || {})\n .sort()\n .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 { currencyKeccak256 } from './currencyKeccak256';\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/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 BRL: 'BRL',\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/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: {\n currency: 'AED',\n currencyCode: 'AED',\n currencyName: 'United Arab Emirates Dirham',\n currencyCodeHash: currencyKeccak256('AED'),\n currencySymbol: 'د.إ',\n countryCode: 'ae',\n },\n ARS: {\n currency: 'ARS',\n currencyCode: 'ARS',\n currencyName: 'Argentine Peso',\n currencyCodeHash: currencyKeccak256('ARS'),\n currencySymbol: '$',\n countryCode: 'ar',\n },\n AUD: {\n currency: 'AUD',\n currencyCode: 'AUD',\n currencyName: 'Australian Dollar',\n currencyCodeHash: currencyKeccak256('AUD'),\n currencySymbol: 'A$',\n countryCode: 'au',\n },\n BRL: {\n currency: 'BRL',\n currencyCode: 'BRL',\n currencyName: 'Brazilian Real',\n currencyCodeHash: currencyKeccak256('BRL'),\n currencySymbol: 'R$',\n countryCode: 'br',\n },\n CAD: {\n currency: 'CAD',\n currencyCode: 'CAD',\n currencyName: 'Canadian Dollar',\n currencyCodeHash: currencyKeccak256('CAD'),\n currencySymbol: 'C$',\n countryCode: 'ca',\n },\n CHF: {\n currency: 'CHF',\n currencyCode: 'CHF',\n currencyName: 'Swiss Franc',\n currencyCodeHash: currencyKeccak256('CHF'),\n currencySymbol: 'Fr',\n countryCode: 'ch',\n },\n CNY: {\n currency: 'CNY',\n currencyCode: 'CNY',\n currencyName: 'Chinese Yuan',\n currencyCodeHash: currencyKeccak256('CNY'),\n currencySymbol: '¥',\n countryCode: 'cn',\n },\n CZK: {\n currency: 'CZK',\n currencyCode: 'CZK',\n currencyName: 'Czech Koruna',\n currencyCodeHash: currencyKeccak256('CZK'),\n currencySymbol: 'Kč',\n countryCode: 'cz',\n },\n DKK: {\n currency: 'DKK',\n currencyCode: 'DKK',\n currencyName: 'Danish Krone',\n currencyCodeHash: currencyKeccak256('DKK'),\n currencySymbol: 'kr',\n countryCode: 'dk',\n },\n EUR: {\n currency: 'EUR',\n currencyCode: 'EUR',\n currencyName: 'Euro',\n currencyCodeHash: currencyKeccak256('EUR'),\n currencySymbol: '€',\n countryCode: 'eu',\n },\n GBP: {\n currency: 'GBP',\n currencyCode: 'GBP',\n currencyName: 'British Pound',\n currencyCodeHash: currencyKeccak256('GBP'),\n currencySymbol: '£',\n countryCode: 'gb',\n },\n HKD: {\n currency: 'HKD',\n currencyCode: 'HKD',\n currencyName: 'Hong Kong Dollar',\n currencyCodeHash: currencyKeccak256('HKD'),\n currencySymbol: 'HK$',\n countryCode: 'hk',\n },\n HUF: {\n currency: 'HUF',\n currencyCode: 'HUF',\n currencyName: 'Hungarian Forint',\n currencyCodeHash: currencyKeccak256('HUF'),\n currencySymbol: 'Ft',\n countryCode: 'hu',\n },\n IDR: {\n currency: 'IDR',\n currencyCode: 'IDR',\n currencyName: 'Indonesian Rupiah',\n currencyCodeHash: currencyKeccak256('IDR'),\n currencySymbol: 'Rp',\n countryCode: 'id',\n },\n ILS: {\n currency: 'ILS',\n currencyCode: 'ILS',\n currencyName: 'Israeli New Shekel',\n currencyCodeHash: currencyKeccak256('ILS'),\n currencySymbol: '₪',\n countryCode: 'il',\n },\n INR: {\n currency: 'INR',\n currencyCode: 'INR',\n currencyName: 'Indian Rupee',\n currencyCodeHash: currencyKeccak256('INR'),\n currencySymbol: '₹',\n countryCode: 'in',\n },\n JPY: {\n currency: 'JPY',\n currencyCode: 'JPY',\n currencyName: 'Japanese Yen',\n currencyCodeHash: currencyKeccak256('JPY'),\n currencySymbol: '¥',\n countryCode: 'jp',\n },\n KES: {\n currency: 'KES',\n currencyCode: 'KES',\n currencyName: 'Kenyan Shilling',\n currencyCodeHash: currencyKeccak256('KES'),\n currencySymbol: 'KSh',\n countryCode: 'ke',\n },\n MXN: {\n currency: 'MXN',\n currencyCode: 'MXN',\n currencyName: 'Mexican Peso',\n currencyCodeHash: currencyKeccak256('MXN'),\n currencySymbol: '$',\n countryCode: 'mx',\n },\n MYR: {\n currency: 'MYR',\n currencyCode: 'MYR',\n currencyName: 'Malaysian Ringgit',\n currencyCodeHash: currencyKeccak256('MYR'),\n currencySymbol: 'RM',\n countryCode: 'my',\n },\n NOK: {\n currency: 'NOK',\n currencyCode: 'NOK',\n currencyName: 'Norwegian Krone',\n currencyCodeHash: currencyKeccak256('NOK'),\n currencySymbol: 'kr',\n countryCode: 'no',\n },\n NZD: {\n currency: 'NZD',\n currencyCode: 'NZD',\n currencyName: 'New Zealand Dollar',\n currencyCodeHash: currencyKeccak256('NZD'),\n currencySymbol: 'NZ$',\n countryCode: 'nz',\n },\n PHP: {\n currency: 'PHP',\n currencyCode: 'PHP',\n currencyName: 'Philippine Peso',\n currencyCodeHash: currencyKeccak256('PHP'),\n currencySymbol: '₱',\n countryCode: 'ph',\n },\n PLN: {\n currency: 'PLN',\n currencyCode: 'PLN',\n currencyName: 'Polish Złoty',\n currencyCodeHash: currencyKeccak256('PLN'),\n currencySymbol: 'zł',\n countryCode: 'pl',\n },\n RON: {\n currency: 'RON',\n currencyCode: 'RON',\n currencyName: 'Romanian Leu',\n currencyCodeHash: currencyKeccak256('RON'),\n currencySymbol: 'lei',\n countryCode: 'ro',\n },\n SAR: {\n currency: 'SAR',\n currencyCode: 'SAR',\n currencyName: 'Saudi Riyal',\n currencyCodeHash: currencyKeccak256('SAR'),\n currencySymbol: '﷼',\n countryCode: 'sa',\n },\n SEK: {\n currency: 'SEK',\n currencyCode: 'SEK',\n currencyName: 'Swedish Krona',\n currencyCodeHash: currencyKeccak256('SEK'),\n currencySymbol: 'kr',\n countryCode: 'se',\n },\n SGD: {\n currency: 'SGD',\n currencyCode: 'SGD',\n currencyName: 'Singapore Dollar',\n currencyCodeHash: currencyKeccak256('SGD'),\n currencySymbol: 'S$',\n countryCode: 'sg',\n },\n THB: {\n currency: 'THB',\n currencyCode: 'THB',\n currencyName: 'Thai Baht',\n currencyCodeHash: currencyKeccak256('THB'),\n currencySymbol: '฿',\n countryCode: 'th',\n },\n TRY: {\n currency: 'TRY',\n currencyCode: 'TRY',\n currencyName: 'Turkish Lira',\n currencyCodeHash: currencyKeccak256('TRY'),\n currencySymbol: '₺',\n countryCode: 'tr',\n },\n UGX: {\n currency: 'UGX',\n currencyCode: 'UGX',\n currencyName: 'Ugandan Shilling',\n currencyCodeHash: currencyKeccak256('UGX'),\n currencySymbol: 'USh',\n countryCode: 'ug',\n },\n USD: {\n currency: 'USD',\n currencyCode: 'USD',\n currencyName: 'United States Dollar',\n currencyCodeHash: currencyKeccak256('USD'),\n currencySymbol: '$',\n countryCode: 'us',\n },\n VND: {\n currency: 'VND',\n currencyCode: 'VND',\n currencyName: 'Vietnamese Dong',\n currencyCodeHash: currencyKeccak256('VND'),\n currencySymbol: '₫',\n countryCode: 'vn',\n },\n ZAR: {\n currency: 'ZAR',\n currencyCode: 'ZAR',\n currencyName: 'South African Rand',\n currencyCodeHash: currencyKeccak256('ZAR'),\n currencySymbol: 'R',\n countryCode: 'za',\n },\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(\n `conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`,\n );\n }\n return groups.map((group) =>\n group.map((r) => {\n const info = currencyInfo[r.currency as CurrencyType];\n if (!info?.currencyCodeHash) throw new Error('Invalid currency');\n return {\n code: info.currencyCodeHash as `0x${string}`,\n conversionRate: BigInt(r.conversionRate),\n };\n }),\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(\n `conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`,\n );\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","import { parseBigIntLike as toBigInt } from './bigint';\n\nexport type PV_ReferralFee = {\n recipient: `0x${string}`;\n fee: bigint;\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 retainOnEmpty: boolean;\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 referralFees: PV_ReferralFee[];\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\nfunction parseReferralFees(rawIntent: any): PV_ReferralFee[] {\n if (Array.isArray(rawIntent?.referralFees)) {\n return rawIntent.referralFees.map((fee: any) => ({\n recipient: (fee.recipient ?? '') as `0x${string}`,\n fee: toBigInt(fee.fee ?? 0),\n }));\n }\n\n const legacyRecipient = rawIntent?.referrer ?? '';\n const legacyFee = toBigInt(rawIntent?.referrerFee ?? 0);\n if (\n typeof legacyRecipient === 'string' &&\n legacyRecipient !== '' &&\n legacyRecipient !== '0x0000000000000000000000000000000000000000' &&\n legacyFee > 0n\n ) {\n return [{ recipient: legacyRecipient as `0x${string}`, fee: legacyFee }];\n }\n\n return [];\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 ?? 0),\n intentAmountRange: {\n min: toBigInt(raw.deposit.intentAmountRange?.min ?? 0),\n max: toBigInt(raw.deposit.intentAmountRange?.max ?? 0),\n },\n acceptingIntents: raw.deposit.acceptingIntents ?? false,\n remainingDeposits: toBigInt(raw.deposit.remainingDeposits ?? 0),\n outstandingIntentAmount: toBigInt(raw.deposit.outstandingIntentAmount ?? 0),\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 retainOnEmpty: raw.deposit.retainOnEmpty ?? false,\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 referralFees: parseReferralFees(raw.intent),\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(\n view: PV_DepositView,\n chainId: number,\n env: RuntimeEnv = 'production',\n) {\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(\n view: PV_IntentView,\n chainId: number,\n env: RuntimeEnv = 'production',\n) {\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","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseBigIntLike } from '../utils/bigint';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Address;\nexport const MIN_ORACLE_SPREAD_BPS = -32_768;\nexport const MAX_ORACLE_SPREAD_BPS = 32_767;\n\nexport type OracleRateConfigShape = {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n};\n\nexport const EMPTY_ORACLE_RATE_CONFIG: OracleRateConfigShape = {\n adapter: ZERO_ADDRESS,\n adapterConfig: '0x',\n spreadBps: 0,\n maxStaleness: 0,\n};\n\nexport const isValidHexAddress = (addr?: string | null): boolean => {\n if (typeof addr !== 'string') return false;\n return /^0x[0-9a-fA-F]{40}$/.test(addr);\n};\n\nexport const normalizeAddress = (addr?: string | null): Address | undefined => {\n if (!isValidHexAddress(addr)) return undefined;\n return addr as Address;\n};\n\nexport const parseEscrowAddressFromCompositeDepositId = (\n depositId: bigint | number | string,\n): Address | undefined => {\n if (typeof depositId !== 'string') return undefined;\n const parts = depositId.split('_');\n if (parts.length < 2) return undefined;\n const maybeEscrow = parts.length >= 3 ? parts[parts.length - 2] : parts[0];\n return normalizeAddress(maybeEscrow);\n};\n\nexport const parseRawDepositId = (depositId: bigint | number | string): bigint => {\n if (typeof depositId === 'bigint') return depositId;\n if (typeof depositId === 'number') return parseBigIntLike(depositId, 'Invalid deposit id');\n const parts = depositId.split('_');\n const raw = parts[parts.length - 1] ?? depositId;\n return parseBigIntLike(raw, 'Invalid deposit id');\n};\n\nexport const normalizeOracleRateConfig = (config: OracleRateConfigShape): OracleRateConfigShape => {\n const spreadBps = Number(config.spreadBps);\n if (\n !Number.isFinite(spreadBps) ||\n spreadBps < MIN_ORACLE_SPREAD_BPS ||\n spreadBps > MAX_ORACLE_SPREAD_BPS\n ) {\n throw new Error(\n `Oracle spreadBps must be between ${MIN_ORACLE_SPREAD_BPS} and ${MAX_ORACLE_SPREAD_BPS}`,\n );\n }\n\n const maxStaleness = Number(config.maxStaleness);\n if (!Number.isFinite(maxStaleness) || maxStaleness < 0 || maxStaleness > 4_294_967_295) {\n throw new Error('Oracle maxStaleness must be between 0 and 4294967295');\n }\n\n return {\n adapter: config.adapter,\n adapterConfig: config.adapterConfig,\n spreadBps: Math.round(spreadBps),\n maxStaleness: Math.round(maxStaleness),\n };\n};\n\nexport const escrowCurrencyHasOracleConfig = (abi: Abi | undefined): boolean => {\n if (!Array.isArray(abi)) return false;\n const fnNames = ['createDeposit', 'addPaymentMethods', 'addCurrencies'];\n for (const fnName of fnNames) {\n const fn = (abi as unknown as Array<Record<string, unknown>>).find(\n (item) => item.type === 'function' && item.name === fnName,\n );\n if (!fn) continue;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n const hasCurrencyOracle = (items: Array<Record<string, unknown>>): boolean => {\n for (const item of items) {\n const components = (item.components as Array<Record<string, unknown>> | undefined) ?? [];\n if (\n components.some((component) => component.name === 'code') &&\n components.some((component) => component.name === 'oracleRateConfig')\n ) {\n return true;\n }\n if (components.length > 0 && hasCurrencyOracle(components)) return true;\n }\n return false;\n };\n if (hasCurrencyOracle(inputs)) return true;\n }\n return false;\n};\n\nexport const normalizeCurrencyTuples = (\n currencies: Array<{\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: OracleRateConfigShape;\n }>,\n escrowAbi: Abi | undefined,\n): Array<Record<string, unknown>> => {\n const needsOracle = escrowCurrencyHasOracleConfig(escrowAbi);\n if (!needsOracle) {\n return currencies.map((currency) => ({\n code: currency.code,\n minConversionRate: currency.minConversionRate,\n }));\n }\n\n return currencies.map((currency) => ({\n code: currency.code,\n minConversionRate: currency.minConversionRate,\n oracleRateConfig: currency.oracleRateConfig\n ? normalizeOracleRateConfig(currency.oracleRateConfig)\n : EMPTY_ORACLE_RATE_CONFIG,\n }));\n};\n\nexport const getAbiFunction = (\n abi: Abi | undefined,\n ...names: string[]\n): Record<string, unknown> | null => {\n if (!Array.isArray(abi)) return null;\n for (const name of names) {\n const match = (abi as unknown as Array<Record<string, unknown>>).find(\n (item) => item.type === 'function' && item.name === name,\n );\n if (match) return match;\n }\n return null;\n};\n\nexport const resolveAbiFunctionName = (abi: Abi | undefined, names: string[]): string => {\n const match = getAbiFunction(abi, ...names);\n const resolved = match?.name;\n if (typeof resolved === 'string') return resolved;\n throw new Error(`Contract does not expose any of: ${names.join(', ')}`);\n};\n\nexport const abiTupleHasComponent = (\n abi: Abi | undefined,\n functionName: string,\n componentName: string,\n): boolean => {\n const fn = getAbiFunction(abi, functionName);\n const inputs = (fn?.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n const tupleInput = inputs.find((input) => input.type === 'tuple');\n const components = (tupleInput?.components as Array<Record<string, unknown>> | undefined) ?? [];\n return components.some((component) => component.name === componentName);\n};\n\nexport const abiFunctionHasInput = (\n abi: Abi | undefined,\n functionName: string,\n inputName: string,\n): boolean => {\n const fn = getAbiFunction(abi, functionName);\n const inputs = (fn?.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.some((input) => input.name === inputName);\n};\n\nexport const parseManagerFeeFromRead = (result: unknown): bigint => {\n if (Array.isArray(result)) {\n const candidate = result.length > 1 ? result[1] : result[0];\n return parseBigIntLike(candidate, 'Unexpected numeric response');\n }\n return parseBigIntLike(result, 'Unexpected numeric response');\n};\n","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseEscrowAddressFromCompositeDepositId } from './clientUtils';\n\nexport interface EscrowContractContext {\n address: Address;\n abi: Abi;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n version: 'v2';\n}\n\nexport interface OrchestratorContractContext {\n address: Address;\n abi: Abi;\n version: 'v2';\n}\n\nexport interface ContractRouterConfig {\n escrowAddress: Address;\n escrowAbi: Abi;\n escrowV2Address?: Address;\n escrowV2Abi?: Abi;\n escrowAddresses: Address[];\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n orchestratorV2Address?: Address;\n orchestratorV2Abi?: Abi;\n orchestratorAddresses: Address[];\n}\n\nconst isSameAddress = (left?: Address, right?: Address): boolean =>\n !!left && !!right && left.toLowerCase() === right.toLowerCase();\n\nexport class ContractRouter {\n private readonly _escrowContextsByAddress = new Map<string, EscrowContractContext>();\n private readonly _orchestratorContextsByAddress = new Map<string, OrchestratorContractContext>();\n\n readonly escrowAddress: Address;\n readonly escrowAbi: Abi;\n readonly escrowV2Address?: Address;\n readonly escrowV2Abi?: Abi;\n readonly escrowAddresses: Address[];\n readonly orchestratorAddress?: Address;\n readonly orchestratorAbi?: Abi;\n readonly orchestratorV2Address?: Address;\n readonly orchestratorV2Abi?: Abi;\n readonly orchestratorAddresses: Address[];\n\n constructor(config: ContractRouterConfig) {\n this.escrowAddress = config.escrowAddress;\n this.escrowAbi = config.escrowAbi;\n this.escrowV2Address = config.escrowV2Address;\n this.escrowV2Abi = config.escrowV2Abi;\n this.escrowAddresses = config.escrowAddresses;\n this.orchestratorAddress = config.orchestratorAddress;\n this.orchestratorAbi = config.orchestratorAbi;\n this.orchestratorV2Address = config.orchestratorV2Address;\n this.orchestratorV2Abi = config.orchestratorV2Abi;\n this.orchestratorAddresses = config.orchestratorAddresses;\n\n this._registerContexts();\n }\n\n private _registerContexts(): void {\n const registerOrchestrator = (context: OrchestratorContractContext | null | undefined) => {\n if (!context?.address || !context.abi) return;\n this._orchestratorContextsByAddress.set(context.address.toLowerCase(), context);\n };\n\n const registerEscrow = (context: EscrowContractContext | null | undefined) => {\n if (!context?.address || !context.abi) return;\n this._escrowContextsByAddress.set(context.address.toLowerCase(), context);\n };\n\n const primaryOrchestratorAddress = this.orchestratorV2Address ?? this.orchestratorAddress;\n const primaryEscrowAbi = this.escrowV2Abi ?? this.escrowAbi;\n\n const escrowToOrchestrator = new Map<string, Address>();\n const addEscrowOrchestratorPair = (escrow?: Address, orchestrator?: Address) => {\n if (!escrow || !orchestrator) return;\n escrowToOrchestrator.set(escrow.toLowerCase(), orchestrator);\n };\n\n addEscrowOrchestratorPair(\n this.escrowV2Address ?? this.escrowAddress,\n primaryOrchestratorAddress,\n );\n\n const configuredPairCount = Math.min(\n this.escrowAddresses.length,\n this.orchestratorAddresses.length,\n );\n for (let index = 0; index < configuredPairCount; index += 1) {\n addEscrowOrchestratorPair(this.escrowAddresses[index], this.orchestratorAddresses[index]);\n }\n\n const resolveOrchestratorAbi = (address?: Address): Abi | undefined =>\n this.getOrchestratorContextByAddress(address)?.abi ??\n (isSameAddress(address, this.orchestratorV2Address)\n ? (this.orchestratorV2Abi ?? this.orchestratorAbi)\n : (this.orchestratorAbi ?? this.orchestratorV2Abi));\n\n const uniqueOrchestratorAddresses = new Set<string>();\n for (const address of [\n primaryOrchestratorAddress,\n this.orchestratorAddress,\n this.orchestratorV2Address,\n ...this.orchestratorAddresses,\n ]) {\n if (!address) continue;\n const key = address.toLowerCase();\n if (uniqueOrchestratorAddresses.has(key)) continue;\n uniqueOrchestratorAddresses.add(key);\n const abi = isSameAddress(address, this.orchestratorV2Address)\n ? (this.orchestratorV2Abi ?? this.orchestratorAbi)\n : (this.orchestratorAbi ?? this.orchestratorV2Abi);\n if (!abi) continue;\n registerOrchestrator({\n address,\n abi,\n version: 'v2',\n });\n }\n\n const uniqueEscrowAddresses = new Set<string>();\n for (const address of [\n this.escrowV2Address ?? this.escrowAddress,\n this.escrowAddress,\n ...this.escrowAddresses,\n ]) {\n if (!address) continue;\n const key = address.toLowerCase();\n if (uniqueEscrowAddresses.has(key)) continue;\n uniqueEscrowAddresses.add(key);\n const orchestratorAddress =\n escrowToOrchestrator.get(key) ?? primaryOrchestratorAddress ?? this.orchestratorAddress;\n registerEscrow({\n address,\n abi: isSameAddress(address, this.escrowV2Address) ? primaryEscrowAbi : this.escrowAbi,\n orchestratorAddress,\n orchestratorAbi: resolveOrchestratorAbi(orchestratorAddress),\n version: 'v2',\n });\n }\n }\n\n getEscrowContextByAddress(address?: Address): EscrowContractContext | undefined {\n if (!address) return undefined;\n return this._escrowContextsByAddress.get(address.toLowerCase());\n }\n\n getOrchestratorContextByAddress(address?: Address): OrchestratorContractContext | undefined {\n if (!address) return undefined;\n return this._orchestratorContextsByAddress.get(address.toLowerCase());\n }\n\n resolveEscrowContext(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n }): EscrowContractContext {\n const explicitEscrow =\n options?.escrowAddress ??\n (options?.depositId !== undefined\n ? parseEscrowAddressFromCompositeDepositId(options.depositId)\n : undefined);\n\n if (explicitEscrow) {\n const explicitContext = this.getEscrowContextByAddress(explicitEscrow);\n if (explicitContext) return explicitContext;\n\n const fallbackOrchestrator = this.resolveOrchestratorForEscrow(explicitEscrow);\n return {\n address: explicitEscrow,\n abi: this.escrowV2Abi ?? this.escrowAbi,\n orchestratorAddress:\n fallbackOrchestrator?.address ?? this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi:\n fallbackOrchestrator?.abi ?? this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n };\n }\n\n return (\n this.getEscrowContextByAddress(this.escrowAddress) ?? {\n address: this.escrowAddress,\n abi: this.escrowAbi,\n orchestratorAddress: this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi: this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n }\n );\n }\n\n getEscrowContexts(): EscrowContractContext[] {\n const contexts = Array.from(this._escrowContextsByAddress.values());\n if (contexts.length > 0) return contexts;\n return [\n {\n address: this.escrowAddress,\n abi: this.escrowAbi,\n orchestratorAddress: this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi: this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n },\n ];\n }\n\n resolveOrchestratorForEscrow(\n escrowAddress?: Address,\n _preferV2 = false,\n ): OrchestratorContractContext | undefined {\n if (escrowAddress) {\n const escrowContext = this.getEscrowContextByAddress(escrowAddress);\n const fromEscrow = this.getOrchestratorContextByAddress(escrowContext?.orchestratorAddress);\n if (fromEscrow) return fromEscrow;\n }\n\n if (this.orchestratorV2Address) {\n const primary = this.getOrchestratorContextByAddress(this.orchestratorV2Address);\n if (primary) return primary;\n }\n\n if (this.orchestratorAddress) {\n const primary = this.getOrchestratorContextByAddress(this.orchestratorAddress);\n if (primary) return primary;\n }\n\n for (const address of this.orchestratorAddresses) {\n const context = this.getOrchestratorContextByAddress(address);\n if (context) return context;\n }\n\n if (this.orchestratorV2Address && this.orchestratorV2Abi) {\n return {\n address: this.orchestratorV2Address,\n abi: this.orchestratorV2Abi,\n version: 'v2',\n };\n }\n\n if (this.orchestratorAddress && this.orchestratorAbi) {\n return {\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n version: 'v2',\n };\n }\n\n return undefined;\n }\n\n buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): Array<{ escrow: Address; orchestrator: Address }> {\n const contexts: Array<{ escrow: Address; orchestrator: Address }> = [];\n const seen = new Set<string>();\n const add = (escrow?: Address, orchestrator?: Address) => {\n if (!escrow || !orchestrator) return;\n const key = `${escrow.toLowerCase()}:${orchestrator.toLowerCase()}`;\n if (seen.has(key)) return;\n seen.add(key);\n contexts.push({ escrow, orchestrator });\n };\n\n add(options?.escrowAddress, options?.orchestratorAddress);\n if (options?.escrowAddress && !options?.orchestratorAddress) {\n add(options.escrowAddress, this.resolveOrchestratorForEscrow(options.escrowAddress)?.address);\n }\n\n for (const context of this.getEscrowContexts()) {\n add(\n context.address,\n context.orchestratorAddress ?? this.resolveOrchestratorForEscrow(context.address)?.address,\n );\n }\n\n return contexts;\n }\n\n get defaultPreferV2(): boolean {\n return true;\n }\n}\n\nexport { parseEscrowAddressFromCompositeDepositId };\n","import type { Address } from 'viem';\nimport { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\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; preIntentHookData?: string };\n signatureExpiration?: string;\n };\n statusCode: number;\n};\n\nexport type SignIntentV3ReferralFee = {\n recipient: Address;\n fee: string;\n};\n\nexport type SignIntentV3Request = SignIntentV2Request & {\n callerAddress: Address; // wallet that will call signalIntent on-chain\n referralFees: SignIntentV3ReferralFee[];\n};\n\ntype SignIntentApiOptions = {\n baseApiUrl: string;\n apiKey?: string;\n authorizationToken?: string;\n timeoutMs?: number;\n};\n\nfunction createHeaders(apiKey?: string, authorizationToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['x-api-key'] = apiKey;\n if (authorizationToken)\n headers['Authorization'] = authorizationToken.startsWith('Bearer ')\n ? authorizationToken\n : `Bearer ${authorizationToken}`;\n return headers;\n}\n\nasync function postSignIntentWithRetry<T>(\n endpoint: '/v2/verify/intent' | '/v3/intent',\n request: SignIntentV2Request | SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<T> {\n const url = `${opts.baseApiUrl.replace(/\\/$/, '')}${endpoint}`;\n\n return withRetry(\n async () => {\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: createHeaders(opts.apiKey, opts.authorizationToken),\n body: JSON.stringify(request),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', { endpoint, error });\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw parseAPIError(res, text);\n }\n\n return (await res.json()) as T;\n },\n 3,\n 1000,\n opts.timeoutMs,\n );\n}\n\nexport async function apiSignIntentV3(\n request: SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<{\n signature: `0x${string}`;\n signatureExpiration: bigint;\n preIntentHookData?: `0x${string}`;\n}> {\n const json = await postSignIntentWithRetry<SignIntentV2Response>('/v3/intent', request, opts);\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr =\n json?.responseObject?.intentData?.signatureExpiration ??\n json?.responseObject?.signatureExpiration;\n const preIntentHookData =\n (json?.responseObject?.intentData as { preIntentHookData?: string } | undefined)\n ?.preIntentHookData ??\n (json?.responseObject as { preIntentHookData?: string } | undefined)?.preIntentHookData;\n if (!sig || !expStr) throw new Error('v3/intent missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\n };\n}\n\nexport async function apiSignIntentV2(\n request: SignIntentV2Request,\n opts: SignIntentApiOptions,\n): Promise<{\n signature: `0x${string}`;\n signatureExpiration: bigint;\n preIntentHookData?: `0x${string}`;\n}> {\n const json = await postSignIntentWithRetry<SignIntentV2Response>(\n '/v2/verify/intent',\n request,\n opts,\n );\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr =\n json?.responseObject?.intentData?.signatureExpiration ??\n json?.responseObject?.signatureExpiration;\n const preIntentHookData =\n (json?.responseObject?.intentData as { preIntentHookData?: string } | undefined)\n ?.preIntentHookData ??\n (json?.responseObject as { preIntentHookData?: string } | undefined)?.preIntentHookData;\n if (!sig || !expStr) throw new Error('verify/intent missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\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 { 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 { 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 { ReferrerFeeConfig } from './types';\n\nconst evmAddressRegex = /^0x[a-fA-F0-9]{40}$/;\n\nexport const isValidReferrerFeeRecipient = (value: string): value is `0x${string}` =>\n evmAddressRegex.test(value);\n\nexport const isValidReferrerFeeBps = (value: number): boolean =>\n Number.isInteger(value) && value >= 0 && value <= 10000;\n\nexport const assertValidReferrerFeeConfig = (\n config: ReferrerFeeConfig | undefined,\n context: 'getQuote' | 'signalIntent',\n): ReferrerFeeConfig | undefined => {\n if (!config) {\n return undefined;\n }\n\n if (!isValidReferrerFeeRecipient(config.recipient)) {\n throw new Error(`${context} referrerFeeConfig.recipient must be a valid 0x address.`);\n }\n\n if (!isValidReferrerFeeBps(config.feeBps)) {\n throw new Error(`${context} referrerFeeConfig.feeBps must be an integer between 0 and 10000.`);\n }\n\n return config;\n};\n\nexport const parseReferrerFeeConfig = (\n recipient: string | null | undefined,\n feeBpsValue: string | number | null | undefined,\n): ReferrerFeeConfig | null => {\n const normalizedRecipient = recipient?.trim();\n if (!normalizedRecipient || feeBpsValue === null || feeBpsValue === undefined) {\n return null;\n }\n\n if (!isValidReferrerFeeRecipient(normalizedRecipient)) {\n return null;\n }\n\n const feeBps = typeof feeBpsValue === 'number' ? feeBpsValue : Number(feeBpsValue.trim());\n if (!isValidReferrerFeeBps(feeBps)) {\n return null;\n }\n\n return {\n recipient: normalizedRecipient,\n feeBps,\n };\n};\n\nexport const referrerFeeConfigToPreciseUnits = (config: ReferrerFeeConfig): bigint =>\n BigInt(config.feeBps) * 100000000000000n;\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 * Encode a contract call with ERC-8021 attribution suffix.\n *\n * This function encodes function data and appends the attribution suffix\n * without sending the transaction. Use this when you need the calldata\n * for relayer submission or inspection.\n *\n * @param request - The request with abi, functionName, args\n * @param referrer - Optional referrer code(s) to prepend before the base builder code\n * @returns Encoded calldata with attribution suffix\n *\n * @example\n * ```typescript\n * const calldata = encodeWithAttribution({\n * abi: escrowAbi,\n * functionName: 'signalIntent',\n * args: [intentParams],\n * }, 'zkp2p-ios');\n *\n * // Submit via relayer\n * await relayer.submit({ to: escrowAddress, data: calldata });\n * ```\n */\nexport function encodeWithAttribution(\n request: Pick<AttributionRequest, 'abi' | 'functionName' | 'args'>,\n referrer?: string | string[]\n): Hex {\n const functionData = encodeFunctionData({\n abi: request.abi,\n functionName: request.functionName as any,\n args: request.args || [],\n });\n return appendAttributionToCalldata(functionData, referrer);\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","import type { Address, Hash, PublicClient, WalletClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext, OrchestratorContractContext } from './ContractRouter';\nimport { ZERO_ADDRESS, parseRawDepositId, resolveAbiFunctionName } from './clientUtils';\nimport { apiSignIntentV2, apiSignIntentV3 } from '../adapters/verification';\nimport { apiCreatePaymentAttestation } from '../adapters/attestation';\nimport {\n encodeAddressAsBytes,\n encodePaymentAttestation,\n encodeVerifyPaymentData,\n} from '../utils/encode';\nimport {\n assertValidReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n} from '../referrerFeeConfig';\nimport { encodeWithAttribution } from '../utils/attribution';\nimport { getPaymentMethodsCatalog } from '../contracts';\nimport {\n resolveFiatCurrencyBytes32,\n resolvePaymentMethodHashFromCatalog,\n resolvePaymentMethodNameFromHash,\n} from '../utils/paymentResolution';\nimport { resolvePlatformAttestationConfig } from '../constants';\nimport type { RuntimeEnv } from '../contracts';\nimport { IndexerClient } from '../indexer/client';\nimport { logger } from '../utils/logger';\nimport { IndexerDepositService } from '../indexer/service';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\nimport type { PV_IntentView, PV_PaymentMethodData } from '../utils/protocolViewerParsers';\n\ntype SignalIntentParams = {\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 referralFees?: Array<{ recipient: Address; fee: bigint | string }>;\n referrer?: Address;\n referrerFee?: bigint | string;\n referrerFeeConfig?: { recipient: Address; feeBps: number };\n postIntentHook?: Address;\n preIntentHookData?: `0x${string}`;\n data?: `0x${string}`;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n gatingServiceSignature?: `0x${string}`;\n signatureExpiration?: bigint | string;\n txOverrides?: TxOverrides;\n};\n\ntype CancelIntentParams = {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n};\n\ntype ReleaseFundsParams = {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n};\n\ntype FulfillIntentParams = {\n intentHash: `0x${string}`;\n proof: Record<string, unknown> | string;\n timestampBufferMs?: string;\n attestationServiceUrl?: string;\n orchestratorAddress?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n precomputedAttestation?: {\n paymentProof: Address;\n verificationData: Address;\n };\n callbacks?: {\n onAttestationStart?: () => void;\n onTxSent?: (hash: Hash) => void;\n onTxMined?: (hash: Hash) => void;\n };\n};\n\ninterface IntentOperationsHost {\n resolveEscrowContext: (options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }) => EscrowContractContext;\n resolveOrchestratorContext: (options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n preferV2?: boolean;\n }) => Promise<OrchestratorContractContext>;\n resolveEscrowAddressOrThrow: (\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\n options?: { preferV2?: boolean },\n ) => Address;\n prepareResolvedOrchestratorTransaction: (opts: {\n orchestrator: OrchestratorContractContext;\n functionNames: string[];\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }) => PreparedTransactionWithAbi;\n getFulfillIntentInputs: (intentHash: `0x${string}`) => Promise<{\n amount: string;\n fiatCurrency: `0x${string}`;\n conversionRate: string;\n payeeDetails: `0x${string}`;\n intentTimestampMs: string;\n paymentMethodHash: `0x${string}`;\n paymentVerifier?: `0x${string}`;\n }>;\n getPvIntent: (intentHash: `0x${string}`) => Promise<PV_IntentView>;\n}\n\nexport interface IntentOperationsConfig {\n getWalletClient: () => WalletClient;\n getPublicClient: () => PublicClient;\n getChainId: () => number;\n getRuntimeEnv: () => RuntimeEnv;\n getBaseApiUrl: () => string | undefined;\n getApiKey: () => string | undefined;\n getAuthorizationToken: () => string | undefined;\n getApiTimeoutMs: () => number;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getIndexerClient: () => IndexerClient;\n getIndexerService: () => IndexerDepositService;\n getDefaultPreferV2: () => boolean;\n host: IntentOperationsHost;\n}\n\nexport class IntentOperations {\n constructor(private readonly config: IntentOperationsConfig) {}\n\n async prepareSignalIntent(params: SignalIntentParams): Promise<PreparedTransactionWithAbi> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(\n params.referrerFeeConfig,\n 'signalIntent',\n );\n if (\n referrerFeeConfig &&\n (params.referralFees !== undefined ||\n params.referrer !== undefined ||\n params.referrerFee !== undefined)\n ) {\n throw new Error(\n 'signalIntent referrerFeeConfig cannot be combined with referralFees, referrer, or referrerFee.',\n );\n }\n\n const preferV2 = this.config.getDefaultPreferV2();\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2,\n });\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: escrowContext.address,\n preferV2,\n });\n const catalog = getPaymentMethodsCatalog(this.config.getChainId(), this.config.getRuntimeEnv());\n const paymentMethod = resolvePaymentMethodHashFromCatalog(params.processorName, catalog);\n const fiatCurrency = resolveFiatCurrencyBytes32(params.fiatCurrencyCode);\n const depositId = parseRawDepositId(params.depositId);\n const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);\n const conversionRate =\n typeof params.conversionRate === 'bigint'\n ? params.conversionRate\n : BigInt(params.conversionRate);\n const referralFees =\n referrerFeeConfig !== undefined\n ? [\n {\n recipient: referrerFeeConfig.recipient,\n fee: referrerFeeConfigToPreciseUnits(referrerFeeConfig),\n },\n ]\n : normalizeSignalIntentReferralFees(params);\n\n let { gatingServiceSignature, signatureExpiration } = params;\n let preIntentHookData = params.preIntentHookData;\n const baseApiUrl = this.config.getBaseApiUrl();\n const apiKey = this.config.getApiKey();\n const authorizationToken = this.config.getAuthorizationToken();\n if (\n (!gatingServiceSignature || !signatureExpiration) &&\n baseApiUrl &&\n (apiKey || authorizationToken)\n ) {\n const baseRequest = {\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.config.getChainId().toString(),\n orchestratorAddress: orchestratorContext.address,\n escrowAddress: escrowContext.address,\n };\n const apiOpts = {\n baseApiUrl,\n apiKey,\n authorizationToken,\n timeoutMs: this.config.getApiTimeoutMs(),\n };\n\n const response =\n orchestratorContext.version === 'v2'\n ? await apiSignIntentV3(\n {\n ...baseRequest,\n callerAddress: this.config.getWalletClient().account!.address,\n referralFees: referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: referralFee.fee.toString(),\n })),\n },\n apiOpts,\n )\n : await apiSignIntentV2(baseRequest, apiOpts);\n\n gatingServiceSignature = response.signature;\n signatureExpiration = response.signatureExpiration;\n preIntentHookData = response.preIntentHookData ?? preIntentHookData;\n }\n\n if (!gatingServiceSignature || !signatureExpiration) {\n throw new Error('Missing gatingServiceSignature/signatureExpiration');\n }\n\n const commonFields = {\n escrow: escrowContext.address,\n depositId,\n amount,\n to: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate,\n gatingServiceSignature,\n signatureExpiration:\n typeof signatureExpiration === 'bigint' ? signatureExpiration : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n };\n\n const args =\n orchestratorContext.version === 'v2'\n ? [\n {\n ...commonFields,\n referralFees,\n preIntentHookData: (preIntentHookData ?? '0x') as `0x${string}`,\n },\n ]\n : [\n {\n ...commonFields,\n referrer: (referralFees[0]?.recipient ?? ZERO_ADDRESS) as Address,\n referrerFee: referralFees[0]?.fee ?? 0n,\n },\n ];\n\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'signalIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'signalIntent',\n args,\n };\n }\n\n async prepareCancelIntent(params: CancelIntentParams): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash: params.intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n const args = [params.intentHash];\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'cancelIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'cancelIntent',\n args,\n };\n }\n\n async prepareReleaseFundsToPayer(\n params: ReleaseFundsParams,\n ): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash: params.intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const args = [params.intentHash];\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'releaseFundsToPayer',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'releaseFundsToPayer',\n args,\n };\n }\n\n async prepareSetDepositPreIntentHook(params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n params.escrowAddress,\n params.depositId,\n 'setDepositPreIntentHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['setDepositPreIntentHook'],\n args: [escrowAddress, parseRawDepositId(params.depositId), params.preIntentHook],\n txOverrides: params.txOverrides,\n });\n }\n\n async prepareSetDepositWhitelistHook(params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n params.escrowAddress,\n params.depositId,\n 'setDepositWhitelistHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['setDepositWhitelistHook'],\n args: [escrowAddress, parseRawDepositId(params.depositId), params.whitelistHook],\n txOverrides: params.txOverrides,\n });\n }\n\n async prepareCleanupOrphanedIntents(params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['cleanupOrphanedIntents'],\n args: [params.intentHashes],\n txOverrides: params.txOverrides,\n });\n }\n\n async getDepositPreIntentHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n options?.escrowAddress,\n depositId,\n 'getDepositPreIntentHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const functionName = resolveAbiFunctionName(orchestratorContext.abi, [\n 'getDepositPreIntentHook',\n ]);\n return (await this.config.getPublicClient().readContract({\n address: orchestratorContext.address,\n abi: orchestratorContext.abi,\n functionName,\n args: [escrowAddress, parseRawDepositId(depositId)],\n })) as Address;\n }\n\n async getDepositWhitelistHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n options?.escrowAddress,\n depositId,\n 'getDepositWhitelistHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const functionName = resolveAbiFunctionName(orchestratorContext.abi, [\n 'getDepositWhitelistHook',\n ]);\n return (await this.config.getPublicClient().readContract({\n address: orchestratorContext.address,\n abi: orchestratorContext.abi,\n functionName,\n args: [escrowAddress, parseRawDepositId(depositId)],\n })) as Address;\n }\n\n async prepareFulfillIntent(params: FulfillIntentParams): Promise<PreparedTransactionWithAbi> {\n const intentHash = params.intentHash;\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const precomputed = params.precomputedAttestation;\n let paymentProof: Address;\n let verificationData: Address;\n\n if (precomputed) {\n if (!precomputed.paymentProof || !precomputed.verificationData) {\n throw new Error('Precomputed attestation requires both proof and verification data');\n }\n\n paymentProof = precomputed.paymentProof;\n verificationData = precomputed.verificationData;\n } else {\n const attestationServiceUrl =\n params.attestationServiceUrl ?? this.defaultAttestationService();\n const inputs = await this.config.host.getFulfillIntentInputs(intentHash);\n const paymentMethodHash = inputs.paymentMethodHash || '0x';\n\n const catalog = getPaymentMethodsCatalog(\n this.config.getChainId(),\n this.config.getRuntimeEnv(),\n );\n const platformName = resolvePaymentMethodNameFromHash(paymentMethodHash, catalog);\n if (!platformName) {\n throw new Error('Unknown paymentMethodHash for this network/env; update SDK catalogs.');\n }\n const platformConfig = resolvePlatformAttestationConfig(platformName);\n\n const zkTlsProof =\n typeof params.proof === 'string' ? params.proof : serializeProofInput(params.proof);\n const payload = {\n proofType: 'reclaim',\n proof: zkTlsProof,\n chainId: this.config.getChainId(),\n intent: {\n intentHash,\n amount: inputs.amount,\n timestampMs: inputs.intentTimestampMs,\n paymentMethod: paymentMethodHash,\n fiatCurrency: inputs.fiatCurrency,\n conversionRate: inputs.conversionRate,\n payeeDetails: inputs.payeeDetails,\n timestampBufferMs: params.timestampBufferMs ?? '300000',\n },\n } as Record<string, unknown>;\n\n const attestation = await apiCreatePaymentAttestation(\n payload,\n attestationServiceUrl,\n platformConfig.actionPlatform,\n platformConfig.actionType,\n );\n paymentProof = encodePaymentAttestation(attestation);\n verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(attestation.responseObject.signer),\n });\n }\n\n const args = [\n {\n paymentProof,\n intentHash,\n verificationData,\n postIntentHookData: (params.postIntentHookData ?? '0x') as `0x${string}`,\n },\n ];\n\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'fulfillIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'fulfillIntent',\n args,\n };\n }\n\n defaultAttestationService(): string {\n return this.config.getRuntimeEnv() === 'staging'\n ? 'https://attestation-service-staging.zkp2p.xyz'\n : 'https://attestation-service.zkp2p.xyz';\n }\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;\n paymentMethodHash: `0x${string}`;\n paymentVerifier?: `0x${string}`;\n }> {\n try {\n if (this.config.getProtocolViewerAddress() && this.config.getProtocolViewerAbi()) {\n const view = await this.config.host.getPvIntent(intentHash);\n const paymentMethodHash = (view.intent.paymentMethod as string).toLowerCase();\n const matched = (view.deposit.paymentMethods || []).find(\n (pm: PV_PaymentMethodData) =>\n (pm.paymentMethod as string)?.toLowerCase?.() === paymentMethodHash,\n );\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) * 1000n).toString(),\n paymentMethodHash: view.intent.paymentMethod as `0x${string}`,\n };\n }\n }\n } catch (error) {\n logger.debug('ProtocolViewer lookup failed, falling back to indexer', {\n intentHash,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const response = await this.config.getIndexerClient().query<{\n Intent?: Array<{\n amount: string;\n fiatCurrency: string;\n conversionRate: string;\n paymentMethodHash?: string | null;\n depositId: string;\n signalTimestamp?: string;\n verifier?: string | null;\n }>;\n }>({\n 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 verifier\n }\n }\n `,\n variables: { hash: intentHash.toLowerCase() },\n });\n const record = response?.Intent?.[0];\n if (!record) throw new Error('Intent not found on indexer');\n if (!record.signalTimestamp) throw new Error('Intent signal timestamp not found on indexer');\n const deposit = await this.config\n .getIndexerService()\n .fetchDepositWithRelations(record.depositId, {\n includeIntents: false,\n });\n let payee: string | undefined;\n const paymentMethodHashLower = (record.paymentMethodHash || '').toLowerCase();\n for (const paymentMethod of deposit?.paymentMethods || []) {\n if ((paymentMethod.paymentMethodHash || '').toLowerCase() === paymentMethodHashLower) {\n payee = paymentMethod.payeeDetailsHash;\n break;\n }\n }\n if (!payee) throw new Error('Payee details not found for intent');\n return {\n amount: record.amount,\n fiatCurrency: record.fiatCurrency as `0x${string}`,\n conversionRate: record.conversionRate,\n payeeDetails: payee as `0x${string}`,\n intentTimestampMs: (BigInt(record.signalTimestamp) * 1000n).toString(),\n paymentMethodHash: (record.paymentMethodHash ||\n '0x0000000000000000000000000000000000000000000000000000000000000000') as `0x${string}`,\n paymentVerifier: (record.verifier as `0x${string}`) || undefined,\n };\n }\n}\n\nfunction serializeProofInput(proof: Record<string, unknown>): string {\n return JSON.stringify(proof, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n );\n}\n\n/** @internal exported for testing */\nexport function normalizeSignalIntentReferralFees(\n params: Pick<SignalIntentParams, 'referralFees' | 'referrer' | 'referrerFee'>,\n): Array<{ recipient: Address; fee: bigint }> {\n if (params.referralFees) {\n return params.referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: typeof referralFee.fee === 'bigint' ? referralFee.fee : BigInt(referralFee.fee),\n }));\n }\n\n if (params.referrer && params.referrer.toLowerCase() !== ZERO_ADDRESS.toLowerCase()) {\n const fee =\n params.referrerFee === undefined\n ? 0n\n : typeof params.referrerFee === 'bigint'\n ? params.referrerFee\n : BigInt(params.referrerFee);\n return [{ recipient: params.referrer, fee }];\n }\n\n return [];\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 AuthorizationTokenProvider = () =>\n | string\n | null\n | undefined\n | Promise<string | null | undefined>;\n\nexport type Zkp2pClientOptions = {\n walletClient: WalletClient;\n /** Curator API key for authenticated endpoints (optional for basic deposit/payee flows) */\n apiKey?: string;\n chainId: number;\n /** Runtime environment (defaults to 'production') */\n runtimeEnv?: 'production' | 'preproduction' | 'staging';\n /**\n * @deprecated Use `runtimeEnv` instead. Kept for backward compatibility.\n */\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 async token provider for indexer auth in long-lived clients */\n getAuthorizationToken?: AuthorizationTokenProvider;\n /** Optional API key for indexer proxy authentication */\n indexerApiKey?: string;\n /** Optional indexer URL override */\n indexerUrl?: 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\nexport type ReferrerFeeConfig = {\n recipient: `0x${string}`;\n feeBps: number;\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 /** 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 /** Encoded pre-intent hook payload */\n preIntentHookData?: 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 referrerFeeConfig?: ReferrerFeeConfig;\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 = {\n currencyCode: string;\n currencyName: string;\n currencySymbol: string;\n countryCode: string;\n};\nexport type TokenResponse = {\n token: string;\n decimals: number;\n name: string;\n symbol: string;\n chainId: number;\n};\n/**\n * Intent details within a quote response\n */\nexport type QuoteIntentResponse = {\n /** Deposit ID */\n depositId: number;\n /** Escrow contract address */\n escrowAddress: string;\n /** Orchestrator address used for signaling this intent */\n orchestratorAddress?: 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 takerConversionRate?: string;\n intent: QuoteIntentResponse;\n payeeData?: Record<string, string>;\n};\n\nexport type GetQuoteSingleResponse = QuoteSingleResponse & {\n referrerFeeAmount?: string;\n referrerFeeAmountFormatted?: string;\n referrerFeeBps?: number;\n /** Gross token amount to use when calling signalIntent with the same fee config */\n signalIntentAmount?: string;\n signalIntentAmountFormatted?: string;\n};\nexport type QuoteFeesResponse = {\n zkp2pFee: string;\n zkp2pFeeFormatted: string;\n swapFee: string;\n swapFeeFormatted: string;\n};\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 GetNearbyQuote = Omit<NearbyQuote, 'quote'> & {\n quote: GetQuoteSingleResponse;\n};\n\nexport type GetNearbySuggestions = {\n below: GetNearbyQuote[];\n above: GetNearbyQuote[];\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 GetQuoteResponseObject = Omit<QuoteResponseObject, 'quotes' | 'nearbySuggestions'> & {\n quotes: GetQuoteSingleResponse[];\n nearbySuggestions?: GetNearbySuggestions;\n};\n\nexport type QuoteResponse = {\n message: string;\n success: boolean;\n responseObject: QuoteResponseObject;\n statusCode: number;\n};\n\nexport type GetQuoteResponse = Omit<QuoteResponse, 'responseObject'> & {\n responseObject: GetQuoteResponseObject;\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\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 = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: `0x${string}`;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n};\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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: DepositVerifierData[];\n currenciesOverride?: OnchainCurrency[][];\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// 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 escrowAddress: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: 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 escrowAddress: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: 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 escrowAddress?: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: string[];\n};\n\nexport type GetIntentByHashResponse = {\n success: boolean;\n message: string;\n responseObject: Intent;\n statusCode: number;\n};\n\n// Deposit response types kept for compatibility with older adapter consumers.\nexport type DepositVerifierCurrency = {\n id?: number;\n depositVerifierId?: number;\n currencyCode: string;\n conversionRate: string;\n minConversionRate?: string;\n managerRate?: string | null;\n rateManagerId?: string | null;\n createdAt?: Date;\n updatedAt?: Date;\n};\nexport type DepositVerifier = {\n id?: number;\n depositId: number;\n verifier: string;\n methodHash?: string;\n intentGatingService: string;\n payeeDetailsHash: string;\n data: string;\n createdAt?: Date;\n updatedAt?: Date;\n currencies: DepositVerifierCurrency[];\n};\nexport type ApiDeposit = {\n id: number;\n depositor: string;\n token: string;\n rateManagerId?: string | null;\n rateManagerRegistry?: string | null;\n vaultName?: string | null;\n amount: string;\n remainingDeposits: string;\n intentAmountMin: string;\n intentAmountMax: string;\n acceptingIntents: boolean;\n outstandingIntentAmount: string;\n totalAmountTaken: string;\n totalWithdrawn: string;\n successRateBps?: number;\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 escrowAddress: string;\n escrowAddresses?: 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 = {\n depositId: string;\n escrowAddress: string;\n escrowAddresses?: string[];\n};\nexport type GetDepositByIdResponse = {\n success: boolean;\n message: string;\n responseObject: ApiDeposit;\n statusCode: number;\n};\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 = {\n depositIds: number[];\n escrowAddress: string;\n escrowAddresses?: string[];\n};\nexport type GetDepositsOrderStatsResponse = {\n success: boolean;\n message: string;\n responseObject: OrderStats[];\n statusCode: number;\n};\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 'chime',\n 'luxon',\n 'n26',\n] as const;\nexport type PaymentPlatformType = (typeof PAYMENT_PLATFORMS)[number];\n\n// On-chain views\nexport type { EscrowDepositView, EscrowIntentView } from './escrowViews';\n\n// Prepared transaction types\nexport type {\n PreparedTransaction,\n PreparedTransactionWithAbi,\n PrepareableMethod,\n} from './prepared';\n","import chainlinkFeeds from '@zkp2p/contracts-v2/oracleFeeds/chainlink.json';\nimport { encodeAbiParameters } from 'viem';\nimport type { Address, Hex } from 'viem';\n\nimport { Currency, type CurrencyType } from './currency';\n\n/** Minimal interface for the publicClient parameter, avoids viem version coupling. */\nexport interface MulticallClient {\n multicall(args: {\n contracts: ReadonlyArray<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n }>;\n allowFailure: true;\n }): Promise<ReadonlyArray<{ status: 'success' | 'failure'; result?: unknown; error?: unknown }>>;\n}\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\n\n/**\n * Chainlink adapter currently used by V2.2 oracle floor configs.\n */\nexport const CHAINLINK_ORACLE_ADAPTER = '0xfc81d1b5841e697973af3072fc8e03af76cb39ef' as const;\n\n/**\n * Deprecated: retained for SDK compatibility after contracts-v2 rc.12 removed\n * Pyth feed metadata from the package.\n */\nexport const PYTH_ORACLE_ADAPTER = '0xaa2bBDa3072bD37af76613846268Ec48bd0bB885' as const;\n\n/**\n * Default max staleness window for oracle-backed floors.\n */\nexport const DEFAULT_ORACLE_MAX_STALENESS_SECONDS = 86_400;\n\n/**\n * Deprecated: retained for SDK compatibility after contracts-v2 rc.12 removed\n * Pyth feed metadata from the package.\n */\nexport const PYTH_CONTRACT_BASE = '0xff1a0f4744e8582DF1aE09D5611b887B6a12925C' as const;\n\nconst CHAINLINK_LATEST_ROUND_ABI = [\n {\n name: 'latestRoundData',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n },\n] as const;\n\nexport type OracleKind = 'oracle_chainlink' | 'oracle_pyth';\n\nexport type SpreadOracleFeedConfig = {\n feed: Address;\n decimals: number;\n invert: boolean;\n};\n\nexport type PythFeedConfig = {\n feedId: Hex;\n decimals: number;\n invert: boolean;\n};\n\n/**\n * Identifier surfaced to UIs/SDK consumers for the configured oracle feed.\n * - Chainlink feeds are 20-byte contract addresses.\n * - Pyth feeds are 32-byte feed IDs.\n */\nexport type SpreadOracleFeedIdentifier = Address | Hex;\n\nexport type SpreadOracleConfig = {\n feed: SpreadOracleFeedIdentifier;\n decimals: number;\n invert: boolean;\n adapter: Address;\n adapterConfig: Hex;\n maxStaleness: number;\n kind?: OracleKind;\n};\n\nfunction parseUsdPair(pair: string): { currency: CurrencyType; invert: boolean } | null {\n const [base, quote] = pair.split('/');\n if (!base || !quote) return null;\n\n if (quote === 'USD' && Object.prototype.hasOwnProperty.call(Currency, base)) {\n return { currency: base as CurrencyType, invert: true };\n }\n\n if (base === 'USD' && Object.prototype.hasOwnProperty.call(Currency, quote)) {\n return { currency: quote as CurrencyType, invert: false };\n }\n\n return null;\n}\n\nfunction buildChainlinkOracleFeeds(): Partial<Record<CurrencyType, SpreadOracleFeedConfig>> {\n const map: Partial<Record<CurrencyType, SpreadOracleFeedConfig>> = {};\n\n for (const feed of chainlinkFeeds.feeds) {\n const parsed = parseUsdPair(feed.pair);\n if (!parsed) continue;\n\n map[parsed.currency] = {\n feed: feed.feed.toLowerCase() as Address,\n decimals: feed.decimals,\n invert: parsed.invert,\n };\n }\n\n return map;\n}\n\n/**\n * Currency -> Chainlink feed mapping used for spread/floor configuration.\n * Sourced from @zkp2p/contracts-v2/oracleFeeds/chainlink.json.\n */\nexport const CHAINLINK_ORACLE_FEEDS: Partial<Record<CurrencyType, SpreadOracleFeedConfig>> = {\n ...buildChainlinkOracleFeeds(),\n [Currency.USD]: {\n feed: ZERO_ADDRESS,\n decimals: 0,\n invert: false,\n },\n};\n\n/** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\nexport const SPREAD_ORACLE_FEEDS = CHAINLINK_ORACLE_FEEDS;\n\n/**\n * Deprecated: contracts-v2 rc.12 no longer ships Pyth feed metadata, so this\n * now remains empty and currencies without Chainlink feeds fall back to\n * fixed-rate behavior.\n */\nexport const PYTH_ORACLE_FEEDS: Partial<Record<CurrencyType, PythFeedConfig>> = {};\n\nexport function encodeSpreadOracleAdapterConfig(config: SpreadOracleFeedConfig): Hex {\n return encodeAbiParameters(\n [\n { name: 'feed', type: 'address' },\n { name: 'invert', type: 'bool' },\n ],\n [config.feed, config.invert],\n );\n}\n\n/**\n * Deprecated: retained for SDK consumers that still build custom Pyth configs.\n */\nexport function encodePythAdapterConfig(config: PythFeedConfig): Hex {\n return encodeAbiParameters(\n [\n { name: 'feedId', type: 'bytes32' },\n { name: 'invert', type: 'bool' },\n ],\n [config.feedId, config.invert],\n );\n}\n\nexport interface OracleAdapterOverrides {\n chainlinkOracleAdapter?: Address;\n pythOracleAdapter?: Address;\n}\n\nexport function getSpreadOracleConfig(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): SpreadOracleConfig | null {\n const chainlinkAdapter = adapters?.chainlinkOracleAdapter ?? CHAINLINK_ORACLE_ADAPTER;\n const chainlinkFeed = CHAINLINK_ORACLE_FEEDS[currency];\n\n if (!chainlinkFeed) {\n return null;\n }\n\n return {\n ...chainlinkFeed,\n adapter: chainlinkAdapter,\n adapterConfig: encodeSpreadOracleAdapterConfig(chainlinkFeed),\n maxStaleness: DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n kind: 'oracle_chainlink',\n };\n}\n\n/**\n * Validates which oracle feeds are actually live on-chain.\n *\n * - Chainlink: calls `latestRoundData()` on each feed contract.\n * - USD passthrough (zero-address Chainlink) is always included.\n *\n * Returns the set of CurrencyType values with working on-chain feeds.\n * Currencies that `getSpreadOracleConfig` would resolve are only\n * considered available if they pass this check.\n */\nexport async function validateOracleFeedsOnChain(\n publicClient: MulticallClient,\n _pythContract?: Address,\n): Promise<Set<CurrencyType>> {\n const currencies: CurrencyType[] = [];\n const contracts: Array<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n }> = [];\n\n // Chainlink feeds (skip USD passthrough — always valid)\n for (const [currency, config] of Object.entries(CHAINLINK_ORACLE_FEEDS) as [\n CurrencyType,\n SpreadOracleFeedConfig,\n ][]) {\n if (config.feed === ZERO_ADDRESS) continue;\n currencies.push(currency);\n contracts.push({\n address: config.feed,\n abi: CHAINLINK_LATEST_ROUND_ABI,\n functionName: 'latestRoundData',\n args: [],\n });\n }\n\n if (contracts.length === 0) return new Set([Currency.USD as CurrencyType]);\n\n const results = await publicClient.multicall({\n contracts,\n allowFailure: true,\n });\n\n const available = new Set<CurrencyType>([Currency.USD as CurrencyType]);\n for (let i = 0; i < currencies.length; i++) {\n if (results[i].status === 'success') {\n available.add(currencies[i]);\n }\n }\n\n return available;\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';\nexport {\n CHAINLINK_ORACLE_ADAPTER,\n PYTH_ORACLE_ADAPTER,\n PYTH_CONTRACT_BASE,\n DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n CHAINLINK_ORACLE_FEEDS,\n /** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\n SPREAD_ORACLE_FEEDS,\n PYTH_ORACLE_FEEDS,\n encodeSpreadOracleAdapterConfig,\n encodePythAdapterConfig,\n getSpreadOracleConfig,\n validateOracleFeedsOnChain,\n} from './utils/oracles';\nexport type {\n SpreadOracleFeedConfig,\n SpreadOracleConfig,\n OracleKind,\n PythFeedConfig,\n OracleAdapterOverrides,\n MulticallClient,\n} from './utils/oracles';\n\n/**\n * Supported blockchain chain IDs.\n *\n * @example\n * ```typescript\n * import { SUPPORTED_CHAIN_IDS } from '@zkp2p/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 /** 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 chime: {\n name: 'Chime',\n displayName: 'Chime',\n logo: '🏦',\n requiredProofs: 1,\n },\n luxon: {\n name: 'Luxon',\n displayName: 'Luxon',\n logo: '✨',\n requiredProofs: 1,\n },\n n26: {\n name: 'N26',\n displayName: 'N26',\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<\n string,\n { actionType: string; actionPlatform: string }\n> = {\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 chime: { actionType: 'transfer_chime', actionPlatform: 'chime' },\n luxon: { actionType: 'transfer_luxon', actionPlatform: 'luxon' },\n n26: { actionType: 'transfer_n26', actionPlatform: 'n26' },\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): {\n actionType: string;\n actionPlatform: string;\n} {\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","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};","import type { Address, PublicClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext } from './ContractRouter';\nimport {\n ZERO_ADDRESS,\n getAbiFunction,\n normalizeAddress,\n parseEscrowAddressFromCompositeDepositId,\n parseRawDepositId,\n} from './clientUtils';\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport { IndexerDepositService, type DepositFilter } from '../indexer/service';\nimport type { DepositWithRelations } from '../indexer/types';\nimport { parseBigIntLike } from '../utils/bigint';\n\n/**\n * Iterates over contexts, attempting an async operation on each.\n * Returns the first non-undefined result. Tracks success/failure state\n * and throws the last error if no reads succeeded.\n */\nasync function tryContexts<TContext, TResult>(\n contexts: TContext[],\n attempt: (context: TContext) => Promise<TResult | undefined>,\n notFoundMessage: string,\n): Promise<TResult> {\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n for (const context of contexts) {\n attemptedRead = true;\n try {\n const result = await attempt(context);\n hadSuccessfulRead = true;\n if (result !== undefined) {\n return result;\n }\n } catch (readError) {\n lastError = readError;\n }\n }\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n throw new Error(notFoundMessage);\n}\n\n/**\n * Iterates over contexts, attempting an async operation on each and collecting\n * all non-undefined results. Throws the last error only if no reads succeeded.\n */\nasync function collectFromContexts<TContext, TResult>(\n contexts: TContext[],\n attempt: (context: TContext) => Promise<TResult[]>,\n): Promise<{\n results: TResult[];\n attemptedRead: boolean;\n hadSuccessfulRead: boolean;\n lastError: unknown;\n}> {\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n const results: TResult[] = [];\n for (const context of contexts) {\n attemptedRead = true;\n try {\n const items = await attempt(context);\n hadSuccessfulRead = true;\n results.push(...items);\n } catch (readError) {\n lastError = readError;\n }\n }\n return { results, attemptedRead, hadSuccessfulRead, lastError };\n}\n\ntype ProtocolViewerContext = {\n escrow: Address;\n orchestrator: Address;\n};\n\ntype ProtocolViewerContract = {\n address: Address;\n abi: Abi;\n};\n\ninterface ProtocolViewerReaderHost {\n requireProtocolViewer: () => ProtocolViewerContract;\n protocolViewerFunctionInputCount: (functionName: string) => number | null;\n buildProtocolViewerContexts: (options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }) => ProtocolViewerContext[];\n isProtocolViewerDepositPopulated: (view: PV_DepositView) => boolean;\n isProtocolViewerIntentPopulated: (view: PV_IntentView) => boolean;\n buildDepositViewFromEscrowDeposit: (rawDeposit: unknown, depositId: bigint) => PV_DepositView;\n getPvAccountDepositsFromIndexer: (owner: Address) => Promise<PV_DepositView[]>;\n getPvDepositById: (\n depositId: string | bigint,\n options?: { strictEscrow?: boolean },\n ) => Promise<PV_DepositView>;\n getEscrowContexts: () => EscrowContractContext[];\n lookupIntentRouting: (intentHash: `0x${string}`) => Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }>;\n}\n\nexport interface ProtocolViewerReaderConfig {\n getPublicClient: () => PublicClient;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getProtocolViewerEntries: () => Array<{ address: Address; abi: Abi }>;\n getEscrowAddresses: () => Address[];\n getIndexerService: () => IndexerDepositService;\n getRouterBuildProtocolViewerContexts: () => (options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }) => ProtocolViewerContext[];\n host: ProtocolViewerReaderHost;\n}\n\nexport class ProtocolViewerReader {\n constructor(private readonly config: ProtocolViewerReaderConfig) {}\n\n requireProtocolViewer(): ProtocolViewerContract {\n const address = this.config.getProtocolViewerAddress();\n const abi = this.config.getProtocolViewerAbi();\n if (!address || !abi) {\n throw new Error('ProtocolViewer not available for this network');\n }\n return { address, abi };\n }\n\n protocolViewerFunctionInputCount(functionName: string): number | null {\n const fn = getAbiFunction(this.config.getProtocolViewerAbi(), functionName);\n if (!fn) return null;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.length;\n }\n\n pvEntryFunctionInputCount(entry: { abi: Abi }, functionName: string): number | null {\n const fn = getAbiFunction(entry.abi, functionName);\n if (!fn) return null;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.length;\n }\n\n isZeroAddressValue(value?: string | null): boolean {\n return !value || value.toLowerCase() === ZERO_ADDRESS.toLowerCase();\n }\n\n toBigIntOrZero(value: unknown, fieldName = 'numeric field'): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return parseBigIntLike(value as bigint | number | string);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid ${fieldName}: ${detail}`);\n }\n }\n\n buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): ProtocolViewerContext[] {\n return this.config.getRouterBuildProtocolViewerContexts()(options);\n }\n\n isProtocolViewerDepositPopulated(view: PV_DepositView): boolean {\n return !this.isZeroAddressValue(view.deposit?.depositor);\n }\n\n isProtocolViewerIntentPopulated(view: PV_IntentView): boolean {\n return !this.isZeroAddressValue(view.intent?.owner);\n }\n\n buildDepositViewFromEscrowDeposit(rawDeposit: unknown, depositId: bigint): PV_DepositView {\n const deposit = (rawDeposit as Record<string, unknown> | null | undefined) ?? {};\n const remaining = this.toBigIntOrZero(\n deposit.remainingDeposits ?? deposit.remainingDepositAmount,\n 'deposit remaining amount',\n );\n const outstanding = this.toBigIntOrZero(\n deposit.outstandingIntentAmount,\n 'deposit outstanding intent amount',\n );\n const amount = this.toBigIntOrZero(deposit.amount, 'deposit amount') || remaining + outstanding;\n\n return {\n depositId,\n deposit: {\n depositor: (normalizeAddress(deposit.depositor as string | undefined) ??\n ZERO_ADDRESS) as Address,\n delegate: (normalizeAddress(deposit.delegate as string | undefined) ??\n ZERO_ADDRESS) as Address,\n token: (normalizeAddress(deposit.token as string | undefined) ?? ZERO_ADDRESS) as Address,\n amount,\n intentAmountRange: {\n min: this.toBigIntOrZero(\n (deposit.intentAmountRange as Record<string, unknown> | undefined)?.min,\n 'minimum intent amount',\n ),\n max: this.toBigIntOrZero(\n (deposit.intentAmountRange as Record<string, unknown> | undefined)?.max,\n 'maximum intent amount',\n ),\n },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDeposits: remaining,\n outstandingIntentAmount: outstanding,\n makerProtocolFee: this.toBigIntOrZero(deposit.makerProtocolFee, 'maker protocol fee'),\n reservedMakerFees: this.toBigIntOrZero(\n deposit.reservedMakerFees,\n 'reserved maker fee amount',\n ),\n accruedMakerFees: this.toBigIntOrZero(deposit.accruedMakerFees, 'accrued maker fee amount'),\n accruedReferrerFees: this.toBigIntOrZero(\n deposit.accruedReferrerFees,\n 'accrued referrer fee amount',\n ),\n intentGuardian: (normalizeAddress(deposit.intentGuardian as string | undefined) ??\n ZERO_ADDRESS) as Address,\n retainOnEmpty: Boolean(deposit.retainOnEmpty),\n referrer: (normalizeAddress(deposit.referrer as string | undefined) ??\n ZERO_ADDRESS) as Address,\n referrerFee: this.toBigIntOrZero(deposit.referrerFee, 'referrer fee'),\n },\n availableLiquidity: remaining,\n paymentMethods: [],\n intentHashes: [],\n };\n }\n\n convertIndexerDepositToPvView(deposit: DepositWithRelations): PV_DepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(\n (paymentMethod) => (paymentMethod as any).active !== false,\n );\n const currenciesByPaymentMethod = new Map<\n string,\n NonNullable<DepositWithRelations['currencies']>\n >();\n for (const currency of deposit.currencies ?? []) {\n const key = currency.paymentMethodHash.toLowerCase();\n const existing = currenciesByPaymentMethod.get(key) ?? [];\n existing.push(currency);\n currenciesByPaymentMethod.set(key, existing);\n }\n\n const remaining = this.toBigIntOrZero(deposit.remainingDeposits, 'remaining deposits');\n const outstanding = this.toBigIntOrZero(\n deposit.outstandingIntentAmount,\n 'outstanding intent amount',\n );\n const totalAmountTaken = this.toBigIntOrZero(deposit.totalAmountTaken, 'total amount taken');\n const totalWithdrawn = this.toBigIntOrZero(deposit.totalWithdrawn, 'total withdrawn amount');\n const depositAmount = remaining + outstanding + totalAmountTaken + totalWithdrawn;\n\n return {\n depositId: this.toBigIntOrZero(deposit.depositId, 'deposit id'),\n deposit: {\n depositor: (normalizeAddress(deposit.depositor) ?? ZERO_ADDRESS) as Address,\n delegate: (normalizeAddress(deposit.delegate ?? undefined) ?? ZERO_ADDRESS) as Address,\n token: (normalizeAddress(deposit.token) ?? ZERO_ADDRESS) as Address,\n amount: depositAmount,\n intentAmountRange: {\n min: this.toBigIntOrZero(deposit.intentAmountMin, 'minimum intent amount'),\n max: this.toBigIntOrZero(deposit.intentAmountMax, 'maximum intent amount'),\n },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDeposits: remaining,\n outstandingIntentAmount: outstanding,\n makerProtocolFee: 0n,\n reservedMakerFees: 0n,\n accruedMakerFees: 0n,\n accruedReferrerFees: 0n,\n intentGuardian: ZERO_ADDRESS,\n retainOnEmpty: Boolean(deposit.retainOnEmpty ?? false),\n referrer: ZERO_ADDRESS,\n referrerFee: 0n,\n },\n availableLiquidity: remaining,\n paymentMethods: paymentMethods.map((method) => ({\n paymentMethod: method.paymentMethodHash as `0x${string}`,\n verificationData: {\n intentGatingService: (normalizeAddress(method.intentGatingService) ??\n ZERO_ADDRESS) as Address,\n payeeDetails: (method.payeeDetailsHash || '0x') as `0x${string}`,\n data: '0x' as `0x${string}`,\n },\n currencies: (\n currenciesByPaymentMethod.get(method.paymentMethodHash.toLowerCase()) ?? []\n ).map((currency) => ({\n code: currency.currencyCode as `0x${string}`,\n minConversionRate: this.toBigIntOrZero(\n currency.conversionRate ?? currency.minConversionRate,\n 'conversion rate',\n ),\n })),\n })),\n intentHashes: Array.from(new Set((deposit.intents ?? []).map((intent) => intent.intentHash))),\n };\n }\n\n async getPvAccountDepositsFromIndexer(owner: Address): Promise<PV_DepositView[]> {\n const filter: DepositFilter = { depositor: owner, status: 'ACTIVE' };\n const escrowAddresses = this.config.getEscrowAddresses();\n if (escrowAddresses.length > 0) {\n filter.escrowAddresses = escrowAddresses.map((escrow) => escrow as string);\n }\n\n const deposits = await this.config\n .getIndexerService()\n .fetchDepositsWithRelations(\n filter,\n { limit: 1000, orderBy: 'timestamp', orderDirection: 'desc' },\n { includeIntents: true },\n );\n return deposits.map((deposit) => this.convertIndexerDepositToPvView(deposit));\n }\n\n async getPvDepositById(\n depositId: string | bigint,\n options?: { strictEscrow?: boolean },\n ): Promise<PV_DepositView> {\n const id = typeof depositId === 'bigint' ? depositId : parseRawDepositId(depositId);\n const hintedEscrow =\n typeof depositId === 'string'\n ? parseEscrowAddressFromCompositeDepositId(depositId)\n : undefined;\n const strictEscrow = Boolean(options?.strictEscrow && hintedEscrow);\n const protocolViewerContexts =\n strictEscrow && hintedEscrow\n ? this.config.host\n .buildProtocolViewerContexts({ escrowAddress: hintedEscrow })\n .filter((context) => context.escrow.toLowerCase() === hintedEscrow.toLowerCase())\n : this.config.host.buildProtocolViewerContexts({ escrowAddress: hintedEscrow });\n\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (protocolViewerAddress && protocolViewerAbi) {\n const { address, abi } = this.config.host.requireProtocolViewer();\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getDeposit');\n if (inputCount === null) {\n throw new Error('Configured ProtocolViewer ABI does not expose getDeposit');\n }\n\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n if (inputCount >= 3) {\n return tryContexts(\n protocolViewerContexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [context.escrow, context.orchestrator, id],\n });\n const parsed = parseDepositView(raw);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Deposit not found in configured ProtocolViewer contexts',\n );\n }\n\n if (inputCount >= 2) {\n return tryContexts(\n protocolViewerContexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [context.escrow, id],\n });\n const parsed = parseDepositView(raw);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Deposit not found in configured ProtocolViewer escrows',\n );\n }\n\n if (!strictEscrow) {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [id],\n });\n const parsed = parseDepositView(raw);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n return parsed;\n }\n throw new Error('Deposit not found');\n }\n }\n\n const contexts =\n strictEscrow && hintedEscrow\n ? this.config.host\n .getEscrowContexts()\n .filter((context) => context.address.toLowerCase() === hintedEscrow.toLowerCase())\n : this.config.host.getEscrowContexts();\n if (!strictEscrow && hintedEscrow) {\n contexts.sort((left, right) => {\n const leftMatch = left.address.toLowerCase() === hintedEscrow.toLowerCase() ? 1 : 0;\n const rightMatch = right.address.toLowerCase() === hintedEscrow.toLowerCase() ? 1 : 0;\n return rightMatch - leftMatch;\n });\n }\n return tryContexts(\n contexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address: context.address,\n abi: context.abi,\n functionName: 'getDeposit',\n args: [id],\n });\n const parsed = this.config.host.buildDepositViewFromEscrowDeposit(raw, id);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Failed to fetch deposit from configured escrows',\n );\n }\n\n async getPvDepositsFromIds(ids: Array<string | bigint>): Promise<PV_DepositView[]> {\n if (!ids.length) return [];\n\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getDepositFromIds');\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (!protocolViewerAddress || !protocolViewerAbi || inputCount === null || inputCount >= 3) {\n return Promise.all(ids.map((id) => this.config.host.getPvDepositById(id)));\n }\n\n const bn = ids.map((id) => (typeof id === 'bigint' ? id : parseRawDepositId(id)));\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n if (inputCount >= 2) {\n type DepositBatchRequest = {\n index: number;\n id: string | bigint;\n rawId: bigint;\n hintedEscrow?: Address;\n };\n\n const requests: DepositBatchRequest[] = ids.map((id, index) => ({\n index,\n id,\n rawId: bn[index]!,\n hintedEscrow:\n typeof id === 'string' ? parseEscrowAddressFromCompositeDepositId(id) : undefined,\n }));\n const resolved: Array<PV_DepositView | undefined> = new Array(requests.length);\n let attemptedBatchRead = false;\n let hadSuccessfulBatchRead = false;\n let lastBatchError: unknown;\n\n const resolveBatch = async (escrow: Address, entries: DepositBatchRequest[]) => {\n if (!entries.length) return;\n attemptedBatchRead = true;\n try {\n const raw = (await this.config.getPublicClient().readContract({\n address: protocolViewerAddress,\n abi: protocolViewerAbi,\n functionName: 'getDepositFromIds',\n args: [escrow, entries.map((entry) => entry.rawId)],\n })) as any[];\n hadSuccessfulBatchRead = true;\n const items = Array.isArray(raw) ? raw : [];\n\n if (items.length === entries.length) {\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index];\n if (!entry || resolved[entry.index]) continue;\n const parsed = parseDepositView(items[index]);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n resolved[entry.index] = parsed;\n }\n }\n return;\n }\n\n for (const item of items) {\n const parsed = parseDepositView(item);\n if (!this.config.host.isProtocolViewerDepositPopulated(parsed)) continue;\n const match = entries.find(\n (entry) => !resolved[entry.index] && entry.rawId === parsed.depositId,\n );\n if (match) {\n resolved[match.index] = parsed;\n }\n }\n } catch (batchError) {\n lastBatchError = batchError;\n }\n };\n\n const hintedGroups = new Map<string, { escrow: Address; entries: DepositBatchRequest[] }>();\n for (const request of requests) {\n if (!request.hintedEscrow) continue;\n const key = request.hintedEscrow.toLowerCase();\n const group = hintedGroups.get(key);\n if (group) {\n group.entries.push(request);\n } else {\n hintedGroups.set(key, { escrow: request.hintedEscrow, entries: [request] });\n }\n }\n\n for (const { escrow, entries } of hintedGroups.values()) {\n await resolveBatch(escrow, entries);\n }\n\n const escrows: Address[] = [];\n const seenEscrows = new Set<string>();\n for (const context of this.config.host.buildProtocolViewerContexts()) {\n const key = context.escrow.toLowerCase();\n if (seenEscrows.has(key)) continue;\n seenEscrows.add(key);\n escrows.push(context.escrow);\n }\n\n for (const escrow of escrows) {\n const pending = requests.filter(\n (entry) => !entry.hintedEscrow && resolved[entry.index] === undefined,\n );\n if (!pending.length) break;\n await resolveBatch(escrow, pending);\n }\n\n if (requests.every((entry) => resolved[entry.index] !== undefined)) {\n return resolved as PV_DepositView[];\n }\n\n if (!hadSuccessfulBatchRead && attemptedBatchRead && lastBatchError) {\n throw lastBatchError;\n }\n\n return Promise.all(\n requests.map(\n (entry) => resolved[entry.index] ?? this.config.host.getPvDepositById(entry.id),\n ),\n );\n }\n\n const raw = (await this.config.getPublicClient().readContract({\n address: protocolViewerAddress,\n abi: protocolViewerAbi,\n functionName: 'getDepositFromIds',\n args: [bn],\n })) as any[];\n return raw.map(parseDepositView);\n }\n\n async getPvAccountDeposits(owner: Address): Promise<PV_DepositView[]> {\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getAccountDeposits');\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (!protocolViewerAddress || !protocolViewerAbi || inputCount === null) {\n return this.config.host.getPvAccountDepositsFromIndexer(owner);\n }\n\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n const { address, abi } = this.config.host.requireProtocolViewer();\n\n if (inputCount >= 2) {\n const readAndFilter = async (raw: unknown[]): Promise<PV_DepositView[]> => {\n const filtered: PV_DepositView[] = [];\n for (const item of raw) {\n const parsed = parseDepositView(item);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n filtered.push(parsed);\n }\n }\n return filtered;\n };\n\n if (inputCount >= 3) {\n const { results, attemptedRead, hadSuccessfulRead, lastError } = await collectFromContexts(\n this.config.host.buildProtocolViewerContexts(),\n async (context) => {\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [context.escrow, context.orchestrator, owner],\n })) as unknown[];\n return readAndFilter(raw);\n },\n );\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n return results;\n }\n\n const seenEscrows = new Set<string>();\n const escrowAddresses = [\n ...this.config.host.buildProtocolViewerContexts().map((context) => context.escrow),\n ...this.config.host.getEscrowContexts().map((context) => context.address),\n ].filter((escrow) => {\n const key = escrow.toLowerCase();\n if (seenEscrows.has(key)) return false;\n seenEscrows.add(key);\n return true;\n });\n\n const { results, attemptedRead, hadSuccessfulRead, lastError } = await collectFromContexts(\n escrowAddresses,\n async (escrow) => {\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [escrow, owner],\n })) as unknown[];\n return readAndFilter(raw);\n },\n );\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n return results;\n }\n\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [owner],\n })) as any[];\n return raw\n .map(parseDepositView)\n .filter((view) => this.config.host.isProtocolViewerDepositPopulated(view));\n }\n\n async getPvAccountIntents(owner: Address): Promise<PV_IntentView[]> {\n const protocolViewerEntries = this.config.getProtocolViewerEntries();\n if (protocolViewerEntries.length === 0) {\n throw new Error('ProtocolViewer not available for this network');\n }\n\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n const intentsByHash = new Map<string, PV_IntentView>();\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n const runtimeProcess = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const protocolViewerDebugEnv = runtimeProcess?.env?.ZKP2P_DEBUG_PROTOCOL_VIEWER;\n const isDebugLoggingEnabled =\n protocolViewerDebugEnv === '1' ||\n protocolViewerDebugEnv === 'true' ||\n runtimeProcess?.env?.NODE_ENV === 'development';\n\n for (const pvEntry of protocolViewerEntries) {\n const inputCount = this.pvEntryFunctionInputCount(pvEntry, 'getAccountIntents');\n if (inputCount === null) continue;\n\n if (inputCount >= 2) {\n for (const context of this.config.host.buildProtocolViewerContexts()) {\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Zkp2pClient] getPvAccountIntents read context', {\n protocolViewerAddress: pvEntry.address,\n owner,\n escrow: context.escrow,\n orchestrator: context.orchestrator,\n inputCount,\n });\n }\n attemptedRead = true;\n try {\n const args =\n inputCount >= 3\n ? [context.escrow, context.orchestrator, owner]\n : [context.orchestrator, owner];\n const raw = (await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getAccountIntents',\n args,\n })) as any[];\n hadSuccessfulRead = true;\n for (const item of raw) {\n const parsed = parseIntentView(item);\n if (!this.config.host.isProtocolViewerIntentPopulated(parsed)) continue;\n intentsByHash.set(parsed.intentHash.toLowerCase(), parsed);\n }\n } catch (readError) {\n lastError = readError;\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.warn('[Zkp2pClient] getPvAccountIntents context read failed', {\n protocolViewerAddress: pvEntry.address,\n owner,\n escrow: context.escrow,\n orchestrator: context.orchestrator,\n inputCount,\n error: readError instanceof Error ? readError.message : String(readError),\n });\n }\n }\n }\n } else {\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Zkp2pClient] getPvAccountIntents read legacy context', {\n protocolViewerAddress: pvEntry.address,\n owner,\n inputCount,\n });\n }\n attemptedRead = true;\n try {\n const raw = (await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getAccountIntents',\n args: [owner],\n })) as any[];\n hadSuccessfulRead = true;\n for (const item of raw) {\n const parsed = parseIntentView(item);\n if (!this.config.host.isProtocolViewerIntentPopulated(parsed)) continue;\n if (!intentsByHash.has(parsed.intentHash.toLowerCase())) {\n intentsByHash.set(parsed.intentHash.toLowerCase(), parsed);\n }\n }\n } catch (readError) {\n lastError = readError;\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.warn('[Zkp2pClient] getPvAccountIntents legacy read failed', {\n protocolViewerAddress: pvEntry.address,\n owner,\n inputCount,\n error: readError instanceof Error ? readError.message : String(readError),\n });\n }\n }\n }\n }\n\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n\n if (!attemptedRead && isDebugLoggingEnabled) {\n console.warn(\n '[Zkp2pClient] getPvAccountIntents did not execute any reads; verify ProtocolViewer ABI/configuration',\n );\n }\n\n return Array.from(intentsByHash.values()).sort((left, right) => {\n if (left.intent.timestamp === right.intent.timestamp) {\n return left.intentHash.localeCompare(right.intentHash);\n }\n return left.intent.timestamp < right.intent.timestamp ? -1 : 1;\n });\n }\n\n async getPvIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n const protocolViewerEntries = this.config.getProtocolViewerEntries();\n if (protocolViewerEntries.length === 0) {\n throw new Error('ProtocolViewer not available for this network');\n }\n\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n let lastError: unknown;\n\n for (const pvEntry of protocolViewerEntries) {\n const inputCount = this.pvEntryFunctionInputCount(pvEntry, 'getIntent');\n if (inputCount === null) continue;\n\n if (inputCount >= 2) {\n let routing: { orchestratorAddress?: Address; escrowAddress?: Address } = {};\n try {\n routing = await this.config.host.lookupIntentRouting(intentHash);\n } catch (routingError) {\n lastError = routingError;\n }\n for (const context of this.config.host.buildProtocolViewerContexts({\n escrowAddress: routing.escrowAddress,\n orchestratorAddress: routing.orchestratorAddress,\n })) {\n try {\n const args =\n inputCount >= 3\n ? [context.escrow, context.orchestrator, intentHash]\n : [context.orchestrator, intentHash];\n const raw = await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getIntent',\n args,\n });\n const parsed = parseIntentView(raw);\n if (this.config.host.isProtocolViewerIntentPopulated(parsed)) {\n return parsed;\n }\n lastError = new Error('Intent not found');\n } catch (readError) {\n lastError = readError;\n }\n }\n } else {\n try {\n const raw = await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getIntent',\n args: [intentHash],\n });\n const parsed = parseIntentView(raw);\n if (this.config.host.isProtocolViewerIntentPopulated(parsed)) {\n return parsed;\n }\n lastError = new Error('Intent not found');\n } catch (readError) {\n lastError = readError;\n }\n }\n }\n\n throw lastError ?? new Error('Intent not found');\n }\n}\n","import type { Address, PublicClient, Hex } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext } from './ContractRouter';\nimport {\n ZERO_ADDRESS,\n abiFunctionHasInput,\n abiTupleHasComponent,\n escrowCurrencyHasOracleConfig,\n normalizeOracleRateConfig,\n parseManagerFeeFromRead,\n parseRawDepositId,\n resolveAbiFunctionName,\n} from './clientUtils';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\n\ninterface VaultOperationsHost {\n resolveEscrowContext: (options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }) => EscrowContractContext;\n prepareEscrowTransaction: (opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n }) => PreparedTransactionWithAbi;\n prepareContractTransaction: (opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }) => PreparedTransactionWithAbi;\n}\n\nexport interface VaultOperationsConfig {\n getPublicClient: () => PublicClient;\n getRateManagerRegistryAddress: () => Address | undefined;\n getRateManagerRegistryAbi: () => Abi | undefined;\n getRateManagerControllerAddress: () => Address | undefined;\n getRateManagerControllerAbi: () => Abi | undefined;\n getRateManagerInitError: () => Error | undefined;\n host: VaultOperationsHost;\n}\n\nexport class VaultOperations {\n constructor(private readonly config: VaultOperationsConfig) {}\n\n supportsInlineOracleRateConfig(params?: {\n escrowAddress?: Address;\n preferV2?: boolean;\n }): boolean {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params?.escrowAddress,\n preferV2: params?.preferV2,\n });\n return escrowCurrencyHasOracleConfig(escrowContext.abi);\n }\n\n private resolveRateManagerRegistryContract(registryAddress?: Address): {\n address: Address;\n abi: Abi;\n } {\n const abi = this.config.getRateManagerRegistryAbi();\n if (!abi) {\n throw this.buildRateManagerUnavailableError('Rate manager registry not available');\n }\n if (registryAddress) {\n return {\n address: registryAddress,\n abi,\n };\n }\n const address = this.config.getRateManagerRegistryAddress();\n if (!address) {\n throw this.buildRateManagerUnavailableError('Rate manager registry not available');\n }\n return {\n address,\n abi,\n };\n }\n\n private buildRateManagerUnavailableError(reason: string): Error {\n const initError = this.config.getRateManagerInitError();\n if (!initError) {\n return new Error(reason);\n }\n return new Error(\n `${reason}. Rate manager contracts failed to initialize: ${initError.message}`,\n );\n }\n\n private buildCreateRateManagerConfig(config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n }): Record<string, unknown> {\n const registryAbi = this.config.getRateManagerRegistryAbi();\n const includeDepositHook = abiTupleHasComponent(\n registryAbi,\n 'createRateManager',\n 'depositHook',\n );\n const includeMinLiquidity = abiTupleHasComponent(\n registryAbi,\n 'createRateManager',\n 'minLiquidity',\n );\n const result: Record<string, unknown> = {\n manager: config.manager,\n feeRecipient: config.feeRecipient,\n maxFee: config.maxFee,\n fee: config.fee,\n };\n if (includeDepositHook) {\n result.depositHook = config.depositHook ?? ZERO_ADDRESS;\n }\n if (includeMinLiquidity) {\n result.minLiquidity = config.minLiquidity ?? 0n;\n }\n result.name = config.name;\n result.uri = config.uri;\n return result;\n }\n\n private buildSetRateManagerConfigArgs(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n }): readonly unknown[] {\n const registryAbi = this.config.getRateManagerRegistryAbi();\n const includeHook =\n abiFunctionHasInput(registryAbi, 'setRateManagerConfig', '_newHook') ||\n abiFunctionHasInput(registryAbi, 'setRateManagerConfig', 'newHook');\n\n if (includeHook) {\n return [\n params.rateManagerId,\n params.newManager,\n params.newFeeRecipient,\n params.newHook ?? ZERO_ADDRESS,\n params.newName,\n params.newUri,\n ];\n }\n\n return [\n params.rateManagerId,\n params.newManager,\n params.newFeeRecipient,\n params.newName,\n params.newUri,\n ];\n }\n\n private prepareRateManagerRegistryTransaction(opts: {\n functionNames: string[];\n args: readonly unknown[];\n registry?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const contract = this.resolveRateManagerRegistryContract(opts.registry);\n const functionName = resolveAbiFunctionName(contract.abi, opts.functionNames);\n return this.config.host.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: opts.args,\n txOverrides: opts.txOverrides,\n });\n }\n\n prepareCreateRateManagerTransaction(params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['createRateManager'],\n args: [this.buildCreateRateManagerConfig(params.config)],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetVaultRateTransaction(params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRate', 'setMinRate'],\n args: [params.rateManagerId, params.paymentMethodHash, params.currencyHash, params.rate],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetVaultRatesBatchTransaction(params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRateBatch', 'setMinRatesBatch'],\n args: [params.rateManagerId, params.paymentMethods, params.currencies, params.rates],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('setOracleRateConfig requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['setOracleRateConfig']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethodHash,\n params.currencyHash,\n normalizeOracleRateConfig(params.config),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareRemoveOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('removeOracleRateConfig requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['removeOracleRateConfig']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [parseRawDepositId(params.depositId), params.paymentMethodHash, params.currencyHash],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareSetOracleRateConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('setOracleRateConfigBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['setOracleRateConfigBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.currencies,\n params.configs.map((group) => group.map((config) => normalizeOracleRateConfig(config))),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareUpdateCurrencyConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('updateCurrencyConfigBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['updateCurrencyConfigBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.updates.map((group) =>\n group.map((update) => ({\n code: update.code,\n minConversionRate:\n typeof update.minConversionRate === 'bigint'\n ? update.minConversionRate\n : BigInt(update.minConversionRate),\n updateOracle: update.updateOracle,\n oracleRateConfig: normalizeOracleRateConfig(update.oracleRateConfig),\n })),\n ),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareDeactivateCurrenciesBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('deactivateCurrenciesBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['deactivateCurrenciesBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [parseRawDepositId(params.depositId), params.paymentMethods, params.currencyCodes],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareSetVaultConfigTransaction(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRateManagerConfig'],\n args: this.buildSetRateManagerConfigArgs(params),\n txOverrides: params.txOverrides,\n });\n }\n\n async getDepositRateManager(\n escrow: Address,\n depositId: bigint | number | string,\n ): Promise<{ registry: Address; rateManagerId: Hex }> {\n const id = parseRawDepositId(depositId);\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: escrow,\n depositId,\n });\n\n if (getRateManagerReadFunction(escrowContext.abi, 'getDepositRateManager')) {\n const result = (await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getDepositRateManager',\n args: [id],\n })) as readonly [Address, Hex];\n if (result && result.length >= 2) {\n return {\n registry: result[0],\n rateManagerId: result[1],\n };\n }\n }\n\n const controllerAddress = this.config.getRateManagerControllerAddress();\n const controllerAbi = this.config.getRateManagerControllerAbi();\n if (!controllerAddress || !controllerAbi) {\n throw this.buildRateManagerUnavailableError('Rate manager controller not available');\n }\n const legacyResult = (await this.config.getPublicClient().readContract({\n address: controllerAddress,\n abi: controllerAbi,\n functionName: 'getDepositRateManager',\n args: [escrow, id],\n })) as readonly [Address, Hex];\n\n return {\n registry: legacyResult[0],\n rateManagerId: legacyResult[1],\n };\n }\n\n async getManagerFee(escrow: Address, depositId: bigint | number | string): Promise<bigint> {\n const id = parseRawDepositId(depositId);\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: escrow,\n depositId,\n });\n\n if (getRateManagerReadFunction(escrowContext.abi, 'getManagerFee')) {\n const result = await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getManagerFee',\n args: [id],\n });\n return parseManagerFeeFromRead(result);\n }\n\n const controllerAddress = this.config.getRateManagerControllerAddress();\n const controllerAbi = this.config.getRateManagerControllerAbi();\n if (!controllerAddress || !controllerAbi) {\n throw this.buildRateManagerUnavailableError('Rate manager controller not available');\n }\n const result = await this.config.getPublicClient().readContract({\n address: controllerAddress,\n abi: controllerAbi,\n functionName: 'getManagerFee',\n args: [escrow, id],\n });\n return parseManagerFeeFromRead(result);\n }\n\n async getEffectiveRate(params: {\n escrow: Address;\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n }): Promise<bigint> {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n });\n const id = parseRawDepositId(params.depositId);\n return (await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getEffectiveRate',\n args: [id, params.paymentMethod, params.fiatCurrency],\n })) as bigint;\n }\n}\n\nconst getRateManagerReadFunction = (abi: Abi | undefined, functionName: string): boolean =>\n Array.isArray(abi) &&\n (abi as unknown as Array<Record<string, unknown>>).some(\n (item) => item.type === 'function' && item.name === functionName,\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 type IndexerAuthTokenProvider = () =>\n | string\n | null\n | undefined\n | Promise<string | null | undefined>;\n\nexport type IndexerClientOptions = {\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n onAuthorizationTokenError?: (error: unknown) => void;\n apiKey?: string;\n};\n\nclass IndexerHttpError extends Error {\n status: number;\n retryAfterSeconds?: number;\n\n constructor(status: number, statusText: string, options?: { retryAfterSeconds?: number }) {\n super(`Indexer request failed: ${status} ${statusText}`);\n this.name = 'IndexerHttpError';\n this.status = status;\n this.retryAfterSeconds = options?.retryAfterSeconds;\n }\n}\n\nfunction parseRetryAfterSeconds(rawHeader: string | null): number | undefined {\n if (!rawHeader) return undefined;\n\n const parsedSeconds = Number(rawHeader);\n if (Number.isFinite(parsedSeconds) && parsedSeconds >= 0) {\n return Math.ceil(parsedSeconds);\n }\n\n const parsedDateMs = Date.parse(rawHeader);\n if (!Number.isFinite(parsedDateMs)) return undefined;\n\n const secondsUntilRetry = Math.ceil((parsedDateMs - Date.now()) / 1000);\n return Math.max(0, secondsUntilRetry);\n}\n\nfunction createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError());\n return;\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(createAbortError());\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n\nexport class IndexerClient {\n private hasLoggedTokenProviderError = false;\n\n constructor(\n private endpoint: string,\n private options: IndexerClientOptions = {},\n ) {}\n\n private async resolveAuthorizationToken(): Promise<string | undefined> {\n if (this.options.getAuthorizationToken) {\n try {\n const token = await this.options.getAuthorizationToken();\n return token ?? undefined;\n } catch (error) {\n if (this.options.onAuthorizationTokenError) {\n this.options.onAuthorizationTokenError(error);\n } else if (!this.hasLoggedTokenProviderError) {\n this.hasLoggedTokenProviderError = true;\n console.warn(\n '[IndexerClient] getAuthorizationToken failed; continuing without Authorization header',\n error,\n );\n }\n return undefined;\n }\n }\n return this.options.authorizationToken;\n }\n\n private async _post<T>(request: GraphQLRequest, init?: RequestInit): Promise<T> {\n const token = await this.resolveAuthorizationToken();\n const headers = new Headers(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n if (token && !headers.has('Authorization')) {\n headers.set('Authorization', token.startsWith('Bearer ') ? token : `Bearer ${token}`);\n }\n if (this.options.apiKey && !headers.has('x-api-key')) {\n headers.set('x-api-key', this.options.apiKey);\n }\n\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n cache: 'no-store',\n ...init,\n });\n if (!res.ok) {\n throw new IndexerHttpError(res.status, res.statusText, {\n retryAfterSeconds: parseRetryAfterSeconds(res.headers.get('Retry-After')),\n });\n }\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>(\n request: GraphQLRequest,\n init?: RequestInit & { retries?: number; rateLimitRetries?: number },\n ): Promise<T> {\n const retries = Math.max(0, init?.retries ?? 1);\n const rateLimitRetries = Math.max(0, init?.rateLimitRetries ?? 2);\n const maxAttempts = 1 + Math.max(retries, rateLimitRetries);\n const {\n retries: _unusedRetries,\n rateLimitRetries: _unusedRateLimitRetries,\n ...requestInit\n } = init ?? {};\n void _unusedRetries;\n void _unusedRateLimitRetries;\n\n let attempts = 0;\n let rateLimitAttempt = 0;\n let standardRetryAttempt = 0;\n let lastErr: unknown;\n\n while (attempts < maxAttempts) {\n try {\n return await this._post<T>(request, requestInit);\n } catch (e) {\n lastErr = e;\n attempts += 1;\n\n if (requestInit.signal?.aborted) {\n throw e;\n }\n\n const hasAttemptsRemaining = attempts < maxAttempts;\n\n if (\n e instanceof IndexerHttpError &&\n e.status === 429 &&\n rateLimitAttempt < rateLimitRetries &&\n hasAttemptsRemaining\n ) {\n rateLimitAttempt += 1;\n const waitSeconds =\n e.retryAfterSeconds !== undefined ? Math.max(0, e.retryAfterSeconds) : 1;\n await delay(waitSeconds * 1000, requestInit.signal ?? undefined);\n continue;\n }\n\n if (!hasAttemptsRemaining || standardRetryAttempt >= retries) {\n break;\n }\n\n standardRetryAttempt += 1;\n await delay(200 * standardRetryAttempt, requestInit.signal ?? undefined);\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n}\n\nexport type DeploymentEnv = 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING' | 'DEV' | 'LOCAL';\n\nexport function defaultIndexerEndpoint(env: DeploymentEnv = 'PRODUCTION'): string {\n switch (env) {\n case 'PRODUCTION':\n return 'https://indexer.zkp2p.xyz/v1/graphql';\n case 'PREPRODUCTION':\n return 'https://indexer-preprod.zkp2p.xyz/v1/graphql';\n case 'STAGING':\n return 'https://indexer-staging.zkp2p.xyz/v1/graphql';\n case 'DEV':\n case 'LOCAL':\n // Not used by consumers; map to staging endpoint by default\n return 'https://indexer-staging.zkp2p.xyz/v1/graphql';\n default:\n return 'https://indexer.zkp2p.xyz/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 delegate\n rateManagerId\n rateManagerAddress\n delegatedAt\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\nconst LEGACY_DEPOSIT_FIELDS = `\n id\n chainId\n escrowAddress\n depositId\n depositor\n delegate\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\nconst METHOD_CURRENCY_FIELDS = `\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n conversionRate\n takerConversionRate\n managerFee\n rateSource\n oracleRate\n effectiveOracleRate\n lastOracleUpdatedAt\n adapter\n adapterConfig\n feed\n feedDecimals\n spreadBps\n maxStaleness\n invert\n kind\n managerRate\n rateManagerId\n`;\n\nconst LEGACY_METHOD_CURRENCY_FIELDS = `\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n conversionRate\n managerRate\n rateManagerId\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 LEGACY_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 ${LEGACY_DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSITS_BY_IDS_QUERY = /* GraphQL */ `\n query GetDepositsByIds($ids: [String!]) {\n Deposit(where: { id: { _in: $ids } }) {\n ${LEGACY_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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n ${METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n ${LEGACY_METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const PAYMENT_METHODS_BY_PAYEE_HASH_QUERY = /* GraphQL */ `\n query GetPaymentMethodsByPayeeHash($where: DepositPaymentMethod_bool_exp!, $limit: Int) {\n DepositPaymentMethod(where: $where, limit: $limit) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(\n where: {\n depositId: { _eq: $id }\n }\n ) {\n ${METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSIT_WITH_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositWithRelations($id: String!) {\n Deposit_by_pk(id: $id) {\n ${LEGACY_DEPOSIT_FIELDS}\n }\n DepositPaymentMethod(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _eq: $id } }) {\n ${LEGACY_METHOD_CURRENCY_FIELDS}\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 rateManagerId\n managerFee\n managerFeeRecipient\n managerFeeAmount\n paymentAmount\n paymentCurrency\n paymentTimestamp\n paymentId\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const LEGACY_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\nconst RATE_MANAGER_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n feeRecipient\n maxFee\n fee\n minLiquidity\n name\n uri\n createdAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n feeRecipient\n maxFee\n fee\n name\n uri\n createdAt\n updatedAt\n`;\n\nconst RATE_MANAGER_AGGREGATE_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n totalFilledVolume\n totalFeeAmount\n totalPnlUsdCents\n fulfilledIntents\n currentDelegatedBalance\n currentDelegatedDeposits\n firstSeenAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_AGGREGATE_FIELDS = `\n id\n chainId\n rateManagerId\n manager\n totalFilledVolume\n totalFeeAmount\n totalPnlUsdCents\n fulfilledIntents\n currentDelegatedBalance\n currentDelegatedDeposits\n firstSeenAt\n updatedAt\n`;\n\nconst RATE_MANAGER_RATE_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n paymentMethodHash\n currencyCode\n managerRate\n updatedAt\n`;\n\nconst DEPOSIT_DELEGATION_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n delegatedAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_DELEGATION_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n depositId\n createdAt\n updatedAt\n`;\n\nconst MANAGER_STATS_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n depositId\n depositor\n currentDelegatedBalance\n totalAmountTaken\n totalWithdrawn\n fulfilledIntents\n prunedIntents\n successRateBps\n updatedAt\n`;\n\nconst MANAGER_DAILY_SNAPSHOT_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n dayTimestamp\n tvl\n delegatedDeposits\n dailyVolume\n dailyFees\n dailyPnlUsdCents\n dailyFulfilledIntents\n cumulativeVolume\n cumulativeFees\n cumulativePnlUsdCents\n cumulativeFulfilledIntents\n updatedAt\n`;\n\nconst DEPOSITOR_FLOOR_CONFIG_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n escrowAddress\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n floorFixed\n floorSpreadBps\n oracleAdapter\n adapterConfig\n feed\n feedDecimals\n maxStaleness\n invert\n oracleFloorRate\n currentFloorRate\n enabled\n lastOracleUpdatedAt\n kind\n createdAt\n updatedAt\n`;\n\nexport const RATE_MANAGER_LIST_QUERY = /* GraphQL */ `\n query VaultList(\n $where: RateManager_bool_exp\n $aggregateWhere: ManagerAggregateStats_bool_exp\n $order_by: [RateManager_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManager(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${RATE_MANAGER_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${RATE_MANAGER_AGGREGATE_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_LIST_QUERY = /* GraphQL */ `\n query VaultList(\n $where: RateManager_bool_exp\n $aggregateWhere: ManagerAggregateStats_bool_exp\n $order_by: [RateManager_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManager(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${LEGACY_RATE_MANAGER_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${LEGACY_RATE_MANAGER_AGGREGATE_FIELDS}\n }\n }\n`;\n\nexport const RATE_MANAGER_DETAIL_QUERY = /* GraphQL */ `\n query VaultDetail(\n $managerWhere: RateManager_bool_exp!\n $rateWhere: RateManagerRate_bool_exp!\n $aggregateWhere: ManagerAggregateStats_bool_exp!\n $statsWhere: ManagerStats_bool_exp!\n $delegationWhere: Deposit_bool_exp!\n $statsLimit: Int\n ) {\n RateManager(where: $managerWhere) {\n ${RATE_MANAGER_FIELDS}\n }\n RateManagerRate(where: $rateWhere) {\n ${RATE_MANAGER_RATE_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${RATE_MANAGER_AGGREGATE_FIELDS}\n }\n ManagerStats(\n where: $statsWhere\n order_by: { updatedAt: desc }\n limit: $statsLimit\n ) {\n ${MANAGER_STATS_FIELDS}\n }\n Deposit(where: $delegationWhere) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_DETAIL_QUERY = /* GraphQL */ `\n query VaultDetail(\n $managerWhere: RateManager_bool_exp!\n $rateWhere: RateManagerRate_bool_exp!\n $aggregateWhere: ManagerAggregateStats_bool_exp!\n $statsWhere: ManagerStats_bool_exp!\n $delegationWhere: RateManagerDelegation_bool_exp!\n $floorWhere: DepositorFloorConfig_bool_exp!\n $statsLimit: Int\n ) {\n RateManager(where: $managerWhere) {\n ${LEGACY_RATE_MANAGER_FIELDS}\n }\n RateManagerRate(where: $rateWhere) {\n ${RATE_MANAGER_RATE_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${LEGACY_RATE_MANAGER_AGGREGATE_FIELDS}\n }\n ManagerStats(\n where: $statsWhere\n order_by: { updatedAt: desc }\n limit: $statsLimit\n ) {\n ${MANAGER_STATS_FIELDS}\n }\n RateManagerDelegation(where: $delegationWhere) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n DepositorFloorConfig(where: $floorWhere) {\n ${DEPOSITOR_FLOOR_CONFIG_FIELDS}\n }\n }\n`;\n\nexport const MANAGER_DAILY_SNAPSHOTS_QUERY = /* GraphQL */ `\n query ManagerDailySnapshots(\n $where: ManagerDailySnapshot_bool_exp!\n $order_by: [ManagerDailySnapshot_order_by!]\n $limit: Int\n ) {\n ManagerDailySnapshot(\n where: $where\n order_by: $order_by\n limit: $limit\n ) {\n ${MANAGER_DAILY_SNAPSHOT_FIELDS}\n }\n }\n`;\n\nexport const RATE_MANAGER_DELEGATIONS_QUERY = /* GraphQL */ `\n query VaultDelegations(\n $where: Deposit_bool_exp!\n $order_by: [Deposit_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Deposit(\n where: $where\n order_by: $order_by\n limit: $limit\n offset: $offset\n ) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_DELEGATIONS_QUERY = /* GraphQL */ `\n query VaultDelegations(\n $where: RateManagerDelegation_bool_exp!\n $order_by: [RateManagerDelegation_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManagerDelegation(\n where: $where\n order_by: $order_by\n limit: $limit\n offset: $offset\n ) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_DELEGATION_QUERY = /* GraphQL */ `\n query DepositDelegation($depositId: String!) {\n Deposit(where: { id: { _eq: $depositId } }, limit: 1) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSIT_DELEGATION_QUERY = /* GraphQL */ `\n query DepositDelegation($depositId: String!) {\n RateManagerDelegation(where: { depositId: { _eq: $depositId } }, limit: 1) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n }\n`;\nexport const EXPIRED_INTENTS_QUERY = /* GraphQL */ `\n query GetExpiredIntents($now: numeric!, $limit: Int, $depositIds: [String!]) {\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(where: { intentHash: { _in: $intentHashes } }) {\n intentHash\n isManualRelease\n fundsTransferredTo\n }\n }\n`;\n\nexport const INTENT_FULFILLMENT_AMOUNTS_QUERY = /* GraphQL */ `\n query GetFulfillmentAmounts($intentHash: String!) {\n Intent(where: { intentHash: { _eq: $intentHash } }, limit: 1) {\n intentHash\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const MANUAL_RATE_UPDATES_QUERY = /* GraphQL */ `\n query ManualRateUpdates(\n $where: RateManagerV1_RateManagerRateUpdated_bool_exp!\n $order_by: [RateManagerV1_RateManagerRateUpdated_order_by!]\n $limit: Int\n ) {\n RateManagerV1_RateManagerRateUpdated(where: $where, order_by: $order_by, limit: $limit) {\n id\n rateManagerId\n paymentMethod\n currency: currencyCode\n minRate: rate\n currencyCode\n rate\n }\n }\n`;\n\nexport const RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY = /* GraphQL */ `\n query RateManagerAssignmentEvents(\n $setWhere: EscrowV2_DepositRateManagerSet_bool_exp!\n $clearedWhere: EscrowV2_DepositRateManagerCleared_bool_exp!\n $limit: Int\n $offset: Int\n ) {\n EscrowV2_DepositRateManagerSet(\n where: $setWhere\n order_by: [{ id: desc }]\n limit: $limit\n offset: $offset\n ) {\n id\n rateManagerId\n rateManager\n escrow\n depositIdOnContract: depositId\n }\n EscrowV2_DepositRateManagerCleared(\n where: $clearedWhere\n order_by: [{ id: desc }]\n limit: $limit\n offset: $offset\n ) {\n id\n rateManagerId\n rateManager\n escrow\n depositIdOnContract: depositId\n }\n }\n`;\n\nexport const ORACLE_CONFIG_UPDATES_QUERY = /* GraphQL */ `\n query OracleConfigUpdates(\n $where: EscrowV2_DepositOracleRateConfigSet_bool_exp!\n $order_by: [EscrowV2_DepositOracleRateConfigSet_order_by!]\n $limit: Int\n ) {\n EscrowV2_DepositOracleRateConfigSet(where: $where, order_by: $order_by, limit: $limit) {\n id\n escrow\n depositIdOnContract: depositId\n paymentMethod\n currency: currencyCode\n currencyCode\n adapter\n spreadBps\n maxStaleness\n adapterConfig\n }\n }\n`;\n\nexport const LEGACY_ORACLE_CONFIG_UPDATES_QUERY = /* GraphQL */ `\n query OracleConfigUpdates(\n $where: RateManagerV1_DepositorFloorSet_bool_exp!\n $order_by: [RateManagerV1_DepositorFloorSet_order_by!]\n $limit: Int\n ) {\n RateManagerV1_DepositorFloorSet(where: $where, order_by: $order_by, limit: $limit) {\n id\n rateManagerId\n escrow\n depositIdOnContract: depositId\n paymentMethod\n currency: currencyCode\n adapter: oracleAdapter\n spreadBps: floorSpreadBps\n maxStaleness\n adapterConfig\n currencyCode\n floorFixed\n floorSpreadBps\n oracleAdapter\n enabled\n }\n }\n`;\n\nexport const DEPOSIT_EVENTS_QUERY = /* GraphQL */ `\n query GetDepositEvents($depositId: numeric!) {\n depositsV21: Escrow_V21_DepositReceived(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n depositsV2: EscrowV2_DepositReceived(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV21: Escrow_V21_DepositFundsAdded(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV2: EscrowV2_DepositFundsAdded(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV21: Escrow_V21_DepositWithdrawn(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV2: EscrowV2_DepositWithdrawn(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n }\n`;\n\nexport const DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY = /* GraphQL */ `\n query GetDepositEventsByDepositor($depositId: numeric!, $depositor: String!) {\n depositsV21: Escrow_V21_DepositReceived(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n depositsV2: EscrowV2_DepositReceived(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV21: Escrow_V21_DepositFundsAdded(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV2: EscrowV2_DepositFundsAdded(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV21: Escrow_V21_DepositWithdrawn(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV2: EscrowV2_DepositWithdrawn(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n }\n`;\n\nconst DEPOSIT_FUND_ACTIVITY_FIELDS = `\n id\n chainId\n depositId\n depositor\n activityType\n amount\n blockNumber\n timestamp\n txHash\n`;\n\nconst DEPOSIT_DAILY_SNAPSHOT_FIELDS = `\n id\n chainId\n depositId\n depositor\n dayTimestamp\n remainingDeposits\n outstandingIntentAmount\n totalAmountTaken\n totalWithdrawn\n signaledIntents\n fulfilledIntents\n prunedIntents\n successRateBps\n dailyVolume\n dailyPnlUsdCents\n cumulativeVolume\n cumulativePnlUsdCents\n updatedAt\n`;\n\nexport const DEPOSIT_FUND_ACTIVITIES_QUERY = /* GraphQL */ `\n query GetDepositFundActivities($depositId: String!) {\n DepositFundActivity(\n where: { depositId: { _eq: $depositId } }\n order_by: { timestamp: desc }\n ) {\n ${DEPOSIT_FUND_ACTIVITY_FIELDS}\n }\n }\n`;\n\nexport const MAKER_FUND_ACTIVITIES_QUERY = /* GraphQL */ `\n query GetMakerFundActivities($depositor: String!, $limit: Int) {\n DepositFundActivity(\n where: { depositor: { _eq: $depositor } }\n order_by: { timestamp: desc }\n limit: $limit\n ) {\n ${DEPOSIT_FUND_ACTIVITY_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_DAILY_SNAPSHOTS_QUERY = /* GraphQL */ `\n query GetDepositDailySnapshots($depositId: String!, $limit: Int) {\n DepositDailySnapshot(\n where: { depositId: { _eq: $depositId } }\n order_by: { dayTimestamp: asc }\n limit: $limit\n ) {\n ${DEPOSIT_DAILY_SNAPSHOT_FIELDS}\n }\n }\n`;\n\nexport const FULFILLMENT_AND_PAYMENT_QUERY = /* GraphQL */ `\n query PaymentVerificationForFulfilledIntent($intentHash: String!) {\n Orchestrator_V21_IntentFulfilled(where: { intentHash: { _eq: $intentHash } }) {\n id\n intentHash\n amount\n isManualRelease\n fundsTransferredTo\n }\n UnifiedVerifier_V21_PaymentVerified(where: { intentHash: { _eq: $intentHash } }) {\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';\nimport { parseBigIntLike } from '../utils/bigint';\n\nconst ZERO = '0x0000000000000000000000000000000000000000';\n\nfunction toBigInt(value: string | number | bigint | null | undefined): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return parseBigIntLike(value);\n } catch {\n return 0n;\n }\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return ZERO;\n return value.startsWith('0x') ? value : ZERO;\n}\n\nfunction resolveActiveConversionRate(currency: {\n effectiveOracleRate?: string | null;\n conversionRate?: string | null;\n minConversionRate?: string | null;\n}): string | number | bigint | null | undefined {\n const candidates = [\n currency.effectiveOracleRate,\n currency.conversionRate,\n currency.minConversionRate,\n ];\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) continue;\n const parsed = toBigInt(candidate);\n if (parsed > 0n) {\n return candidate;\n }\n }\n\n return currency.effectiveOracleRate ?? currency.conversionRate ?? currency.minConversionRate;\n}\n\nexport function extractDepositId(compositeId: string): string {\n const parts = compositeId.split('_');\n return parts[1] || '0';\n}\n\nexport function createCompositeDepositId(\n escrowAddress: string,\n depositId: string | bigint,\n): string {\n return `${escrowAddress.toLowerCase()}_${depositId.toString()}`;\n}\n\nexport function convertIndexerDepositToEscrowView(\n deposit: DepositWithRelations,\n _chainId: number,\n _escrowAddress: string,\n): EscrowDepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(\n (pm) => (pm as any).active !== false,\n );\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: '',\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(resolveActiveConversionRate(cur)),\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 =\n remaining +\n outstanding +\n toBigInt(deposit.totalAmountTaken ?? 0) +\n 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 rateManagerId: deposit.rateManagerId ?? null,\n depositAmount,\n intentAmountRange: {\n min: toBigInt(deposit.intentAmountMin),\n max: toBigInt(deposit.intentAmountMax),\n },\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(\n deposits: DepositWithRelations[],\n chainId: number,\n escrowAddress: string,\n): EscrowDepositView[] {\n return deposits\n .filter(\n (d) =>\n d.depositor &&\n d.depositor.toLowerCase() !== ZERO &&\n d.acceptingIntents &&\n toBigInt(d.remainingDeposits) > 0n &&\n d.status === 'ACTIVE',\n )\n .map((d) => convertIndexerDepositToEscrowView(d, chainId, escrowAddress));\n}\n\nexport function convertIndexerIntentsToEscrowViews(\n intents: IntentEntity[],\n depositViewsById: Map<string, EscrowDepositView>,\n): 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","export function isSchemaCompatibilityError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n if (!message.includes('graphql errors')) return false;\n return (\n message.includes('cannot query field') ||\n message.includes('does not exist') ||\n message.includes('not found in type')\n );\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSITS_QUERY,\n DEPOSITS_BY_IDS_QUERY,\n LEGACY_DEPOSITS_QUERY,\n LEGACY_DEPOSITS_BY_IDS_QUERY,\n DEPOSIT_RELATIONS_QUERY,\n LEGACY_DEPOSIT_RELATIONS_QUERY,\n DEPOSIT_WITH_RELATIONS_QUERY,\n LEGACY_DEPOSIT_WITH_RELATIONS_QUERY,\n INTENTS_QUERY,\n LEGACY_INTENTS_QUERY,\n EXPIRED_INTENTS_QUERY,\n INTENT_FULFILLMENTS_QUERY,\n INTENT_FULFILLMENT_AMOUNTS_QUERY,\n PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n DEPOSIT_EVENTS_QUERY,\n DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY,\n DEPOSIT_FUND_ACTIVITIES_QUERY,\n MAKER_FUND_ACTIVITIES_QUERY,\n DEPOSIT_DAILY_SNAPSHOTS_QUERY,\n} from './queries';\nimport type {\n DepositEntity,\n DepositPaymentMethodEntity,\n MethodCurrencyEntity,\n IntentEntity,\n IntentStatus,\n DepositWithRelations,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositEventEntity,\n DepositEventsResponse,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\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 delegate: string;\n /** True to only include deposits with a non-zero delegate, false for zero delegate. */\n delegateIsSet: boolean;\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 }>(\n items: T[],\n): 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);\n else map.set(key, [item]);\n }\n return map;\n}\n\nconst DEFAULT_LIMIT = 100;\nconst DEFAULT_ORDER_FIELD: NonNullable<PaginationOptions['orderBy']> = 'remainingDeposits';\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport class IndexerDepositService {\n constructor(private client: IndexerClient) {}\n\n private async queryWithLegacyFallback<T>(params: {\n query: string;\n legacyQuery: string;\n variables?: Record<string, unknown>;\n }): Promise<T> {\n try {\n return await this.client.query<T>({\n query: params.query,\n variables: params.variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return this.client.query<T>({\n query: params.legacyQuery,\n variables: params.variables,\n });\n }\n }\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.delegate) {\n where.delegate = { _ilike: filter.delegate };\n } else if (filter.delegateIsSet !== undefined) {\n where.delegate = filter.delegateIsSet ? { _neq: ZERO_ADDRESS } : { _eq: ZERO_ADDRESS };\n }\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)\n 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']> =\n 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.queryWithLegacyFallback<{\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({\n query: DEPOSIT_RELATIONS_QUERY,\n legacyQuery: LEGACY_DEPOSIT_RELATIONS_QUERY,\n variables: { depositIds },\n });\n\n const paymentMethodsByDeposit = groupByDepositId(result.DepositPaymentMethod ?? []);\n const currenciesByDeposit = groupByDepositId(result.MethodCurrency ?? []);\n return { paymentMethodsByDeposit, currenciesByDeposit };\n }\n\n private async fetchIntents(params: {\n depositIds?: string[];\n owner?: string;\n statuses?: IntentStatus[];\n limit?: number;\n offset?: number;\n }): 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.queryWithLegacyFallback<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n legacyQuery: LEGACY_INTENTS_QUERY,\n variables: {\n where,\n order_by: [{ signalTimestamp: 'desc' }],\n limit: params.limit,\n offset: params.offset,\n },\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\n ? this.fetchIntents({ depositIds, statuses: options.intentStatuses })\n : Promise.resolve([]),\n ]);\n const intentsByDeposit = options.includeIntents\n ? groupByDepositId(intents)\n : 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(\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n ): Promise<DepositEntity[]> {\n const result = await this.queryWithLegacyFallback<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_QUERY,\n legacyQuery: LEGACY_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.queryWithLegacyFallback<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_BY_IDS_QUERY,\n legacyQuery: LEGACY_DEPOSITS_BY_IDS_QUERY,\n variables: { ids },\n });\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(\n depositIds: string[],\n statuses?: IntentStatus[],\n ): 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 fetchIntentByHash(intentHash: string): Promise<IntentEntity | null> {\n if (!intentHash) return null;\n\n const result = await this.queryWithLegacyFallback<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n legacyQuery: LEGACY_INTENTS_QUERY,\n variables: {\n where: { intentHash: { _eq: intentHash.toLowerCase() } },\n limit: 1,\n order_by: [{ signalTimestamp: 'desc' }],\n },\n });\n\n return result.Intent?.[0] ?? null;\n }\n\n async fetchDepositWithRelations(\n id: string,\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {},\n ): Promise<DepositWithRelations | null> {\n const result = await this.queryWithLegacyFallback<{\n Deposit_by_pk?: DepositEntity | null;\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({\n query: DEPOSIT_WITH_RELATIONS_QUERY,\n legacyQuery: LEGACY_DEPOSIT_WITH_RELATIONS_QUERY,\n variables: { id },\n });\n\n const deposit = result.Deposit_by_pk;\n if (!deposit) return null;\n const base: DepositWithRelations = {\n ...deposit,\n paymentMethods: result.DepositPaymentMethod ?? [],\n currencies: result.MethodCurrency ?? [],\n };\n if (!options.includeIntents) return base;\n const intents = await this.fetchIntents({\n depositIds: [deposit.id],\n statuses: options.intentStatuses,\n });\n return { ...base, intents };\n }\n\n async fetchExpiredIntents(params: {\n now: bigint | string;\n depositIds: string[];\n limit?: number;\n }): 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<{\n Orchestrator_V21_IntentFulfilled?: IntentFulfilledEntity[];\n }>({\n query: INTENT_FULFILLMENTS_QUERY,\n variables: { intentHashes: uniqueHashes },\n });\n\n return result.Orchestrator_V21_IntentFulfilled ?? [];\n }\n\n async fetchIntentFulfillmentAmounts(\n intentHash: string,\n ): Promise<IntentFulfillmentAmountsEntity | null> {\n if (!intentHash) return null;\n const normalizedIntentHash = intentHash.toLowerCase();\n\n const result = await this.client.query<{ Intent?: IntentFulfillmentAmountsEntity[] }>({\n query: INTENT_FULFILLMENT_AMOUNTS_QUERY,\n variables: { intentHash: normalizedIntentHash },\n });\n\n return result.Intent?.[0] ?? null;\n }\n\n async resolvePayeeHash(params: {\n escrowAddress?: string | null;\n depositId?: string | number | bigint | null;\n paymentMethodHash?: string | null;\n }): Promise<string | null> {\n try {\n const { escrowAddress, depositId, paymentMethodHash } = params;\n if (!escrowAddress || depositId === null || depositId === undefined || !paymentMethodHash)\n 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(\n (pm) => (pm.paymentMethodHash ?? '').toLowerCase() === target,\n );\n return match?.payeeDetailsHash ?? null;\n } catch {\n return null;\n }\n }\n\n async fetchDepositEvents(\n depositIdOnContract: string,\n options?: { escrowAddress?: string | null; depositor?: string | null },\n ): Promise<DepositEventsResponse> {\n let result: Record<string, DepositEventEntity[] | undefined>;\n // Event entities are keyed by numeric depositId and do not expose escrow identity.\n // Scope by depositor when available to avoid cross-escrow event leakage.\n const normalizedDepositor = options?.depositor?.trim().toLowerCase();\n const query = normalizedDepositor ? DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY : DEPOSIT_EVENTS_QUERY;\n const variables = normalizedDepositor\n ? { depositId: depositIdOnContract, depositor: normalizedDepositor }\n : { depositId: depositIdOnContract };\n\n try {\n result = await this.client.query<Record<string, DepositEventEntity[] | undefined>>({\n query,\n variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return { deposits: [], fundsAdded: [], withdrawals: [] };\n }\n\n const mergeEvents = (\n ...groups: Array<DepositEventEntity[] | undefined>\n ): DepositEventEntity[] => {\n const merged: DepositEventEntity[] = [];\n const seen = new Set<string>();\n for (const group of groups) {\n for (const event of group ?? []) {\n const key = (event.id ?? '').toLowerCase();\n if (key && seen.has(key)) continue;\n if (key) seen.add(key);\n merged.push(event);\n }\n }\n return merged;\n };\n\n return {\n deposits: mergeEvents(\n result.depositsV21 ?? result.Escrow_V21_DepositReceived,\n result.depositsV2 ?? result.EscrowV2_DepositReceived,\n result.deposits,\n ),\n fundsAdded: mergeEvents(\n result.fundsAddedV21 ?? result.Escrow_V21_DepositFundsAdded,\n result.fundsAddedV2 ?? result.EscrowV2_DepositFundsAdded,\n result.fundsAdded,\n ),\n withdrawals: mergeEvents(\n result.withdrawalsV21 ?? result.Escrow_V21_DepositWithdrawn,\n result.withdrawalsV2 ?? result.EscrowV2_DepositWithdrawn,\n result.withdrawals,\n ),\n };\n }\n\n async fetchDepositsByPayeeHash(\n payeeHash: string,\n options: {\n paymentMethodHash?: string;\n limit?: number;\n includeIntents?: boolean;\n intentStatuses?: IntentStatus[];\n } = {},\n ): 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 = {\n _eq: options.paymentMethodHash.toLowerCase?.() ?? options.paymentMethodHash,\n };\n }\n\n const result = await this.client.query<{ DepositPaymentMethod?: DepositPaymentMethodEntity[] }>(\n {\n query: PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n variables: { where, limit: options.limit },\n },\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 /**\n * Fetch chronological fund activities for a deposit.\n */\n async fetchDepositFundActivities(\n compositeDepositId: string,\n ): Promise<DepositFundActivityEntity[]> {\n try {\n const result = await this.client.query<{\n DepositFundActivity?: DepositFundActivityEntity[];\n }>({\n query: DEPOSIT_FUND_ACTIVITIES_QUERY,\n variables: { depositId: compositeDepositId },\n });\n\n return result.DepositFundActivity ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n /**\n * Fetch fund activities across all deposits for a maker address.\n */\n async fetchMakerFundActivities(\n depositor: string,\n limit = 50,\n ): Promise<DepositFundActivityEntity[]> {\n const normalized = depositor?.trim().toLowerCase();\n if (!normalized) return [];\n\n try {\n const result = await this.client.query<{\n DepositFundActivity?: DepositFundActivityEntity[];\n }>({\n query: MAKER_FUND_ACTIVITIES_QUERY,\n variables: { depositor: normalized, limit },\n });\n\n return result.DepositFundActivity ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n /**\n * Fetch daily snapshots for a deposit, ordered by day ascending.\n */\n async fetchDepositDailySnapshots(\n compositeDepositId: string,\n limit?: number,\n ): Promise<DepositDailySnapshotEntity[]> {\n try {\n const result = await this.client.query<{\n DepositDailySnapshot?: DepositDailySnapshotEntity[];\n }>({\n query: DEPOSIT_DAILY_SNAPSHOTS_QUERY,\n variables: {\n depositId: compositeDepositId,\n limit: limit ?? null,\n },\n });\n\n return result.DepositDailySnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSIT_DELEGATION_QUERY,\n LEGACY_DEPOSIT_DELEGATION_QUERY,\n LEGACY_ORACLE_CONFIG_UPDATES_QUERY,\n LEGACY_RATE_MANAGER_DELEGATIONS_QUERY,\n LEGACY_RATE_MANAGER_DETAIL_QUERY,\n LEGACY_RATE_MANAGER_LIST_QUERY,\n MANAGER_DAILY_SNAPSHOTS_QUERY,\n MANUAL_RATE_UPDATES_QUERY,\n ORACLE_CONFIG_UPDATES_QUERY,\n RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY,\n RATE_MANAGER_DELEGATIONS_QUERY,\n RATE_MANAGER_DETAIL_QUERY,\n RATE_MANAGER_LIST_QUERY,\n} from './queries';\nimport { parseBigIntLike } from '../utils/bigint';\nimport type {\n DepositEntity,\n ManualRateUpdateEntity,\n OracleConfigUpdateEntity,\n ManagerAggregateStatsEntity,\n ManagerDailySnapshotEntity,\n ManagerStatsEntity,\n RateManagerDelegationEntity,\n RateManagerDetail,\n RateManagerEntity,\n RateManagerListItem,\n RateManagerRateEntity,\n} from './types';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\n\nexport type OrderDirection = 'asc' | 'desc';\n\nexport type RateManagerOrderField =\n | 'createdAt'\n | 'updatedAt'\n | 'fee'\n | 'maxFee'\n | 'rateManagerId'\n | 'currentDelegatedBalance'\n | 'totalFilledVolume';\n\ntype AggregateRateManagerOrderField = 'currentDelegatedBalance' | 'totalFilledVolume';\ntype BaseRateManagerOrderField = Exclude<RateManagerOrderField, AggregateRateManagerOrderField>;\ntype RateManagerDepositScope = { escrow: string; depositIdOnContract: string };\ntype RateManagerAssignmentEventEntity = {\n id: string;\n rateManagerId: string;\n rateManager?: string | null;\n escrow?: string | null;\n depositIdOnContract?: string | null;\n};\n\nexport type RateManagerFilter = Partial<{\n manager: string;\n name: string;\n hasHook: boolean;\n maxFee: string;\n rateManagerIds: string[];\n}>;\n\nexport type RateManagerPaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: RateManagerOrderField;\n orderDirection: OrderDirection;\n}>;\n\nexport type RateManagerDelegationPaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: 'createdAt' | 'updatedAt' | 'depositId' | 'delegatedAt';\n orderDirection: OrderDirection;\n rateManagerAddress: string;\n}>;\n\nconst DEFAULT_LIMIT = 50;\nconst RATE_MANAGER_HISTORY_PAGE_SIZE = 250;\n\nfunction normalizeRateManagerId(value?: string | null): string {\n if (!value) return '';\n return value.toLowerCase();\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return '';\n return value.toLowerCase();\n}\n\nfunction parseScopedRateManagerFilterId(\n value: string,\n): { rateManagerAddress: string; rateManagerId: string } | null {\n const trimmed = value.trim().toLowerCase();\n if (!trimmed) return null;\n\n const separatorIndex = trimmed.indexOf(':');\n if (separatorIndex <= 0) return null;\n\n const rateManagerAddress = normalizeAddress(trimmed.slice(0, separatorIndex));\n const rateManagerId = normalizeRateManagerId(trimmed.slice(separatorIndex + 1));\n\n if (!rateManagerAddress.startsWith('0x') || !rateManagerId) {\n return null;\n }\n\n return { rateManagerAddress, rateManagerId };\n}\n\nfunction getManagerScopeKey(\n rateManagerId?: string | null,\n rateManagerAddress?: string | null,\n): string {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n return normalizedRateManagerAddress\n ? `${normalizedRateManagerAddress}:${normalizedId}`\n : normalizedId;\n}\n\nfunction extractRateManagerAddressFromScopedId(id?: string | null): string | null {\n if (!id) return null;\n const parts = id.split('_');\n // Current scoped IDs: chainId_rateManagerAddress_rateManagerId...\n if (parts.length < 3) return null;\n const rateManagerAddress = parts[1] ?? '';\n return rateManagerAddress.startsWith('0x') ? rateManagerAddress.toLowerCase() : null;\n}\n\nfunction buildRateManagerAddressScopedIdPattern(\n rateManagerId: string,\n rateManagerAddress: string,\n): string {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n return `%_${normalizedRateManagerAddress}_${normalizedId}`;\n}\n\nfunction buildRateManagerScopedIdPattern(\n rateManagerId: string,\n rateManagerAddress: string,\n): string {\n return `${buildRateManagerAddressScopedIdPattern(rateManagerId, rateManagerAddress)}_%`;\n}\n\nfunction normalizeCompositeDepositId(depositId: string, escrowAddress?: string | null): string {\n const normalizedDepositId = depositId.trim().toLowerCase();\n if (!normalizedDepositId) return '';\n if (normalizedDepositId.includes('_')) return normalizedDepositId;\n const normalizedEscrow = normalizeAddress(escrowAddress);\n if (normalizedEscrow) {\n return `${normalizedEscrow}_${normalizedDepositId}`;\n }\n return normalizedDepositId;\n}\n\nfunction extractDepositIdOnContract(compositeDepositId?: string | null): string | null {\n if (!compositeDepositId) return null;\n const parts = compositeDepositId.split('_');\n const rawDepositId = parts[parts.length - 1];\n return rawDepositId && /^\\d+$/.test(rawDepositId) ? rawDepositId : null;\n}\n\nfunction extractEscrowAddressFromCompositeDepositId(\n compositeDepositId?: string | null,\n): string | null {\n if (!compositeDepositId) return null;\n const [escrowAddress] = compositeDepositId.split('_');\n return escrowAddress?.startsWith('0x') ? escrowAddress.toLowerCase() : null;\n}\n\ninterface ParsedRateManagerIds {\n bare: Set<string>;\n scoped: Map<string, { rateManagerAddress: string; rateManagerId: string }>;\n}\n\nfunction parseRateManagerFilterIds(rateManagerIds: string[]): ParsedRateManagerIds {\n const bare = new Set<string>();\n const scoped = new Map<string, { rateManagerAddress: string; rateManagerId: string }>();\n\n for (const value of rateManagerIds) {\n const scopedRateManager = parseScopedRateManagerFilterId(value);\n if (scopedRateManager) {\n scoped.set(\n getManagerScopeKey(scopedRateManager.rateManagerId, scopedRateManager.rateManagerAddress),\n scopedRateManager,\n );\n continue;\n }\n\n const normalizedRateManagerId = normalizeRateManagerId(value);\n if (normalizedRateManagerId) {\n bare.add(normalizedRateManagerId);\n }\n }\n\n return { bare, scoped };\n}\n\nfunction buildDepositScopeKey(scope: RateManagerDepositScope): string {\n return `${scope.escrow}:${scope.depositIdOnContract}`;\n}\n\nfunction toSafeBigInt(value?: string | null): bigint {\n if (!value) return 0n;\n try {\n return parseBigIntLike(value);\n } catch {\n return 0n;\n }\n}\n\nfunction compareBigInt(a: bigint, b: bigint, direction: OrderDirection): number {\n if (a === b) return 0;\n if (direction === 'asc') return a < b ? -1 : 1;\n return a > b ? -1 : 1;\n}\n\nfunction parseEventCursorId(id?: string | null): {\n chainId: bigint;\n blockNumber: bigint;\n logIndex: bigint;\n} | null {\n if (!id) return null;\n\n const [chainIdRaw, blockNumberRaw, logIndexRaw] = id.split('_');\n if (!chainIdRaw || !blockNumberRaw || !logIndexRaw) return null;\n if (!/^\\d+$/.test(chainIdRaw) || !/^\\d+$/.test(blockNumberRaw) || !/^\\d+$/.test(logIndexRaw)) {\n return null;\n }\n\n try {\n return {\n chainId: BigInt(chainIdRaw),\n blockNumber: BigInt(blockNumberRaw),\n logIndex: BigInt(logIndexRaw),\n };\n } catch {\n return null;\n }\n}\n\nexport function compareEventCursorIdsByRecency(\n leftId?: string | null,\n rightId?: string | null,\n): number {\n const left = parseEventCursorId(leftId);\n const right = parseEventCursorId(rightId);\n\n if (left && right) {\n if (left.chainId !== right.chainId) {\n return left.chainId > right.chainId ? -1 : 1;\n }\n if (left.blockNumber !== right.blockNumber) {\n return left.blockNumber > right.blockNumber ? -1 : 1;\n }\n if (left.logIndex !== right.logIndex) {\n return left.logIndex > right.logIndex ? -1 : 1;\n }\n return 0;\n }\n\n return (rightId ?? '').localeCompare(leftId ?? '');\n}\n\nfunction isAggregateOrderField(\n field: RateManagerOrderField,\n): field is AggregateRateManagerOrderField {\n return field === 'currentDelegatedBalance' || field === 'totalFilledVolume';\n}\n\nfunction normalizeRateManagerEntity(manager: RateManagerEntity): RateManagerEntity {\n return {\n ...manager,\n rateManagerAddress: normalizeAddress(manager.rateManagerAddress),\n };\n}\n\nfunction toDelegationEntityFromDeposit(\n deposit: Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >,\n): RateManagerDelegationEntity | null {\n const rateManagerId = normalizeRateManagerId(deposit.rateManagerId);\n if (!rateManagerId) return null;\n const delegatedAt = deposit.delegatedAt ?? null;\n return {\n id: deposit.id,\n chainId: deposit.chainId,\n rateManagerId,\n rateManagerAddress: normalizeAddress(deposit.rateManagerAddress) || null,\n depositId: deposit.id,\n delegatedAt,\n createdAt: delegatedAt ?? deposit.updatedAt,\n updatedAt: deposit.updatedAt,\n };\n}\n\nexport class IndexerRateManagerService {\n constructor(private client: IndexerClient) {}\n\n private buildRateManagerScopeWhere(\n rateManagerIds?: string[],\n ): Record<string, unknown> | undefined {\n if (!rateManagerIds?.length) return undefined;\n\n const { bare, scoped } = parseRateManagerFilterIds(rateManagerIds);\n\n const scopeConditions: Array<Record<string, unknown>> = [];\n\n if (bare.size > 0) {\n scopeConditions.push({\n rateManagerId: { _in: [...bare] },\n });\n }\n\n for (const scopedRateManager of scoped.values()) {\n scopeConditions.push({\n rateManagerId: { _eq: scopedRateManager.rateManagerId },\n rateManagerAddress: { _eq: scopedRateManager.rateManagerAddress },\n });\n }\n\n if (scopeConditions.length === 1) {\n return scopeConditions[0];\n }\n if (scopeConditions.length > 1) {\n return { _or: scopeConditions };\n }\n\n return undefined;\n }\n\n private buildWhere(filter?: RateManagerFilter): Record<string, unknown> | undefined {\n if (!filter) return undefined;\n\n const where: Record<string, unknown> = {};\n\n if (filter.manager) {\n where.manager = { _ilike: filter.manager };\n }\n\n if (filter.name) {\n where.name = { _ilike: `%${filter.name}%` };\n }\n\n if (filter.maxFee) {\n where.maxFee = { _lte: filter.maxFee };\n }\n\n const scopeWhere = this.buildRateManagerScopeWhere(filter.rateManagerIds);\n if (scopeWhere) {\n Object.assign(where, scopeWhere);\n }\n\n return Object.keys(where).length ? where : undefined;\n }\n\n private buildAggregateWhere(filter?: RateManagerFilter): Record<string, unknown> {\n return this.buildRateManagerScopeWhere(filter?.rateManagerIds) ?? {};\n }\n\n private buildLegacyAggregateWhere(filter?: RateManagerFilter): Record<string, unknown> {\n const rateManagerIds = filter?.rateManagerIds;\n if (!rateManagerIds?.length) return {};\n\n const { bare, scoped } = parseRateManagerFilterIds(rateManagerIds);\n\n const scopeConditions: Array<Record<string, unknown>> = [];\n\n if (bare.size > 0) {\n scopeConditions.push({\n rateManagerId: { _in: [...bare] },\n });\n }\n\n for (const scopedRateManager of scoped.values()) {\n scopeConditions.push({\n rateManagerId: { _eq: scopedRateManager.rateManagerId },\n id: {\n _ilike: buildRateManagerAddressScopedIdPattern(\n scopedRateManager.rateManagerId,\n scopedRateManager.rateManagerAddress,\n ),\n },\n });\n }\n\n if (scopeConditions.length === 1) {\n return scopeConditions[0] ?? {};\n }\n if (scopeConditions.length > 1) {\n return { _or: scopeConditions };\n }\n\n return {};\n }\n\n private buildOrderBy(\n pagination?: RateManagerPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'createdAt';\n const field: BaseRateManagerOrderField = isAggregateOrderField(rawField)\n ? 'createdAt'\n : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private toRateManagerListItems(result: {\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }): RateManagerListItem[] {\n const managers = (result.RateManager ?? []).map(normalizeRateManagerEntity);\n const aggregatesByScope = new Map<string, ManagerAggregateStatsEntity>();\n\n for (const aggregate of result.ManagerAggregateStats ?? []) {\n const aggregateRateManagerAddress =\n normalizeAddress(aggregate.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(aggregate.id);\n const scopeKey = getManagerScopeKey(aggregate.rateManagerId, aggregateRateManagerAddress);\n aggregatesByScope.set(scopeKey, aggregate);\n }\n\n return managers.map((manager) => ({\n manager,\n aggregate:\n aggregatesByScope.get(\n getManagerScopeKey(manager.rateManagerId, normalizeAddress(manager.rateManagerAddress)),\n ) ??\n aggregatesByScope.get(getManagerScopeKey(manager.rateManagerId)) ??\n null,\n }));\n }\n\n private applyHookFilter(rows: RateManagerListItem[], hasHook?: boolean): RateManagerListItem[] {\n if (hasHook === undefined) return rows;\n // Hook metadata is not indexed in current schema — return no matches for\n // hasHook=true to avoid silently ignoring the filter.\n return hasHook ? [] : rows;\n }\n\n private async queryRateManagerList(\n variables: Record<string, unknown>,\n legacyVariables: Record<string, unknown>,\n ): Promise<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }> {\n try {\n return await this.client.query<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }>({\n query: RATE_MANAGER_LIST_QUERY,\n variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n return this.client.query<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_LIST_QUERY,\n variables: legacyVariables,\n });\n }\n }\n\n private buildDelegationOrderBy(\n pagination?: RateManagerDelegationPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'updatedAt';\n const field = rawField === 'createdAt' ? 'delegatedAt' : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private buildLegacyDelegationOrderBy(\n pagination?: RateManagerDelegationPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'updatedAt';\n const field = rawField === 'delegatedAt' ? 'createdAt' : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private async fetchCurrentRateManagerDepositScopes(\n rateManagerId: string,\n rateManagerAddress?: string | null,\n ): Promise<RateManagerDepositScope[]> {\n const scopes = new Map<string, RateManagerDepositScope>();\n let offset = 0;\n\n for (;;) {\n const delegations = await this.fetchRateManagerDelegations(rateManagerId, {\n limit: RATE_MANAGER_HISTORY_PAGE_SIZE,\n offset,\n orderBy: 'delegatedAt',\n orderDirection: 'desc',\n rateManagerAddress: rateManagerAddress || undefined,\n });\n\n for (const delegation of delegations) {\n const escrow = extractEscrowAddressFromCompositeDepositId(delegation.depositId);\n const depositIdOnContract = extractDepositIdOnContract(delegation.depositId);\n if (!escrow || !depositIdOnContract) continue;\n const scope = { escrow, depositIdOnContract };\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n if (delegations.length < RATE_MANAGER_HISTORY_PAGE_SIZE) {\n break;\n }\n offset += RATE_MANAGER_HISTORY_PAGE_SIZE;\n }\n\n return [...scopes.values()];\n }\n\n private async fetchHistoricalRateManagerDepositScopes(\n rateManagerId: string,\n rateManagerAddress?: string | null,\n ): Promise<RateManagerDepositScope[]> {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n const scopes = new Map<string, RateManagerDepositScope>();\n const currentScopes = await this.fetchCurrentRateManagerDepositScopes(\n normalizedId,\n normalizedRateManagerAddress || undefined,\n );\n\n for (const scope of currentScopes) {\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n try {\n let offset = 0;\n for (;;) {\n const result = await this.client.query<{\n EscrowV2_DepositRateManagerSet?: RateManagerAssignmentEventEntity[];\n EscrowV2_DepositRateManagerCleared?: RateManagerAssignmentEventEntity[];\n }>({\n query: RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY,\n variables: {\n setWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManager: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n clearedWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManager: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n limit: RATE_MANAGER_HISTORY_PAGE_SIZE,\n offset,\n },\n });\n\n const setEvents = result.EscrowV2_DepositRateManagerSet ?? [];\n const clearedEvents = result.EscrowV2_DepositRateManagerCleared ?? [];\n for (const event of [...setEvents, ...clearedEvents]) {\n const escrow = normalizeAddress(event.escrow);\n const depositIdOnContract = event.depositIdOnContract?.toString() ?? '';\n if (!escrow || !depositIdOnContract) continue;\n const scope = { escrow, depositIdOnContract };\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n if (\n setEvents.length < RATE_MANAGER_HISTORY_PAGE_SIZE &&\n clearedEvents.length < RATE_MANAGER_HISTORY_PAGE_SIZE\n ) {\n break;\n }\n offset += RATE_MANAGER_HISTORY_PAGE_SIZE;\n }\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n }\n\n return [...scopes.values()];\n }\n\n async fetchRateManagers(\n pagination?: RateManagerPaginationOptions,\n filter?: RateManagerFilter,\n ): Promise<RateManagerListItem[]> {\n const orderBy = pagination?.orderBy ?? 'createdAt';\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n const limit = pagination?.limit ?? DEFAULT_LIMIT;\n const offset = pagination?.offset ?? 0;\n const where = this.buildWhere(filter);\n const aggregateWhere = this.buildAggregateWhere(filter);\n const legacyAggregateWhere = this.buildLegacyAggregateWhere(filter);\n\n if (isAggregateOrderField(orderBy)) {\n const result = await this.queryRateManagerList(\n {\n where,\n aggregateWhere,\n order_by: [{ createdAt: 'desc' }],\n },\n {\n where,\n aggregateWhere: legacyAggregateWhere,\n order_by: [{ createdAt: 'desc' }],\n },\n );\n\n const scopedRows = this.applyHookFilter(this.toRateManagerListItems(result), filter?.hasHook);\n\n const sorted = scopedRows.sort((a, b) => {\n const av =\n orderBy === 'currentDelegatedBalance'\n ? toSafeBigInt(a.aggregate?.currentDelegatedBalance)\n : toSafeBigInt(a.aggregate?.totalFilledVolume);\n const bv =\n orderBy === 'currentDelegatedBalance'\n ? toSafeBigInt(b.aggregate?.currentDelegatedBalance)\n : toSafeBigInt(b.aggregate?.totalFilledVolume);\n\n const aggregateCmp = compareBigInt(av, bv, direction);\n if (aggregateCmp !== 0) return aggregateCmp;\n\n const createdAtCmp = compareBigInt(\n toSafeBigInt(a.manager.createdAt),\n toSafeBigInt(b.manager.createdAt),\n 'desc',\n );\n if (createdAtCmp !== 0) return createdAtCmp;\n\n return a.manager.rateManagerId.localeCompare(b.manager.rateManagerId);\n });\n\n return sorted.slice(offset, offset + limit);\n }\n\n const result = await this.queryRateManagerList(\n {\n where,\n aggregateWhere,\n order_by: this.buildOrderBy(pagination),\n limit,\n offset,\n },\n {\n where,\n aggregateWhere: legacyAggregateWhere,\n order_by: this.buildOrderBy(pagination),\n limit,\n offset,\n },\n );\n\n return this.applyHookFilter(this.toRateManagerListItems(result), filter?.hasHook);\n }\n\n async fetchRateManagerDetail(\n rateManagerId: string,\n options?: { statsLimit?: number; rateManagerAddress?: string | null },\n ): Promise<RateManagerDetail | null> {\n if (!rateManagerId) return null;\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n const baseVariables = {\n managerWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n rateWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n aggregateWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerAddressScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n statsWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n delegationWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n statsLimit: options?.statsLimit ?? 20,\n };\n const legacyVariables = {\n ...baseVariables,\n floorWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n };\n\n let managerRaw: RateManagerEntity | undefined;\n let scopedRates: RateManagerRateEntity[] = [];\n let scopedRecentStats: ManagerStatsEntity[] = [];\n let scopedDelegations: RateManagerDelegationEntity[] = [];\n let aggregate: ManagerAggregateStatsEntity | null = null;\n\n try {\n const result = await this.client.query<{\n RateManager?: RateManagerEntity[];\n RateManagerRate?: RateManagerRateEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n ManagerStats?: ManagerStatsEntity[];\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: RATE_MANAGER_DETAIL_QUERY,\n variables: baseVariables,\n });\n\n managerRaw = result.RateManager?.[0];\n if (!managerRaw) return null;\n const scopedRateManagerAddress = normalizeAddress(managerRaw.rateManagerAddress);\n scopedRates = (result.RateManagerRate ?? []).filter(\n (rate) => normalizeAddress(rate.rateManagerAddress) === scopedRateManagerAddress,\n );\n scopedRecentStats = (result.ManagerStats ?? []).filter((stats) => {\n const statsRateManagerAddress = normalizeAddress(stats.rateManagerAddress);\n return !statsRateManagerAddress || statsRateManagerAddress === scopedRateManagerAddress;\n });\n scopedDelegations = (result.Deposit ?? [])\n .map((deposit) => toDelegationEntityFromDeposit(deposit))\n .filter((delegation): delegation is RateManagerDelegationEntity => Boolean(delegation))\n .filter(\n (delegation) =>\n normalizeAddress(delegation.rateManagerAddress) === scopedRateManagerAddress,\n );\n aggregate =\n (result.ManagerAggregateStats ?? []).find(\n (stats) =>\n (normalizeAddress(stats.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(stats.id)) === scopedRateManagerAddress,\n ) ??\n result.ManagerAggregateStats?.[0] ??\n null;\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManager?: RateManagerEntity[];\n RateManagerRate?: RateManagerRateEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n ManagerStats?: ManagerStatsEntity[];\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_DETAIL_QUERY,\n variables: legacyVariables,\n });\n\n managerRaw = legacyResult.RateManager?.[0];\n if (!managerRaw) return null;\n const scopedRateManagerAddress = normalizeAddress(managerRaw.rateManagerAddress);\n scopedRates = (legacyResult.RateManagerRate ?? []).filter(\n (rate) => normalizeAddress(rate.rateManagerAddress) === scopedRateManagerAddress,\n );\n scopedRecentStats = (legacyResult.ManagerStats ?? []).filter((stats) => {\n const statsRateManagerAddress = normalizeAddress(stats.rateManagerAddress);\n return !statsRateManagerAddress || statsRateManagerAddress === scopedRateManagerAddress;\n });\n scopedDelegations = (legacyResult.RateManagerDelegation ?? []).filter(\n (delegation) =>\n normalizeAddress(delegation.rateManagerAddress) === scopedRateManagerAddress,\n );\n aggregate =\n (legacyResult.ManagerAggregateStats ?? []).find(\n (stats) =>\n (normalizeAddress(stats.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(stats.id)) === scopedRateManagerAddress,\n ) ??\n legacyResult.ManagerAggregateStats?.[0] ??\n null;\n }\n\n if (!managerRaw) return null;\n const manager = normalizeRateManagerEntity(managerRaw);\n\n return {\n manager,\n rates: scopedRates,\n aggregate,\n recentStats: scopedRecentStats,\n delegations: scopedDelegations,\n };\n }\n\n async fetchRateManagerDelegations(\n rateManagerId: string,\n pagination?: RateManagerDelegationPaginationOptions,\n ): Promise<RateManagerDelegationEntity[]> {\n if (!rateManagerId) return [];\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(pagination?.rateManagerAddress);\n\n const variables = {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n order_by: this.buildDelegationOrderBy(pagination),\n limit: pagination?.limit ?? DEFAULT_LIMIT,\n offset: pagination?.offset ?? 0,\n };\n\n try {\n const result = await this.client.query<{\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: RATE_MANAGER_DELEGATIONS_QUERY,\n variables,\n });\n\n return (result.Deposit ?? [])\n .map((deposit) => toDelegationEntityFromDeposit(deposit))\n .filter((delegation): delegation is RateManagerDelegationEntity => Boolean(delegation));\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_DELEGATIONS_QUERY,\n variables: {\n ...variables,\n order_by: this.buildLegacyDelegationOrderBy(pagination),\n },\n });\n\n return legacyResult.RateManagerDelegation ?? [];\n }\n }\n\n async fetchManagerDailySnapshots(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<ManagerDailySnapshotEntity[]> {\n if (!rateManagerId) return [];\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n try {\n const result = await this.client.query<{\n ManagerDailySnapshot?: ManagerDailySnapshotEntity[];\n }>({\n query: MANAGER_DAILY_SNAPSHOTS_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ dayTimestamp: 'asc' }],\n limit: options?.limit ?? 365,\n },\n });\n\n return result.ManagerDailySnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n // ManagerDailySnapshot entity may not exist on older indexer versions\n return [];\n }\n }\n\n async fetchDelegationForDeposit(\n depositId: string,\n options?: { escrowAddress?: string | null },\n ): Promise<RateManagerDelegationEntity | null> {\n if (!depositId) return null;\n const normalizedDepositId = normalizeCompositeDepositId(depositId, options?.escrowAddress);\n\n try {\n const result = await this.client.query<{\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: DEPOSIT_DELEGATION_QUERY,\n variables: {\n depositId: normalizedDepositId,\n },\n });\n\n const delegationDeposit = result.Deposit?.[0];\n if (!delegationDeposit) {\n return null;\n }\n return toDelegationEntityFromDeposit(delegationDeposit) ?? null;\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_DEPOSIT_DELEGATION_QUERY,\n variables: {\n depositId: normalizedDepositId,\n },\n });\n\n return legacyResult.RateManagerDelegation?.[0] ?? null;\n }\n }\n\n async fetchManualRateUpdates(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<ManualRateUpdateEntity[]> {\n if (!rateManagerId) return [];\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n try {\n const result = await this.client.query<{\n RateManagerV1_RateManagerRateUpdated?: ManualRateUpdateEntity[];\n }>({\n query: MANUAL_RATE_UPDATES_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ id: 'desc' }],\n limit: options?.limit ?? 100,\n },\n });\n // Normalize aliased fields — fixture endpoints may not support GraphQL field aliases,\n // so fall back from alias names to canonical field names.\n return (result.RateManagerV1_RateManagerRateUpdated ?? [])\n .map((e) => ({\n ...e,\n currency: e.currency ?? e.currencyCode ?? '',\n minRate: e.minRate ?? e.rate ?? '0',\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n async fetchOracleConfigUpdates(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<OracleConfigUpdateEntity[]> {\n if (!rateManagerId) return [];\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n const limit = options?.limit ?? 100;\n\n try {\n const depositScopes = await this.fetchHistoricalRateManagerDepositScopes(\n normalizedId,\n normalizedRateManagerAddress || undefined,\n );\n if (!depositScopes.length) {\n return [];\n }\n const scopedKeys = new Set(depositScopes.map((scope) => buildDepositScopeKey(scope)));\n\n const result = await this.client.query<{\n EscrowV2_DepositOracleRateConfigSet?: OracleConfigUpdateEntity[];\n }>({\n query: ORACLE_CONFIG_UPDATES_QUERY,\n variables: {\n where: {\n _or: depositScopes.map((scope) => ({\n _and: [\n { depositId: { _eq: scope.depositIdOnContract } },\n { escrow: { _eq: scope.escrow } },\n ],\n })),\n },\n order_by: [{ id: 'desc' }],\n limit,\n },\n });\n return (result.EscrowV2_DepositOracleRateConfigSet ?? [])\n .filter((event) => {\n const escrow = normalizeAddress(event.escrow);\n const depositIdOnContract =\n event.depositIdOnContract ?? (event as any).depositId?.toString?.() ?? '';\n if (!escrow || !depositIdOnContract) return false;\n return scopedKeys.has(\n buildDepositScopeKey({\n escrow,\n depositIdOnContract,\n }),\n );\n })\n .map((e) => ({\n ...e,\n rateManagerId: normalizedId,\n escrow: normalizeAddress(e.escrow) || undefined,\n currency: e.currency ?? e.currencyCode ?? '',\n depositIdOnContract: e.depositIdOnContract ?? (e as any).depositId ?? '',\n adapter: e.adapter ?? '',\n spreadBps: e.spreadBps ?? 0,\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\n } catch (error) {\n if (isSchemaCompatibilityError(error)) {\n // Older indexers without escrow-scoped V2 oracle updates cannot be\n // queried safely by depositId alone because deposit ids are reused\n // across escrows. Fall through to the legacy V1 query instead.\n } else {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerV1_DepositorFloorSet?: OracleConfigUpdateEntity[];\n }>({\n query: LEGACY_ORACLE_CONFIG_UPDATES_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ id: 'desc' }],\n limit,\n },\n });\n\n return (legacyResult.RateManagerV1_DepositorFloorSet ?? [])\n .map((e) => ({\n ...e,\n currency: e.currency ?? e.currencyCode ?? '',\n depositIdOnContract: e.depositIdOnContract ?? (e as any).depositId ?? '',\n adapter: e.adapter ?? (e as any).oracleAdapter ?? '',\n spreadBps: e.spreadBps ?? e.floorSpreadBps ?? 0,\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\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, Hex, PublicClient, WalletClient } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport { base, hardhat } from 'viem/chains';\nimport type { Abi } from 'abitype';\n\nimport {\n ContractRouter,\n type EscrowContractContext,\n type OrchestratorContractContext,\n} from './ContractRouter';\nimport { IntentOperations } from './IntentOperations';\nimport { ProtocolViewerReader } from './ProtocolViewerReader';\nimport { VaultOperations } from './VaultOperations';\nimport {\n abiFunctionHasInput,\n abiTupleHasComponent,\n escrowCurrencyHasOracleConfig,\n getAbiFunction,\n isValidHexAddress,\n normalizeAddress,\n normalizeCurrencyTuples,\n normalizeOracleRateConfig,\n parseManagerFeeFromRead,\n parseEscrowAddressFromCompositeDepositId,\n parseRawDepositId,\n resolveAbiFunctionName,\n} from './clientUtils';\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport {\n defaultIndexerEndpoint,\n IndexerClient,\n type IndexerAuthTokenProvider,\n} from '../indexer/client';\nimport {\n IndexerDepositService,\n type DepositFilter,\n type PaginationOptions,\n} from '../indexer/service';\nimport {\n IndexerRateManagerService,\n type RateManagerDelegationPaginationOptions,\n type RateManagerFilter,\n type RateManagerPaginationOptions,\n} from '../indexer/rateManagerService';\nimport type {\n DepositEntity,\n DepositWithRelations,\n IntentEntity,\n IntentStatus,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n} from '../indexer/types';\nimport {\n fetchFulfillmentAndPayment,\n type FulfillmentAndPaymentResponse,\n} from '../indexer/intentVerification';\nimport { getContracts, getRateManagerContracts, type RuntimeEnv } from '../contracts';\nimport { apiGetQuote, apiGetTakerTier, apiPostDepositDetails } from '../adapters/api';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { currencyKeccak256 } from '../utils/currencyKeccak256';\nimport { appendReferrerFeeDisplayFields } from '../utils/referrerFeeDisplay';\nimport { assertValidReferrerFeeConfig } from '../referrerFeeConfig';\nimport type {\n QuoteRequest,\n GetQuoteResponse,\n PostDepositDetailsRequest,\n GetTakerTierRequest,\n GetTakerTierResponse,\n ReferrerFeeConfig,\n} from '../types';\nimport { ERC20_ABI } from '../utils/erc20';\nimport { encodeWithAttribution, sendTransactionWithAttribution } from '../utils/attribution';\nimport type {\n TxOverrides,\n PreparedTransaction,\n PreparedTransactionWithAbi,\n PrepareableMethod,\n} 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-curator-api-key',\n * indexerApiKey: 'your-indexer-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) */\n chainId: number;\n /** Optional RPC URL override (defaults to wallet's chain RPC) */\n rpcUrl?: string;\n /** Runtime environment: 'production', 'preproduction', 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 /** Curator API key for authenticated endpoints like registerPayeeDetails, signalIntent (sent as x-api-key to curator) */\n apiKey?: string;\n /** Optional bearer token for hybrid authentication */\n authorizationToken?: string;\n /** Optional async token provider for indexer auth in long-lived clients */\n getAuthorizationToken?: IndexerAuthTokenProvider;\n /** Optional API key for indexer proxy authentication (sent as x-api-key header) */\n indexerApiKey?: string;\n /** Timeout configuration */\n timeouts?: {\n /** API call timeout in milliseconds (default: 15000) */\n api?: number;\n };\n};\n\n/**\n * Parameters for signalIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type SignalIntentReferralFee = {\n /** Address receiving a referral fee */\n recipient: Address;\n /** Referral fee amount in precise units */\n fee: bigint | string;\n};\n\nexport type SignalIntentMethodParams = {\n /** The deposit ID to use */\n depositId: bigint | string;\n /** Amount of tokens to claim (in token units) */\n amount: bigint | string;\n /** Address to receive the tokens when fulfilled */\n toAddress: Address;\n /** Payment platform name (e.g., 'wise', 'revolut') */\n processorName: string;\n /** Hashed payee details (from deposit) */\n payeeDetails: string;\n /** Fiat currency code (e.g., 'USD', 'EUR') */\n fiatCurrencyCode: string;\n /** Agreed conversion rate (18 decimals) */\n conversionRate: bigint | string;\n /** Optional referral fee recipients paid by the taker */\n referralFees?: SignalIntentReferralFee[];\n /** @deprecated Use referralFees instead */\n referrer?: Address;\n /** @deprecated Use referralFees instead */\n referrerFee?: bigint | string;\n /** Optional referrer fee configuration for redirect-flow integrations */\n referrerFeeConfig?: ReferrerFeeConfig;\n /** Optional hook contract to call after signaling */\n postIntentHook?: Address;\n /** Optional data for pre-intent hook (defaults to '0x') */\n preIntentHookData?: `0x${string}`;\n /** Optional data to pass to the hook */\n data?: `0x${string}`;\n /** Optional escrow override (auto-routes orchestrator when provided) */\n escrowAddress?: Address;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Pre-obtained signature (if not auto-fetching) */\n gatingServiceSignature?: `0x${string}`;\n /** Signature expiration timestamp */\n signatureExpiration?: bigint | string;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n};\n\n/**\n * Parameters for cancelIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type CancelIntentMethodParams = {\n /** The intent hash to cancel (0x-prefixed, 32 bytes) */\n intentHash: `0x${string}`;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n};\n\n/**\n * Parameters for fulfillIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type FulfillIntentMethodParams = {\n /** The intent hash to fulfill (0x-prefixed, 32 bytes) */\n intentHash: `0x${string}`;\n /** Payment proof from Reclaim (object or JSON string) */\n proof: Record<string, unknown> | string;\n /** Allowed timestamp variance in ms (default: 300000ms) */\n timestampBufferMs?: string;\n /** Override attestation service URL */\n attestationServiceUrl?: string;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Data to pass to post-intent hook */\n postIntentHookData?: `0x${string}`;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n /** Lifecycle callbacks for UI updates */\n callbacks?: {\n onAttestationStart?: () => void;\n onTxSent?: (hash: Hash) => void;\n onTxMined?: (hash: Hash) => void;\n };\n /** Precomputed attestation values (payment proof + verification data) */\n precomputedAttestation?: {\n paymentProof: Hex;\n verificationData: Hex;\n };\n};\n\n/** Inline oracle rate config for a currency entry. */\nexport type CurrencyOracleRateConfig = {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n};\n\n/** On-chain currency tuple shape passed to EscrowV2 contract methods. */\nexport type OnchainCurrencyEntry = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: CurrencyOracleRateConfig;\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 * | `registerPayeeDetails()` | Register payee details with curator (returns hashed IDs) |\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/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 * // Step 1: Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * });\n *\n * // Step 2: 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 * payeeDetailsHashes: hashedOnchainIds,\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 /** EscrowV2 contract address (if deployed) */\n readonly escrowV2Address?: Address;\n /** EscrowV2 ABI */\n readonly escrowV2Abi?: Abi;\n /** All supported upgraded escrow addresses (current first, then historical) */\n readonly escrowAddresses: Address[];\n /** Orchestrator contract address (handles intent signaling/fulfillment) */\n readonly orchestratorAddress?: Address;\n /** Orchestrator contract ABI */\n readonly orchestratorAbi?: Abi;\n /** OrchestratorV2 address (if deployed) */\n readonly orchestratorV2Address?: Address;\n /** OrchestratorV2 ABI */\n readonly orchestratorV2Abi?: Abi;\n /** All supported upgraded orchestrator addresses (current first, then historical) */\n readonly orchestratorAddresses: Address[];\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 /** Ordered list of all ProtocolViewer instances (primary first, legacy fallback after) */\n private readonly _protocolViewerEntries: Array<{ address: Address; abi: Abi }>;\n /** DepositRateManagerRegistryV1 contract address */\n readonly rateManagerRegistryAddress?: Address;\n /** DepositRateManagerRegistryV1 ABI */\n readonly rateManagerRegistryAbi?: Abi;\n /** RateManagerV1 contract address */\n readonly rateManagerV1Address?: Address;\n /** RateManagerV1 ABI */\n readonly rateManagerV1Abi?: Abi;\n /** DepositRateManagerController contract address */\n readonly rateManagerControllerAddress?: Address;\n /** DepositRateManagerController ABI */\n readonly rateManagerControllerAbi?: Abi;\n /** OrchestratorRegistry address */\n readonly orchestratorRegistryAddress?: Address;\n /** OrchestratorRegistry ABI */\n readonly orchestratorRegistryAbi?: 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 private readonly _indexerRateManagerService: IndexerRateManagerService;\n private readonly _router: ContractRouter;\n private readonly _pvReader: ProtocolViewerReader;\n private readonly _vaultOps: VaultOperations;\n private readonly _intentOps: IntentOperations;\n private _rateManagerInitError?: Error;\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\n | string\n | undefined;\n // Chain-specific default RPC URLs\n const defaultRpcUrls: Record<number, string> = {\n [base.id]: 'https://mainnet.base.org',\n [hardhat.id]: 'http://127.0.0.1:8545',\n };\n const rpc =\n opts.rpcUrl ?? inferredRpc ?? defaultRpcUrls[opts.chainId] ?? 'https://mainnet.base.org';\n const chainMap: Record<number, any> = {\n [base.id]: base,\n [hardhat.id]: hardhat,\n };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({\n chain: selectedChain as any,\n transport: http(rpc, { batch: false }),\n }) as unknown as PublicClient;\n\n // contracts-v3 resolution (via contracts-v2 package)\n const { addresses, abis } = getContracts(this.chainId, this.runtimeEnv);\n const toAddress = (value?: string | null): Address | undefined =>\n this.isValidHexAddress(value) ? (value as Address) : undefined;\n const uniqAddresses = (values: Array<Address | undefined>): Address[] => {\n const seen = new Set<string>();\n const out: Address[] = [];\n for (const value of values) {\n if (!value) continue;\n const key = value.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(value);\n }\n return out;\n };\n this.escrowV2Address = toAddress((addresses as any).escrowV2 ?? addresses.escrow);\n this.escrowV2Abi = ((abis as any).escrowV2 ?? abis.escrow) as Abi | undefined;\n this.orchestratorV2Address = toAddress(\n (addresses as any).orchestratorV2 ?? addresses.orchestrator,\n );\n this.orchestratorV2Abi = ((abis as any).orchestratorV2 ?? abis.orchestrator) as Abi | undefined;\n\n const configuredEscrowAddresses = ((addresses as any).escrowAddresses ?? [])\n .map((value: string) => toAddress(value))\n .filter(Boolean) as Address[];\n const configuredOrchestratorAddresses = ((addresses as any).orchestratorAddresses ?? [])\n .map((value: string) => toAddress(value))\n .filter(Boolean) as Address[];\n\n this.escrowAddresses = uniqAddresses([\n this.escrowV2Address ?? toAddress(addresses.escrow),\n ...configuredEscrowAddresses,\n ]);\n\n this.escrowAddress =\n this.escrowV2Address ?? toAddress(addresses.escrow) ?? this.escrowAddresses[0];\n this.escrowAbi = (this.escrowV2Abi ?? abis.escrow) as Abi;\n if (!this.escrowAddress || !this.escrowAbi) {\n throw new Error('Escrow not available for this chain/environment');\n }\n\n this.orchestratorAddresses = uniqAddresses([\n this.orchestratorV2Address ?? toAddress(addresses.orchestrator),\n ...configuredOrchestratorAddresses,\n ]);\n\n this.orchestratorAddress =\n this.orchestratorV2Address ??\n toAddress(addresses.orchestrator) ??\n this.orchestratorAddresses[0];\n this.orchestratorAbi =\n this.orchestratorV2Abi ?? ((abis as any).orchestrator as Abi | undefined);\n\n this.unifiedPaymentVerifier = toAddress(\n (addresses as any).unifiedPaymentVerifierV2 ?? addresses.unifiedPaymentVerifier,\n );\n this.protocolViewerAddress = toAddress((addresses as any).protocolViewer);\n this.protocolViewerAbi = (abis as any).protocolViewer as Abi | undefined;\n\n // Build ordered PV entries array. On staging this contains [V2_PV, V1_PV].\n // On production it mirrors the single protocolViewerAddress/Abi.\n const resolvedPvEntries = (addresses as any).protocolViewerEntries as\n | Array<{ address: string; abi: Abi }>\n | undefined;\n if (resolvedPvEntries && resolvedPvEntries.length > 0) {\n this._protocolViewerEntries = resolvedPvEntries\n .map((e) => ({ address: toAddress(e.address), abi: e.abi }))\n .filter((e): e is { address: Address; abi: Abi } => Boolean(e.address));\n } else if (this.protocolViewerAddress && this.protocolViewerAbi) {\n this._protocolViewerEntries = [\n { address: this.protocolViewerAddress, abi: this.protocolViewerAbi },\n ];\n } else {\n this._protocolViewerEntries = [];\n }\n\n this.rateManagerV1Address = toAddress((addresses as any).rateManagerV1);\n this.rateManagerV1Abi = (abis as any).rateManagerV1 as Abi | undefined;\n this.orchestratorRegistryAddress = toAddress((addresses as any).orchestratorRegistry);\n this.orchestratorRegistryAbi = (abis as any).orchestratorRegistry as Abi | undefined;\n this.rateManagerRegistryAddress =\n toAddress((addresses as any).rateManagerRegistry) ?? this.rateManagerV1Address;\n this.rateManagerRegistryAbi =\n ((abis as any).rateManagerRegistry as Abi | undefined) ?? this.rateManagerV1Abi;\n this.rateManagerControllerAddress = toAddress((addresses as any).rateManagerController);\n this.rateManagerControllerAbi = (abis as any).rateManagerController as Abi | undefined;\n if (!this.rateManagerRegistryAddress || !this.rateManagerRegistryAbi) {\n try {\n const rateManagerContracts = getRateManagerContracts(this.chainId, this.runtimeEnv);\n this.rateManagerRegistryAddress = rateManagerContracts.addresses.registry as Address;\n this.rateManagerRegistryAbi = rateManagerContracts.abis.registry;\n if (!this.rateManagerControllerAddress && rateManagerContracts.addresses.controller) {\n this.rateManagerControllerAddress = rateManagerContracts.addresses.controller as Address;\n }\n if (!this.rateManagerControllerAbi && rateManagerContracts.abis.controller) {\n this.rateManagerControllerAbi = rateManagerContracts.abis.controller;\n }\n } catch (error) {\n this._rateManagerInitError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n this._router = new ContractRouter({\n escrowAddress: this.escrowAddress,\n escrowAbi: this.escrowAbi,\n escrowV2Address: this.escrowV2Address,\n escrowV2Abi: this.escrowV2Abi,\n escrowAddresses: this.escrowAddresses,\n orchestratorAddress: this.orchestratorAddress,\n orchestratorAbi: this.orchestratorAbi,\n orchestratorV2Address: this.orchestratorV2Address,\n orchestratorV2Abi: this.orchestratorV2Abi,\n orchestratorAddresses: this.orchestratorAddresses,\n });\n\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 runtimeToIndexerEnv: Record<RuntimeEnv, 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING'> = {\n production: 'PRODUCTION',\n preproduction: 'PREPRODUCTION',\n staging: 'STAGING',\n };\n const indexerEndpoint =\n opts.indexerUrl ?? defaultIndexerEndpoint(runtimeToIndexerEnv[this.runtimeEnv]);\n this._indexerClient = new IndexerClient(indexerEndpoint, {\n authorizationToken: opts.authorizationToken,\n getAuthorizationToken: opts.getAuthorizationToken,\n apiKey: opts.indexerApiKey,\n });\n this._indexerService = new IndexerDepositService(this._indexerClient);\n this._indexerRateManagerService = new IndexerRateManagerService(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 this._pvReader = new ProtocolViewerReader({\n getPublicClient: () => this.publicClient,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getProtocolViewerEntries: () => this._protocolViewerEntries,\n getEscrowAddresses: () => this.escrowAddresses,\n getIndexerService: () => this._indexerService,\n getRouterBuildProtocolViewerContexts: () =>\n this._router.buildProtocolViewerContexts.bind(this._router),\n host: {\n requireProtocolViewer: () => this.requireProtocolViewer(),\n protocolViewerFunctionInputCount: (functionName) =>\n this.protocolViewerFunctionInputCount(functionName),\n buildProtocolViewerContexts: (options) => this.buildProtocolViewerContexts(options),\n isProtocolViewerDepositPopulated: (view) => this.isProtocolViewerDepositPopulated(view),\n isProtocolViewerIntentPopulated: (view) => this.isProtocolViewerIntentPopulated(view),\n buildDepositViewFromEscrowDeposit: (rawDeposit, depositId) =>\n this.buildDepositViewFromEscrowDeposit(rawDeposit, depositId),\n getPvAccountDepositsFromIndexer: (owner) => this.getPvAccountDepositsFromIndexer(owner),\n getPvDepositById: (depositId, options) =>\n options === undefined\n ? this.getPvDepositById(depositId)\n : this.getPvDepositById(depositId, options),\n getEscrowContexts: () => this.getEscrowContexts(),\n lookupIntentRouting: (intentHash) => this.lookupIntentRouting(intentHash),\n },\n });\n this._vaultOps = new VaultOperations({\n getPublicClient: () => this.publicClient,\n getRateManagerRegistryAddress: () => this.rateManagerRegistryAddress,\n getRateManagerRegistryAbi: () => this.rateManagerRegistryAbi,\n getRateManagerControllerAddress: () => this.rateManagerControllerAddress,\n getRateManagerControllerAbi: () => this.rateManagerControllerAbi,\n getRateManagerInitError: () => this._rateManagerInitError,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n prepareEscrowTransaction: (tx) => this.prepareEscrowTransaction(tx),\n prepareContractTransaction: (tx) => this.prepareContractTransaction(tx),\n },\n });\n this._intentOps = new IntentOperations({\n getWalletClient: () => this.walletClient,\n getPublicClient: () => this.publicClient,\n getChainId: () => this.chainId,\n getRuntimeEnv: () => this.runtimeEnv,\n getBaseApiUrl: () => this.baseApiUrl,\n getApiKey: () => this.apiKey,\n getAuthorizationToken: () => this.authorizationToken,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getIndexerClient: () => this._indexerClient,\n getIndexerService: () => this._indexerService,\n getDefaultPreferV2: () => this._router.defaultPreferV2,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n resolveOrchestratorContext: (options) => this.resolveOrchestratorContext(options),\n resolveEscrowAddressOrThrow: (escrowAddress, depositId, methodName, options) =>\n this.resolveEscrowAddressOrThrow(escrowAddress, depositId, methodName, options),\n prepareResolvedOrchestratorTransaction: (tx) =>\n this.prepareResolvedOrchestratorTransaction(tx),\n getFulfillIntentInputs: (intentHash) => this.getFulfillIntentInputs(intentHash),\n getPvIntent: (intentHash) => this.getPvIntent(intentHash),\n },\n });\n }\n\n private isValidHexAddress(addr?: string | null): boolean {\n return isValidHexAddress(addr);\n }\n\n private normalizeAddress(addr?: string | null): Address | undefined {\n return normalizeAddress(addr);\n }\n\n private parseEscrowAddressFromCompositeDepositId(\n depositId: bigint | number | string,\n ): Address | undefined {\n return parseEscrowAddressFromCompositeDepositId(depositId);\n }\n\n private parseRawDepositId(depositId: bigint | number | string): bigint {\n return parseRawDepositId(depositId);\n }\n\n private normalizeOracleRateConfig(config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }): {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n } {\n return normalizeOracleRateConfig(config);\n }\n\n private escrowCurrencyHasOracleConfig(abi: Abi | undefined): boolean {\n return escrowCurrencyHasOracleConfig(abi);\n }\n\n /**\n * Normalizes currency tuples by appending an empty `oracleRateConfig` when the ABI\n * requires it and the caller hasn't provided one.\n */\n private normalizeCurrencyTuples(\n currencies: Array<{\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>,\n escrowAbi: Abi | undefined,\n ): Array<Record<string, unknown>> {\n return normalizeCurrencyTuples(currencies, escrowAbi);\n }\n\n supportsInlineOracleRateConfig(params?: {\n escrowAddress?: Address;\n preferV2?: boolean;\n }): boolean {\n return this._vaultOps.supportsInlineOracleRateConfig({\n escrowAddress: params?.escrowAddress,\n preferV2: params?.preferV2 ?? this._router.defaultPreferV2,\n });\n }\n\n private parseManagerFeeFromRead(result: unknown): bigint {\n return parseManagerFeeFromRead(result);\n }\n\n private getAbiFunction(abi: Abi | undefined, ...names: string[]): Record<string, unknown> | null {\n return getAbiFunction(abi, ...names);\n }\n\n private resolveAbiFunctionName(abi: Abi | undefined, names: string[]): string {\n return resolveAbiFunctionName(abi, names);\n }\n\n private abiTupleHasComponent(\n abi: Abi | undefined,\n functionName: string,\n componentName: string,\n ): boolean {\n return abiTupleHasComponent(abi, functionName, componentName);\n }\n\n private abiFunctionHasInput(\n abi: Abi | undefined,\n functionName: string,\n inputName: string,\n ): boolean {\n return abiFunctionHasInput(abi, functionName, inputName);\n }\n\n private resolveEscrowAddressOrThrow(\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\n options?: { preferV2?: boolean },\n ): Address {\n const resolved = escrowAddress ?? this.parseEscrowAddressFromCompositeDepositId(depositId);\n if (resolved) return resolved;\n if (options?.preferV2 !== undefined) {\n return this.resolveEscrowContext().address;\n }\n throw new Error(`${methodName} requires escrowAddress or composite depositId`);\n }\n\n private prepareCreateRateManagerTransaction(params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareCreateRateManagerTransaction(params);\n }\n\n private prepareSetVaultRateTransaction(params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultRateTransaction(params);\n }\n\n private prepareSetVaultRatesBatchTransaction(params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultRatesBatchTransaction(params);\n }\n\n private prepareSetOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetOracleRateConfigTransaction(params);\n }\n\n private prepareRemoveOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareRemoveOracleRateConfigTransaction(params);\n }\n\n private prepareSetOracleRateConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetOracleRateConfigBatchTransaction(params);\n }\n\n private prepareUpdateCurrencyConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareUpdateCurrencyConfigBatchTransaction(params);\n }\n\n private prepareDeactivateCurrenciesBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareDeactivateCurrenciesBatchTransaction(params);\n }\n\n private prepareSetVaultConfigTransaction(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultConfigTransaction(params);\n }\n\n private getEscrowContextByAddress(address?: Address): EscrowContractContext | undefined {\n return this._router.getEscrowContextByAddress(address);\n }\n\n private getOrchestratorContextByAddress(\n address?: Address,\n ): OrchestratorContractContext | undefined {\n return this._router.getOrchestratorContextByAddress(address);\n }\n\n private resolveEscrowContext(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }): EscrowContractContext {\n return this._router.resolveEscrowContext({\n escrowAddress: options?.escrowAddress,\n depositId: options?.depositId,\n });\n }\n\n private async resolveEscrowContextForDepositWrite(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n methodName?: string;\n }): Promise<EscrowContractContext> {\n const explicitEscrow =\n options?.escrowAddress ??\n (options?.depositId !== undefined\n ? this.parseEscrowAddressFromCompositeDepositId(options.depositId)\n : undefined);\n if (explicitEscrow || options?.depositId === undefined) {\n return this.resolveEscrowContext(options);\n }\n\n const contexts = this.getEscrowContexts();\n if (contexts.length <= 1) {\n return this.resolveEscrowContext(options);\n }\n\n const rawDepositId = this.parseRawDepositId(options.depositId);\n const matches: EscrowContractContext[] = [];\n const probeErrors: unknown[] = [];\n for (const context of contexts) {\n try {\n const raw = await this.publicClient.readContract({\n address: context.address,\n abi: context.abi,\n functionName: 'getDeposit',\n args: [rawDepositId],\n });\n const parsed = this.buildDepositViewFromEscrowDeposit(raw, rawDepositId);\n if (this.isProtocolViewerDepositPopulated(parsed)) {\n matches.push(context);\n }\n } catch (error) {\n probeErrors.push(error);\n }\n }\n\n if (matches.length === 1) {\n return matches[0]!;\n }\n if (matches.length > 1) {\n throw new Error(\n `${options?.methodName ?? 'Deposit mutation'} is ambiguous for depositId ${rawDepositId.toString()}: found in multiple escrows. Pass escrowAddress or composite depositId.`,\n );\n }\n if (probeErrors.length > 0) {\n const probeFailureMessage = probeErrors\n .map((error) => (error instanceof Error ? error.message : String(error)))\n .join('; ');\n throw new Error(\n `${options?.methodName ?? 'Deposit mutation'} could not verify depositId ${rawDepositId.toString()} across configured escrows because one or more escrow probes failed: ${probeFailureMessage}`,\n );\n }\n\n // Staged fallback: when no escrow reports the deposit yet, preserve previous\n // default-routing behavior to avoid breaking immediate follow-up flows.\n return this.resolveEscrowContext(options);\n }\n\n private getEscrowContexts(): EscrowContractContext[] {\n return this._router.getEscrowContexts();\n }\n\n private resolveOrchestratorForEscrow(\n escrowAddress?: Address,\n preferV2 = false,\n ): OrchestratorContractContext | undefined {\n return this._router.resolveOrchestratorForEscrow(escrowAddress, preferV2);\n }\n\n private async lookupIntentRouting(intentHash: `0x${string}`): Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }> {\n try {\n const response = await this._indexerClient.query<{\n Intent?: Array<{ orchestratorAddress?: string | null; depositId?: string | null }>;\n }>({\n query: /* GraphQL */ `\n query IntentRouting($where: Intent_bool_exp, $limit: Int) {\n Intent(where: $where, limit: $limit) {\n orchestratorAddress\n depositId\n }\n }\n `,\n variables: {\n where: { intentHash: { _eq: intentHash.toLowerCase() } },\n limit: 1,\n },\n });\n const intent = response.Intent?.[0];\n const orchestratorAddress = this.normalizeAddress(intent?.orchestratorAddress ?? undefined);\n const escrowAddress =\n intent?.depositId && intent.depositId.includes('_')\n ? this.parseEscrowAddressFromCompositeDepositId(intent.depositId)\n : undefined;\n return { orchestratorAddress, escrowAddress };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown indexer routing error';\n throw new Error(`Failed to resolve intent routing for ${intentHash}: ${message}`);\n }\n }\n\n private async lookupIntentEscrowOnchain(intentHash: `0x${string}`): Promise<Address | undefined> {\n try {\n const view = await this.getPvIntent(intentHash);\n return this.normalizeAddress((view as any)?.intent?.escrow);\n } catch (error) {\n if (error instanceof Error && error.message === 'Intent not found') {\n return undefined;\n }\n const message = error instanceof Error ? error.message : 'Unknown on-chain routing error';\n throw new Error(`Failed to resolve intent escrow on-chain for ${intentHash}: ${message}`);\n }\n }\n\n private warnOrchestratorFallback(\n intentHash: `0x${string}`,\n source: string,\n error: unknown,\n ): void {\n const message = error instanceof Error ? error.message : 'Unknown routing error';\n console.warn(\n `[Zkp2pClient] ${source} failed for ${intentHash}; continuing with configured orchestrator fallback. ${message}`,\n );\n }\n\n private async resolveOrchestratorContext(options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n preferV2?: boolean;\n }): Promise<OrchestratorContractContext> {\n const explicit = this.getOrchestratorContextByAddress(options?.orchestratorAddress);\n if (explicit) return explicit;\n if (options?.orchestratorAddress) {\n const addr = options.orchestratorAddress;\n const abi = this.orchestratorV2Abi ?? this.orchestratorAbi;\n if (!abi) throw new Error('Orchestrator not available');\n return { address: addr, abi, version: 'v2' };\n }\n\n if (options?.intentHash) {\n try {\n const routing = await this.lookupIntentRouting(options.intentHash);\n const fromIntent = this.getOrchestratorContextByAddress(routing.orchestratorAddress);\n if (fromIntent) return fromIntent;\n if (routing.escrowAddress) {\n const fromIntentEscrow = this.resolveOrchestratorForEscrow(\n routing.escrowAddress,\n options.preferV2,\n );\n if (fromIntentEscrow) return fromIntentEscrow;\n }\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'Indexer intent routing lookup', error);\n }\n\n try {\n const onchainEscrow = await this.lookupIntentEscrowOnchain(options.intentHash);\n if (onchainEscrow) {\n const fromOnchainEscrow = this.resolveOrchestratorForEscrow(\n onchainEscrow,\n options.preferV2,\n );\n if (fromOnchainEscrow) return fromOnchainEscrow;\n }\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'On-chain intent escrow lookup', error);\n }\n }\n\n if (options?.escrowAddress) {\n const fromEscrow = this.resolveOrchestratorForEscrow(options.escrowAddress, options.preferV2);\n if (fromEscrow) return fromEscrow;\n }\n\n if (options?.intentHash) {\n const primaryAddress = this.orchestratorV2Address ?? this.orchestratorAddress;\n const primaryContext = this.getOrchestratorContextByAddress(primaryAddress);\n if (primaryContext) return primaryContext;\n if (primaryAddress) {\n const primaryAbi = this.orchestratorV2Abi ?? this.orchestratorAbi;\n if (primaryAbi) {\n return {\n address: primaryAddress,\n abi: primaryAbi,\n version: 'v2',\n };\n }\n }\n }\n\n const fallback = this.resolveOrchestratorForEscrow(undefined, options?.preferV2);\n if (fallback) return fallback;\n\n throw new Error('Orchestrator not available');\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 * Execute a prepared transaction (simulation + send).\n * Used internally by prepareable methods after preparation.\n */\n private async executePreparedTransaction(\n prepared: PreparedTransactionWithAbi,\n txOverrides?: TxOverrides,\n ): Promise<Hash> {\n const { referrer, ...overrides } = txOverrides ?? {};\n void referrer;\n\n // Simulate for validation\n await this.publicClient.simulateContract({\n address: prepared.to,\n abi: prepared.abi,\n functionName: prepared.functionName as any,\n args: prepared.args as any,\n account: this.walletClient.account!,\n ...(overrides as any),\n });\n\n // Send transaction (calldata already has attribution)\n return this.walletClient.sendTransaction({\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n account: this.walletClient.account!,\n chain: this.walletClient.chain,\n ...(overrides as any),\n }) as Promise<Hash>;\n }\n\n private prepareEscrowTransaction(opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n }): PreparedTransactionWithAbi {\n const escrowAddress = opts.escrowAddress ?? this.escrowAddress;\n const escrowAbi = opts.escrowAbi ?? this.escrowAbi;\n if (!escrowAddress || !escrowAbi) throw new Error('Escrow not available');\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: escrowAbi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: escrowAddress,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: escrowAbi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private prepareOrchestratorTransaction(opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n }): PreparedTransactionWithAbi {\n const orchestratorAddress = opts.orchestratorAddress ?? this.orchestratorAddress;\n const orchestratorAbi = opts.orchestratorAbi ?? this.orchestratorAbi;\n if (!orchestratorAddress || !orchestratorAbi) throw new Error('Orchestrator not available');\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorAbi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: orchestratorAddress,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: orchestratorAbi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private prepareResolvedOrchestratorTransaction(opts: {\n orchestrator: OrchestratorContractContext;\n functionNames: string[];\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): PreparedTransactionWithAbi {\n const functionName = this.resolveAbiFunctionName(opts.orchestrator.abi, opts.functionNames);\n return this.prepareOrchestratorTransaction({\n functionName,\n args: opts.args,\n txOverrides: opts.txOverrides,\n value: opts.value,\n orchestratorAddress: opts.orchestrator.address,\n orchestratorAbi: opts.orchestrator.abi,\n });\n }\n\n private prepareContractTransaction(opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): PreparedTransactionWithAbi {\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: opts.abi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: opts.address,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: opts.abi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private buildContractMethod<TParams extends { txOverrides?: TxOverrides }>(\n resolveContract: () => { address?: Address; abi?: Abi; label: string },\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const contract = resolveContract();\n if (!contract.address || !contract.abi) {\n throw new Error(`${contract.label} not available`);\n }\n const prepared = this.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const contract = resolveContract();\n if (!contract.address || !contract.abi) {\n throw new Error(`${contract.label} not available`);\n }\n const prepared = this.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n private buildEscrowMethod<\n TParams extends {\n txOverrides?: TxOverrides;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n depositId?: bigint | number | string;\n },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: functionName,\n });\n const prepared = this.prepareEscrowTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n escrowAddress: params.escrowAddress ?? escrowContext.address,\n escrowAbi: params.escrowAbi ?? escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: functionName,\n });\n const prepared = this.prepareEscrowTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n escrowAddress: params.escrowAddress ?? escrowContext.address,\n escrowAbi: params.escrowAbi ?? escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n private buildOrchestratorMethod<\n TParams extends {\n txOverrides?: TxOverrides;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n escrowAddress?: Address;\n preferV2?: boolean;\n },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const orchestratorContext = await this.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2,\n });\n const prepared = this.prepareOrchestratorTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n orchestratorAddress: params.orchestratorAddress ?? orchestratorContext.address,\n orchestratorAbi: params.orchestratorAbi ?? orchestratorContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const orchestratorContext = await this.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2,\n });\n const prepared = this.prepareOrchestratorTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n orchestratorAddress: params.orchestratorAddress ?? orchestratorContext.address,\n orchestratorAbi: params.orchestratorAbi ?? orchestratorContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT QUERIES (RPC-first via ProtocolViewer) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Fetches all deposits owned by the connected wallet.\n *\n * This is the primary method for liquidity providers to query their deposits.\n * Uses ProtocolViewer when the active ABI exposes `getAccountDeposits`,\n * otherwise falls back to indexer-backed deposit relations.\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.\n *\n * Uses ProtocolViewer when available for this method, otherwise falls back\n * to indexer-backed deposit relations.\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(\n depositId: bigint | number | string,\n paymentMethodHash: string,\n ): 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 rateManagerService = this._indexerRateManagerService;\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: (\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n ): 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: (\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): 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: (\n id: string,\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): Promise<DepositWithRelations | null> => {\n return service.fetchDepositWithRelations(id, options);\n },\n\n /**\n * Fetches intents for multiple deposits.\n */\n getIntentsForDeposits: (\n depositIds: string[],\n statuses: IntentStatus[] = ['SIGNALED'],\n ): 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 a single intent by hash.\n */\n getIntentByHash: (intentHash: string): Promise<IntentEntity | null> => {\n return service.fetchIntentByHash(intentHash);\n },\n\n /**\n * Fetches intents that have expired.\n */\n getExpiredIntents: (params: {\n now: bigint | string;\n depositIds: string[];\n limit?: number;\n }): 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 gross and net fulfillment amounts for an intent.\n */\n getIntentFulfillmentAmounts: (\n intentHash: string,\n ): Promise<IntentFulfillmentAmountsEntity | null> => {\n return service.fetchIntentFulfillmentAmounts(intentHash);\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: (\n payeeHash: string,\n options: {\n paymentMethodHash?: string;\n limit?: number;\n includeIntents?: boolean;\n intentStatuses?: IntentStatus[];\n } = {},\n ): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByPayeeHash(payeeHash, options);\n },\n\n /**\n * Fetches deposits by their composite IDs.\n * @param ids - Array of composite IDs in format \"chainId_escrowAddress_depositId\"\n */\n getDepositsByIds: (ids: string[]): Promise<DepositEntity[]> => {\n return service.fetchDepositsByIds(ids);\n },\n\n /**\n * Fetches deposits by their composite IDs with all related data.\n * @param ids - Array of composite IDs in format \"chainId_escrowAddress_depositId\"\n */\n getDepositsByIdsWithRelations: (\n ids: string[],\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByIdsWithRelations(ids, options);\n },\n\n /**\n * Fetches rate managers (vaults) with aggregate stats.\n */\n getRateManagers: (pagination?: RateManagerPaginationOptions, filter?: RateManagerFilter) => {\n return rateManagerService.fetchRateManagers(pagination, filter);\n },\n\n /**\n * Fetches detail for a single rate manager.\n */\n getRateManagerDetail: (\n rateManagerId: string,\n options?: {\n statsLimit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchRateManagerDetail(rateManagerId, options);\n },\n\n /**\n * Fetches delegated deposits for a rate manager.\n */\n getRateManagerDelegations: (\n rateManagerId: string,\n pagination?: RateManagerDelegationPaginationOptions,\n ) => {\n return rateManagerService.fetchRateManagerDelegations(rateManagerId, pagination);\n },\n\n /**\n * Fetches delegation record for a specific composite deposit ID.\n */\n getDelegationForDeposit: (depositId: string, options?: { escrowAddress?: string | null }) => {\n return rateManagerService.fetchDelegationForDeposit(depositId, options);\n },\n\n /**\n * Fetches daily snapshots for a rate manager (vault).\n */\n getManagerDailySnapshots: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchManagerDailySnapshots(rateManagerId, options);\n },\n\n getManualRateUpdates: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchManualRateUpdates(rateManagerId, options);\n },\n\n getOracleConfigUpdates: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchOracleConfigUpdates(rateManagerId, options);\n },\n\n /**\n * Fetches chronological fund activities for a specific deposit.\n */\n getDepositFundActivities: (depositId: string): Promise<DepositFundActivityEntity[]> => {\n return service.fetchDepositFundActivities(depositId);\n },\n\n /**\n * Fetches fund activities across all deposits for a maker address.\n */\n getMakerFundActivities: (\n depositor: string,\n limit?: number,\n ): Promise<DepositFundActivityEntity[]> => {\n return service.fetchMakerFundActivities(depositor, limit);\n },\n\n /**\n * Fetches daily snapshots for a deposit, ordered by day ascending.\n */\n getDepositDailySnapshots: (\n depositId: string,\n limit?: number,\n ): Promise<DepositDailySnapshotEntity[]> => {\n return service.fetchDepositDailySnapshots(depositId, limit);\n },\n\n /**\n * Performs a raw GraphQL query against the indexer.\n */\n query: <T>(params: { query: string; variables?: Record<string, unknown> }): Promise<T> => {\n return client.query(params);\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 override\n * @param params.escrowAddress - Escrow context used for default spender resolution\n * @param params.preferV2 - Prefer EscrowV2 for default spender resolution\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: {\n token: Address;\n amount: bigint;\n spender?: Address;\n escrowAddress?: Address;\n preferV2?: boolean;\n maxApprove?: boolean;\n txOverrides?: TxOverrides;\n }): 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 =\n params.spender ??\n this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2 ?? this._router.defaultPreferV2,\n }).address;\n const allowance = (await this.publicClient.readContract({\n address: params.token,\n abi: ERC20_ABI as any,\n functionName: 'allowance',\n args: [owner, spender],\n })) 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 * Registers payee details with the curator API and returns hashed on-chain IDs.\n *\n * This is a standalone method decoupled from deposit creation. Call this before\n * `createDeposit` to obtain `payeeDetailsHashes`, or use it independently to\n * register maker payment details with the curator service.\n *\n * @param params.processorNames - Payment platforms (e.g., ['wise', 'revolut'])\n * @param params.depositData - Payee details per processor (e.g., [{ email: '...' }])\n * @returns The posted deposit details and their corresponding hashed on-chain IDs\n *\n * @example\n * ```typescript\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * });\n * // Then pass hashedOnchainIds to createDeposit\n * ```\n */\n async registerPayeeDetails(params: {\n processorNames: string[];\n depositData: { [key: string]: string }[];\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n hashedOnchainIds: string[];\n }> {\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.depositData.length) {\n throw new Error('processorNames and depositData length mismatch');\n }\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }),\n );\n\n const apiResponses = await Promise.all(\n depositDetails.map((req) =>\n apiPostDepositDetails(\n req,\n baseApiUrl,\n this.apiTimeoutMs,\n this.apiKey,\n this.authorizationToken,\n ),\n ),\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 register payee details');\n }\n\n const hashedOnchainIds = apiResponses.map(\n (r: any) => r.responseObject?.hashedOnchainId as string,\n );\n\n return { depositDetails, hashedOnchainIds };\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 * 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.payeeDetailsHashes - Pre-computed hashed on-chain IDs (from registerPayeeDetails). When provided, skips the curator API call entirely.\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 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 * payeeDetailsHashes: hashedOnchainIds, // from registerPayeeDetails()\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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; hash: Hash }> {\n const { depositDetails, prepared } = await this.prepareCreateDepositInternal(params);\n const hash = await this.executePreparedTransaction(prepared, params.txOverrides);\n return { depositDetails, hash };\n }\n\n /**\n * Prepares a createDeposit transaction without sending it.\n *\n * Returns both the prepared transaction calldata and the posted deposit details\n * (including hashed on-chain IDs) needed for tracking.\n */\n async prepareCreateDeposit(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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; prepared: PreparedTransaction }> {\n const { depositDetails, prepared } = await this.prepareCreateDepositInternal(params);\n return {\n depositDetails,\n prepared: {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n },\n };\n }\n\n private async prepareCreateDepositInternal(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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n prepared: PreparedTransactionWithAbi;\n }> {\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 depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }),\n );\n const hasOverrides = Boolean(\n params.paymentMethodsOverride ||\n params.paymentMethodDataOverride ||\n params.currenciesOverride,\n );\n\n let paymentMethods: `0x${string}`[];\n let paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n let currencies: OnchainCurrencyEntry[][];\n\n if (hasOverrides) {\n if (\n !params.paymentMethodsOverride ||\n !params.paymentMethodDataOverride ||\n !params.currenciesOverride\n ) {\n throw new Error(\n 'paymentMethodsOverride, paymentMethodDataOverride, and currenciesOverride must be provided together',\n );\n }\n if (\n params.paymentMethodsOverride.length !== params.paymentMethodDataOverride.length ||\n params.paymentMethodsOverride.length !== params.currenciesOverride.length\n ) {\n throw new Error(\n 'paymentMethodsOverride, paymentMethodDataOverride, and currenciesOverride length mismatch',\n );\n }\n\n paymentMethods = params.paymentMethodsOverride;\n paymentMethodData = params.paymentMethodDataOverride;\n currencies = params.currenciesOverride;\n } else {\n const methods = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n paymentMethods = params.processorNames.map((name) =>\n resolvePaymentMethodHashFromCatalog(name, methods),\n );\n const intentGatingService = getGatingServiceAddress(this.chainId, this.runtimeEnv);\n\n let hashedOnchainIds: string[];\n\n if (params.payeeDetailsHashes) {\n // Use pre-computed hashes (e.g., from registerPayeeDetails)\n if (params.payeeDetailsHashes.length !== params.processorNames.length) {\n throw new Error('payeeDetailsHashes length must match processorNames length');\n }\n hashedOnchainIds = params.payeeDetailsHashes;\n } else {\n // Register payee details with the curator when hashes are not provided\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const apiResponses = await Promise.all(\n depositDetails.map((req) =>\n apiPostDepositDetails(\n req,\n baseApiUrl,\n this.apiTimeoutMs,\n this.apiKey,\n this.authorizationToken,\n ),\n ),\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 hashedOnchainIds = apiResponses.map(\n (r: any) => r.responseObject?.hashedOnchainId as string,\n );\n }\n\n paymentMethodData = hashedOnchainIds.map((hid) => ({\n intentGatingService,\n payeeDetails: hid,\n data: '0x' as `0x${string}`,\n }));\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(\n `Currency ${currency} not supported by ${params.processorNames[i]}. Allowed: ${allowed.join(', ')}`,\n );\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) =>\n group.map((r) => ({ currency: r.currency as any, conversionRate: r.conversionRate })),\n );\n currencies = mapConversionRatesToOnchainMinRate(normalized as any, paymentMethods.length);\n }\n\n const escrowContext = this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n preferV2: this._router.defaultPreferV2,\n });\n\n // Normalize currency tuples to include oracleRateConfig when the ABI requires it\n const normalizedCurrencies = currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n\n const args = [\n {\n token: params.token,\n amount: params.amount,\n intentAmountRange: params.intentAmountRange,\n paymentMethods,\n paymentMethodData,\n currencies: normalizedCurrencies,\n delegate: (params.delegate ?? '0x0000000000000000000000000000000000000000') as Address,\n intentGuardian: (params.intentGuardian ??\n '0x0000000000000000000000000000000000000000') as Address,\n retainOnEmpty: Boolean(params.retainOnEmpty ?? false),\n },\n ];\n\n const prepared = this.prepareEscrowTransaction({\n functionName: 'createDeposit',\n args,\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n\n return { depositDetails, prepared };\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 readonly setAcceptingIntents = this.buildEscrowMethod<{\n depositId: bigint;\n accepting: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setAcceptingIntents', (params) => [params.depositId, params.accepting]);\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 readonly setIntentRange = this.buildEscrowMethod<{\n depositId: bigint;\n min: bigint;\n max: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setIntentRange', (params) => [params.depositId, { min: params.min, max: params.max }]);\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 readonly setCurrencyMinRate = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n minConversionRate: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setCurrencyMinRate', (params) => [\n params.depositId,\n params.paymentMethod,\n params.fiatCurrency,\n params.minConversionRate,\n ]);\n\n /**\n * Configure oracle-backed ARM spread pricing for one payment method/currency pair.\n * This is EscrowV2-only.\n */\n readonly setOracleRateConfig: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetOracleRateConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetOracleRateConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Remove oracle-backed ARM spread pricing for one payment method/currency pair.\n * This is EscrowV2-only.\n */\n readonly removeOracleRateConfig: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareRemoveOracleRateConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareRemoveOracleRateConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Configure oracle-backed ARM spread pricing in batch for one deposit.\n * This is EscrowV2-only.\n */\n readonly setOracleRateConfigBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetOracleRateConfigBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetOracleRateConfigBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Batch update currency min-rate and oracle-config entries for an EscrowV2 deposit.\n */\n readonly updateCurrencyConfigBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareUpdateCurrencyConfigBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareUpdateCurrencyConfigBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Batch deactivate currencies for an EscrowV2 deposit.\n */\n readonly deactivateCurrenciesBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareDeactivateCurrenciesBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareDeactivateCurrenciesBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly addFunds = this.buildEscrowMethod<{\n depositId: bigint;\n amount: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('addFunds', (params) => [params.depositId, params.amount]);\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 readonly removeFunds = this.buildEscrowMethod<{\n depositId: bigint;\n amount: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('removeFunds', (params) => [params.depositId, params.amount]);\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 readonly withdrawDeposit = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('withdrawDeposit', (params) => [params.depositId]);\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 readonly setRetainOnEmpty = this.buildEscrowMethod<{\n depositId: bigint;\n retain: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setRetainOnEmpty', (params) => [params.depositId, params.retain]);\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 readonly setDelegate = this.buildEscrowMethod<{\n depositId: bigint;\n delegate: Address;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setDelegate', (params) => [params.depositId, params.delegate]);\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 readonly removeDelegate = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('removeDelegate', (params) => [params.depositId]);\n\n /**\n * Assign a deposit to a rate manager (vault) through the controller.\n */\n readonly setDepositRateManager = this.buildContractMethod<{\n escrow: Address;\n depositId: bigint;\n registry: Address;\n rateManagerId: Hex;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerControllerAddress,\n abi: this.rateManagerControllerAbi,\n label: 'Rate manager controller (staging only)',\n }),\n 'setDepositRateManager',\n (params) => {\n return [params.escrow, params.depositId, params.registry, params.rateManagerId];\n },\n );\n\n /**\n * Clear an existing rate manager delegation for a deposit.\n */\n readonly clearDepositRateManager = this.buildContractMethod<{\n escrow: Address;\n depositId: bigint;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerControllerAddress,\n abi: this.rateManagerControllerAbi,\n label: 'Rate manager controller (staging only)',\n }),\n 'clearDepositRateManager',\n (params) => {\n return [params.escrow, params.depositId];\n },\n );\n\n /**\n * Assign a deposit to a rate manager directly on EscrowV2.\n */\n readonly setRateManager = this.buildEscrowMethod<{\n depositId: bigint;\n rateManagerAddress: Address;\n rateManagerId: Hex;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setRateManager', (params) => {\n return [params.depositId, params.rateManagerAddress, params.rateManagerId];\n });\n\n /**\n * Clear a direct EscrowV2 rate manager assignment.\n */\n readonly clearRateManager = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('clearRateManager', (params) => {\n return [params.depositId];\n });\n\n /**\n * Create a new rate manager (vault).\n */\n readonly createRateManager: PrepareableMethod<\n {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareCreateRateManagerTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareCreateRateManagerTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Set a manager floor for a single payment method/currency pair.\n */\n readonly setVaultMinRate: PrepareableMethod<\n {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultRateTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultRateTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Set manager floors in batch.\n */\n readonly setVaultMinRatesBatch: PrepareableMethod<\n {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultRatesBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultRatesBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Update vault manager fee.\n */\n readonly setVaultFee = this.buildContractMethod<{\n rateManagerId: Hex;\n newFee: bigint;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerRegistryAddress,\n abi: this.rateManagerRegistryAbi,\n label: 'Rate manager registry (staging only)',\n }),\n 'setFee',\n (params) => {\n return [params.rateManagerId, params.newFee];\n },\n );\n\n /**\n * Update vault manager/config metadata.\n */\n readonly setVaultConfig: PrepareableMethod<\n {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Read controller delegation state for a deposit.\n */\n async getDepositRateManager(\n escrow: Address,\n depositId: bigint | number | string,\n ): Promise<{ registry: Address; rateManagerId: Hex }> {\n return this._vaultOps.getDepositRateManager(escrow, depositId);\n }\n\n /**\n * Read effective manager fee for a deposit.\n */\n async getManagerFee(escrow: Address, depositId: bigint | number | string): Promise<bigint> {\n return this._vaultOps.getManagerFee(escrow, depositId);\n }\n\n /**\n * Read the effective conversion rate on EscrowV2.\n */\n async getEffectiveRate(params: {\n escrow: Address;\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n }): Promise<bigint> {\n return this._vaultOps.getEffectiveRate(params);\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 readonly addPaymentMethods: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addPaymentMethods',\n });\n const normalizedCurrencies = params.currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addPaymentMethods',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.paymentMethodData,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addPaymentMethods',\n });\n const normalizedCurrencies = params.currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addPaymentMethods',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.paymentMethodData,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly setPaymentMethodActive = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n isActive: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setPaymentMethodActive', (params) => [\n params.depositId,\n params.paymentMethod,\n params.isActive,\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 readonly removePaymentMethod = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setPaymentMethodActive', (params) => [params.depositId, params.paymentMethod, false]);\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 readonly addCurrencies: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addCurrencies',\n });\n const normalizedCurrencies = this.normalizeCurrencyTuples(\n params.currencies,\n escrowContext.abi,\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addCurrencies',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethod,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addCurrencies',\n });\n const normalizedCurrencies = this.normalizeCurrencyTuples(\n params.currencies,\n escrowContext.abi,\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addCurrencies',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethod,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly deactivateCurrency = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n currencyCode: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('deactivateCurrency', (params) => [\n params.depositId,\n params.paymentMethod,\n params.currencyCode,\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 readonly removeCurrency = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n currencyCode: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('deactivateCurrency', (params) => [\n params.depositId,\n params.paymentMethod,\n params.currencyCode,\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 readonly pruneExpiredIntents = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('pruneExpiredIntents', (params) => [params.depositId]);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.signalIntent.prepare(params);\n * // Submit via relayer or inspect calldata\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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.referralFees - Optional referral fee recipients and fee amounts\n * @param params.referrer - Deprecated legacy single-referrer address\n * @param params.referrerFee - Deprecated legacy single-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 * // Execute directly\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 * // Or prepare for relayer submission\n * const prepared = await client.signalIntent.prepare({\n * depositId: 42n,\n * amount: 100_000000n,\n * toAddress: '0x...',\n * processorName: 'wise',\n * payeeDetails: '0x...',\n * fiatCurrencyCode: 'USD',\n * conversionRate: 1_020000000000000000n,\n * });\n * // prepared.to, prepared.data, prepared.value, prepared.chainId\n * ```\n */\n readonly signalIntent: PrepareableMethod<SignalIntentMethodParams, Hash> = Object.assign(\n async (params: SignalIntentMethodParams): Promise<Hash> => {\n const prepared = await this.prepareSignalIntent(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: SignalIntentMethodParams): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSignalIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare signalIntent transaction (all logic except simulation/send).\n * Returns the prepared transaction with encoded calldata.\n */\n private async prepareSignalIntent(\n params: SignalIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSignalIntent(params);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.cancelIntent.prepare({ intentHash });\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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 * @example\n * ```typescript\n * // Execute directly\n * const hash = await client.cancelIntent({ intentHash: '0x...' });\n *\n * // Or prepare for relayer submission\n * const prepared = await client.cancelIntent.prepare({ intentHash: '0x...' });\n * ```\n */\n readonly cancelIntent: PrepareableMethod<CancelIntentMethodParams, Hash> = Object.assign(\n async (params: CancelIntentMethodParams): Promise<Hash> => {\n const prepared = await this.prepareCancelIntent(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: CancelIntentMethodParams): Promise<PreparedTransaction> => {\n const prepared = await this.prepareCancelIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare cancelIntent transaction (all logic except simulation/send).\n */\n private async prepareCancelIntent(\n params: CancelIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareCancelIntent(params);\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 readonly releaseFundsToPayer: PrepareableMethod<\n { intentHash: `0x${string}`; orchestratorAddress?: Address; txOverrides?: TxOverrides },\n Hash\n > = Object.assign(\n async (params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareReleaseFundsToPayer(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareReleaseFundsToPayer(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n private async prepareReleaseFundsToPayer(params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareReleaseFundsToPayer(params);\n }\n\n /**\n * Configure a pre-intent hook for a deposit on OrchestratorV2.\n */\n readonly setDepositPreIntentHook: PrepareableMethod<\n {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareSetDepositPreIntentHook(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSetDepositPreIntentHook(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Configure a whitelist hook for a deposit on OrchestratorV2.\n */\n readonly setDepositWhitelistHook: PrepareableMethod<\n {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareSetDepositWhitelistHook(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSetDepositWhitelistHook(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Permissionless cleanup of orphaned intents on OrchestratorV2.\n */\n readonly cleanupOrphanedIntents: PrepareableMethod<\n {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareCleanupOrphanedIntents(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareCleanupOrphanedIntents(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n private async prepareSetDepositPreIntentHook(params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSetDepositPreIntentHook(params);\n }\n\n private async prepareSetDepositWhitelistHook(params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSetDepositWhitelistHook(params);\n }\n\n private async prepareCleanupOrphanedIntents(params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareCleanupOrphanedIntents(params);\n }\n\n /**\n * Read configured pre-intent hook for a deposit from OrchestratorV2.\n */\n async getDepositPreIntentHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n return this._intentOps.getDepositPreIntentHook(depositId, options);\n }\n\n /**\n * Read configured whitelist hook for a deposit from OrchestratorV2.\n */\n async getDepositWhitelistHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n return this._intentOps.getDepositWhitelistHook(depositId, options);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.fulfillIntent.prepare(params);\n * // Submit via relayer or inspect calldata\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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.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 * @example\n * ```typescript\n * // Execute directly\n * const hash = await client.fulfillIntent({\n * intentHash: '0x...',\n * proof: proofFromExtension,\n * });\n *\n * // Or prepare for relayer submission\n * const prepared = await client.fulfillIntent.prepare({\n * intentHash: '0x...',\n * proof: proofFromExtension,\n * });\n * // prepared.to, prepared.data, prepared.value, prepared.chainId\n * ```\n */\n readonly fulfillIntent: PrepareableMethod<FulfillIntentMethodParams, Hash> = Object.assign(\n async (params: FulfillIntentMethodParams): Promise<Hash> => {\n // Call onAttestationStart callback before preparation (includes attestation service call)\n params?.callbacks?.onAttestationStart?.();\n const prepared = await this.prepareFulfillIntent(params);\n const txHash = await this.executePreparedTransaction(prepared, params.txOverrides);\n params?.callbacks?.onTxSent?.(txHash);\n return txHash;\n },\n {\n prepare: async (params: FulfillIntentMethodParams): Promise<PreparedTransaction> => {\n // Call onAttestationStart callback for prepare mode too\n params?.callbacks?.onAttestationStart?.();\n const prepared = await this.prepareFulfillIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare fulfillIntent transaction (all logic except simulation/send).\n * Includes fetching intent inputs and calling attestation service.\n */\n private async prepareFulfillIntent(\n params: FulfillIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareFulfillIntent(params);\n }\n\n private defaultAttestationService(): string {\n return this._intentOps.defaultAttestationService();\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(\n req: QuoteRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetQuoteResponse> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(req.referrerFeeConfig, 'getQuote');\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(\n /\\/$/,\n '',\n );\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) {\n const configuredEscrows =\n this.escrowAddresses.length > 0\n ? this.escrowAddresses.map((address) => address as string)\n : this.escrowAddress\n ? [this.escrowAddress as string]\n : [];\n if (configuredEscrows.length > 0) {\n reqWithEscrow.escrowAddresses = configuredEscrows;\n }\n }\n const quote = await apiGetQuote(\n reqWithEscrow as any,\n baseApiUrl,\n timeoutMs,\n this.apiKey,\n this.authorizationToken,\n );\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 appendReferrerFeeDisplayFields(quote, referrerFeeConfig);\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 * @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(\n req: GetTakerTierRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetTakerTierResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n return apiGetTakerTier(req, this.apiKey, baseApiUrl, timeoutMs);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ON-CHAIN DEPOSIT VIEWS ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n private requireProtocolViewer() {\n return this._pvReader.requireProtocolViewer();\n }\n\n private protocolViewerFunctionInputCount(functionName: string): number | null {\n return this._pvReader.protocolViewerFunctionInputCount(functionName);\n }\n\n /**\n * Returns the input count for a function on a specific PV entry's ABI.\n * Used to branch between 1-input (V1) and 2-input (V2) PV call signatures.\n */\n private pvEntryFunctionInputCount(entry: { abi: Abi }, functionName: string): number | null {\n return this._pvReader.pvEntryFunctionInputCount(entry, functionName);\n }\n\n private isZeroAddressValue(value?: string | null): boolean {\n return this._pvReader.isZeroAddressValue(value);\n }\n\n private toBigIntOrZero(value: unknown, fieldName = 'numeric field'): bigint {\n return this._pvReader.toBigIntOrZero(value, fieldName);\n }\n\n private buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): Array<{ escrow: Address; orchestrator: Address }> {\n return this._pvReader.buildProtocolViewerContexts(options);\n }\n\n private isProtocolViewerDepositPopulated(view: PV_DepositView): boolean {\n return this._pvReader.isProtocolViewerDepositPopulated(view);\n }\n\n private isProtocolViewerIntentPopulated(view: PV_IntentView): boolean {\n return this._pvReader.isProtocolViewerIntentPopulated(view);\n }\n\n private buildDepositViewFromEscrowDeposit(\n rawDeposit: unknown,\n depositId: bigint,\n ): PV_DepositView {\n return this._pvReader.buildDepositViewFromEscrowDeposit(rawDeposit, depositId);\n }\n\n private convertIndexerDepositToPvView(deposit: DepositWithRelations): PV_DepositView {\n return this._pvReader.convertIndexerDepositToPvView(deposit);\n }\n\n private async getPvAccountDepositsFromIndexer(owner: Address): Promise<PV_DepositView[]> {\n return this._pvReader.getPvAccountDepositsFromIndexer(owner);\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, options?: { strictEscrow?: boolean }) {\n return this._pvReader.getPvDepositById(depositId, options);\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 return this._pvReader.getPvDepositsFromIds(ids);\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 return this._pvReader.getPvAccountDeposits(owner);\n }\n\n /**\n * Fetches all intents created by an address from on-chain.\n * Iterates all configured ProtocolViewer entries (V2 first, V1 fallback)\n * to cover intents across different orchestrator versions.\n *\n * @param owner - The owner address\n * @returns Array of parsed intent views (deduplicated by intentHash)\n */\n async getPvAccountIntents(owner: Address) {\n return this._pvReader.getPvAccountIntents(owner);\n }\n\n /**\n * Fetches a single intent by hash from on-chain.\n * Tries all configured ProtocolViewer entries (V2 first, V1 fallback).\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 return this._pvReader.getPvIntent(intentHash);\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(): {\n escrow: Address;\n escrowV2?: Address;\n escrowAddresses: Address[];\n orchestrator?: Address;\n orchestratorV2?: Address;\n orchestratorAddresses: Address[];\n protocolViewer?: Address;\n protocolViewerEntries: Address[];\n unifiedPaymentVerifier?: Address;\n rateManagerV1?: Address;\n orchestratorRegistry?: Address;\n usdc?: Address;\n } {\n return {\n escrow: this.escrowAddress,\n escrowV2: this.escrowV2Address,\n escrowAddresses: this.escrowAddresses,\n orchestrator: this.orchestratorAddress,\n orchestratorV2: this.orchestratorV2Address,\n orchestratorAddresses: this.orchestratorAddresses,\n protocolViewer: this.protocolViewerAddress,\n protocolViewerEntries: this._protocolViewerEntries.map((e) => e.address),\n unifiedPaymentVerifier: this.unifiedPaymentVerifier,\n rateManagerV1: this.rateManagerV1Address,\n orchestratorRegistry: this.orchestratorRegistryAddress,\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 paymentVerifier?: `0x${string}`;\n }> {\n return this._intentOps.getFulfillIntentInputs(intentHash);\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 ApiDeposit,\n DepositVerifier,\n DepositVerifierCurrency,\n GetTakerTierRequest,\n GetTakerTierResponse,\n} from '../types';\nimport { NetworkError, ValidationError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport { IndexerClient, defaultIndexerEndpoint, type DeploymentEnv } from '../indexer/client';\nimport { IndexerDepositService } from '../indexer/service';\nimport type { DepositWithRelations } from '../indexer/types';\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)\n 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(\n 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 },\n retryCount,\n retryDelayMs,\n timeoutMs,\n );\n}\n\nfunction requireEscrowAddress(escrowAddress: string | undefined, endpoint: string): string {\n if (!escrowAddress) {\n throw new ValidationError(`escrowAddress is required for ${endpoint}`, 'escrowAddress');\n }\n return escrowAddress;\n}\n\nfunction inferIndexerEnvFromBaseApiUrl(baseApiUrl: string): DeploymentEnv {\n const normalized = withApiBase(baseApiUrl).toLowerCase();\n\n if (\n normalized.includes('preprod') ||\n normalized.includes('preproduction') ||\n normalized.includes('/preprod/')\n ) {\n return 'PREPRODUCTION';\n }\n\n if (\n normalized.includes('staging') ||\n normalized.includes('/staging/') ||\n normalized.includes('localhost') ||\n normalized.includes('127.0.0.1')\n ) {\n return 'STAGING';\n }\n\n return 'PRODUCTION';\n}\n\nasync function withOptionalTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number | undefined,\n endpoint: string,\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) return promise;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<T>((_, reject) => {\n timer = setTimeout(() => {\n reject(new NetworkError('Request timed out', { endpoint }));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction toDateFromUnixSeconds(value?: string | null): Date | undefined {\n if (!value) return undefined;\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0) return undefined;\n return new Date(numeric * 1000);\n}\n\nfunction toBigIntSafe(value?: string | number | bigint | null): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return BigInt(value);\n } catch {\n return 0n;\n }\n}\n\nfunction normalizeOwnerDepositsStatus(\n status: GetOwnerDepositsRequest['status'],\n): 'ACTIVE' | 'CLOSED' | undefined {\n if (!status) return undefined;\n if (status === 'WITHDRAWN') return 'CLOSED';\n return status;\n}\n\nfunction buildLegacyVerifierCurrencies(\n deposit: DepositWithRelations,\n): Map<string, DepositVerifierCurrency[]> {\n const currenciesByMethod = new Map<string, DepositVerifierCurrency[]>();\n\n for (const currency of deposit.currencies ?? []) {\n const methodHash = currency.paymentMethodHash;\n const bucket = currenciesByMethod.get(methodHash) ?? [];\n bucket.push({\n currencyCode: currency.currencyCode,\n conversionRate: currency.conversionRate ?? currency.minConversionRate,\n minConversionRate: currency.minConversionRate,\n managerRate: currency.managerRate ?? null,\n rateManagerId: currency.rateManagerId ?? null,\n });\n currenciesByMethod.set(methodHash, bucket);\n }\n\n return currenciesByMethod;\n}\n\nfunction convertIndexerDepositToLegacyApiDeposit(deposit: DepositWithRelations): ApiDeposit {\n const currenciesByMethod = buildLegacyVerifierCurrencies(deposit);\n const verifiers: DepositVerifier[] = (deposit.paymentMethods ?? [])\n .filter((paymentMethod) => paymentMethod.active !== false)\n .map((paymentMethod) => ({\n depositId: Number(deposit.depositId),\n verifier: '',\n methodHash: paymentMethod.paymentMethodHash,\n intentGatingService: paymentMethod.intentGatingService,\n payeeDetailsHash: paymentMethod.payeeDetailsHash,\n data: '0x',\n currencies: currenciesByMethod.get(paymentMethod.paymentMethodHash) ?? [],\n }));\n\n const remainingDeposits = toBigIntSafe(deposit.remainingDeposits);\n const outstandingIntentAmount = toBigIntSafe(deposit.outstandingIntentAmount);\n const totalAmountTaken = toBigIntSafe(deposit.totalAmountTaken);\n const totalWithdrawn = toBigIntSafe(deposit.totalWithdrawn);\n const amount = remainingDeposits + outstandingIntentAmount + totalAmountTaken + totalWithdrawn;\n\n return {\n id: Number(deposit.depositId),\n depositor: deposit.depositor,\n token: deposit.token,\n amount: amount.toString(),\n remainingDeposits: deposit.remainingDeposits,\n intentAmountMin: deposit.intentAmountMin,\n intentAmountMax: deposit.intentAmountMax,\n acceptingIntents: deposit.acceptingIntents,\n outstandingIntentAmount: deposit.outstandingIntentAmount,\n availableLiquidity: deposit.remainingDeposits,\n status: deposit.status,\n totalIntents: deposit.totalIntents,\n signaledIntents: deposit.signaledIntents,\n fulfilledIntents: deposit.fulfilledIntents,\n prunedIntents: deposit.prunedIntents,\n totalAmountTaken: deposit.totalAmountTaken,\n totalWithdrawn: deposit.totalWithdrawn,\n successRateBps: deposit.successRateBps,\n rateManagerId: deposit.rateManagerId ?? null,\n vaultName: null,\n rateManagerRegistry: null,\n createdAt: toDateFromUnixSeconds(deposit.timestamp),\n updatedAt: toDateFromUnixSeconds(deposit.updatedAt),\n verifiers,\n };\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\nexport async function apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n authToken?: string,\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/makers/create`,\n method: 'POST',\n body: req,\n apiKey,\n authToken,\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 | undefined,\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\nexport async function apiGetOwnerDeposits(\n req: GetOwnerDepositsRequest,\n apiKey: string | undefined,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number,\n): Promise<GetOwnerDepositsResponse> {\n const escrowAddress = requireEscrowAddress(\n req.escrowAddress,\n 'apiGetOwnerDeposits requires escrowAddress',\n );\n const indexerEndpoint = defaultIndexerEndpoint(inferIndexerEnvFromBaseApiUrl(baseApiUrl));\n const indexerClient = new IndexerClient(indexerEndpoint, {\n apiKey,\n authorizationToken: authToken,\n });\n const service = new IndexerDepositService(indexerClient);\n\n const deposits = await withOptionalTimeout(\n service.fetchDepositsWithRelations(\n {\n depositor: req.ownerAddress,\n escrowAddress,\n escrowAddresses: req.escrowAddresses?.length ? req.escrowAddresses : undefined,\n status: normalizeOwnerDepositsStatus(req.status),\n },\n undefined,\n { includeIntents: false },\n ),\n timeoutMs,\n indexerEndpoint,\n );\n\n return {\n success: true,\n message: 'ok',\n responseObject: deposits.map(convertIndexerDepositToLegacyApiDeposit),\n statusCode: 200,\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 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 timeoutMs,\n });\n}\n","import { formatUnits } from 'viem';\n\nimport type {\n GetQuoteResponse,\n GetQuoteSingleResponse,\n QuoteResponse,\n ReferrerFeeConfig,\n} from '../types';\n\nexport const formatTokenAmountForDisplay = (amount: bigint, decimals: number): string => {\n const formatted = formatUnits(amount, decimals);\n if (!formatted.includes('.')) {\n return formatted;\n }\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return trimmed.length > 0 ? trimmed : '0';\n};\n\nexport const applyReferrerFeeDisplayFieldsToTokenAmount = (\n tokenAmount: string,\n referrerFeeConfig: ReferrerFeeConfig,\n decimals: number,\n): {\n tokenAmount: string;\n tokenAmountFormatted: string;\n referrerFeeAmount: string;\n referrerFeeAmountFormatted: string;\n referrerFeeBps: number;\n signalIntentAmount: string;\n signalIntentAmountFormatted: string;\n} | null => {\n try {\n const grossAmount = BigInt(tokenAmount);\n const feeAmount = (grossAmount * BigInt(referrerFeeConfig.feeBps)) / 10000n;\n const netAmount = grossAmount - feeAmount;\n\n return {\n tokenAmount: netAmount.toString(),\n tokenAmountFormatted: formatTokenAmountForDisplay(netAmount, decimals),\n referrerFeeAmount: feeAmount.toString(),\n referrerFeeAmountFormatted: formatTokenAmountForDisplay(feeAmount, decimals),\n referrerFeeBps: referrerFeeConfig.feeBps,\n signalIntentAmount: grossAmount.toString(),\n signalIntentAmountFormatted: formatTokenAmountForDisplay(grossAmount, decimals),\n };\n } catch {\n return null;\n }\n};\n\nexport const applyReferrerFeeDisplayFieldsToQuote = (\n quote: QuoteResponse['responseObject']['quotes'][number],\n referrerFeeConfig: ReferrerFeeConfig,\n decimals: number,\n): GetQuoteSingleResponse => {\n const adjusted = applyReferrerFeeDisplayFieldsToTokenAmount(\n quote.tokenAmount,\n referrerFeeConfig,\n decimals,\n );\n if (!adjusted) {\n return quote;\n }\n\n return {\n ...quote,\n ...adjusted,\n };\n};\n\nexport const appendReferrerFeeDisplayFields = (\n quoteResponse: QuoteResponse,\n referrerFeeConfig: ReferrerFeeConfig | undefined,\n): GetQuoteResponse => {\n if (!referrerFeeConfig) {\n return quoteResponse as GetQuoteResponse;\n }\n\n const decimals = quoteResponse.responseObject?.token?.decimals ?? 6;\n const enrichedQuotes: GetQuoteSingleResponse[] = (quoteResponse.responseObject?.quotes ?? []).map(\n (quote) => applyReferrerFeeDisplayFieldsToQuote(quote, referrerFeeConfig, decimals),\n );\n const enrichedNearbySuggestions = quoteResponse.responseObject?.nearbySuggestions\n ? {\n below: quoteResponse.responseObject.nearbySuggestions.below.map((suggestion) => {\n const adjustedSuggestionAmount = suggestion.suggestedTokenAmount\n ? applyReferrerFeeDisplayFieldsToTokenAmount(\n suggestion.suggestedTokenAmount,\n referrerFeeConfig,\n decimals,\n )\n : null;\n return {\n ...suggestion,\n suggestedTokenAmount:\n adjustedSuggestionAmount?.tokenAmount ?? suggestion.suggestedTokenAmount,\n suggestedTokenAmountFormatted:\n adjustedSuggestionAmount?.tokenAmountFormatted ??\n suggestion.suggestedTokenAmountFormatted,\n quote: applyReferrerFeeDisplayFieldsToQuote(\n suggestion.quote,\n referrerFeeConfig,\n decimals,\n ),\n };\n }),\n above: quoteResponse.responseObject.nearbySuggestions.above.map((suggestion) => {\n const adjustedSuggestionAmount = suggestion.suggestedTokenAmount\n ? applyReferrerFeeDisplayFieldsToTokenAmount(\n suggestion.suggestedTokenAmount,\n referrerFeeConfig,\n decimals,\n )\n : null;\n return {\n ...suggestion,\n suggestedTokenAmount:\n adjustedSuggestionAmount?.tokenAmount ?? suggestion.suggestedTokenAmount,\n suggestedTokenAmountFormatted:\n adjustedSuggestionAmount?.tokenAmountFormatted ??\n suggestion.suggestedTokenAmountFormatted,\n quote: applyReferrerFeeDisplayFieldsToQuote(\n suggestion.quote,\n referrerFeeConfig,\n decimals,\n ),\n };\n }),\n }\n : undefined;\n\n return {\n ...quoteResponse,\n responseObject: {\n ...quoteResponse.responseObject,\n quotes: enrichedQuotes,\n nearbySuggestions: enrichedNearbySuggestions,\n },\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","export type PeerConnectionStatus = 'connected' | 'disconnected' | 'pending';\n\nexport type PeerIntentFulfilledBridgeStatus = 'not_required' | 'pending';\n\nexport type PeerIntentFulfilledResult = {\n intentHash: `0x${string}`;\n status: 'fulfilled';\n fulfillTxHash: `0x${string}`;\n recipientAddress: string | null;\n destinationToken: string | null;\n bridge: {\n required: boolean;\n status: PeerIntentFulfilledBridgeStatus;\n trackingUrl?: string | null;\n txHashes?: Array<{ txHash: `0x${string}`; chainId: number }>;\n outputAmount?: string | null;\n expectedOutputAmount?: string | null;\n };\n};\n\nexport type PeerIntentFulfilledCallback = (result: PeerIntentFulfilledResult) => void;\n\nexport type PeerExtensionApi = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n openSidebar(route: string): void;\n onramp(queryString: string): void;\n onIntentFulfilled(callback: PeerIntentFulfilledCallback): () => void;\n getVersion(): Promise<string>;\n};\n\nexport type PeerExtensionOnrampParams = {\n referrer?: string;\n referrerLogo?: string;\n inputCurrency?: string;\n inputAmount?: string | number;\n paymentPlatform?: string;\n toToken?: string;\n amountUsdc?: string | number | bigint;\n recipientAddress?: string;\n intentHash?: string;\n};\n\nexport type PeerExtensionWindow = Window & {\n peer?: PeerExtensionApi;\n};\n\nexport type PeerExtensionSdkOptions = {\n window?: PeerExtensionWindow;\n};\n\nexport type PeerExtensionSdk = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n openSidebar(route: string): void;\n onramp(params?: PeerExtensionOnrampParams): void;\n onIntentFulfilled(callback: PeerIntentFulfilledCallback): () => void;\n getVersion(): Promise<string>;\n isAvailable(): boolean;\n openInstallPage(): void;\n getState(): Promise<PeerExtensionState>;\n};\n\nexport type PeerExtensionState = 'needs_install' | 'needs_connection' | 'ready';\n\nexport const PEER_EXTENSION_CHROME_URL =\n 'https://chromewebstore.google.com/detail/peerauth-authenticate-and/ijpgccednehjpeclfcllnjjcmiohdjih';\n\nconst resolveWindow = (options?: PeerExtensionSdkOptions): PeerExtensionWindow | undefined => {\n if (options?.window) {\n return options.window;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n return window as PeerExtensionWindow;\n};\n\nconst requirePeer = (options?: PeerExtensionSdkOptions): PeerExtensionApi => {\n const resolvedWindow = resolveWindow(options);\n if (!resolvedWindow) {\n throw new Error('Peer extension SDK requires a browser window.');\n }\n\n if (!resolvedWindow.peer) {\n throw new Error('Peer extension not available. Install or enable the Peer extension.');\n }\n\n return resolvedWindow.peer;\n};\n\nexport const isPeerExtensionAvailable = (options?: PeerExtensionSdkOptions): boolean => {\n const resolvedWindow = resolveWindow(options);\n return Boolean(resolvedWindow?.peer);\n};\n\nexport const openPeerExtensionInstallPage = (options?: PeerExtensionSdkOptions): void => {\n const resolvedWindow = resolveWindow(options);\n if (!resolvedWindow) {\n throw new Error('Peer extension SDK requires a browser window.');\n }\n\n resolvedWindow.open(PEER_EXTENSION_CHROME_URL, '_blank', 'noopener,noreferrer');\n};\n\nexport const getPeerExtensionState = async (\n options?: PeerExtensionSdkOptions,\n): Promise<PeerExtensionState> => {\n if (!isPeerExtensionAvailable(options)) {\n return 'needs_install';\n }\n\n try {\n const status = await requirePeer(options).checkConnectionStatus();\n return status === 'connected' ? 'ready' : 'needs_connection';\n } catch (error) {\n return 'needs_connection';\n }\n};\n\nconst fiatAmountRegex = /^-?\\d*(\\.\\d{0,6})?$/;\nconst usdcAmountRegex = /^\\d+$/;\nconst assertObjectInput = (\n params: PeerExtensionOnrampParams | undefined,\n): PeerExtensionOnrampParams => {\n if (params === undefined) {\n return {};\n }\n\n if (params === null || typeof params !== 'object' || Array.isArray(params)) {\n throw new Error('Peer extension onramp expects an object of query params.');\n }\n\n return params;\n};\n\nconst normalizeOptionalString = (value: unknown, label: string): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Peer extension onramp ${label} must be a non-empty string.`);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`Peer extension onramp ${label} must be a non-empty string.`);\n }\n\n return trimmed;\n};\n\nconst normalizeOptionalUrl = (value: unknown, label: string): string | undefined => {\n const trimmed = normalizeOptionalString(value, label);\n if (trimmed === undefined) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch (error) {\n throw new Error(`Peer extension onramp ${label} must be a valid URL.`);\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`Peer extension onramp ${label} must use http or https.`);\n }\n\n return trimmed;\n};\n\nconst normalizeFiatAmount = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = typeof value === 'number' ? String(value) : value;\n if (typeof normalized !== 'string') {\n throw new Error('Peer extension onramp inputAmount must be a string or number.');\n }\n\n const trimmed = normalized.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp inputAmount must be a non-empty value.');\n }\n\n if (!fiatAmountRegex.test(trimmed)) {\n throw new Error(\n 'Peer extension onramp inputAmount must be a non-negative number with up to 6 decimals.',\n );\n }\n\n if (Number.isNaN(Number(trimmed)) || Number(trimmed) < 0) {\n throw new Error(\n 'Peer extension onramp inputAmount must be a non-negative number with up to 6 decimals.',\n );\n }\n\n return trimmed;\n};\n\nconst normalizeUsdcAmount = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'bigint') {\n if (value < 0n) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n return value.toString();\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0 || !Number.isInteger(value)) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n return String(value);\n }\n\n if (typeof value !== 'string') {\n throw new Error('Peer extension onramp amountUsdc must be a string, number, or bigint.');\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp amountUsdc must be a non-empty value.');\n }\n\n if (!usdcAmountRegex.test(trimmed)) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n\n return trimmed;\n};\n\nconst intentHashRegex = /^0x[a-fA-F0-9]{64}$/;\n\nconst normalizeIntentHash = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error('Peer extension onramp intentHash must be a string.');\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp intentHash must be a non-empty string.');\n }\n\n if (!intentHashRegex.test(trimmed)) {\n throw new Error(\n 'Peer extension onramp intentHash must be a valid bytes32 hex string (0x + 64 hex characters).',\n );\n }\n\n return trimmed.toLowerCase();\n};\n\nconst buildOnrampQueryString = (params: PeerExtensionOnrampParams | undefined): string => {\n const validated = assertObjectInput(params);\n const searchParams = new URLSearchParams();\n const setParam = (key: string, value: string | undefined): void => {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n };\n\n setParam('referrer', normalizeOptionalString(validated.referrer, 'referrer'));\n setParam('referrerLogo', normalizeOptionalUrl(validated.referrerLogo, 'referrerLogo'));\n setParam('inputCurrency', normalizeOptionalString(validated.inputCurrency, 'inputCurrency'));\n setParam('inputAmount', normalizeFiatAmount(validated.inputAmount));\n setParam(\n 'paymentPlatform',\n normalizeOptionalString(validated.paymentPlatform, 'paymentPlatform'),\n );\n setParam('toToken', normalizeOptionalString(validated.toToken, 'toToken'));\n setParam('amountUsdc', normalizeUsdcAmount(validated.amountUsdc));\n setParam(\n 'recipientAddress',\n normalizeOptionalString(validated.recipientAddress, 'recipientAddress'),\n );\n setParam('intentHash', normalizeIntentHash(validated.intentHash));\n\n return searchParams.toString();\n};\n\nexport const createPeerExtensionSdk = (\n options: PeerExtensionSdkOptions = {},\n): PeerExtensionSdk => ({\n isAvailable: () => isPeerExtensionAvailable(options),\n requestConnection: () => requirePeer(options).requestConnection(),\n checkConnectionStatus: () => requirePeer(options).checkConnectionStatus(),\n openSidebar: (route: string) => requirePeer(options).openSidebar(route),\n onramp: (params?: PeerExtensionOnrampParams) =>\n requirePeer(options).onramp(buildOnrampQueryString(params)),\n onIntentFulfilled: (callback: PeerIntentFulfilledCallback) =>\n requirePeer(options).onIntentFulfilled(callback),\n getVersion: () => requirePeer(options).getVersion(),\n openInstallPage: () => openPeerExtensionInstallPage(options),\n getState: () => getPeerExtensionState(options),\n});\n\nexport const peerExtensionSdk = createPeerExtensionSdk();\n","/**\n * @zkp2p/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/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 * // Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise', 'revolut'],\n * depositData: [{ email: 'you@example.com' }, { tag: '@you' }],\n * });\n *\n * // Create a deposit with pre-registered hashes\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 * payeeDetailsHashes: hashedOnchainIds,\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';\nexport {\n assertValidReferrerFeeConfig,\n isValidReferrerFeeBps,\n isValidReferrerFeeRecipient,\n parseReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n} from './referrerFeeConfig';\nexport type {\n SignalIntentReferralFee,\n SignalIntentMethodParams,\n FulfillIntentMethodParams,\n CancelIntentMethodParams,\n} from './client/Zkp2pClient';\nexport { ContractRouter } from './client/ContractRouter';\nexport type {\n EscrowContractContext,\n OrchestratorContractContext,\n ContractRouterConfig,\n} from './client/ContractRouter';\n\n// =============================================================================\n// Client Types\n// =============================================================================\n\nexport type {\n // Client configuration\n AuthorizationTokenProvider,\n Zkp2pClientOptions,\n TimeoutConfig,\n ActionCallback,\n TxOverrides,\n ReferrerFeeConfig,\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 GetNearbyQuote,\n GetNearbySuggestions,\n GetQuoteResponse,\n GetQuoteResponseObject,\n GetQuoteSingleResponse,\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 // Prepared transaction types\n PreparedTransaction,\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// Extension SDK\n// =============================================================================\n\nexport type {\n PeerConnectionStatus,\n PeerExtensionApi,\n PeerExtensionOnrampParams,\n PeerExtensionSdk,\n PeerExtensionSdkOptions,\n PeerExtensionState,\n PeerExtensionWindow,\n PeerIntentFulfilledBridgeStatus,\n PeerIntentFulfilledCallback,\n PeerIntentFulfilledResult,\n} from './extension';\nexport {\n createPeerExtensionSdk,\n getPeerExtensionState,\n isPeerExtensionAvailable,\n openPeerExtensionInstallPage,\n peerExtensionSdk,\n PEER_EXTENSION_CHROME_URL,\n} from './extension';\n\n// =============================================================================\n// Indexer\n// =============================================================================\n\nexport { IndexerClient, defaultIndexerEndpoint } from './indexer/client';\nexport { IndexerDepositService } from './indexer/service';\nexport {\n IndexerRateManagerService,\n compareEventCursorIdsByRecency,\n} from './indexer/rateManagerService';\nexport {\n createCompositeDepositId,\n convertIndexerDepositToEscrowView,\n convertDepositsForLiquidity,\n convertIndexerIntentsToEscrowViews,\n} from './indexer/converters';\nexport { fetchFulfillmentAndPayment as fetchIndexerFulfillmentAndPayment } 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 IntentFulfillmentAmountsEntity as IndexerIntentFulfillmentAmounts,\n DepositPaymentMethodEntity as IndexerDepositPaymentMethod,\n MethodCurrencyEntity as IndexerMethodCurrency,\n IntentStatus as IndexerIntentStatus,\n RateManagerEntity as IndexerRateManager,\n RateManagerRateEntity as IndexerRateManagerRate,\n RateManagerDelegationEntity as IndexerRateManagerDelegation,\n ManagerAggregateStatsEntity as IndexerManagerAggregateStats,\n ManagerStatsEntity as IndexerManagerStats,\n ManagerDailySnapshotEntity as IndexerManagerDailySnapshot,\n RateManagerListItem as IndexerRateManagerListItem,\n RateManagerDetail as IndexerRateManagerDetail,\n ManualRateUpdateEntity as IndexerManualRateUpdate,\n OracleConfigUpdateEntity as IndexerOracleConfigUpdate,\n DepositFundActivityEntity as IndexerDepositFundActivity,\n DepositDailySnapshotEntity as IndexerDepositDailySnapshot,\n} from './indexer/types';\nexport type { DepositFundActivityType as IndexerDepositFundActivityType } 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 {\n RateManagerFilter as IndexerRateManagerFilter,\n RateManagerPaginationOptions as IndexerRateManagerPagination,\n RateManagerDelegationPaginationOptions as IndexerRateManagerDelegationPagination,\n RateManagerOrderField as IndexerRateManagerOrderField,\n OrderDirection as IndexerRateManagerOrderDirection,\n} from './indexer/rateManagerService';\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 apiGetOwnerDeposits,\n apiGetTakerTier,\n} from './adapters/api';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport {\n PAYMENT_PLATFORMS,\n PLATFORM_METADATA,\n SUPPORTED_CHAIN_IDS,\n TOKEN_METADATA,\n CHAINLINK_ORACLE_ADAPTER,\n PYTH_ORACLE_ADAPTER,\n PYTH_CONTRACT_BASE,\n DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n CHAINLINK_ORACLE_FEEDS,\n /** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\n SPREAD_ORACLE_FEEDS,\n PYTH_ORACLE_FEEDS,\n encodeSpreadOracleAdapterConfig,\n encodePythAdapterConfig,\n getSpreadOracleConfig,\n validateOracleFeedsOnChain,\n} from './constants';\nexport type {\n PaymentPlatformType,\n SupportedChainId,\n SpreadOracleFeedConfig,\n SpreadOracleConfig,\n OracleKind,\n PythFeedConfig,\n OracleAdapterOverrides,\n MulticallClient,\n} 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 {\n getContracts,\n getRateManagerContracts,\n getPaymentMethodsCatalog,\n getGatingServiceAddress,\n HISTORICAL_ESCROW_ADDRESSES,\n} 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 encodeWithAttribution,\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_ReferralFee as ReferralFee,\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\n// =============================================================================\n// Vault Utilities\n// =============================================================================\n\nexport {\n ZERO_RATE_MANAGER_ID,\n isZeroRateManagerId,\n normalizeRateManagerId,\n normalizeRegistry,\n getDelegationRoute,\n classifyDelegationState,\n} from './react/hooks/vaultUtils';\nexport type {\n DelegationRoute,\n DelegationState,\n DelegationDepositTarget,\n BatchResult,\n SendTransactionFn,\n SendBatchFn,\n} from './react/hooks/vaultUtils';\n","import type { Address, Hex } from 'viem';\nimport type { PreparedTransaction } from '../../types/prepared';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\nexport const ZERO_RATE_MANAGER_ID =\n '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n\n// ---------------------------------------------------------------------------\n// Normalizers\n// ---------------------------------------------------------------------------\n\nexport const normalizeRateManagerId = (value?: string | null): string =>\n (value ?? ZERO_RATE_MANAGER_ID).toLowerCase();\n\nexport const normalizeRegistry = (value?: string | null): string =>\n (value ?? ZERO_ADDRESS).toLowerCase();\n\nexport const isZeroRateManagerId = (value?: string | null): boolean => {\n if (!value) return true;\n const normalized = value.toLowerCase();\n return normalized === ZERO_ADDRESS || normalized === ZERO_RATE_MANAGER_ID;\n};\n\n// ---------------------------------------------------------------------------\n// Error helper\n// ---------------------------------------------------------------------------\n\nexport const asErrorMessage = (error: unknown): string => {\n if (!error) return 'Unknown error';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n\n const anyErr = error as Record<string, unknown>;\n if (typeof anyErr.shortMessage === 'string') return anyErr.shortMessage;\n if (typeof anyErr.details === 'string') return anyErr.details;\n if (typeof anyErr.message === 'string') return anyErr.message;\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Delegation state classification\n// ---------------------------------------------------------------------------\n\nexport type DelegationState = 'delegated_here' | 'delegated_elsewhere' | 'not_delegated';\n\n/**\n * Classify whether a deposit is delegated to the target vault, delegated\n * elsewhere, or not delegated at all.\n *\n * @param currentRateManagerId The deposit's current rateManagerId (from indexer)\n * @param currentRegistry The deposit's current rateManagerAddress / registry (from indexer)\n * @param targetRateManagerId The vault's rateManagerId we're comparing against\n * @param targetRegistry The vault's registry address we're comparing against\n */\nexport const classifyDelegationState = (\n currentRateManagerId: string | null | undefined,\n currentRegistry: string | null | undefined,\n targetRateManagerId: string,\n targetRegistry: string | null | undefined,\n): DelegationState => {\n if (isZeroRateManagerId(currentRateManagerId)) {\n return 'not_delegated';\n }\n\n const normalizedCurrent = normalizeRateManagerId(currentRateManagerId);\n const normalizedTarget = targetRateManagerId.toLowerCase();\n const normalizedCurrentRegistry = normalizeRegistry(currentRegistry);\n const normalizedTargetRegistry = targetRegistry ? targetRegistry.toLowerCase() : '';\n\n const idsMatch = normalizedCurrent === normalizedTarget;\n const registryMatches = normalizedTargetRegistry\n ? normalizedCurrentRegistry === normalizedTargetRegistry\n : true;\n\n if (idsMatch && registryMatches) {\n return 'delegated_here';\n }\n\n return 'delegated_elsewhere';\n};\n\nexport const assertAtomicDelegationSwitchSupport = (\n requiresSwitch: boolean,\n canBatch: boolean,\n): void => {\n if (!requiresSwitch || canBatch) return;\n throw new Error(\n 'Switching delegation targets requires smart-account batching. Clear the existing delegation first.',\n );\n};\n\n// ---------------------------------------------------------------------------\n// Contract routing\n// ---------------------------------------------------------------------------\n\nexport type DelegationRoute = 'v2';\n\nexport const getDelegationRoute = (_client: unknown, _escrow: Address): DelegationRoute => 'v2';\n\ntype DelegationMethodSupportClient = Partial<\n Record<'setRateManager' | 'clearRateManager', { prepare?: unknown }>\n>;\n\nexport const assertDelegationMethodSupport = (\n client: DelegationMethodSupportClient,\n _route: DelegationRoute,\n action: 'set' | 'clear',\n): void => {\n const method = action === 'set' ? 'setRateManager' : 'clearRateManager';\n if (client?.[method]?.prepare) return;\n throw new Error(`Delegation requires SDK ${method} support`);\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DelegationDepositTarget {\n compositeDepositId: string;\n escrow: Address;\n depositId: bigint;\n currentRateManagerId?: string | null;\n currentRateManagerRegistry?: string | null;\n}\n\nexport interface BatchResult {\n hashes: string[];\n failed: Array<{ compositeDepositId: string; error: string }>;\n}\n\n/**\n * Callback the consumer provides for sending a single prepared transaction.\n * Returns the transaction hash.\n */\nexport type SendTransactionFn = (tx: { to: Address; data: Hex; value?: bigint }) => Promise<string>;\n\n/**\n * Optional callback for batching multiple calls in a single user operation\n * (e.g. via a smart account). If not provided, transactions are sent\n * sequentially via sendTransaction.\n */\nexport type SendBatchFn = (\n txs: Array<{ to: Address; data: Hex; value?: bigint }>,\n) => Promise<string>;\n\n// ---------------------------------------------------------------------------\n// Prepare helpers (used internally by hooks)\n// ---------------------------------------------------------------------------\n\nexport const prepareClearDelegationTx = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n params: { escrow: Address; depositId: bigint },\n referrer?: string | string[],\n): Promise<PreparedTransaction> => {\n const route = getDelegationRoute(client, params.escrow);\n assertDelegationMethodSupport(client, route, 'clear');\n return client.clearRateManager.prepare({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n ...(referrer ? { txOverrides: { referrer } } : {}),\n });\n};\n\nexport const prepareSetDelegationTx = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n params: {\n escrow: Address;\n depositId: bigint;\n registry: Address;\n rateManagerId: Hex;\n },\n referrer?: string | string[],\n): Promise<PreparedTransaction> => {\n const route = getDelegationRoute(client, params.escrow);\n assertDelegationMethodSupport(client, route, 'set');\n return client.setRateManager.prepare({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n rateManagerAddress: params.registry,\n rateManagerId: params.rateManagerId,\n ...(referrer ? { txOverrides: { referrer } } : {}),\n });\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/bigint.ts","../src/errors/index.ts","../src/utils/timeout.ts","../src/contracts.ts","../src/utils/bytes32.ts","../src/utils/currencyKeccak256.ts","../src/utils/paymentMethodHashes.ts","../src/utils/paymentResolution.ts","../src/utils/currency.ts","../src/utils/protocolViewerParsers.ts","../src/client/clientUtils.ts","../src/client/ContractRouter.ts","../src/adapters/verification.ts","../src/errors/utils.ts","../src/adapters/attestation.ts","../src/utils/encode.ts","../src/referrerFeeConfig.ts","../src/utils/attribution.ts","../src/client/IntentOperations.ts","../src/types/index.ts","../src/utils/oracles.ts","../src/constants.ts","../src/utils/logger.ts","../src/client/ProtocolViewerReader.ts","../src/client/VaultOperations.ts","../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/schemaCompatibility.ts","../src/indexer/service.ts","../src/indexer/rateManagerService.ts","../src/indexer/intentVerification.ts","../src/client/Zkp2pClient.ts","../src/adapters/api.ts","../src/utils/referrerFeeDisplay.ts","../src/utils/erc20.ts","../src/extension.ts","../src/index.ts","../src/react/hooks/vaultUtils.ts"],"names":["ErrorCode","ZKP2PError","ValidationError","NetworkError","APIError","ContractError","ZERO_ADDRESS","baseAbisRaw","ProtocolViewerBase","HISTORICAL_ESCROW_ADDRESSES","EscrowBase","OrchestratorBase","UnifiedPaymentVerifierBase","baseStagingAbisRaw","ProtocolViewerBaseStaging","EscrowBaseStaging","OrchestratorBaseStaging","UnifiedPaymentVerifierBaseStaging","baseAddressesRaw","baseStagingAddressesRaw","basePaymentMethodsRaw","baseStagingPaymentMethodsRaw","baseConstantsRaw","baseStagingConstantsRaw","hexToBytes","keccak256","toBytes","bytesToHex","viemKeccak256","lookups","baseStagingPaymentMethods","Currency","currencyInfo","withTimeout","base","headers","AbiCoder","Attribution","concatHex","encodeFunctionData","chainlinkFeeds","encodeAbiParameters","payee","parseDepositView","raw","results","attemptedRead","hadSuccessfulRead","lastError","parseIntentView","result","normalizeAddress","DEFAULT_LIMIT","createHeaders","formatUnits","hardhat","createPublicClient","http","mapConversionRatesToOnchainMinRate","normalizeRateManagerId"],"mappings":"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","file":"index.cjs","sourcesContent":["export function parseBigIntLike(\n value: unknown,\n errorMessage = 'Unsupported numeric value',\n): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number') return BigInt(value);\n if (typeof value === 'string') {\n const normalized = value.trim();\n if (!normalized) throw new Error(errorMessage);\n return BigInt(normalized);\n }\n\n if (value && typeof (value as { toString?: () => string }).toString === 'function') {\n const normalized = (value as { toString: () => string }).toString().trim();\n if (!normalized) throw new Error(errorMessage);\n return BigInt(normalized);\n }\n\n throw new Error(errorMessage);\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;","/**\n * Contract resolution utilities for the SDK.\n *\n * Provides access to deployed contract addresses and ABIs for different\n * networks (Base) 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 baseStagingAddressesRaw from '@zkp2p/contracts-v2/addresses/baseStaging';\nimport * as baseAbisRaw from '@zkp2p/contracts-v2/abis/base';\nimport * as baseStagingAbisRaw from '@zkp2p/contracts-v2/abis/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 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 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): {\n name?: string;\n chainId?: number;\n contracts?: Record<string, `0x${string}`>;\n} {\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)\n 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): {\n methods?: Record<string, { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }>;\n} {\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)\n 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// ---------------------------------------------------------------------------\n// Historical escrow addresses\n// ---------------------------------------------------------------------------\n// Escrow addresses from prior deployments. Merged into escrowAddresses so\n// deposits from retired escrows remain queryable. Current addresses come from\n// contracts-v2 dynamically.\n// Source of truth for what the indexer indexes:\n// STAGING: zkp2p-indexer releases/staging config.base_staging.yaml\n// PROD: zkp2p-indexer main config.base_prod.yaml\n\nexport const HISTORICAL_ESCROW_ADDRESSES: Record<string, `0x${string}`[]> = {\n base: [\n '0x2f121CDDCA6d652f35e8B3E560f9760898888888', // EscrowV2 production (contracts-v2 0.2.0-rc.6)\n ],\n base_staging: [\n '0x5C2a8D9246777eE4501B6C426a8B8C7635C7b5b5', // EscrowV2 staging (contracts-v2 0.2.0-rc.5)\n '0x18EAcBf3FF19528ABe8035CF5cA266F31A2e3f14', // EscrowV2 staging (contracts-v2 0.1.11-rc.3)\n '0x07Cc97c254A5Fb0957553E9F58E4040699357f28', // EscrowV2 staging (contracts-v2 0.1.11-rc.2)\n '0x8455b9a31041125C785044f45458eCf2cbB12eF7', // v2.1 staging Escrow (2025-10-18, PR #83)\n '0x21f007107269ea1c8Fe0730736548090F4945736', // v2.1 staging Escrow (2025-10-04, PR #71)\n ],\n};\n\nexport const HISTORICAL_ORCHESTRATOR_ADDRESSES: Record<string, `0x${string}`[]> = {\n base: [\n '0x88888883Ed048FF0a415271B28b2F52d431810D0', // OrchestratorV2 production (contracts-v2 0.2.0-rc.6)\n ],\n base_staging: [\n '0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e', // OrchestratorV2 staging (contracts-v2 0.2.0-rc.5)\n '0xC0389b3d7A4E6B823e361e562C4a29F04B6C4fB5', // OrchestratorV2 staging (contracts-v2 0.1.11-rc.3)\n ],\n};\n\nconst STAGING_ESCROW_V2_FALLBACK = '0x77e8f808FE201075e0bD651CD46fdF239fc83265';\nconst STAGING_ORCHESTRATOR_V2_FALLBACK = '0xc17a59227B136c45fAa153086a15EF87ED14bE00';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nfunction isValidAddress(value?: string | null): value is `0x${string}` {\n return (\n typeof value === 'string' &&\n /^0x[a-fA-F0-9]{40}$/.test(value) &&\n value.toLowerCase() !== ZERO_ADDRESS\n );\n}\n\nfunction pickAddress(\n contracts: Record<string, string> | undefined,\n keys: string[],\n): `0x${string}` | undefined {\n if (!contracts) return undefined;\n for (const key of keys) {\n const candidate = contracts[key];\n if (isValidAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction pickAbi(source: Record<string, unknown>, names: string[]): Abi | undefined {\n for (const name of names) {\n const candidate = source[name];\n if (Array.isArray(candidate)) return candidate as unknown as Abi;\n // ESM interop: import * as abis may yield { default: [...] } per entry\n if (\n candidate &&\n typeof candidate === 'object' &&\n Array.isArray((candidate as Record<string, unknown>).default)\n ) {\n return (candidate as Record<string, unknown>).default as unknown as Abi;\n }\n }\n return undefined;\n}\n\nfunction uniqueAddresses(...values: Array<string | undefined>): `0x${string}`[] {\n const seen = new Set<string>();\n const addresses: `0x${string}`[] = [];\n for (const value of values) {\n if (!isValidAddress(value)) continue;\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) continue;\n seen.add(normalized);\n addresses.push(value);\n }\n return addresses;\n}\n\nfunction addressesEqual(left?: string, right?: string): boolean {\n return Boolean(left && right && left.toLowerCase() === right.toLowerCase());\n}\n\nfunction readRuntimeEnv(key: string): string | undefined {\n try {\n const meta = import.meta as { env?: Record<string, string | undefined> };\n const fromVite = meta?.env?.[key];\n if (fromVite) return fromVite;\n } catch {\n // ignore\n }\n try {\n const proc = (\n globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process;\n return proc?.env?.[key];\n } catch {\n // ignore\n }\n return undefined;\n}\n\nfunction resolveRuntimeAddressOverride(envKeys: string[]): `0x${string}` | undefined {\n for (const key of envKeys) {\n const candidate = readRuntimeEnv(key);\n if (isValidAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\n// Apply runtime normalization to all imports\nconst baseAddresses = unwrapAddresses(baseAddressesRaw);\nconst baseStagingAddresses = unwrapAddresses(baseStagingAddressesRaw);\nconst basePaymentMethods = unwrapMethods(basePaymentMethodsRaw);\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 /** EscrowV2 contract (supports native rate-manager delegation) */\n escrowV2?: `0x${string}`;\n /** All supported upgraded escrow addresses (current first, then historical) */\n escrowAddresses?: `0x${string}`[];\n /** Orchestrator contract (handles intent signaling and fulfillment) */\n orchestrator?: `0x${string}`;\n /** OrchestratorV2 contract (queries EscrowV2 effective rates) */\n orchestratorV2?: `0x${string}`;\n /** All supported upgraded orchestrator addresses (current first, then historical) */\n orchestratorAddresses?: `0x${string}`[];\n /** UnifiedPaymentVerifier contract (verifies payment proofs) */\n unifiedPaymentVerifier?: `0x${string}`;\n /** UnifiedPaymentVerifierV2 contract (updated verifier) */\n unifiedPaymentVerifierV2?: `0x${string}`;\n /** ProtocolViewer contract (batch read operations) */\n protocolViewer?: `0x${string}`;\n /** Ordered list of all ProtocolViewer instances (primary first, legacy fallback after) */\n protocolViewerEntries?: Array<{ address: `0x${string}`; abi: Abi }>;\n /** USDC token address */\n usdc?: `0x${string}`;\n /** RateManagerV1 contract */\n rateManagerV1?: `0x${string}`;\n /** OrchestratorRegistry contract */\n orchestratorRegistry?: `0x${string}`;\n /** DepositRateManagerRegistryV1 contract */\n rateManagerRegistry?: `0x${string}`;\n /** DepositRateManagerController contract */\n rateManagerController?: `0x${string}`;\n /** ChainlinkOracleAdapter contract */\n chainlinkOracleAdapter?: `0x${string}`;\n /** PythOracleAdapter contract */\n pythOracleAdapter?: `0x${string}`;\n};\n\n/**\n * Contract ABIs for a specific deployment.\n */\nexport type V2ContractAbis = {\n escrow: Abi;\n escrowV2?: Abi;\n orchestrator?: Abi;\n orchestratorV2?: Abi;\n unifiedPaymentVerifier?: Abi;\n unifiedPaymentVerifierV2?: Abi;\n protocolViewer?: Abi;\n rateManagerV1?: Abi;\n orchestratorRegistry?: Abi;\n rateManagerRegistry?: Abi;\n rateManagerController?: Abi;\n};\n\n/**\n * Runtime environment: 'production' for mainnet, 'preproduction' for preprod\n * (production contracts + preprod indexer), 'staging' for testnet/dev.\n */\nexport type RuntimeEnv = 'production' | 'preproduction' | 'staging';\n\n/**\n * Converts a chain ID to its network key.\n * @internal\n */\nexport function networkKeyFromChainId(_chainId: number): 'base' {\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)\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/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(\n chainId: number,\n env: RuntimeEnv = 'production',\n): { addresses: V2ContractAddresses; abis: V2ContractAbis } {\n const key = networkKeyFromChainId(chainId);\n const baseContracts = (baseAddresses.contracts ?? {}) as Record<string, string>;\n const baseV2ProtocolViewerAbi = pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]);\n const baseV2ProtocolViewerAddress = pickAddress(baseContracts, ['ProtocolViewerV2']);\n const baseV1ProtocolViewerAddress = pickAddress(baseContracts, ['ProtocolViewer']);\n const baseProtocolViewerEntries = (() => {\n const entries: Array<{ address: `0x${string}`; abi: Abi }> = [];\n if (baseV2ProtocolViewerAddress && baseV2ProtocolViewerAbi) {\n entries.push({ address: baseV2ProtocolViewerAddress, abi: baseV2ProtocolViewerAbi });\n }\n if (\n baseV1ProtocolViewerAddress &&\n !addressesEqual(baseV1ProtocolViewerAddress, baseV2ProtocolViewerAddress)\n ) {\n entries.push({ address: baseV1ProtocolViewerAddress, abi: ProtocolViewerBase as Abi });\n }\n return entries.length > 0 ? entries : undefined;\n })();\n\n const addressesByKey: Record<'base', V2ContractAddresses> = {\n base: {\n escrow:\n pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']) ??\n pickAddress(baseContracts, ['Escrow']) ??\n ('' as `0x${string}`),\n escrowV2: pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']),\n escrowAddresses: uniqueAddresses(\n pickAddress(baseContracts, ['EscrowV2', 'Escrow_V2']),\n ...HISTORICAL_ESCROW_ADDRESSES.base,\n ),\n orchestrator:\n pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']) ??\n pickAddress(baseContracts, ['Orchestrator']),\n orchestratorV2: pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']),\n orchestratorAddresses: uniqueAddresses(\n pickAddress(baseContracts, ['OrchestratorV2', 'Orchestrator_V2']),\n ...HISTORICAL_ORCHESTRATOR_ADDRESSES.base,\n ),\n unifiedPaymentVerifier: pickAddress(baseContracts, [\n 'UnifiedPaymentVerifierV2',\n 'UnifiedPaymentVerifier',\n ]),\n unifiedPaymentVerifierV2: pickAddress(baseContracts, ['UnifiedPaymentVerifierV2']),\n protocolViewer:\n baseProtocolViewerEntries?.[0]?.address ??\n baseV1ProtocolViewerAddress ??\n baseV2ProtocolViewerAddress,\n protocolViewerEntries: baseProtocolViewerEntries,\n usdc: baseConstants.USDC as `0x${string}` | undefined,\n rateManagerV1: pickAddress(baseContracts, ['RateManagerV1', 'DepositRateManagerRegistryV1']),\n orchestratorRegistry: pickAddress(baseContracts, ['OrchestratorRegistry']),\n rateManagerRegistry: pickAddress(baseContracts, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAddress(baseContracts, ['DepositRateManagerController']),\n chainlinkOracleAdapter: pickAddress(baseContracts, ['ChainlinkOracleAdapter']),\n pythOracleAdapter: pickAddress(baseContracts, ['PythOracleAdapter']),\n },\n };\n\n const abisByKey: Record<'base', V2ContractAbis> = {\n base: {\n escrow: EscrowBase as unknown as Abi,\n escrowV2: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, ['EscrowV2']) ??\n (EscrowBase as unknown as Abi)) as Abi,\n orchestrator: OrchestratorBase as unknown as Abi,\n orchestratorV2: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorV2',\n ]) ?? (OrchestratorBase as unknown as Abi)) as Abi,\n unifiedPaymentVerifier: (pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]) ?? (UnifiedPaymentVerifierBase as unknown as Abi)) as Abi,\n unifiedPaymentVerifierV2: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]),\n protocolViewer: (baseProtocolViewerEntries?.[0]?.abi ??\n (ProtocolViewerBase as unknown as Abi)) as Abi,\n rateManagerV1: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'RateManagerV1',\n 'DepositRateManagerRegistryV1',\n ]),\n orchestratorRegistry: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorRegistry',\n ]),\n rateManagerRegistry: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAbi(baseAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerController',\n ]),\n },\n };\n\n // Staging overrides (addresses/abis from contracts-v2 baseStaging deployment)\n if (env === 'staging') {\n const sc = baseStagingAddresses.contracts as Record<string, string> | undefined;\n const stagingEscrowV2Override = resolveRuntimeAddressOverride([\n 'VITE_BASE_STAGING_ESCROW_V2_ADDRESS',\n 'VITE_ESCROW_V2_ADDRESS',\n ]);\n const stagingEscrowCurrent =\n stagingEscrowV2Override ??\n pickAddress(sc, ['EscrowV2', 'Escrow_V2']) ??\n pickAddress(sc, ['Escrow']) ??\n STAGING_ESCROW_V2_FALLBACK;\n const stagingOrchestratorV2Override = resolveRuntimeAddressOverride([\n 'VITE_BASE_STAGING_ORCHESTRATOR_V2_ADDRESS',\n 'VITE_ORCHESTRATOR_V2_ADDRESS',\n 'VITE_ORCHESTRATORV2_ADDRESS',\n ]);\n const stagingOrchestratorCurrent =\n stagingOrchestratorV2Override ??\n pickAddress(sc, ['OrchestratorV2', 'Orchestrator_V2']) ??\n pickAddress(sc, ['Orchestrator']) ??\n STAGING_ORCHESTRATOR_V2_FALLBACK;\n const stagingRateManagerV1 = pickAddress(sc, ['RateManagerV1', 'DepositRateManagerRegistryV1']);\n\n return {\n addresses: {\n escrow: stagingEscrowCurrent as `0x${string}`,\n escrowV2: stagingEscrowCurrent,\n escrowAddresses: uniqueAddresses(\n stagingEscrowCurrent,\n ...HISTORICAL_ESCROW_ADDRESSES.base_staging,\n ),\n orchestrator: stagingOrchestratorCurrent,\n orchestratorV2: stagingOrchestratorCurrent,\n orchestratorAddresses: uniqueAddresses(\n stagingOrchestratorCurrent,\n ...HISTORICAL_ORCHESTRATOR_ADDRESSES.base_staging,\n ),\n unifiedPaymentVerifier: pickAddress(sc, [\n 'UnifiedPaymentVerifierV2',\n 'UnifiedPaymentVerifier',\n ]),\n unifiedPaymentVerifierV2: pickAddress(sc, ['UnifiedPaymentVerifierV2']),\n protocolViewer: pickAddress(sc, ['ProtocolViewerV2', 'ProtocolViewer']),\n protocolViewerEntries: (() => {\n const entries: Array<{ address: `0x${string}`; abi: Abi }> = [];\n // Primary: V2 PV (reads from V2 orchestrator)\n const pvV2Address = pickAddress(sc, ['ProtocolViewerV2']);\n const pvV2Abi = pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]) as Abi | undefined;\n if (pvV2Address && pvV2Abi) {\n entries.push({ address: pvV2Address, abi: pvV2Abi });\n }\n // Fallback: V1 PV (reads V1 orchestrator intents via 1-input functions)\n const pvV1Address = pickAddress(sc, ['ProtocolViewer']);\n const pvV1Abi = ProtocolViewerBaseStaging as unknown as Abi;\n if (pvV1Address && !addressesEqual(pvV1Address, pvV2Address) && pvV1Abi) {\n entries.push({ address: pvV1Address, abi: pvV1Abi });\n }\n return entries.length > 0 ? entries : undefined;\n })(),\n usdc: baseStagingConstants.USDC as `0x${string}` | undefined,\n rateManagerV1: stagingRateManagerV1,\n orchestratorRegistry: pickAddress(sc, ['OrchestratorRegistry']),\n rateManagerRegistry: (pickAddress(sc, ['DepositRateManagerRegistryV1']) ??\n stagingRateManagerV1) as `0x${string}` | undefined,\n rateManagerController: pickAddress(sc, ['DepositRateManagerController']),\n chainlinkOracleAdapter: pickAddress(sc, ['ChainlinkOracleAdapter']),\n pythOracleAdapter: pickAddress(sc, ['PythOracleAdapter']),\n },\n abis: {\n escrow: EscrowBaseStaging as unknown as Abi,\n escrowV2: (addressesEqual(stagingEscrowCurrent, pickAddress(sc, ['Escrow']))\n ? (EscrowBaseStaging as unknown as Abi)\n : (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, ['EscrowV2']) ??\n (EscrowBaseStaging as unknown as Abi))) as Abi,\n orchestrator: OrchestratorBaseStaging as unknown as Abi,\n orchestratorV2: (addressesEqual(\n stagingOrchestratorCurrent,\n pickAddress(sc, ['Orchestrator']),\n )\n ? (OrchestratorBaseStaging as unknown as Abi)\n : (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorV2',\n ]) ?? (OrchestratorBaseStaging as unknown as Abi))) as Abi,\n unifiedPaymentVerifier: (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'UnifiedPaymentVerifierV2',\n ]) ?? (UnifiedPaymentVerifierBaseStaging as unknown as Abi)) as Abi,\n unifiedPaymentVerifierV2: pickAbi(\n baseStagingAbisRaw as unknown as Record<string, unknown>,\n ['UnifiedPaymentVerifierV2'],\n ),\n protocolViewer: (pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'ProtocolViewerV2',\n ]) ?? (ProtocolViewerBaseStaging as unknown as Abi)) as Abi,\n rateManagerV1: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'RateManagerV1',\n 'DepositRateManagerRegistryV1',\n ]),\n orchestratorRegistry: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'OrchestratorRegistry',\n ]),\n rateManagerRegistry: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerRegistryV1',\n 'RateManagerV1',\n ]),\n rateManagerController: pickAbi(baseStagingAbisRaw as unknown as Record<string, unknown>, [\n 'DepositRateManagerController',\n ]),\n },\n };\n }\n\n const result = { addresses: addressesByKey[key], abis: abisByKey[key] };\n\n return result;\n}\n\n/**\n * Catalog of payment methods with their hashes and supported currencies.\n */\nexport type PaymentMethodCatalog = Record<\n string,\n { paymentMethodHash: `0x${string}`; currencies?: `0x${string}`[] }\n>;\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/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(\n _chainId: number,\n env: RuntimeEnv = 'production',\n): PaymentMethodCatalog {\n const src = env === 'staging' ? baseStagingPaymentMethods : basePaymentMethods;\n const methods = (src?.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(\n _chainId: number,\n env: RuntimeEnv = 'production',\n): `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 // Base mainnet (production)\n return '0x396D31055Db28C0C6f36e8b36f18FE7227248a97' as `0x${string}`;\n}\n\nexport function getRateManagerContracts(\n chainId: number,\n env: RuntimeEnv = 'production',\n): {\n addresses: { registry: `0x${string}`; controller?: `0x${string}` };\n abis: { registry: Abi; controller?: Abi };\n} {\n const { addresses, abis } = getContracts(chainId, env);\n const registryAddress = addresses.rateManagerV1 ?? addresses.rateManagerRegistry;\n const registryAbi = abis.rateManagerV1 ?? abis.rateManagerRegistry;\n if (!registryAddress || !registryAbi) {\n throw new Error(`Rate manager contracts not available for chainId=${chainId}, env=${env}`);\n }\n const controllerAddress = addresses.rateManagerController;\n const controllerAbi = controllerAddress ? abis.rateManagerController : undefined;\n\n return {\n addresses: {\n registry: registryAddress,\n ...(controllerAddress ? { controller: controllerAddress } : {}),\n },\n abis: {\n registry: registryAbi,\n ...(controllerAbi ? { controller: controllerAbi } : {}),\n },\n };\n}\n","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(\n value: string,\n { hashIfAscii = false }: { hashIfAscii?: boolean } = {},\n): `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)\n 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 bytesToHex(padded);\n}\n","import { keccak256 as viemKeccak256 } from 'viem';\n\nexport const currencyKeccak256 = (inputString: string): string => {\n const bytes = new TextEncoder().encode(inputString);\n return viemKeccak256(bytes);\n};\n","import lookups from '@zkp2p/contracts-v2/paymentMethods/lookups.json';\n\n/**\n * Canonical payment-method hash map sourced from contracts.\n */\nexport const METHOD_NAME_TO_HASH = lookups.nameToHash;\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 } from './bytes32';\nimport { currencyKeccak256 } from './currencyKeccak256';\nimport { METHOD_NAME_TO_HASH } from './paymentMethodHashes';\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 baseStagingPaymentMethods from '@zkp2p/contracts-v2/paymentMethods/baseStaging';\n\ntype NetworkKey = 'base';\ntype RuntimeEnv = 'production' | 'preproduction' | 'staging';\n\nfunction getPaymentMethodMap(\n env: RuntimeEnv,\n _network: NetworkKey,\n): Record<string, { paymentMethodHash: `0x${string}` }> | null {\n if (env === 'staging') {\n const m = (baseStagingPaymentMethods?.methods ?? {}) as Record<\n string,\n { paymentMethodHash: `0x${string}` }\n >;\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')\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 (keccak256 hash).\n *\n * If the input is already a hex string (0x-prefixed), it's normalized to bytes32.\n * Otherwise, the currency code is hashed using keccak256.\n *\n * @param codeOrBytes - Currency code ('USD') or existing bytes32 hash\n * @returns bytes32 keccak256 hash of the currency code\n *\n * @example\n * ```typescript\n * const bytes = resolveFiatCurrencyBytes32('USD');\n * // Returns: 0xc4ae21aac0c6549d71dd96035b7e0bdb6c79ebdba8891b666115bc976d16a29e\n * ```\n */\nexport function resolveFiatCurrencyBytes32(codeOrBytes: string): `0x${string}` {\n if (codeOrBytes.startsWith('0x')) return ensureBytes32(codeOrBytes) as `0x${string}`;\n return currencyKeccak256(codeOrBytes.toUpperCase()) as `0x${string}`;\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 * If the processor is not found in the catalog, falls back to the known\n * protocol payment method hashes before throwing an error.\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 in catalog or fallback\n *\n * @example\n * ```typescript\n * import { getPaymentMethodsCatalog, resolvePaymentMethodHashFromCatalog } from '@zkp2p/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 // Fallback to known protocol payment method hashes when catalog is missing the entry\n const fallbackHash = METHOD_NAME_TO_HASH[key as keyof typeof METHOD_NAME_TO_HASH];\n if (fallbackHash) return fallbackHash as `0x${string}`;\n\n const available = Object.keys(catalog || {})\n .sort()\n .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 { currencyKeccak256 } from './currencyKeccak256';\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/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 BRL: 'BRL',\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/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: {\n currency: 'AED',\n currencyCode: 'AED',\n currencyName: 'United Arab Emirates Dirham',\n currencyCodeHash: currencyKeccak256('AED'),\n currencySymbol: 'د.إ',\n countryCode: 'ae',\n },\n ARS: {\n currency: 'ARS',\n currencyCode: 'ARS',\n currencyName: 'Argentine Peso',\n currencyCodeHash: currencyKeccak256('ARS'),\n currencySymbol: '$',\n countryCode: 'ar',\n },\n AUD: {\n currency: 'AUD',\n currencyCode: 'AUD',\n currencyName: 'Australian Dollar',\n currencyCodeHash: currencyKeccak256('AUD'),\n currencySymbol: 'A$',\n countryCode: 'au',\n },\n BRL: {\n currency: 'BRL',\n currencyCode: 'BRL',\n currencyName: 'Brazilian Real',\n currencyCodeHash: currencyKeccak256('BRL'),\n currencySymbol: 'R$',\n countryCode: 'br',\n },\n CAD: {\n currency: 'CAD',\n currencyCode: 'CAD',\n currencyName: 'Canadian Dollar',\n currencyCodeHash: currencyKeccak256('CAD'),\n currencySymbol: 'C$',\n countryCode: 'ca',\n },\n CHF: {\n currency: 'CHF',\n currencyCode: 'CHF',\n currencyName: 'Swiss Franc',\n currencyCodeHash: currencyKeccak256('CHF'),\n currencySymbol: 'Fr',\n countryCode: 'ch',\n },\n CNY: {\n currency: 'CNY',\n currencyCode: 'CNY',\n currencyName: 'Chinese Yuan',\n currencyCodeHash: currencyKeccak256('CNY'),\n currencySymbol: '¥',\n countryCode: 'cn',\n },\n CZK: {\n currency: 'CZK',\n currencyCode: 'CZK',\n currencyName: 'Czech Koruna',\n currencyCodeHash: currencyKeccak256('CZK'),\n currencySymbol: 'Kč',\n countryCode: 'cz',\n },\n DKK: {\n currency: 'DKK',\n currencyCode: 'DKK',\n currencyName: 'Danish Krone',\n currencyCodeHash: currencyKeccak256('DKK'),\n currencySymbol: 'kr',\n countryCode: 'dk',\n },\n EUR: {\n currency: 'EUR',\n currencyCode: 'EUR',\n currencyName: 'Euro',\n currencyCodeHash: currencyKeccak256('EUR'),\n currencySymbol: '€',\n countryCode: 'eu',\n },\n GBP: {\n currency: 'GBP',\n currencyCode: 'GBP',\n currencyName: 'British Pound',\n currencyCodeHash: currencyKeccak256('GBP'),\n currencySymbol: '£',\n countryCode: 'gb',\n },\n HKD: {\n currency: 'HKD',\n currencyCode: 'HKD',\n currencyName: 'Hong Kong Dollar',\n currencyCodeHash: currencyKeccak256('HKD'),\n currencySymbol: 'HK$',\n countryCode: 'hk',\n },\n HUF: {\n currency: 'HUF',\n currencyCode: 'HUF',\n currencyName: 'Hungarian Forint',\n currencyCodeHash: currencyKeccak256('HUF'),\n currencySymbol: 'Ft',\n countryCode: 'hu',\n },\n IDR: {\n currency: 'IDR',\n currencyCode: 'IDR',\n currencyName: 'Indonesian Rupiah',\n currencyCodeHash: currencyKeccak256('IDR'),\n currencySymbol: 'Rp',\n countryCode: 'id',\n },\n ILS: {\n currency: 'ILS',\n currencyCode: 'ILS',\n currencyName: 'Israeli New Shekel',\n currencyCodeHash: currencyKeccak256('ILS'),\n currencySymbol: '₪',\n countryCode: 'il',\n },\n INR: {\n currency: 'INR',\n currencyCode: 'INR',\n currencyName: 'Indian Rupee',\n currencyCodeHash: currencyKeccak256('INR'),\n currencySymbol: '₹',\n countryCode: 'in',\n },\n JPY: {\n currency: 'JPY',\n currencyCode: 'JPY',\n currencyName: 'Japanese Yen',\n currencyCodeHash: currencyKeccak256('JPY'),\n currencySymbol: '¥',\n countryCode: 'jp',\n },\n KES: {\n currency: 'KES',\n currencyCode: 'KES',\n currencyName: 'Kenyan Shilling',\n currencyCodeHash: currencyKeccak256('KES'),\n currencySymbol: 'KSh',\n countryCode: 'ke',\n },\n MXN: {\n currency: 'MXN',\n currencyCode: 'MXN',\n currencyName: 'Mexican Peso',\n currencyCodeHash: currencyKeccak256('MXN'),\n currencySymbol: '$',\n countryCode: 'mx',\n },\n MYR: {\n currency: 'MYR',\n currencyCode: 'MYR',\n currencyName: 'Malaysian Ringgit',\n currencyCodeHash: currencyKeccak256('MYR'),\n currencySymbol: 'RM',\n countryCode: 'my',\n },\n NOK: {\n currency: 'NOK',\n currencyCode: 'NOK',\n currencyName: 'Norwegian Krone',\n currencyCodeHash: currencyKeccak256('NOK'),\n currencySymbol: 'kr',\n countryCode: 'no',\n },\n NZD: {\n currency: 'NZD',\n currencyCode: 'NZD',\n currencyName: 'New Zealand Dollar',\n currencyCodeHash: currencyKeccak256('NZD'),\n currencySymbol: 'NZ$',\n countryCode: 'nz',\n },\n PHP: {\n currency: 'PHP',\n currencyCode: 'PHP',\n currencyName: 'Philippine Peso',\n currencyCodeHash: currencyKeccak256('PHP'),\n currencySymbol: '₱',\n countryCode: 'ph',\n },\n PLN: {\n currency: 'PLN',\n currencyCode: 'PLN',\n currencyName: 'Polish Złoty',\n currencyCodeHash: currencyKeccak256('PLN'),\n currencySymbol: 'zł',\n countryCode: 'pl',\n },\n RON: {\n currency: 'RON',\n currencyCode: 'RON',\n currencyName: 'Romanian Leu',\n currencyCodeHash: currencyKeccak256('RON'),\n currencySymbol: 'lei',\n countryCode: 'ro',\n },\n SAR: {\n currency: 'SAR',\n currencyCode: 'SAR',\n currencyName: 'Saudi Riyal',\n currencyCodeHash: currencyKeccak256('SAR'),\n currencySymbol: '﷼',\n countryCode: 'sa',\n },\n SEK: {\n currency: 'SEK',\n currencyCode: 'SEK',\n currencyName: 'Swedish Krona',\n currencyCodeHash: currencyKeccak256('SEK'),\n currencySymbol: 'kr',\n countryCode: 'se',\n },\n SGD: {\n currency: 'SGD',\n currencyCode: 'SGD',\n currencyName: 'Singapore Dollar',\n currencyCodeHash: currencyKeccak256('SGD'),\n currencySymbol: 'S$',\n countryCode: 'sg',\n },\n THB: {\n currency: 'THB',\n currencyCode: 'THB',\n currencyName: 'Thai Baht',\n currencyCodeHash: currencyKeccak256('THB'),\n currencySymbol: '฿',\n countryCode: 'th',\n },\n TRY: {\n currency: 'TRY',\n currencyCode: 'TRY',\n currencyName: 'Turkish Lira',\n currencyCodeHash: currencyKeccak256('TRY'),\n currencySymbol: '₺',\n countryCode: 'tr',\n },\n UGX: {\n currency: 'UGX',\n currencyCode: 'UGX',\n currencyName: 'Ugandan Shilling',\n currencyCodeHash: currencyKeccak256('UGX'),\n currencySymbol: 'USh',\n countryCode: 'ug',\n },\n USD: {\n currency: 'USD',\n currencyCode: 'USD',\n currencyName: 'United States Dollar',\n currencyCodeHash: currencyKeccak256('USD'),\n currencySymbol: '$',\n countryCode: 'us',\n },\n VND: {\n currency: 'VND',\n currencyCode: 'VND',\n currencyName: 'Vietnamese Dong',\n currencyCodeHash: currencyKeccak256('VND'),\n currencySymbol: '₫',\n countryCode: 'vn',\n },\n ZAR: {\n currency: 'ZAR',\n currencyCode: 'ZAR',\n currencyName: 'South African Rand',\n currencyCodeHash: currencyKeccak256('ZAR'),\n currencySymbol: 'R',\n countryCode: 'za',\n },\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(\n `conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`,\n );\n }\n return groups.map((group) =>\n group.map((r) => {\n const info = currencyInfo[r.currency as CurrencyType];\n if (!info?.currencyCodeHash) throw new Error('Invalid currency');\n return {\n code: info.currencyCodeHash as `0x${string}`,\n conversionRate: BigInt(r.conversionRate),\n };\n }),\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(\n `conversionRates length (${groups.length}) must match processorNames length (${expectedGroups})`,\n );\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","import { parseBigIntLike as toBigInt } from './bigint';\n\nexport type PV_ReferralFee = {\n recipient: `0x${string}`;\n fee: bigint;\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 retainOnEmpty: boolean;\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 referralFees: PV_ReferralFee[];\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\nfunction parseReferralFees(rawIntent: any): PV_ReferralFee[] {\n if (Array.isArray(rawIntent?.referralFees)) {\n return rawIntent.referralFees.map((fee: any) => ({\n recipient: (fee.recipient ?? '') as `0x${string}`,\n fee: toBigInt(fee.fee ?? 0),\n }));\n }\n\n const legacyRecipient = rawIntent?.referrer ?? '';\n const legacyFee = toBigInt(rawIntent?.referrerFee ?? 0);\n if (\n typeof legacyRecipient === 'string' &&\n legacyRecipient !== '' &&\n legacyRecipient !== '0x0000000000000000000000000000000000000000' &&\n legacyFee > 0n\n ) {\n return [{ recipient: legacyRecipient as `0x${string}`, fee: legacyFee }];\n }\n\n return [];\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 ?? 0),\n intentAmountRange: {\n min: toBigInt(raw.deposit.intentAmountRange?.min ?? 0),\n max: toBigInt(raw.deposit.intentAmountRange?.max ?? 0),\n },\n acceptingIntents: raw.deposit.acceptingIntents ?? false,\n remainingDeposits: toBigInt(raw.deposit.remainingDeposits ?? 0),\n outstandingIntentAmount: toBigInt(raw.deposit.outstandingIntentAmount ?? 0),\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 retainOnEmpty: raw.deposit.retainOnEmpty ?? false,\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 referralFees: parseReferralFees(raw.intent),\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(\n view: PV_DepositView,\n chainId: number,\n env: RuntimeEnv = 'production',\n) {\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(\n view: PV_IntentView,\n chainId: number,\n env: RuntimeEnv = 'production',\n) {\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","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseBigIntLike } from '../utils/bigint';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Address;\nexport const MIN_ORACLE_SPREAD_BPS = -32_768;\nexport const MAX_ORACLE_SPREAD_BPS = 32_767;\n\nexport type OracleRateConfigShape = {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n};\n\nexport const EMPTY_ORACLE_RATE_CONFIG: OracleRateConfigShape = {\n adapter: ZERO_ADDRESS,\n adapterConfig: '0x',\n spreadBps: 0,\n maxStaleness: 0,\n};\n\nexport const isValidHexAddress = (addr?: string | null): boolean => {\n if (typeof addr !== 'string') return false;\n return /^0x[0-9a-fA-F]{40}$/.test(addr);\n};\n\nexport const normalizeAddress = (addr?: string | null): Address | undefined => {\n if (!isValidHexAddress(addr)) return undefined;\n return addr as Address;\n};\n\nexport const parseEscrowAddressFromCompositeDepositId = (\n depositId: bigint | number | string,\n): Address | undefined => {\n if (typeof depositId !== 'string') return undefined;\n const parts = depositId.split('_');\n if (parts.length < 2) return undefined;\n const maybeEscrow = parts.length >= 3 ? parts[parts.length - 2] : parts[0];\n return normalizeAddress(maybeEscrow);\n};\n\nexport const parseRawDepositId = (depositId: bigint | number | string): bigint => {\n if (typeof depositId === 'bigint') return depositId;\n if (typeof depositId === 'number') return parseBigIntLike(depositId, 'Invalid deposit id');\n const parts = depositId.split('_');\n const raw = parts[parts.length - 1] ?? depositId;\n return parseBigIntLike(raw, 'Invalid deposit id');\n};\n\nexport const normalizeOracleRateConfig = (config: OracleRateConfigShape): OracleRateConfigShape => {\n const spreadBps = Number(config.spreadBps);\n if (\n !Number.isFinite(spreadBps) ||\n spreadBps < MIN_ORACLE_SPREAD_BPS ||\n spreadBps > MAX_ORACLE_SPREAD_BPS\n ) {\n throw new Error(\n `Oracle spreadBps must be between ${MIN_ORACLE_SPREAD_BPS} and ${MAX_ORACLE_SPREAD_BPS}`,\n );\n }\n\n const maxStaleness = Number(config.maxStaleness);\n if (!Number.isFinite(maxStaleness) || maxStaleness < 0 || maxStaleness > 4_294_967_295) {\n throw new Error('Oracle maxStaleness must be between 0 and 4294967295');\n }\n\n return {\n adapter: config.adapter,\n adapterConfig: config.adapterConfig,\n spreadBps: Math.round(spreadBps),\n maxStaleness: Math.round(maxStaleness),\n };\n};\n\nexport const escrowCurrencyHasOracleConfig = (abi: Abi | undefined): boolean => {\n if (!Array.isArray(abi)) return false;\n const fnNames = ['createDeposit', 'addPaymentMethods', 'addCurrencies'];\n for (const fnName of fnNames) {\n const fn = (abi as unknown as Array<Record<string, unknown>>).find(\n (item) => item.type === 'function' && item.name === fnName,\n );\n if (!fn) continue;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n const hasCurrencyOracle = (items: Array<Record<string, unknown>>): boolean => {\n for (const item of items) {\n const components = (item.components as Array<Record<string, unknown>> | undefined) ?? [];\n if (\n components.some((component) => component.name === 'code') &&\n components.some((component) => component.name === 'oracleRateConfig')\n ) {\n return true;\n }\n if (components.length > 0 && hasCurrencyOracle(components)) return true;\n }\n return false;\n };\n if (hasCurrencyOracle(inputs)) return true;\n }\n return false;\n};\n\nexport const normalizeCurrencyTuples = (\n currencies: Array<{\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: OracleRateConfigShape;\n }>,\n escrowAbi: Abi | undefined,\n): Array<Record<string, unknown>> => {\n const needsOracle = escrowCurrencyHasOracleConfig(escrowAbi);\n if (!needsOracle) {\n return currencies.map((currency) => ({\n code: currency.code,\n minConversionRate: currency.minConversionRate,\n }));\n }\n\n return currencies.map((currency) => ({\n code: currency.code,\n minConversionRate: currency.minConversionRate,\n oracleRateConfig: currency.oracleRateConfig\n ? normalizeOracleRateConfig(currency.oracleRateConfig)\n : EMPTY_ORACLE_RATE_CONFIG,\n }));\n};\n\nexport const getAbiFunction = (\n abi: Abi | undefined,\n ...names: string[]\n): Record<string, unknown> | null => {\n if (!Array.isArray(abi)) return null;\n for (const name of names) {\n const match = (abi as unknown as Array<Record<string, unknown>>).find(\n (item) => item.type === 'function' && item.name === name,\n );\n if (match) return match;\n }\n return null;\n};\n\nexport const resolveAbiFunctionName = (abi: Abi | undefined, names: string[]): string => {\n const match = getAbiFunction(abi, ...names);\n const resolved = match?.name;\n if (typeof resolved === 'string') return resolved;\n throw new Error(`Contract does not expose any of: ${names.join(', ')}`);\n};\n\nexport const abiTupleHasComponent = (\n abi: Abi | undefined,\n functionName: string,\n componentName: string,\n): boolean => {\n const fn = getAbiFunction(abi, functionName);\n const inputs = (fn?.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n const tupleInput = inputs.find((input) => input.type === 'tuple');\n const components = (tupleInput?.components as Array<Record<string, unknown>> | undefined) ?? [];\n return components.some((component) => component.name === componentName);\n};\n\nexport const abiFunctionHasInput = (\n abi: Abi | undefined,\n functionName: string,\n inputName: string,\n): boolean => {\n const fn = getAbiFunction(abi, functionName);\n const inputs = (fn?.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.some((input) => input.name === inputName);\n};\n\nexport const parseManagerFeeFromRead = (result: unknown): bigint => {\n if (Array.isArray(result)) {\n const candidate = result.length > 1 ? result[1] : result[0];\n return parseBigIntLike(candidate, 'Unexpected numeric response');\n }\n return parseBigIntLike(result, 'Unexpected numeric response');\n};\n","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseEscrowAddressFromCompositeDepositId } from './clientUtils';\n\nexport interface EscrowContractContext {\n address: Address;\n abi: Abi;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n version: 'v2';\n}\n\nexport interface OrchestratorContractContext {\n address: Address;\n abi: Abi;\n version: 'v2';\n}\n\nexport interface ContractRouterConfig {\n escrowAddress: Address;\n escrowAbi: Abi;\n escrowV2Address?: Address;\n escrowV2Abi?: Abi;\n escrowAddresses: Address[];\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n orchestratorV2Address?: Address;\n orchestratorV2Abi?: Abi;\n orchestratorAddresses: Address[];\n}\n\nconst isSameAddress = (left?: Address, right?: Address): boolean =>\n !!left && !!right && left.toLowerCase() === right.toLowerCase();\n\nexport class ContractRouter {\n private readonly _escrowContextsByAddress = new Map<string, EscrowContractContext>();\n private readonly _orchestratorContextsByAddress = new Map<string, OrchestratorContractContext>();\n\n readonly escrowAddress: Address;\n readonly escrowAbi: Abi;\n readonly escrowV2Address?: Address;\n readonly escrowV2Abi?: Abi;\n readonly escrowAddresses: Address[];\n readonly orchestratorAddress?: Address;\n readonly orchestratorAbi?: Abi;\n readonly orchestratorV2Address?: Address;\n readonly orchestratorV2Abi?: Abi;\n readonly orchestratorAddresses: Address[];\n\n constructor(config: ContractRouterConfig) {\n this.escrowAddress = config.escrowAddress;\n this.escrowAbi = config.escrowAbi;\n this.escrowV2Address = config.escrowV2Address;\n this.escrowV2Abi = config.escrowV2Abi;\n this.escrowAddresses = config.escrowAddresses;\n this.orchestratorAddress = config.orchestratorAddress;\n this.orchestratorAbi = config.orchestratorAbi;\n this.orchestratorV2Address = config.orchestratorV2Address;\n this.orchestratorV2Abi = config.orchestratorV2Abi;\n this.orchestratorAddresses = config.orchestratorAddresses;\n\n this._registerContexts();\n }\n\n private _registerContexts(): void {\n const registerOrchestrator = (context: OrchestratorContractContext | null | undefined) => {\n if (!context?.address || !context.abi) return;\n this._orchestratorContextsByAddress.set(context.address.toLowerCase(), context);\n };\n\n const registerEscrow = (context: EscrowContractContext | null | undefined) => {\n if (!context?.address || !context.abi) return;\n this._escrowContextsByAddress.set(context.address.toLowerCase(), context);\n };\n\n const primaryOrchestratorAddress = this.orchestratorV2Address ?? this.orchestratorAddress;\n const primaryEscrowAbi = this.escrowV2Abi ?? this.escrowAbi;\n\n const escrowToOrchestrator = new Map<string, Address>();\n const addEscrowOrchestratorPair = (escrow?: Address, orchestrator?: Address) => {\n if (!escrow || !orchestrator) return;\n escrowToOrchestrator.set(escrow.toLowerCase(), orchestrator);\n };\n\n addEscrowOrchestratorPair(\n this.escrowV2Address ?? this.escrowAddress,\n primaryOrchestratorAddress,\n );\n\n const configuredPairCount = Math.min(\n this.escrowAddresses.length,\n this.orchestratorAddresses.length,\n );\n for (let index = 0; index < configuredPairCount; index += 1) {\n addEscrowOrchestratorPair(this.escrowAddresses[index], this.orchestratorAddresses[index]);\n }\n\n const resolveOrchestratorAbi = (address?: Address): Abi | undefined =>\n this.getOrchestratorContextByAddress(address)?.abi ??\n (isSameAddress(address, this.orchestratorV2Address)\n ? (this.orchestratorV2Abi ?? this.orchestratorAbi)\n : (this.orchestratorAbi ?? this.orchestratorV2Abi));\n\n const uniqueOrchestratorAddresses = new Set<string>();\n for (const address of [\n primaryOrchestratorAddress,\n this.orchestratorAddress,\n this.orchestratorV2Address,\n ...this.orchestratorAddresses,\n ]) {\n if (!address) continue;\n const key = address.toLowerCase();\n if (uniqueOrchestratorAddresses.has(key)) continue;\n uniqueOrchestratorAddresses.add(key);\n const abi = isSameAddress(address, this.orchestratorV2Address)\n ? (this.orchestratorV2Abi ?? this.orchestratorAbi)\n : (this.orchestratorAbi ?? this.orchestratorV2Abi);\n if (!abi) continue;\n registerOrchestrator({\n address,\n abi,\n version: 'v2',\n });\n }\n\n const uniqueEscrowAddresses = new Set<string>();\n for (const address of [\n this.escrowV2Address ?? this.escrowAddress,\n this.escrowAddress,\n ...this.escrowAddresses,\n ]) {\n if (!address) continue;\n const key = address.toLowerCase();\n if (uniqueEscrowAddresses.has(key)) continue;\n uniqueEscrowAddresses.add(key);\n const orchestratorAddress =\n escrowToOrchestrator.get(key) ?? primaryOrchestratorAddress ?? this.orchestratorAddress;\n registerEscrow({\n address,\n abi: isSameAddress(address, this.escrowV2Address) ? primaryEscrowAbi : this.escrowAbi,\n orchestratorAddress,\n orchestratorAbi: resolveOrchestratorAbi(orchestratorAddress),\n version: 'v2',\n });\n }\n }\n\n getEscrowContextByAddress(address?: Address): EscrowContractContext | undefined {\n if (!address) return undefined;\n return this._escrowContextsByAddress.get(address.toLowerCase());\n }\n\n getOrchestratorContextByAddress(address?: Address): OrchestratorContractContext | undefined {\n if (!address) return undefined;\n return this._orchestratorContextsByAddress.get(address.toLowerCase());\n }\n\n resolveEscrowContext(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n }): EscrowContractContext {\n const explicitEscrow =\n options?.escrowAddress ??\n (options?.depositId !== undefined\n ? parseEscrowAddressFromCompositeDepositId(options.depositId)\n : undefined);\n\n if (explicitEscrow) {\n const explicitContext = this.getEscrowContextByAddress(explicitEscrow);\n if (explicitContext) return explicitContext;\n\n const fallbackOrchestrator = this.resolveOrchestratorForEscrow(explicitEscrow);\n return {\n address: explicitEscrow,\n abi: this.escrowV2Abi ?? this.escrowAbi,\n orchestratorAddress:\n fallbackOrchestrator?.address ?? this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi:\n fallbackOrchestrator?.abi ?? this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n };\n }\n\n return (\n this.getEscrowContextByAddress(this.escrowAddress) ?? {\n address: this.escrowAddress,\n abi: this.escrowAbi,\n orchestratorAddress: this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi: this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n }\n );\n }\n\n getEscrowContexts(): EscrowContractContext[] {\n const contexts = Array.from(this._escrowContextsByAddress.values());\n if (contexts.length > 0) return contexts;\n return [\n {\n address: this.escrowAddress,\n abi: this.escrowAbi,\n orchestratorAddress: this.orchestratorV2Address ?? this.orchestratorAddress,\n orchestratorAbi: this.orchestratorV2Abi ?? this.orchestratorAbi,\n version: 'v2',\n },\n ];\n }\n\n resolveOrchestratorForEscrow(\n escrowAddress?: Address,\n _preferV2 = false,\n ): OrchestratorContractContext | undefined {\n if (escrowAddress) {\n const escrowContext = this.getEscrowContextByAddress(escrowAddress);\n const fromEscrow = this.getOrchestratorContextByAddress(escrowContext?.orchestratorAddress);\n if (fromEscrow) return fromEscrow;\n }\n\n if (this.orchestratorV2Address) {\n const primary = this.getOrchestratorContextByAddress(this.orchestratorV2Address);\n if (primary) return primary;\n }\n\n if (this.orchestratorAddress) {\n const primary = this.getOrchestratorContextByAddress(this.orchestratorAddress);\n if (primary) return primary;\n }\n\n for (const address of this.orchestratorAddresses) {\n const context = this.getOrchestratorContextByAddress(address);\n if (context) return context;\n }\n\n if (this.orchestratorV2Address && this.orchestratorV2Abi) {\n return {\n address: this.orchestratorV2Address,\n abi: this.orchestratorV2Abi,\n version: 'v2',\n };\n }\n\n if (this.orchestratorAddress && this.orchestratorAbi) {\n return {\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n version: 'v2',\n };\n }\n\n return undefined;\n }\n\n buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): Array<{ escrow: Address; orchestrator: Address }> {\n const contexts: Array<{ escrow: Address; orchestrator: Address }> = [];\n const seen = new Set<string>();\n const add = (escrow?: Address, orchestrator?: Address) => {\n if (!escrow || !orchestrator) return;\n const key = `${escrow.toLowerCase()}:${orchestrator.toLowerCase()}`;\n if (seen.has(key)) return;\n seen.add(key);\n contexts.push({ escrow, orchestrator });\n };\n\n add(options?.escrowAddress, options?.orchestratorAddress);\n if (options?.escrowAddress && !options?.orchestratorAddress) {\n add(options.escrowAddress, this.resolveOrchestratorForEscrow(options.escrowAddress)?.address);\n }\n\n for (const context of this.getEscrowContexts()) {\n add(\n context.address,\n context.orchestratorAddress ?? this.resolveOrchestratorForEscrow(context.address)?.address,\n );\n }\n\n return contexts;\n }\n\n get defaultPreferV2(): boolean {\n return true;\n }\n}\n\nexport { parseEscrowAddressFromCompositeDepositId };\n","import type { Address } from 'viem';\nimport { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\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; preIntentHookData?: string };\n signatureExpiration?: string;\n };\n statusCode: number;\n};\n\nexport type SignIntentV3ReferralFee = {\n recipient: Address;\n fee: string;\n};\n\nexport type SignIntentV3Request = SignIntentV2Request & {\n callerAddress: Address; // wallet that will call signalIntent on-chain\n referralFees: SignIntentV3ReferralFee[];\n};\n\ntype SignIntentApiOptions = {\n baseApiUrl: string;\n apiKey?: string;\n authorizationToken?: string;\n timeoutMs?: number;\n};\n\nfunction createHeaders(apiKey?: string, authorizationToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['x-api-key'] = apiKey;\n if (authorizationToken)\n headers['Authorization'] = authorizationToken.startsWith('Bearer ')\n ? authorizationToken\n : `Bearer ${authorizationToken}`;\n return headers;\n}\n\nasync function postSignIntentWithRetry<T>(\n endpoint: '/v2/verify/intent' | '/v3/intent',\n request: SignIntentV2Request | SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<T> {\n const url = `${opts.baseApiUrl.replace(/\\/$/, '')}${endpoint}`;\n\n return withRetry(\n async () => {\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: createHeaders(opts.apiKey, opts.authorizationToken),\n body: JSON.stringify(request),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', { endpoint, error });\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw parseAPIError(res, text);\n }\n\n return (await res.json()) as T;\n },\n 3,\n 1000,\n opts.timeoutMs,\n );\n}\n\nexport async function apiSignIntentV3(\n request: SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<{\n signature: `0x${string}`;\n signatureExpiration: bigint;\n preIntentHookData?: `0x${string}`;\n}> {\n const json = await postSignIntentWithRetry<SignIntentV2Response>('/v3/intent', request, opts);\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr =\n json?.responseObject?.intentData?.signatureExpiration ??\n json?.responseObject?.signatureExpiration;\n const preIntentHookData =\n (json?.responseObject?.intentData as { preIntentHookData?: string } | undefined)\n ?.preIntentHookData ??\n (json?.responseObject as { preIntentHookData?: string } | undefined)?.preIntentHookData;\n if (!sig || !expStr) throw new Error('v3/intent missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\n };\n}\n\nexport async function apiSignIntentV2(\n request: SignIntentV2Request,\n opts: SignIntentApiOptions,\n): Promise<{\n signature: `0x${string}`;\n signatureExpiration: bigint;\n preIntentHookData?: `0x${string}`;\n}> {\n const json = await postSignIntentWithRetry<SignIntentV2Response>(\n '/v2/verify/intent',\n request,\n opts,\n );\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr =\n json?.responseObject?.intentData?.signatureExpiration ??\n json?.responseObject?.signatureExpiration;\n const preIntentHookData =\n (json?.responseObject?.intentData as { preIntentHookData?: string } | undefined)\n ?.preIntentHookData ??\n (json?.responseObject as { preIntentHookData?: string } | undefined)?.preIntentHookData;\n if (!sig || !expStr) throw new Error('verify/intent missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\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 { 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 { 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 { ReferrerFeeConfig } from './types';\n\nconst evmAddressRegex = /^0x[a-fA-F0-9]{40}$/;\n\nexport const isValidReferrerFeeRecipient = (value: string): value is `0x${string}` =>\n evmAddressRegex.test(value);\n\nexport const isValidReferrerFeeBps = (value: number): boolean =>\n Number.isInteger(value) && value >= 0 && value <= 10000;\n\nexport const assertValidReferrerFeeConfig = (\n config: ReferrerFeeConfig | undefined,\n context: 'getQuote' | 'signalIntent',\n): ReferrerFeeConfig | undefined => {\n if (!config) {\n return undefined;\n }\n\n if (!isValidReferrerFeeRecipient(config.recipient)) {\n throw new Error(`${context} referrerFeeConfig.recipient must be a valid 0x address.`);\n }\n\n if (!isValidReferrerFeeBps(config.feeBps)) {\n throw new Error(`${context} referrerFeeConfig.feeBps must be an integer between 0 and 10000.`);\n }\n\n return config;\n};\n\nexport const parseReferrerFeeConfig = (\n recipient: string | null | undefined,\n feeBpsValue: string | number | null | undefined,\n): ReferrerFeeConfig | null => {\n const normalizedRecipient = recipient?.trim();\n if (!normalizedRecipient || feeBpsValue === null || feeBpsValue === undefined) {\n return null;\n }\n\n if (!isValidReferrerFeeRecipient(normalizedRecipient)) {\n return null;\n }\n\n const feeBps = typeof feeBpsValue === 'number' ? feeBpsValue : Number(feeBpsValue.trim());\n if (!isValidReferrerFeeBps(feeBps)) {\n return null;\n }\n\n return {\n recipient: normalizedRecipient,\n feeBps,\n };\n};\n\nexport const referrerFeeConfigToPreciseUnits = (config: ReferrerFeeConfig): bigint =>\n BigInt(config.feeBps) * 100000000000000n;\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 * Encode a contract call with ERC-8021 attribution suffix.\n *\n * This function encodes function data and appends the attribution suffix\n * without sending the transaction. Use this when you need the calldata\n * for relayer submission or inspection.\n *\n * @param request - The request with abi, functionName, args\n * @param referrer - Optional referrer code(s) to prepend before the base builder code\n * @returns Encoded calldata with attribution suffix\n *\n * @example\n * ```typescript\n * const calldata = encodeWithAttribution({\n * abi: escrowAbi,\n * functionName: 'signalIntent',\n * args: [intentParams],\n * }, 'zkp2p-ios');\n *\n * // Submit via relayer\n * await relayer.submit({ to: escrowAddress, data: calldata });\n * ```\n */\nexport function encodeWithAttribution(\n request: Pick<AttributionRequest, 'abi' | 'functionName' | 'args'>,\n referrer?: string | string[]\n): Hex {\n const functionData = encodeFunctionData({\n abi: request.abi,\n functionName: request.functionName as any,\n args: request.args || [],\n });\n return appendAttributionToCalldata(functionData, referrer);\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","import type { Address, Hash, PublicClient, WalletClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext, OrchestratorContractContext } from './ContractRouter';\nimport { ZERO_ADDRESS, parseRawDepositId, resolveAbiFunctionName } from './clientUtils';\nimport { apiSignIntentV2, apiSignIntentV3 } from '../adapters/verification';\nimport { apiCreatePaymentAttestation } from '../adapters/attestation';\nimport {\n encodeAddressAsBytes,\n encodePaymentAttestation,\n encodeVerifyPaymentData,\n} from '../utils/encode';\nimport {\n assertValidReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n} from '../referrerFeeConfig';\nimport { encodeWithAttribution } from '../utils/attribution';\nimport { getPaymentMethodsCatalog } from '../contracts';\nimport {\n resolveFiatCurrencyBytes32,\n resolvePaymentMethodHashFromCatalog,\n resolvePaymentMethodNameFromHash,\n} from '../utils/paymentResolution';\nimport { resolvePlatformAttestationConfig } from '../constants';\nimport type { RuntimeEnv } from '../contracts';\n\n/**\n * Detect whether an orchestrator ABI uses the V2 signalIntent encoding\n * (referralFees[] + preIntentHookData) vs legacy (referrer + referrerFee).\n * Inspects the ABI for a signalIntent input containing 'referralFees'.\n */\nfunction isV2SignalIntentAbi(abi: Abi): boolean {\n for (const item of abi) {\n if (\n (item as any).type === 'function' &&\n (item as any).name === 'signalIntent' &&\n Array.isArray((item as any).inputs)\n ) {\n const inputs = (item as any).inputs as Array<{\n name?: string;\n components?: Array<{ name?: string }>;\n }>;\n for (const input of inputs) {\n if (input.components) {\n if (input.components.some((c) => c.name === 'referralFees')) return true;\n if (input.components.some((c) => c.name === 'referrerFee')) return false;\n }\n }\n }\n }\n // Default to V2 when ABI is ambiguous (newer contracts)\n return true;\n}\nimport { IndexerClient } from '../indexer/client';\nimport { logger } from '../utils/logger';\nimport { IndexerDepositService } from '../indexer/service';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\nimport type { PV_IntentView, PV_PaymentMethodData } from '../utils/protocolViewerParsers';\n\ntype SignalIntentParams = {\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 referralFees?: Array<{ recipient: Address; fee: bigint | string }>;\n referrer?: Address;\n referrerFee?: bigint | string;\n referrerFeeConfig?: { recipient: Address; feeBps: number };\n postIntentHook?: Address;\n preIntentHookData?: `0x${string}`;\n data?: `0x${string}`;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n gatingServiceSignature?: `0x${string}`;\n signatureExpiration?: bigint | string;\n txOverrides?: TxOverrides;\n};\n\ntype CancelIntentParams = {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n};\n\ntype ReleaseFundsParams = {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n};\n\ntype FulfillIntentParams = {\n intentHash: `0x${string}`;\n proof: Record<string, unknown> | string;\n timestampBufferMs?: string;\n attestationServiceUrl?: string;\n orchestratorAddress?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n precomputedAttestation?: {\n paymentProof: Address;\n verificationData: Address;\n };\n callbacks?: {\n onAttestationStart?: () => void;\n onTxSent?: (hash: Hash) => void;\n onTxMined?: (hash: Hash) => void;\n };\n};\n\ninterface IntentOperationsHost {\n resolveEscrowContext: (options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }) => EscrowContractContext;\n resolveOrchestratorContext: (options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n preferV2?: boolean;\n }) => Promise<OrchestratorContractContext>;\n resolveEscrowAddressOrThrow: (\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\n options?: { preferV2?: boolean },\n ) => Address;\n prepareResolvedOrchestratorTransaction: (opts: {\n orchestrator: OrchestratorContractContext;\n functionNames: string[];\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }) => PreparedTransactionWithAbi;\n getFulfillIntentInputs: (intentHash: `0x${string}`) => Promise<{\n amount: string;\n fiatCurrency: `0x${string}`;\n conversionRate: string;\n payeeDetails: `0x${string}`;\n intentTimestampMs: string;\n paymentMethodHash: `0x${string}`;\n paymentVerifier?: `0x${string}`;\n }>;\n getPvIntent: (intentHash: `0x${string}`) => Promise<PV_IntentView>;\n}\n\nexport interface IntentOperationsConfig {\n getWalletClient: () => WalletClient;\n getPublicClient: () => PublicClient;\n getChainId: () => number;\n getRuntimeEnv: () => RuntimeEnv;\n getBaseApiUrl: () => string | undefined;\n getApiKey: () => string | undefined;\n getAuthorizationToken: () => string | undefined;\n getApiTimeoutMs: () => number;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getIndexerClient: () => IndexerClient;\n getIndexerService: () => IndexerDepositService;\n getDefaultPreferV2: () => boolean;\n host: IntentOperationsHost;\n}\n\nexport class IntentOperations {\n constructor(private readonly config: IntentOperationsConfig) {}\n\n async prepareSignalIntent(params: SignalIntentParams): Promise<PreparedTransactionWithAbi> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(\n params.referrerFeeConfig,\n 'signalIntent',\n );\n if (\n referrerFeeConfig &&\n (params.referralFees !== undefined ||\n params.referrer !== undefined ||\n params.referrerFee !== undefined)\n ) {\n throw new Error(\n 'signalIntent referrerFeeConfig cannot be combined with referralFees, referrer, or referrerFee.',\n );\n }\n\n const preferV2 = this.config.getDefaultPreferV2();\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2,\n });\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: escrowContext.address,\n preferV2,\n });\n const useV2Encoding = isV2SignalIntentAbi(orchestratorContext.abi);\n const catalog = getPaymentMethodsCatalog(this.config.getChainId(), this.config.getRuntimeEnv());\n const paymentMethod = resolvePaymentMethodHashFromCatalog(params.processorName, catalog);\n const fiatCurrency = resolveFiatCurrencyBytes32(params.fiatCurrencyCode);\n const depositId = parseRawDepositId(params.depositId);\n const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);\n const conversionRate =\n typeof params.conversionRate === 'bigint'\n ? params.conversionRate\n : BigInt(params.conversionRate);\n const referralFees =\n referrerFeeConfig !== undefined\n ? [\n {\n recipient: referrerFeeConfig.recipient,\n fee: referrerFeeConfigToPreciseUnits(referrerFeeConfig),\n },\n ]\n : normalizeSignalIntentReferralFees(params);\n\n let { gatingServiceSignature, signatureExpiration } = params;\n let preIntentHookData = params.preIntentHookData;\n const baseApiUrl = this.config.getBaseApiUrl();\n const apiKey = this.config.getApiKey();\n const authorizationToken = this.config.getAuthorizationToken();\n if (\n (!gatingServiceSignature || !signatureExpiration) &&\n baseApiUrl &&\n (apiKey || authorizationToken)\n ) {\n const baseRequest = {\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.config.getChainId().toString(),\n orchestratorAddress: orchestratorContext.address,\n escrowAddress: escrowContext.address,\n };\n const apiOpts = {\n baseApiUrl,\n apiKey,\n authorizationToken,\n timeoutMs: this.config.getApiTimeoutMs(),\n };\n\n const response = useV2Encoding\n ? await apiSignIntentV3(\n {\n ...baseRequest,\n callerAddress: this.config.getWalletClient().account!.address,\n referralFees: referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: referralFee.fee.toString(),\n })),\n },\n apiOpts,\n )\n : await apiSignIntentV2(baseRequest, apiOpts);\n\n gatingServiceSignature = response.signature;\n signatureExpiration = response.signatureExpiration;\n preIntentHookData = response.preIntentHookData ?? preIntentHookData;\n }\n\n if (!gatingServiceSignature || !signatureExpiration) {\n throw new Error('Missing gatingServiceSignature/signatureExpiration');\n }\n\n const commonFields = {\n escrow: escrowContext.address,\n depositId,\n amount,\n to: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate,\n gatingServiceSignature,\n signatureExpiration:\n typeof signatureExpiration === 'bigint' ? signatureExpiration : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n };\n\n const args = useV2Encoding\n ? [\n {\n ...commonFields,\n referralFees,\n preIntentHookData: (preIntentHookData ?? '0x') as `0x${string}`,\n },\n ]\n : [\n {\n ...commonFields,\n referrer: (referralFees[0]?.recipient ?? ZERO_ADDRESS) as Address,\n referrerFee: referralFees[0]?.fee ?? 0n,\n },\n ];\n\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'signalIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'signalIntent',\n args,\n };\n }\n\n async prepareCancelIntent(params: CancelIntentParams): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash: params.intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n const args = [params.intentHash];\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'cancelIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'cancelIntent',\n args,\n };\n }\n\n async prepareReleaseFundsToPayer(\n params: ReleaseFundsParams,\n ): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash: params.intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const args = [params.intentHash];\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'releaseFundsToPayer',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'releaseFundsToPayer',\n args,\n };\n }\n\n async prepareSetDepositPreIntentHook(params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n params.escrowAddress,\n params.depositId,\n 'setDepositPreIntentHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['setDepositPreIntentHook'],\n args: [escrowAddress, parseRawDepositId(params.depositId), params.preIntentHook],\n txOverrides: params.txOverrides,\n });\n }\n\n async prepareSetDepositWhitelistHook(params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n params.escrowAddress,\n params.depositId,\n 'setDepositWhitelistHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['setDepositWhitelistHook'],\n args: [escrowAddress, parseRawDepositId(params.depositId), params.whitelistHook],\n txOverrides: params.txOverrides,\n });\n }\n\n async prepareCleanupOrphanedIntents(params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n\n return this.config.host.prepareResolvedOrchestratorTransaction({\n orchestrator: orchestratorContext,\n functionNames: ['cleanupOrphanedIntents'],\n args: [params.intentHashes],\n txOverrides: params.txOverrides,\n });\n }\n\n async getDepositPreIntentHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n options?.escrowAddress,\n depositId,\n 'getDepositPreIntentHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const functionName = resolveAbiFunctionName(orchestratorContext.abi, [\n 'getDepositPreIntentHook',\n ]);\n return (await this.config.getPublicClient().readContract({\n address: orchestratorContext.address,\n abi: orchestratorContext.abi,\n functionName,\n args: [escrowAddress, parseRawDepositId(depositId)],\n })) as Address;\n }\n\n async getDepositWhitelistHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n const escrowAddress = this.config.host.resolveEscrowAddressOrThrow(\n options?.escrowAddress,\n depositId,\n 'getDepositWhitelistHook',\n { preferV2: this.config.getDefaultPreferV2() },\n );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const functionName = resolveAbiFunctionName(orchestratorContext.abi, [\n 'getDepositWhitelistHook',\n ]);\n return (await this.config.getPublicClient().readContract({\n address: orchestratorContext.address,\n abi: orchestratorContext.abi,\n functionName,\n args: [escrowAddress, parseRawDepositId(depositId)],\n })) as Address;\n }\n\n async prepareFulfillIntent(params: FulfillIntentParams): Promise<PreparedTransactionWithAbi> {\n const intentHash = params.intentHash;\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n intentHash,\n preferV2: this.config.getDefaultPreferV2(),\n });\n const precomputed = params.precomputedAttestation;\n let paymentProof: Address;\n let verificationData: Address;\n\n if (precomputed) {\n if (!precomputed.paymentProof || !precomputed.verificationData) {\n throw new Error('Precomputed attestation requires both proof and verification data');\n }\n\n paymentProof = precomputed.paymentProof;\n verificationData = precomputed.verificationData;\n } else {\n const attestationServiceUrl =\n params.attestationServiceUrl ?? this.defaultAttestationService();\n const inputs = await this.config.host.getFulfillIntentInputs(intentHash);\n const paymentMethodHash = inputs.paymentMethodHash || '0x';\n\n const catalog = getPaymentMethodsCatalog(\n this.config.getChainId(),\n this.config.getRuntimeEnv(),\n );\n const platformName = resolvePaymentMethodNameFromHash(paymentMethodHash, catalog);\n if (!platformName) {\n throw new Error('Unknown paymentMethodHash for this network/env; update SDK catalogs.');\n }\n const platformConfig = resolvePlatformAttestationConfig(platformName);\n\n const zkTlsProof =\n typeof params.proof === 'string' ? params.proof : serializeProofInput(params.proof);\n const payload = {\n proofType: 'reclaim',\n proof: zkTlsProof,\n chainId: this.config.getChainId(),\n intent: {\n intentHash,\n amount: inputs.amount,\n timestampMs: inputs.intentTimestampMs,\n paymentMethod: paymentMethodHash,\n fiatCurrency: inputs.fiatCurrency,\n conversionRate: inputs.conversionRate,\n payeeDetails: inputs.payeeDetails,\n timestampBufferMs: params.timestampBufferMs ?? '300000',\n },\n } as Record<string, unknown>;\n\n const attestation = await apiCreatePaymentAttestation(\n payload,\n attestationServiceUrl,\n platformConfig.actionPlatform,\n platformConfig.actionType,\n );\n paymentProof = encodePaymentAttestation(attestation);\n verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(attestation.responseObject.signer),\n });\n }\n\n const args = [\n {\n paymentProof,\n intentHash,\n verificationData,\n postIntentHookData: (params.postIntentHookData ?? '0x') as `0x${string}`,\n },\n ];\n\n const { referrer } = params.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorContext.abi,\n functionName: 'fulfillIntent',\n args,\n },\n referrer,\n );\n\n return {\n to: orchestratorContext.address,\n data,\n value: 0n,\n chainId: this.config.getChainId(),\n abi: orchestratorContext.abi,\n functionName: 'fulfillIntent',\n args,\n };\n }\n\n defaultAttestationService(): string {\n return this.config.getRuntimeEnv() === 'staging'\n ? 'https://attestation-service-staging.zkp2p.xyz'\n : 'https://attestation-service.zkp2p.xyz';\n }\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;\n paymentMethodHash: `0x${string}`;\n paymentVerifier?: `0x${string}`;\n }> {\n try {\n if (this.config.getProtocolViewerAddress() && this.config.getProtocolViewerAbi()) {\n const view = await this.config.host.getPvIntent(intentHash);\n const paymentMethodHash = (view.intent.paymentMethod as string).toLowerCase();\n const matched = (view.deposit.paymentMethods || []).find(\n (pm: PV_PaymentMethodData) =>\n (pm.paymentMethod as string)?.toLowerCase?.() === paymentMethodHash,\n );\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) * 1000n).toString(),\n paymentMethodHash: view.intent.paymentMethod as `0x${string}`,\n };\n }\n }\n } catch (error) {\n logger.debug('ProtocolViewer lookup failed, falling back to indexer', {\n intentHash,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const response = await this.config.getIndexerClient().query<{\n Intent?: Array<{\n amount: string;\n fiatCurrency: string;\n conversionRate: string;\n paymentMethodHash?: string | null;\n depositId: string;\n signalTimestamp?: string;\n verifier?: string | null;\n }>;\n }>({\n 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 verifier\n }\n }\n `,\n variables: { hash: intentHash.toLowerCase() },\n });\n const record = response?.Intent?.[0];\n if (!record) throw new Error('Intent not found on indexer');\n if (!record.signalTimestamp) throw new Error('Intent signal timestamp not found on indexer');\n const deposit = await this.config\n .getIndexerService()\n .fetchDepositWithRelations(record.depositId, {\n includeIntents: false,\n });\n let payee: string | undefined;\n const paymentMethodHashLower = (record.paymentMethodHash || '').toLowerCase();\n for (const paymentMethod of deposit?.paymentMethods || []) {\n if ((paymentMethod.paymentMethodHash || '').toLowerCase() === paymentMethodHashLower) {\n payee = paymentMethod.payeeDetailsHash;\n break;\n }\n }\n if (!payee) throw new Error('Payee details not found for intent');\n return {\n amount: record.amount,\n fiatCurrency: record.fiatCurrency as `0x${string}`,\n conversionRate: record.conversionRate,\n payeeDetails: payee as `0x${string}`,\n intentTimestampMs: (BigInt(record.signalTimestamp) * 1000n).toString(),\n paymentMethodHash: (record.paymentMethodHash ||\n '0x0000000000000000000000000000000000000000000000000000000000000000') as `0x${string}`,\n paymentVerifier: (record.verifier as `0x${string}`) || undefined,\n };\n }\n}\n\nfunction serializeProofInput(proof: Record<string, unknown>): string {\n return JSON.stringify(proof, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n );\n}\n\n/** @internal exported for testing */\nexport function normalizeSignalIntentReferralFees(\n params: Pick<SignalIntentParams, 'referralFees' | 'referrer' | 'referrerFee'>,\n): Array<{ recipient: Address; fee: bigint }> {\n if (params.referralFees) {\n return params.referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: typeof referralFee.fee === 'bigint' ? referralFee.fee : BigInt(referralFee.fee),\n }));\n }\n\n if (params.referrer && params.referrer.toLowerCase() !== ZERO_ADDRESS.toLowerCase()) {\n const fee =\n params.referrerFee === undefined\n ? 0n\n : typeof params.referrerFee === 'bigint'\n ? params.referrerFee\n : BigInt(params.referrerFee);\n return [{ recipient: params.referrer, fee }];\n }\n\n return [];\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 AuthorizationTokenProvider = () =>\n | string\n | null\n | undefined\n | Promise<string | null | undefined>;\n\nexport type Zkp2pClientOptions = {\n walletClient: WalletClient;\n /** Curator API key for authenticated endpoints (optional for basic deposit/payee flows) */\n apiKey?: string;\n chainId: number;\n /** Runtime environment (defaults to 'production') */\n runtimeEnv?: 'production' | 'preproduction' | 'staging';\n /**\n * @deprecated Use `runtimeEnv` instead. Kept for backward compatibility.\n */\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 async token provider for indexer auth in long-lived clients */\n getAuthorizationToken?: AuthorizationTokenProvider;\n /** Optional API key for indexer proxy authentication */\n indexerApiKey?: string;\n /** Optional indexer URL override */\n indexerUrl?: 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\nexport type ReferrerFeeConfig = {\n recipient: `0x${string}`;\n feeBps: number;\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 /** 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 /** Encoded pre-intent hook payload */\n preIntentHookData?: 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 referrerFeeConfig?: ReferrerFeeConfig;\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 = {\n currencyCode: string;\n currencyName: string;\n currencySymbol: string;\n countryCode: string;\n};\nexport type TokenResponse = {\n token: string;\n decimals: number;\n name: string;\n symbol: string;\n chainId: number;\n};\n/**\n * Intent details within a quote response\n */\nexport type QuoteIntentResponse = {\n /** Deposit ID */\n depositId: number;\n /** Escrow contract address */\n escrowAddress: string;\n /** Orchestrator address used for signaling this intent */\n orchestratorAddress?: 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 takerConversionRate?: string;\n intent: QuoteIntentResponse;\n payeeData?: Record<string, string>;\n};\n\nexport type GetQuoteSingleResponse = QuoteSingleResponse & {\n referrerFeeAmount?: string;\n referrerFeeAmountFormatted?: string;\n referrerFeeBps?: number;\n /** Gross token amount to use when calling signalIntent with the same fee config */\n signalIntentAmount?: string;\n signalIntentAmountFormatted?: string;\n};\nexport type QuoteFeesResponse = {\n zkp2pFee: string;\n zkp2pFeeFormatted: string;\n swapFee: string;\n swapFeeFormatted: string;\n};\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 GetNearbyQuote = Omit<NearbyQuote, 'quote'> & {\n quote: GetQuoteSingleResponse;\n};\n\nexport type GetNearbySuggestions = {\n below: GetNearbyQuote[];\n above: GetNearbyQuote[];\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 GetQuoteResponseObject = Omit<QuoteResponseObject, 'quotes' | 'nearbySuggestions'> & {\n quotes: GetQuoteSingleResponse[];\n nearbySuggestions?: GetNearbySuggestions;\n};\n\nexport type QuoteResponse = {\n message: string;\n success: boolean;\n responseObject: QuoteResponseObject;\n statusCode: number;\n};\n\nexport type GetQuoteResponse = Omit<QuoteResponse, 'responseObject'> & {\n responseObject: GetQuoteResponseObject;\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\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 = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: `0x${string}`;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n};\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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: DepositVerifierData[];\n currenciesOverride?: OnchainCurrency[][];\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// 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 escrowAddress: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: 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 escrowAddress: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: 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 escrowAddress?: string;\n escrowAddresses?: string[];\n orchestratorAddresses?: string[];\n};\n\nexport type GetIntentByHashResponse = {\n success: boolean;\n message: string;\n responseObject: Intent;\n statusCode: number;\n};\n\n// Deposit response types kept for compatibility with older adapter consumers.\nexport type DepositVerifierCurrency = {\n id?: number;\n depositVerifierId?: number;\n currencyCode: string;\n conversionRate: string;\n minConversionRate?: string;\n managerRate?: string | null;\n rateManagerId?: string | null;\n createdAt?: Date;\n updatedAt?: Date;\n};\nexport type DepositVerifier = {\n id?: number;\n depositId: number;\n verifier: string;\n methodHash?: string;\n intentGatingService: string;\n payeeDetailsHash: string;\n data: string;\n createdAt?: Date;\n updatedAt?: Date;\n currencies: DepositVerifierCurrency[];\n};\nexport type ApiDeposit = {\n id: number;\n depositor: string;\n token: string;\n rateManagerId?: string | null;\n rateManagerRegistry?: string | null;\n vaultName?: string | null;\n amount: string;\n remainingDeposits: string;\n intentAmountMin: string;\n intentAmountMax: string;\n acceptingIntents: boolean;\n outstandingIntentAmount: string;\n totalAmountTaken: string;\n totalWithdrawn: string;\n successRateBps?: number;\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 escrowAddress: string;\n escrowAddresses?: 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 = {\n depositId: string;\n escrowAddress: string;\n escrowAddresses?: string[];\n};\nexport type GetDepositByIdResponse = {\n success: boolean;\n message: string;\n responseObject: ApiDeposit;\n statusCode: number;\n};\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 = {\n depositIds: number[];\n escrowAddress: string;\n escrowAddresses?: string[];\n};\nexport type GetDepositsOrderStatsResponse = {\n success: boolean;\n message: string;\n responseObject: OrderStats[];\n statusCode: number;\n};\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 'chime',\n 'luxon',\n 'n26',\n] as const;\nexport type PaymentPlatformType = (typeof PAYMENT_PLATFORMS)[number];\n\n// On-chain views\nexport type { EscrowDepositView, EscrowIntentView } from './escrowViews';\n\n// Prepared transaction types\nexport type {\n PreparedTransaction,\n PreparedTransactionWithAbi,\n PrepareableMethod,\n} from './prepared';\n","import chainlinkFeeds from '@zkp2p/contracts-v2/oracleFeeds/chainlink.json';\nimport { encodeAbiParameters } from 'viem';\nimport type { Address, Hex } from 'viem';\n\nimport { Currency, type CurrencyType } from './currency';\n\n/** Minimal interface for the publicClient parameter, avoids viem version coupling. */\nexport interface MulticallClient {\n multicall(args: {\n contracts: ReadonlyArray<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n }>;\n allowFailure: true;\n }): Promise<ReadonlyArray<{ status: 'success' | 'failure'; result?: unknown; error?: unknown }>>;\n}\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\n\n/**\n * Chainlink adapter currently used by V2.2 oracle floor configs.\n */\nexport const CHAINLINK_ORACLE_ADAPTER = '0xfc81d1b5841e697973af3072fc8e03af76cb39ef' as const;\n\n/**\n * Deprecated: retained for SDK compatibility after contracts-v2 rc.12 removed\n * Pyth feed metadata from the package.\n */\nexport const PYTH_ORACLE_ADAPTER = '0xaa2bBDa3072bD37af76613846268Ec48bd0bB885' as const;\n\n/**\n * Default max staleness window for oracle-backed floors.\n */\nexport const DEFAULT_ORACLE_MAX_STALENESS_SECONDS = 86_400;\n\n/**\n * Deprecated: retained for SDK compatibility after contracts-v2 rc.12 removed\n * Pyth feed metadata from the package.\n */\nexport const PYTH_CONTRACT_BASE = '0xff1a0f4744e8582DF1aE09D5611b887B6a12925C' as const;\n\nconst CHAINLINK_LATEST_ROUND_ABI = [\n {\n name: 'latestRoundData',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n },\n] as const;\n\nexport type OracleKind = 'oracle_chainlink' | 'oracle_pyth';\n\nexport type SpreadOracleFeedConfig = {\n feed: Address;\n decimals: number;\n invert: boolean;\n};\n\nexport type PythFeedConfig = {\n feedId: Hex;\n decimals: number;\n invert: boolean;\n};\n\n/**\n * Identifier surfaced to UIs/SDK consumers for the configured oracle feed.\n * - Chainlink feeds are 20-byte contract addresses.\n * - Pyth feeds are 32-byte feed IDs.\n */\nexport type SpreadOracleFeedIdentifier = Address | Hex;\n\nexport type SpreadOracleConfig = {\n feed: SpreadOracleFeedIdentifier;\n decimals: number;\n invert: boolean;\n adapter: Address;\n adapterConfig: Hex;\n maxStaleness: number;\n kind?: OracleKind;\n};\n\nfunction parseUsdPair(pair: string): { currency: CurrencyType; invert: boolean } | null {\n const [base, quote] = pair.split('/');\n if (!base || !quote) return null;\n\n if (quote === 'USD' && Object.prototype.hasOwnProperty.call(Currency, base)) {\n return { currency: base as CurrencyType, invert: true };\n }\n\n if (base === 'USD' && Object.prototype.hasOwnProperty.call(Currency, quote)) {\n return { currency: quote as CurrencyType, invert: false };\n }\n\n return null;\n}\n\nfunction buildChainlinkOracleFeeds(): Partial<Record<CurrencyType, SpreadOracleFeedConfig>> {\n const map: Partial<Record<CurrencyType, SpreadOracleFeedConfig>> = {};\n\n for (const feed of chainlinkFeeds.feeds) {\n const parsed = parseUsdPair(feed.pair);\n if (!parsed) continue;\n\n map[parsed.currency] = {\n feed: feed.feed.toLowerCase() as Address,\n decimals: feed.decimals,\n invert: parsed.invert,\n };\n }\n\n return map;\n}\n\n/**\n * Currency -> Chainlink feed mapping used for spread/floor configuration.\n * Sourced from @zkp2p/contracts-v2/oracleFeeds/chainlink.json.\n */\nexport const CHAINLINK_ORACLE_FEEDS: Partial<Record<CurrencyType, SpreadOracleFeedConfig>> = {\n ...buildChainlinkOracleFeeds(),\n [Currency.USD]: {\n feed: ZERO_ADDRESS,\n decimals: 0,\n invert: false,\n },\n};\n\n/** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\nexport const SPREAD_ORACLE_FEEDS = CHAINLINK_ORACLE_FEEDS;\n\n/**\n * Deprecated: contracts-v2 rc.12 no longer ships Pyth feed metadata, so this\n * now remains empty and currencies without Chainlink feeds fall back to\n * fixed-rate behavior.\n */\nexport const PYTH_ORACLE_FEEDS: Partial<Record<CurrencyType, PythFeedConfig>> = {};\n\nexport function encodeSpreadOracleAdapterConfig(config: SpreadOracleFeedConfig): Hex {\n return encodeAbiParameters(\n [\n { name: 'feed', type: 'address' },\n { name: 'invert', type: 'bool' },\n ],\n [config.feed, config.invert],\n );\n}\n\n/**\n * Deprecated: retained for SDK consumers that still build custom Pyth configs.\n */\nexport function encodePythAdapterConfig(config: PythFeedConfig): Hex {\n return encodeAbiParameters(\n [\n { name: 'feedId', type: 'bytes32' },\n { name: 'invert', type: 'bool' },\n ],\n [config.feedId, config.invert],\n );\n}\n\nexport interface OracleAdapterOverrides {\n chainlinkOracleAdapter?: Address;\n pythOracleAdapter?: Address;\n}\n\nexport function getSpreadOracleConfig(\n currency: CurrencyType,\n adapters?: OracleAdapterOverrides,\n): SpreadOracleConfig | null {\n const chainlinkAdapter = adapters?.chainlinkOracleAdapter ?? CHAINLINK_ORACLE_ADAPTER;\n const chainlinkFeed = CHAINLINK_ORACLE_FEEDS[currency];\n\n if (!chainlinkFeed) {\n return null;\n }\n\n return {\n ...chainlinkFeed,\n adapter: chainlinkAdapter,\n adapterConfig: encodeSpreadOracleAdapterConfig(chainlinkFeed),\n maxStaleness: DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n kind: 'oracle_chainlink',\n };\n}\n\n/**\n * Validates which oracle feeds are actually live on-chain.\n *\n * - Chainlink: calls `latestRoundData()` on each feed contract.\n * - USD passthrough (zero-address Chainlink) is always included.\n *\n * Returns the set of CurrencyType values with working on-chain feeds.\n * Currencies that `getSpreadOracleConfig` would resolve are only\n * considered available if they pass this check.\n */\nexport async function validateOracleFeedsOnChain(\n publicClient: MulticallClient,\n _pythContract?: Address,\n): Promise<Set<CurrencyType>> {\n const currencies: CurrencyType[] = [];\n const contracts: Array<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n }> = [];\n\n // Chainlink feeds (skip USD passthrough — always valid)\n for (const [currency, config] of Object.entries(CHAINLINK_ORACLE_FEEDS) as [\n CurrencyType,\n SpreadOracleFeedConfig,\n ][]) {\n if (config.feed === ZERO_ADDRESS) continue;\n currencies.push(currency);\n contracts.push({\n address: config.feed,\n abi: CHAINLINK_LATEST_ROUND_ABI,\n functionName: 'latestRoundData',\n args: [],\n });\n }\n\n if (contracts.length === 0) return new Set([Currency.USD as CurrencyType]);\n\n const results = await publicClient.multicall({\n contracts,\n allowFailure: true,\n });\n\n const available = new Set<CurrencyType>([Currency.USD as CurrencyType]);\n for (let i = 0; i < currencies.length; i++) {\n if (results[i].status === 'success') {\n available.add(currencies[i]);\n }\n }\n\n return available;\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';\nexport {\n CHAINLINK_ORACLE_ADAPTER,\n PYTH_ORACLE_ADAPTER,\n PYTH_CONTRACT_BASE,\n DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n CHAINLINK_ORACLE_FEEDS,\n /** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\n SPREAD_ORACLE_FEEDS,\n PYTH_ORACLE_FEEDS,\n encodeSpreadOracleAdapterConfig,\n encodePythAdapterConfig,\n getSpreadOracleConfig,\n validateOracleFeedsOnChain,\n} from './utils/oracles';\nexport type {\n SpreadOracleFeedConfig,\n SpreadOracleConfig,\n OracleKind,\n PythFeedConfig,\n OracleAdapterOverrides,\n MulticallClient,\n} from './utils/oracles';\n\n/**\n * Supported blockchain chain IDs.\n *\n * @example\n * ```typescript\n * import { SUPPORTED_CHAIN_IDS } from '@zkp2p/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 /** 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 chime: {\n name: 'Chime',\n displayName: 'Chime',\n logo: '🏦',\n requiredProofs: 1,\n },\n luxon: {\n name: 'Luxon',\n displayName: 'Luxon',\n logo: '✨',\n requiredProofs: 1,\n },\n n26: {\n name: 'N26',\n displayName: 'N26',\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<\n string,\n { actionType: string; actionPlatform: string }\n> = {\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 chime: { actionType: 'transfer_chime', actionPlatform: 'chime' },\n luxon: { actionType: 'transfer_luxon', actionPlatform: 'luxon' },\n n26: { actionType: 'transfer_n26', actionPlatform: 'n26' },\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): {\n actionType: string;\n actionPlatform: string;\n} {\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","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};","import type { Address, PublicClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext } from './ContractRouter';\nimport {\n ZERO_ADDRESS,\n getAbiFunction,\n normalizeAddress,\n parseEscrowAddressFromCompositeDepositId,\n parseRawDepositId,\n} from './clientUtils';\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport { IndexerDepositService, type DepositFilter } from '../indexer/service';\nimport type { DepositWithRelations } from '../indexer/types';\nimport { parseBigIntLike } from '../utils/bigint';\n\n/**\n * Iterates over contexts, attempting an async operation on each.\n * Returns the first non-undefined result. Tracks success/failure state\n * and throws the last error if no reads succeeded.\n */\nasync function tryContexts<TContext, TResult>(\n contexts: TContext[],\n attempt: (context: TContext) => Promise<TResult | undefined>,\n notFoundMessage: string,\n): Promise<TResult> {\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n for (const context of contexts) {\n attemptedRead = true;\n try {\n const result = await attempt(context);\n hadSuccessfulRead = true;\n if (result !== undefined) {\n return result;\n }\n } catch (readError) {\n lastError = readError;\n }\n }\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n throw new Error(notFoundMessage);\n}\n\n/**\n * Iterates over contexts, attempting an async operation on each and collecting\n * all non-undefined results. Throws the last error only if no reads succeeded.\n */\nasync function collectFromContexts<TContext, TResult>(\n contexts: TContext[],\n attempt: (context: TContext) => Promise<TResult[]>,\n): Promise<{\n results: TResult[];\n attemptedRead: boolean;\n hadSuccessfulRead: boolean;\n lastError: unknown;\n}> {\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n const results: TResult[] = [];\n for (const context of contexts) {\n attemptedRead = true;\n try {\n const items = await attempt(context);\n hadSuccessfulRead = true;\n results.push(...items);\n } catch (readError) {\n lastError = readError;\n }\n }\n return { results, attemptedRead, hadSuccessfulRead, lastError };\n}\n\ntype ProtocolViewerContext = {\n escrow: Address;\n orchestrator: Address;\n};\n\ntype ProtocolViewerContract = {\n address: Address;\n abi: Abi;\n};\n\ninterface ProtocolViewerReaderHost {\n requireProtocolViewer: () => ProtocolViewerContract;\n protocolViewerFunctionInputCount: (functionName: string) => number | null;\n buildProtocolViewerContexts: (options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }) => ProtocolViewerContext[];\n isProtocolViewerDepositPopulated: (view: PV_DepositView) => boolean;\n isProtocolViewerIntentPopulated: (view: PV_IntentView) => boolean;\n buildDepositViewFromEscrowDeposit: (rawDeposit: unknown, depositId: bigint) => PV_DepositView;\n getPvAccountDepositsFromIndexer: (owner: Address) => Promise<PV_DepositView[]>;\n getPvDepositById: (\n depositId: string | bigint,\n options?: { strictEscrow?: boolean },\n ) => Promise<PV_DepositView>;\n getEscrowContexts: () => EscrowContractContext[];\n lookupIntentRouting: (intentHash: `0x${string}`) => Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }>;\n}\n\nexport interface ProtocolViewerReaderConfig {\n getPublicClient: () => PublicClient;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getProtocolViewerEntries: () => Array<{ address: Address; abi: Abi }>;\n getEscrowAddresses: () => Address[];\n getIndexerService: () => IndexerDepositService;\n getRouterBuildProtocolViewerContexts: () => (options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }) => ProtocolViewerContext[];\n host: ProtocolViewerReaderHost;\n}\n\nexport class ProtocolViewerReader {\n constructor(private readonly config: ProtocolViewerReaderConfig) {}\n\n requireProtocolViewer(): ProtocolViewerContract {\n const address = this.config.getProtocolViewerAddress();\n const abi = this.config.getProtocolViewerAbi();\n if (!address || !abi) {\n throw new Error('ProtocolViewer not available for this network');\n }\n return { address, abi };\n }\n\n protocolViewerFunctionInputCount(functionName: string): number | null {\n const fn = getAbiFunction(this.config.getProtocolViewerAbi(), functionName);\n if (!fn) return null;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.length;\n }\n\n pvEntryFunctionInputCount(entry: { abi: Abi }, functionName: string): number | null {\n const fn = getAbiFunction(entry.abi, functionName);\n if (!fn) return null;\n const inputs = (fn.inputs as Array<Record<string, unknown>> | undefined) ?? [];\n return inputs.length;\n }\n\n isZeroAddressValue(value?: string | null): boolean {\n return !value || value.toLowerCase() === ZERO_ADDRESS.toLowerCase();\n }\n\n toBigIntOrZero(value: unknown, fieldName = 'numeric field'): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return parseBigIntLike(value as bigint | number | string);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid ${fieldName}: ${detail}`);\n }\n }\n\n buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): ProtocolViewerContext[] {\n return this.config.getRouterBuildProtocolViewerContexts()(options);\n }\n\n isProtocolViewerDepositPopulated(view: PV_DepositView): boolean {\n return !this.isZeroAddressValue(view.deposit?.depositor);\n }\n\n isProtocolViewerIntentPopulated(view: PV_IntentView): boolean {\n return !this.isZeroAddressValue(view.intent?.owner);\n }\n\n buildDepositViewFromEscrowDeposit(rawDeposit: unknown, depositId: bigint): PV_DepositView {\n const deposit = (rawDeposit as Record<string, unknown> | null | undefined) ?? {};\n const remaining = this.toBigIntOrZero(\n deposit.remainingDeposits ?? deposit.remainingDepositAmount,\n 'deposit remaining amount',\n );\n const outstanding = this.toBigIntOrZero(\n deposit.outstandingIntentAmount,\n 'deposit outstanding intent amount',\n );\n const amount = this.toBigIntOrZero(deposit.amount, 'deposit amount') || remaining + outstanding;\n\n return {\n depositId,\n deposit: {\n depositor: (normalizeAddress(deposit.depositor as string | undefined) ??\n ZERO_ADDRESS) as Address,\n delegate: (normalizeAddress(deposit.delegate as string | undefined) ??\n ZERO_ADDRESS) as Address,\n token: (normalizeAddress(deposit.token as string | undefined) ?? ZERO_ADDRESS) as Address,\n amount,\n intentAmountRange: {\n min: this.toBigIntOrZero(\n (deposit.intentAmountRange as Record<string, unknown> | undefined)?.min,\n 'minimum intent amount',\n ),\n max: this.toBigIntOrZero(\n (deposit.intentAmountRange as Record<string, unknown> | undefined)?.max,\n 'maximum intent amount',\n ),\n },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDeposits: remaining,\n outstandingIntentAmount: outstanding,\n makerProtocolFee: this.toBigIntOrZero(deposit.makerProtocolFee, 'maker protocol fee'),\n reservedMakerFees: this.toBigIntOrZero(\n deposit.reservedMakerFees,\n 'reserved maker fee amount',\n ),\n accruedMakerFees: this.toBigIntOrZero(deposit.accruedMakerFees, 'accrued maker fee amount'),\n accruedReferrerFees: this.toBigIntOrZero(\n deposit.accruedReferrerFees,\n 'accrued referrer fee amount',\n ),\n intentGuardian: (normalizeAddress(deposit.intentGuardian as string | undefined) ??\n ZERO_ADDRESS) as Address,\n retainOnEmpty: Boolean(deposit.retainOnEmpty),\n referrer: (normalizeAddress(deposit.referrer as string | undefined) ??\n ZERO_ADDRESS) as Address,\n referrerFee: this.toBigIntOrZero(deposit.referrerFee, 'referrer fee'),\n },\n availableLiquidity: remaining,\n paymentMethods: [],\n intentHashes: [],\n };\n }\n\n convertIndexerDepositToPvView(deposit: DepositWithRelations): PV_DepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(\n (paymentMethod) => (paymentMethod as any).active !== false,\n );\n const currenciesByPaymentMethod = new Map<\n string,\n NonNullable<DepositWithRelations['currencies']>\n >();\n for (const currency of deposit.currencies ?? []) {\n const key = currency.paymentMethodHash.toLowerCase();\n const existing = currenciesByPaymentMethod.get(key) ?? [];\n existing.push(currency);\n currenciesByPaymentMethod.set(key, existing);\n }\n\n const remaining = this.toBigIntOrZero(deposit.remainingDeposits, 'remaining deposits');\n const outstanding = this.toBigIntOrZero(\n deposit.outstandingIntentAmount,\n 'outstanding intent amount',\n );\n const totalAmountTaken = this.toBigIntOrZero(deposit.totalAmountTaken, 'total amount taken');\n const totalWithdrawn = this.toBigIntOrZero(deposit.totalWithdrawn, 'total withdrawn amount');\n const depositAmount = remaining + outstanding + totalAmountTaken + totalWithdrawn;\n\n return {\n depositId: this.toBigIntOrZero(deposit.depositId, 'deposit id'),\n deposit: {\n depositor: (normalizeAddress(deposit.depositor) ?? ZERO_ADDRESS) as Address,\n delegate: (normalizeAddress(deposit.delegate ?? undefined) ?? ZERO_ADDRESS) as Address,\n token: (normalizeAddress(deposit.token) ?? ZERO_ADDRESS) as Address,\n amount: depositAmount,\n intentAmountRange: {\n min: this.toBigIntOrZero(deposit.intentAmountMin, 'minimum intent amount'),\n max: this.toBigIntOrZero(deposit.intentAmountMax, 'maximum intent amount'),\n },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDeposits: remaining,\n outstandingIntentAmount: outstanding,\n makerProtocolFee: 0n,\n reservedMakerFees: 0n,\n accruedMakerFees: 0n,\n accruedReferrerFees: 0n,\n intentGuardian: ZERO_ADDRESS,\n retainOnEmpty: Boolean(deposit.retainOnEmpty ?? false),\n referrer: ZERO_ADDRESS,\n referrerFee: 0n,\n },\n availableLiquidity: remaining,\n paymentMethods: paymentMethods.map((method) => ({\n paymentMethod: method.paymentMethodHash as `0x${string}`,\n verificationData: {\n intentGatingService: (normalizeAddress(method.intentGatingService) ??\n ZERO_ADDRESS) as Address,\n payeeDetails: (method.payeeDetailsHash || '0x') as `0x${string}`,\n data: '0x' as `0x${string}`,\n },\n currencies: (\n currenciesByPaymentMethod.get(method.paymentMethodHash.toLowerCase()) ?? []\n ).map((currency) => ({\n code: currency.currencyCode as `0x${string}`,\n minConversionRate: this.toBigIntOrZero(\n currency.conversionRate ?? currency.minConversionRate,\n 'conversion rate',\n ),\n })),\n })),\n intentHashes: Array.from(new Set((deposit.intents ?? []).map((intent) => intent.intentHash))),\n };\n }\n\n async getPvAccountDepositsFromIndexer(owner: Address): Promise<PV_DepositView[]> {\n const filter: DepositFilter = { depositor: owner, status: 'ACTIVE' };\n const escrowAddresses = this.config.getEscrowAddresses();\n if (escrowAddresses.length > 0) {\n filter.escrowAddresses = escrowAddresses.map((escrow) => escrow as string);\n }\n\n const deposits = await this.config\n .getIndexerService()\n .fetchDepositsWithRelations(\n filter,\n { limit: 1000, orderBy: 'timestamp', orderDirection: 'desc' },\n { includeIntents: true },\n );\n return deposits.map((deposit) => this.convertIndexerDepositToPvView(deposit));\n }\n\n async getPvDepositById(\n depositId: string | bigint,\n options?: { strictEscrow?: boolean },\n ): Promise<PV_DepositView> {\n const id = typeof depositId === 'bigint' ? depositId : parseRawDepositId(depositId);\n const hintedEscrow =\n typeof depositId === 'string'\n ? parseEscrowAddressFromCompositeDepositId(depositId)\n : undefined;\n const strictEscrow = Boolean(options?.strictEscrow && hintedEscrow);\n const protocolViewerContexts =\n strictEscrow && hintedEscrow\n ? this.config.host\n .buildProtocolViewerContexts({ escrowAddress: hintedEscrow })\n .filter((context) => context.escrow.toLowerCase() === hintedEscrow.toLowerCase())\n : this.config.host.buildProtocolViewerContexts({ escrowAddress: hintedEscrow });\n\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (protocolViewerAddress && protocolViewerAbi) {\n const { address, abi } = this.config.host.requireProtocolViewer();\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getDeposit');\n if (inputCount === null) {\n throw new Error('Configured ProtocolViewer ABI does not expose getDeposit');\n }\n\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n if (inputCount >= 3) {\n return tryContexts(\n protocolViewerContexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [context.escrow, context.orchestrator, id],\n });\n const parsed = parseDepositView(raw);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Deposit not found in configured ProtocolViewer contexts',\n );\n }\n\n if (inputCount >= 2) {\n return tryContexts(\n protocolViewerContexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [context.escrow, id],\n });\n const parsed = parseDepositView(raw);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Deposit not found in configured ProtocolViewer escrows',\n );\n }\n\n if (!strictEscrow) {\n const raw = await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getDeposit',\n args: [id],\n });\n const parsed = parseDepositView(raw);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n return parsed;\n }\n throw new Error('Deposit not found');\n }\n }\n\n const contexts =\n strictEscrow && hintedEscrow\n ? this.config.host\n .getEscrowContexts()\n .filter((context) => context.address.toLowerCase() === hintedEscrow.toLowerCase())\n : this.config.host.getEscrowContexts();\n if (!strictEscrow && hintedEscrow) {\n contexts.sort((left, right) => {\n const leftMatch = left.address.toLowerCase() === hintedEscrow.toLowerCase() ? 1 : 0;\n const rightMatch = right.address.toLowerCase() === hintedEscrow.toLowerCase() ? 1 : 0;\n return rightMatch - leftMatch;\n });\n }\n return tryContexts(\n contexts,\n async (context) => {\n const raw = await this.config.getPublicClient().readContract({\n address: context.address,\n abi: context.abi,\n functionName: 'getDeposit',\n args: [id],\n });\n const parsed = this.config.host.buildDepositViewFromEscrowDeposit(raw, id);\n return this.config.host.isProtocolViewerDepositPopulated(parsed) ? parsed : undefined;\n },\n 'Failed to fetch deposit from configured escrows',\n );\n }\n\n async getPvDepositsFromIds(ids: Array<string | bigint>): Promise<PV_DepositView[]> {\n if (!ids.length) return [];\n\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getDepositFromIds');\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (!protocolViewerAddress || !protocolViewerAbi || inputCount === null || inputCount >= 3) {\n return Promise.all(ids.map((id) => this.config.host.getPvDepositById(id)));\n }\n\n const bn = ids.map((id) => (typeof id === 'bigint' ? id : parseRawDepositId(id)));\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n if (inputCount >= 2) {\n type DepositBatchRequest = {\n index: number;\n id: string | bigint;\n rawId: bigint;\n hintedEscrow?: Address;\n };\n\n const requests: DepositBatchRequest[] = ids.map((id, index) => ({\n index,\n id,\n rawId: bn[index]!,\n hintedEscrow:\n typeof id === 'string' ? parseEscrowAddressFromCompositeDepositId(id) : undefined,\n }));\n const resolved: Array<PV_DepositView | undefined> = new Array(requests.length);\n let attemptedBatchRead = false;\n let hadSuccessfulBatchRead = false;\n let lastBatchError: unknown;\n\n const resolveBatch = async (escrow: Address, entries: DepositBatchRequest[]) => {\n if (!entries.length) return;\n attemptedBatchRead = true;\n try {\n const raw = (await this.config.getPublicClient().readContract({\n address: protocolViewerAddress,\n abi: protocolViewerAbi,\n functionName: 'getDepositFromIds',\n args: [escrow, entries.map((entry) => entry.rawId)],\n })) as any[];\n hadSuccessfulBatchRead = true;\n const items = Array.isArray(raw) ? raw : [];\n\n if (items.length === entries.length) {\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index];\n if (!entry || resolved[entry.index]) continue;\n const parsed = parseDepositView(items[index]);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n resolved[entry.index] = parsed;\n }\n }\n return;\n }\n\n for (const item of items) {\n const parsed = parseDepositView(item);\n if (!this.config.host.isProtocolViewerDepositPopulated(parsed)) continue;\n const match = entries.find(\n (entry) => !resolved[entry.index] && entry.rawId === parsed.depositId,\n );\n if (match) {\n resolved[match.index] = parsed;\n }\n }\n } catch (batchError) {\n lastBatchError = batchError;\n }\n };\n\n const hintedGroups = new Map<string, { escrow: Address; entries: DepositBatchRequest[] }>();\n for (const request of requests) {\n if (!request.hintedEscrow) continue;\n const key = request.hintedEscrow.toLowerCase();\n const group = hintedGroups.get(key);\n if (group) {\n group.entries.push(request);\n } else {\n hintedGroups.set(key, { escrow: request.hintedEscrow, entries: [request] });\n }\n }\n\n for (const { escrow, entries } of hintedGroups.values()) {\n await resolveBatch(escrow, entries);\n }\n\n const escrows: Address[] = [];\n const seenEscrows = new Set<string>();\n for (const context of this.config.host.buildProtocolViewerContexts()) {\n const key = context.escrow.toLowerCase();\n if (seenEscrows.has(key)) continue;\n seenEscrows.add(key);\n escrows.push(context.escrow);\n }\n\n for (const escrow of escrows) {\n const pending = requests.filter(\n (entry) => !entry.hintedEscrow && resolved[entry.index] === undefined,\n );\n if (!pending.length) break;\n await resolveBatch(escrow, pending);\n }\n\n if (requests.every((entry) => resolved[entry.index] !== undefined)) {\n return resolved as PV_DepositView[];\n }\n\n if (!hadSuccessfulBatchRead && attemptedBatchRead && lastBatchError) {\n throw lastBatchError;\n }\n\n return Promise.all(\n requests.map(\n (entry) => resolved[entry.index] ?? this.config.host.getPvDepositById(entry.id),\n ),\n );\n }\n\n const raw = (await this.config.getPublicClient().readContract({\n address: protocolViewerAddress,\n abi: protocolViewerAbi,\n functionName: 'getDepositFromIds',\n args: [bn],\n })) as any[];\n return raw.map(parseDepositView);\n }\n\n async getPvAccountDeposits(owner: Address): Promise<PV_DepositView[]> {\n const inputCount = this.config.host.protocolViewerFunctionInputCount('getAccountDeposits');\n const protocolViewerAddress = this.config.getProtocolViewerAddress();\n const protocolViewerAbi = this.config.getProtocolViewerAbi();\n if (!protocolViewerAddress || !protocolViewerAbi || inputCount === null) {\n return this.config.host.getPvAccountDepositsFromIndexer(owner);\n }\n\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n const { address, abi } = this.config.host.requireProtocolViewer();\n\n if (inputCount >= 2) {\n const readAndFilter = async (raw: unknown[]): Promise<PV_DepositView[]> => {\n const filtered: PV_DepositView[] = [];\n for (const item of raw) {\n const parsed = parseDepositView(item);\n if (this.config.host.isProtocolViewerDepositPopulated(parsed)) {\n filtered.push(parsed);\n }\n }\n return filtered;\n };\n\n if (inputCount >= 3) {\n const { results, attemptedRead, hadSuccessfulRead, lastError } = await collectFromContexts(\n this.config.host.buildProtocolViewerContexts(),\n async (context) => {\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [context.escrow, context.orchestrator, owner],\n })) as unknown[];\n return readAndFilter(raw);\n },\n );\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n return results;\n }\n\n const seenEscrows = new Set<string>();\n const escrowAddresses = [\n ...this.config.host.buildProtocolViewerContexts().map((context) => context.escrow),\n ...this.config.host.getEscrowContexts().map((context) => context.address),\n ].filter((escrow) => {\n const key = escrow.toLowerCase();\n if (seenEscrows.has(key)) return false;\n seenEscrows.add(key);\n return true;\n });\n\n const { results, attemptedRead, hadSuccessfulRead, lastError } = await collectFromContexts(\n escrowAddresses,\n async (escrow) => {\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [escrow, owner],\n })) as unknown[];\n return readAndFilter(raw);\n },\n );\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n return results;\n }\n\n const raw = (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAccountDeposits',\n args: [owner],\n })) as any[];\n return raw\n .map(parseDepositView)\n .filter((view) => this.config.host.isProtocolViewerDepositPopulated(view));\n }\n\n async getPvAccountIntents(owner: Address): Promise<PV_IntentView[]> {\n const protocolViewerEntries = this.config.getProtocolViewerEntries();\n if (protocolViewerEntries.length === 0) {\n throw new Error('ProtocolViewer not available for this network');\n }\n\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n const intentsByHash = new Map<string, PV_IntentView>();\n let attemptedRead = false;\n let hadSuccessfulRead = false;\n let lastError: unknown;\n const runtimeProcess = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const protocolViewerDebugEnv = runtimeProcess?.env?.ZKP2P_DEBUG_PROTOCOL_VIEWER;\n const isDebugLoggingEnabled =\n protocolViewerDebugEnv === '1' ||\n protocolViewerDebugEnv === 'true' ||\n runtimeProcess?.env?.NODE_ENV === 'development';\n\n for (const pvEntry of protocolViewerEntries) {\n const inputCount = this.pvEntryFunctionInputCount(pvEntry, 'getAccountIntents');\n if (inputCount === null) continue;\n\n if (inputCount >= 2) {\n for (const context of this.config.host.buildProtocolViewerContexts()) {\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Zkp2pClient] getPvAccountIntents read context', {\n protocolViewerAddress: pvEntry.address,\n owner,\n escrow: context.escrow,\n orchestrator: context.orchestrator,\n inputCount,\n });\n }\n attemptedRead = true;\n try {\n const args =\n inputCount >= 3\n ? [context.escrow, context.orchestrator, owner]\n : [context.orchestrator, owner];\n const raw = (await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getAccountIntents',\n args,\n })) as any[];\n hadSuccessfulRead = true;\n for (const item of raw) {\n const parsed = parseIntentView(item);\n if (!this.config.host.isProtocolViewerIntentPopulated(parsed)) continue;\n intentsByHash.set(parsed.intentHash.toLowerCase(), parsed);\n }\n } catch (readError) {\n lastError = readError;\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.warn('[Zkp2pClient] getPvAccountIntents context read failed', {\n protocolViewerAddress: pvEntry.address,\n owner,\n escrow: context.escrow,\n orchestrator: context.orchestrator,\n inputCount,\n error: readError instanceof Error ? readError.message : String(readError),\n });\n }\n }\n }\n } else {\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Zkp2pClient] getPvAccountIntents read legacy context', {\n protocolViewerAddress: pvEntry.address,\n owner,\n inputCount,\n });\n }\n attemptedRead = true;\n try {\n const raw = (await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getAccountIntents',\n args: [owner],\n })) as any[];\n hadSuccessfulRead = true;\n for (const item of raw) {\n const parsed = parseIntentView(item);\n if (!this.config.host.isProtocolViewerIntentPopulated(parsed)) continue;\n if (!intentsByHash.has(parsed.intentHash.toLowerCase())) {\n intentsByHash.set(parsed.intentHash.toLowerCase(), parsed);\n }\n }\n } catch (readError) {\n lastError = readError;\n if (isDebugLoggingEnabled) {\n // eslint-disable-next-line no-console\n console.warn('[Zkp2pClient] getPvAccountIntents legacy read failed', {\n protocolViewerAddress: pvEntry.address,\n owner,\n inputCount,\n error: readError instanceof Error ? readError.message : String(readError),\n });\n }\n }\n }\n }\n\n if (!hadSuccessfulRead && attemptedRead && lastError) {\n throw lastError;\n }\n\n if (!attemptedRead && isDebugLoggingEnabled) {\n console.warn(\n '[Zkp2pClient] getPvAccountIntents did not execute any reads; verify ProtocolViewer ABI/configuration',\n );\n }\n\n return Array.from(intentsByHash.values()).sort((left, right) => {\n if (left.intent.timestamp === right.intent.timestamp) {\n return left.intentHash.localeCompare(right.intentHash);\n }\n return left.intent.timestamp < right.intent.timestamp ? -1 : 1;\n });\n }\n\n async getPvIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n const protocolViewerEntries = this.config.getProtocolViewerEntries();\n if (protocolViewerEntries.length === 0) {\n throw new Error('ProtocolViewer not available for this network');\n }\n\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n let lastError: unknown;\n\n for (const pvEntry of protocolViewerEntries) {\n const inputCount = this.pvEntryFunctionInputCount(pvEntry, 'getIntent');\n if (inputCount === null) continue;\n\n if (inputCount >= 2) {\n let routing: { orchestratorAddress?: Address; escrowAddress?: Address } = {};\n try {\n routing = await this.config.host.lookupIntentRouting(intentHash);\n } catch (routingError) {\n lastError = routingError;\n }\n for (const context of this.config.host.buildProtocolViewerContexts({\n escrowAddress: routing.escrowAddress,\n orchestratorAddress: routing.orchestratorAddress,\n })) {\n try {\n const args =\n inputCount >= 3\n ? [context.escrow, context.orchestrator, intentHash]\n : [context.orchestrator, intentHash];\n const raw = await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getIntent',\n args,\n });\n const parsed = parseIntentView(raw);\n if (this.config.host.isProtocolViewerIntentPopulated(parsed)) {\n return parsed;\n }\n lastError = new Error('Intent not found');\n } catch (readError) {\n lastError = readError;\n }\n }\n } else {\n try {\n const raw = await this.config.getPublicClient().readContract({\n address: pvEntry.address,\n abi: pvEntry.abi,\n functionName: 'getIntent',\n args: [intentHash],\n });\n const parsed = parseIntentView(raw);\n if (this.config.host.isProtocolViewerIntentPopulated(parsed)) {\n return parsed;\n }\n lastError = new Error('Intent not found');\n } catch (readError) {\n lastError = readError;\n }\n }\n }\n\n throw lastError ?? new Error('Intent not found');\n }\n}\n","import type { Address, PublicClient, Hex } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext } from './ContractRouter';\nimport {\n ZERO_ADDRESS,\n abiFunctionHasInput,\n abiTupleHasComponent,\n escrowCurrencyHasOracleConfig,\n normalizeOracleRateConfig,\n parseManagerFeeFromRead,\n parseRawDepositId,\n resolveAbiFunctionName,\n} from './clientUtils';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\n\ninterface VaultOperationsHost {\n resolveEscrowContext: (options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }) => EscrowContractContext;\n prepareEscrowTransaction: (opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n }) => PreparedTransactionWithAbi;\n prepareContractTransaction: (opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }) => PreparedTransactionWithAbi;\n}\n\nexport interface VaultOperationsConfig {\n getPublicClient: () => PublicClient;\n getRateManagerRegistryAddress: () => Address | undefined;\n getRateManagerRegistryAbi: () => Abi | undefined;\n getRateManagerControllerAddress: () => Address | undefined;\n getRateManagerControllerAbi: () => Abi | undefined;\n getRateManagerInitError: () => Error | undefined;\n host: VaultOperationsHost;\n}\n\nexport class VaultOperations {\n constructor(private readonly config: VaultOperationsConfig) {}\n\n supportsInlineOracleRateConfig(params?: {\n escrowAddress?: Address;\n preferV2?: boolean;\n }): boolean {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params?.escrowAddress,\n preferV2: params?.preferV2,\n });\n return escrowCurrencyHasOracleConfig(escrowContext.abi);\n }\n\n private resolveRateManagerRegistryContract(registryAddress?: Address): {\n address: Address;\n abi: Abi;\n } {\n const abi = this.config.getRateManagerRegistryAbi();\n if (!abi) {\n throw this.buildRateManagerUnavailableError('Rate manager registry not available');\n }\n if (registryAddress) {\n return {\n address: registryAddress,\n abi,\n };\n }\n const address = this.config.getRateManagerRegistryAddress();\n if (!address) {\n throw this.buildRateManagerUnavailableError('Rate manager registry not available');\n }\n return {\n address,\n abi,\n };\n }\n\n private buildRateManagerUnavailableError(reason: string): Error {\n const initError = this.config.getRateManagerInitError();\n if (!initError) {\n return new Error(reason);\n }\n return new Error(\n `${reason}. Rate manager contracts failed to initialize: ${initError.message}`,\n );\n }\n\n private buildCreateRateManagerConfig(config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n }): Record<string, unknown> {\n const registryAbi = this.config.getRateManagerRegistryAbi();\n const includeDepositHook = abiTupleHasComponent(\n registryAbi,\n 'createRateManager',\n 'depositHook',\n );\n const includeMinLiquidity = abiTupleHasComponent(\n registryAbi,\n 'createRateManager',\n 'minLiquidity',\n );\n const result: Record<string, unknown> = {\n manager: config.manager,\n feeRecipient: config.feeRecipient,\n maxFee: config.maxFee,\n fee: config.fee,\n };\n if (includeDepositHook) {\n result.depositHook = config.depositHook ?? ZERO_ADDRESS;\n }\n if (includeMinLiquidity) {\n result.minLiquidity = config.minLiquidity ?? 0n;\n }\n result.name = config.name;\n result.uri = config.uri;\n return result;\n }\n\n private buildSetRateManagerConfigArgs(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n }): readonly unknown[] {\n const registryAbi = this.config.getRateManagerRegistryAbi();\n const includeHook =\n abiFunctionHasInput(registryAbi, 'setRateManagerConfig', '_newHook') ||\n abiFunctionHasInput(registryAbi, 'setRateManagerConfig', 'newHook');\n\n if (includeHook) {\n return [\n params.rateManagerId,\n params.newManager,\n params.newFeeRecipient,\n params.newHook ?? ZERO_ADDRESS,\n params.newName,\n params.newUri,\n ];\n }\n\n return [\n params.rateManagerId,\n params.newManager,\n params.newFeeRecipient,\n params.newName,\n params.newUri,\n ];\n }\n\n private prepareRateManagerRegistryTransaction(opts: {\n functionNames: string[];\n args: readonly unknown[];\n registry?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const contract = this.resolveRateManagerRegistryContract(opts.registry);\n const functionName = resolveAbiFunctionName(contract.abi, opts.functionNames);\n return this.config.host.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: opts.args,\n txOverrides: opts.txOverrides,\n });\n }\n\n prepareCreateRateManagerTransaction(params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['createRateManager'],\n args: [this.buildCreateRateManagerConfig(params.config)],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetVaultRateTransaction(params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRate', 'setMinRate'],\n args: [params.rateManagerId, params.paymentMethodHash, params.currencyHash, params.rate],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetVaultRatesBatchTransaction(params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRateBatch', 'setMinRatesBatch'],\n args: [params.rateManagerId, params.paymentMethods, params.currencies, params.rates],\n txOverrides: params.txOverrides,\n });\n }\n\n prepareSetOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('setOracleRateConfig requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['setOracleRateConfig']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethodHash,\n params.currencyHash,\n normalizeOracleRateConfig(params.config),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareRemoveOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('removeOracleRateConfig requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['removeOracleRateConfig']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [parseRawDepositId(params.depositId), params.paymentMethodHash, params.currencyHash],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareSetOracleRateConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('setOracleRateConfigBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['setOracleRateConfigBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.currencies,\n params.configs.map((group) => group.map((config) => normalizeOracleRateConfig(config))),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareUpdateCurrencyConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('updateCurrencyConfigBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['updateCurrencyConfigBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [\n parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.updates.map((group) =>\n group.map((update) => ({\n code: update.code,\n minConversionRate:\n typeof update.minConversionRate === 'bigint'\n ? update.minConversionRate\n : BigInt(update.minConversionRate),\n updateOracle: update.updateOracle,\n oracleRateConfig: normalizeOracleRateConfig(update.oracleRateConfig),\n })),\n ),\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareDeactivateCurrenciesBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n preferV2: true,\n });\n if (escrowContext.version !== 'v2') {\n throw new Error('deactivateCurrenciesBatch requires EscrowV2');\n }\n const functionName = resolveAbiFunctionName(escrowContext.abi, ['deactivateCurrenciesBatch']);\n return this.config.host.prepareEscrowTransaction({\n functionName,\n args: [parseRawDepositId(params.depositId), params.paymentMethods, params.currencyCodes],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n }\n\n prepareSetVaultConfigTransaction(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.prepareRateManagerRegistryTransaction({\n functionNames: ['setRateManagerConfig'],\n args: this.buildSetRateManagerConfigArgs(params),\n txOverrides: params.txOverrides,\n });\n }\n\n async getDepositRateManager(\n escrow: Address,\n depositId: bigint | number | string,\n ): Promise<{ registry: Address; rateManagerId: Hex }> {\n const id = parseRawDepositId(depositId);\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: escrow,\n depositId,\n });\n\n if (getRateManagerReadFunction(escrowContext.abi, 'getDepositRateManager')) {\n const result = (await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getDepositRateManager',\n args: [id],\n })) as readonly [Address, Hex];\n if (result && result.length >= 2) {\n return {\n registry: result[0],\n rateManagerId: result[1],\n };\n }\n }\n\n const controllerAddress = this.config.getRateManagerControllerAddress();\n const controllerAbi = this.config.getRateManagerControllerAbi();\n if (!controllerAddress || !controllerAbi) {\n throw this.buildRateManagerUnavailableError('Rate manager controller not available');\n }\n const legacyResult = (await this.config.getPublicClient().readContract({\n address: controllerAddress,\n abi: controllerAbi,\n functionName: 'getDepositRateManager',\n args: [escrow, id],\n })) as readonly [Address, Hex];\n\n return {\n registry: legacyResult[0],\n rateManagerId: legacyResult[1],\n };\n }\n\n async getManagerFee(escrow: Address, depositId: bigint | number | string): Promise<bigint> {\n const id = parseRawDepositId(depositId);\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: escrow,\n depositId,\n });\n\n if (getRateManagerReadFunction(escrowContext.abi, 'getManagerFee')) {\n const result = await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getManagerFee',\n args: [id],\n });\n return parseManagerFeeFromRead(result);\n }\n\n const controllerAddress = this.config.getRateManagerControllerAddress();\n const controllerAbi = this.config.getRateManagerControllerAbi();\n if (!controllerAddress || !controllerAbi) {\n throw this.buildRateManagerUnavailableError('Rate manager controller not available');\n }\n const result = await this.config.getPublicClient().readContract({\n address: controllerAddress,\n abi: controllerAbi,\n functionName: 'getManagerFee',\n args: [escrow, id],\n });\n return parseManagerFeeFromRead(result);\n }\n\n async getEffectiveRate(params: {\n escrow: Address;\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n }): Promise<bigint> {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n });\n const id = parseRawDepositId(params.depositId);\n return (await this.config.getPublicClient().readContract({\n address: escrowContext.address,\n abi: escrowContext.abi,\n functionName: 'getEffectiveRate',\n args: [id, params.paymentMethod, params.fiatCurrency],\n })) as bigint;\n }\n}\n\nconst getRateManagerReadFunction = (abi: Abi | undefined, functionName: string): boolean =>\n Array.isArray(abi) &&\n (abi as unknown as Array<Record<string, unknown>>).some(\n (item) => item.type === 'function' && item.name === functionName,\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 type IndexerAuthTokenProvider = () =>\n | string\n | null\n | undefined\n | Promise<string | null | undefined>;\n\nexport type IndexerClientOptions = {\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n onAuthorizationTokenError?: (error: unknown) => void;\n apiKey?: string;\n};\n\nclass IndexerHttpError extends Error {\n status: number;\n retryAfterSeconds?: number;\n\n constructor(status: number, statusText: string, options?: { retryAfterSeconds?: number }) {\n super(`Indexer request failed: ${status} ${statusText}`);\n this.name = 'IndexerHttpError';\n this.status = status;\n this.retryAfterSeconds = options?.retryAfterSeconds;\n }\n}\n\nfunction parseRetryAfterSeconds(rawHeader: string | null): number | undefined {\n if (!rawHeader) return undefined;\n\n const parsedSeconds = Number(rawHeader);\n if (Number.isFinite(parsedSeconds) && parsedSeconds >= 0) {\n return Math.ceil(parsedSeconds);\n }\n\n const parsedDateMs = Date.parse(rawHeader);\n if (!Number.isFinite(parsedDateMs)) return undefined;\n\n const secondsUntilRetry = Math.ceil((parsedDateMs - Date.now()) / 1000);\n return Math.max(0, secondsUntilRetry);\n}\n\nfunction createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError());\n return;\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(createAbortError());\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n\nexport class IndexerClient {\n private hasLoggedTokenProviderError = false;\n\n constructor(\n private endpoint: string,\n private options: IndexerClientOptions = {},\n ) {}\n\n private async resolveAuthorizationToken(): Promise<string | undefined> {\n if (this.options.getAuthorizationToken) {\n try {\n const token = await this.options.getAuthorizationToken();\n return token ?? undefined;\n } catch (error) {\n if (this.options.onAuthorizationTokenError) {\n this.options.onAuthorizationTokenError(error);\n } else if (!this.hasLoggedTokenProviderError) {\n this.hasLoggedTokenProviderError = true;\n console.warn(\n '[IndexerClient] getAuthorizationToken failed; continuing without Authorization header',\n error,\n );\n }\n return undefined;\n }\n }\n return this.options.authorizationToken;\n }\n\n private async _post<T>(request: GraphQLRequest, init?: RequestInit): Promise<T> {\n const token = await this.resolveAuthorizationToken();\n const headers = new Headers(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n if (token && !headers.has('Authorization')) {\n headers.set('Authorization', token.startsWith('Bearer ') ? token : `Bearer ${token}`);\n }\n if (this.options.apiKey && !headers.has('x-api-key')) {\n headers.set('x-api-key', this.options.apiKey);\n }\n\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n cache: 'no-store',\n ...init,\n });\n if (!res.ok) {\n throw new IndexerHttpError(res.status, res.statusText, {\n retryAfterSeconds: parseRetryAfterSeconds(res.headers.get('Retry-After')),\n });\n }\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>(\n request: GraphQLRequest,\n init?: RequestInit & { retries?: number; rateLimitRetries?: number },\n ): Promise<T> {\n const retries = Math.max(0, init?.retries ?? 1);\n const rateLimitRetries = Math.max(0, init?.rateLimitRetries ?? 2);\n const maxAttempts = 1 + Math.max(retries, rateLimitRetries);\n const {\n retries: _unusedRetries,\n rateLimitRetries: _unusedRateLimitRetries,\n ...requestInit\n } = init ?? {};\n void _unusedRetries;\n void _unusedRateLimitRetries;\n\n let attempts = 0;\n let rateLimitAttempt = 0;\n let standardRetryAttempt = 0;\n let lastErr: unknown;\n\n while (attempts < maxAttempts) {\n try {\n return await this._post<T>(request, requestInit);\n } catch (e) {\n lastErr = e;\n attempts += 1;\n\n if (requestInit.signal?.aborted) {\n throw e;\n }\n\n const hasAttemptsRemaining = attempts < maxAttempts;\n\n if (\n e instanceof IndexerHttpError &&\n e.status === 429 &&\n rateLimitAttempt < rateLimitRetries &&\n hasAttemptsRemaining\n ) {\n rateLimitAttempt += 1;\n const waitSeconds =\n e.retryAfterSeconds !== undefined ? Math.max(0, e.retryAfterSeconds) : 1;\n await delay(waitSeconds * 1000, requestInit.signal ?? undefined);\n continue;\n }\n\n if (!hasAttemptsRemaining || standardRetryAttempt >= retries) {\n break;\n }\n\n standardRetryAttempt += 1;\n await delay(200 * standardRetryAttempt, requestInit.signal ?? undefined);\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n}\n\nexport type DeploymentEnv = 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING' | 'DEV' | 'LOCAL';\n\nexport function defaultIndexerEndpoint(env: DeploymentEnv = 'PRODUCTION'): string {\n switch (env) {\n case 'PRODUCTION':\n return 'https://indexer.zkp2p.xyz/v1/graphql';\n case 'PREPRODUCTION':\n return 'https://indexer-preprod.zkp2p.xyz/v1/graphql';\n case 'STAGING':\n return 'https://indexer-staging.zkp2p.xyz/v1/graphql';\n case 'DEV':\n case 'LOCAL':\n // Not used by consumers; map to staging endpoint by default\n return 'https://indexer-staging.zkp2p.xyz/v1/graphql';\n default:\n return 'https://indexer.zkp2p.xyz/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 delegate\n rateManagerId\n rateManagerAddress\n delegatedAt\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\nconst LEGACY_DEPOSIT_FIELDS = `\n id\n chainId\n escrowAddress\n depositId\n depositor\n delegate\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\nconst METHOD_CURRENCY_FIELDS = `\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n conversionRate\n takerConversionRate\n managerFee\n rateSource\n oracleRate\n effectiveOracleRate\n lastOracleUpdatedAt\n adapter\n adapterConfig\n feed\n feedDecimals\n spreadBps\n maxStaleness\n invert\n kind\n managerRate\n rateManagerId\n`;\n\nconst LEGACY_METHOD_CURRENCY_FIELDS = `\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n conversionRate\n managerRate\n rateManagerId\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 LEGACY_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 ${LEGACY_DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSITS_BY_IDS_QUERY = /* GraphQL */ `\n query GetDepositsByIds($ids: [String!]) {\n Deposit(where: { id: { _in: $ids } }) {\n ${LEGACY_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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n ${METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n ${LEGACY_METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const PAYMENT_METHODS_BY_PAYEE_HASH_QUERY = /* GraphQL */ `\n query GetPaymentMethodsByPayeeHash($where: DepositPaymentMethod_bool_exp!, $limit: Int) {\n DepositPaymentMethod(where: $where, limit: $limit) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\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 intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(\n where: {\n depositId: { _eq: $id }\n }\n ) {\n ${METHOD_CURRENCY_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSIT_WITH_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositWithRelations($id: String!) {\n Deposit_by_pk(id: $id) {\n ${LEGACY_DEPOSIT_FIELDS}\n }\n DepositPaymentMethod(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _eq: $id } }) {\n ${LEGACY_METHOD_CURRENCY_FIELDS}\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 rateManagerId\n managerFee\n managerFeeRecipient\n managerFeeAmount\n paymentAmount\n paymentCurrency\n paymentTimestamp\n paymentId\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const LEGACY_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\nconst RATE_MANAGER_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n feeRecipient\n maxFee\n fee\n minLiquidity\n name\n uri\n createdAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n feeRecipient\n maxFee\n fee\n name\n uri\n createdAt\n updatedAt\n`;\n\nconst RATE_MANAGER_AGGREGATE_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n manager\n totalFilledVolume\n totalFeeAmount\n totalPnlUsdCents\n fulfilledIntents\n currentDelegatedBalance\n currentDelegatedDeposits\n firstSeenAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_AGGREGATE_FIELDS = `\n id\n chainId\n rateManagerId\n manager\n totalFilledVolume\n totalFeeAmount\n totalPnlUsdCents\n fulfilledIntents\n currentDelegatedBalance\n currentDelegatedDeposits\n firstSeenAt\n updatedAt\n`;\n\nconst RATE_MANAGER_RATE_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n paymentMethodHash\n currencyCode\n managerRate\n updatedAt\n`;\n\nconst DEPOSIT_DELEGATION_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n delegatedAt\n updatedAt\n`;\n\nconst LEGACY_RATE_MANAGER_DELEGATION_FIELDS = `\n id\n chainId\n rateManagerId\n rateManagerAddress\n depositId\n createdAt\n updatedAt\n`;\n\nconst MANAGER_STATS_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n depositId\n depositor\n currentDelegatedBalance\n totalAmountTaken\n totalWithdrawn\n fulfilledIntents\n prunedIntents\n successRateBps\n updatedAt\n`;\n\nconst MANAGER_DAILY_SNAPSHOT_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n dayTimestamp\n tvl\n delegatedDeposits\n dailyVolume\n dailyFees\n dailyPnlUsdCents\n dailyFulfilledIntents\n cumulativeVolume\n cumulativeFees\n cumulativePnlUsdCents\n cumulativeFulfilledIntents\n updatedAt\n`;\n\nconst DEPOSITOR_FLOOR_CONFIG_FIELDS = `\n id\n chainId\n rateManagerAddress\n rateManagerId\n escrowAddress\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n floorFixed\n floorSpreadBps\n oracleAdapter\n adapterConfig\n feed\n feedDecimals\n maxStaleness\n invert\n oracleFloorRate\n currentFloorRate\n enabled\n lastOracleUpdatedAt\n kind\n createdAt\n updatedAt\n`;\n\nexport const RATE_MANAGER_LIST_QUERY = /* GraphQL */ `\n query VaultList(\n $where: RateManager_bool_exp\n $aggregateWhere: ManagerAggregateStats_bool_exp\n $order_by: [RateManager_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManager(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${RATE_MANAGER_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${RATE_MANAGER_AGGREGATE_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_LIST_QUERY = /* GraphQL */ `\n query VaultList(\n $where: RateManager_bool_exp\n $aggregateWhere: ManagerAggregateStats_bool_exp\n $order_by: [RateManager_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManager(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${LEGACY_RATE_MANAGER_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${LEGACY_RATE_MANAGER_AGGREGATE_FIELDS}\n }\n }\n`;\n\nexport const RATE_MANAGER_DETAIL_QUERY = /* GraphQL */ `\n query VaultDetail(\n $managerWhere: RateManager_bool_exp!\n $rateWhere: RateManagerRate_bool_exp!\n $aggregateWhere: ManagerAggregateStats_bool_exp!\n $statsWhere: ManagerStats_bool_exp!\n $delegationWhere: Deposit_bool_exp!\n $statsLimit: Int\n ) {\n RateManager(where: $managerWhere) {\n ${RATE_MANAGER_FIELDS}\n }\n RateManagerRate(where: $rateWhere) {\n ${RATE_MANAGER_RATE_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${RATE_MANAGER_AGGREGATE_FIELDS}\n }\n ManagerStats(\n where: $statsWhere\n order_by: { updatedAt: desc }\n limit: $statsLimit\n ) {\n ${MANAGER_STATS_FIELDS}\n }\n Deposit(where: $delegationWhere) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_DETAIL_QUERY = /* GraphQL */ `\n query VaultDetail(\n $managerWhere: RateManager_bool_exp!\n $rateWhere: RateManagerRate_bool_exp!\n $aggregateWhere: ManagerAggregateStats_bool_exp!\n $statsWhere: ManagerStats_bool_exp!\n $delegationWhere: RateManagerDelegation_bool_exp!\n $floorWhere: DepositorFloorConfig_bool_exp!\n $statsLimit: Int\n ) {\n RateManager(where: $managerWhere) {\n ${LEGACY_RATE_MANAGER_FIELDS}\n }\n RateManagerRate(where: $rateWhere) {\n ${RATE_MANAGER_RATE_FIELDS}\n }\n ManagerAggregateStats(where: $aggregateWhere) {\n ${LEGACY_RATE_MANAGER_AGGREGATE_FIELDS}\n }\n ManagerStats(\n where: $statsWhere\n order_by: { updatedAt: desc }\n limit: $statsLimit\n ) {\n ${MANAGER_STATS_FIELDS}\n }\n RateManagerDelegation(where: $delegationWhere) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n DepositorFloorConfig(where: $floorWhere) {\n ${DEPOSITOR_FLOOR_CONFIG_FIELDS}\n }\n }\n`;\n\nexport const MANAGER_DAILY_SNAPSHOTS_QUERY = /* GraphQL */ `\n query ManagerDailySnapshots(\n $where: ManagerDailySnapshot_bool_exp!\n $order_by: [ManagerDailySnapshot_order_by!]\n $limit: Int\n ) {\n ManagerDailySnapshot(\n where: $where\n order_by: $order_by\n limit: $limit\n ) {\n ${MANAGER_DAILY_SNAPSHOT_FIELDS}\n }\n }\n`;\n\nexport const RATE_MANAGER_DELEGATIONS_QUERY = /* GraphQL */ `\n query VaultDelegations(\n $where: Deposit_bool_exp!\n $order_by: [Deposit_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Deposit(\n where: $where\n order_by: $order_by\n limit: $limit\n offset: $offset\n ) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_RATE_MANAGER_DELEGATIONS_QUERY = /* GraphQL */ `\n query VaultDelegations(\n $where: RateManagerDelegation_bool_exp!\n $order_by: [RateManagerDelegation_order_by!]\n $limit: Int\n $offset: Int\n ) {\n RateManagerDelegation(\n where: $where\n order_by: $order_by\n limit: $limit\n offset: $offset\n ) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_DELEGATION_QUERY = /* GraphQL */ `\n query DepositDelegation($depositId: String!) {\n Deposit(where: { id: { _eq: $depositId } }, limit: 1) {\n ${DEPOSIT_DELEGATION_FIELDS}\n }\n }\n`;\n\nexport const LEGACY_DEPOSIT_DELEGATION_QUERY = /* GraphQL */ `\n query DepositDelegation($depositId: String!) {\n RateManagerDelegation(where: { depositId: { _eq: $depositId } }, limit: 1) {\n ${LEGACY_RATE_MANAGER_DELEGATION_FIELDS}\n }\n }\n`;\nexport const EXPIRED_INTENTS_QUERY = /* GraphQL */ `\n query GetExpiredIntents($now: numeric!, $limit: Int, $depositIds: [String!]) {\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(where: { intentHash: { _in: $intentHashes } }) {\n intentHash\n isManualRelease\n fundsTransferredTo\n }\n }\n`;\n\nexport const INTENT_FULFILLMENT_AMOUNTS_QUERY = /* GraphQL */ `\n query GetFulfillmentAmounts($intentHash: String!) {\n Intent(where: { intentHash: { _eq: $intentHash } }, limit: 1) {\n intentHash\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const MANUAL_RATE_UPDATES_QUERY = /* GraphQL */ `\n query ManualRateUpdates(\n $where: RateManagerV1_RateManagerRateUpdated_bool_exp!\n $order_by: [RateManagerV1_RateManagerRateUpdated_order_by!]\n $limit: Int\n ) {\n RateManagerV1_RateManagerRateUpdated(where: $where, order_by: $order_by, limit: $limit) {\n id\n rateManagerId\n paymentMethod\n currency: currencyCode\n minRate: rate\n currencyCode\n rate\n }\n }\n`;\n\nexport const RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY = /* GraphQL */ `\n query RateManagerAssignmentEvents(\n $setWhere: EscrowV2_DepositRateManagerSet_bool_exp!\n $clearedWhere: EscrowV2_DepositRateManagerCleared_bool_exp!\n $limit: Int\n $offset: Int\n ) {\n EscrowV2_DepositRateManagerSet(\n where: $setWhere\n order_by: [{ id: desc }]\n limit: $limit\n offset: $offset\n ) {\n id\n rateManagerId\n rateManager\n escrow\n depositIdOnContract: depositId\n }\n EscrowV2_DepositRateManagerCleared(\n where: $clearedWhere\n order_by: [{ id: desc }]\n limit: $limit\n offset: $offset\n ) {\n id\n rateManagerId\n rateManager\n escrow\n depositIdOnContract: depositId\n }\n }\n`;\n\nexport const ORACLE_CONFIG_UPDATES_QUERY = /* GraphQL */ `\n query OracleConfigUpdates(\n $where: EscrowV2_DepositOracleRateConfigSet_bool_exp!\n $order_by: [EscrowV2_DepositOracleRateConfigSet_order_by!]\n $limit: Int\n ) {\n EscrowV2_DepositOracleRateConfigSet(where: $where, order_by: $order_by, limit: $limit) {\n id\n escrow\n depositIdOnContract: depositId\n paymentMethod\n currency: currencyCode\n currencyCode\n adapter\n spreadBps\n maxStaleness\n adapterConfig\n }\n }\n`;\n\nexport const LEGACY_ORACLE_CONFIG_UPDATES_QUERY = /* GraphQL */ `\n query OracleConfigUpdates(\n $where: RateManagerV1_DepositorFloorSet_bool_exp!\n $order_by: [RateManagerV1_DepositorFloorSet_order_by!]\n $limit: Int\n ) {\n RateManagerV1_DepositorFloorSet(where: $where, order_by: $order_by, limit: $limit) {\n id\n rateManagerId\n escrow\n depositIdOnContract: depositId\n paymentMethod\n currency: currencyCode\n adapter: oracleAdapter\n spreadBps: floorSpreadBps\n maxStaleness\n adapterConfig\n currencyCode\n floorFixed\n floorSpreadBps\n oracleAdapter\n enabled\n }\n }\n`;\n\nexport const DEPOSIT_EVENTS_QUERY = /* GraphQL */ `\n query GetDepositEvents($depositId: numeric!) {\n depositsV21: Escrow_V21_DepositReceived(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n depositsV2: EscrowV2_DepositReceived(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV21: Escrow_V21_DepositFundsAdded(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV2: EscrowV2_DepositFundsAdded(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV21: Escrow_V21_DepositWithdrawn(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV2: EscrowV2_DepositWithdrawn(\n where: { depositId: { _eq: $depositId } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n }\n`;\n\nexport const DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY = /* GraphQL */ `\n query GetDepositEventsByDepositor($depositId: numeric!, $depositor: String!) {\n depositsV21: Escrow_V21_DepositReceived(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n depositsV2: EscrowV2_DepositReceived(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV21: Escrow_V21_DepositFundsAdded(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n fundsAddedV2: EscrowV2_DepositFundsAdded(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV21: Escrow_V21_DepositWithdrawn(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n withdrawalsV2: EscrowV2_DepositWithdrawn(\n where: { depositId: { _eq: $depositId }, depositor: { _eq: $depositor } }\n order_by: [{ id: desc }]\n ) {\n id\n depositId\n depositor\n amount\n }\n }\n`;\n\nconst DEPOSIT_FUND_ACTIVITY_FIELDS = `\n id\n chainId\n depositId\n depositor\n activityType\n amount\n blockNumber\n timestamp\n txHash\n`;\n\nconst DEPOSIT_DAILY_SNAPSHOT_FIELDS = `\n id\n chainId\n depositId\n depositor\n dayTimestamp\n remainingDeposits\n outstandingIntentAmount\n totalAmountTaken\n totalWithdrawn\n signaledIntents\n fulfilledIntents\n prunedIntents\n successRateBps\n dailyVolume\n dailyPnlUsdCents\n cumulativeVolume\n cumulativePnlUsdCents\n updatedAt\n`;\n\nexport const DEPOSIT_FUND_ACTIVITIES_QUERY = /* GraphQL */ `\n query GetDepositFundActivities($depositId: String!) {\n DepositFundActivity(\n where: { depositId: { _eq: $depositId } }\n order_by: { timestamp: desc }\n ) {\n ${DEPOSIT_FUND_ACTIVITY_FIELDS}\n }\n }\n`;\n\nexport const MAKER_FUND_ACTIVITIES_QUERY = /* GraphQL */ `\n query GetMakerFundActivities($depositor: String!, $limit: Int) {\n DepositFundActivity(\n where: { depositor: { _eq: $depositor } }\n order_by: { timestamp: desc }\n limit: $limit\n ) {\n ${DEPOSIT_FUND_ACTIVITY_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_DAILY_SNAPSHOTS_QUERY = /* GraphQL */ `\n query GetDepositDailySnapshots($depositId: String!, $limit: Int) {\n DepositDailySnapshot(\n where: { depositId: { _eq: $depositId } }\n order_by: { dayTimestamp: asc }\n limit: $limit\n ) {\n ${DEPOSIT_DAILY_SNAPSHOT_FIELDS}\n }\n }\n`;\n\nexport const FULFILLMENT_AND_PAYMENT_QUERY = /* GraphQL */ `\n query PaymentVerificationForFulfilledIntent($intentHash: String!) {\n Orchestrator_V21_IntentFulfilled(where: { intentHash: { _eq: $intentHash } }) {\n id\n intentHash\n amount\n isManualRelease\n fundsTransferredTo\n }\n UnifiedVerifier_V21_PaymentVerified(where: { intentHash: { _eq: $intentHash } }) {\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';\nimport { parseBigIntLike } from '../utils/bigint';\n\nconst ZERO = '0x0000000000000000000000000000000000000000';\n\nfunction toBigInt(value: string | number | bigint | null | undefined): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return parseBigIntLike(value);\n } catch {\n return 0n;\n }\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return ZERO;\n return value.startsWith('0x') ? value : ZERO;\n}\n\nfunction resolveActiveConversionRate(currency: {\n effectiveOracleRate?: string | null;\n conversionRate?: string | null;\n minConversionRate?: string | null;\n}): string | number | bigint | null | undefined {\n const candidates = [\n currency.effectiveOracleRate,\n currency.conversionRate,\n currency.minConversionRate,\n ];\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) continue;\n const parsed = toBigInt(candidate);\n if (parsed > 0n) {\n return candidate;\n }\n }\n\n return currency.effectiveOracleRate ?? currency.conversionRate ?? currency.minConversionRate;\n}\n\nexport function extractDepositId(compositeId: string): string {\n const parts = compositeId.split('_');\n return parts[1] || '0';\n}\n\nexport function createCompositeDepositId(\n escrowAddress: string,\n depositId: string | bigint,\n): string {\n return `${escrowAddress.toLowerCase()}_${depositId.toString()}`;\n}\n\nexport function convertIndexerDepositToEscrowView(\n deposit: DepositWithRelations,\n _chainId: number,\n _escrowAddress: string,\n): EscrowDepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(\n (pm) => (pm as any).active !== false,\n );\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: '',\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(resolveActiveConversionRate(cur)),\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 =\n remaining +\n outstanding +\n toBigInt(deposit.totalAmountTaken ?? 0) +\n 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 rateManagerId: deposit.rateManagerId ?? null,\n depositAmount,\n intentAmountRange: {\n min: toBigInt(deposit.intentAmountMin),\n max: toBigInt(deposit.intentAmountMax),\n },\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(\n deposits: DepositWithRelations[],\n chainId: number,\n escrowAddress: string,\n): EscrowDepositView[] {\n return deposits\n .filter(\n (d) =>\n d.depositor &&\n d.depositor.toLowerCase() !== ZERO &&\n d.acceptingIntents &&\n toBigInt(d.remainingDeposits) > 0n &&\n d.status === 'ACTIVE',\n )\n .map((d) => convertIndexerDepositToEscrowView(d, chainId, escrowAddress));\n}\n\nexport function convertIndexerIntentsToEscrowViews(\n intents: IntentEntity[],\n depositViewsById: Map<string, EscrowDepositView>,\n): 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","export function isSchemaCompatibilityError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n if (!message.includes('graphql errors')) return false;\n return (\n message.includes('cannot query field') ||\n message.includes('does not exist') ||\n message.includes('not found in type')\n );\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSITS_QUERY,\n DEPOSITS_BY_IDS_QUERY,\n LEGACY_DEPOSITS_QUERY,\n LEGACY_DEPOSITS_BY_IDS_QUERY,\n DEPOSIT_RELATIONS_QUERY,\n LEGACY_DEPOSIT_RELATIONS_QUERY,\n DEPOSIT_WITH_RELATIONS_QUERY,\n LEGACY_DEPOSIT_WITH_RELATIONS_QUERY,\n INTENTS_QUERY,\n LEGACY_INTENTS_QUERY,\n EXPIRED_INTENTS_QUERY,\n INTENT_FULFILLMENTS_QUERY,\n INTENT_FULFILLMENT_AMOUNTS_QUERY,\n PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n DEPOSIT_EVENTS_QUERY,\n DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY,\n DEPOSIT_FUND_ACTIVITIES_QUERY,\n MAKER_FUND_ACTIVITIES_QUERY,\n DEPOSIT_DAILY_SNAPSHOTS_QUERY,\n} from './queries';\nimport type {\n DepositEntity,\n DepositPaymentMethodEntity,\n MethodCurrencyEntity,\n IntentEntity,\n IntentStatus,\n DepositWithRelations,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositEventEntity,\n DepositEventsResponse,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\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 delegate: string;\n /** True to only include deposits with a non-zero delegate, false for zero delegate. */\n delegateIsSet: boolean;\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 }>(\n items: T[],\n): 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);\n else map.set(key, [item]);\n }\n return map;\n}\n\nconst DEFAULT_LIMIT = 100;\nconst DEFAULT_ORDER_FIELD: NonNullable<PaginationOptions['orderBy']> = 'remainingDeposits';\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport class IndexerDepositService {\n constructor(private client: IndexerClient) {}\n\n private async queryWithLegacyFallback<T>(params: {\n query: string;\n legacyQuery: string;\n variables?: Record<string, unknown>;\n }): Promise<T> {\n try {\n return await this.client.query<T>({\n query: params.query,\n variables: params.variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return this.client.query<T>({\n query: params.legacyQuery,\n variables: params.variables,\n });\n }\n }\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.delegate) {\n where.delegate = { _ilike: filter.delegate };\n } else if (filter.delegateIsSet !== undefined) {\n where.delegate = filter.delegateIsSet ? { _neq: ZERO_ADDRESS } : { _eq: ZERO_ADDRESS };\n }\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)\n 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']> =\n 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.queryWithLegacyFallback<{\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({\n query: DEPOSIT_RELATIONS_QUERY,\n legacyQuery: LEGACY_DEPOSIT_RELATIONS_QUERY,\n variables: { depositIds },\n });\n\n const paymentMethodsByDeposit = groupByDepositId(result.DepositPaymentMethod ?? []);\n const currenciesByDeposit = groupByDepositId(result.MethodCurrency ?? []);\n return { paymentMethodsByDeposit, currenciesByDeposit };\n }\n\n private async fetchIntents(params: {\n depositIds?: string[];\n owner?: string;\n statuses?: IntentStatus[];\n limit?: number;\n offset?: number;\n }): 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.queryWithLegacyFallback<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n legacyQuery: LEGACY_INTENTS_QUERY,\n variables: {\n where,\n order_by: [{ signalTimestamp: 'desc' }],\n limit: params.limit,\n offset: params.offset,\n },\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\n ? this.fetchIntents({ depositIds, statuses: options.intentStatuses })\n : Promise.resolve([]),\n ]);\n const intentsByDeposit = options.includeIntents\n ? groupByDepositId(intents)\n : 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(\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n ): Promise<DepositEntity[]> {\n const result = await this.queryWithLegacyFallback<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_QUERY,\n legacyQuery: LEGACY_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.queryWithLegacyFallback<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_BY_IDS_QUERY,\n legacyQuery: LEGACY_DEPOSITS_BY_IDS_QUERY,\n variables: { ids },\n });\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(\n depositIds: string[],\n statuses?: IntentStatus[],\n ): 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 fetchIntentByHash(intentHash: string): Promise<IntentEntity | null> {\n if (!intentHash) return null;\n\n const result = await this.queryWithLegacyFallback<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n legacyQuery: LEGACY_INTENTS_QUERY,\n variables: {\n where: { intentHash: { _eq: intentHash.toLowerCase() } },\n limit: 1,\n order_by: [{ signalTimestamp: 'desc' }],\n },\n });\n\n return result.Intent?.[0] ?? null;\n }\n\n async fetchDepositWithRelations(\n id: string,\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {},\n ): Promise<DepositWithRelations | null> {\n const result = await this.queryWithLegacyFallback<{\n Deposit_by_pk?: DepositEntity | null;\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({\n query: DEPOSIT_WITH_RELATIONS_QUERY,\n legacyQuery: LEGACY_DEPOSIT_WITH_RELATIONS_QUERY,\n variables: { id },\n });\n\n const deposit = result.Deposit_by_pk;\n if (!deposit) return null;\n const base: DepositWithRelations = {\n ...deposit,\n paymentMethods: result.DepositPaymentMethod ?? [],\n currencies: result.MethodCurrency ?? [],\n };\n if (!options.includeIntents) return base;\n const intents = await this.fetchIntents({\n depositIds: [deposit.id],\n statuses: options.intentStatuses,\n });\n return { ...base, intents };\n }\n\n async fetchExpiredIntents(params: {\n now: bigint | string;\n depositIds: string[];\n limit?: number;\n }): 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<{\n Orchestrator_V21_IntentFulfilled?: IntentFulfilledEntity[];\n }>({\n query: INTENT_FULFILLMENTS_QUERY,\n variables: { intentHashes: uniqueHashes },\n });\n\n return result.Orchestrator_V21_IntentFulfilled ?? [];\n }\n\n async fetchIntentFulfillmentAmounts(\n intentHash: string,\n ): Promise<IntentFulfillmentAmountsEntity | null> {\n if (!intentHash) return null;\n const normalizedIntentHash = intentHash.toLowerCase();\n\n const result = await this.client.query<{ Intent?: IntentFulfillmentAmountsEntity[] }>({\n query: INTENT_FULFILLMENT_AMOUNTS_QUERY,\n variables: { intentHash: normalizedIntentHash },\n });\n\n return result.Intent?.[0] ?? null;\n }\n\n async resolvePayeeHash(params: {\n escrowAddress?: string | null;\n depositId?: string | number | bigint | null;\n paymentMethodHash?: string | null;\n }): Promise<string | null> {\n try {\n const { escrowAddress, depositId, paymentMethodHash } = params;\n if (!escrowAddress || depositId === null || depositId === undefined || !paymentMethodHash)\n 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(\n (pm) => (pm.paymentMethodHash ?? '').toLowerCase() === target,\n );\n return match?.payeeDetailsHash ?? null;\n } catch {\n return null;\n }\n }\n\n async fetchDepositEvents(\n depositIdOnContract: string,\n options?: { escrowAddress?: string | null; depositor?: string | null },\n ): Promise<DepositEventsResponse> {\n let result: Record<string, DepositEventEntity[] | undefined>;\n // Event entities are keyed by numeric depositId and do not expose escrow identity.\n // Scope by depositor when available to avoid cross-escrow event leakage.\n const normalizedDepositor = options?.depositor?.trim().toLowerCase();\n const query = normalizedDepositor ? DEPOSIT_EVENTS_BY_DEPOSITOR_QUERY : DEPOSIT_EVENTS_QUERY;\n const variables = normalizedDepositor\n ? { depositId: depositIdOnContract, depositor: normalizedDepositor }\n : { depositId: depositIdOnContract };\n\n try {\n result = await this.client.query<Record<string, DepositEventEntity[] | undefined>>({\n query,\n variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return { deposits: [], fundsAdded: [], withdrawals: [] };\n }\n\n const mergeEvents = (\n ...groups: Array<DepositEventEntity[] | undefined>\n ): DepositEventEntity[] => {\n const merged: DepositEventEntity[] = [];\n const seen = new Set<string>();\n for (const group of groups) {\n for (const event of group ?? []) {\n const key = (event.id ?? '').toLowerCase();\n if (key && seen.has(key)) continue;\n if (key) seen.add(key);\n merged.push(event);\n }\n }\n return merged;\n };\n\n return {\n deposits: mergeEvents(\n result.depositsV21 ?? result.Escrow_V21_DepositReceived,\n result.depositsV2 ?? result.EscrowV2_DepositReceived,\n result.deposits,\n ),\n fundsAdded: mergeEvents(\n result.fundsAddedV21 ?? result.Escrow_V21_DepositFundsAdded,\n result.fundsAddedV2 ?? result.EscrowV2_DepositFundsAdded,\n result.fundsAdded,\n ),\n withdrawals: mergeEvents(\n result.withdrawalsV21 ?? result.Escrow_V21_DepositWithdrawn,\n result.withdrawalsV2 ?? result.EscrowV2_DepositWithdrawn,\n result.withdrawals,\n ),\n };\n }\n\n async fetchDepositsByPayeeHash(\n payeeHash: string,\n options: {\n paymentMethodHash?: string;\n limit?: number;\n includeIntents?: boolean;\n intentStatuses?: IntentStatus[];\n } = {},\n ): 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 = {\n _eq: options.paymentMethodHash.toLowerCase?.() ?? options.paymentMethodHash,\n };\n }\n\n const result = await this.client.query<{ DepositPaymentMethod?: DepositPaymentMethodEntity[] }>(\n {\n query: PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n variables: { where, limit: options.limit },\n },\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 /**\n * Fetch chronological fund activities for a deposit.\n */\n async fetchDepositFundActivities(\n compositeDepositId: string,\n ): Promise<DepositFundActivityEntity[]> {\n try {\n const result = await this.client.query<{\n DepositFundActivity?: DepositFundActivityEntity[];\n }>({\n query: DEPOSIT_FUND_ACTIVITIES_QUERY,\n variables: { depositId: compositeDepositId },\n });\n\n return result.DepositFundActivity ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n /**\n * Fetch fund activities across all deposits for a maker address.\n */\n async fetchMakerFundActivities(\n depositor: string,\n limit = 50,\n ): Promise<DepositFundActivityEntity[]> {\n const normalized = depositor?.trim().toLowerCase();\n if (!normalized) return [];\n\n try {\n const result = await this.client.query<{\n DepositFundActivity?: DepositFundActivityEntity[];\n }>({\n query: MAKER_FUND_ACTIVITIES_QUERY,\n variables: { depositor: normalized, limit },\n });\n\n return result.DepositFundActivity ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n /**\n * Fetch daily snapshots for a deposit, ordered by day ascending.\n */\n async fetchDepositDailySnapshots(\n compositeDepositId: string,\n limit?: number,\n ): Promise<DepositDailySnapshotEntity[]> {\n try {\n const result = await this.client.query<{\n DepositDailySnapshot?: DepositDailySnapshotEntity[];\n }>({\n query: DEPOSIT_DAILY_SNAPSHOTS_QUERY,\n variables: {\n depositId: compositeDepositId,\n limit: limit ?? null,\n },\n });\n\n return result.DepositDailySnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSIT_DELEGATION_QUERY,\n LEGACY_DEPOSIT_DELEGATION_QUERY,\n LEGACY_ORACLE_CONFIG_UPDATES_QUERY,\n LEGACY_RATE_MANAGER_DELEGATIONS_QUERY,\n LEGACY_RATE_MANAGER_DETAIL_QUERY,\n LEGACY_RATE_MANAGER_LIST_QUERY,\n MANAGER_DAILY_SNAPSHOTS_QUERY,\n MANUAL_RATE_UPDATES_QUERY,\n ORACLE_CONFIG_UPDATES_QUERY,\n RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY,\n RATE_MANAGER_DELEGATIONS_QUERY,\n RATE_MANAGER_DETAIL_QUERY,\n RATE_MANAGER_LIST_QUERY,\n} from './queries';\nimport { parseBigIntLike } from '../utils/bigint';\nimport type {\n DepositEntity,\n ManualRateUpdateEntity,\n OracleConfigUpdateEntity,\n ManagerAggregateStatsEntity,\n ManagerDailySnapshotEntity,\n ManagerStatsEntity,\n RateManagerDelegationEntity,\n RateManagerDetail,\n RateManagerEntity,\n RateManagerListItem,\n RateManagerRateEntity,\n} from './types';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\n\nexport type OrderDirection = 'asc' | 'desc';\n\nexport type RateManagerOrderField =\n | 'createdAt'\n | 'updatedAt'\n | 'fee'\n | 'maxFee'\n | 'rateManagerId'\n | 'currentDelegatedBalance'\n | 'totalFilledVolume';\n\ntype AggregateRateManagerOrderField = 'currentDelegatedBalance' | 'totalFilledVolume';\ntype BaseRateManagerOrderField = Exclude<RateManagerOrderField, AggregateRateManagerOrderField>;\ntype RateManagerDepositScope = { escrow: string; depositIdOnContract: string };\ntype RateManagerAssignmentEventEntity = {\n id: string;\n rateManagerId: string;\n rateManager?: string | null;\n escrow?: string | null;\n depositIdOnContract?: string | null;\n};\n\nexport type RateManagerFilter = Partial<{\n manager: string;\n name: string;\n hasHook: boolean;\n maxFee: string;\n rateManagerIds: string[];\n}>;\n\nexport type RateManagerPaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: RateManagerOrderField;\n orderDirection: OrderDirection;\n}>;\n\nexport type RateManagerDelegationPaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: 'createdAt' | 'updatedAt' | 'depositId' | 'delegatedAt';\n orderDirection: OrderDirection;\n rateManagerAddress: string;\n}>;\n\nconst DEFAULT_LIMIT = 50;\nconst RATE_MANAGER_HISTORY_PAGE_SIZE = 250;\n\nfunction normalizeRateManagerId(value?: string | null): string {\n if (!value) return '';\n return value.toLowerCase();\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return '';\n return value.toLowerCase();\n}\n\nfunction parseScopedRateManagerFilterId(\n value: string,\n): { rateManagerAddress: string; rateManagerId: string } | null {\n const trimmed = value.trim().toLowerCase();\n if (!trimmed) return null;\n\n const separatorIndex = trimmed.indexOf(':');\n if (separatorIndex <= 0) return null;\n\n const rateManagerAddress = normalizeAddress(trimmed.slice(0, separatorIndex));\n const rateManagerId = normalizeRateManagerId(trimmed.slice(separatorIndex + 1));\n\n if (!rateManagerAddress.startsWith('0x') || !rateManagerId) {\n return null;\n }\n\n return { rateManagerAddress, rateManagerId };\n}\n\nfunction getManagerScopeKey(\n rateManagerId?: string | null,\n rateManagerAddress?: string | null,\n): string {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n return normalizedRateManagerAddress\n ? `${normalizedRateManagerAddress}:${normalizedId}`\n : normalizedId;\n}\n\nfunction extractRateManagerAddressFromScopedId(id?: string | null): string | null {\n if (!id) return null;\n const parts = id.split('_');\n // Current scoped IDs: chainId_rateManagerAddress_rateManagerId...\n if (parts.length < 3) return null;\n const rateManagerAddress = parts[1] ?? '';\n return rateManagerAddress.startsWith('0x') ? rateManagerAddress.toLowerCase() : null;\n}\n\nfunction buildRateManagerAddressScopedIdPattern(\n rateManagerId: string,\n rateManagerAddress: string,\n): string {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n return `%_${normalizedRateManagerAddress}_${normalizedId}`;\n}\n\nfunction buildRateManagerScopedIdPattern(\n rateManagerId: string,\n rateManagerAddress: string,\n): string {\n return `${buildRateManagerAddressScopedIdPattern(rateManagerId, rateManagerAddress)}_%`;\n}\n\nfunction normalizeCompositeDepositId(depositId: string, escrowAddress?: string | null): string {\n const normalizedDepositId = depositId.trim().toLowerCase();\n if (!normalizedDepositId) return '';\n if (normalizedDepositId.includes('_')) return normalizedDepositId;\n const normalizedEscrow = normalizeAddress(escrowAddress);\n if (normalizedEscrow) {\n return `${normalizedEscrow}_${normalizedDepositId}`;\n }\n return normalizedDepositId;\n}\n\nfunction extractDepositIdOnContract(compositeDepositId?: string | null): string | null {\n if (!compositeDepositId) return null;\n const parts = compositeDepositId.split('_');\n const rawDepositId = parts[parts.length - 1];\n return rawDepositId && /^\\d+$/.test(rawDepositId) ? rawDepositId : null;\n}\n\nfunction extractEscrowAddressFromCompositeDepositId(\n compositeDepositId?: string | null,\n): string | null {\n if (!compositeDepositId) return null;\n const [escrowAddress] = compositeDepositId.split('_');\n return escrowAddress?.startsWith('0x') ? escrowAddress.toLowerCase() : null;\n}\n\ninterface ParsedRateManagerIds {\n bare: Set<string>;\n scoped: Map<string, { rateManagerAddress: string; rateManagerId: string }>;\n}\n\nfunction parseRateManagerFilterIds(rateManagerIds: string[]): ParsedRateManagerIds {\n const bare = new Set<string>();\n const scoped = new Map<string, { rateManagerAddress: string; rateManagerId: string }>();\n\n for (const value of rateManagerIds) {\n const scopedRateManager = parseScopedRateManagerFilterId(value);\n if (scopedRateManager) {\n scoped.set(\n getManagerScopeKey(scopedRateManager.rateManagerId, scopedRateManager.rateManagerAddress),\n scopedRateManager,\n );\n continue;\n }\n\n const normalizedRateManagerId = normalizeRateManagerId(value);\n if (normalizedRateManagerId) {\n bare.add(normalizedRateManagerId);\n }\n }\n\n return { bare, scoped };\n}\n\nfunction buildDepositScopeKey(scope: RateManagerDepositScope): string {\n return `${scope.escrow}:${scope.depositIdOnContract}`;\n}\n\nfunction toSafeBigInt(value?: string | null): bigint {\n if (!value) return 0n;\n try {\n return parseBigIntLike(value);\n } catch {\n return 0n;\n }\n}\n\nfunction compareBigInt(a: bigint, b: bigint, direction: OrderDirection): number {\n if (a === b) return 0;\n if (direction === 'asc') return a < b ? -1 : 1;\n return a > b ? -1 : 1;\n}\n\nfunction parseEventCursorId(id?: string | null): {\n chainId: bigint;\n blockNumber: bigint;\n logIndex: bigint;\n} | null {\n if (!id) return null;\n\n const [chainIdRaw, blockNumberRaw, logIndexRaw] = id.split('_');\n if (!chainIdRaw || !blockNumberRaw || !logIndexRaw) return null;\n if (!/^\\d+$/.test(chainIdRaw) || !/^\\d+$/.test(blockNumberRaw) || !/^\\d+$/.test(logIndexRaw)) {\n return null;\n }\n\n try {\n return {\n chainId: BigInt(chainIdRaw),\n blockNumber: BigInt(blockNumberRaw),\n logIndex: BigInt(logIndexRaw),\n };\n } catch {\n return null;\n }\n}\n\nexport function compareEventCursorIdsByRecency(\n leftId?: string | null,\n rightId?: string | null,\n): number {\n const left = parseEventCursorId(leftId);\n const right = parseEventCursorId(rightId);\n\n if (left && right) {\n if (left.chainId !== right.chainId) {\n return left.chainId > right.chainId ? -1 : 1;\n }\n if (left.blockNumber !== right.blockNumber) {\n return left.blockNumber > right.blockNumber ? -1 : 1;\n }\n if (left.logIndex !== right.logIndex) {\n return left.logIndex > right.logIndex ? -1 : 1;\n }\n return 0;\n }\n\n return (rightId ?? '').localeCompare(leftId ?? '');\n}\n\nfunction isAggregateOrderField(\n field: RateManagerOrderField,\n): field is AggregateRateManagerOrderField {\n return field === 'currentDelegatedBalance' || field === 'totalFilledVolume';\n}\n\nfunction normalizeRateManagerEntity(manager: RateManagerEntity): RateManagerEntity {\n return {\n ...manager,\n rateManagerAddress: normalizeAddress(manager.rateManagerAddress),\n };\n}\n\nfunction toDelegationEntityFromDeposit(\n deposit: Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >,\n): RateManagerDelegationEntity | null {\n const rateManagerId = normalizeRateManagerId(deposit.rateManagerId);\n if (!rateManagerId) return null;\n const delegatedAt = deposit.delegatedAt ?? null;\n return {\n id: deposit.id,\n chainId: deposit.chainId,\n rateManagerId,\n rateManagerAddress: normalizeAddress(deposit.rateManagerAddress) || null,\n depositId: deposit.id,\n delegatedAt,\n createdAt: delegatedAt ?? deposit.updatedAt,\n updatedAt: deposit.updatedAt,\n };\n}\n\nexport class IndexerRateManagerService {\n constructor(private client: IndexerClient) {}\n\n private buildRateManagerScopeWhere(\n rateManagerIds?: string[],\n ): Record<string, unknown> | undefined {\n if (!rateManagerIds?.length) return undefined;\n\n const { bare, scoped } = parseRateManagerFilterIds(rateManagerIds);\n\n const scopeConditions: Array<Record<string, unknown>> = [];\n\n if (bare.size > 0) {\n scopeConditions.push({\n rateManagerId: { _in: [...bare] },\n });\n }\n\n for (const scopedRateManager of scoped.values()) {\n scopeConditions.push({\n rateManagerId: { _eq: scopedRateManager.rateManagerId },\n rateManagerAddress: { _eq: scopedRateManager.rateManagerAddress },\n });\n }\n\n if (scopeConditions.length === 1) {\n return scopeConditions[0];\n }\n if (scopeConditions.length > 1) {\n return { _or: scopeConditions };\n }\n\n return undefined;\n }\n\n private buildWhere(filter?: RateManagerFilter): Record<string, unknown> | undefined {\n if (!filter) return undefined;\n\n const where: Record<string, unknown> = {};\n\n if (filter.manager) {\n where.manager = { _ilike: filter.manager };\n }\n\n if (filter.name) {\n where.name = { _ilike: `%${filter.name}%` };\n }\n\n if (filter.maxFee) {\n where.maxFee = { _lte: filter.maxFee };\n }\n\n const scopeWhere = this.buildRateManagerScopeWhere(filter.rateManagerIds);\n if (scopeWhere) {\n Object.assign(where, scopeWhere);\n }\n\n return Object.keys(where).length ? where : undefined;\n }\n\n private buildAggregateWhere(filter?: RateManagerFilter): Record<string, unknown> {\n return this.buildRateManagerScopeWhere(filter?.rateManagerIds) ?? {};\n }\n\n private buildLegacyAggregateWhere(filter?: RateManagerFilter): Record<string, unknown> {\n const rateManagerIds = filter?.rateManagerIds;\n if (!rateManagerIds?.length) return {};\n\n const { bare, scoped } = parseRateManagerFilterIds(rateManagerIds);\n\n const scopeConditions: Array<Record<string, unknown>> = [];\n\n if (bare.size > 0) {\n scopeConditions.push({\n rateManagerId: { _in: [...bare] },\n });\n }\n\n for (const scopedRateManager of scoped.values()) {\n scopeConditions.push({\n rateManagerId: { _eq: scopedRateManager.rateManagerId },\n id: {\n _ilike: buildRateManagerAddressScopedIdPattern(\n scopedRateManager.rateManagerId,\n scopedRateManager.rateManagerAddress,\n ),\n },\n });\n }\n\n if (scopeConditions.length === 1) {\n return scopeConditions[0] ?? {};\n }\n if (scopeConditions.length > 1) {\n return { _or: scopeConditions };\n }\n\n return {};\n }\n\n private buildOrderBy(\n pagination?: RateManagerPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'createdAt';\n const field: BaseRateManagerOrderField = isAggregateOrderField(rawField)\n ? 'createdAt'\n : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private toRateManagerListItems(result: {\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }): RateManagerListItem[] {\n const managers = (result.RateManager ?? []).map(normalizeRateManagerEntity);\n const aggregatesByScope = new Map<string, ManagerAggregateStatsEntity>();\n\n for (const aggregate of result.ManagerAggregateStats ?? []) {\n const aggregateRateManagerAddress =\n normalizeAddress(aggregate.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(aggregate.id);\n const scopeKey = getManagerScopeKey(aggregate.rateManagerId, aggregateRateManagerAddress);\n aggregatesByScope.set(scopeKey, aggregate);\n }\n\n return managers.map((manager) => ({\n manager,\n aggregate:\n aggregatesByScope.get(\n getManagerScopeKey(manager.rateManagerId, normalizeAddress(manager.rateManagerAddress)),\n ) ??\n aggregatesByScope.get(getManagerScopeKey(manager.rateManagerId)) ??\n null,\n }));\n }\n\n private applyHookFilter(rows: RateManagerListItem[], hasHook?: boolean): RateManagerListItem[] {\n if (hasHook === undefined) return rows;\n // Hook metadata is not indexed in current schema — return no matches for\n // hasHook=true to avoid silently ignoring the filter.\n return hasHook ? [] : rows;\n }\n\n private async queryRateManagerList(\n variables: Record<string, unknown>,\n legacyVariables: Record<string, unknown>,\n ): Promise<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }> {\n try {\n return await this.client.query<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }>({\n query: RATE_MANAGER_LIST_QUERY,\n variables,\n });\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n return this.client.query<{\n RateManager?: RateManagerEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_LIST_QUERY,\n variables: legacyVariables,\n });\n }\n }\n\n private buildDelegationOrderBy(\n pagination?: RateManagerDelegationPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'updatedAt';\n const field = rawField === 'createdAt' ? 'delegatedAt' : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private buildLegacyDelegationOrderBy(\n pagination?: RateManagerDelegationPaginationOptions,\n ): Array<Record<string, OrderDirection>> {\n const rawField = pagination?.orderBy ?? 'updatedAt';\n const field = rawField === 'delegatedAt' ? 'createdAt' : rawField;\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as Record<string, OrderDirection>];\n }\n\n private async fetchCurrentRateManagerDepositScopes(\n rateManagerId: string,\n rateManagerAddress?: string | null,\n ): Promise<RateManagerDepositScope[]> {\n const scopes = new Map<string, RateManagerDepositScope>();\n let offset = 0;\n\n for (;;) {\n const delegations = await this.fetchRateManagerDelegations(rateManagerId, {\n limit: RATE_MANAGER_HISTORY_PAGE_SIZE,\n offset,\n orderBy: 'delegatedAt',\n orderDirection: 'desc',\n rateManagerAddress: rateManagerAddress || undefined,\n });\n\n for (const delegation of delegations) {\n const escrow = extractEscrowAddressFromCompositeDepositId(delegation.depositId);\n const depositIdOnContract = extractDepositIdOnContract(delegation.depositId);\n if (!escrow || !depositIdOnContract) continue;\n const scope = { escrow, depositIdOnContract };\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n if (delegations.length < RATE_MANAGER_HISTORY_PAGE_SIZE) {\n break;\n }\n offset += RATE_MANAGER_HISTORY_PAGE_SIZE;\n }\n\n return [...scopes.values()];\n }\n\n private async fetchHistoricalRateManagerDepositScopes(\n rateManagerId: string,\n rateManagerAddress?: string | null,\n ): Promise<RateManagerDepositScope[]> {\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(rateManagerAddress);\n const scopes = new Map<string, RateManagerDepositScope>();\n const currentScopes = await this.fetchCurrentRateManagerDepositScopes(\n normalizedId,\n normalizedRateManagerAddress || undefined,\n );\n\n for (const scope of currentScopes) {\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n try {\n let offset = 0;\n for (;;) {\n const result = await this.client.query<{\n EscrowV2_DepositRateManagerSet?: RateManagerAssignmentEventEntity[];\n EscrowV2_DepositRateManagerCleared?: RateManagerAssignmentEventEntity[];\n }>({\n query: RATE_MANAGER_ASSIGNMENT_EVENTS_QUERY,\n variables: {\n setWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManager: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n clearedWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManager: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n limit: RATE_MANAGER_HISTORY_PAGE_SIZE,\n offset,\n },\n });\n\n const setEvents = result.EscrowV2_DepositRateManagerSet ?? [];\n const clearedEvents = result.EscrowV2_DepositRateManagerCleared ?? [];\n for (const event of [...setEvents, ...clearedEvents]) {\n const escrow = normalizeAddress(event.escrow);\n const depositIdOnContract = event.depositIdOnContract?.toString() ?? '';\n if (!escrow || !depositIdOnContract) continue;\n const scope = { escrow, depositIdOnContract };\n scopes.set(buildDepositScopeKey(scope), scope);\n }\n\n if (\n setEvents.length < RATE_MANAGER_HISTORY_PAGE_SIZE &&\n clearedEvents.length < RATE_MANAGER_HISTORY_PAGE_SIZE\n ) {\n break;\n }\n offset += RATE_MANAGER_HISTORY_PAGE_SIZE;\n }\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n }\n\n return [...scopes.values()];\n }\n\n async fetchRateManagers(\n pagination?: RateManagerPaginationOptions,\n filter?: RateManagerFilter,\n ): Promise<RateManagerListItem[]> {\n const orderBy = pagination?.orderBy ?? 'createdAt';\n const direction: OrderDirection = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n const limit = pagination?.limit ?? DEFAULT_LIMIT;\n const offset = pagination?.offset ?? 0;\n const where = this.buildWhere(filter);\n const aggregateWhere = this.buildAggregateWhere(filter);\n const legacyAggregateWhere = this.buildLegacyAggregateWhere(filter);\n\n if (isAggregateOrderField(orderBy)) {\n const result = await this.queryRateManagerList(\n {\n where,\n aggregateWhere,\n order_by: [{ createdAt: 'desc' }],\n },\n {\n where,\n aggregateWhere: legacyAggregateWhere,\n order_by: [{ createdAt: 'desc' }],\n },\n );\n\n const scopedRows = this.applyHookFilter(this.toRateManagerListItems(result), filter?.hasHook);\n\n const sorted = scopedRows.sort((a, b) => {\n const av =\n orderBy === 'currentDelegatedBalance'\n ? toSafeBigInt(a.aggregate?.currentDelegatedBalance)\n : toSafeBigInt(a.aggregate?.totalFilledVolume);\n const bv =\n orderBy === 'currentDelegatedBalance'\n ? toSafeBigInt(b.aggregate?.currentDelegatedBalance)\n : toSafeBigInt(b.aggregate?.totalFilledVolume);\n\n const aggregateCmp = compareBigInt(av, bv, direction);\n if (aggregateCmp !== 0) return aggregateCmp;\n\n const createdAtCmp = compareBigInt(\n toSafeBigInt(a.manager.createdAt),\n toSafeBigInt(b.manager.createdAt),\n 'desc',\n );\n if (createdAtCmp !== 0) return createdAtCmp;\n\n return a.manager.rateManagerId.localeCompare(b.manager.rateManagerId);\n });\n\n return sorted.slice(offset, offset + limit);\n }\n\n const result = await this.queryRateManagerList(\n {\n where,\n aggregateWhere,\n order_by: this.buildOrderBy(pagination),\n limit,\n offset,\n },\n {\n where,\n aggregateWhere: legacyAggregateWhere,\n order_by: this.buildOrderBy(pagination),\n limit,\n offset,\n },\n );\n\n return this.applyHookFilter(this.toRateManagerListItems(result), filter?.hasHook);\n }\n\n async fetchRateManagerDetail(\n rateManagerId: string,\n options?: { statsLimit?: number; rateManagerAddress?: string | null },\n ): Promise<RateManagerDetail | null> {\n if (!rateManagerId) return null;\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n const baseVariables = {\n managerWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n rateWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n aggregateWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerAddressScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n statsWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n delegationWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n statsLimit: options?.statsLimit ?? 20,\n };\n const legacyVariables = {\n ...baseVariables,\n floorWhere: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n };\n\n let managerRaw: RateManagerEntity | undefined;\n let scopedRates: RateManagerRateEntity[] = [];\n let scopedRecentStats: ManagerStatsEntity[] = [];\n let scopedDelegations: RateManagerDelegationEntity[] = [];\n let aggregate: ManagerAggregateStatsEntity | null = null;\n\n try {\n const result = await this.client.query<{\n RateManager?: RateManagerEntity[];\n RateManagerRate?: RateManagerRateEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n ManagerStats?: ManagerStatsEntity[];\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: RATE_MANAGER_DETAIL_QUERY,\n variables: baseVariables,\n });\n\n managerRaw = result.RateManager?.[0];\n if (!managerRaw) return null;\n const scopedRateManagerAddress = normalizeAddress(managerRaw.rateManagerAddress);\n scopedRates = (result.RateManagerRate ?? []).filter(\n (rate) => normalizeAddress(rate.rateManagerAddress) === scopedRateManagerAddress,\n );\n scopedRecentStats = (result.ManagerStats ?? []).filter((stats) => {\n const statsRateManagerAddress = normalizeAddress(stats.rateManagerAddress);\n return !statsRateManagerAddress || statsRateManagerAddress === scopedRateManagerAddress;\n });\n scopedDelegations = (result.Deposit ?? [])\n .map((deposit) => toDelegationEntityFromDeposit(deposit))\n .filter((delegation): delegation is RateManagerDelegationEntity => Boolean(delegation))\n .filter(\n (delegation) =>\n normalizeAddress(delegation.rateManagerAddress) === scopedRateManagerAddress,\n );\n aggregate =\n (result.ManagerAggregateStats ?? []).find(\n (stats) =>\n (normalizeAddress(stats.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(stats.id)) === scopedRateManagerAddress,\n ) ??\n result.ManagerAggregateStats?.[0] ??\n null;\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManager?: RateManagerEntity[];\n RateManagerRate?: RateManagerRateEntity[];\n ManagerAggregateStats?: ManagerAggregateStatsEntity[];\n ManagerStats?: ManagerStatsEntity[];\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_DETAIL_QUERY,\n variables: legacyVariables,\n });\n\n managerRaw = legacyResult.RateManager?.[0];\n if (!managerRaw) return null;\n const scopedRateManagerAddress = normalizeAddress(managerRaw.rateManagerAddress);\n scopedRates = (legacyResult.RateManagerRate ?? []).filter(\n (rate) => normalizeAddress(rate.rateManagerAddress) === scopedRateManagerAddress,\n );\n scopedRecentStats = (legacyResult.ManagerStats ?? []).filter((stats) => {\n const statsRateManagerAddress = normalizeAddress(stats.rateManagerAddress);\n return !statsRateManagerAddress || statsRateManagerAddress === scopedRateManagerAddress;\n });\n scopedDelegations = (legacyResult.RateManagerDelegation ?? []).filter(\n (delegation) =>\n normalizeAddress(delegation.rateManagerAddress) === scopedRateManagerAddress,\n );\n aggregate =\n (legacyResult.ManagerAggregateStats ?? []).find(\n (stats) =>\n (normalizeAddress(stats.rateManagerAddress) ||\n extractRateManagerAddressFromScopedId(stats.id)) === scopedRateManagerAddress,\n ) ??\n legacyResult.ManagerAggregateStats?.[0] ??\n null;\n }\n\n if (!managerRaw) return null;\n const manager = normalizeRateManagerEntity(managerRaw);\n\n return {\n manager,\n rates: scopedRates,\n aggregate,\n recentStats: scopedRecentStats,\n delegations: scopedDelegations,\n };\n }\n\n async fetchRateManagerDelegations(\n rateManagerId: string,\n pagination?: RateManagerDelegationPaginationOptions,\n ): Promise<RateManagerDelegationEntity[]> {\n if (!rateManagerId) return [];\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(pagination?.rateManagerAddress);\n\n const variables = {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? { rateManagerAddress: { _eq: normalizedRateManagerAddress } }\n : {}),\n },\n order_by: this.buildDelegationOrderBy(pagination),\n limit: pagination?.limit ?? DEFAULT_LIMIT,\n offset: pagination?.offset ?? 0,\n };\n\n try {\n const result = await this.client.query<{\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: RATE_MANAGER_DELEGATIONS_QUERY,\n variables,\n });\n\n return (result.Deposit ?? [])\n .map((deposit) => toDelegationEntityFromDeposit(deposit))\n .filter((delegation): delegation is RateManagerDelegationEntity => Boolean(delegation));\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_RATE_MANAGER_DELEGATIONS_QUERY,\n variables: {\n ...variables,\n order_by: this.buildLegacyDelegationOrderBy(pagination),\n },\n });\n\n return legacyResult.RateManagerDelegation ?? [];\n }\n }\n\n async fetchManagerDailySnapshots(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<ManagerDailySnapshotEntity[]> {\n if (!rateManagerId) return [];\n\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n try {\n const result = await this.client.query<{\n ManagerDailySnapshot?: ManagerDailySnapshotEntity[];\n }>({\n query: MANAGER_DAILY_SNAPSHOTS_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ dayTimestamp: 'asc' }],\n limit: options?.limit ?? 365,\n },\n });\n\n return result.ManagerDailySnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n // ManagerDailySnapshot entity may not exist on older indexer versions\n return [];\n }\n }\n\n async fetchDelegationForDeposit(\n depositId: string,\n options?: { escrowAddress?: string | null },\n ): Promise<RateManagerDelegationEntity | null> {\n if (!depositId) return null;\n const normalizedDepositId = normalizeCompositeDepositId(depositId, options?.escrowAddress);\n\n try {\n const result = await this.client.query<{\n Deposit?: Array<\n Pick<\n DepositEntity,\n 'id' | 'chainId' | 'rateManagerId' | 'rateManagerAddress' | 'delegatedAt' | 'updatedAt'\n >\n >;\n }>({\n query: DEPOSIT_DELEGATION_QUERY,\n variables: {\n depositId: normalizedDepositId,\n },\n });\n\n const delegationDeposit = result.Deposit?.[0];\n if (!delegationDeposit) {\n return null;\n }\n return toDelegationEntityFromDeposit(delegationDeposit) ?? null;\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerDelegation?: RateManagerDelegationEntity[];\n }>({\n query: LEGACY_DEPOSIT_DELEGATION_QUERY,\n variables: {\n depositId: normalizedDepositId,\n },\n });\n\n return legacyResult.RateManagerDelegation?.[0] ?? null;\n }\n }\n\n async fetchManualRateUpdates(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<ManualRateUpdateEntity[]> {\n if (!rateManagerId) return [];\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n\n try {\n const result = await this.client.query<{\n RateManagerV1_RateManagerRateUpdated?: ManualRateUpdateEntity[];\n }>({\n query: MANUAL_RATE_UPDATES_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ id: 'desc' }],\n limit: options?.limit ?? 100,\n },\n });\n // Normalize aliased fields — fixture endpoints may not support GraphQL field aliases,\n // so fall back from alias names to canonical field names.\n return (result.RateManagerV1_RateManagerRateUpdated ?? [])\n .map((e) => ({\n ...e,\n currency: e.currency ?? e.currencyCode ?? '',\n minRate: e.minRate ?? e.rate ?? '0',\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n\n async fetchOracleConfigUpdates(\n rateManagerId: string,\n options?: { limit?: number; rateManagerAddress?: string | null },\n ): Promise<OracleConfigUpdateEntity[]> {\n if (!rateManagerId) return [];\n const normalizedId = normalizeRateManagerId(rateManagerId);\n const normalizedRateManagerAddress = normalizeAddress(options?.rateManagerAddress);\n const limit = options?.limit ?? 100;\n\n try {\n const depositScopes = await this.fetchHistoricalRateManagerDepositScopes(\n normalizedId,\n normalizedRateManagerAddress || undefined,\n );\n if (!depositScopes.length) {\n return [];\n }\n const scopedKeys = new Set(depositScopes.map((scope) => buildDepositScopeKey(scope)));\n\n const result = await this.client.query<{\n EscrowV2_DepositOracleRateConfigSet?: OracleConfigUpdateEntity[];\n }>({\n query: ORACLE_CONFIG_UPDATES_QUERY,\n variables: {\n where: {\n _or: depositScopes.map((scope) => ({\n _and: [\n { depositId: { _eq: scope.depositIdOnContract } },\n { escrow: { _eq: scope.escrow } },\n ],\n })),\n },\n order_by: [{ id: 'desc' }],\n limit,\n },\n });\n return (result.EscrowV2_DepositOracleRateConfigSet ?? [])\n .filter((event) => {\n const escrow = normalizeAddress(event.escrow);\n const depositIdOnContract =\n event.depositIdOnContract ?? (event as any).depositId?.toString?.() ?? '';\n if (!escrow || !depositIdOnContract) return false;\n return scopedKeys.has(\n buildDepositScopeKey({\n escrow,\n depositIdOnContract,\n }),\n );\n })\n .map((e) => ({\n ...e,\n rateManagerId: normalizedId,\n escrow: normalizeAddress(e.escrow) || undefined,\n currency: e.currency ?? e.currencyCode ?? '',\n depositIdOnContract: e.depositIdOnContract ?? (e as any).depositId ?? '',\n adapter: e.adapter ?? '',\n spreadBps: e.spreadBps ?? 0,\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\n } catch (error) {\n if (isSchemaCompatibilityError(error)) {\n // Older indexers without escrow-scoped V2 oracle updates cannot be\n // queried safely by depositId alone because deposit ids are reused\n // across escrows. Fall through to the legacy V1 query instead.\n } else {\n throw error;\n }\n\n const legacyResult = await this.client.query<{\n RateManagerV1_DepositorFloorSet?: OracleConfigUpdateEntity[];\n }>({\n query: LEGACY_ORACLE_CONFIG_UPDATES_QUERY,\n variables: {\n where: {\n rateManagerId: { _eq: normalizedId },\n ...(normalizedRateManagerAddress\n ? {\n id: {\n _ilike: buildRateManagerScopedIdPattern(\n normalizedId,\n normalizedRateManagerAddress,\n ),\n },\n }\n : {}),\n },\n order_by: [{ id: 'desc' }],\n limit,\n },\n });\n\n return (legacyResult.RateManagerV1_DepositorFloorSet ?? [])\n .map((e) => ({\n ...e,\n currency: e.currency ?? e.currencyCode ?? '',\n depositIdOnContract: e.depositIdOnContract ?? (e as any).depositId ?? '',\n adapter: e.adapter ?? (e as any).oracleAdapter ?? '',\n spreadBps: e.spreadBps ?? e.floorSpreadBps ?? 0,\n }))\n .sort((a, b) => compareEventCursorIdsByRecency(a.id, b.id));\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, Hex, PublicClient, WalletClient } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport { base, hardhat } from 'viem/chains';\nimport type { Abi } from 'abitype';\n\nimport {\n ContractRouter,\n type EscrowContractContext,\n type OrchestratorContractContext,\n} from './ContractRouter';\nimport { IntentOperations } from './IntentOperations';\nimport { ProtocolViewerReader } from './ProtocolViewerReader';\nimport { VaultOperations } from './VaultOperations';\nimport {\n abiFunctionHasInput,\n abiTupleHasComponent,\n escrowCurrencyHasOracleConfig,\n getAbiFunction,\n isValidHexAddress,\n normalizeAddress,\n normalizeCurrencyTuples,\n normalizeOracleRateConfig,\n parseManagerFeeFromRead,\n parseEscrowAddressFromCompositeDepositId,\n parseRawDepositId,\n resolveAbiFunctionName,\n} from './clientUtils';\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport {\n defaultIndexerEndpoint,\n IndexerClient,\n type IndexerAuthTokenProvider,\n} from '../indexer/client';\nimport {\n IndexerDepositService,\n type DepositFilter,\n type PaginationOptions,\n} from '../indexer/service';\nimport {\n IndexerRateManagerService,\n type RateManagerDelegationPaginationOptions,\n type RateManagerFilter,\n type RateManagerPaginationOptions,\n} from '../indexer/rateManagerService';\nimport type {\n DepositEntity,\n DepositWithRelations,\n IntentEntity,\n IntentStatus,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n} from '../indexer/types';\nimport {\n fetchFulfillmentAndPayment,\n type FulfillmentAndPaymentResponse,\n} from '../indexer/intentVerification';\nimport { getContracts, getRateManagerContracts, type RuntimeEnv } from '../contracts';\nimport { apiGetQuote, apiGetTakerTier, apiPostDepositDetails } from '../adapters/api';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { currencyKeccak256 } from '../utils/currencyKeccak256';\nimport { appendReferrerFeeDisplayFields } from '../utils/referrerFeeDisplay';\nimport { assertValidReferrerFeeConfig } from '../referrerFeeConfig';\nimport type {\n QuoteRequest,\n GetQuoteResponse,\n PostDepositDetailsRequest,\n GetTakerTierRequest,\n GetTakerTierResponse,\n ReferrerFeeConfig,\n} from '../types';\nimport { ERC20_ABI } from '../utils/erc20';\nimport { encodeWithAttribution, sendTransactionWithAttribution } from '../utils/attribution';\nimport type {\n TxOverrides,\n PreparedTransaction,\n PreparedTransactionWithAbi,\n PrepareableMethod,\n} 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-curator-api-key',\n * indexerApiKey: 'your-indexer-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) */\n chainId: number;\n /** Optional RPC URL override (defaults to wallet's chain RPC) */\n rpcUrl?: string;\n /** Runtime environment: 'production', 'preproduction', 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 /** Curator API key for authenticated endpoints like registerPayeeDetails, signalIntent (sent as x-api-key to curator) */\n apiKey?: string;\n /** Optional bearer token for hybrid authentication */\n authorizationToken?: string;\n /** Optional async token provider for indexer auth in long-lived clients */\n getAuthorizationToken?: IndexerAuthTokenProvider;\n /** Optional API key for indexer proxy authentication (sent as x-api-key header) */\n indexerApiKey?: string;\n /** Timeout configuration */\n timeouts?: {\n /** API call timeout in milliseconds (default: 15000) */\n api?: number;\n };\n};\n\n/**\n * Parameters for signalIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type SignalIntentReferralFee = {\n /** Address receiving a referral fee */\n recipient: Address;\n /** Referral fee amount in precise units */\n fee: bigint | string;\n};\n\nexport type SignalIntentMethodParams = {\n /** The deposit ID to use */\n depositId: bigint | string;\n /** Amount of tokens to claim (in token units) */\n amount: bigint | string;\n /** Address to receive the tokens when fulfilled */\n toAddress: Address;\n /** Payment platform name (e.g., 'wise', 'revolut') */\n processorName: string;\n /** Hashed payee details (from deposit) */\n payeeDetails: string;\n /** Fiat currency code (e.g., 'USD', 'EUR') */\n fiatCurrencyCode: string;\n /** Agreed conversion rate (18 decimals) */\n conversionRate: bigint | string;\n /** Optional referral fee recipients paid by the taker */\n referralFees?: SignalIntentReferralFee[];\n /** @deprecated Use referralFees instead */\n referrer?: Address;\n /** @deprecated Use referralFees instead */\n referrerFee?: bigint | string;\n /** Optional referrer fee configuration for redirect-flow integrations */\n referrerFeeConfig?: ReferrerFeeConfig;\n /** Optional hook contract to call after signaling */\n postIntentHook?: Address;\n /** Optional data for pre-intent hook (defaults to '0x') */\n preIntentHookData?: `0x${string}`;\n /** Optional data to pass to the hook */\n data?: `0x${string}`;\n /** Optional escrow override (auto-routes orchestrator when provided) */\n escrowAddress?: Address;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Pre-obtained signature (if not auto-fetching) */\n gatingServiceSignature?: `0x${string}`;\n /** Signature expiration timestamp */\n signatureExpiration?: bigint | string;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n};\n\n/**\n * Parameters for cancelIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type CancelIntentMethodParams = {\n /** The intent hash to cancel (0x-prefixed, 32 bytes) */\n intentHash: `0x${string}`;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n};\n\n/**\n * Parameters for fulfillIntent method.\n * Used by both the direct call and .prepare() variants.\n */\nexport type FulfillIntentMethodParams = {\n /** The intent hash to fulfill (0x-prefixed, 32 bytes) */\n intentHash: `0x${string}`;\n /** Payment proof from Reclaim (object or JSON string) */\n proof: Record<string, unknown> | string;\n /** Allowed timestamp variance in ms (default: 300000ms) */\n timestampBufferMs?: string;\n /** Override attestation service URL */\n attestationServiceUrl?: string;\n /** Optional orchestrator override */\n orchestratorAddress?: Address;\n /** Data to pass to post-intent hook */\n postIntentHookData?: `0x${string}`;\n /** Optional viem transaction overrides */\n txOverrides?: TxOverrides;\n /** Lifecycle callbacks for UI updates */\n callbacks?: {\n onAttestationStart?: () => void;\n onTxSent?: (hash: Hash) => void;\n onTxMined?: (hash: Hash) => void;\n };\n /** Precomputed attestation values (payment proof + verification data) */\n precomputedAttestation?: {\n paymentProof: Hex;\n verificationData: Hex;\n };\n};\n\n/** Inline oracle rate config for a currency entry. */\nexport type CurrencyOracleRateConfig = {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n};\n\n/** On-chain currency tuple shape passed to EscrowV2 contract methods. */\nexport type OnchainCurrencyEntry = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: CurrencyOracleRateConfig;\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 * | `registerPayeeDetails()` | Register payee details with curator (returns hashed IDs) |\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/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 * // Step 1: Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * });\n *\n * // Step 2: 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 * payeeDetailsHashes: hashedOnchainIds,\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 /** EscrowV2 contract address (if deployed) */\n readonly escrowV2Address?: Address;\n /** EscrowV2 ABI */\n readonly escrowV2Abi?: Abi;\n /** All supported upgraded escrow addresses (current first, then historical) */\n readonly escrowAddresses: Address[];\n /** Orchestrator contract address (handles intent signaling/fulfillment) */\n readonly orchestratorAddress?: Address;\n /** Orchestrator contract ABI */\n readonly orchestratorAbi?: Abi;\n /** OrchestratorV2 address (if deployed) */\n readonly orchestratorV2Address?: Address;\n /** OrchestratorV2 ABI */\n readonly orchestratorV2Abi?: Abi;\n /** All supported upgraded orchestrator addresses (current first, then historical) */\n readonly orchestratorAddresses: Address[];\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 /** Ordered list of all ProtocolViewer instances (primary first, legacy fallback after) */\n private readonly _protocolViewerEntries: Array<{ address: Address; abi: Abi }>;\n /** DepositRateManagerRegistryV1 contract address */\n readonly rateManagerRegistryAddress?: Address;\n /** DepositRateManagerRegistryV1 ABI */\n readonly rateManagerRegistryAbi?: Abi;\n /** RateManagerV1 contract address */\n readonly rateManagerV1Address?: Address;\n /** RateManagerV1 ABI */\n readonly rateManagerV1Abi?: Abi;\n /** DepositRateManagerController contract address */\n readonly rateManagerControllerAddress?: Address;\n /** DepositRateManagerController ABI */\n readonly rateManagerControllerAbi?: Abi;\n /** OrchestratorRegistry address */\n readonly orchestratorRegistryAddress?: Address;\n /** OrchestratorRegistry ABI */\n readonly orchestratorRegistryAbi?: 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 private readonly _indexerRateManagerService: IndexerRateManagerService;\n private readonly _router: ContractRouter;\n private readonly _pvReader: ProtocolViewerReader;\n private readonly _vaultOps: VaultOperations;\n private readonly _intentOps: IntentOperations;\n private _rateManagerInitError?: Error;\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\n | string\n | undefined;\n // Chain-specific default RPC URLs\n const defaultRpcUrls: Record<number, string> = {\n [base.id]: 'https://mainnet.base.org',\n [hardhat.id]: 'http://127.0.0.1:8545',\n };\n const rpc =\n opts.rpcUrl ?? inferredRpc ?? defaultRpcUrls[opts.chainId] ?? 'https://mainnet.base.org';\n const chainMap: Record<number, any> = {\n [base.id]: base,\n [hardhat.id]: hardhat,\n };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({\n chain: selectedChain as any,\n transport: http(rpc, { batch: false }),\n }) as unknown as PublicClient;\n\n // contracts-v3 resolution (via contracts-v2 package)\n const { addresses, abis } = getContracts(this.chainId, this.runtimeEnv);\n const toAddress = (value?: string | null): Address | undefined =>\n this.isValidHexAddress(value) ? (value as Address) : undefined;\n const uniqAddresses = (values: Array<Address | undefined>): Address[] => {\n const seen = new Set<string>();\n const out: Address[] = [];\n for (const value of values) {\n if (!value) continue;\n const key = value.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(value);\n }\n return out;\n };\n this.escrowV2Address = toAddress((addresses as any).escrowV2 ?? addresses.escrow);\n this.escrowV2Abi = ((abis as any).escrowV2 ?? abis.escrow) as Abi | undefined;\n this.orchestratorV2Address = toAddress(\n (addresses as any).orchestratorV2 ?? addresses.orchestrator,\n );\n this.orchestratorV2Abi = ((abis as any).orchestratorV2 ?? abis.orchestrator) as Abi | undefined;\n\n const configuredEscrowAddresses = ((addresses as any).escrowAddresses ?? [])\n .map((value: string) => toAddress(value))\n .filter(Boolean) as Address[];\n const configuredOrchestratorAddresses = ((addresses as any).orchestratorAddresses ?? [])\n .map((value: string) => toAddress(value))\n .filter(Boolean) as Address[];\n\n this.escrowAddresses = uniqAddresses([\n this.escrowV2Address ?? toAddress(addresses.escrow),\n ...configuredEscrowAddresses,\n ]);\n\n this.escrowAddress =\n this.escrowV2Address ?? toAddress(addresses.escrow) ?? this.escrowAddresses[0];\n this.escrowAbi = (this.escrowV2Abi ?? abis.escrow) as Abi;\n if (!this.escrowAddress || !this.escrowAbi) {\n throw new Error('Escrow not available for this chain/environment');\n }\n\n this.orchestratorAddresses = uniqAddresses([\n this.orchestratorV2Address ?? toAddress(addresses.orchestrator),\n ...configuredOrchestratorAddresses,\n ]);\n\n this.orchestratorAddress =\n this.orchestratorV2Address ??\n toAddress(addresses.orchestrator) ??\n this.orchestratorAddresses[0];\n this.orchestratorAbi =\n ((abis as any).orchestrator as Abi | undefined) ?? this.orchestratorV2Abi;\n\n this.unifiedPaymentVerifier = toAddress(\n (addresses as any).unifiedPaymentVerifierV2 ?? addresses.unifiedPaymentVerifier,\n );\n this.protocolViewerAddress = toAddress((addresses as any).protocolViewer);\n this.protocolViewerAbi = (abis as any).protocolViewer as Abi | undefined;\n\n // Build ordered PV entries array. On staging this contains [V2_PV, V1_PV].\n // On production it mirrors the single protocolViewerAddress/Abi.\n const resolvedPvEntries = (addresses as any).protocolViewerEntries as\n | Array<{ address: string; abi: Abi }>\n | undefined;\n if (resolvedPvEntries && resolvedPvEntries.length > 0) {\n this._protocolViewerEntries = resolvedPvEntries\n .map((e) => ({ address: toAddress(e.address), abi: e.abi }))\n .filter((e): e is { address: Address; abi: Abi } => Boolean(e.address));\n } else if (this.protocolViewerAddress && this.protocolViewerAbi) {\n this._protocolViewerEntries = [\n { address: this.protocolViewerAddress, abi: this.protocolViewerAbi },\n ];\n } else {\n this._protocolViewerEntries = [];\n }\n\n this.rateManagerV1Address = toAddress((addresses as any).rateManagerV1);\n this.rateManagerV1Abi = (abis as any).rateManagerV1 as Abi | undefined;\n this.orchestratorRegistryAddress = toAddress((addresses as any).orchestratorRegistry);\n this.orchestratorRegistryAbi = (abis as any).orchestratorRegistry as Abi | undefined;\n this.rateManagerRegistryAddress =\n toAddress((addresses as any).rateManagerRegistry) ?? this.rateManagerV1Address;\n this.rateManagerRegistryAbi =\n ((abis as any).rateManagerRegistry as Abi | undefined) ?? this.rateManagerV1Abi;\n this.rateManagerControllerAddress = toAddress((addresses as any).rateManagerController);\n this.rateManagerControllerAbi = (abis as any).rateManagerController as Abi | undefined;\n if (!this.rateManagerRegistryAddress || !this.rateManagerRegistryAbi) {\n try {\n const rateManagerContracts = getRateManagerContracts(this.chainId, this.runtimeEnv);\n this.rateManagerRegistryAddress = rateManagerContracts.addresses.registry as Address;\n this.rateManagerRegistryAbi = rateManagerContracts.abis.registry;\n if (!this.rateManagerControllerAddress && rateManagerContracts.addresses.controller) {\n this.rateManagerControllerAddress = rateManagerContracts.addresses.controller as Address;\n }\n if (!this.rateManagerControllerAbi && rateManagerContracts.abis.controller) {\n this.rateManagerControllerAbi = rateManagerContracts.abis.controller;\n }\n } catch (error) {\n this._rateManagerInitError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n this._router = new ContractRouter({\n escrowAddress: this.escrowAddress,\n escrowAbi: this.escrowAbi,\n escrowV2Address: this.escrowV2Address,\n escrowV2Abi: this.escrowV2Abi,\n escrowAddresses: this.escrowAddresses,\n orchestratorAddress: this.orchestratorAddress,\n orchestratorAbi: this.orchestratorAbi,\n orchestratorV2Address: this.orchestratorV2Address,\n orchestratorV2Abi: this.orchestratorV2Abi,\n orchestratorAddresses: this.orchestratorAddresses,\n });\n\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 runtimeToIndexerEnv: Record<RuntimeEnv, 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING'> = {\n production: 'PRODUCTION',\n preproduction: 'PREPRODUCTION',\n staging: 'STAGING',\n };\n const indexerEndpoint =\n opts.indexerUrl ?? defaultIndexerEndpoint(runtimeToIndexerEnv[this.runtimeEnv]);\n this._indexerClient = new IndexerClient(indexerEndpoint, {\n authorizationToken: opts.authorizationToken,\n getAuthorizationToken: opts.getAuthorizationToken,\n apiKey: opts.indexerApiKey,\n });\n this._indexerService = new IndexerDepositService(this._indexerClient);\n this._indexerRateManagerService = new IndexerRateManagerService(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 this._pvReader = new ProtocolViewerReader({\n getPublicClient: () => this.publicClient,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getProtocolViewerEntries: () => this._protocolViewerEntries,\n getEscrowAddresses: () => this.escrowAddresses,\n getIndexerService: () => this._indexerService,\n getRouterBuildProtocolViewerContexts: () =>\n this._router.buildProtocolViewerContexts.bind(this._router),\n host: {\n requireProtocolViewer: () => this.requireProtocolViewer(),\n protocolViewerFunctionInputCount: (functionName) =>\n this.protocolViewerFunctionInputCount(functionName),\n buildProtocolViewerContexts: (options) => this.buildProtocolViewerContexts(options),\n isProtocolViewerDepositPopulated: (view) => this.isProtocolViewerDepositPopulated(view),\n isProtocolViewerIntentPopulated: (view) => this.isProtocolViewerIntentPopulated(view),\n buildDepositViewFromEscrowDeposit: (rawDeposit, depositId) =>\n this.buildDepositViewFromEscrowDeposit(rawDeposit, depositId),\n getPvAccountDepositsFromIndexer: (owner) => this.getPvAccountDepositsFromIndexer(owner),\n getPvDepositById: (depositId, options) =>\n options === undefined\n ? this.getPvDepositById(depositId)\n : this.getPvDepositById(depositId, options),\n getEscrowContexts: () => this.getEscrowContexts(),\n lookupIntentRouting: (intentHash) => this.lookupIntentRouting(intentHash),\n },\n });\n this._vaultOps = new VaultOperations({\n getPublicClient: () => this.publicClient,\n getRateManagerRegistryAddress: () => this.rateManagerRegistryAddress,\n getRateManagerRegistryAbi: () => this.rateManagerRegistryAbi,\n getRateManagerControllerAddress: () => this.rateManagerControllerAddress,\n getRateManagerControllerAbi: () => this.rateManagerControllerAbi,\n getRateManagerInitError: () => this._rateManagerInitError,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n prepareEscrowTransaction: (tx) => this.prepareEscrowTransaction(tx),\n prepareContractTransaction: (tx) => this.prepareContractTransaction(tx),\n },\n });\n this._intentOps = new IntentOperations({\n getWalletClient: () => this.walletClient,\n getPublicClient: () => this.publicClient,\n getChainId: () => this.chainId,\n getRuntimeEnv: () => this.runtimeEnv,\n getBaseApiUrl: () => this.baseApiUrl,\n getApiKey: () => this.apiKey,\n getAuthorizationToken: () => this.authorizationToken,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getIndexerClient: () => this._indexerClient,\n getIndexerService: () => this._indexerService,\n getDefaultPreferV2: () => this._router.defaultPreferV2,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n resolveOrchestratorContext: (options) => this.resolveOrchestratorContext(options),\n resolveEscrowAddressOrThrow: (escrowAddress, depositId, methodName, options) =>\n this.resolveEscrowAddressOrThrow(escrowAddress, depositId, methodName, options),\n prepareResolvedOrchestratorTransaction: (tx) =>\n this.prepareResolvedOrchestratorTransaction(tx),\n getFulfillIntentInputs: (intentHash) => this.getFulfillIntentInputs(intentHash),\n getPvIntent: (intentHash) => this.getPvIntent(intentHash),\n },\n });\n }\n\n private isValidHexAddress(addr?: string | null): boolean {\n return isValidHexAddress(addr);\n }\n\n private normalizeAddress(addr?: string | null): Address | undefined {\n return normalizeAddress(addr);\n }\n\n private parseEscrowAddressFromCompositeDepositId(\n depositId: bigint | number | string,\n ): Address | undefined {\n return parseEscrowAddressFromCompositeDepositId(depositId);\n }\n\n private parseRawDepositId(depositId: bigint | number | string): bigint {\n return parseRawDepositId(depositId);\n }\n\n private normalizeOracleRateConfig(config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }): {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n } {\n return normalizeOracleRateConfig(config);\n }\n\n private escrowCurrencyHasOracleConfig(abi: Abi | undefined): boolean {\n return escrowCurrencyHasOracleConfig(abi);\n }\n\n /**\n * Normalizes currency tuples by appending an empty `oracleRateConfig` when the ABI\n * requires it and the caller hasn't provided one.\n */\n private normalizeCurrencyTuples(\n currencies: Array<{\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>,\n escrowAbi: Abi | undefined,\n ): Array<Record<string, unknown>> {\n return normalizeCurrencyTuples(currencies, escrowAbi);\n }\n\n supportsInlineOracleRateConfig(params?: {\n escrowAddress?: Address;\n preferV2?: boolean;\n }): boolean {\n return this._vaultOps.supportsInlineOracleRateConfig({\n escrowAddress: params?.escrowAddress,\n preferV2: params?.preferV2 ?? this._router.defaultPreferV2,\n });\n }\n\n private parseManagerFeeFromRead(result: unknown): bigint {\n return parseManagerFeeFromRead(result);\n }\n\n private getAbiFunction(abi: Abi | undefined, ...names: string[]): Record<string, unknown> | null {\n return getAbiFunction(abi, ...names);\n }\n\n private resolveAbiFunctionName(abi: Abi | undefined, names: string[]): string {\n return resolveAbiFunctionName(abi, names);\n }\n\n private abiTupleHasComponent(\n abi: Abi | undefined,\n functionName: string,\n componentName: string,\n ): boolean {\n return abiTupleHasComponent(abi, functionName, componentName);\n }\n\n private abiFunctionHasInput(\n abi: Abi | undefined,\n functionName: string,\n inputName: string,\n ): boolean {\n return abiFunctionHasInput(abi, functionName, inputName);\n }\n\n private resolveEscrowAddressOrThrow(\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\n options?: { preferV2?: boolean },\n ): Address {\n const resolved = escrowAddress ?? this.parseEscrowAddressFromCompositeDepositId(depositId);\n if (resolved) return resolved;\n if (options?.preferV2 !== undefined) {\n return this.resolveEscrowContext().address;\n }\n throw new Error(`${methodName} requires escrowAddress or composite depositId`);\n }\n\n private prepareCreateRateManagerTransaction(params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareCreateRateManagerTransaction(params);\n }\n\n private prepareSetVaultRateTransaction(params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultRateTransaction(params);\n }\n\n private prepareSetVaultRatesBatchTransaction(params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultRatesBatchTransaction(params);\n }\n\n private prepareSetOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetOracleRateConfigTransaction(params);\n }\n\n private prepareRemoveOracleRateConfigTransaction(params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareRemoveOracleRateConfigTransaction(params);\n }\n\n private prepareSetOracleRateConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetOracleRateConfigBatchTransaction(params);\n }\n\n private prepareUpdateCurrencyConfigBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareUpdateCurrencyConfigBatchTransaction(params);\n }\n\n private prepareDeactivateCurrenciesBatchTransaction(params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareDeactivateCurrenciesBatchTransaction(params);\n }\n\n private prepareSetVaultConfigTransaction(params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this._vaultOps.prepareSetVaultConfigTransaction(params);\n }\n\n private getEscrowContextByAddress(address?: Address): EscrowContractContext | undefined {\n return this._router.getEscrowContextByAddress(address);\n }\n\n private getOrchestratorContextByAddress(\n address?: Address,\n ): OrchestratorContractContext | undefined {\n return this._router.getOrchestratorContextByAddress(address);\n }\n\n private resolveEscrowContext(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n }): EscrowContractContext {\n return this._router.resolveEscrowContext({\n escrowAddress: options?.escrowAddress,\n depositId: options?.depositId,\n });\n }\n\n private async resolveEscrowContextForDepositWrite(options?: {\n escrowAddress?: Address;\n depositId?: bigint | number | string;\n preferV2?: boolean;\n methodName?: string;\n }): Promise<EscrowContractContext> {\n const explicitEscrow =\n options?.escrowAddress ??\n (options?.depositId !== undefined\n ? this.parseEscrowAddressFromCompositeDepositId(options.depositId)\n : undefined);\n if (explicitEscrow || options?.depositId === undefined) {\n return this.resolveEscrowContext(options);\n }\n\n const contexts = this.getEscrowContexts();\n if (contexts.length <= 1) {\n return this.resolveEscrowContext(options);\n }\n\n const rawDepositId = this.parseRawDepositId(options.depositId);\n const matches: EscrowContractContext[] = [];\n const probeErrors: unknown[] = [];\n for (const context of contexts) {\n try {\n const raw = await this.publicClient.readContract({\n address: context.address,\n abi: context.abi,\n functionName: 'getDeposit',\n args: [rawDepositId],\n });\n const parsed = this.buildDepositViewFromEscrowDeposit(raw, rawDepositId);\n if (this.isProtocolViewerDepositPopulated(parsed)) {\n matches.push(context);\n }\n } catch (error) {\n probeErrors.push(error);\n }\n }\n\n if (matches.length === 1) {\n return matches[0]!;\n }\n if (matches.length > 1) {\n throw new Error(\n `${options?.methodName ?? 'Deposit mutation'} is ambiguous for depositId ${rawDepositId.toString()}: found in multiple escrows. Pass escrowAddress or composite depositId.`,\n );\n }\n if (probeErrors.length > 0) {\n const probeFailureMessage = probeErrors\n .map((error) => (error instanceof Error ? error.message : String(error)))\n .join('; ');\n throw new Error(\n `${options?.methodName ?? 'Deposit mutation'} could not verify depositId ${rawDepositId.toString()} across configured escrows because one or more escrow probes failed: ${probeFailureMessage}`,\n );\n }\n\n // Staged fallback: when no escrow reports the deposit yet, preserve previous\n // default-routing behavior to avoid breaking immediate follow-up flows.\n return this.resolveEscrowContext(options);\n }\n\n private getEscrowContexts(): EscrowContractContext[] {\n return this._router.getEscrowContexts();\n }\n\n private resolveOrchestratorForEscrow(\n escrowAddress?: Address,\n preferV2 = false,\n ): OrchestratorContractContext | undefined {\n return this._router.resolveOrchestratorForEscrow(escrowAddress, preferV2);\n }\n\n private async lookupIntentRouting(intentHash: `0x${string}`): Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }> {\n try {\n const response = await this._indexerClient.query<{\n Intent?: Array<{ orchestratorAddress?: string | null; depositId?: string | null }>;\n }>({\n query: /* GraphQL */ `\n query IntentRouting($where: Intent_bool_exp, $limit: Int) {\n Intent(where: $where, limit: $limit) {\n orchestratorAddress\n depositId\n }\n }\n `,\n variables: {\n where: { intentHash: { _eq: intentHash.toLowerCase() } },\n limit: 1,\n },\n });\n const intent = response.Intent?.[0];\n const orchestratorAddress = this.normalizeAddress(intent?.orchestratorAddress ?? undefined);\n const escrowAddress =\n intent?.depositId && intent.depositId.includes('_')\n ? this.parseEscrowAddressFromCompositeDepositId(intent.depositId)\n : undefined;\n return { orchestratorAddress, escrowAddress };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown indexer routing error';\n throw new Error(`Failed to resolve intent routing for ${intentHash}: ${message}`);\n }\n }\n\n private async lookupIntentEscrowOnchain(intentHash: `0x${string}`): Promise<Address | undefined> {\n try {\n const view = await this.getPvIntent(intentHash);\n return this.normalizeAddress((view as any)?.intent?.escrow);\n } catch (error) {\n if (error instanceof Error && error.message === 'Intent not found') {\n return undefined;\n }\n const message = error instanceof Error ? error.message : 'Unknown on-chain routing error';\n throw new Error(`Failed to resolve intent escrow on-chain for ${intentHash}: ${message}`);\n }\n }\n\n private warnOrchestratorFallback(\n intentHash: `0x${string}`,\n source: string,\n error: unknown,\n ): void {\n const message = error instanceof Error ? error.message : 'Unknown routing error';\n console.warn(\n `[Zkp2pClient] ${source} failed for ${intentHash}; continuing with configured orchestrator fallback. ${message}`,\n );\n }\n\n private async resolveOrchestratorContext(options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n preferV2?: boolean;\n }): Promise<OrchestratorContractContext> {\n const explicit = this.getOrchestratorContextByAddress(options?.orchestratorAddress);\n if (explicit) return explicit;\n if (options?.orchestratorAddress) {\n const addr = options.orchestratorAddress;\n const abi = this.orchestratorV2Abi ?? this.orchestratorAbi;\n if (!abi) throw new Error('Orchestrator not available');\n return { address: addr, abi, version: 'v2' };\n }\n\n if (options?.intentHash) {\n try {\n const routing = await this.lookupIntentRouting(options.intentHash);\n const fromIntent = this.getOrchestratorContextByAddress(routing.orchestratorAddress);\n if (fromIntent) return fromIntent;\n if (routing.escrowAddress) {\n const fromIntentEscrow = this.resolveOrchestratorForEscrow(\n routing.escrowAddress,\n options.preferV2,\n );\n if (fromIntentEscrow) return fromIntentEscrow;\n }\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'Indexer intent routing lookup', error);\n }\n\n try {\n const onchainEscrow = await this.lookupIntentEscrowOnchain(options.intentHash);\n if (onchainEscrow) {\n const fromOnchainEscrow = this.resolveOrchestratorForEscrow(\n onchainEscrow,\n options.preferV2,\n );\n if (fromOnchainEscrow) return fromOnchainEscrow;\n }\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'On-chain intent escrow lookup', error);\n }\n }\n\n if (options?.escrowAddress) {\n const fromEscrow = this.resolveOrchestratorForEscrow(options.escrowAddress, options.preferV2);\n if (fromEscrow) return fromEscrow;\n }\n\n if (options?.intentHash) {\n const primaryAddress = this.orchestratorV2Address ?? this.orchestratorAddress;\n const primaryContext = this.getOrchestratorContextByAddress(primaryAddress);\n if (primaryContext) return primaryContext;\n if (primaryAddress) {\n const primaryAbi = this.orchestratorV2Abi ?? this.orchestratorAbi;\n if (primaryAbi) {\n return {\n address: primaryAddress,\n abi: primaryAbi,\n version: 'v2',\n };\n }\n }\n }\n\n const fallback = this.resolveOrchestratorForEscrow(undefined, options?.preferV2);\n if (fallback) return fallback;\n\n throw new Error('Orchestrator not available');\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 * Execute a prepared transaction (simulation + send).\n * Used internally by prepareable methods after preparation.\n */\n private async executePreparedTransaction(\n prepared: PreparedTransactionWithAbi,\n txOverrides?: TxOverrides,\n ): Promise<Hash> {\n const { referrer, ...overrides } = txOverrides ?? {};\n void referrer;\n\n // Simulate for validation\n await this.publicClient.simulateContract({\n address: prepared.to,\n abi: prepared.abi,\n functionName: prepared.functionName as any,\n args: prepared.args as any,\n account: this.walletClient.account!,\n ...(overrides as any),\n });\n\n // Send transaction (calldata already has attribution)\n return this.walletClient.sendTransaction({\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n account: this.walletClient.account!,\n chain: this.walletClient.chain,\n ...(overrides as any),\n }) as Promise<Hash>;\n }\n\n private prepareEscrowTransaction(opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n }): PreparedTransactionWithAbi {\n const escrowAddress = opts.escrowAddress ?? this.escrowAddress;\n const escrowAbi = opts.escrowAbi ?? this.escrowAbi;\n if (!escrowAddress || !escrowAbi) throw new Error('Escrow not available');\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: escrowAbi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: escrowAddress,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: escrowAbi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private prepareOrchestratorTransaction(opts: {\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n }): PreparedTransactionWithAbi {\n const orchestratorAddress = opts.orchestratorAddress ?? this.orchestratorAddress;\n const orchestratorAbi = opts.orchestratorAbi ?? this.orchestratorAbi;\n if (!orchestratorAddress || !orchestratorAbi) throw new Error('Orchestrator not available');\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: orchestratorAbi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: orchestratorAddress,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: orchestratorAbi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private prepareResolvedOrchestratorTransaction(opts: {\n orchestrator: OrchestratorContractContext;\n functionNames: string[];\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): PreparedTransactionWithAbi {\n const functionName = this.resolveAbiFunctionName(opts.orchestrator.abi, opts.functionNames);\n return this.prepareOrchestratorTransaction({\n functionName,\n args: opts.args,\n txOverrides: opts.txOverrides,\n value: opts.value,\n orchestratorAddress: opts.orchestrator.address,\n orchestratorAbi: opts.orchestrator.abi,\n });\n }\n\n private prepareContractTransaction(opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): PreparedTransactionWithAbi {\n const { referrer, value } = opts.txOverrides ?? {};\n const data = encodeWithAttribution(\n {\n abi: opts.abi,\n functionName: opts.functionName as any,\n args: opts.args ?? [],\n },\n referrer,\n );\n\n return {\n to: opts.address,\n data,\n value: opts.value ?? value ?? 0n,\n chainId: this.chainId,\n abi: opts.abi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n };\n }\n\n private buildContractMethod<TParams extends { txOverrides?: TxOverrides }>(\n resolveContract: () => { address?: Address; abi?: Abi; label: string },\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const contract = resolveContract();\n if (!contract.address || !contract.abi) {\n throw new Error(`${contract.label} not available`);\n }\n const prepared = this.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const contract = resolveContract();\n if (!contract.address || !contract.abi) {\n throw new Error(`${contract.label} not available`);\n }\n const prepared = this.prepareContractTransaction({\n address: contract.address,\n abi: contract.abi,\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n private buildEscrowMethod<\n TParams extends {\n txOverrides?: TxOverrides;\n escrowAddress?: Address;\n escrowAbi?: Abi;\n depositId?: bigint | number | string;\n },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: functionName,\n });\n const prepared = this.prepareEscrowTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n escrowAddress: params.escrowAddress ?? escrowContext.address,\n escrowAbi: params.escrowAbi ?? escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: functionName,\n });\n const prepared = this.prepareEscrowTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n escrowAddress: params.escrowAddress ?? escrowContext.address,\n escrowAbi: params.escrowAbi ?? escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n private buildOrchestratorMethod<\n TParams extends {\n txOverrides?: TxOverrides;\n orchestratorAddress?: Address;\n orchestratorAbi?: Abi;\n escrowAddress?: Address;\n preferV2?: boolean;\n },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n buildValue?: (params: TParams) => bigint | undefined,\n ): PrepareableMethod<TParams, Hash> {\n return Object.assign(\n async (params: TParams): Promise<Hash> => {\n const orchestratorContext = await this.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2,\n });\n const prepared = this.prepareOrchestratorTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n orchestratorAddress: params.orchestratorAddress ?? orchestratorContext.address,\n orchestratorAbi: params.orchestratorAbi ?? orchestratorContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: TParams): Promise<PreparedTransaction> => {\n const orchestratorContext = await this.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2,\n });\n const prepared = this.prepareOrchestratorTransaction({\n functionName,\n args: buildArgs(params),\n txOverrides: params.txOverrides,\n value: buildValue?.(params),\n orchestratorAddress: params.orchestratorAddress ?? orchestratorContext.address,\n orchestratorAbi: params.orchestratorAbi ?? orchestratorContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT QUERIES (RPC-first via ProtocolViewer) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Fetches all deposits owned by the connected wallet.\n *\n * This is the primary method for liquidity providers to query their deposits.\n * Uses ProtocolViewer when the active ABI exposes `getAccountDeposits`,\n * otherwise falls back to indexer-backed deposit relations.\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.\n *\n * Uses ProtocolViewer when available for this method, otherwise falls back\n * to indexer-backed deposit relations.\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(\n depositId: bigint | number | string,\n paymentMethodHash: string,\n ): 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 rateManagerService = this._indexerRateManagerService;\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: (\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n ): 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: (\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): 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: (\n id: string,\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): Promise<DepositWithRelations | null> => {\n return service.fetchDepositWithRelations(id, options);\n },\n\n /**\n * Fetches intents for multiple deposits.\n */\n getIntentsForDeposits: (\n depositIds: string[],\n statuses: IntentStatus[] = ['SIGNALED'],\n ): 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 a single intent by hash.\n */\n getIntentByHash: (intentHash: string): Promise<IntentEntity | null> => {\n return service.fetchIntentByHash(intentHash);\n },\n\n /**\n * Fetches intents that have expired.\n */\n getExpiredIntents: (params: {\n now: bigint | string;\n depositIds: string[];\n limit?: number;\n }): 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 gross and net fulfillment amounts for an intent.\n */\n getIntentFulfillmentAmounts: (\n intentHash: string,\n ): Promise<IntentFulfillmentAmountsEntity | null> => {\n return service.fetchIntentFulfillmentAmounts(intentHash);\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: (\n payeeHash: string,\n options: {\n paymentMethodHash?: string;\n limit?: number;\n includeIntents?: boolean;\n intentStatuses?: IntentStatus[];\n } = {},\n ): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByPayeeHash(payeeHash, options);\n },\n\n /**\n * Fetches deposits by their composite IDs.\n * @param ids - Array of composite IDs in format \"chainId_escrowAddress_depositId\"\n */\n getDepositsByIds: (ids: string[]): Promise<DepositEntity[]> => {\n return service.fetchDepositsByIds(ids);\n },\n\n /**\n * Fetches deposits by their composite IDs with all related data.\n * @param ids - Array of composite IDs in format \"chainId_escrowAddress_depositId\"\n */\n getDepositsByIdsWithRelations: (\n ids: string[],\n options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] },\n ): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByIdsWithRelations(ids, options);\n },\n\n /**\n * Fetches rate managers (vaults) with aggregate stats.\n */\n getRateManagers: (pagination?: RateManagerPaginationOptions, filter?: RateManagerFilter) => {\n return rateManagerService.fetchRateManagers(pagination, filter);\n },\n\n /**\n * Fetches detail for a single rate manager.\n */\n getRateManagerDetail: (\n rateManagerId: string,\n options?: {\n statsLimit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchRateManagerDetail(rateManagerId, options);\n },\n\n /**\n * Fetches delegated deposits for a rate manager.\n */\n getRateManagerDelegations: (\n rateManagerId: string,\n pagination?: RateManagerDelegationPaginationOptions,\n ) => {\n return rateManagerService.fetchRateManagerDelegations(rateManagerId, pagination);\n },\n\n /**\n * Fetches delegation record for a specific composite deposit ID.\n */\n getDelegationForDeposit: (depositId: string, options?: { escrowAddress?: string | null }) => {\n return rateManagerService.fetchDelegationForDeposit(depositId, options);\n },\n\n /**\n * Fetches daily snapshots for a rate manager (vault).\n */\n getManagerDailySnapshots: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchManagerDailySnapshots(rateManagerId, options);\n },\n\n getManualRateUpdates: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchManualRateUpdates(rateManagerId, options);\n },\n\n getOracleConfigUpdates: (\n rateManagerId: string,\n options?: {\n limit?: number;\n rateManagerAddress?: string | null;\n },\n ) => {\n return rateManagerService.fetchOracleConfigUpdates(rateManagerId, options);\n },\n\n /**\n * Fetches chronological fund activities for a specific deposit.\n */\n getDepositFundActivities: (depositId: string): Promise<DepositFundActivityEntity[]> => {\n return service.fetchDepositFundActivities(depositId);\n },\n\n /**\n * Fetches fund activities across all deposits for a maker address.\n */\n getMakerFundActivities: (\n depositor: string,\n limit?: number,\n ): Promise<DepositFundActivityEntity[]> => {\n return service.fetchMakerFundActivities(depositor, limit);\n },\n\n /**\n * Fetches daily snapshots for a deposit, ordered by day ascending.\n */\n getDepositDailySnapshots: (\n depositId: string,\n limit?: number,\n ): Promise<DepositDailySnapshotEntity[]> => {\n return service.fetchDepositDailySnapshots(depositId, limit);\n },\n\n /**\n * Performs a raw GraphQL query against the indexer.\n */\n query: <T>(params: { query: string; variables?: Record<string, unknown> }): Promise<T> => {\n return client.query(params);\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 override\n * @param params.escrowAddress - Escrow context used for default spender resolution\n * @param params.preferV2 - Prefer EscrowV2 for default spender resolution\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: {\n token: Address;\n amount: bigint;\n spender?: Address;\n escrowAddress?: Address;\n preferV2?: boolean;\n maxApprove?: boolean;\n txOverrides?: TxOverrides;\n }): 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 =\n params.spender ??\n this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n preferV2: params.preferV2 ?? this._router.defaultPreferV2,\n }).address;\n const allowance = (await this.publicClient.readContract({\n address: params.token,\n abi: ERC20_ABI as any,\n functionName: 'allowance',\n args: [owner, spender],\n })) 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 * Registers payee details with the curator API and returns hashed on-chain IDs.\n *\n * This is a standalone method decoupled from deposit creation. Call this before\n * `createDeposit` to obtain `payeeDetailsHashes`, or use it independently to\n * register maker payment details with the curator service.\n *\n * @param params.processorNames - Payment platforms (e.g., ['wise', 'revolut'])\n * @param params.depositData - Payee details per processor (e.g., [{ email: '...' }])\n * @returns The posted deposit details and their corresponding hashed on-chain IDs\n *\n * @example\n * ```typescript\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * });\n * // Then pass hashedOnchainIds to createDeposit\n * ```\n */\n async registerPayeeDetails(params: {\n processorNames: string[];\n depositData: { [key: string]: string }[];\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n hashedOnchainIds: string[];\n }> {\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.depositData.length) {\n throw new Error('processorNames and depositData length mismatch');\n }\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }),\n );\n\n const apiResponses = await Promise.all(\n depositDetails.map((req) =>\n apiPostDepositDetails(\n req,\n baseApiUrl,\n this.apiTimeoutMs,\n this.apiKey,\n this.authorizationToken,\n ),\n ),\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 register payee details');\n }\n\n const hashedOnchainIds = apiResponses.map(\n (r: any) => r.responseObject?.hashedOnchainId as string,\n );\n\n return { depositDetails, hashedOnchainIds };\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 * 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.payeeDetailsHashes - Pre-computed hashed on-chain IDs (from registerPayeeDetails). When provided, skips the curator API call entirely.\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 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 * payeeDetailsHashes: hashedOnchainIds, // from registerPayeeDetails()\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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; hash: Hash }> {\n const { depositDetails, prepared } = await this.prepareCreateDepositInternal(params);\n const hash = await this.executePreparedTransaction(prepared, params.txOverrides);\n return { depositDetails, hash };\n }\n\n /**\n * Prepares a createDeposit transaction without sending it.\n *\n * Returns both the prepared transaction calldata and the posted deposit details\n * (including hashed on-chain IDs) needed for tracking.\n */\n async prepareCreateDeposit(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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; prepared: PreparedTransaction }> {\n const { depositDetails, prepared } = await this.prepareCreateDepositInternal(params);\n return {\n depositDetails,\n prepared: {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n },\n };\n }\n\n private async prepareCreateDepositInternal(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 payeeDetailsHashes?: string[];\n paymentMethodsOverride?: `0x${string}`[];\n paymentMethodDataOverride?: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currenciesOverride?: OnchainCurrencyEntry[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n prepared: PreparedTransactionWithAbi;\n }> {\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 depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }),\n );\n const hasOverrides = Boolean(\n params.paymentMethodsOverride ||\n params.paymentMethodDataOverride ||\n params.currenciesOverride,\n );\n\n let paymentMethods: `0x${string}`[];\n let paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n let currencies: OnchainCurrencyEntry[][];\n\n if (hasOverrides) {\n if (\n !params.paymentMethodsOverride ||\n !params.paymentMethodDataOverride ||\n !params.currenciesOverride\n ) {\n throw new Error(\n 'paymentMethodsOverride, paymentMethodDataOverride, and currenciesOverride must be provided together',\n );\n }\n if (\n params.paymentMethodsOverride.length !== params.paymentMethodDataOverride.length ||\n params.paymentMethodsOverride.length !== params.currenciesOverride.length\n ) {\n throw new Error(\n 'paymentMethodsOverride, paymentMethodDataOverride, and currenciesOverride length mismatch',\n );\n }\n\n paymentMethods = params.paymentMethodsOverride;\n paymentMethodData = params.paymentMethodDataOverride;\n currencies = params.currenciesOverride;\n } else {\n const methods = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n paymentMethods = params.processorNames.map((name) =>\n resolvePaymentMethodHashFromCatalog(name, methods),\n );\n const intentGatingService = getGatingServiceAddress(this.chainId, this.runtimeEnv);\n\n let hashedOnchainIds: string[];\n\n if (params.payeeDetailsHashes) {\n // Use pre-computed hashes (e.g., from registerPayeeDetails)\n if (params.payeeDetailsHashes.length !== params.processorNames.length) {\n throw new Error('payeeDetailsHashes length must match processorNames length');\n }\n hashedOnchainIds = params.payeeDetailsHashes;\n } else {\n // Register payee details with the curator when hashes are not provided\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const apiResponses = await Promise.all(\n depositDetails.map((req) =>\n apiPostDepositDetails(\n req,\n baseApiUrl,\n this.apiTimeoutMs,\n this.apiKey,\n this.authorizationToken,\n ),\n ),\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 hashedOnchainIds = apiResponses.map(\n (r: any) => r.responseObject?.hashedOnchainId as string,\n );\n }\n\n paymentMethodData = hashedOnchainIds.map((hid) => ({\n intentGatingService,\n payeeDetails: hid,\n data: '0x' as `0x${string}`,\n }));\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(\n `Currency ${currency} not supported by ${params.processorNames[i]}. Allowed: ${allowed.join(', ')}`,\n );\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) =>\n group.map((r) => ({ currency: r.currency as any, conversionRate: r.conversionRate })),\n );\n currencies = mapConversionRatesToOnchainMinRate(normalized as any, paymentMethods.length);\n }\n\n const escrowContext = this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n preferV2: this._router.defaultPreferV2,\n });\n\n // Normalize currency tuples to include oracleRateConfig when the ABI requires it\n const normalizedCurrencies = currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n\n const args = [\n {\n token: params.token,\n amount: params.amount,\n intentAmountRange: params.intentAmountRange,\n paymentMethods,\n paymentMethodData,\n currencies: normalizedCurrencies,\n delegate: (params.delegate ?? '0x0000000000000000000000000000000000000000') as Address,\n intentGuardian: (params.intentGuardian ??\n '0x0000000000000000000000000000000000000000') as Address,\n retainOnEmpty: Boolean(params.retainOnEmpty ?? false),\n },\n ];\n\n const prepared = this.prepareEscrowTransaction({\n functionName: 'createDeposit',\n args,\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n\n return { depositDetails, prepared };\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 readonly setAcceptingIntents = this.buildEscrowMethod<{\n depositId: bigint;\n accepting: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setAcceptingIntents', (params) => [params.depositId, params.accepting]);\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 readonly setIntentRange = this.buildEscrowMethod<{\n depositId: bigint;\n min: bigint;\n max: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setIntentRange', (params) => [params.depositId, { min: params.min, max: params.max }]);\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 readonly setCurrencyMinRate = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n minConversionRate: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setCurrencyMinRate', (params) => [\n params.depositId,\n params.paymentMethod,\n params.fiatCurrency,\n params.minConversionRate,\n ]);\n\n /**\n * Configure oracle-backed ARM spread pricing for one payment method/currency pair.\n * This is EscrowV2-only.\n */\n readonly setOracleRateConfig: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetOracleRateConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n config: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetOracleRateConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Remove oracle-backed ARM spread pricing for one payment method/currency pair.\n * This is EscrowV2-only.\n */\n readonly removeOracleRateConfig: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareRemoveOracleRateConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareRemoveOracleRateConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Configure oracle-backed ARM spread pricing in batch for one deposit.\n * This is EscrowV2-only.\n */\n readonly setOracleRateConfigBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetOracleRateConfigBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n configs: Array<\n Array<{\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetOracleRateConfigBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Batch update currency min-rate and oracle-config entries for an EscrowV2 deposit.\n */\n readonly updateCurrencyConfigBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareUpdateCurrencyConfigBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n updates: Array<\n Array<{\n code: `0x${string}`;\n minConversionRate: bigint | string;\n updateOracle: boolean;\n oracleRateConfig: {\n adapter: Address;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n }>\n >;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareUpdateCurrencyConfigBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Batch deactivate currencies for an EscrowV2 deposit.\n */\n readonly deactivateCurrenciesBatch: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareDeactivateCurrenciesBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n currencyCodes: `0x${string}`[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareDeactivateCurrenciesBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly addFunds = this.buildEscrowMethod<{\n depositId: bigint;\n amount: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('addFunds', (params) => [params.depositId, params.amount]);\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 readonly removeFunds = this.buildEscrowMethod<{\n depositId: bigint;\n amount: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('removeFunds', (params) => [params.depositId, params.amount]);\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 readonly withdrawDeposit = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('withdrawDeposit', (params) => [params.depositId]);\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 readonly setRetainOnEmpty = this.buildEscrowMethod<{\n depositId: bigint;\n retain: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setRetainOnEmpty', (params) => [params.depositId, params.retain]);\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 readonly setDelegate = this.buildEscrowMethod<{\n depositId: bigint;\n delegate: Address;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setDelegate', (params) => [params.depositId, params.delegate]);\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 readonly removeDelegate = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('removeDelegate', (params) => [params.depositId]);\n\n /**\n * Assign a deposit to a rate manager (vault) through the controller.\n */\n readonly setDepositRateManager = this.buildContractMethod<{\n escrow: Address;\n depositId: bigint;\n registry: Address;\n rateManagerId: Hex;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerControllerAddress,\n abi: this.rateManagerControllerAbi,\n label: 'Rate manager controller (staging only)',\n }),\n 'setDepositRateManager',\n (params) => {\n return [params.escrow, params.depositId, params.registry, params.rateManagerId];\n },\n );\n\n /**\n * Clear an existing rate manager delegation for a deposit.\n */\n readonly clearDepositRateManager = this.buildContractMethod<{\n escrow: Address;\n depositId: bigint;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerControllerAddress,\n abi: this.rateManagerControllerAbi,\n label: 'Rate manager controller (staging only)',\n }),\n 'clearDepositRateManager',\n (params) => {\n return [params.escrow, params.depositId];\n },\n );\n\n /**\n * Assign a deposit to a rate manager directly on EscrowV2.\n */\n readonly setRateManager = this.buildEscrowMethod<{\n depositId: bigint;\n rateManagerAddress: Address;\n rateManagerId: Hex;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setRateManager', (params) => {\n return [params.depositId, params.rateManagerAddress, params.rateManagerId];\n });\n\n /**\n * Clear a direct EscrowV2 rate manager assignment.\n */\n readonly clearRateManager = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('clearRateManager', (params) => {\n return [params.depositId];\n });\n\n /**\n * Create a new rate manager (vault).\n */\n readonly createRateManager: PrepareableMethod<\n {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareCreateRateManagerTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n config: {\n manager: Address;\n feeRecipient: Address;\n maxFee: bigint;\n fee: bigint;\n depositHook?: Address;\n minLiquidity?: bigint;\n name: string;\n uri: string;\n };\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareCreateRateManagerTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Set a manager floor for a single payment method/currency pair.\n */\n readonly setVaultMinRate: PrepareableMethod<\n {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultRateTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n paymentMethodHash: `0x${string}`;\n currencyHash: `0x${string}`;\n rate: bigint;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultRateTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Set manager floors in batch.\n */\n readonly setVaultMinRatesBatch: PrepareableMethod<\n {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultRatesBatchTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n paymentMethods: `0x${string}`[];\n currencies: `0x${string}`[][];\n rates: bigint[][];\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultRatesBatchTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Update vault manager fee.\n */\n readonly setVaultFee = this.buildContractMethod<{\n rateManagerId: Hex;\n newFee: bigint;\n txOverrides?: TxOverrides;\n }>(\n () => ({\n address: this.rateManagerRegistryAddress,\n abi: this.rateManagerRegistryAbi,\n label: 'Rate manager registry (staging only)',\n }),\n 'setFee',\n (params) => {\n return [params.rateManagerId, params.newFee];\n },\n );\n\n /**\n * Update vault manager/config metadata.\n */\n readonly setVaultConfig: PrepareableMethod<\n {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = this.prepareSetVaultConfigTransaction(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n rateManagerId: Hex;\n newManager: Address;\n newFeeRecipient: Address;\n newHook?: Address;\n newName: string;\n newUri: string;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = this.prepareSetVaultConfigTransaction(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Read controller delegation state for a deposit.\n */\n async getDepositRateManager(\n escrow: Address,\n depositId: bigint | number | string,\n ): Promise<{ registry: Address; rateManagerId: Hex }> {\n return this._vaultOps.getDepositRateManager(escrow, depositId);\n }\n\n /**\n * Read effective manager fee for a deposit.\n */\n async getManagerFee(escrow: Address, depositId: bigint | number | string): Promise<bigint> {\n return this._vaultOps.getManagerFee(escrow, depositId);\n }\n\n /**\n * Read the effective conversion rate on EscrowV2.\n */\n async getEffectiveRate(params: {\n escrow: Address;\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n fiatCurrency: `0x${string}`;\n }): Promise<bigint> {\n return this._vaultOps.getEffectiveRate(params);\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 readonly addPaymentMethods: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addPaymentMethods',\n });\n const normalizedCurrencies = params.currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addPaymentMethods',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.paymentMethodData,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethods: `0x${string}`[];\n paymentMethodData: {\n intentGatingService: Address;\n payeeDetails: string;\n data: `0x${string}`;\n }[];\n currencies: OnchainCurrencyEntry[][];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addPaymentMethods',\n });\n const normalizedCurrencies = params.currencies.map((group) =>\n this.normalizeCurrencyTuples(group, escrowContext.abi),\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addPaymentMethods',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethods,\n params.paymentMethodData,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly setPaymentMethodActive = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n isActive: boolean;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setPaymentMethodActive', (params) => [\n params.depositId,\n params.paymentMethod,\n params.isActive,\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 readonly removePaymentMethod = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setPaymentMethodActive', (params) => [params.depositId, params.paymentMethod, false]);\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 readonly addCurrencies: PrepareableMethod<\n {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addCurrencies',\n });\n const normalizedCurrencies = this.normalizeCurrencyTuples(\n params.currencies,\n escrowContext.abi,\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addCurrencies',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethod,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n paymentMethod: `0x${string}`;\n currencies: OnchainCurrencyEntry[];\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const escrowContext = await this.resolveEscrowContextForDepositWrite({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n methodName: 'addCurrencies',\n });\n const normalizedCurrencies = this.normalizeCurrencyTuples(\n params.currencies,\n escrowContext.abi,\n );\n const prepared = this.prepareEscrowTransaction({\n functionName: 'addCurrencies',\n args: [\n this.parseRawDepositId(params.depositId),\n params.paymentMethod,\n normalizedCurrencies,\n ],\n txOverrides: params.txOverrides,\n escrowAddress: escrowContext.address,\n escrowAbi: escrowContext.abi,\n });\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\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 readonly deactivateCurrency = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n currencyCode: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('deactivateCurrency', (params) => [\n params.depositId,\n params.paymentMethod,\n params.currencyCode,\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 readonly removeCurrency = this.buildEscrowMethod<{\n depositId: bigint;\n paymentMethod: `0x${string}`;\n currencyCode: `0x${string}`;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('deactivateCurrency', (params) => [\n params.depositId,\n params.paymentMethod,\n params.currencyCode,\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 readonly pruneExpiredIntents = this.buildEscrowMethod<{\n depositId: bigint;\n escrowAddress?: Address;\n txOverrides?: TxOverrides;\n }>('pruneExpiredIntents', (params) => [params.depositId]);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.signalIntent.prepare(params);\n * // Submit via relayer or inspect calldata\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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.referralFees - Optional referral fee recipients and fee amounts\n * @param params.referrer - Deprecated legacy single-referrer address\n * @param params.referrerFee - Deprecated legacy single-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 * // Execute directly\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 * // Or prepare for relayer submission\n * const prepared = await client.signalIntent.prepare({\n * depositId: 42n,\n * amount: 100_000000n,\n * toAddress: '0x...',\n * processorName: 'wise',\n * payeeDetails: '0x...',\n * fiatCurrencyCode: 'USD',\n * conversionRate: 1_020000000000000000n,\n * });\n * // prepared.to, prepared.data, prepared.value, prepared.chainId\n * ```\n */\n readonly signalIntent: PrepareableMethod<SignalIntentMethodParams, Hash> = Object.assign(\n async (params: SignalIntentMethodParams): Promise<Hash> => {\n const prepared = await this.prepareSignalIntent(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: SignalIntentMethodParams): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSignalIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare signalIntent transaction (all logic except simulation/send).\n * Returns the prepared transaction with encoded calldata.\n */\n private async prepareSignalIntent(\n params: SignalIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSignalIntent(params);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.cancelIntent.prepare({ intentHash });\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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 * @example\n * ```typescript\n * // Execute directly\n * const hash = await client.cancelIntent({ intentHash: '0x...' });\n *\n * // Or prepare for relayer submission\n * const prepared = await client.cancelIntent.prepare({ intentHash: '0x...' });\n * ```\n */\n readonly cancelIntent: PrepareableMethod<CancelIntentMethodParams, Hash> = Object.assign(\n async (params: CancelIntentMethodParams): Promise<Hash> => {\n const prepared = await this.prepareCancelIntent(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: CancelIntentMethodParams): Promise<PreparedTransaction> => {\n const prepared = await this.prepareCancelIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare cancelIntent transaction (all logic except simulation/send).\n */\n private async prepareCancelIntent(\n params: CancelIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareCancelIntent(params);\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 readonly releaseFundsToPayer: PrepareableMethod<\n { intentHash: `0x${string}`; orchestratorAddress?: Address; txOverrides?: TxOverrides },\n Hash\n > = Object.assign(\n async (params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareReleaseFundsToPayer(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareReleaseFundsToPayer(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n private async prepareReleaseFundsToPayer(params: {\n intentHash: `0x${string}`;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareReleaseFundsToPayer(params);\n }\n\n /**\n * Configure a pre-intent hook for a deposit on OrchestratorV2.\n */\n readonly setDepositPreIntentHook: PrepareableMethod<\n {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareSetDepositPreIntentHook(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSetDepositPreIntentHook(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Configure a whitelist hook for a deposit on OrchestratorV2.\n */\n readonly setDepositWhitelistHook: PrepareableMethod<\n {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareSetDepositWhitelistHook(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareSetDepositWhitelistHook(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Permissionless cleanup of orphaned intents on OrchestratorV2.\n */\n readonly cleanupOrphanedIntents: PrepareableMethod<\n {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n },\n Hash\n > = Object.assign(\n async (params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<Hash> => {\n const prepared = await this.prepareCleanupOrphanedIntents(params);\n return this.executePreparedTransaction(prepared, params.txOverrides);\n },\n {\n prepare: async (params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransaction> => {\n const prepared = await this.prepareCleanupOrphanedIntents(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n private async prepareSetDepositPreIntentHook(params: {\n depositId: bigint | number | string;\n preIntentHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSetDepositPreIntentHook(params);\n }\n\n private async prepareSetDepositWhitelistHook(params: {\n depositId: bigint | number | string;\n whitelistHook: Address;\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareSetDepositWhitelistHook(params);\n }\n\n private async prepareCleanupOrphanedIntents(params: {\n intentHashes: `0x${string}`[];\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n txOverrides?: TxOverrides;\n }): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareCleanupOrphanedIntents(params);\n }\n\n /**\n * Read configured pre-intent hook for a deposit from OrchestratorV2.\n */\n async getDepositPreIntentHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n return this._intentOps.getDepositPreIntentHook(depositId, options);\n }\n\n /**\n * Read configured whitelist hook for a deposit from OrchestratorV2.\n */\n async getDepositWhitelistHook(\n depositId: bigint | number | string,\n options?: { escrowAddress?: Address; orchestratorAddress?: Address },\n ): Promise<Address> {\n return this._intentOps.getDepositWhitelistHook(depositId, options);\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 * **Prepare Mode**: Use `.prepare()` to get the transaction calldata without sending:\n * ```typescript\n * const prepared = await client.fulfillIntent.prepare(params);\n * // Submit via relayer or inspect calldata\n * await relayer.submit({ to: prepared.to, data: prepared.data });\n * ```\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.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 * @example\n * ```typescript\n * // Execute directly\n * const hash = await client.fulfillIntent({\n * intentHash: '0x...',\n * proof: proofFromExtension,\n * });\n *\n * // Or prepare for relayer submission\n * const prepared = await client.fulfillIntent.prepare({\n * intentHash: '0x...',\n * proof: proofFromExtension,\n * });\n * // prepared.to, prepared.data, prepared.value, prepared.chainId\n * ```\n */\n readonly fulfillIntent: PrepareableMethod<FulfillIntentMethodParams, Hash> = Object.assign(\n async (params: FulfillIntentMethodParams): Promise<Hash> => {\n // Call onAttestationStart callback before preparation (includes attestation service call)\n params?.callbacks?.onAttestationStart?.();\n const prepared = await this.prepareFulfillIntent(params);\n const txHash = await this.executePreparedTransaction(prepared, params.txOverrides);\n params?.callbacks?.onTxSent?.(txHash);\n return txHash;\n },\n {\n prepare: async (params: FulfillIntentMethodParams): Promise<PreparedTransaction> => {\n // Call onAttestationStart callback for prepare mode too\n params?.callbacks?.onAttestationStart?.();\n const prepared = await this.prepareFulfillIntent(params);\n return {\n to: prepared.to,\n data: prepared.data,\n value: prepared.value,\n chainId: prepared.chainId,\n };\n },\n },\n );\n\n /**\n * Prepare fulfillIntent transaction (all logic except simulation/send).\n * Includes fetching intent inputs and calling attestation service.\n */\n private async prepareFulfillIntent(\n params: FulfillIntentMethodParams,\n ): Promise<PreparedTransactionWithAbi> {\n return this._intentOps.prepareFulfillIntent(params);\n }\n\n private defaultAttestationService(): string {\n return this._intentOps.defaultAttestationService();\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(\n req: QuoteRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetQuoteResponse> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(req.referrerFeeConfig, 'getQuote');\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(\n /\\/$/,\n '',\n );\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) {\n const configuredEscrows =\n this.escrowAddresses.length > 0\n ? this.escrowAddresses.map((address) => address as string)\n : this.escrowAddress\n ? [this.escrowAddress as string]\n : [];\n if (configuredEscrows.length > 0) {\n reqWithEscrow.escrowAddresses = configuredEscrows;\n }\n }\n const quote = await apiGetQuote(\n reqWithEscrow as any,\n baseApiUrl,\n timeoutMs,\n this.apiKey,\n this.authorizationToken,\n );\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 appendReferrerFeeDisplayFields(quote, referrerFeeConfig);\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 * @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(\n req: GetTakerTierRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetTakerTierResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n return apiGetTakerTier(req, this.apiKey, baseApiUrl, timeoutMs);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ON-CHAIN DEPOSIT VIEWS ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n private requireProtocolViewer() {\n return this._pvReader.requireProtocolViewer();\n }\n\n private protocolViewerFunctionInputCount(functionName: string): number | null {\n return this._pvReader.protocolViewerFunctionInputCount(functionName);\n }\n\n /**\n * Returns the input count for a function on a specific PV entry's ABI.\n * Used to branch between 1-input (V1) and 2-input (V2) PV call signatures.\n */\n private pvEntryFunctionInputCount(entry: { abi: Abi }, functionName: string): number | null {\n return this._pvReader.pvEntryFunctionInputCount(entry, functionName);\n }\n\n private isZeroAddressValue(value?: string | null): boolean {\n return this._pvReader.isZeroAddressValue(value);\n }\n\n private toBigIntOrZero(value: unknown, fieldName = 'numeric field'): bigint {\n return this._pvReader.toBigIntOrZero(value, fieldName);\n }\n\n private buildProtocolViewerContexts(options?: {\n escrowAddress?: Address;\n orchestratorAddress?: Address;\n }): Array<{ escrow: Address; orchestrator: Address }> {\n return this._pvReader.buildProtocolViewerContexts(options);\n }\n\n private isProtocolViewerDepositPopulated(view: PV_DepositView): boolean {\n return this._pvReader.isProtocolViewerDepositPopulated(view);\n }\n\n private isProtocolViewerIntentPopulated(view: PV_IntentView): boolean {\n return this._pvReader.isProtocolViewerIntentPopulated(view);\n }\n\n private buildDepositViewFromEscrowDeposit(\n rawDeposit: unknown,\n depositId: bigint,\n ): PV_DepositView {\n return this._pvReader.buildDepositViewFromEscrowDeposit(rawDeposit, depositId);\n }\n\n private convertIndexerDepositToPvView(deposit: DepositWithRelations): PV_DepositView {\n return this._pvReader.convertIndexerDepositToPvView(deposit);\n }\n\n private async getPvAccountDepositsFromIndexer(owner: Address): Promise<PV_DepositView[]> {\n return this._pvReader.getPvAccountDepositsFromIndexer(owner);\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, options?: { strictEscrow?: boolean }) {\n return this._pvReader.getPvDepositById(depositId, options);\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 return this._pvReader.getPvDepositsFromIds(ids);\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 return this._pvReader.getPvAccountDeposits(owner);\n }\n\n /**\n * Fetches all intents created by an address from on-chain.\n * Iterates all configured ProtocolViewer entries (V2 first, V1 fallback)\n * to cover intents across different orchestrator versions.\n *\n * @param owner - The owner address\n * @returns Array of parsed intent views (deduplicated by intentHash)\n */\n async getPvAccountIntents(owner: Address) {\n return this._pvReader.getPvAccountIntents(owner);\n }\n\n /**\n * Fetches a single intent by hash from on-chain.\n * Tries all configured ProtocolViewer entries (V2 first, V1 fallback).\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 return this._pvReader.getPvIntent(intentHash);\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(): {\n escrow: Address;\n escrowV2?: Address;\n escrowAddresses: Address[];\n orchestrator?: Address;\n orchestratorV2?: Address;\n orchestratorAddresses: Address[];\n protocolViewer?: Address;\n protocolViewerEntries: Address[];\n unifiedPaymentVerifier?: Address;\n rateManagerV1?: Address;\n orchestratorRegistry?: Address;\n usdc?: Address;\n } {\n return {\n escrow: this.escrowAddress,\n escrowV2: this.escrowV2Address,\n escrowAddresses: this.escrowAddresses,\n orchestrator: this.orchestratorAddress,\n orchestratorV2: this.orchestratorV2Address,\n orchestratorAddresses: this.orchestratorAddresses,\n protocolViewer: this.protocolViewerAddress,\n protocolViewerEntries: this._protocolViewerEntries.map((e) => e.address),\n unifiedPaymentVerifier: this.unifiedPaymentVerifier,\n rateManagerV1: this.rateManagerV1Address,\n orchestratorRegistry: this.orchestratorRegistryAddress,\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 paymentVerifier?: `0x${string}`;\n }> {\n return this._intentOps.getFulfillIntentInputs(intentHash);\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 ApiDeposit,\n DepositVerifier,\n DepositVerifierCurrency,\n GetTakerTierRequest,\n GetTakerTierResponse,\n} from '../types';\nimport { NetworkError, ValidationError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport { IndexerClient, defaultIndexerEndpoint, type DeploymentEnv } from '../indexer/client';\nimport { IndexerDepositService } from '../indexer/service';\nimport type { DepositWithRelations } from '../indexer/types';\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)\n 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(\n 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 },\n retryCount,\n retryDelayMs,\n timeoutMs,\n );\n}\n\nfunction requireEscrowAddress(escrowAddress: string | undefined, endpoint: string): string {\n if (!escrowAddress) {\n throw new ValidationError(`escrowAddress is required for ${endpoint}`, 'escrowAddress');\n }\n return escrowAddress;\n}\n\nfunction inferIndexerEnvFromBaseApiUrl(baseApiUrl: string): DeploymentEnv {\n const normalized = withApiBase(baseApiUrl).toLowerCase();\n\n if (\n normalized.includes('preprod') ||\n normalized.includes('preproduction') ||\n normalized.includes('/preprod/')\n ) {\n return 'PREPRODUCTION';\n }\n\n if (\n normalized.includes('staging') ||\n normalized.includes('/staging/') ||\n normalized.includes('localhost') ||\n normalized.includes('127.0.0.1')\n ) {\n return 'STAGING';\n }\n\n return 'PRODUCTION';\n}\n\nasync function withOptionalTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number | undefined,\n endpoint: string,\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) return promise;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<T>((_, reject) => {\n timer = setTimeout(() => {\n reject(new NetworkError('Request timed out', { endpoint }));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction toDateFromUnixSeconds(value?: string | null): Date | undefined {\n if (!value) return undefined;\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0) return undefined;\n return new Date(numeric * 1000);\n}\n\nfunction toBigIntSafe(value?: string | number | bigint | null): bigint {\n if (value === null || value === undefined) return 0n;\n try {\n return BigInt(value);\n } catch {\n return 0n;\n }\n}\n\nfunction normalizeOwnerDepositsStatus(\n status: GetOwnerDepositsRequest['status'],\n): 'ACTIVE' | 'CLOSED' | undefined {\n if (!status) return undefined;\n if (status === 'WITHDRAWN') return 'CLOSED';\n return status;\n}\n\nfunction buildLegacyVerifierCurrencies(\n deposit: DepositWithRelations,\n): Map<string, DepositVerifierCurrency[]> {\n const currenciesByMethod = new Map<string, DepositVerifierCurrency[]>();\n\n for (const currency of deposit.currencies ?? []) {\n const methodHash = currency.paymentMethodHash;\n const bucket = currenciesByMethod.get(methodHash) ?? [];\n bucket.push({\n currencyCode: currency.currencyCode,\n conversionRate: currency.conversionRate ?? currency.minConversionRate,\n minConversionRate: currency.minConversionRate,\n managerRate: currency.managerRate ?? null,\n rateManagerId: currency.rateManagerId ?? null,\n });\n currenciesByMethod.set(methodHash, bucket);\n }\n\n return currenciesByMethod;\n}\n\nfunction convertIndexerDepositToLegacyApiDeposit(deposit: DepositWithRelations): ApiDeposit {\n const currenciesByMethod = buildLegacyVerifierCurrencies(deposit);\n const verifiers: DepositVerifier[] = (deposit.paymentMethods ?? [])\n .filter((paymentMethod) => paymentMethod.active !== false)\n .map((paymentMethod) => ({\n depositId: Number(deposit.depositId),\n verifier: '',\n methodHash: paymentMethod.paymentMethodHash,\n intentGatingService: paymentMethod.intentGatingService,\n payeeDetailsHash: paymentMethod.payeeDetailsHash,\n data: '0x',\n currencies: currenciesByMethod.get(paymentMethod.paymentMethodHash) ?? [],\n }));\n\n const remainingDeposits = toBigIntSafe(deposit.remainingDeposits);\n const outstandingIntentAmount = toBigIntSafe(deposit.outstandingIntentAmount);\n const totalAmountTaken = toBigIntSafe(deposit.totalAmountTaken);\n const totalWithdrawn = toBigIntSafe(deposit.totalWithdrawn);\n const amount = remainingDeposits + outstandingIntentAmount + totalAmountTaken + totalWithdrawn;\n\n return {\n id: Number(deposit.depositId),\n depositor: deposit.depositor,\n token: deposit.token,\n amount: amount.toString(),\n remainingDeposits: deposit.remainingDeposits,\n intentAmountMin: deposit.intentAmountMin,\n intentAmountMax: deposit.intentAmountMax,\n acceptingIntents: deposit.acceptingIntents,\n outstandingIntentAmount: deposit.outstandingIntentAmount,\n availableLiquidity: deposit.remainingDeposits,\n status: deposit.status,\n totalIntents: deposit.totalIntents,\n signaledIntents: deposit.signaledIntents,\n fulfilledIntents: deposit.fulfilledIntents,\n prunedIntents: deposit.prunedIntents,\n totalAmountTaken: deposit.totalAmountTaken,\n totalWithdrawn: deposit.totalWithdrawn,\n successRateBps: deposit.successRateBps,\n rateManagerId: deposit.rateManagerId ?? null,\n vaultName: null,\n rateManagerRegistry: null,\n createdAt: toDateFromUnixSeconds(deposit.timestamp),\n updatedAt: toDateFromUnixSeconds(deposit.updatedAt),\n verifiers,\n };\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\nexport async function apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n authToken?: string,\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/makers/create`,\n method: 'POST',\n body: req,\n apiKey,\n authToken,\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 | undefined,\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\nexport async function apiGetOwnerDeposits(\n req: GetOwnerDepositsRequest,\n apiKey: string | undefined,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number,\n): Promise<GetOwnerDepositsResponse> {\n const escrowAddress = requireEscrowAddress(\n req.escrowAddress,\n 'apiGetOwnerDeposits requires escrowAddress',\n );\n const indexerEndpoint = defaultIndexerEndpoint(inferIndexerEnvFromBaseApiUrl(baseApiUrl));\n const indexerClient = new IndexerClient(indexerEndpoint, {\n apiKey,\n authorizationToken: authToken,\n });\n const service = new IndexerDepositService(indexerClient);\n\n const deposits = await withOptionalTimeout(\n service.fetchDepositsWithRelations(\n {\n depositor: req.ownerAddress,\n escrowAddress,\n escrowAddresses: req.escrowAddresses?.length ? req.escrowAddresses : undefined,\n status: normalizeOwnerDepositsStatus(req.status),\n },\n undefined,\n { includeIntents: false },\n ),\n timeoutMs,\n indexerEndpoint,\n );\n\n return {\n success: true,\n message: 'ok',\n responseObject: deposits.map(convertIndexerDepositToLegacyApiDeposit),\n statusCode: 200,\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 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 timeoutMs,\n });\n}\n","import { formatUnits } from 'viem';\n\nimport type {\n GetQuoteResponse,\n GetQuoteSingleResponse,\n QuoteResponse,\n ReferrerFeeConfig,\n} from '../types';\n\nexport const formatTokenAmountForDisplay = (amount: bigint, decimals: number): string => {\n const formatted = formatUnits(amount, decimals);\n if (!formatted.includes('.')) {\n return formatted;\n }\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return trimmed.length > 0 ? trimmed : '0';\n};\n\nexport const applyReferrerFeeDisplayFieldsToTokenAmount = (\n tokenAmount: string,\n referrerFeeConfig: ReferrerFeeConfig,\n decimals: number,\n): {\n tokenAmount: string;\n tokenAmountFormatted: string;\n referrerFeeAmount: string;\n referrerFeeAmountFormatted: string;\n referrerFeeBps: number;\n signalIntentAmount: string;\n signalIntentAmountFormatted: string;\n} | null => {\n try {\n const grossAmount = BigInt(tokenAmount);\n const feeAmount = (grossAmount * BigInt(referrerFeeConfig.feeBps)) / 10000n;\n const netAmount = grossAmount - feeAmount;\n\n return {\n tokenAmount: netAmount.toString(),\n tokenAmountFormatted: formatTokenAmountForDisplay(netAmount, decimals),\n referrerFeeAmount: feeAmount.toString(),\n referrerFeeAmountFormatted: formatTokenAmountForDisplay(feeAmount, decimals),\n referrerFeeBps: referrerFeeConfig.feeBps,\n signalIntentAmount: grossAmount.toString(),\n signalIntentAmountFormatted: formatTokenAmountForDisplay(grossAmount, decimals),\n };\n } catch {\n return null;\n }\n};\n\nexport const applyReferrerFeeDisplayFieldsToQuote = (\n quote: QuoteResponse['responseObject']['quotes'][number],\n referrerFeeConfig: ReferrerFeeConfig,\n decimals: number,\n): GetQuoteSingleResponse => {\n const adjusted = applyReferrerFeeDisplayFieldsToTokenAmount(\n quote.tokenAmount,\n referrerFeeConfig,\n decimals,\n );\n if (!adjusted) {\n return quote;\n }\n\n return {\n ...quote,\n ...adjusted,\n };\n};\n\nexport const appendReferrerFeeDisplayFields = (\n quoteResponse: QuoteResponse,\n referrerFeeConfig: ReferrerFeeConfig | undefined,\n): GetQuoteResponse => {\n if (!referrerFeeConfig) {\n return quoteResponse as GetQuoteResponse;\n }\n\n const decimals = quoteResponse.responseObject?.token?.decimals ?? 6;\n const enrichedQuotes: GetQuoteSingleResponse[] = (quoteResponse.responseObject?.quotes ?? []).map(\n (quote) => applyReferrerFeeDisplayFieldsToQuote(quote, referrerFeeConfig, decimals),\n );\n const enrichedNearbySuggestions = quoteResponse.responseObject?.nearbySuggestions\n ? {\n below: quoteResponse.responseObject.nearbySuggestions.below.map((suggestion) => {\n const adjustedSuggestionAmount = suggestion.suggestedTokenAmount\n ? applyReferrerFeeDisplayFieldsToTokenAmount(\n suggestion.suggestedTokenAmount,\n referrerFeeConfig,\n decimals,\n )\n : null;\n return {\n ...suggestion,\n suggestedTokenAmount:\n adjustedSuggestionAmount?.tokenAmount ?? suggestion.suggestedTokenAmount,\n suggestedTokenAmountFormatted:\n adjustedSuggestionAmount?.tokenAmountFormatted ??\n suggestion.suggestedTokenAmountFormatted,\n quote: applyReferrerFeeDisplayFieldsToQuote(\n suggestion.quote,\n referrerFeeConfig,\n decimals,\n ),\n };\n }),\n above: quoteResponse.responseObject.nearbySuggestions.above.map((suggestion) => {\n const adjustedSuggestionAmount = suggestion.suggestedTokenAmount\n ? applyReferrerFeeDisplayFieldsToTokenAmount(\n suggestion.suggestedTokenAmount,\n referrerFeeConfig,\n decimals,\n )\n : null;\n return {\n ...suggestion,\n suggestedTokenAmount:\n adjustedSuggestionAmount?.tokenAmount ?? suggestion.suggestedTokenAmount,\n suggestedTokenAmountFormatted:\n adjustedSuggestionAmount?.tokenAmountFormatted ??\n suggestion.suggestedTokenAmountFormatted,\n quote: applyReferrerFeeDisplayFieldsToQuote(\n suggestion.quote,\n referrerFeeConfig,\n decimals,\n ),\n };\n }),\n }\n : undefined;\n\n return {\n ...quoteResponse,\n responseObject: {\n ...quoteResponse.responseObject,\n quotes: enrichedQuotes,\n nearbySuggestions: enrichedNearbySuggestions,\n },\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","export type PeerConnectionStatus = 'connected' | 'disconnected' | 'pending';\n\nexport type PeerIntentFulfilledBridgeStatus = 'not_required' | 'pending';\n\nexport type PeerIntentFulfilledResult = {\n intentHash: `0x${string}`;\n status: 'fulfilled';\n fulfillTxHash: `0x${string}`;\n recipientAddress: string | null;\n destinationToken: string | null;\n bridge: {\n required: boolean;\n status: PeerIntentFulfilledBridgeStatus;\n trackingUrl?: string | null;\n txHashes?: Array<{ txHash: `0x${string}`; chainId: number }>;\n outputAmount?: string | null;\n expectedOutputAmount?: string | null;\n };\n};\n\nexport type PeerIntentFulfilledCallback = (result: PeerIntentFulfilledResult) => void;\n\nexport type PeerExtensionApi = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n openSidebar(route: string): void;\n onramp(queryString: string): void;\n onIntentFulfilled(callback: PeerIntentFulfilledCallback): () => void;\n getVersion(): Promise<string>;\n};\n\nexport type PeerExtensionOnrampParams = {\n referrer?: string;\n referrerLogo?: string;\n inputCurrency?: string;\n inputAmount?: string | number;\n paymentPlatform?: string;\n toToken?: string;\n amountUsdc?: string | number | bigint;\n recipientAddress?: string;\n intentHash?: string;\n};\n\nexport type PeerExtensionWindow = Window & {\n peer?: PeerExtensionApi;\n};\n\nexport type PeerExtensionSdkOptions = {\n window?: PeerExtensionWindow;\n};\n\nexport type PeerExtensionSdk = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n openSidebar(route: string): void;\n onramp(params?: PeerExtensionOnrampParams): void;\n onIntentFulfilled(callback: PeerIntentFulfilledCallback): () => void;\n getVersion(): Promise<string>;\n isAvailable(): boolean;\n openInstallPage(): void;\n getState(): Promise<PeerExtensionState>;\n};\n\nexport type PeerExtensionState = 'needs_install' | 'needs_connection' | 'ready';\n\nexport const PEER_EXTENSION_CHROME_URL =\n 'https://chromewebstore.google.com/detail/peerauth-authenticate-and/ijpgccednehjpeclfcllnjjcmiohdjih';\n\nconst resolveWindow = (options?: PeerExtensionSdkOptions): PeerExtensionWindow | undefined => {\n if (options?.window) {\n return options.window;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n return window as PeerExtensionWindow;\n};\n\nconst requirePeer = (options?: PeerExtensionSdkOptions): PeerExtensionApi => {\n const resolvedWindow = resolveWindow(options);\n if (!resolvedWindow) {\n throw new Error('Peer extension SDK requires a browser window.');\n }\n\n if (!resolvedWindow.peer) {\n throw new Error('Peer extension not available. Install or enable the Peer extension.');\n }\n\n return resolvedWindow.peer;\n};\n\nexport const isPeerExtensionAvailable = (options?: PeerExtensionSdkOptions): boolean => {\n const resolvedWindow = resolveWindow(options);\n return Boolean(resolvedWindow?.peer);\n};\n\nexport const openPeerExtensionInstallPage = (options?: PeerExtensionSdkOptions): void => {\n const resolvedWindow = resolveWindow(options);\n if (!resolvedWindow) {\n throw new Error('Peer extension SDK requires a browser window.');\n }\n\n resolvedWindow.open(PEER_EXTENSION_CHROME_URL, '_blank', 'noopener,noreferrer');\n};\n\nexport const getPeerExtensionState = async (\n options?: PeerExtensionSdkOptions,\n): Promise<PeerExtensionState> => {\n if (!isPeerExtensionAvailable(options)) {\n return 'needs_install';\n }\n\n try {\n const status = await requirePeer(options).checkConnectionStatus();\n return status === 'connected' ? 'ready' : 'needs_connection';\n } catch (error) {\n return 'needs_connection';\n }\n};\n\nconst fiatAmountRegex = /^-?\\d*(\\.\\d{0,6})?$/;\nconst usdcAmountRegex = /^\\d+$/;\nconst assertObjectInput = (\n params: PeerExtensionOnrampParams | undefined,\n): PeerExtensionOnrampParams => {\n if (params === undefined) {\n return {};\n }\n\n if (params === null || typeof params !== 'object' || Array.isArray(params)) {\n throw new Error('Peer extension onramp expects an object of query params.');\n }\n\n return params;\n};\n\nconst normalizeOptionalString = (value: unknown, label: string): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Peer extension onramp ${label} must be a non-empty string.`);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`Peer extension onramp ${label} must be a non-empty string.`);\n }\n\n return trimmed;\n};\n\nconst normalizeOptionalUrl = (value: unknown, label: string): string | undefined => {\n const trimmed = normalizeOptionalString(value, label);\n if (trimmed === undefined) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch (error) {\n throw new Error(`Peer extension onramp ${label} must be a valid URL.`);\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`Peer extension onramp ${label} must use http or https.`);\n }\n\n return trimmed;\n};\n\nconst normalizeFiatAmount = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = typeof value === 'number' ? String(value) : value;\n if (typeof normalized !== 'string') {\n throw new Error('Peer extension onramp inputAmount must be a string or number.');\n }\n\n const trimmed = normalized.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp inputAmount must be a non-empty value.');\n }\n\n if (!fiatAmountRegex.test(trimmed)) {\n throw new Error(\n 'Peer extension onramp inputAmount must be a non-negative number with up to 6 decimals.',\n );\n }\n\n if (Number.isNaN(Number(trimmed)) || Number(trimmed) < 0) {\n throw new Error(\n 'Peer extension onramp inputAmount must be a non-negative number with up to 6 decimals.',\n );\n }\n\n return trimmed;\n};\n\nconst normalizeUsdcAmount = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'bigint') {\n if (value < 0n) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n return value.toString();\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0 || !Number.isInteger(value)) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n return String(value);\n }\n\n if (typeof value !== 'string') {\n throw new Error('Peer extension onramp amountUsdc must be a string, number, or bigint.');\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp amountUsdc must be a non-empty value.');\n }\n\n if (!usdcAmountRegex.test(trimmed)) {\n throw new Error('Peer extension onramp amountUsdc must be a non-negative integer.');\n }\n\n return trimmed;\n};\n\nconst intentHashRegex = /^0x[a-fA-F0-9]{64}$/;\n\nconst normalizeIntentHash = (value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error('Peer extension onramp intentHash must be a string.');\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('Peer extension onramp intentHash must be a non-empty string.');\n }\n\n if (!intentHashRegex.test(trimmed)) {\n throw new Error(\n 'Peer extension onramp intentHash must be a valid bytes32 hex string (0x + 64 hex characters).',\n );\n }\n\n return trimmed.toLowerCase();\n};\n\nconst buildOnrampQueryString = (params: PeerExtensionOnrampParams | undefined): string => {\n const validated = assertObjectInput(params);\n const searchParams = new URLSearchParams();\n const setParam = (key: string, value: string | undefined): void => {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n };\n\n setParam('referrer', normalizeOptionalString(validated.referrer, 'referrer'));\n setParam('referrerLogo', normalizeOptionalUrl(validated.referrerLogo, 'referrerLogo'));\n setParam('inputCurrency', normalizeOptionalString(validated.inputCurrency, 'inputCurrency'));\n setParam('inputAmount', normalizeFiatAmount(validated.inputAmount));\n setParam(\n 'paymentPlatform',\n normalizeOptionalString(validated.paymentPlatform, 'paymentPlatform'),\n );\n setParam('toToken', normalizeOptionalString(validated.toToken, 'toToken'));\n setParam('amountUsdc', normalizeUsdcAmount(validated.amountUsdc));\n setParam(\n 'recipientAddress',\n normalizeOptionalString(validated.recipientAddress, 'recipientAddress'),\n );\n setParam('intentHash', normalizeIntentHash(validated.intentHash));\n\n return searchParams.toString();\n};\n\nexport const createPeerExtensionSdk = (\n options: PeerExtensionSdkOptions = {},\n): PeerExtensionSdk => ({\n isAvailable: () => isPeerExtensionAvailable(options),\n requestConnection: () => requirePeer(options).requestConnection(),\n checkConnectionStatus: () => requirePeer(options).checkConnectionStatus(),\n openSidebar: (route: string) => requirePeer(options).openSidebar(route),\n onramp: (params?: PeerExtensionOnrampParams) =>\n requirePeer(options).onramp(buildOnrampQueryString(params)),\n onIntentFulfilled: (callback: PeerIntentFulfilledCallback) =>\n requirePeer(options).onIntentFulfilled(callback),\n getVersion: () => requirePeer(options).getVersion(),\n openInstallPage: () => openPeerExtensionInstallPage(options),\n getState: () => getPeerExtensionState(options),\n});\n\nexport const peerExtensionSdk = createPeerExtensionSdk();\n","/**\n * @zkp2p/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/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 * // Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise', 'revolut'],\n * depositData: [{ email: 'you@example.com' }, { tag: '@you' }],\n * });\n *\n * // Create a deposit with pre-registered hashes\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 * payeeDetailsHashes: hashedOnchainIds,\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';\nexport {\n assertValidReferrerFeeConfig,\n isValidReferrerFeeBps,\n isValidReferrerFeeRecipient,\n parseReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n} from './referrerFeeConfig';\nexport type {\n SignalIntentReferralFee,\n SignalIntentMethodParams,\n FulfillIntentMethodParams,\n CancelIntentMethodParams,\n} from './client/Zkp2pClient';\nexport { ContractRouter } from './client/ContractRouter';\nexport type {\n EscrowContractContext,\n OrchestratorContractContext,\n ContractRouterConfig,\n} from './client/ContractRouter';\n\n// =============================================================================\n// Client Types\n// =============================================================================\n\nexport type {\n // Client configuration\n AuthorizationTokenProvider,\n Zkp2pClientOptions,\n TimeoutConfig,\n ActionCallback,\n TxOverrides,\n ReferrerFeeConfig,\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 GetNearbyQuote,\n GetNearbySuggestions,\n GetQuoteResponse,\n GetQuoteResponseObject,\n GetQuoteSingleResponse,\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 // Prepared transaction types\n PreparedTransaction,\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// Extension SDK\n// =============================================================================\n\nexport type {\n PeerConnectionStatus,\n PeerExtensionApi,\n PeerExtensionOnrampParams,\n PeerExtensionSdk,\n PeerExtensionSdkOptions,\n PeerExtensionState,\n PeerExtensionWindow,\n PeerIntentFulfilledBridgeStatus,\n PeerIntentFulfilledCallback,\n PeerIntentFulfilledResult,\n} from './extension';\nexport {\n createPeerExtensionSdk,\n getPeerExtensionState,\n isPeerExtensionAvailable,\n openPeerExtensionInstallPage,\n peerExtensionSdk,\n PEER_EXTENSION_CHROME_URL,\n} from './extension';\n\n// =============================================================================\n// Indexer\n// =============================================================================\n\nexport { IndexerClient, defaultIndexerEndpoint } from './indexer/client';\nexport { IndexerDepositService } from './indexer/service';\nexport {\n IndexerRateManagerService,\n compareEventCursorIdsByRecency,\n} from './indexer/rateManagerService';\nexport {\n createCompositeDepositId,\n convertIndexerDepositToEscrowView,\n convertDepositsForLiquidity,\n convertIndexerIntentsToEscrowViews,\n} from './indexer/converters';\nexport { fetchFulfillmentAndPayment as fetchIndexerFulfillmentAndPayment } 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 IntentFulfillmentAmountsEntity as IndexerIntentFulfillmentAmounts,\n DepositPaymentMethodEntity as IndexerDepositPaymentMethod,\n MethodCurrencyEntity as IndexerMethodCurrency,\n IntentStatus as IndexerIntentStatus,\n RateManagerEntity as IndexerRateManager,\n RateManagerRateEntity as IndexerRateManagerRate,\n RateManagerDelegationEntity as IndexerRateManagerDelegation,\n ManagerAggregateStatsEntity as IndexerManagerAggregateStats,\n ManagerStatsEntity as IndexerManagerStats,\n ManagerDailySnapshotEntity as IndexerManagerDailySnapshot,\n RateManagerListItem as IndexerRateManagerListItem,\n RateManagerDetail as IndexerRateManagerDetail,\n ManualRateUpdateEntity as IndexerManualRateUpdate,\n OracleConfigUpdateEntity as IndexerOracleConfigUpdate,\n DepositFundActivityEntity as IndexerDepositFundActivity,\n DepositDailySnapshotEntity as IndexerDepositDailySnapshot,\n} from './indexer/types';\nexport type { DepositFundActivityType as IndexerDepositFundActivityType } 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 {\n RateManagerFilter as IndexerRateManagerFilter,\n RateManagerPaginationOptions as IndexerRateManagerPagination,\n RateManagerDelegationPaginationOptions as IndexerRateManagerDelegationPagination,\n RateManagerOrderField as IndexerRateManagerOrderField,\n OrderDirection as IndexerRateManagerOrderDirection,\n} from './indexer/rateManagerService';\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 apiGetOwnerDeposits,\n apiGetTakerTier,\n} from './adapters/api';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport {\n PAYMENT_PLATFORMS,\n PLATFORM_METADATA,\n SUPPORTED_CHAIN_IDS,\n TOKEN_METADATA,\n CHAINLINK_ORACLE_ADAPTER,\n PYTH_ORACLE_ADAPTER,\n PYTH_CONTRACT_BASE,\n DEFAULT_ORACLE_MAX_STALENESS_SECONDS,\n CHAINLINK_ORACLE_FEEDS,\n /** @deprecated Use CHAINLINK_ORACLE_FEEDS instead. */\n SPREAD_ORACLE_FEEDS,\n PYTH_ORACLE_FEEDS,\n encodeSpreadOracleAdapterConfig,\n encodePythAdapterConfig,\n getSpreadOracleConfig,\n validateOracleFeedsOnChain,\n} from './constants';\nexport type {\n PaymentPlatformType,\n SupportedChainId,\n SpreadOracleFeedConfig,\n SpreadOracleConfig,\n OracleKind,\n PythFeedConfig,\n OracleAdapterOverrides,\n MulticallClient,\n} 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 {\n getContracts,\n getRateManagerContracts,\n getPaymentMethodsCatalog,\n getGatingServiceAddress,\n HISTORICAL_ESCROW_ADDRESSES,\n} 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 encodeWithAttribution,\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_ReferralFee as ReferralFee,\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\n// =============================================================================\n// Vault Utilities\n// =============================================================================\n\nexport {\n ZERO_RATE_MANAGER_ID,\n isZeroRateManagerId,\n normalizeRateManagerId,\n normalizeRegistry,\n getDelegationRoute,\n classifyDelegationState,\n} from './react/hooks/vaultUtils';\nexport type {\n DelegationRoute,\n DelegationState,\n DelegationDepositTarget,\n BatchResult,\n SendTransactionFn,\n SendBatchFn,\n} from './react/hooks/vaultUtils';\n","import type { Address, Hex } from 'viem';\nimport type { PreparedTransaction } from '../../types/prepared';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\nexport const ZERO_RATE_MANAGER_ID =\n '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n\n// ---------------------------------------------------------------------------\n// Normalizers\n// ---------------------------------------------------------------------------\n\nexport const normalizeRateManagerId = (value?: string | null): string =>\n (value ?? ZERO_RATE_MANAGER_ID).toLowerCase();\n\nexport const normalizeRegistry = (value?: string | null): string =>\n (value ?? ZERO_ADDRESS).toLowerCase();\n\nexport const isZeroRateManagerId = (value?: string | null): boolean => {\n if (!value) return true;\n const normalized = value.toLowerCase();\n return normalized === ZERO_ADDRESS || normalized === ZERO_RATE_MANAGER_ID;\n};\n\n// ---------------------------------------------------------------------------\n// Error helper\n// ---------------------------------------------------------------------------\n\nexport const asErrorMessage = (error: unknown): string => {\n if (!error) return 'Unknown error';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n\n const anyErr = error as Record<string, unknown>;\n if (typeof anyErr.shortMessage === 'string') return anyErr.shortMessage;\n if (typeof anyErr.details === 'string') return anyErr.details;\n if (typeof anyErr.message === 'string') return anyErr.message;\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Delegation state classification\n// ---------------------------------------------------------------------------\n\nexport type DelegationState = 'delegated_here' | 'delegated_elsewhere' | 'not_delegated';\n\n/**\n * Classify whether a deposit is delegated to the target vault, delegated\n * elsewhere, or not delegated at all.\n *\n * @param currentRateManagerId The deposit's current rateManagerId (from indexer)\n * @param currentRegistry The deposit's current rateManagerAddress / registry (from indexer)\n * @param targetRateManagerId The vault's rateManagerId we're comparing against\n * @param targetRegistry The vault's registry address we're comparing against\n */\nexport const classifyDelegationState = (\n currentRateManagerId: string | null | undefined,\n currentRegistry: string | null | undefined,\n targetRateManagerId: string,\n targetRegistry: string | null | undefined,\n): DelegationState => {\n if (isZeroRateManagerId(currentRateManagerId)) {\n return 'not_delegated';\n }\n\n const normalizedCurrent = normalizeRateManagerId(currentRateManagerId);\n const normalizedTarget = targetRateManagerId.toLowerCase();\n const normalizedCurrentRegistry = normalizeRegistry(currentRegistry);\n const normalizedTargetRegistry = targetRegistry ? targetRegistry.toLowerCase() : '';\n\n const idsMatch = normalizedCurrent === normalizedTarget;\n const registryMatches = normalizedTargetRegistry\n ? normalizedCurrentRegistry === normalizedTargetRegistry\n : true;\n\n if (idsMatch && registryMatches) {\n return 'delegated_here';\n }\n\n return 'delegated_elsewhere';\n};\n\nexport const assertAtomicDelegationSwitchSupport = (\n requiresSwitch: boolean,\n canBatch: boolean,\n): void => {\n if (!requiresSwitch || canBatch) return;\n throw new Error(\n 'Switching delegation targets requires smart-account batching. Clear the existing delegation first.',\n );\n};\n\n// ---------------------------------------------------------------------------\n// Contract routing\n// ---------------------------------------------------------------------------\n\nexport type DelegationRoute = 'v2';\n\nexport const getDelegationRoute = (_client: unknown, _escrow: Address): DelegationRoute => 'v2';\n\ntype DelegationMethodSupportClient = Partial<\n Record<'setRateManager' | 'clearRateManager', { prepare?: unknown }>\n>;\n\nexport const assertDelegationMethodSupport = (\n client: DelegationMethodSupportClient,\n _route: DelegationRoute,\n action: 'set' | 'clear',\n): void => {\n const method = action === 'set' ? 'setRateManager' : 'clearRateManager';\n if (client?.[method]?.prepare) return;\n throw new Error(`Delegation requires SDK ${method} support`);\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DelegationDepositTarget {\n compositeDepositId: string;\n escrow: Address;\n depositId: bigint;\n currentRateManagerId?: string | null;\n currentRateManagerRegistry?: string | null;\n}\n\nexport interface BatchResult {\n hashes: string[];\n failed: Array<{ compositeDepositId: string; error: string }>;\n}\n\n/**\n * Callback the consumer provides for sending a single prepared transaction.\n * Returns the transaction hash.\n */\nexport type SendTransactionFn = (tx: { to: Address; data: Hex; value?: bigint }) => Promise<string>;\n\n/**\n * Optional callback for batching multiple calls in a single user operation\n * (e.g. via a smart account). If not provided, transactions are sent\n * sequentially via sendTransaction.\n */\nexport type SendBatchFn = (\n txs: Array<{ to: Address; data: Hex; value?: bigint }>,\n) => Promise<string>;\n\n// ---------------------------------------------------------------------------\n// Prepare helpers (used internally by hooks)\n// ---------------------------------------------------------------------------\n\nexport const prepareClearDelegationTx = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n params: { escrow: Address; depositId: bigint },\n referrer?: string | string[],\n): Promise<PreparedTransaction> => {\n const route = getDelegationRoute(client, params.escrow);\n assertDelegationMethodSupport(client, route, 'clear');\n return client.clearRateManager.prepare({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n ...(referrer ? { txOverrides: { referrer } } : {}),\n });\n};\n\nexport const prepareSetDelegationTx = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n params: {\n escrow: Address;\n depositId: bigint;\n registry: Address;\n rateManagerId: Hex;\n },\n referrer?: string | string[],\n): Promise<PreparedTransaction> => {\n const route = getDelegationRoute(client, params.escrow);\n assertDelegationMethodSupport(client, route, 'set');\n return client.setRateManager.prepare({\n escrowAddress: params.escrow,\n depositId: params.depositId,\n rateManagerAddress: params.registry,\n rateManagerId: params.rateManagerId,\n ...(referrer ? { txOverrides: { referrer } } : {}),\n });\n};\n"]}
|