@zkp2p/sdk 0.13.0 → 0.14.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/address.ts","../src/client/clientUtils.ts","../src/client/ContractRouter.ts","../src/errors/utils.ts","../src/adapters/verification.ts","../src/adapters/attestationTransport.ts","../src/adapters/attestation.ts","../src/utils/encode.ts","../src/referrerFeeConfig.ts","../src/utils/attribution.ts","../src/utils/constants.ts","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/oracleFeeds/chainlink.json","../src/utils/oracles.ts","../src/constants.ts","../src/client/IntentOperations.ts","../src/client/ProtocolViewerReader.ts","../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/schemaCompatibility.ts","../src/utils/logger.ts","../src/indexer/service.ts","../src/referral.ts","../../core/src/utils/currencyKeccak256.ts","../../core/src/types/currency.ts","../../core/src/platforms/types.ts","../../core/src/platforms/zelle.ts","../../core/src/platforms/disputeProtection.ts","../src/adapters/api.ts","../src/client/ReferralAccountOperations.ts","../src/client/VaultOperations.ts","../src/client/AccessPolicyOperations.ts","../src/client/StakeOperations.ts","../src/indexer/rateManagerService.ts","../src/indexer/stakingService.ts","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/index.js","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/disputeStack/base.js","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/disputeStack/baseStaging.js","../src/buildMetadata.ts","../src/client/DisputeProtectionReadiness.ts","../src/indexer/intentVerification.ts","../src/sellerCredentials.ts","../src/utils/referrerFeeDisplay.ts","../src/utils/erc20.ts","../src/client/Zkp2pClient.ts","../src/extension.ts","../src/riskMath.ts"],"names":["base","createEncryptedBuyerTeeSessionMaterialWithAttestation","ZERO_ADDRESS","data","payee","parseDepositView","raw","results","attemptedRead","hadSuccessfulRead","lastError","parseIntentView","headers","normalizeAddress","currencyKeccak256","viemKeccak256","Currency","currencyInfo","result","DEFAULT_LIMIT","normalizeRateManagerId","keccak256","zeroAddress","policyAdmissionsPaused","hardhat","mapConversionRatesToOnchainMinRate","bundleResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Address } from 'viem';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Address;\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","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseBigIntLike } from '../utils/bigint';\nimport { ZERO_ADDRESS, isValidHexAddress, normalizeAddress } from '../utils/address';\n\nexport { ZERO_ADDRESS, isValidHexAddress, normalizeAddress };\n\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 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' | 'v3';\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 orchestratorV3Address?: Address;\n orchestratorV3Abi?: 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 orchestratorV3Address?: Address;\n readonly orchestratorV3Abi?: 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.orchestratorV3Address = config.orchestratorV3Address;\n this.orchestratorV3Abi = config.orchestratorV3Abi;\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 pairedOrchestratorAddresses = this.orchestratorAddresses.filter(\n (address) => !isSameAddress(address, this.orchestratorV3Address),\n );\n const configuredPairCount = Math.min(\n this.escrowAddresses.length,\n pairedOrchestratorAddresses.length,\n );\n for (let index = 0; index < configuredPairCount; index += 1) {\n addEscrowOrchestratorPair(this.escrowAddresses[index], pairedOrchestratorAddresses[index]);\n }\n\n const resolveOrchestratorAbi = (address?: Address): Abi | undefined =>\n this.getOrchestratorContextByAddress(address)?.abi ??\n (isSameAddress(address, this.orchestratorV3Address)\n ? this.orchestratorV3Abi\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.orchestratorV3Address,\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 isV3 = isSameAddress(address, this.orchestratorV3Address);\n const abi = isV3\n ? this.orchestratorV3Abi\n : 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: isV3 ? 'v3' : '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(escrowAddress?: Address): 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 // EscrowV2 is shared by OrchestratorV2 and OrchestratorV3. ProtocolViewer\n // reads must cover every configured orchestrator instead of assuming a\n // one-to-one escrow/orchestrator index pairing.\n for (const orchestratorAddress of this.orchestratorAddresses) {\n add(context.address, orchestratorAddress);\n }\n }\n\n return contexts;\n }\n}\n\nexport { parseEscrowAddressFromCompositeDepositId };\n","import { APIError, NetworkError } from './index';\n\nexport function parseAPIError(response: Response, responseText?: string): APIError {\n let message = `Request failed: ${response.statusText}`;\n let parsedBody: unknown;\n try {\n parsedBody = responseText ? JSON.parse(responseText) : undefined;\n if (parsedBody && typeof parsedBody === 'object') {\n const body = parsedBody as Record<string, unknown>;\n if (body.error || body.message) {\n message = (body.error || body.message) as string;\n }\n }\n } catch {\n if (responseText && responseText.length < 200) message = responseText;\n }\n return new APIError(message, response.status, { url: response.url, responseBody: parsedBody });\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n delayMs = 1000,\n timeoutMs?: number,\n shouldRetry?: (error: unknown) => boolean,\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 || shouldRetry?.(err) === true;\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 type { Address } from 'viem';\nimport { APIError, NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport type { CuratorMetadata } from '../types';\n\nexport type SignIntentV3ReferralFee = {\n recipient: Address;\n fee: string;\n};\n\nexport type SignIntentV3Request = {\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 callerAddress: Address; // wallet that will call signalIntent on-chain\n referralFees: SignIntentV3ReferralFee[];\n postIntentHook?: Address;\n data?: `0x${string}`;\n};\n\n/** Everything curator returns on a successful `/v3/sign`. */\nexport type SignIntentV3ResponseObject = {\n offchainId?: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n signedIntent: `0x${string}`; // signature bytes\n /**\n * The intent curator signed, echoed back in full.\n *\n * Everything here is optional: the wrapper only needs the expiration, and a\n * caller that encodes `signalIntent` itself reads the rest. Field list taken\n * from a live preproduction `/v3/sign` response, not from the request shape —\n * `preIntentHookData` is declared because the SDK has always read it, though\n * curator omits it when there is no hook.\n */\n intentData?: {\n signatureExpiration?: string;\n preIntentHookData?: string;\n referralFees?: SignIntentV3ReferralFee[];\n orchestratorAddress?: string;\n escrowAddress?: string;\n depositId?: string;\n amount?: string;\n recipientAddress?: string;\n paymentMethod?: string;\n fiatCurrency?: string;\n conversionRate?: string;\n callerAddress?: string;\n chainId?: string;\n gatingServiceSignature?: string;\n postIntentHook?: string;\n data?: string;\n };\n signatureExpiration?: string;\n preIntentHookData?: string;\n referralFees?: SignIntentV3ReferralFee[];\n};\n\ntype SignIntentV3Response = {\n success: boolean;\n message: string;\n responseObject: SignIntentV3ResponseObject;\n statusCode: number;\n};\n\nexport type SignIntentApiOptions = {\n baseApiUrl: string;\n timeoutMs?: number;\n /**\n * Extra request headers, e.g. the `x-pp-key` service key that curator's\n * `peerPayKey` middleware reads to skip fee enforcement and rate limiting.\n * Merged over the defaults, so a caller can also replace `Content-Type`.\n */\n headers?: Record<string, string>;\n};\n\n/**\n * Why a `/v3/sign` call produced no curator signature.\n *\n * Curator answers 409 for more than one reason and they are not\n * interchangeable: a deposit that gates on-chain wants the intent signalled\n * directly with an empty signature, while a refusal such as an inactive\n * payment method must not be turned into an ungated signal — on a gated\n * deposit that reverts, and on an ungated one it signals an intent curator\n * just declined.\n */\nexport type SignIntentV3Result =\n | { gating: 'curator-signed'; response: SignIntentV3ResponseObject }\n | { gating: 'enforced-on-chain'; message: string };\n\n/*\n * Curator returns `This deposit is enforced on-chain and does not require a\n * curator signature` (verificationService, `intentGatingService == 0x0`). There\n * is no machine-readable code on the envelope yet, so this matches the stable\n * part of that sentence; every other 409 keeps its message and throws.\n */\nconst ENFORCED_ON_CHAIN_MESSAGE = /enforced on-chain/i;\n\nconst RETRYABLE_SIGN_INTENT_STATUSES = new Set([500, 502, 503, 504]);\n\nconst isRetryableSignIntentError = (error: unknown): boolean =>\n error instanceof APIError &&\n error.status !== undefined &&\n RETRYABLE_SIGN_INTENT_STATUSES.has(error.status);\n\nconst readCuratorMessage = (body: string): string => {\n try {\n const parsed = JSON.parse(body) as { message?: unknown };\n return typeof parsed.message === 'string' ? parsed.message : body;\n } catch {\n return body;\n }\n};\n\n/**\n * Raw `/v3/sign`: the full request in, curator's full response object out.\n *\n * Use this when the wrapper's projection is not enough — routing by the\n * quote-recorded orchestrator, submitting through a relayer with its own\n * `callerAddress`, or reading `offchainId` / `telegramUsername` / `intentData`.\n * `apiSignIntentV3` is the narrow projection of this.\n */\nexport async function apiSignIntentV3Raw(\n request: SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<SignIntentV3Result> {\n const baseApiUrl = opts.baseApiUrl.replace(/\\/+$/, '').replace(/\\/v[123]$/i, '');\n const url = `${baseApiUrl}/v3/sign`;\n\n return withRetry(\n async (): Promise<SignIntentV3Result> => {\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...opts.headers },\n body: JSON.stringify(request),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', {\n endpoint: '/v3/sign',\n error,\n });\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n // Only the on-chain-gating 409 means \"signal it yourself\". Anything\n // else is curator declining, and is surfaced with its own message.\n if (res.status === 409) {\n const message = readCuratorMessage(text);\n if (ENFORCED_ON_CHAIN_MESSAGE.test(message)) {\n return { gating: 'enforced-on-chain', message };\n }\n }\n throw parseAPIError(res, text);\n }\n\n const json = (await res.json()) as SignIntentV3Response;\n return { gating: 'curator-signed', response: json?.responseObject };\n },\n 3,\n 1000,\n opts.timeoutMs,\n isRetryableSignIntentError,\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 referralFees?: SignIntentV3ReferralFee[];\n}> {\n const result = await apiSignIntentV3Raw(request, opts);\n\n if (result.gating === 'enforced-on-chain') {\n // The deposit gates itself, so it needs no curator signature. An empty\n // signature against a deposit that does gate is rejected on-chain.\n return {\n signature: '0x',\n signatureExpiration: 0n,\n };\n }\n\n const { response } = result;\n const sig = response?.signedIntent as `0x${string}` | undefined;\n const expStr = response?.intentData?.signatureExpiration ?? response?.signatureExpiration;\n const preIntentHookData = response?.intentData?.preIntentHookData ?? response?.preIntentHookData;\n const referralFees = response?.intentData?.referralFees ?? response?.referralFees;\n if (!sig || !expStr) throw new Error('/v3/sign missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\n referralFees,\n };\n}\n","const DEFAULT_ATTESTATION_PROXY_URL = 'https://attestation-service-proxy.up.railway.app';\n\nexport type AttestationTransport = {\n fetch: typeof fetch;\n getActiveBaseUrl: () => string;\n};\n\nexport type AttestationTransportOptions = {\n fallbackUrls?: readonly string[] | null;\n fetch?: typeof fetch;\n};\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function normalizeAttestationBaseUrl(\n value: string | null | undefined,\n label: string,\n): string {\n const normalized = normalizeOptionalString(value)?.replace(/\\/+$/u, '');\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction resolveFallbackUrls(\n primaryBaseUrl: string,\n fallbackUrls?: readonly string[] | null,\n): string[] {\n const rawFallbackUrls = fallbackUrls == null ? [DEFAULT_ATTESTATION_PROXY_URL] : fallbackUrls;\n const normalized = rawFallbackUrls\n .map((url) => normalizeOptionalString(url)?.replace(/\\/+$/u, '') ?? null)\n .filter((url): url is string => Boolean(url));\n\n return Array.from(new Set(normalized)).filter((url) => url !== primaryBaseUrl);\n}\n\nfunction resolveFetch(requestFetch?: typeof fetch): typeof fetch {\n if (requestFetch) {\n return requestFetch;\n }\n\n if (typeof globalThis.fetch !== 'function') {\n throw new Error('fetch is not available in this runtime.');\n }\n\n return globalThis.fetch.bind(globalThis);\n}\n\nfunction inputUrl(input: RequestInfo | URL): URL | null {\n try {\n if (typeof input === 'string' || input instanceof URL) {\n return new URL(input);\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return new URL(input.url);\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction rewriteInputBaseUrl(\n input: RequestInfo | URL,\n primaryBaseUrl: string,\n targetBaseUrl: string,\n): RequestInfo | URL {\n const url = inputUrl(input);\n if (!url) {\n return input;\n }\n\n const primaryUrl = new URL(primaryBaseUrl);\n const targetUrl = new URL(targetBaseUrl);\n if (url.origin === primaryUrl.origin) {\n url.protocol = targetUrl.protocol;\n url.host = targetUrl.host;\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return new Request(url.toString(), input.clone());\n }\n\n return url.toString();\n}\n\nexport function createAttestationTransport(\n primaryBaseUrl: string,\n options: AttestationTransportOptions = {},\n): AttestationTransport {\n const requestFetch = resolveFetch(options.fetch);\n const fallbackUrls = resolveFallbackUrls(primaryBaseUrl, options.fallbackUrls);\n let activeBaseUrl = primaryBaseUrl;\n\n const transportFetch: typeof fetch = async (input, init) => {\n const attemptInput =\n activeBaseUrl === primaryBaseUrl\n ? input\n : rewriteInputBaseUrl(input, primaryBaseUrl, activeBaseUrl);\n\n try {\n return await requestFetch(attemptInput, init);\n } catch (primaryError) {\n if (activeBaseUrl !== primaryBaseUrl || fallbackUrls.length === 0) {\n throw primaryError;\n }\n\n let fallbackError: unknown = primaryError;\n for (const fallbackUrl of fallbackUrls) {\n try {\n const fallbackInput = rewriteInputBaseUrl(input, primaryBaseUrl, fallbackUrl);\n const response = await requestFetch(fallbackInput, init);\n activeBaseUrl = fallbackUrl;\n return response;\n } catch (error) {\n fallbackError = error;\n }\n }\n\n throw fallbackError;\n }\n };\n\n return {\n fetch: transportFetch,\n getActiveBaseUrl: () => activeBaseUrl,\n };\n}\n","import {\n createEncryptedBuyerTeeSessionMaterial as createEncryptedBuyerTeeSessionMaterialWithAttestation,\n type CreateEncryptedBuyerTeeSessionMaterialParams,\n createEncryptedSellerCredentialUpload,\n} from '@zkp2p/zkp2p-attestation';\n\nimport { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport type {\n AttestationServiceSellerCredentialUploadResponse,\n AttestationServiceIdentityResponse,\n AttestationServiceSellerVerifyResponse,\n IdentityAttestationRequestBody,\n BuyerTeeSessionMaterialEncryptionInput,\n BuyerTeeVerifyPaymentBody,\n SellerCredentialAttestationRuntime,\n SellerCredentialUploadInput,\n SellerCredentialUploadPlatform,\n WiseCredentialUploadInput,\n} from '../types';\nimport {\n createAttestationTransport,\n normalizeAttestationBaseUrl,\n type AttestationTransport,\n} from './attestationTransport';\n\ntype AttestationRequestOptions = {\n fallbackUrls?: readonly string[] | null;\n};\n\nconst isAttestationMaterialTimeout = (error: unknown): error is Error & { code: 'TIMEOUT' } =>\n error instanceof Error && 'code' in error && error.code === 'TIMEOUT';\n\nfunction headers() {\n return { 'Content-Type': 'application/json' } as const;\n}\n\ntype PayeeBoundSellerCredentialUploadInput = Extract<\n SellerCredentialUploadInput,\n { payeeId: string }\n>;\n\nfunction isPayeeBoundSellerCredentialUploadInput(\n payload: SellerCredentialUploadInput,\n): payload is PayeeBoundSellerCredentialUploadInput {\n return typeof (payload as { payeeId?: unknown }).payeeId === 'string';\n}\n\nfunction isWiseCredentialUploadInput(\n payload: SellerCredentialUploadInput,\n): payload is WiseCredentialUploadInput {\n return (\n typeof (payload as { sessionMaterial?: { apiToken?: unknown } }).sessionMaterial?.apiToken ===\n 'string'\n );\n}\n\nasync function createEncryptedSellerCredentialUploadForPlatform({\n attestationServiceUrl,\n attestationTransport,\n cryptoRuntime,\n payload,\n platform,\n timeoutMs,\n}: {\n attestationTransport: AttestationTransport;\n attestationServiceUrl: string;\n cryptoRuntime?: Omit<SellerCredentialAttestationRuntime, 'fetch'>;\n payload: SellerCredentialUploadInput;\n platform: SellerCredentialUploadPlatform;\n timeoutMs?: number;\n}): Promise<string> {\n try {\n if (platform === 'wise') {\n if (!isWiseCredentialUploadInput(payload)) {\n throw new Error('apiToken is required for wise seller credential uploads');\n }\n\n return await createEncryptedSellerCredentialUpload({\n attestationServiceUrl,\n platform: 'wise',\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n sessionMaterial: payload.sessionMaterial,\n ...(typeof timeoutMs === 'number' ? { timeoutMs } : {}),\n fetch: attestationTransport.fetch,\n ...(cryptoRuntime?.subtle ? { subtle: cryptoRuntime.subtle } : {}),\n ...(cryptoRuntime?.getRandomValues\n ? { getRandomValues: cryptoRuntime.getRandomValues }\n : {}),\n });\n }\n\n if (!isPayeeBoundSellerCredentialUploadInput(payload)) {\n throw new Error(`payeeId is required for ${platform} seller credential uploads`);\n }\n\n return await createEncryptedSellerCredentialUpload({\n attestationServiceUrl,\n platform,\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n payeeId: payload.payeeId,\n sessionMaterial: payload.sessionMaterial,\n ...(typeof timeoutMs === 'number' ? { timeoutMs } : {}),\n fetch: attestationTransport.fetch,\n ...(cryptoRuntime?.subtle ? { subtle: cryptoRuntime.subtle } : {}),\n ...(cryptoRuntime?.getRandomValues ? { getRandomValues: cryptoRuntime.getRandomValues } : {}),\n });\n } catch (error) {\n if (isAttestationMaterialTimeout(error)) {\n throw new NetworkError(error.message, { cause: error });\n }\n throw error;\n }\n}\n\nexport async function apiVerifyBuyerTeePayment(\n payload: BuyerTeeVerifyPaymentBody,\n attestationServiceUrl: string,\n platform: string,\n actionType: string,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceSellerVerifyResponse> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = `/buyer/verify/${encodeURIComponent(platform)}/${encodeURIComponent(\n actionType,\n )}`;\n const baseUrl = normalizeAttestationBaseUrl(attestationServiceUrl, 'Attestation Service URL');\n const attestationTransport = createAttestationTransport(baseUrl, {\n fallbackUrls: options.fallbackUrls,\n });\n res = await attestationTransport.fetch(`${baseUrl}${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: `/buyer/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\nexport async function apiRequestIdentityAttestation(\n payload: IdentityAttestationRequestBody,\n attestationServiceUrl: string,\n platform: string,\n actionType: string,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceIdentityResponse> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = '/identity';\n const baseUrl = normalizeAttestationBaseUrl(attestationServiceUrl, 'Attestation Service URL');\n const attestationTransport = createAttestationTransport(baseUrl, {\n fallbackUrls: options.fallbackUrls,\n });\n res = await attestationTransport.fetch(`${baseUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify({\n platform,\n actionType,\n callerAddress: payload.callerAddress,\n encryptedSessionMaterial: payload.encryptedSessionMaterial,\n params: payload.params,\n }),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: '/identity',\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\nexport async function createEncryptedBuyerTeeSessionMaterial({\n actionType,\n attestationServiceFallbackUrls,\n attestationRuntime,\n attestationServiceUrl,\n platform,\n sessionMaterial,\n timeoutMs,\n}: BuyerTeeSessionMaterialEncryptionInput): Promise<string> {\n const normalizedAttestationServiceUrl = normalizeAttestationBaseUrl(\n attestationServiceUrl,\n 'Attestation Service URL',\n );\n const attestationTransport = createAttestationTransport(normalizedAttestationServiceUrl, {\n fallbackUrls: attestationServiceFallbackUrls,\n ...(attestationRuntime?.fetch ? { fetch: attestationRuntime.fetch } : {}),\n });\n const params = {\n actionType,\n attestationServiceUrl: normalizedAttestationServiceUrl,\n platform,\n sessionMaterial,\n ...(timeoutMs == null ? {} : { timeoutMs }),\n fetch: attestationTransport.fetch,\n ...(attestationRuntime?.subtle ? { subtle: attestationRuntime.subtle } : {}),\n ...(attestationRuntime?.getRandomValues\n ? { getRandomValues: attestationRuntime.getRandomValues }\n : {}),\n } as unknown as CreateEncryptedBuyerTeeSessionMaterialParams;\n\n return createEncryptedBuyerTeeSessionMaterialWithAttestation(params);\n}\n\nexport async function apiCreateSellerCredentialBundle(\n payload: SellerCredentialUploadInput,\n attestationServiceUrl: string,\n platform: SellerCredentialUploadPlatform,\n timeoutMs?: number,\n attestationRuntime?: SellerCredentialAttestationRuntime,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceSellerCredentialUploadResponse> {\n return withRetry(\n async () => {\n const normalizedAttestationServiceUrl = normalizeAttestationBaseUrl(\n attestationServiceUrl,\n 'Attestation Service URL',\n );\n const attestationTransport = createAttestationTransport(normalizedAttestationServiceUrl, {\n fallbackUrls: options.fallbackUrls,\n ...(attestationRuntime?.fetch ? { fetch: attestationRuntime.fetch } : {}),\n });\n const encryptedUpload = await createEncryptedSellerCredentialUploadForPlatform({\n attestationServiceUrl: normalizedAttestationServiceUrl,\n attestationTransport,\n cryptoRuntime: {\n subtle: attestationRuntime?.subtle,\n getRandomValues: attestationRuntime?.getRandomValues,\n },\n payload,\n platform,\n timeoutMs,\n });\n\n let res: Response;\n try {\n const endpoint = `/seller/credentials/${encodeURIComponent(platform)}`;\n const activeBaseUrl = attestationTransport.getActiveBaseUrl();\n res = await attestationTransport.fetch(`${activeBaseUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify({\n encryptedUpload,\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n }),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: `/seller/credentials/${platform}`,\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 3,\n 1000,\n timeoutMs,\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 const metadata =\n typeof resp.metadata === 'string' && resp.metadata.length > 0\n ? (resp.metadata as Address)\n : '0x';\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, metadata]],\n ) as Address;\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' | 'getQuotesBestByPlatform' | '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 } from 'viem';\n\n// Unversioned base; callers/providers must append /v1 or /v2 in adapters\nexport const DEFAULT_BASE_API_URL = 'https://api.zkp2p.xyz';\nexport const DEFAULT_WITNESS_URL = 'https://witness-proxy.zkp2p.xyz';\n\n// Enabled payment platforms (verifiers) for enrichment and platform-aware logic\nexport const ENABLED_PLATFORMS = [\n 'venmo',\n 'revolut',\n 'cashapp',\n 'wise',\n 'mercadopago',\n 'zelle',\n 'paypal',\n 'monzo',\n] as const;\n\nexport type EnabledPlatform = (typeof ENABLED_PLATFORMS)[number];\n\ntype PlatformAddresses = { [P in EnabledPlatform]: Address };\n\nexport type ContractSet = PlatformAddresses & {\n usdc: Address;\n escrow: Address;\n gatingService: Address;\n zkp2pWitnessSigner: Address;\n};\n\ntype Contracts = {\n [chainId: number]:\n | ContractSet\n | {\n production: ContractSet;\n staging: ContractSet;\n };\n};\n\nexport const DEPLOYED_ADDRESSES: Contracts = {\n 8453: {\n production: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n\n // escrow + verifiers\n escrow: '0x777777779d229cdF3110e9de47943791c26300Ef',\n\n // Processor names to deployed addresses\n venmo: '0x9a733B55a875D0DB4915c6B36350b24F8AB99dF5',\n revolut: '0xAA5A1B62B01781E789C900d616300717CD9A41aB',\n cashapp: '0x76D33A33068D86016B806dF02376dDBb23Dd3703',\n wise: '0xFF0149799631D7A5bdE2e7eA9b306c42b3d9a9ca',\n mercadopago: '0xf2AC5be14F32Cbe6A613CFF8931d95460D6c33A3',\n zelle: '0x431a078A5029146aAB239c768A615CD484519aF7',\n paypal: '0x03d17E9371C858072E171276979f6B44571C5DeA',\n monzo: '0x0dE46433bD251027f73eD8f28E01eF05DA36a2E0',\n\n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n staging: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n\n // escrow + verifiers\n escrow: '0xC8cd114C6274Ef1066840337E7678BC9731BEa68',\n\n // Processor names to deployed addresses\n venmo: '0xCE6454f272127ba69e8C8128B92F2388Ca343257',\n revolut: '0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b',\n cashapp: '0xdDB9d452180398F456Fe89A43Df9C65B19756CEa',\n wise: '0x79F35E2f65ff917BE35686d34932C8Ef5a30631f',\n mercadopago: '0xA2d54F983B8201c7b276C9705641C49C2FBD1A36',\n zelle: '0x0Ed3c3DB9CF8458e5D9991712552539675D2C896',\n paypal: '0xB07764999679a9136d6853a5D4c70449afbfc2f8',\n monzo: '0x179792F99C0eFBFa06c3F6747989a96c58544f6F',\n\n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n },\n 31337: {\n usdc: '0x5FbDB2315678afecb367f032d93F642f64180aa3',\n escrow: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512',\n venmo: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',\n revolut: '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853',\n cashapp: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788',\n wise: '0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82',\n mercadopago: '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1',\n zelle: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c',\n paypal: '0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E',\n monzo: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042',\n\n // offchain services\n gatingService: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', // Hardhat 0\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n};\n\nexport function getPlatformAddressMap(addresses: ContractSet): Record<EnabledPlatform, Address> {\n const entries = ENABLED_PLATFORMS.map((p) => [p, addresses[p]] as const);\n return Object.fromEntries(entries) as Record<EnabledPlatform, Address>;\n}\n\nexport function platformFromVerifierAddress(\n addresses: ContractSet,\n verifierAddress: string,\n): EnabledPlatform | null {\n if (!verifierAddress) return null;\n const target = verifierAddress.toLowerCase();\n for (const p of ENABLED_PLATFORMS) {\n const addr = addresses[p]?.toLowerCase?.();\n if (addr && addr === target) return p;\n }\n return null;\n}\n","{\n \"generatedAt\": \"2026-08-27T23:27:33.987Z\",\n \"network\": \"base\",\n \"feeds\": [\n {\n \"pair\": \"AUD/USD\",\n \"feed\": \"0x46e51B8cA41d709928EdA9Ae43e42193E6CDf229\",\n \"decimals\": 8\n },\n {\n \"pair\": \"BRL/USD\",\n \"feed\": \"0x0b0E64c05083FdF9ED7C5D3d8262c4216eFc9394\",\n \"decimals\": 8\n },\n {\n \"pair\": \"CAD/USD\",\n \"feed\": \"0xA840145F87572E82519d578b1F36340368a25D5d\",\n \"decimals\": 8\n },\n {\n \"pair\": \"CHF/USD\",\n \"feed\": \"0x3A1d6444fb6a402470098E23DaD0B7E86E14252F\",\n \"decimals\": 8\n },\n {\n \"pair\": \"EUR/USD\",\n \"feed\": \"0xc91D87E81faB8f93699ECf7Ee9B44D11e1D53F0F\",\n \"decimals\": 8\n },\n {\n \"pair\": \"GBP/USD\",\n \"feed\": \"0xCceA6576904C118037695eB71195a5425E69Fa15\",\n \"decimals\": 8\n },\n {\n \"pair\": \"IDR/USD\",\n \"feed\": \"0x05A6cF213EcC5501A11a08EBefA4A8a60313ef97\",\n \"decimals\": 8\n },\n {\n \"pair\": \"MXN/USD\",\n \"feed\": \"0x9e8Ee77c76d4fa41306056D1C3196AF5da1600bd\",\n \"decimals\": 8\n },\n {\n \"pair\": \"NGN/USD\",\n \"feed\": \"0xdfbb5Cbc88E382de007bfe6CE99C388176ED80aD\",\n \"decimals\": 8\n },\n {\n \"pair\": \"NZD/USD\",\n \"feed\": \"0x06bdFe07E71C476157FC025d3cCD4BBe08e83EF9\",\n \"decimals\": 8\n },\n {\n \"pair\": \"PHP/USD\",\n \"feed\": \"0x0396000dc82bfAEe746A9Ac6dC69dAd3223Ca9c6\",\n \"decimals\": 8\n },\n {\n \"pair\": \"SGD/USD\",\n \"feed\": \"0x81575495532fB311Efc5C993B612564274F0949b\",\n \"decimals\": 8\n },\n {\n \"pair\": \"TRY/USD\",\n \"feed\": \"0x29413773e7CD4Dfd6Ad89a50887877b88a6C592C\",\n \"decimals\": 8\n },\n {\n \"pair\": \"ZAR/USD\",\n \"feed\": \"0x2ecc8A8B370fC6a217166b2782a35339bEBEe98B\",\n \"decimals\": 8\n }\n ]\n}","import chainlinkFeeds from '@zkp2p/contracts-v2/oracleFeeds/chainlink.json' with { type: '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 alipay: { actionType: 'transfer_alipay', actionPlatform: 'alipay' },\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')\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 if (normalized === 'zelle') {\n throw new Error(\n 'Generic Zelle buyer TEE fulfillment requires a bank-specific actionType override.',\n );\n }\n const config = PLATFORM_ATTESTATION_CONFIG[normalized];\n if (!config) {\n throw new Error(`Unknown payment platform: ${platformName}`);\n }\n return config;\n}\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext, OrchestratorContractContext } from './ContractRouter';\nimport { ZERO_ADDRESS, parseRawDepositId, resolveAbiFunctionName } from './clientUtils';\nimport { apiSignIntentV3 } from '../adapters/verification';\nimport { apiVerifyBuyerTeePayment } from '../adapters/attestation';\nimport { ValidationError } from '../errors';\nimport {\n encodeAddressAsBytes,\n encodePaymentAttestation,\n encodeVerifyPaymentData,\n} from '../utils/encode';\nimport {\n assertValidReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n isValidReferrerFeeRecipient,\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 { IndexerDepositService } from '../indexer/service';\nimport type {\n BuyerTeePaymentProofInput,\n FulfillIntentAttestationResponse,\n PreparedTransactionWithAbi,\n TxOverrides,\n} from '../types';\nimport type { PV_IntentView, PV_PaymentMethodData } from '../utils/protocolViewerParsers';\n\ntype FulfillIntentInputs = {\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\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\nconst GENERIC_ZELLE_ATTESTATION_ACTION_TYPES = new Set([\n 'transfer_zelle_bofa',\n 'transfer_zelle_chase',\n 'transfer_zelle_citi',\n]);\n\nfunction hasBuyerTeeRouteOverrides(\n buyerTeeProof: BuyerTeePaymentProofInput,\n): buyerTeeProof is BuyerTeePaymentProofInput & {\n actionPlatform: string;\n actionType: string;\n} {\n return Boolean(buyerTeeProof.actionPlatform && buyerTeeProof.actionType);\n}\n\nfunction resolveBuyerTeeAttestationRoute(\n platformName: string,\n buyerTeeProof: BuyerTeePaymentProofInput,\n): { actionPlatform: string; actionType: string } {\n const normalizedPlatformName = platformName.toLowerCase();\n\n if (normalizedPlatformName === 'zelle') {\n if (\n buyerTeeProof.actionPlatform !== 'zelle' ||\n !buyerTeeProof.actionType ||\n !GENERIC_ZELLE_ATTESTATION_ACTION_TYPES.has(buyerTeeProof.actionType)\n ) {\n throw new Error(\n 'Generic Zelle buyer TEE fulfillment requires actionPlatform \"zelle\" and a bank-specific transfer_zelle_* actionType.',\n );\n }\n\n return {\n actionPlatform: buyerTeeProof.actionPlatform,\n actionType: buyerTeeProof.actionType,\n };\n }\n\n if (hasBuyerTeeRouteOverrides(buyerTeeProof)) {\n return {\n actionPlatform: buyerTeeProof.actionPlatform,\n actionType: buyerTeeProof.actionType,\n };\n }\n\n const platformConfig = resolvePlatformAttestationConfig(platformName);\n return {\n actionPlatform: platformConfig.actionPlatform,\n actionType: platformConfig.actionType,\n };\n}\n\ntype FulfillIntentParams = {\n intentHash: `0x${string}`;\n proof: BuyerTeePaymentProofInput;\n timestampBufferMs?: string;\n attestationServiceFallbackUrls?: string[];\n attestationServiceUrl?: string;\n orchestratorAddress?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n precomputedAttestation?: {\n paymentProof: Hex;\n verificationData: Hex;\n };\n callbacks?: {\n onAttestationStart?: () => void;\n onAttestationComplete?: (attestation: FulfillIntentAttestationResponse) => 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 }) => EscrowContractContext;\n resolveOrchestratorContext: (options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n }) => Promise<OrchestratorContractContext>;\n resolveEscrowAddressOrThrow: (\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\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: (\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ) => Promise<FulfillIntentInputs>;\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 getApiHeaders: () => Record<string, string> | undefined;\n getApiTimeoutMs: () => number;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getIndexerClient: () => IndexerClient;\n getIndexerService: () => IndexerDepositService;\n getEscrowV2Address: () => Address | undefined;\n getOrchestratorV2Address: () => Address | undefined;\n getOrchestratorV3Address: () => Address | undefined;\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 escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n });\n const currentOrchestratorV3 = this.config.getOrchestratorV3Address();\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress ?? currentOrchestratorV3,\n escrowAddress: escrowContext.address,\n });\n const currentEscrow = this.config.getEscrowV2Address();\n if (\n (currentEscrow && escrowContext.address.toLowerCase() !== currentEscrow.toLowerCase()) ||\n !currentOrchestratorV3 ||\n orchestratorContext.address.toLowerCase() !== currentOrchestratorV3.toLowerCase()\n ) {\n throw new Error(\n 'signalIntent is only supported on the current EscrowV2 / OrchestratorV3 deployment',\n );\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 let 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 if ((gatingServiceSignature === undefined || signatureExpiration === undefined) && baseApiUrl) {\n const apiOpts = {\n baseApiUrl,\n timeoutMs: this.config.getApiTimeoutMs(),\n headers: this.config.getApiHeaders(),\n };\n\n const response = await apiSignIntentV3(\n {\n processorName: params.processorName,\n payeeDetails: params.payeeDetails,\n depositId: depositId.toString(),\n amount: amount.toString(),\n toAddress: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate: conversionRate.toString(),\n chainId: this.config.getChainId().toString(),\n orchestratorAddress: orchestratorContext.address,\n escrowAddress: escrowContext.address,\n callerAddress: this.config.getWalletClient().account!.address,\n referralFees: referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: referralFee.fee.toString(),\n })),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n },\n apiOpts,\n );\n\n gatingServiceSignature = response.signature;\n signatureExpiration = response.signatureExpiration;\n preIntentHookData = response.preIntentHookData ?? preIntentHookData;\n if (response.referralFees !== undefined) {\n referralFees = response.referralFees.map((referralFee) => {\n if (!isValidReferrerFeeRecipient(referralFee.recipient)) {\n throw new Error('/v3/sign returned invalid referral fee recipient');\n }\n\n let fee: bigint;\n try {\n fee = BigInt(referralFee.fee);\n } catch {\n throw new Error('/v3/sign returned non-integer referral fee value');\n }\n\n return {\n recipient: referralFee.recipient as Address,\n fee,\n };\n });\n }\n }\n\n if (gatingServiceSignature === undefined || signatureExpiration === undefined) {\n throw new Error('Missing gatingServiceSignature/signatureExpiration');\n }\n\n const args = [\n {\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'\n ? signatureExpiration\n : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n referralFees,\n preIntentHookData: (preIntentHookData ?? '0x') as `0x${string}`,\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 });\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 });\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\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 });\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\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 });\n const precomputed = params.precomputedAttestation;\n let paymentProof: Hex;\n let verificationData: Hex;\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 buyerTeeProof = parseBuyerTeePaymentProofInput(params.proof);\n const attestationServiceUrl =\n params.attestationServiceUrl ?? this.defaultAttestationService();\n const inputs = await this.config.host.getFulfillIntentInputs(intentHash, {\n orchestratorAddress: orchestratorContext.address,\n });\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 attestationRoute = resolveBuyerTeeAttestationRoute(platformName, buyerTeeProof);\n\n const 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\n const attestation = await apiVerifyBuyerTeePayment(\n {\n encryptedSessionMaterial: buyerTeeProof.encryptedSessionMaterial,\n params: buyerTeeProof.params,\n chainId: this.config.getChainId(),\n intent,\n },\n attestationServiceUrl,\n attestationRoute.actionPlatform,\n attestationRoute.actionType,\n { fallbackUrls: params.attestationServiceFallbackUrls },\n );\n paymentProof = encodePaymentAttestation(attestation);\n verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(attestation.responseObject.signer),\n });\n params.callbacks?.onAttestationComplete?.(attestation);\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(\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ): Promise<FulfillIntentInputs> {\n // ProtocolViewer covers both configured orchestrators sharing EscrowV2.\n // Unknown prior-era orchestrators still go straight to the indexer.\n const isProtocolViewerOrchestrator =\n !options?.orchestratorAddress ||\n options.orchestratorAddress.toLowerCase() ===\n this.config.getOrchestratorV2Address()?.toLowerCase() ||\n options.orchestratorAddress.toLowerCase() ===\n this.config.getOrchestratorV3Address()?.toLowerCase();\n\n if (isProtocolViewerOrchestrator) {\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 {\n // PV read failed, fall through to indexer.\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 status?: string | null;\n isExpired?: boolean | 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 status\n isExpired\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.status && record.status !== 'SIGNALED') {\n throw new ValidationError(\n `Intent not found or no longer fulfillable (status: ${record.status})`,\n 'intentHash',\n { intentHash, status: record.status },\n );\n }\n if (record.isExpired) {\n throw new ValidationError('Intent expired and can no longer be fulfilled', 'intentHash', {\n intentHash,\n });\n }\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 if (!deposit) {\n throw new Error(`Deposit ${record.depositId} not found on indexer for intent ${intentHash}`);\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 isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isBuyerTeeParams(value: unknown): value is BuyerTeePaymentProofInput['params'] {\n return (\n isRecord(value) &&\n Object.values(value).every(\n (entry) =>\n typeof entry === 'string' || typeof entry === 'number' || typeof entry === 'boolean',\n )\n );\n}\n\nfunction parseBuyerTeePaymentProofInput(proof: unknown): BuyerTeePaymentProofInput {\n if (!isRecord(proof) || proof.proofType !== 'buyerTee') {\n throw new Error(\n 'Buyer TEE proof input is required; legacy proof inputs are no longer supported.',\n );\n }\n\n if (typeof proof.encryptedSessionMaterial !== 'string' || !isBuyerTeeParams(proof.params)) {\n throw new Error('Buyer TEE proof requires encryptedSessionMaterial and params.');\n }\n\n const parsed: BuyerTeePaymentProofInput = {\n proofType: 'buyerTee',\n encryptedSessionMaterial: proof.encryptedSessionMaterial,\n params: proof.params,\n };\n\n if (typeof proof.actionType === 'string') {\n parsed.actionType = proof.actionType;\n }\n\n if (typeof proof.actionPlatform === 'string') {\n parsed.actionPlatform = proof.actionPlatform;\n }\n\n return parsed;\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","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 ProtocolViewerIntentResult = {\n view: PV_IntentView;\n context?: ProtocolViewerContext;\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.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 const seenEscrows = new Set<string>();\n const uniqueEscrowContexts = protocolViewerContexts.filter((context) => {\n const key = context.escrow.toLowerCase();\n if (seenEscrows.has(key)) return false;\n seenEscrows.add(key);\n return true;\n });\n return tryContexts(\n uniqueEscrowContexts,\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 unknown[];\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 unknown[];\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 unknown[];\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 unknown[];\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 unknown[];\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 getPvIntentWithContext(intentHash: `0x${string}`): Promise<ProtocolViewerIntentResult> {\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 { view: parsed, context };\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 { view: 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 async getPvIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n return (await this.getPvIntentWithContext(intentHash)).view;\n }\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 whitelistHookAddress\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 amount\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: { _ilike: $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 PROFIT_SNAPSHOTS_BY_DEPOSITS_QUERY = /* GraphQL */ `\n query GetProfitSnapshotsByDeposits($depositIds: [String!]) {\n profitSnapshots: MakerProfitSnapshot(\n where: { depositId: { _in: $depositIds } }\n order_by: { createdAt: desc }\n ) {\n id\n chainId\n maker\n intentId\n depositId\n fiatCurrency\n quoteConversionRate\n oracleRate\n spreadBps\n amount\n notionalFiatUsdCents\n feeUsd\n realizedProfitUsdCents\n priceSnapshotId\n status\n createdAt\n updatedAt\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\n/**\n * Hard-cut dispute-protection staking read model.\n *\n * The effective stake owner is supplied by the caller's authoritative\n * onchain read so the three current-state account rows can be fetched in one\n * request. The adapter verifies that owner against TakerStakeState before\n * associating the returned StakeAccountState with the taker.\n */\nexport const STAKING_STATE_QUERY = /* GraphQL */ `\n query StakingState(\n $takerStateId: String!\n $stakeAccountId: String!\n $claimAccountId: String!\n $vaultConfigId: String!\n $chainId: Int!\n $vault: String!\n $taker: String!\n $policy: String!\n ) {\n TakerStakeState_by_pk(id: $takerStateId) {\n taker\n stakeOwner\n selectedStakeOwner\n selectionAuthorized\n updatedAtBlockNumber\n updatedAt\n }\n StakeAccountState_by_pk(id: $stakeAccountId) {\n stakeOwner\n totalStake\n lockedStake\n freeStake\n updatedAtBlockNumber\n updatedAt\n }\n ClaimAccountState_by_pk(id: $claimAccountId) {\n beneficiary\n claimableAmount\n updatedAtBlockNumber\n updatedAt\n }\n TakerStakeAuthorization(\n where: { chainId: { _eq: $chainId }, vaultAddress: { _eq: $vault }, taker: { _eq: $taker } }\n order_by: { updatedAt: desc }\n ) {\n stakeOwner\n authorized\n updatedAtBlockNumber\n updatedAt\n }\n DisputeProtectionRiskWindow(\n where: { chainId: { _eq: $chainId }, policyAddress: { _eq: $policy } }\n order_by: { paymentMethod: asc }\n ) {\n paymentMethod\n riskWindow\n updatedAt\n }\n StakeVaultConfig_by_pk(id: $vaultConfigId) {\n controller\n pendingController\n pendingControllerValidAt\n updatedAtBlockNumber\n updatedAt\n }\n chain_metadata(where: { chain_id: { _eq: $chainId } }, limit: 1) {\n chain_id\n latest_processed_block\n }\n }\n`;\n\nexport const TAKER_STAKE_AUTHORIZATIONS_QUERY = /* GraphQL */ `\n query TakerStakeAuthorizations($where: TakerStakeAuthorization_bool_exp!, $limit: Int!) {\n TakerStakeAuthorization(where: $where, order_by: [{ id: asc }], limit: $limit) {\n id\n chainId\n vaultAddress\n taker\n stakeOwner\n authorized\n updatedAtBlockNumber\n updatedAt\n }\n }\n`;\n\nexport const STAKE_LOCKS_QUERY = /* GraphQL */ `\n query StakeLocks($where: StakeLock_bool_exp!, $limit: Int!) {\n StakeLock(where: $where, order_by: [{ id: asc }], limit: $limit) {\n id\n chainId\n vaultAddress\n lockId\n stakeOwner\n initialAmount\n currentAmount\n maturesAt\n status\n unlockedAmount\n claimedAmount\n createdAt\n updatedAtBlockNumber\n updatedAt\n }\n }\n`;\n\nexport const STAKE_ACTIVITY_QUERY = /* GraphQL */ `\n query StakeActivityPage($where: StakeActivity_bool_exp!, $limit: Int!) {\n StakeActivity(\n where: $where\n order_by: [{ blockNumber: asc }, { logIndex: asc }, { id: asc }]\n limit: $limit\n ) {\n id\n chainId\n vaultAddress\n stakeOwner\n taker\n beneficiary\n kind\n lockId\n counterparty\n amount\n previousAmount\n stakeBalanceAfter\n lockedStakeAfter\n freeStakeAfter\n claimableAfter\n maturesAt\n blockNumber\n logIndex\n timestamp\n }\n }\n`;\n\nexport const DISPUTE_PROTECTION_INTENTS_QUERY = /* GraphQL */ `\n query FinalizedDisputeProtectionIntents($where: DisputeProtectionIntent_bool_exp!, $limit: Int!) {\n DisputeProtectionIntent(\n where: $where\n order_by: [{ disputedAtBlockNumber: asc }, { disputedAtLogIndex: asc }, { id: asc }]\n limit: $limit\n ) {\n id\n chainId\n policyAddress\n intentHash\n status\n stakeOwner\n depositor\n taker\n paymentMethod\n amount\n riskWindow\n releaseEligibleAt\n releaseAmount\n isManualRelease\n compensatedAmount\n disputeId\n openedAt\n openedTxHash\n cancelledAt\n cancelledTxHash\n settledAt\n settledTxHash\n releasedAt\n releasedTxHash\n disputedAt\n disputedTxHash\n disputedAtBlockNumber\n disputedAtLogIndex\n updatedAt\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\ninterface ConvertLiquidityOptions {\n includePrivateOrderbooks?: boolean;\n}\n\nexport function convertDepositsForLiquidity(\n deposits: DepositWithRelations[],\n chainId: number,\n escrowAddress: string,\n options: ConvertLiquidityOptions = {},\n): EscrowDepositView[] {\n const { includePrivateOrderbooks = false } = options;\n return deposits\n .filter(\n (d) =>\n d.depositor &&\n d.depositor.toLowerCase() !== ZERO &&\n (includePrivateOrderbooks ||\n normalizeAddress(d.whitelistHookAddress).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","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 { 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 PROFIT_SNAPSHOTS_BY_DEPOSITS_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 MakerProfitSnapshotEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\nimport { logger } from '../utils/logger';\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 }];\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 rateManagerId?: string;\n statuses?: IntentStatus[];\n limit?: number;\n offset?: number;\n orderByField?: 'signalTimestamp' | 'fulfillTimestamp';\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.rateManagerId) where.rateManagerId = { _ilike: params.rateManagerId };\n if (params.statuses?.length) where.status = { _in: params.statuses };\n if (!Object.keys(where).length) return [];\n const orderByField = params.orderByField ?? 'signalTimestamp';\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: [{ [orderByField]: '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 fetchIntentsByRateManager(\n rateManagerId: string,\n statuses?: IntentStatus[],\n ): Promise<IntentEntity[]> {\n const normalizedRateManagerId = rateManagerId?.trim();\n if (!normalizedRateManagerId) return [];\n\n return this.fetchIntents({\n rateManagerId: normalizedRateManagerId,\n statuses,\n limit: 500,\n orderByField: 'fulfillTimestamp',\n });\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 (error) {\n logger.warn(\n '[sdk] resolvePayeeHash lookup failed; returning null',\n error instanceof Error ? error.message : error,\n );\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 async fetchProfitSnapshotsByDeposits(depositIds: string[]): Promise<MakerProfitSnapshotEntity[]> {\n const normalizedDepositIds = Array.from(\n new Set(\n depositIds\n .map((depositId) => depositId?.trim())\n .filter((depositId): depositId is string => Boolean(depositId)),\n ),\n );\n if (!normalizedDepositIds.length) return [];\n\n try {\n const result = await this.client.query<{\n profitSnapshots?: MakerProfitSnapshotEntity[];\n MakerProfitSnapshot?: MakerProfitSnapshotEntity[];\n }>({\n query: PROFIT_SNAPSHOTS_BY_DEPOSITS_QUERY,\n variables: { depositIds: normalizedDepositIds },\n });\n\n return result.profitSnapshots ?? result.MakerProfitSnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n}\n","export const normalizeReferralCode = (code: string): string => code.trim().toUpperCase();\n\nexport const isValidReferralCode = (code: string): boolean =>\n /^[A-Z0-9]{6}$/.test(normalizeReferralCode(code));\n\nexport const REFERRAL_SIGNATURE_DOMAIN = { name: 'ZKP2PReferral', version: '1' } as const;\n\nexport const REFERRAL_SIGNATURE_TYPES = {\n CreateCode: [\n { name: 'wallet', type: 'address' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n RedeemCode: [\n { name: 'wallet', type: 'address' },\n { name: 'code', type: 'string' },\n { name: 'referrer', type: 'address' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n RenameCode: [\n { name: 'wallet', type: 'address' },\n { name: 'oldCode', type: 'string' },\n { name: 'newCode', type: 'string' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n} as const;\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 { currencyKeccak256 } from \"../utils/currencyKeccak256\";\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 NOK: \"NOK\",\n MXN: \"MXN\",\n MYR: \"MYR\",\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};\n\nexport type CurrencyType = (typeof Currency)[keyof typeof Currency];\n\nfunction getCurrencies(): string[] {\n return Object.values(Currency);\n}\n\nexport function getCurrencyInfoFromHash(\n currencyCodeOrHash: string,\n): CurrencyData | null {\n return (\n Object.values(currencyInfo).find(\n (currency) =>\n currency.currencyCodeHash === currencyCodeOrHash ||\n currency.currencyCode === currencyCodeOrHash,\n ) ?? null\n );\n}\n\nexport function getCurrencyInfoFromCountryCode(\n countryCode: string,\n): CurrencyData | null {\n return (\n Object.values(currencyInfo).find(\n (currency) => currency.countryCode === countryCode,\n ) ?? null\n );\n}\n\nexport function isSupportedCurrency(currencyCode: string): boolean {\n return Object.values(currencyInfo).some(\n (currency) => currency.currencyCode === currencyCode,\n );\n}\n\nexport const currencies = getCurrencies();\n\ninterface CurrencyData {\n currency: CurrencyType;\n currencyCode: string;\n currencyName: string;\n currencySymbol: string;\n currencyCodeHash: string;\n countryCode: string;\n}\n\nexport const currencyInfo: Record<CurrencyType, CurrencyData> = {\n [Currency.AED]: {\n currency: Currency.AED,\n currencyCode: \"AED\",\n currencyName: \"United Arab Emirates Dirham\",\n currencyCodeHash: currencyKeccak256(\"AED\"),\n currencySymbol: \"د.إ\",\n countryCode: \"ae\",\n },\n [Currency.ARS]: {\n currency: Currency.ARS,\n currencyCode: \"ARS\",\n currencyName: \"Argentine Peso\",\n currencyCodeHash: currencyKeccak256(\"ARS\"),\n currencySymbol: \"$\",\n countryCode: \"ar\",\n },\n [Currency.AUD]: {\n currency: Currency.AUD,\n currencyCode: \"AUD\",\n currencyName: \"Australian Dollar\",\n currencyCodeHash: currencyKeccak256(\"AUD\"),\n currencySymbol: \"A$\",\n countryCode: \"au\",\n },\n [Currency.BRL]: {\n currency: Currency.BRL,\n currencyCode: \"BRL\",\n currencyName: \"Brazilian Real\",\n currencyCodeHash: currencyKeccak256(\"BRL\"),\n currencySymbol: \"R$\",\n countryCode: \"br\",\n },\n [Currency.CAD]: {\n currency: Currency.CAD,\n currencyCode: \"CAD\",\n currencyName: \"Canadian Dollar\",\n currencyCodeHash: currencyKeccak256(\"CAD\"),\n currencySymbol: \"C$\",\n countryCode: \"ca\",\n },\n [Currency.CHF]: {\n currency: Currency.CHF,\n currencyCode: \"CHF\",\n currencyName: \"Swiss Franc\",\n currencyCodeHash: currencyKeccak256(\"CHF\"),\n currencySymbol: \"Fr\",\n countryCode: \"ch\",\n },\n [Currency.CNY]: {\n currency: Currency.CNY,\n currencyCode: \"CNY\",\n currencyName: \"Chinese Yuan\",\n currencyCodeHash: currencyKeccak256(\"CNY\"),\n currencySymbol: \"¥\",\n countryCode: \"cn\",\n },\n [Currency.CZK]: {\n currency: Currency.CZK,\n currencyCode: \"CZK\",\n currencyName: \"Czech Koruna\",\n currencyCodeHash: currencyKeccak256(\"CZK\"),\n currencySymbol: \"Kč\",\n countryCode: \"cz\",\n },\n [Currency.DKK]: {\n currency: Currency.DKK,\n currencyCode: \"DKK\",\n currencyName: \"Danish Krone\",\n currencyCodeHash: currencyKeccak256(\"DKK\"),\n currencySymbol: \"kr\",\n countryCode: \"dk\",\n },\n [Currency.EUR]: {\n currency: Currency.EUR,\n currencyCode: \"EUR\",\n currencyName: \"Euro\",\n currencyCodeHash: currencyKeccak256(\"EUR\"),\n currencySymbol: \"€\",\n countryCode: \"eu\",\n },\n [Currency.GBP]: {\n currency: Currency.GBP,\n currencyCode: \"GBP\",\n currencyName: \"British Pound\",\n currencyCodeHash: currencyKeccak256(\"GBP\"),\n currencySymbol: \"£\",\n countryCode: \"gb\",\n },\n [Currency.HKD]: {\n currency: Currency.HKD,\n currencyCode: \"HKD\",\n currencyName: \"Hong Kong Dollar\",\n currencyCodeHash: currencyKeccak256(\"HKD\"),\n currencySymbol: \"HK$\",\n countryCode: \"hk\",\n },\n [Currency.HUF]: {\n currency: Currency.HUF,\n currencyCode: \"HUF\",\n currencyName: \"Hungarian Forint\",\n currencyCodeHash: currencyKeccak256(\"HUF\"),\n currencySymbol: \"Ft\",\n countryCode: \"hu\",\n },\n [Currency.IDR]: {\n currency: Currency.IDR,\n currencyCode: \"IDR\",\n currencyName: \"Indonesian Rupiah\",\n currencyCodeHash: currencyKeccak256(\"IDR\"),\n currencySymbol: \"Rp\",\n countryCode: \"id\",\n },\n [Currency.INR]: {\n currency: Currency.INR,\n currencyCode: \"INR\",\n currencyName: \"Indian Rupee\",\n currencyCodeHash: currencyKeccak256(\"INR\"),\n currencySymbol: \"₹\",\n countryCode: \"in\",\n },\n [Currency.ILS]: {\n currency: Currency.ILS,\n currencyCode: \"ILS\",\n currencyName: \"Israeli New Shekel\",\n currencyCodeHash: currencyKeccak256(\"ILS\"),\n currencySymbol: \"₪\",\n countryCode: \"il\",\n },\n [Currency.JPY]: {\n currency: Currency.JPY,\n currencyCode: \"JPY\",\n currencyName: \"Japanese Yen\",\n currencyCodeHash: currencyKeccak256(\"JPY\"),\n currencySymbol: \"¥\",\n countryCode: \"jp\",\n },\n [Currency.KES]: {\n currency: Currency.KES,\n currencyCode: \"KES\",\n currencyName: \"Kenyan Shilling\",\n currencyCodeHash: currencyKeccak256(\"KES\"),\n currencySymbol: \"KSh\",\n countryCode: \"ke\",\n },\n [Currency.MXN]: {\n currency: Currency.MXN,\n currencyCode: \"MXN\",\n currencyName: \"Mexican Peso\",\n currencyCodeHash: currencyKeccak256(\"MXN\"),\n currencySymbol: \"$\",\n countryCode: \"mx\",\n },\n [Currency.MYR]: {\n currency: Currency.MYR,\n currencyCode: \"MYR\",\n currencyName: \"Malaysian Ringgit\",\n currencyCodeHash: currencyKeccak256(\"MYR\"),\n currencySymbol: \"RM\",\n countryCode: \"my\",\n },\n [Currency.NOK]: {\n currency: Currency.NOK,\n currencyCode: \"NOK\",\n currencyName: \"Norwegian Krone\",\n currencyCodeHash: currencyKeccak256(\"NOK\"),\n currencySymbol: \"kr\",\n countryCode: \"no\",\n },\n [Currency.NZD]: {\n currency: Currency.NZD,\n currencyCode: \"NZD\",\n currencyName: \"New Zealand Dollar\",\n currencyCodeHash: currencyKeccak256(\"NZD\"),\n currencySymbol: \"NZ$\",\n countryCode: \"nz\",\n },\n [Currency.PHP]: {\n currency: Currency.PHP,\n currencyCode: \"PHP\",\n currencyName: \"Philippine Peso\",\n currencyCodeHash: currencyKeccak256(\"PHP\"),\n currencySymbol: \"₱\",\n countryCode: \"ph\",\n },\n [Currency.PLN]: {\n currency: Currency.PLN,\n currencyCode: \"PLN\",\n currencyName: \"Polish Złoty\",\n currencyCodeHash: currencyKeccak256(\"PLN\"),\n currencySymbol: \"zł\",\n countryCode: \"pl\",\n },\n [Currency.RON]: {\n currency: Currency.RON,\n currencyCode: \"RON\",\n currencyName: \"Romanian Leu\",\n currencyCodeHash: currencyKeccak256(\"RON\"),\n currencySymbol: \"lei\",\n countryCode: \"ro\",\n },\n [Currency.SAR]: {\n currency: Currency.SAR,\n currencyCode: \"SAR\",\n currencyName: \"Saudi Riyal\",\n currencyCodeHash: currencyKeccak256(\"SAR\"),\n currencySymbol: \"﷼\",\n countryCode: \"sa\",\n },\n [Currency.SEK]: {\n currency: Currency.SEK,\n currencyCode: \"SEK\",\n currencyName: \"Swedish Krona\",\n currencyCodeHash: currencyKeccak256(\"SEK\"),\n currencySymbol: \"kr\",\n countryCode: \"se\",\n },\n [Currency.SGD]: {\n currency: Currency.SGD,\n currencyCode: \"SGD\",\n currencyName: \"Singapore Dollar\",\n currencyCodeHash: currencyKeccak256(\"SGD\"),\n currencySymbol: \"S$\",\n countryCode: \"sg\",\n },\n [Currency.THB]: {\n currency: Currency.THB,\n currencyCode: \"THB\",\n currencyName: \"Thai Baht\",\n currencyCodeHash: currencyKeccak256(\"THB\"),\n currencySymbol: \"฿\",\n countryCode: \"th\",\n },\n [Currency.TRY]: {\n currency: Currency.TRY,\n currencyCode: \"TRY\",\n currencyName: \"Turkish Lira\",\n currencyCodeHash: currencyKeccak256(\"TRY\"),\n currencySymbol: \"₺\",\n countryCode: \"tr\",\n },\n [Currency.UGX]: {\n currency: Currency.UGX,\n currencyCode: \"UGX\",\n currencyName: \"Ugandan Shilling\",\n currencyCodeHash: currencyKeccak256(\"UGX\"),\n currencySymbol: \"USh\",\n countryCode: \"ug\",\n },\n [Currency.USD]: {\n currency: Currency.USD,\n currencyCode: \"USD\",\n currencyName: \"United States Dollar\",\n currencyCodeHash: currencyKeccak256(\"USD\"),\n currencySymbol: \"$\",\n countryCode: \"us\",\n },\n [Currency.VND]: {\n currency: Currency.VND,\n currencyCode: \"VND\",\n currencyName: \"Vietnamese Dong\",\n currencyCodeHash: currencyKeccak256(\"VND\"),\n currencySymbol: \"₫\",\n countryCode: \"vn\",\n },\n [Currency.ZAR]: {\n currency: Currency.ZAR,\n currencyCode: \"ZAR\",\n currencyName: \"South African Rand\",\n currencyCodeHash: currencyKeccak256(\"ZAR\"),\n currencySymbol: \"R\",\n countryCode: \"za\",\n },\n};\n\n// Utility helpers to safely resolve currency values at runtime\nexport function resolveCurrency(currencyCode?: string | null): CurrencyType {\n const code = (currencyCode || \"\").toUpperCase();\n return isSupportedCurrency(code) ? (code as CurrencyType) : Currency.USD;\n}\n\nexport const resolveCurrencyCode = (\n value?: string | null,\n): CurrencyType | undefined => {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n if (!trimmed.startsWith(\"0x\")) {\n const upper = trimmed.toUpperCase() as CurrencyType;\n return currencyInfo[upper] ? upper : undefined;\n }\n\n const info = getCurrencyInfoFromHash(trimmed);\n return info ? (info.currencyCode as CurrencyType) : undefined;\n};\n","import { CurrencyType } from \"../types/currency\";\nimport { ExtensionRequestMetadata } from \"../types/browserExtension\";\nimport type { CuratorMetadata } from \"../types/curator\";\n\n// Platforms that can be used to send payments\nexport const PaymentPlatform = {\n VENMO: \"venmo\",\n CASHAPP: \"cashapp\",\n CHIME: \"chime\",\n LUXON: \"luxon\",\n REVOLUT: \"revolut\",\n WISE: \"wise\",\n MERCADO_PAGO: \"mercadopago\",\n ZELLE: \"zelle\",\n PAYPAL: \"paypal\",\n MONZO: \"monzo\",\n N26: \"n26\",\n ALIPAY: \"alipay\",\n UPI: \"upi\",\n};\n\nexport const paymentPlatforms = [...Object.values(PaymentPlatform)];\nexport type PaymentPlatformType =\n (typeof PaymentPlatform)[keyof typeof PaymentPlatform];\n\n// Payment platform enums and interfaces\nexport enum PaymentPlatformDefaultPaymentMode {\n QR_CODE = \"QR_CODE\",\n WEB_PAYMENT = \"WEB_PAYMENT\",\n}\n\nexport interface ParsedPaymentDetails {\n amount: string;\n parsedAmount: boolean; // whether the amount was successfully parsed\n date: string;\n parsedDate: boolean; // whether the date was successfully parsed\n recipientId: string;\n parsedRecipientId: boolean; // whether the recipientId was successfully parsed\n currency: string;\n parsedCurrency: boolean; // whether the currency was successfully parsed\n}\n\nexport interface SendPaymentConfig {\n paymentMethodName?: string;\n paymentMethodIcon?: string;\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode;\n useCustomQRCode?: boolean;\n payeeDetailPrefix?: string;\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n memo?: string,\n ) => string;\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n memo?: string,\n ) => string;\n deepLinkEmbedsRecipient: boolean;\n supportsSendingPaymentOnWeb: boolean;\n showTroubleScanningQRCodeLink: boolean;\n sendPaymentWarning?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => string;\n sendPaymentInfo?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => string;\n // Optional structured guidance for clearer bullets and emphasis\n sendPaymentDos?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => Array<{ text: string; emphasize?: string[] }>;\n sendPaymentDonts?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => Array<{ text: string; emphasize?: string[] }>;\n}\n\nexport interface PaymentVerificationConfig {\n authLink: string;\n actionType: string;\n // Action type used for attestation-service routing. Defaults to `actionType`.\n // Override when the extension provider config and the attestation verifier\n // are keyed differently.\n attestationActionType?: string;\n // Platform used for attestation-service routing. Defaults to `actionPlatform`.\n // Override when capture uses a provider-specific platform but verification\n // uses a generic on-chain platform.\n attestationPlatform?: string;\n actionPlatform: string;\n buyerTeeParams?: {\n includeMetadataIndex?: boolean;\n };\n numPaymentsFetched: number;\n minExtensionVersion: string;\n supportsAppclip: boolean;\n parseMetadata: (metadata: ExtensionRequestMetadata) => ParsedPaymentDetails;\n reverseTransactionHistoryOrder?: boolean;\n getSubjectText: (metadata: ExtensionRequestMetadata) => string;\n totalProofs: number;\n}\n\nexport interface PlatformExtensionConfig {\n providerId: string;\n minExtensionVersion: string;\n}\n\nexport interface PlatformExtensionRegistrationConfig extends PlatformExtensionConfig {\n ctaLabel: string;\n requiredPrompt: string;\n ctaSubtext?: string;\n}\n\nexport type PlatformPayeeData = {\n offchainId: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n};\n\ninterface PlatformDepositConfigBase {\n payeeDetailInputPlaceholder: string;\n payeeDetailInputHelperText: string;\n payeeDetailValidationFailureMessage: string;\n // Attestation the maker must tick before a deposit can bind this account.\n // Set it only where enrollment cannot be checked programmatically, so the\n // maker is the one confirming the account can actually receive a payment.\n payeeEnrollmentConfirmation?: string;\n getDepositData: (payeeDetails: string) => PlatformPayeeData;\n getPayeeDetail: (data: PlatformPayeeData) => string;\n}\n\nexport type PlatformDepositConfig =\n | (PlatformDepositConfigBase & {\n shouldVerifyOnExtension: true;\n extensionRegistration: PlatformExtensionRegistrationConfig;\n })\n | (PlatformDepositConfigBase & {\n shouldVerifyOnExtension?: false;\n extensionRegistration?: PlatformExtensionRegistrationConfig;\n });\n\nexport interface PaymentPlatformConfig {\n platformId: PaymentPlatformType;\n platformLogo?: string | undefined;\n platformName: string;\n platformCurrencies: CurrencyType[];\n minFiatAmount: string;\n localeTimeString: string;\n platformIcon?: string;\n platformColor?: string; // Platform's brand color for fallback logo background\n isBeta?: boolean; // Platform is available but may still be unstable\n // Optional client-side caps for better pre-validation UX\n maxUsdcPerIntent?: string; // e.g., '5000' means 5000 USDC cap\n\n // One deposit config per platform\n depositConfig: PlatformDepositConfig;\n\n // Override when payment links use a recipient identifier that differs from\n // the canonical offchain ID shown to the buyer.\n getPaymentLinkRecipientId?: (data: PlatformPayeeData) => string;\n\n hasMultiplePaymentMethods: boolean;\n hasMultipleVerificationMethods: boolean;\n // Multiple payment methods per platform\n paymentMethods: Array<{\n sendConfig: SendPaymentConfig;\n verifyConfig: PaymentVerificationConfig;\n }>;\n}\n","import { Currency, CurrencyType, currencyInfo } from \"../types/currency\";\nimport { ExtensionRequestMetadata } from \"../types/browserExtension\";\nimport {\n PaymentPlatform,\n PaymentPlatformDefaultPaymentMode,\n ParsedPaymentDetails,\n PaymentPlatformConfig,\n SendPaymentConfig,\n PaymentVerificationConfig,\n PlatformDepositConfig,\n} from \"./types\";\n\n/**\n * Encodes a Zelle recipient ID into a base64 string\n * @param recipientId The Zelle recipient ID to encode\n * @returns Base64 encoded string\n */\nexport const encodeZelleRecipientId = (recipientId: string): string => {\n const payload = {\n name: \"\",\n action: \"payment\",\n token: recipientId,\n };\n return btoa(JSON.stringify(payload));\n};\n\nexport const GENERIC_ZELLE_BANK_ORDER = [\"chase\", \"bofa\", \"citi\"] as const;\nexport type GenericZelleBankId = (typeof GENERIC_ZELLE_BANK_ORDER)[number];\n\nexport type GenericZelleBankRoute = {\n bankId: GenericZelleBankId;\n sendConfig: SendPaymentConfig;\n verifyConfig: PaymentVerificationConfig;\n};\n\n// Bank of America configuration\n// ----------------------------\n\n// Define Bank of America send payment config\nconst zelleBankOfAmericaSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Bank of America\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => `https://www.bankofamerica.com/`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n // QR-code deeplink never worked, so deeplink to the BOA Zelle page instead.\n return `https://www.bankofamerica.com/movemoney`;\n },\n deepLinkEmbedsRecipient: false,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Bank of America's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Only use Bank of America. Scan the QR code and manually enter the recipient email. Double-check the email before sending.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Bank of America\", emphasize: [\"Bank of America\"] },\n {\n text: \"Scan the QR code and manually enter the recipient email\",\n emphasize: [\"manually\", \"recipient email\"],\n },\n {\n text: \"Double-check the email before sending\",\n emphasize: [\"Double-check\"],\n },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not use any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Bank of America verification config\nconst zelleBankOfAmericaVerifyConfig: PaymentVerificationConfig = {\n authLink: \"https://www.bankofamerica.com/\",\n actionType: \"transfer_zelle_bofa\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 1,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 10) {\n // Check if it's in format \"2025-05-04\"\n dateStr = `${dateStr}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: false,\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Chase configuration\n// ----------------------------\n\n// Define Chase send config\nconst zelleChaseSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Chase\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) =>\n `https://secure.chase.com/web/auth/dashboard#/dashboard/singleDoor/singleDoorController/index`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n const encodedRecipientId = encodeZelleRecipientId(recipientId);\n return `https://enroll.zellepay.com/qr-codes?data=${encodedRecipientId}`;\n },\n deepLinkEmbedsRecipient: true,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Chase's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Do not send using any other bank.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Chase for this payment\", emphasize: [\"Chase\"] },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not send using any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Chase payment verification config\nconst zelleChaseVerifyConfig: PaymentVerificationConfig = {\n authLink:\n \"https://secure.chase.com/web/auth/dashboard#/dashboard/singleDoor/payments/activity;params=qp,sentactivity\",\n actionType: \"transfer_zelle_chase\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 2,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 8) {\n // Check if it's in format \"20250504\"\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n dateStr = `${year}-${month}-${day}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: false,\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Citi configuration\n// ----------------------------\n\n// Define Citi send config\nconst zelleCitiSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Citi\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => `https://online.citi.com/US/nga/zelle/transfer`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n const encodedRecipientId = encodeZelleRecipientId(recipientId);\n return `https://enroll.zellepay.com/qr-codes?data=${encodedRecipientId}`;\n },\n deepLinkEmbedsRecipient: true,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Citi's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Do not send using any other bank.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Citi for this payment\", emphasize: [\"Citi\"] },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not send using any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Citi verification config\nconst zelleCitiVerifyConfig: PaymentVerificationConfig = {\n authLink: \"https://online.citi.com/US/nga/zelle/transfer\",\n actionType: \"transfer_zelle_citi\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 1,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 8) {\n // Check if it's in format \"20250504\"\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n dateStr = `${year}-${month}-${day}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: recipientIdStr !== \"\",\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Define the Zelle deposit configuration (common for all banks)\nconst zelleDepositConfig: PlatformDepositConfig = {\n payeeDetailInputPlaceholder: \"Enter your email\",\n payeeDetailInputHelperText: \"This is the email you use with Zelle\",\n payeeDetailValidationFailureMessage:\n \"Make sure there are no typos in your email\",\n // Zelle enrollment lives with the bank, so nothing here can verify it. A\n // maker who registers an unenrolled email only finds out when a buyer's\n // payment fails, so make them confirm it before the deposit is created.\n payeeEnrollmentConfirmation:\n \"I have enrolled this email address with Zelle and can receive payments at it\",\n getDepositData: (payeeDetails: string) => {\n return {\n offchainId: payeeDetails.trim().toLowerCase(),\n };\n },\n getPayeeDetail: (data) => {\n return data.offchainId;\n },\n};\n\nexport const genericZelleBankRoutes = [\n {\n bankId: \"chase\",\n sendConfig: zelleChaseSendConfig,\n verifyConfig: zelleChaseVerifyConfig,\n },\n {\n bankId: \"bofa\",\n sendConfig: zelleBankOfAmericaSendConfig,\n verifyConfig: zelleBankOfAmericaVerifyConfig,\n },\n {\n bankId: \"citi\",\n sendConfig: zelleCitiSendConfig,\n verifyConfig: zelleCitiVerifyConfig,\n },\n] as const satisfies ReadonlyArray<GenericZelleBankRoute>;\n\nconst genericZellePaymentMethods: PaymentPlatformConfig[\"paymentMethods\"] =\n genericZelleBankRoutes.map(({ sendConfig, verifyConfig }) => ({\n sendConfig,\n verifyConfig,\n }));\n\n// Export the complete Zelle platform configuration with multiple payment methods\nexport const zelleConfig: PaymentPlatformConfig = {\n platformId: PaymentPlatform.ZELLE,\n platformName: \"Zelle\",\n platformLogo: \"\",\n platformColor: \"#6D1ED4\", // Zelle's brand purple color\n platformCurrencies: [Currency.USD],\n minFiatAmount: \"0.1\", // 0.1 USD\n localeTimeString: \"en-US\",\n depositConfig: zelleDepositConfig,\n hasMultiplePaymentMethods: true,\n hasMultipleVerificationMethods: false,\n paymentMethods: genericZellePaymentMethods,\n};\n","import { PaymentPlatform, type PaymentPlatformType } from \"./types\";\n\n/** Payment methods with a nonzero dispute-protection stake window. */\nexport const DISPUTE_PROTECTION_STAKE_PLATFORMS = [\n PaymentPlatform.VENMO,\n PaymentPlatform.PAYPAL,\n] as const satisfies readonly PaymentPlatformType[];\n\nconst disputeProtectionStakePlatformSet = new Set<PaymentPlatformType>(\n DISPUTE_PROTECTION_STAKE_PLATFORMS,\n);\n\nexport const isDisputeProtectionStakePlatform = (\n platform: PaymentPlatformType,\n): boolean => disputeProtectionStakePlatformSet.has(platform);\n\nexport const hasDisputeProtectionStakePlatform = (\n platforms: readonly PaymentPlatformType[],\n): boolean => platforms.some(isDisputeProtectionStakePlatform);\n\nexport interface DisputeProtectionProjection {\n disputeProtectionOptedOut?: unknown;\n disputeProtectionRequiresStake?: unknown;\n}\n\n/**\n * Validates the Curator-owned projection as one canonical pair. Stake cannot\n * be required for an explicitly opted-out deposit/payment-method tuple.\n */\nexport const isCanonicalDisputeProtectionProjection = (\n projection: DisputeProtectionProjection,\n): projection is {\n disputeProtectionOptedOut: boolean;\n disputeProtectionRequiresStake: boolean;\n} =>\n typeof projection.disputeProtectionOptedOut === \"boolean\" &&\n typeof projection.disputeProtectionRequiresStake === \"boolean\" &&\n (!projection.disputeProtectionRequiresStake ||\n !projection.disputeProtectionOptedOut);\n","import type {\n BestByPlatformResponse,\n PostDepositDetailsRequest,\n PostDepositDetailsResponse,\n SellerCredentialBundleUpload,\n QuotesBestByPlatformRequest,\n QuoteRequest,\n QuoteResponse,\n GetPayeeDetailsRequest,\n GetPayeeDetailsResponse,\n ValidatePayeeDetailsRequest,\n ValidatePayeeDetailsResponse,\n GetOwnerDepositsRequest,\n GetOwnerDepositsResponse,\n ApiDeposit,\n DepositVerifier,\n DepositVerifierCurrency,\n GetDepositBundleParams,\n GetDepositBundleResponse,\n GetOrderbookParams,\n GetOrderbookResponse,\n GetOrderbookTableResponse,\n OrderbookTableRow,\n CreateReferralCodeRequest,\n CreateReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n ReferralReadRequest,\n RedeemReferralCodeRequest,\n RedeemReferralCodeResponse,\n UpdateReferralCodeRequest,\n UpdateReferralCodeResponse,\n ApiAdapterOptions,\n CuratorSellerCredentialStatusResponse,\n CuratorSellerCredentialUploadResponse,\n CuratorSellerVerifyResponse,\n GoogleOAuthSellerCredentialPlatform,\n GoogleOAuthSellerCredentialUploadBodyByPlatform,\n SellerCredentialUploadPlatform,\n SellerPlatform,\n SellerVerifyProxyBody,\n} from '../types';\nimport type { Hash } from 'viem';\nimport { getContracts, type RuntimeEnv } from '../contracts';\nimport { SUPPORTED_CHAIN_IDS } from '../constants';\nimport { isValidHexAddress } from '../utils/address';\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';\nimport { logger } from '../utils/logger';\nimport { normalizeReferralCode } from '../referral';\nimport { isCanonicalDisputeProtectionProjection } from '@zkp2p/core/platforms';\nimport {\n METHOD_NAME_TO_HASH,\n SUPPORTED_PAYMENT_METHOD_HASHES,\n matchesPaymentMethodNameAndHash,\n matchesQuotePaymentMethod,\n} from '../utils/paymentMethodHashes';\n\n/**\n * Creates headers for Curator API requests.\n */\nfunction createHeaders(\n apiKey?: string,\n authorizationToken?: string,\n extraHeaders?: Record<string, string>,\n): 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 }\n // Caller headers land last so a service key like `x-pp-key` can be added and,\n // where a caller means to, an SDK-set header can be replaced outright.\n return { ...headers, ...extraHeaders };\n}\n\n// Normalize base API URL to avoid duplicate version segments.\nfunction withApiBase(baseApiUrl: string): string {\n const trimmed = (baseApiUrl || '').trim();\n // remove trailing slashes\n let base = trimmed.replace(/\\/+$/, '');\n // Versioned routes are selected per operation below.\n base = base.replace(/\\/v[123]$/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 authorizationToken,\n headers: extraHeaders,\n timeoutMs,\n retryCount = 3,\n retryDelayMs = 1000,\n}: {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n body?: any;\n apiKey?: string;\n authorizationToken?: string;\n headers?: Record<string, 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, authorizationToken, extraHeaders),\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\ntype CuratorEnvelope<T> = {\n success: boolean;\n message: string;\n responseObject: T;\n statusCode: number;\n};\n\nfunction unwrapResponseObject<T>(payload: CuratorEnvelope<T> | T): T {\n if (payload && typeof payload === 'object' && 'responseObject' in payload) {\n return (payload as CuratorEnvelope<T>).responseObject;\n }\n return payload as T;\n}\n\nfunction requireAuthorizationToken(\n authorizationToken: string | undefined,\n endpoint: string,\n): string {\n if (!authorizationToken) {\n throw new ValidationError(\n `authorizationToken is required for ${endpoint}`,\n 'authorizationToken',\n );\n }\n return authorizationToken;\n}\n\nfunction requireReferralWriteAuth(\n authorizationToken: string | undefined,\n signature: unknown,\n endpoint: string,\n): string | undefined {\n if (authorizationToken && signature) {\n throw new ValidationError(\n `Use either authorizationToken or signature for ${endpoint}, not both`,\n 'authorizationToken',\n );\n }\n if (!authorizationToken && !signature) {\n throw new ValidationError(\n `authorizationToken or signature is required for ${endpoint}`,\n 'authorizationToken',\n );\n }\n return authorizationToken;\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 normalizeReferralAddress(address: string, field: string): string {\n const normalized = address.trim().toLowerCase();\n if (!isValidHexAddress(normalized)) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return normalized;\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 if (!SUPPORTED_PAYMENT_METHOD_HASHES.has(methodHash.toLowerCase())) continue;\n const resolvedConversionRate = currency.conversionRate ?? currency.minConversionRate;\n if (resolvedConversionRate === null || resolvedConversionRate === undefined) {\n logger.warn(\n `[sdk] Skipping currency with missing conversion rate (deposit ${deposit.depositId}, currency ${currency.currencyCode})`,\n );\n continue;\n }\n const bucket = currenciesByMethod.get(methodHash) ?? [];\n bucket.push({\n currencyCode: currency.currencyCode,\n conversionRate: resolvedConversionRate,\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(\n (paymentMethod) =>\n paymentMethod.active !== false &&\n SUPPORTED_PAYMENT_METHOD_HASHES.has(paymentMethod.paymentMethodHash.toLowerCase()),\n )\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 apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/makers/create`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuote(\n req: QuoteRequest,\n opts: ApiAdapterOptions,\n): Promise<QuoteResponse>;\nexport async function apiGetQuote(\n req: QuoteRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<QuoteResponse>;\nexport async function apiGetQuote(\n req: QuoteRequest,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMsArg?: number,\n): Promise<QuoteResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? { baseApiUrl: optsOrBaseApiUrl, timeoutMs: timeoutMsArg }\n : optsOrBaseApiUrl;\n const baseApiUrl = opts.baseApiUrl;\n const timeoutMs = opts.timeoutMs;\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 if (!isValidHexAddress(req.user)) {\n throw new ValidationError('user must be a valid Ethereum address', 'user');\n }\n if (!isValidHexAddress(req.recipient)) {\n throw new ValidationError('recipient must be a valid Ethereum address', 'recipient');\n }\n if (!isValidHexAddress(req.destinationToken)) {\n throw new ValidationError(\n 'destinationToken must be a valid Ethereum address',\n 'destinationToken',\n );\n }\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'exact-fiat' : 'exact-token';\n let url = `${withApiBase(baseApiUrl)}/v3/quote/${endpoint}`;\n if (req.quotesToReturn) url += `?quotesToReturn=${req.quotesToReturn}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: String(req.amount),\n amount: undefined,\n isExactFiat: undefined,\n quotesToReturn: undefined,\n referrerFeeConfig: undefined,\n referralFees: req.referralFees ?? (req.referrerFeeConfig ? [req.referrerFeeConfig] : 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 headers: opts.headers,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n opts: ApiAdapterOptions,\n): Promise<BestByPlatformResponse>;\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<BestByPlatformResponse>;\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMsArg?: number,\n): Promise<BestByPlatformResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? { baseApiUrl: optsOrBaseApiUrl, timeoutMs: timeoutMsArg }\n : optsOrBaseApiUrl;\n const baseApiUrl = opts.baseApiUrl;\n const timeoutMs = opts.timeoutMs;\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'best-by-platform' : 'best-by-platform-exact-token';\n const url = `${withApiBase(baseApiUrl)}/v3/quote/${endpoint}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: String(req.amount),\n amount: undefined,\n isExactFiat: undefined,\n referrerFeeConfig: undefined,\n referralFees: req.referralFees ?? (req.referrerFeeConfig ? [req.referrerFeeConfig] : undefined),\n };\n Object.keys(requestBody).forEach(\n (key) => requestBody[key] === undefined && delete requestBody[key],\n );\n\n const response = await apiFetch<BestByPlatformResponse>({\n url,\n method: 'POST',\n body: requestBody,\n headers: opts.headers,\n timeoutMs,\n });\n\n return {\n ...response,\n responseObject: {\n ...response.responseObject,\n platformQuotes: (response.responseObject?.platformQuotes ?? []).filter((platformQuote) => {\n const platform = platformQuote.platform.trim().toLowerCase();\n if (!METHOD_NAME_TO_HASH[platform]) return false;\n if (!platformQuote.bestQuote) return true;\n return (\n platform === platformQuote.bestQuote.intent.processorName.trim().toLowerCase() &&\n matchesQuotePaymentMethod(\n platformQuote.bestQuote.intent.processorName,\n platformQuote.bestQuote.paymentMethod,\n )\n );\n }),\n },\n };\n}\n\nexport async function apiGetPayeeDetails(\n req: GetPayeeDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetPayeeDetailsResponse> {\n return apiFetch<GetPayeeDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/makers/${req.processorName}/${req.hashedOnchainId}`,\n method: 'GET',\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: `${withApiBase(baseApiUrl)}/v2/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\nexport async function apiGetReferralDashboard(\n opts: ApiAdapterOptions & ReferralReadRequest,\n): Promise<ReferralDashboardResponse> {\n const address = opts.address ? normalizeReferralAddress(opts.address, 'address') : undefined;\n const endpoint = address\n ? `/v2/referral?${new URLSearchParams({ address }).toString()}`\n : '/v2/referral';\n const authorizationToken = address\n ? undefined\n : requireAuthorizationToken(opts.authorizationToken, endpoint);\n const response = await apiFetch<\n CuratorEnvelope<ReferralDashboardResponse> | ReferralDashboardResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiGetReferralEarnings(\n opts: ApiAdapterOptions & ReferralReadRequest,\n): Promise<ReferralEarningsResponse> {\n const address = opts.address ? normalizeReferralAddress(opts.address, 'address') : undefined;\n const endpoint = address\n ? `/v2/referral/earnings?${new URLSearchParams({ address }).toString()}`\n : '/v2/referral/earnings';\n const authorizationToken = address\n ? undefined\n : requireAuthorizationToken(opts.authorizationToken, endpoint);\n const response = await apiFetch<\n CuratorEnvelope<ReferralEarningsResponse> | ReferralEarningsResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiLookupReferralCode(\n code: string,\n opts: ApiAdapterOptions,\n): Promise<ReferralCodeLookupResponse> {\n const normalizedCode = normalizeReferralCode(code);\n const endpoint = `/v2/referral/code/${encodeURIComponent(normalizedCode)}`;\n const response = await apiFetch<\n CuratorEnvelope<ReferralCodeLookupResponse> | ReferralCodeLookupResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiCreateReferralCode(\n req: CreateReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<CreateReferralCodeResponse> {\n const endpoint = '/v2/referral/code';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<CreateReferralCodeResponse> | CreateReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: req.signature ? { signature: req.signature } : {},\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiRedeemReferralCode(\n req: RedeemReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<RedeemReferralCodeResponse> {\n const endpoint = '/v2/referral/redeem';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<RedeemReferralCodeResponse> | RedeemReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: {\n code: normalizeReferralCode(req.code),\n ...(req.signature ? { signature: req.signature } : {}),\n },\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiUpdateReferralCode(\n req: UpdateReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<UpdateReferralCodeResponse> {\n const endpoint = '/v2/referral/code';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<UpdateReferralCodeResponse> | UpdateReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'PATCH',\n body: {\n code: normalizeReferralCode(req.code),\n ...(req.signature ? { signature: req.signature } : {}),\n },\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiUploadSellerCredential(\n processorName: SellerCredentialUploadPlatform,\n payeeDetails: Hash,\n bundle: SellerCredentialBundleUpload,\n baseApiUrl: string,\n timeoutMs?: number,\n authorizationToken?: string,\n): Promise<CuratorSellerCredentialUploadResponse> {\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential`;\n\n return apiFetch<CuratorSellerCredentialUploadResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: bundle,\n timeoutMs,\n authorizationToken,\n });\n}\n\nexport async function apiUploadGoogleOAuthSellerCredential(\n processorName: GoogleOAuthSellerCredentialPlatform,\n payeeDetails: Hash,\n body: GoogleOAuthSellerCredentialUploadBodyByPlatform[GoogleOAuthSellerCredentialPlatform],\n baseApiUrl: string,\n opts?: { timeoutMs?: number; authorizationToken?: string },\n): Promise<CuratorSellerCredentialUploadResponse> {\n if ((processorName as string) !== 'paypal') {\n throw new ValidationError(\n `Unsupported Google OAuth seller credential platform: ${String(processorName)}`,\n 'processorName',\n );\n }\n\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential/google-oauth`;\n\n // Forward the caller's Privy bearer token when present. Curator's google-oauth\n // route runs optional Privy auth: an authenticated upload is claimed to the\n // caller's maker profile (surfaced via /v2/me); an anonymous one is stored\n // unclaimed exactly as before.\n return apiFetch<CuratorSellerCredentialUploadResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'POST',\n body,\n timeoutMs: opts?.timeoutMs,\n authorizationToken: opts?.authorizationToken,\n });\n}\n\nexport async function apiGetSellerCredentialStatus(\n processorName: SellerPlatform,\n payeeDetails: Hash,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<CuratorSellerCredentialStatusResponse> {\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential/status`;\n\n return apiFetch<CuratorSellerCredentialStatusResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n timeoutMs,\n });\n}\n\nexport async function apiVerifySellerPayment(\n platform: SellerPlatform,\n req: SellerVerifyProxyBody,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n): Promise<CuratorSellerVerifyResponse> {\n const body: SellerVerifyProxyBody = {\n txId: req.txId,\n chainId: req.chainId,\n intent: req.intent,\n ...(req.metadata !== undefined ? { metadata: req.metadata } : {}),\n };\n\n return apiFetch<CuratorSellerVerifyResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/verify/seller/${encodeURIComponent(platform)}`,\n method: 'POST',\n body,\n apiKey,\n timeoutMs,\n });\n}\n\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n opts: ApiAdapterOptions,\n): Promise<GetOrderbookResponse>;\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetOrderbookResponse>;\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetOrderbookResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n query.set(key, String(value));\n });\n\n const response = await apiFetch<{\n success: boolean;\n message: string;\n responseObject: GetOrderbookResponse;\n }>({\n url: `${withApiBase(opts.baseApiUrl)}/v3/orderbook?${query.toString()}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n\n return {\n ...response.responseObject,\n entries: response.responseObject.entries.filter((entry) =>\n matchesPaymentMethodNameAndHash(entry.paymentPlatform, entry.paymentMethodHash),\n ),\n };\n}\n\n/**\n * The one escrow whose rows `signalIntent` will accept, or `undefined` when the\n * caller did not say which deployment it targets.\n *\n * Resolution is deliberately all-or-nothing: without a `runtimeEnv` there is no\n * safe default, because guessing `production` against a staging caller would\n * discard every row it has.\n */\nfunction resolveSignalableEscrow(\n chainId: number | undefined,\n runtimeEnv: RuntimeEnv | undefined,\n): string | undefined {\n if (!runtimeEnv) return undefined;\n try {\n return getContracts(\n chainId ?? SUPPORTED_CHAIN_IDS.BASE_MAINNET,\n runtimeEnv,\n ).addresses.escrowV2?.toLowerCase();\n } catch {\n // An unknown chain has no deployment to compare against; leaving the book\n // whole is better than emptying it on a resolution failure.\n return undefined;\n }\n}\n\n/**\n * RC1 replaced curator's legacy chargeback flag with the required\n * `disputeProtectionOptedOut`/`disputeProtectionRequiresStake` pair, and\n * clients derive access from `whitelistEnabled` and stake gating from this\n * pair. The deployment-order contract is curator first, SDK second: a curator that has not cut over\n * serves rows without the pair, and passing those through would surface a\n * dispute-gated row as freely takeable, failing only later at `signalIntent`.\n * Dropping such rows fails closed, mirroring the web Express quote guard.\n */\nfunction hasDisputeProtectionFields(row: OrderbookTableRow): boolean {\n return isCanonicalDisputeProtectionProjection(row);\n}\n\n/**\n * A row is fillable only from the current escrow. Curator keeps serving retired\n * escrows, but `signalIntent` throws on them, so surfacing those rows offers\n * liquidity that cannot be taken.\n */\nfunction isSignalableEscrowRow(\n rowEscrowAddress: string | undefined,\n signalableEscrow: string | undefined,\n): boolean {\n if (!signalableEscrow) return true;\n // A row with no escrow cannot be proven current, and signalling resolves it\n // to the current deployment anyway, so keep it rather than dropping blind.\n if (!rowEscrowAddress) return true;\n return rowEscrowAddress.toLowerCase() === signalableEscrow;\n}\n\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n opts: ApiAdapterOptions,\n): Promise<GetOrderbookTableResponse>;\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetOrderbookTableResponse>;\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetOrderbookTableResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n query.set(key, String(value));\n });\n\n const response = await apiFetch<CuratorEnvelope<GetOrderbookTableResponse>>({\n url: `${withApiBase(opts.baseApiUrl)}/v3/orderbook/table?${query.toString()}`,\n method: 'GET',\n headers: opts.headers,\n timeoutMs: opts.timeoutMs,\n });\n\n const responseObject = unwrapResponseObject(response);\n const signalableEscrow = resolveSignalableEscrow(params.chainId, opts.runtimeEnv);\n return {\n ...responseObject,\n rows: responseObject.rows.filter(\n (row) =>\n hasDisputeProtectionFields(row) &&\n matchesPaymentMethodNameAndHash(row.paymentPlatform, row.paymentMethodHash) &&\n isSignalableEscrowRow(row.escrowAddress, signalableEscrow),\n ),\n };\n}\n\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n opts: ApiAdapterOptions,\n): Promise<GetDepositBundleResponse>;\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetDepositBundleResponse>;\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetDepositBundleResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const escrowAddress = requireEscrowAddress(\n params.escrowAddress,\n 'apiGetDepositBundle requires escrowAddress',\n );\n const query = new URLSearchParams({ escrowAddress });\n\n if (params.dailySnapshotLimit !== undefined) {\n query.set('dailySnapshotLimit', String(params.dailySnapshotLimit));\n }\n\n const response = await apiFetch<{\n success: boolean;\n message: string;\n responseObject: GetDepositBundleResponse;\n }>({\n url: `${withApiBase(opts.baseApiUrl)}/v2/deposits/${params.depositId}/bundle?${query.toString()}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n\n return response.responseObject;\n}\n","import type { Address, WalletClient } from 'viem';\nimport { hardhat } from 'viem/chains';\n\nimport {\n apiCreateReferralCode,\n apiGetReferralDashboard,\n apiGetReferralEarnings,\n apiLookupReferralCode,\n apiRedeemReferralCode,\n apiUpdateReferralCode,\n} from '../adapters/api';\nimport { type RuntimeEnv } from '../contracts';\nimport { ValidationError } from '../errors';\nimport { type IndexerAuthTokenProvider } from '../indexer/client';\nimport {\n REFERRAL_SIGNATURE_DOMAIN,\n REFERRAL_SIGNATURE_TYPES,\n normalizeReferralCode,\n} from '../referral';\nimport type {\n CreateReferralCodeResponse,\n RedeemReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n ReferralSignatureBody,\n UpdateReferralCodeResponse,\n} from '../types';\nimport { DEFAULT_BASE_API_URL } from '../utils/constants';\nimport { normalizeAddress } from './clientUtils';\n\nexport type ReferralReadOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n /** Public wallet-address read target. Omit to use bearer-authenticated caller mode. */\n address?: Address;\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n};\n\nexport type ReferralBearerWriteOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n};\n\nexport type ReferralSignatureOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n /** Defaults to base_production for production/preproduction, base_staging for staging. */\n audience?: string;\n /** Unix timestamp in seconds. Defaults to now. */\n issuedAt?: number;\n};\n\nexport type RedeemReferralCodeSignatureOptions = ReferralSignatureOptions & {\n /** Expected owner wallet for the code. If omitted, the SDK looks it up before signing. */\n referrerWalletAddress?: Address;\n};\n\nexport type UpdateReferralCodeSignatureOptions = ReferralSignatureOptions & {\n /** Current code, signed to prevent stale rename replay. */\n oldCode: string;\n};\n\nexport interface ReferralAccountOperationsConfig {\n getWalletClient: () => WalletClient;\n getChainId: () => number;\n getRuntimeEnv: () => RuntimeEnv;\n getBaseApiUrl: () => string | undefined;\n getApiTimeoutMs: () => number;\n getAuthorizationToken: () => string | undefined;\n getAuthorizationTokenProvider: () => IndexerAuthTokenProvider | undefined;\n}\n\nexport class ReferralAccountOperations {\n constructor(private readonly config: ReferralAccountOperationsConfig) {}\n\n async getReferralDashboard(opts?: ReferralReadOptions): Promise<ReferralDashboardResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = opts?.address\n ? undefined\n : await this.resolveAuthorizationToken(opts);\n return apiGetReferralDashboard({\n baseApiUrl,\n timeoutMs,\n authorizationToken,\n address: opts?.address,\n });\n }\n\n async getReferralEarnings(opts?: ReferralReadOptions): Promise<ReferralEarningsResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = opts?.address\n ? undefined\n : await this.resolveAuthorizationToken(opts);\n return apiGetReferralEarnings({\n baseApiUrl,\n timeoutMs,\n authorizationToken,\n address: opts?.address,\n });\n }\n\n async lookupReferralCode(\n code: string,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<ReferralCodeLookupResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n return apiLookupReferralCode(code, { baseApiUrl, timeoutMs });\n }\n\n async createReferralCode(opts?: ReferralBearerWriteOptions): Promise<CreateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiCreateReferralCode({}, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async createReferralCodeWithSignature(\n opts?: ReferralSignatureOptions,\n ): Promise<CreateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const signature = await this.signCreateReferralCode(opts);\n return apiCreateReferralCode({ signature }, { baseApiUrl, timeoutMs });\n }\n\n async redeemReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<RedeemReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiRedeemReferralCode({ code }, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async redeemReferralCodeWithSignature(\n code: string,\n opts?: RedeemReferralCodeSignatureOptions,\n ): Promise<RedeemReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const normalizedCode = normalizeReferralCode(code);\n const lookup = opts?.referrerWalletAddress\n ? undefined\n : await this.lookupReferralCode(normalizedCode, { baseApiUrl, timeoutMs });\n const referrerWalletAddress = opts?.referrerWalletAddress ?? lookup?.referrerWalletAddress;\n if (!referrerWalletAddress) {\n throw new ValidationError(\n 'referrerWalletAddress is required for referral signature auth',\n 'referrerWalletAddress',\n );\n }\n if (lookup && !lookup.isActive) {\n throw new ValidationError('Referral code is not active', 'code');\n }\n const signature = await this.signRedeemReferralCode(\n normalizedCode,\n referrerWalletAddress,\n opts,\n );\n return apiRedeemReferralCode({ code: normalizedCode, signature }, { baseApiUrl, timeoutMs });\n }\n\n async updateReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<UpdateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiUpdateReferralCode({ code }, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async updateReferralCodeWithSignature(\n code: string,\n opts: UpdateReferralCodeSignatureOptions,\n ): Promise<UpdateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const signature = await this.signRenameReferralCode(code, opts.oldCode, opts);\n return apiUpdateReferralCode({ code, signature }, { baseApiUrl, timeoutMs });\n }\n\n private resolveRequestOptions(opts?: { baseApiUrl?: string; timeoutMs?: number }): {\n baseApiUrl: string;\n timeoutMs: number;\n } {\n return {\n baseApiUrl: this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.config.getBaseApiUrl() ?? DEFAULT_BASE_API_URL,\n ),\n timeoutMs: opts?.timeoutMs ?? this.config.getApiTimeoutMs(),\n };\n }\n\n private stripTrailingSlash(url: string): string {\n return url.replace(/\\/$/, '');\n }\n\n private async resolveAuthorizationToken(opts?: {\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n }): Promise<string | undefined> {\n if (opts?.authorizationToken !== undefined) {\n return opts.authorizationToken;\n }\n\n const provider = opts?.getAuthorizationToken ?? this.config.getAuthorizationTokenProvider();\n if (provider) {\n return (await provider()) ?? undefined;\n }\n\n return this.config.getAuthorizationToken();\n }\n\n private resolveAudience(audience?: string): string {\n if (audience) return audience;\n if (this.config.getChainId() === hardhat.id) return 'localhardhat';\n if (this.config.getRuntimeEnv() === 'staging') return 'base_staging';\n return 'base_production';\n }\n\n private resolveIssuedAt(issuedAt?: number): number {\n const resolved = issuedAt ?? Math.floor(Date.now() / 1000);\n if (!Number.isInteger(resolved) || resolved <= 0) {\n throw new ValidationError('issuedAt must be a positive unix timestamp', 'issuedAt');\n }\n return resolved;\n }\n\n private getSigningAccount(): {\n account: NonNullable<WalletClient['account']>;\n walletAddress: Address;\n } {\n const walletClient = this.config.getWalletClient();\n const account = walletClient.account;\n if (!account) {\n throw new ValidationError(\n 'walletClient account is required for referral signature auth',\n 'walletClient.account',\n );\n }\n\n const rawAddress = typeof account === 'string' ? account : account.address;\n const walletAddress = normalizeAddress(rawAddress);\n if (!walletAddress) {\n throw new ValidationError(\n 'walletClient account address is required for referral signature auth',\n 'walletClient.account',\n );\n }\n\n return { account, walletAddress };\n }\n\n private normalizeReferralWalletAddress(address: Address, field: string): Address {\n const normalized = normalizeAddress(address.toLowerCase());\n if (!normalized) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return normalized;\n }\n\n private async signCreateReferralCode(\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'CreateCode',\n message: { wallet: walletAddress, audience, issuedAt: BigInt(issuedAt) },\n });\n\n return { walletAddress, signature, issuedAt, audience };\n }\n\n private async signRedeemReferralCode(\n code: string,\n referrerWalletAddress: Address,\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const normalizedCode = normalizeReferralCode(code);\n const referrer = this.normalizeReferralWalletAddress(\n referrerWalletAddress,\n 'referrerWalletAddress',\n );\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'RedeemCode',\n message: {\n wallet: walletAddress,\n code: normalizedCode,\n referrer,\n audience,\n issuedAt: BigInt(issuedAt),\n },\n });\n\n return { walletAddress, signature, issuedAt, audience, referrer };\n }\n\n private async signRenameReferralCode(\n newCode: string,\n oldCode: string,\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const normalizedOldCode = normalizeReferralCode(oldCode);\n const normalizedNewCode = normalizeReferralCode(newCode);\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'RenameCode',\n message: {\n wallet: walletAddress,\n oldCode: normalizedOldCode,\n newCode: normalizedNewCode,\n audience,\n issuedAt: BigInt(issuedAt),\n },\n });\n\n return { walletAddress, signature, issuedAt, audience, oldCode: normalizedOldCode };\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 }) => 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?: { escrowAddress?: Address }): boolean {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params?.escrowAddress,\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 });\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 });\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 });\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 });\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 });\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","import type { Address, Hex, PublicClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { RuntimeEnv } from '../contracts';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\n\nconst PEER_PAY_MERCHANT_GROUP_ID_BY_ENVIRONMENT = {\n production: '0x174b8a29536721a3eae290bfd55651b85a53fc334b971d993fa93ed8dde15e48',\n preproduction: '0x174b8a29536721a3eae290bfd55651b85a53fc334b971d993fa93ed8dde15e48',\n staging: '0xc82c20c00033046a2f017b65532d7148a337282f17c73296663a530e49ba00f7',\n} as const satisfies Record<RuntimeEnv, Hex>;\n\nexport type AccessPolicyOperationsConfig = {\n getPublicClient: () => PublicClient;\n /** Required only for environment-owned policy writes. */\n getRuntimeEnv?: () => RuntimeEnv;\n /** Undefined wherever the policy is not deployed. */\n getPolicyAddress: () => Address | undefined;\n getPolicyAbi: () => Abi | undefined;\n getRegistryAddress: () => Address | undefined;\n getRegistryAbi: () => Abi | undefined;\n prepareContractTransaction: (opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n }) => PreparedTransactionWithAbi;\n};\n\nexport class AccessPolicyUnsupportedError extends Error {\n constructor(contract: 'WhitelistPolicy' | 'AddressGroupRegistry') {\n super(`${contract} is not deployed for this environment.`);\n this.name = 'AccessPolicyUnsupportedError';\n }\n}\n\n/**\n * Historical reads and narrowly scoped writes for `WhitelistPolicy` and\n * `AddressGroupRegistry`.\n *\n * Writes are depositor-only at the contract level: `onlyDepositor` resolves the\n * escrow's recorded depositor, so a deposit delegate is rejected. Callers must\n * gate the UI on that rather than relying on a revert.\n *\n * General-purpose group management is retired. New sell deposits may still\n * configure the protocol-owned Peer Pay merchant default; every other write\n * remains limited to failing open or removing historical entries.\n */\nexport class AccessPolicyOperations {\n constructor(private readonly config: AccessPolicyOperationsConfig) {}\n\n get isSupported(): boolean {\n return Boolean(\n this.config.getPolicyAddress() &&\n this.config.getPolicyAbi() &&\n this.config.getRegistryAddress() &&\n this.config.getRegistryAbi(),\n );\n }\n\n private requirePolicy(): { address: Address; abi: Abi } {\n const address = this.config.getPolicyAddress();\n const abi = this.config.getPolicyAbi();\n if (!address || !abi) throw new AccessPolicyUnsupportedError('WhitelistPolicy');\n return { address, abi };\n }\n\n private requireRegistry(): { address: Address; abi: Abi } {\n const address = this.config.getRegistryAddress();\n const abi = this.config.getRegistryAbi();\n if (!address || !abi) throw new AccessPolicyUnsupportedError('AddressGroupRegistry');\n return { address, abi };\n }\n\n /* ============ Reads ============ */\n\n async isEnabled(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n }): Promise<boolean> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'enabled',\n args: [params.escrow, params.depositId, params.paymentMethod],\n })) as boolean;\n }\n\n /** Groups are enumerable onchain; direct addresses deliberately are not. */\n async getAllowedGroups(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n }): Promise<Hex[]> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAllowedGroups',\n args: [params.escrow, params.depositId, params.paymentMethod],\n })) as Hex[];\n }\n\n /**\n * Point check for one address. There is no enumeration getter, so this can\n * confirm a known address but can never reconstruct a missing list.\n */\n async isWhitelisted(params: {\n escrow: Address;\n depositId: bigint;\n taker: Address;\n }): Promise<boolean> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'isWhitelisted',\n args: [params.escrow, params.depositId, params.taker],\n })) as boolean;\n }\n\n async maxGroupsPerDepositPaymentMethod(): Promise<bigint> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'MAX_GROUPS_PER_DEPOSIT_PAYMENT_METHOD',\n })) as bigint;\n }\n\n async groupExists(groupId: Hex): Promise<boolean> {\n const { address, abi } = this.requireRegistry();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'groupExists',\n args: [groupId],\n })) as boolean;\n }\n\n /** Curated membership OR resolver. Resolver failures fail closed. */\n async isMember(params: { groupId: Hex; account: Address }): Promise<boolean> {\n const { address, abi } = this.requireRegistry();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'isMember',\n args: [params.groupId, params.account],\n })) as boolean;\n }\n\n /* ============ Prepareable writes ============ */\n\n private preparePolicyCall(\n functionName: string,\n args: readonly unknown[],\n txOverrides?: TxOverrides,\n ): PreparedTransactionWithAbi {\n const { address, abi } = this.requirePolicy();\n return this.config.prepareContractTransaction({\n address,\n abi,\n functionName,\n args,\n txOverrides,\n });\n }\n\n /** Configure the fixed Peer Pay merchant default while creating a sell deposit. */\n prepareConfigurePeerPayMerchantDeposit(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const runtimeEnv = this.config.getRuntimeEnv?.();\n if (!runtimeEnv) {\n throw new Error('Runtime environment is required to configure the Peer Pay merchant policy.');\n }\n const merchantGroupId = PEER_PAY_MERCHANT_GROUP_ID_BY_ENVIRONMENT[runtimeEnv];\n return this.preparePolicyCall(\n 'configureDeposit',\n [params.escrow, params.depositId, params.paymentMethod, true, [merchantGroupId], []],\n params.txOverrides,\n );\n }\n\n /** Fail open before removing historical policy entries. */\n prepareDisable(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'setEnabled',\n [params.escrow, params.depositId, params.paymentMethod, false],\n params.txOverrides,\n );\n }\n\n prepareRemoveAllowedGroups(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n groupIds: readonly Hex[];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'removeAllowedGroups',\n [params.escrow, params.depositId, params.paymentMethod, params.groupIds],\n params.txOverrides,\n );\n }\n\n prepareRemoveWhitelistedAddresses(params: {\n escrow: Address;\n depositId: bigint;\n takers: readonly Address[];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'removeWhitelistedAddresses',\n [params.escrow, params.depositId, params.takers],\n params.txOverrides,\n );\n }\n}\n","import type { Abi } from 'abitype';\nimport type { Address, PublicClient } from 'viem';\nimport { zeroAddress } from 'viem';\n\nimport type { TxOverrides } from '../types';\n\nexport type StakeVaultWriteFunction =\n | 'depositStake'\n | 'withdrawStake'\n | 'claim'\n | 'setTakerAuthorization'\n | 'selectStakeOwner'\n | 'clearStakeOwner';\n\ntype StakeWriteBase = {\n txOverrides?: TxOverrides;\n};\n\nexport type StakeVaultWriteParams = {\n depositStake: StakeWriteBase & { amount: bigint };\n withdrawStake: StakeWriteBase & { amount: bigint };\n claim: StakeWriteBase;\n setTakerAuthorization: StakeWriteBase & { taker: Address; authorized: boolean };\n selectStakeOwner: StakeWriteBase & { stakeOwner: Address };\n clearStakeOwner: StakeWriteBase;\n};\n\n/**\n * Vault accounting for one staker plus the delegation view for one taker.\n * `stakeOwner` is the EFFECTIVE owner from `stakeOwnerOf(taker)`;\n * `selectedStakeOwner` is the raw selection, which is only meaningful while\n * `selectionAuthorized` remains true. The two must never be conflated: a\n * stale selection falls back to self-stake on the contract side.\n * `admissionsPaused` comes from the vault's DisputeProtectionPolicy controller and\n * blocks new dispute-protected admissions while true.\n */\nexport type StakeVaultState = {\n staker: Address;\n taker: Address;\n stakeToken: Address;\n stakeOwner: Address;\n selectedStakeOwner: Address | null;\n selectionAuthorized: boolean;\n staked: bigint;\n locked: bigint;\n free: bigint;\n claimable: bigint;\n admissionsPaused: boolean;\n};\n\ntype StakeOperationsConfig = {\n getPublicClient: () => PublicClient;\n getStakeVaultAddress: () => Address | undefined;\n getStakeVaultAbi: () => Abi | undefined;\n getStakeTokenAddress: () => Address | undefined;\n getDisputeProtectionPolicyAddress: () => Address | undefined;\n getDisputeProtectionPolicyAbi: () => Abi | undefined;\n};\n\nexport class StakeOperations {\n constructor(private readonly config: StakeOperationsConfig) {}\n\n getContract(): { address: Address; abi: Abi; stakeToken: Address } {\n const address = this.config.getStakeVaultAddress();\n const abi = this.config.getStakeVaultAbi();\n const stakeToken = this.config.getStakeTokenAddress();\n if (!address || !abi || !stakeToken) {\n throw new Error('StakeVault not available for this chain/environment');\n }\n return { address, abi, stakeToken };\n }\n\n getPolicyContract(): { address: Address; abi: Abi } {\n const address = this.config.getDisputeProtectionPolicyAddress();\n const abi = this.config.getDisputeProtectionPolicyAbi();\n if (!address || !abi) {\n throw new Error('DisputeProtectionPolicy not available for this chain/environment');\n }\n return { address, abi };\n }\n\n private read<T>(functionName: string, args: readonly unknown[] = []): Promise<T> {\n const { address, abi } = this.getContract();\n return this.config.getPublicClient().readContract({\n address,\n abi,\n functionName,\n args,\n }) as unknown as Promise<T>;\n }\n\n private readPolicy<T>(functionName: string, args: readonly unknown[] = []): Promise<T> {\n const { address, abi } = this.getPolicyContract();\n return this.config.getPublicClient().readContract({\n address,\n abi,\n functionName,\n args,\n }) as unknown as Promise<T>;\n }\n\n getStakeBalance(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('stakeBalance', [stakeOwner]);\n }\n\n getLockedStake(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('lockedStake', [stakeOwner]);\n }\n\n getFreeStake(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('freeStake', [stakeOwner]);\n }\n\n getClaimable(beneficiary: Address): Promise<bigint> {\n return this.read<bigint>('claimable', [beneficiary]);\n }\n\n getStakeOwner(taker: Address): Promise<Address> {\n return this.read<Address>('stakeOwnerOf', [taker]);\n }\n\n getSelectedStakeOwner(taker: Address): Promise<Address> {\n return this.read<Address>('selectedStakeOwner', [taker]);\n }\n\n getTakerAuthorization(stakeOwner: Address, taker: Address): Promise<boolean> {\n return this.read<boolean>('authorizedTakers', [stakeOwner, taker]);\n }\n\n /** Whether the policy is refusing new dispute-protected admissions. */\n getAdmissionsPaused(): Promise<boolean> {\n return this.readPolicy<boolean>('admissionsPaused');\n }\n\n /**\n * Minimum collateral lock window for a payment method, in seconds. Zero\n * means intents on this method admit unbonded — no stake is locked at all.\n */\n getRiskWindow(paymentMethodHash: `0x${string}`): Promise<bigint> {\n return this.readPolicy<bigint>('getRiskWindow', [paymentMethodHash]);\n }\n\n /** Whether a specific escrow deposit payment method has opted into dispute protection. */\n isDisputeProtectionEnabled(\n escrow: Address,\n depositId: bigint,\n paymentMethod: `0x${string}`,\n ): Promise<boolean> {\n return this.readPolicy<boolean>('isDisputeProtectionEnabled', [\n escrow,\n depositId,\n paymentMethod,\n ]);\n }\n\n async getStakeVaultState(params: { staker: Address; taker?: Address }): Promise<StakeVaultState> {\n const taker = params.taker ?? params.staker;\n const { stakeToken } = this.getContract();\n const [stakeOwner, rawSelection, staked, locked, free, claimable, admissionsPaused] =\n await Promise.all([\n this.getStakeOwner(taker),\n this.getSelectedStakeOwner(taker),\n this.getStakeBalance(params.staker),\n this.getLockedStake(params.staker),\n this.getFreeStake(params.staker),\n this.getClaimable(params.staker),\n this.getAdmissionsPaused(),\n ]);\n\n const selectedStakeOwner = rawSelection === zeroAddress ? null : rawSelection;\n const selectionAuthorized = selectedStakeOwner\n ? await this.getTakerAuthorization(selectedStakeOwner, taker)\n : false;\n\n return {\n staker: params.staker,\n taker,\n stakeToken,\n stakeOwner,\n selectedStakeOwner,\n selectionAuthorized,\n staked,\n locked,\n free,\n claimable,\n admissionsPaused,\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;\nconst EVM_ADDRESS_REGEX = /^0x[a-f0-9]{40}$/;\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 escapeLikePatternLiteral(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\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 (!EVM_ADDRESS_REGEX.test(rateManagerAddress) || !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 = escapeLikePatternLiteral(normalizeRateManagerId(rateManagerId));\n const normalizedRateManagerAddress = escapeLikePatternLiteral(\n normalizeAddress(rateManagerAddress),\n );\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 if (value.includes(':')) {\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: 'desc' }],\n limit: options?.limit ?? 365,\n },\n });\n\n return (result.ManagerDailySnapshot ?? []).reverse();\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\n try {\n // Raw event IDs use chainId_blockNumber_logIndex format, NOT the\n // scoped address pattern used by aggregate entities. Filtering by\n // rateManagerId alone is sufficient — the rateManagerAddress scope\n // does not appear in raw event IDs.\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 },\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 // Legacy V1 events use chainId_blockNumber_logIndex IDs, not the\n // scoped pattern — filter by rateManagerId alone.\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 },\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 { isAddress, type Address } from 'viem';\n\nimport { ValidationError } from '../errors';\nimport type { StakeEnvironment, TakerStakeBalances } from '../types';\nimport type { IndexerClient } from './client';\nimport {\n DISPUTE_PROTECTION_INTENTS_QUERY,\n STAKE_ACTIVITY_QUERY,\n STAKE_LOCKS_QUERY,\n STAKING_STATE_QUERY,\n TAKER_STAKE_AUTHORIZATIONS_QUERY,\n} from './queries';\nimport type {\n DisputeProtectionIntentEntity,\n DisputeProtectionRiskWindowEntity,\n ClaimAccountStateEntity,\n StakeActivityEntity,\n StakeActivityKind,\n StakeAccountStateEntity,\n StakeLockEntity,\n StakeLockStatus,\n StakeVaultConfigEntity,\n TakerStakeAuthorizationEntity,\n TakerStakeAuthorizationRowEntity,\n TakerStakeStateEntity,\n} from './types';\n\nconst DEFAULT_PAGE_LIMIT = 50;\nconst MAX_PAGE_LIMIT = 100;\n\nexport type IndexedPageAsOf = {\n /** Latest entity update/event block observed in this page, not an indexer-head guarantee. */\n blockNumber: string;\n /** Timestamp paired with the observed page row. */\n timestamp: string;\n};\n\nexport type IndexedPage<T> = {\n items: T[];\n /** Opaque keyset cursor. Pass it back unchanged; null means this page is exhausted. */\n nextCursor: string | null;\n /** Latest row observed in this page. This is not a strong-consistency watermark. */\n asOf: IndexedPageAsOf | null;\n};\n\ntype PageParams = {\n chainId: number;\n limit?: number;\n cursor?: string;\n};\n\nexport type StakeLockPageParams = PageParams & {\n vaultAddress: Address;\n stakeOwner: Address;\n status?: StakeLockStatus;\n};\n\n/**\n * Exactly one of `stakeOwner` (owner side: the takers this stake owner has\n * authorized) or `taker` (taker side: the stake owners that have authorized\n * this taker) scopes the page.\n */\nexport type TakerStakeAuthorizationPageParams = PageParams & {\n vaultAddress: Address;\n authorized?: boolean;\n} & ({ stakeOwner: Address; taker?: never } | { taker: Address; stakeOwner?: never });\n\nexport type StakeActivityPageParams = PageParams & {\n vaultAddress: Address;\n /** Merchant address matched against either the immutable owner or taker side. */\n merchant: Address;\n kind?: StakeActivityKind;\n};\n\nexport type DisputeProtectionIntentPageParams = PageParams & {\n /** Exact active policy whose finalized dispute stream is being consumed. */\n policyAddress: Address;\n /** Inclusive code-owned finality cutoff for this ingestion pass. */\n throughBlockNumber: string;\n};\n\nexport type IndexedStakeLock = {\n lockId: string;\n stakeOwner: Address;\n initialAmount: string;\n currentAmount: string;\n maturesAt: string;\n status: StakeLockStatus;\n unlockedAmount: string;\n claimedAmount: string;\n createdAt: string;\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedTakerStakeAuthorization = {\n taker: Address;\n stakeOwner: Address;\n authorized: boolean;\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedStakeActivity = {\n stakeOwner: Address | null;\n taker: Address | null;\n beneficiary: Address | null;\n kind: StakeActivityKind;\n lockId: string | null;\n counterparty: Address | null;\n amount: string;\n previousAmount: string | null;\n stakeBalanceAfter: string | null;\n lockedStakeAfter: string | null;\n freeStakeAfter: string | null;\n claimableAfter: string | null;\n maturesAt: string | null;\n blockNumber: string;\n logIndex: string;\n timestamp: string;\n};\n\nexport type IndexedDisputeProtectionIntent = {\n policyAddress: Address;\n intentHash: string;\n status: 'DISPUTED';\n stakeOwner: Address;\n depositor: Address;\n taker: Address;\n paymentMethod: string;\n amount: string;\n riskWindow: string;\n releaseEligibleAt: string | null;\n releaseAmount: string | null;\n isManualRelease: boolean | null;\n compensatedAmount: string | null;\n disputeId: string | null;\n openedAt: string;\n openedTxHash: string;\n cancelledAt: string | null;\n cancelledTxHash: string | null;\n settledAt: string | null;\n settledTxHash: string | null;\n releasedAt: string | null;\n releasedTxHash: string | null;\n disputedAt: string;\n disputedTxHash: string;\n disputedAtBlockNumber: string;\n disputedAtLogIndex: string;\n updatedAt: string;\n};\n\nexport type DisputeProtectionIntentPage = IndexedPage<IndexedDisputeProtectionIntent> & {\n /**\n * Opaque cursor for the final returned item, including a terminal page.\n * Persist this after committing the page; null means the page was empty.\n */\n endCursor: string | null;\n};\n\ntype EventCursor = {\n blockNumber: string;\n logIndex: string;\n id: string;\n};\n\ntype LocksGraphQLResponse = { StakeLock: StakeLockEntity[] };\ntype AuthorizationsGraphQLResponse = {\n TakerStakeAuthorization: TakerStakeAuthorizationRowEntity[];\n};\ntype ActivityGraphQLResponse = { StakeActivity: StakeActivityEntity[] };\ntype DisputesGraphQLResponse = {\n DisputeProtectionIntent: DisputeProtectionIntentEntity[];\n};\n\nexport type IndexedStakingStateParams = {\n chainId: number;\n environment: StakeEnvironment;\n vaultAddress: Address;\n disputeProtectionPolicyAddress: Address;\n taker: Address;\n /** Effective owner from the caller's fresh stakeOwnerOf(taker) read. */\n stakeOwner: Address;\n};\n\nexport type IndexedStakingRowFreshness = {\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedTakerAuthorization = {\n stakeOwner: Address;\n authorized: boolean;\n freshness: IndexedStakingRowFreshness;\n};\n\nexport type IndexedRiskWindow = {\n /** Payment method hash the window applies to. */\n paymentMethod: string;\n /**\n * Minimum collateral lock window in seconds. The policy locks the full\n * intent amount for at least this long after settlement; a method with no\n * row (or a zero window) admits unbonded.\n */\n riskWindowSeconds: string;\n updatedAt: string;\n};\n\nexport type IndexedStakingState = {\n chainId: number;\n environment: StakeEnvironment;\n taker: Address;\n /** Effective owner from the indexed TakerStakeState, or the taker when absent. */\n stakeOwner: Address;\n selectedStakeOwner: Address | null;\n selectionAuthorized: boolean;\n stake: TakerStakeBalances;\n claimableUsdc: string;\n authorizations: IndexedTakerAuthorization[];\n /**\n * Per-payment-method minimum lock windows from the DisputeProtectionPolicy. The\n * global admissions pause is intentionally absent from the indexed model —\n * read it on-chain (`admissionsPaused()`), where it is authoritative.\n */\n riskWindows: IndexedRiskWindow[];\n vault: {\n controller: Address | null;\n pendingController: Address | null;\n pendingControllerValidAt: string | null;\n } | null;\n /**\n * False when the indexer's effective owner has not caught up with the\n * caller's onchain owner. In that case stake defaults to zero rather than\n * attributing another owner's account to this taker.\n */\n stakeAccountMatchesEffectiveOwner: boolean;\n freshness: {\n takerStakeState: IndexedStakingRowFreshness | null;\n stakeAccountState: IndexedStakingRowFreshness | null;\n claimAccountState: IndexedStakingRowFreshness | null;\n stakeVaultConfig: IndexedStakingRowFreshness | null;\n authorizations: IndexedStakingRowFreshness[];\n /**\n * Latest block fully processed by the indexer for this chain. Entity\n * update blocks above remain provenance and do not measure indexer lag.\n */\n indexerHeadBlockNumber: string | null;\n };\n};\n\ntype ChainMetadataEntity = {\n chain_id: number;\n latest_processed_block: number;\n};\n\ntype StakingStateGraphQLResponse = {\n TakerStakeState_by_pk: TakerStakeStateEntity | null;\n StakeAccountState_by_pk: StakeAccountStateEntity | null;\n ClaimAccountState_by_pk: ClaimAccountStateEntity | null;\n TakerStakeAuthorization: TakerStakeAuthorizationEntity[];\n DisputeProtectionRiskWindow: DisputeProtectionRiskWindowEntity[];\n StakeVaultConfig_by_pk: StakeVaultConfigEntity | null;\n chain_metadata: ChainMetadataEntity[];\n};\n\nexport type StakingEntityIds = {\n takerStateId: string;\n stakeAccountId: string;\n claimAccountId: string;\n vaultConfigId: string;\n /** Lowercased policy address used to filter risk-window rows. */\n policy: string;\n};\n\nconst ZERO_STAKE: TakerStakeBalances = {\n totalUsdc: '0',\n lockedUsdc: '0',\n freeUsdc: '0',\n};\n\nfunction normalizeAddress(value: string, field: string): Address {\n if (!isAddress(value)) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return value.toLowerCase() as Address;\n}\n\nfunction normalizeNullableAddress(value: string | null | undefined, field: string): Address | null {\n return value ? normalizeAddress(value, field) : null;\n}\n\nfunction normalizeDecimal(value: string, field: string): string {\n if (!/^\\d+$/.test(value)) {\n throw new Error(`${field} must be an unsigned decimal string`);\n }\n return value;\n}\n\nfunction normalizeOptionalDecimal(value: string | null | undefined, field: string): string | null {\n return value === null || value === undefined ? null : normalizeDecimal(value, field);\n}\n\nfunction validateChainId(chainId: number): void {\n if (!Number.isInteger(chainId) || chainId <= 0) {\n throw new ValidationError('chainId must be a positive integer', 'chainId');\n }\n}\n\nfunction validateLimit(limit: number | undefined): number {\n const resolved = limit ?? DEFAULT_PAGE_LIMIT;\n if (!Number.isInteger(resolved) || resolved < 1 || resolved > MAX_PAGE_LIMIT) {\n throw new ValidationError('limit must be an integer from 1 to 100', 'limit');\n }\n return resolved;\n}\n\nfunction encodeCursor(prefix: string, value: unknown): string {\n const encoded = btoa(JSON.stringify(value))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n return `${prefix}.${encoded}`;\n}\n\nfunction decodeCursor<T>(cursor: string, prefix: string, validate: (value: unknown) => T): T {\n try {\n const encoded = cursor\n .slice(prefix.length + 1)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n const padded = encoded.padEnd(Math.ceil(encoded.length / 4) * 4, '=');\n if (!cursor.startsWith(`${prefix}.`) || encoded.length === 0) {\n throw new Error('wrong cursor kind');\n }\n return validate(JSON.parse(atob(padded)));\n } catch {\n throw new ValidationError(`cursor must be a valid ${prefix} cursor`, 'cursor');\n }\n}\n\nfunction decodeIdCursor(cursor: string, prefix: string): string {\n return decodeCursor(cursor, prefix, (value) => {\n if (\n typeof value !== 'object' ||\n value === null ||\n typeof Reflect.get(value, 'id') !== 'string'\n ) {\n throw new Error('invalid id cursor');\n }\n const id = Reflect.get(value, 'id') as string;\n if (id.length === 0) throw new Error('invalid id cursor');\n return id;\n });\n}\n\nfunction decodeEventCursor(cursor: string, prefix: string): EventCursor {\n return decodeCursor(cursor, prefix, (value) => {\n if (typeof value !== 'object' || value === null) throw new Error('invalid event cursor');\n const blockNumber = Reflect.get(value, 'blockNumber');\n const logIndex = Reflect.get(value, 'logIndex');\n const id = Reflect.get(value, 'id');\n if (typeof blockNumber !== 'string' || typeof logIndex !== 'string' || typeof id !== 'string') {\n throw new Error('invalid event cursor');\n }\n if (id.length === 0) throw new Error('invalid event cursor');\n return {\n blockNumber: normalizeDecimal(blockNumber, 'cursor.blockNumber'),\n logIndex: normalizeDecimal(logIndex, 'cursor.logIndex'),\n id,\n };\n });\n}\n\nfunction compareEventCursor(left: EventCursor, right: EventCursor): number {\n const leftBlock = BigInt(left.blockNumber);\n const rightBlock = BigInt(right.blockNumber);\n if (leftBlock !== rightBlock) return leftBlock < rightBlock ? -1 : 1;\n const leftLog = BigInt(left.logIndex);\n const rightLog = BigInt(right.logIndex);\n if (leftLog !== rightLog) return leftLog < rightLog ? -1 : 1;\n return left.id === right.id ? 0 : left.id < right.id ? -1 : 1;\n}\n\nfunction eventKeysetPredicate(cursor: EventCursor, blockField: string, logField: string) {\n return {\n _or: [\n { [blockField]: { _gt: cursor.blockNumber } },\n {\n _and: [\n { [blockField]: { _eq: cursor.blockNumber } },\n { [logField]: { _gt: cursor.logIndex } },\n ],\n },\n {\n _and: [\n { [blockField]: { _eq: cursor.blockNumber } },\n { [logField]: { _eq: cursor.logIndex } },\n { id: { _gt: cursor.id } },\n ],\n },\n ],\n };\n}\n\nconst STAKE_LOCK_STATUSES = new Set<StakeLockStatus>(['ACTIVE', 'UNLOCKED', 'RESOLVED']);\nconst STAKE_ACTIVITY_KINDS = new Set<StakeActivityKind>([\n 'DEPOSITED',\n 'WITHDRAWN',\n 'TAKER_AUTHORIZATION_UPDATED',\n 'STAKE_OWNER_SELECTED',\n 'LOCK_FUNDED',\n 'STAKE_LOCKED',\n 'STAKE_LOCK_INCREASED',\n 'STAKE_LOCK_RESIZED',\n 'STAKE_UNLOCKED',\n 'STAKE_LOCK_RESOLVED',\n 'CLAIM_CREATED',\n 'CLAIM_WITHDRAWN',\n]);\n\nfunction normalizeLockStatus(value: string, field: string): StakeLockStatus {\n if (!STAKE_LOCK_STATUSES.has(value as StakeLockStatus)) {\n throw new Error(`${field} is not a supported stake lock status`);\n }\n return value as StakeLockStatus;\n}\n\nfunction normalizeActivityKind(value: string, field: string): StakeActivityKind {\n if (!STAKE_ACTIVITY_KINDS.has(value as StakeActivityKind)) {\n throw new Error(`${field} is not a supported stake activity kind`);\n }\n return value as StakeActivityKind;\n}\n\nfunction latestUpdatedAsOf(\n items: Array<{ updatedAtBlockNumber: string; updatedAt: string }>,\n): IndexedPageAsOf | null {\n if (items.length === 0) return null;\n const latest = items.reduce((current, item) =>\n BigInt(item.updatedAtBlockNumber) > BigInt(current.updatedAtBlockNumber) ? item : current,\n );\n return { blockNumber: latest.updatedAtBlockNumber, timestamp: latest.updatedAt };\n}\n\nfunction assertNonEmptyId(id: string, field: string): string {\n if (id.length === 0) throw new Error(`${field} must not be empty`);\n return id;\n}\n\nfunction normalizeStakeLockRow(\n row: StakeLockEntity,\n index: number,\n scope: { chainId: number; vaultAddress: Address; stakeOwner: Address; status?: StakeLockStatus },\n): IndexedStakeLock {\n const field = `StakeLock[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const stakeOwner = normalizeAddress(row.stakeOwner, `${field}.stakeOwner`);\n if (stakeOwner !== scope.stakeOwner) {\n throw new Error(`${field}.stakeOwner does not match the query`);\n }\n const status = normalizeLockStatus(row.status, `${field}.status`);\n if (scope.status && status !== scope.status) {\n throw new Error(`${field}.status does not match the query`);\n }\n return {\n lockId: assertNonEmptyId(row.lockId, `${field}.lockId`),\n stakeOwner,\n initialAmount: normalizeDecimal(row.initialAmount, `${field}.initialAmount`),\n currentAmount: normalizeDecimal(row.currentAmount, `${field}.currentAmount`),\n maturesAt: normalizeDecimal(row.maturesAt, `${field}.maturesAt`),\n status,\n unlockedAmount: normalizeDecimal(row.unlockedAmount, `${field}.unlockedAmount`),\n claimedAmount: normalizeDecimal(row.claimedAmount, `${field}.claimedAmount`),\n createdAt: normalizeDecimal(row.createdAt, `${field}.createdAt`),\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction normalizeTakerStakeAuthorizationRow(\n row: TakerStakeAuthorizationRowEntity,\n index: number,\n scope: {\n chainId: number;\n vaultAddress: Address;\n side: 'stakeOwner' | 'taker';\n scopedAddress: Address;\n authorized?: boolean;\n },\n): IndexedTakerStakeAuthorization {\n const field = `TakerStakeAuthorization[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const taker = normalizeAddress(row.taker, `${field}.taker`);\n const stakeOwner = normalizeAddress(row.stakeOwner, `${field}.stakeOwner`);\n const scoped = scope.side === 'stakeOwner' ? stakeOwner : taker;\n if (scoped !== scope.scopedAddress) {\n throw new Error(`${field}.${scope.side} does not match the query`);\n }\n if (typeof row.authorized !== 'boolean') {\n throw new Error(`${field}.authorized must be a boolean`);\n }\n if (scope.authorized !== undefined && row.authorized !== scope.authorized) {\n throw new Error(`${field}.authorized does not match the query`);\n }\n return {\n taker,\n stakeOwner,\n authorized: row.authorized,\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction normalizeStakeActivityRow(\n row: StakeActivityEntity,\n index: number,\n scope: { chainId: number; vaultAddress: Address; merchant: Address; kind?: StakeActivityKind },\n): { item: IndexedStakeActivity; cursor: EventCursor } {\n const field = `StakeActivity[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const stakeOwner = normalizeNullableAddress(row.stakeOwner, `${field}.stakeOwner`);\n const taker = normalizeNullableAddress(row.taker, `${field}.taker`);\n if (stakeOwner !== scope.merchant && taker !== scope.merchant) {\n throw new Error(`${field} is not relevant to the requested merchant`);\n }\n const kind = normalizeActivityKind(row.kind, `${field}.kind`);\n if (scope.kind && kind !== scope.kind) {\n throw new Error(`${field}.kind does not match the query`);\n }\n const blockNumber = normalizeDecimal(row.blockNumber, `${field}.blockNumber`);\n const logIndex = normalizeDecimal(row.logIndex, `${field}.logIndex`);\n const id = assertNonEmptyId(row.id, `${field}.id`);\n return {\n item: {\n stakeOwner,\n taker,\n beneficiary: normalizeNullableAddress(row.beneficiary, `${field}.beneficiary`),\n kind,\n lockId: row.lockId ?? null,\n counterparty: normalizeNullableAddress(row.counterparty, `${field}.counterparty`),\n amount: normalizeDecimal(row.amount, `${field}.amount`),\n previousAmount: normalizeOptionalDecimal(row.previousAmount, `${field}.previousAmount`),\n stakeBalanceAfter: normalizeOptionalDecimal(\n row.stakeBalanceAfter,\n `${field}.stakeBalanceAfter`,\n ),\n lockedStakeAfter: normalizeOptionalDecimal(row.lockedStakeAfter, `${field}.lockedStakeAfter`),\n freeStakeAfter: normalizeOptionalDecimal(row.freeStakeAfter, `${field}.freeStakeAfter`),\n claimableAfter: normalizeOptionalDecimal(row.claimableAfter, `${field}.claimableAfter`),\n maturesAt: normalizeOptionalDecimal(row.maturesAt, `${field}.maturesAt`),\n blockNumber,\n logIndex,\n timestamp: normalizeDecimal(row.timestamp, `${field}.timestamp`),\n },\n cursor: { blockNumber, logIndex, id },\n };\n}\n\nfunction normalizeDisputeRow(\n row: DisputeProtectionIntentEntity,\n index: number,\n scope: { chainId: number; policyAddress: Address; throughBlockNumber: string },\n): { item: IndexedDisputeProtectionIntent; cursor: EventCursor } {\n const field = `DisputeProtectionIntent[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n const policyAddress = normalizeAddress(row.policyAddress, `${field}.policyAddress`);\n if (policyAddress !== scope.policyAddress) {\n throw new Error(`${field}.policyAddress does not match the query`);\n }\n if (row.status !== 'DISPUTED') throw new Error(`${field}.status must be DISPUTED`);\n if (\n row.disputedAtBlockNumber === null ||\n row.disputedAtBlockNumber === undefined ||\n row.disputedAtLogIndex === null ||\n row.disputedAtLogIndex === undefined ||\n row.disputedAt === null ||\n row.disputedAt === undefined ||\n row.disputedTxHash === null ||\n row.disputedTxHash === undefined\n ) {\n throw new Error(`${field} DISPUTED row must include its finalized event cursor`);\n }\n const blockNumber = normalizeDecimal(row.disputedAtBlockNumber, `${field}.disputedAtBlockNumber`);\n if (BigInt(blockNumber) > BigInt(scope.throughBlockNumber)) {\n throw new Error(`${field}.disputedAtBlockNumber exceeds throughBlockNumber`);\n }\n const logIndex = normalizeDecimal(row.disputedAtLogIndex, `${field}.disputedAtLogIndex`);\n const disputedAt = normalizeDecimal(row.disputedAt, `${field}.disputedAt`);\n const id = assertNonEmptyId(row.id, `${field}.id`);\n return {\n item: {\n policyAddress,\n intentHash: row.intentHash,\n status: 'DISPUTED',\n stakeOwner: normalizeAddress(row.stakeOwner, `${field}.stakeOwner`),\n depositor: normalizeAddress(row.depositor, `${field}.depositor`),\n taker: normalizeAddress(row.taker, `${field}.taker`),\n paymentMethod: row.paymentMethod,\n amount: normalizeDecimal(row.amount, `${field}.amount`),\n riskWindow: normalizeDecimal(row.riskWindow, `${field}.riskWindow`),\n releaseEligibleAt: normalizeOptionalDecimal(\n row.releaseEligibleAt,\n `${field}.releaseEligibleAt`,\n ),\n releaseAmount: normalizeOptionalDecimal(row.releaseAmount, `${field}.releaseAmount`),\n isManualRelease: row.isManualRelease ?? null,\n compensatedAmount: normalizeOptionalDecimal(\n row.compensatedAmount,\n `${field}.compensatedAmount`,\n ),\n disputeId: row.disputeId ?? null,\n openedAt: normalizeDecimal(row.openedAt, `${field}.openedAt`),\n openedTxHash: row.openedTxHash,\n cancelledAt: normalizeOptionalDecimal(row.cancelledAt, `${field}.cancelledAt`),\n cancelledTxHash: row.cancelledTxHash ?? null,\n settledAt: normalizeOptionalDecimal(row.settledAt, `${field}.settledAt`),\n settledTxHash: row.settledTxHash ?? null,\n releasedAt: normalizeOptionalDecimal(row.releasedAt, `${field}.releasedAt`),\n releasedTxHash: row.releasedTxHash ?? null,\n disputedAt,\n disputedTxHash: row.disputedTxHash,\n disputedAtBlockNumber: blockNumber,\n disputedAtLogIndex: logIndex,\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n },\n cursor: { blockNumber, logIndex, id },\n };\n}\n\nfunction freshnessOf(\n row: { updatedAtBlockNumber: string; updatedAt: string } | null,\n field: string,\n): IndexedStakingRowFreshness | null {\n if (!row) return null;\n return {\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction indexerHeadBlockNumber(rows: ChainMetadataEntity[], chainId: number): string | null {\n const row = rows[0];\n if (row === undefined) return null;\n if (row.chain_id !== chainId) {\n throw new Error('chain_metadata.chain_id does not match the query');\n }\n if (!Number.isSafeInteger(row.latest_processed_block) || row.latest_processed_block < 0) {\n throw new Error('chain_metadata.latest_processed_block must be a non-negative safe integer');\n }\n return row.latest_processed_block.toString();\n}\n\nexport function buildStakingEntityIds(params: IndexedStakingStateParams): StakingEntityIds {\n if (!Number.isInteger(params.chainId) || params.chainId <= 0) {\n throw new ValidationError('chainId must be a positive integer', 'chainId');\n }\n\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const disputeProtectionPolicyAddress = normalizeAddress(\n params.disputeProtectionPolicyAddress,\n 'disputeProtectionPolicyAddress',\n );\n const taker = normalizeAddress(params.taker, 'taker');\n const stakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n\n return {\n takerStateId: `${params.chainId}_${vaultAddress}_${taker}`,\n stakeAccountId: `${params.chainId}_${vaultAddress}_${stakeOwner}`,\n claimAccountId: `${params.chainId}_${vaultAddress}_${taker}`,\n vaultConfigId: `${params.chainId}_${vaultAddress}`,\n policy: disputeProtectionPolicyAddress,\n };\n}\n\nexport class IndexerStakingService {\n constructor(private readonly client: IndexerClient) {}\n\n async fetchStakeLocks(\n params: StakeLockPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedStakeLock>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const stakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n const status = params.status ? normalizeLockStatus(params.status, 'status') : undefined;\n const afterId = params.cursor ? decodeIdCursor(params.cursor, 'zkp2p-lock-v1') : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n { stakeOwner: { _eq: stakeOwner } },\n ];\n if (status) filters.push({ status: { _eq: status } });\n if (afterId) filters.push({ id: { _gt: afterId } });\n\n const data = await this.client.query<LocksGraphQLResponse>(\n {\n query: STAKE_LOCKS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previousId = afterId;\n const normalized = data.StakeLock.map((row, index) => {\n const id = assertNonEmptyId(row.id, `StakeLock[${index}].id`);\n if (previousId !== undefined && id <= previousId) {\n throw new Error('StakeLock cursor did not advance');\n }\n previousId = id;\n return {\n item: normalizeStakeLockRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n stakeOwner,\n status,\n }),\n id,\n };\n });\n const visible = normalized.slice(0, limit);\n const items = visible.map(({ item }) => item);\n return {\n items,\n nextCursor:\n normalized.length > limit\n ? encodeCursor('zkp2p-lock-v1', { id: visible[visible.length - 1]!.id })\n : null,\n asOf: latestUpdatedAsOf(items),\n };\n }\n\n /**\n * Pages one side of the vault's authorization graph: takers a stake owner\n * has authorized, or stake owners that have authorized a taker. Exactly one\n * of `stakeOwner` or `taker` scopes the page.\n */\n async fetchTakerStakeAuthorizations(\n params: TakerStakeAuthorizationPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedTakerStakeAuthorization>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n if ((params.stakeOwner === undefined) === (params.taker === undefined)) {\n throw new ValidationError(\n 'exactly one of stakeOwner or taker must be provided',\n 'stakeOwner',\n );\n }\n const scope =\n params.stakeOwner !== undefined\n ? ({\n side: 'stakeOwner',\n address: normalizeAddress(params.stakeOwner, 'stakeOwner'),\n } as const)\n : ({ side: 'taker', address: normalizeAddress(params.taker, 'taker') } as const);\n const afterId = params.cursor\n ? decodeIdCursor(params.cursor, 'zkp2p-stake-auth-v1')\n : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n { [scope.side]: { _eq: scope.address } },\n ];\n if (params.authorized !== undefined) filters.push({ authorized: { _eq: params.authorized } });\n if (afterId) filters.push({ id: { _gt: afterId } });\n\n const data = await this.client.query<AuthorizationsGraphQLResponse>(\n {\n query: TAKER_STAKE_AUTHORIZATIONS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previousId = afterId;\n const normalized = data.TakerStakeAuthorization.map((row, index) => {\n const id = assertNonEmptyId(row.id, `TakerStakeAuthorization[${index}].id`);\n if (previousId !== undefined && id <= previousId) {\n throw new Error('TakerStakeAuthorization cursor did not advance');\n }\n previousId = id;\n return {\n item: normalizeTakerStakeAuthorizationRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n side: scope.side,\n scopedAddress: scope.address,\n authorized: params.authorized,\n }),\n id,\n };\n });\n const visible = normalized.slice(0, limit);\n const items = visible.map(({ item }) => item);\n return {\n items,\n nextCursor:\n normalized.length > limit\n ? encodeCursor('zkp2p-stake-auth-v1', { id: visible[visible.length - 1]!.id })\n : null,\n asOf: latestUpdatedAsOf(items),\n };\n }\n\n async fetchStakeActivity(\n params: StakeActivityPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedStakeActivity>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const merchant = normalizeAddress(params.merchant, 'merchant');\n const kind = params.kind ? normalizeActivityKind(params.kind, 'kind') : undefined;\n const after = params.cursor ? decodeEventCursor(params.cursor, 'zkp2p-activity-v1') : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n {\n _or: [{ stakeOwner: { _eq: merchant } }, { taker: { _eq: merchant } }],\n },\n ];\n if (kind) filters.push({ kind: { _eq: kind } });\n if (after) filters.push(eventKeysetPredicate(after, 'blockNumber', 'logIndex'));\n\n const data = await this.client.query<ActivityGraphQLResponse>(\n {\n query: STAKE_ACTIVITY_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previous = after;\n const normalized = data.StakeActivity.map((row, index) => {\n const result = normalizeStakeActivityRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n merchant,\n kind,\n });\n if (previous && compareEventCursor(result.cursor, previous) <= 0) {\n throw new Error('StakeActivity cursor did not advance');\n }\n previous = result.cursor;\n return result;\n });\n const visible = normalized.slice(0, limit);\n const last = visible[visible.length - 1];\n return {\n items: visible.map(({ item }) => item),\n nextCursor:\n normalized.length > limit && last ? encodeCursor('zkp2p-activity-v1', last.cursor) : null,\n asOf: last ? { blockNumber: last.item.blockNumber, timestamp: last.item.timestamp } : null,\n };\n }\n\n async fetchDisputeProtectionIntents(\n params: DisputeProtectionIntentPageParams,\n init?: RequestInit,\n ): Promise<DisputeProtectionIntentPage> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const policyAddress = normalizeAddress(params.policyAddress, 'policyAddress');\n const throughBlockNumber = normalizeDecimal(params.throughBlockNumber, 'throughBlockNumber');\n const after = params.cursor ? decodeEventCursor(params.cursor, 'zkp2p-dispute-v1') : undefined;\n if (after && BigInt(after.blockNumber) > BigInt(throughBlockNumber)) {\n throw new ValidationError('cursor exceeds throughBlockNumber', 'cursor');\n }\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { policyAddress: { _eq: policyAddress } },\n { status: { _eq: 'DISPUTED' } },\n { disputedAtBlockNumber: { _lte: throughBlockNumber } },\n ];\n if (after) {\n filters.push(eventKeysetPredicate(after, 'disputedAtBlockNumber', 'disputedAtLogIndex'));\n }\n\n const data = await this.client.query<DisputesGraphQLResponse>(\n {\n query: DISPUTE_PROTECTION_INTENTS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previous = after;\n const normalized = data.DisputeProtectionIntent.map((row, index) => {\n const result = normalizeDisputeRow(row, index, {\n chainId: params.chainId,\n policyAddress,\n throughBlockNumber,\n });\n if (previous && compareEventCursor(result.cursor, previous) <= 0) {\n throw new Error('DisputeProtectionIntent cursor did not advance');\n }\n previous = result.cursor;\n return result;\n });\n const visible = normalized.slice(0, limit);\n const last = visible[visible.length - 1];\n return {\n items: visible.map(({ item }) => item),\n nextCursor:\n normalized.length > limit && last ? encodeCursor('zkp2p-dispute-v1', last.cursor) : null,\n endCursor: last ? encodeCursor('zkp2p-dispute-v1', last.cursor) : null,\n asOf: last\n ? { blockNumber: last.item.disputedAtBlockNumber, timestamp: last.item.disputedAt }\n : null,\n };\n }\n\n async fetchStakingState(\n params: IndexedStakingStateParams,\n init?: RequestInit,\n ): Promise<IndexedStakingState> {\n const ids = buildStakingEntityIds(params);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const taker = normalizeAddress(params.taker, 'taker');\n const requestedStakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n\n const data = await this.client.query<StakingStateGraphQLResponse>(\n {\n query: STAKING_STATE_QUERY,\n variables: {\n ...ids,\n chainId: params.chainId,\n vault: vaultAddress,\n taker,\n },\n },\n init,\n );\n\n const takerState = data.TakerStakeState_by_pk;\n const indexedStakeOwner = takerState\n ? normalizeAddress(takerState.stakeOwner, 'TakerStakeState.stakeOwner')\n : taker;\n const selectedStakeOwner = normalizeNullableAddress(\n takerState?.selectedStakeOwner,\n 'TakerStakeState.selectedStakeOwner',\n );\n const stakeAccount = data.StakeAccountState_by_pk;\n const stakeAccountOwner = stakeAccount\n ? normalizeAddress(stakeAccount.stakeOwner, 'StakeAccountState.stakeOwner')\n : requestedStakeOwner;\n const stakeAccountMatchesEffectiveOwner =\n requestedStakeOwner === indexedStakeOwner && stakeAccountOwner === indexedStakeOwner;\n const claimAccount = data.ClaimAccountState_by_pk;\n\n if (\n claimAccount &&\n normalizeAddress(claimAccount.beneficiary, 'ClaimAccountState.beneficiary') !== taker\n ) {\n throw new Error('ClaimAccountState beneficiary does not match the requested taker');\n }\n\n const authorizations = data.TakerStakeAuthorization.map((authorization, index) => ({\n stakeOwner: normalizeAddress(\n authorization.stakeOwner,\n `TakerStakeAuthorization[${index}].stakeOwner`,\n ),\n authorized: authorization.authorized,\n freshness: freshnessOf(\n authorization,\n `TakerStakeAuthorization[${index}]`,\n ) as IndexedStakingRowFreshness,\n }));\n\n const riskWindows = data.DisputeProtectionRiskWindow.map((row, index) => ({\n paymentMethod: row.paymentMethod,\n riskWindowSeconds: normalizeDecimal(\n row.riskWindow,\n `DisputeProtectionRiskWindow[${index}].riskWindow`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `DisputeProtectionRiskWindow[${index}].updatedAt`),\n }));\n\n const takerFreshness = freshnessOf(takerState, 'TakerStakeState');\n const stakeFreshness = freshnessOf(stakeAccount, 'StakeAccountState');\n const claimFreshness = freshnessOf(claimAccount, 'ClaimAccountState');\n const vaultFreshness = freshnessOf(data.StakeVaultConfig_by_pk, 'StakeVaultConfig');\n const authorizationFreshness = authorizations.map((authorization) => authorization.freshness);\n\n return {\n chainId: params.chainId,\n environment: params.environment,\n taker,\n stakeOwner: indexedStakeOwner,\n selectedStakeOwner,\n selectionAuthorized: takerState?.selectionAuthorized ?? false,\n stake:\n stakeAccount && stakeAccountMatchesEffectiveOwner\n ? {\n totalUsdc: normalizeDecimal(stakeAccount.totalStake, 'StakeAccountState.totalStake'),\n lockedUsdc: normalizeDecimal(\n stakeAccount.lockedStake,\n 'StakeAccountState.lockedStake',\n ),\n freeUsdc: normalizeDecimal(stakeAccount.freeStake, 'StakeAccountState.freeStake'),\n }\n : { ...ZERO_STAKE },\n claimableUsdc: claimAccount\n ? normalizeDecimal(claimAccount.claimableAmount, 'ClaimAccountState.claimableAmount')\n : '0',\n authorizations,\n riskWindows,\n vault: data.StakeVaultConfig_by_pk\n ? {\n controller: normalizeNullableAddress(\n data.StakeVaultConfig_by_pk.controller,\n 'StakeVaultConfig.controller',\n ),\n pendingController: normalizeNullableAddress(\n data.StakeVaultConfig_by_pk.pendingController,\n 'StakeVaultConfig.pendingController',\n ),\n pendingControllerValidAt: data.StakeVaultConfig_by_pk.pendingControllerValidAt\n ? normalizeDecimal(\n data.StakeVaultConfig_by_pk.pendingControllerValidAt,\n 'StakeVaultConfig.pendingControllerValidAt',\n )\n : null,\n }\n : null,\n stakeAccountMatchesEffectiveOwner,\n freshness: {\n takerStakeState: takerFreshness,\n stakeAccountState: stakeFreshness,\n claimAccountState: claimFreshness,\n stakeVaultConfig: vaultFreshness,\n authorizations: authorizationFreshness,\n indexerHeadBlockNumber: indexerHeadBlockNumber(data.chain_metadata, params.chainId),\n },\n };\n }\n}\n","// Auto-generated main entry point\nexport const version = \"0.4.1-rc.9\";\n","const data = {\n \"schemaVersion\": 2,\n \"network\": \"base\",\n \"chainId\": 8453,\n \"activeDisputeStack\": {\n \"version\": 2,\n \"selectionHash\": \"ba40c2954b408d0c658881a8d28e5bfcc9bade5cc3d953fd17eae1eca69d841c\"\n },\n \"runtimeIdentities\": {\n \"Orchestrator\": {\n \"address\": \"0x88888883Ed048FF0a415271B28b2F52d431810D0\",\n \"runtimeCodeHash\": \"0xf511343f2903dd1877c490796cc9423fac66b162b59004d55e522046c1ceb050\"\n },\n \"OrchestratorV2\": {\n \"address\": \"0x888888359E981B5225CA48fbCdCeff702FC3b888\",\n \"runtimeCodeHash\": \"0xcf70a08cc24fcc00799f9f365d0998abe37c718c93ee370a78d1ca06c60d01e0\"\n },\n \"OrchestratorV3\": {\n \"address\": \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\",\n \"runtimeCodeHash\": \"0x4e58f26129559301c017ff264b61dd2255ed2107593d308472ef32d07b8745e9\"\n },\n \"StakeVault\": {\n \"address\": \"0x47c26258222e2f96424bD2B21bf173f0DA5034C7\",\n \"runtimeCodeHash\": \"0xfd8d2a910b9ac2c55675ae06d0504f9aac43b02b7022755cf229b571156c681d\"\n },\n \"DisputeProtectionPolicy\": {\n \"address\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"runtimeCodeHash\": \"0xf5a7756f16556da69c91c55bdcffd9fd95cc8cbdb772699827ec4c66db136dfe\"\n },\n \"IntentLifecycleHookV1\": {\n \"address\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"runtimeCodeHash\": \"0x2b479a570ddea7a990f2cae8fa95eb3b8599fc8b367332b8dab92f7d0cebf7e0\"\n },\n \"RecognizedPredecessorHook\": {\n \"address\": \"0x71467dCac3B50eeED5A485aC6a70f27B1EAC1970\",\n \"runtimeCodeHash\": \"0x35789014e608a248f3244b61210fa259fee3566c33f50fd0e3fa1f5ae22e370b\"\n },\n \"RecognizedPredecessorPolicy\": {\n \"address\": \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\",\n \"runtimeCodeHash\": \"0x9c4be279da216021183638eaef79ebf98db248472685e9ecd0de3f24a513a641\"\n },\n \"OrchestratorRegistry\": {\n \"address\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"runtimeCodeHash\": \"0xf0d132d621ac03181a6fade6a93bd0968d33830c8bf393793236787e7978aee1\"\n },\n \"WhitelistPolicy\": {\n \"address\": \"0x389Cd9bA91FfFcd83d267B241E975541892759Ce\",\n \"runtimeCodeHash\": \"0xa83d138a5b89d2fd2861702febc6333e542dcdc8994ee76c345dcbd22fe685a4\"\n },\n \"DisputeVerifier\": {\n \"address\": \"0x30d4947f005653637005eed991005119D9eB2f34\",\n \"runtimeCodeHash\": \"0x65246e11392befc33d92246cf3ac2467d1f338a8b73c6514b76fab0a70a01ead\"\n },\n \"DisputeNullifierRegistry\": {\n \"address\": \"0xA845615b5203F7a21321DdF5e3a1ca024D93a443\",\n \"runtimeCodeHash\": \"0x1a711749b7700142265363c9c184c195ac81a1415e2142aa84edcbf1cd88142a\"\n },\n \"MultiAttestationVerifier\": {\n \"address\": \"0x9Fe920b24e50e6a6362BA71a1BeB502A99c402d5\",\n \"runtimeCodeHash\": \"0x828a5dae520d3eaed904dfed56994dc6e892eb6416b58ad952c079e220ef841a\"\n }\n },\n \"addressExpectations\": {\n \"AddressGroupRegistry\": \"0x39F80118f9eB619135f116171b6Cb91D372C5AF2\",\n \"EscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"PaymentVerifierRegistry\": \"0x2b82D24437ff66Fb173eabDfD67ee2ACeb8bEb1e\",\n \"RelayerRegistry\": \"0xEbA979889a9c97382A92472fF3703786fF180083\",\n \"NullifierRegistryV2\": \"0x5455e761b866dfa6A2f5Dc6d6525825bf9C09aeB\",\n \"StakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedRelations\": {\n \"activeLifecycleHook\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"recognizedPredecessorPolicy\": \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\",\n \"registeredOrchestrator\": \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\",\n \"authorizedLifecycleHook\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"disputeNullifierAuthorizedWriter\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"orchestratorEscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"orchestratorPaymentVerifierRegistry\": \"0x2b82D24437ff66Fb173eabDfD67ee2ACeb8bEb1e\",\n \"orchestratorRelayerRegistry\": \"0xEbA979889a9c97382A92472fF3703786fF180083\",\n \"hookOrchestratorRegistry\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"hookWhitelistPolicy\": \"0x389Cd9bA91FfFcd83d267B241E975541892759Ce\",\n \"hookDisputeProtectionPolicy\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"whitelistGroupRegistry\": \"0x39F80118f9eB619135f116171b6Cb91D372C5AF2\",\n \"whitelistEscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"whitelistOrchestratorRegistry\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"policyStakeVault\": \"0x47c26258222e2f96424bD2B21bf173f0DA5034C7\",\n \"policyDisputeVerifier\": \"0x30d4947f005653637005eed991005119D9eB2f34\",\n \"policyDisputeNullifierRegistry\": \"0xA845615b5203F7a21321DdF5e3a1ca024D93a443\",\n \"disputeVerifierNullifierRegistry\": \"0x5455e761b866dfa6A2f5Dc6d6525825bf9C09aeB\",\n \"disputeVerifierAttestationVerifier\": \"0x9Fe920b24e50e6a6362BA71a1BeB502A99c402d5\",\n \"vaultController\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"vaultStakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedGovernance\": {\n \"owner\": \"0x0bC26FF515411396DD588Abd6Ef6846E04470227\",\n \"governedRuntimeIdentities\": [\n \"OrchestratorRegistry\",\n \"OrchestratorV3\",\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"WhitelistPolicy\",\n \"DisputeVerifier\",\n \"DisputeNullifierRegistry\",\n \"MultiAttestationVerifier\"\n ],\n \"pendingOwner\": \"0x0000000000000000000000000000000000000000\",\n \"twoStepGovernedRuntimeIdentities\": [\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"DisputeVerifier\"\n ]\n },\n \"attestationTrust\": {\n \"requiredSignatures\": \"1\",\n \"witnesses\": [\n \"0xDB4Ed7FAF170F0f6493E3adaaCaaFaF47092c754\",\n \"0xE078D93bFdd87A8c5C5cCA5905DCbA0Dd7A1F0BD\"\n ]\n },\n \"exactAuthorizationSets\": {\n \"orchestratorAuthorizationFromBlock\": \"42878566\",\n \"authorizedOrchestrators\": [\n \"0x88888883Ed048FF0a415271B28b2F52d431810D0\",\n \"0x888888359E981B5225CA48fbCdCeff702FC3b888\",\n \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\"\n ],\n \"lifecycleHookAuthorizationFromBlock\": \"50537204\",\n \"authorizedLifecycleHooks\": [\n \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\"\n ],\n \"passiveDisputeNullifierWriters\": [\n \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\"\n ],\n \"activeDisputeNullifierWriters\": [\n \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\"\n ]\n },\n \"riskWindowSecondsByPaymentMethod\": {\n \"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d\": \"1209600\",\n \"0x3ccc3d4d5e769b1f82dc4988485551dc0cd3c7a3926d7d8a4dde91507199490f\": \"1209600\",\n \"0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5\": \"0\",\n \"0x5908bb0c9b87763ac6171d4104847667e7f02b4c47b574fe890c1f439ed128bb\": \"0\",\n \"0x617f88ab82b5c1b014c539f7e75121427f0bb50a4c58b187a238531e7d58605d\": \"0\",\n \"0x62c7ed738ad3e7618111348af32691b5767777fbaf46a2d8943237625552645c\": \"0\",\n \"0x90262a3db0edd0be2369c6b28f9e8511ec0bac7136cefbada0880602f87e7268\": \"1209600\",\n \"0xa5418819c024239299ea32e09defae8ec412c03e58f5c75f1b2fe84c857f5483\": \"0\",\n \"0xcac9daea62d7b89d75ac73af4ee14dcf25721012ae82b568c2ea5c808eaa04ff\": \"0\",\n \"0xf752c7d19698ecb0bb8988abf9b9a53a4c3657f3bc8850a6fb59fdf3e3ce8cd3\": \"0\"\n },\n \"sentinel\": {\n \"escrow\": \"0x0000000000000000000000000000000000000001\",\n \"depositId\": \"0\",\n \"expected\": false\n },\n \"prerequisites\": {\n \"orchestratorPaused\": false,\n \"admissionsPaused\": false,\n \"allowMultipleIntents\": true,\n \"orchestratorRegistered\": true,\n \"lifecycleHookAuthorized\": true,\n \"disputeNullifierWriterAuthorized\": true,\n \"vaultControllerActivated\": true,\n \"vaultPendingController\": \"0x0000000000000000000000000000000000000000\",\n \"vaultPendingControllerValidAt\": \"0\",\n \"pendingCoverageMaturity\": \"18446744073709551615\"\n }\n};\nexport default data;\n","const data = {\n \"schemaVersion\": 2,\n \"network\": \"base_staging\",\n \"chainId\": 8453,\n \"activeDisputeStack\": {\n \"version\": 2,\n \"selectionHash\": \"6c49c1ce51eec594a22385c4efcab08aa9926b6b63a725e14a0027ec5d2f4fc9\"\n },\n \"runtimeIdentities\": {\n \"Orchestrator\": {\n \"address\": \"0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e\",\n \"runtimeCodeHash\": \"0xf511343f2903dd1877c490796cc9423fac66b162b59004d55e522046c1ceb050\"\n },\n \"OrchestratorV2\": {\n \"address\": \"0xc17a59227B136c45fAa153086a15EF87ED14bE00\",\n \"runtimeCodeHash\": \"0xcf70a08cc24fcc00799f9f365d0998abe37c718c93ee370a78d1ca06c60d01e0\"\n },\n \"OrchestratorV3\": {\n \"address\": \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\",\n \"runtimeCodeHash\": \"0x4e58f26129559301c017ff264b61dd2255ed2107593d308472ef32d07b8745e9\"\n },\n \"StakeVault\": {\n \"address\": \"0x92d7B59E99e1CD2066540Cd2413b8714948b731f\",\n \"runtimeCodeHash\": \"0xfd8d2a910b9ac2c55675ae06d0504f9aac43b02b7022755cf229b571156c681d\"\n },\n \"DisputeProtectionPolicy\": {\n \"address\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"runtimeCodeHash\": \"0x70c43bfae8253a6a166f9697ddc27b2d77b4d9841e01fefc2db84037d9a98622\"\n },\n \"IntentLifecycleHookV1\": {\n \"address\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"runtimeCodeHash\": \"0xb9ce42108c706f9241aeb41ffdc0da6b7584e8482183055452098b2f16c7abfd\"\n },\n \"RecognizedPredecessorHook\": {\n \"address\": \"0x19D9F0Fcb08C60D8bd0CD061C34eae27eF8b6e65\",\n \"runtimeCodeHash\": \"0xba70239e37624f5808e2f79e100e83a17daeb1558f310543187f5d8a121ec367\"\n },\n \"RecognizedPredecessorPolicy\": {\n \"address\": \"0x21517b7743E727ae47A66FafF93550B689c15020\",\n \"runtimeCodeHash\": \"0x4e6617a94819ad15693289b173a9a66a78cfe1dd706f6b4fdc5a5f6ad6a32971\"\n },\n \"OrchestratorRegistry\": {\n \"address\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"runtimeCodeHash\": \"0xf0d132d621ac03181a6fade6a93bd0968d33830c8bf393793236787e7978aee1\"\n },\n \"WhitelistPolicy\": {\n \"address\": \"0xF79aAD1BAaB617fF3Eb299225c80893F22F743Fe\",\n \"runtimeCodeHash\": \"0x1ece96bb7be9cdd2433a2aad66c9b2d710e3e210a65876e0f8c1e43662ee5653\"\n },\n \"DisputeVerifier\": {\n \"address\": \"0x973578148c5Fd49b9f68B50B26066555325AC708\",\n \"runtimeCodeHash\": \"0xb3b34734cfd162cd129d0c84285461c751321545213ec20164745b8e72f9dd6c\"\n },\n \"DisputeNullifierRegistry\": {\n \"address\": \"0xE0B05a9655AF0f31E32904267baa50FbC7f217ea\",\n \"runtimeCodeHash\": \"0x1a711749b7700142265363c9c184c195ac81a1415e2142aa84edcbf1cd88142a\"\n },\n \"MultiAttestationVerifier\": {\n \"address\": \"0x9855a39aC5975069632e91160d8712CBfF19e864\",\n \"runtimeCodeHash\": \"0x828a5dae520d3eaed904dfed56994dc6e892eb6416b58ad952c079e220ef841a\"\n }\n },\n \"addressExpectations\": {\n \"AddressGroupRegistry\": \"0x54Ff7788Cb42B46FE2F016a65Fd0f654Bb9BcF3D\",\n \"EscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"PaymentVerifierRegistry\": \"0x2261416DA54C85f975C73FA56EF4D2D6b0aEF7Cc\",\n \"RelayerRegistry\": \"0xB214650b424E6b5fdcB1259566eB7A512D8Bd25E\",\n \"NullifierRegistryV2\": \"0x2eb43d6C7c7Ec4220Aa6B8735BC053824a71778C\",\n \"StakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedRelations\": {\n \"activeLifecycleHook\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"recognizedPredecessorPolicy\": \"0x21517b7743E727ae47A66FafF93550B689c15020\",\n \"registeredOrchestrator\": \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\",\n \"authorizedLifecycleHook\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"disputeNullifierAuthorizedWriter\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"orchestratorEscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"orchestratorPaymentVerifierRegistry\": \"0x2261416DA54C85f975C73FA56EF4D2D6b0aEF7Cc\",\n \"orchestratorRelayerRegistry\": \"0xB214650b424E6b5fdcB1259566eB7A512D8Bd25E\",\n \"hookOrchestratorRegistry\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"hookWhitelistPolicy\": \"0xF79aAD1BAaB617fF3Eb299225c80893F22F743Fe\",\n \"hookDisputeProtectionPolicy\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"whitelistGroupRegistry\": \"0x54Ff7788Cb42B46FE2F016a65Fd0f654Bb9BcF3D\",\n \"whitelistEscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"whitelistOrchestratorRegistry\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"policyStakeVault\": \"0x92d7B59E99e1CD2066540Cd2413b8714948b731f\",\n \"policyDisputeVerifier\": \"0x973578148c5Fd49b9f68B50B26066555325AC708\",\n \"policyDisputeNullifierRegistry\": \"0xE0B05a9655AF0f31E32904267baa50FbC7f217ea\",\n \"disputeVerifierNullifierRegistry\": \"0x2eb43d6C7c7Ec4220Aa6B8735BC053824a71778C\",\n \"disputeVerifierAttestationVerifier\": \"0x9855a39aC5975069632e91160d8712CBfF19e864\",\n \"vaultController\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"vaultStakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedGovernance\": {\n \"owner\": \"0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929\",\n \"governedRuntimeIdentities\": [\n \"OrchestratorRegistry\",\n \"OrchestratorV3\",\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"WhitelistPolicy\",\n \"DisputeVerifier\",\n \"DisputeNullifierRegistry\",\n \"MultiAttestationVerifier\"\n ],\n \"pendingOwner\": \"0x0000000000000000000000000000000000000000\",\n \"twoStepGovernedRuntimeIdentities\": [\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"DisputeVerifier\"\n ]\n },\n \"attestationTrust\": {\n \"requiredSignatures\": \"1\",\n \"witnesses\": [\n \"0x66649F896521b0fb487fE2077b4FBDA283d7f19a\",\n \"0x4ab950AE1e3326578Bf7e643a2031E858aBa2927\"\n ]\n },\n \"exactAuthorizationSets\": {\n \"orchestratorAuthorizationFromBlock\": \"42614859\",\n \"authorizedOrchestrators\": [\n \"0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e\",\n \"0xc17a59227B136c45fAa153086a15EF87ED14bE00\",\n \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\"\n ],\n \"lifecycleHookAuthorizationFromBlock\": \"50536390\",\n \"authorizedLifecycleHooks\": [\n \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\"\n ],\n \"passiveDisputeNullifierWriters\": [\n \"0x21517b7743E727ae47A66FafF93550B689c15020\"\n ],\n \"activeDisputeNullifierWriters\": [\n \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\"\n ]\n },\n \"riskWindowSecondsByPaymentMethod\": {\n \"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d\": \"1209600\",\n \"0x1d966dbd6aeb8674d7c05174bd0ded7b56a798672bfb862ef20bbe8c2bbfce18\": \"0\",\n \"0x3ccc3d4d5e769b1f82dc4988485551dc0cd3c7a3926d7d8a4dde91507199490f\": \"1209600\",\n \"0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5\": \"0\",\n \"0x5908bb0c9b87763ac6171d4104847667e7f02b4c47b574fe890c1f439ed128bb\": \"0\",\n \"0x617f88ab82b5c1b014c539f7e75121427f0bb50a4c58b187a238531e7d58605d\": \"0\",\n \"0x62c7ed738ad3e7618111348af32691b5767777fbaf46a2d8943237625552645c\": \"0\",\n \"0x90262a3db0edd0be2369c6b28f9e8511ec0bac7136cefbada0880602f87e7268\": \"1209600\",\n \"0xa5418819c024239299ea32e09defae8ec412c03e58f5c75f1b2fe84c857f5483\": \"0\",\n \"0xcac9daea62d7b89d75ac73af4ee14dcf25721012ae82b568c2ea5c808eaa04ff\": \"0\",\n \"0xf752c7d19698ecb0bb8988abf9b9a53a4c3657f3bc8850a6fb59fdf3e3ce8cd3\": \"0\",\n \"0xf81480907d808d639ad3230869e4b05a3b01b2d34e323af40f2efab807effd32\": \"0\"\n },\n \"sentinel\": {\n \"escrow\": \"0x0000000000000000000000000000000000000001\",\n \"depositId\": \"0\",\n \"expected\": false\n },\n \"prerequisites\": {\n \"orchestratorPaused\": false,\n \"admissionsPaused\": false,\n \"allowMultipleIntents\": false,\n \"orchestratorRegistered\": true,\n \"lifecycleHookAuthorized\": true,\n \"disputeNullifierWriterAuthorized\": true,\n \"vaultControllerActivated\": true,\n \"vaultPendingController\": \"0x0000000000000000000000000000000000000000\",\n \"vaultPendingControllerValidAt\": \"0\",\n \"pendingCoverageMaturity\": \"18446744073709551615\"\n }\n};\nexport default data;\n","export type SdkBuildMetadata = {\n readonly schemaVersion: 2;\n readonly source: {\n readonly repository: 'zkp2p/zkp2p-clients';\n readonly commitSha: string;\n readonly kind: 'development' | 'github';\n readonly distributable: boolean;\n };\n readonly sdkPackageVersion: string;\n readonly contractsPackageVersion: string;\n readonly indexerSchemaPackageVersion: string;\n readonly activeDisputeStack: {\n readonly base: { readonly version: 2; readonly selectionHash: string };\n readonly baseStaging: { readonly version: 2; readonly selectionHash: string };\n };\n};\n\ndeclare const __ZKP2P_SDK_BUILD_METADATA__: SdkBuildMetadata;\n\nconst DEVELOPMENT_BUILD_METADATA: SdkBuildMetadata = {\n schemaVersion: 2,\n source: {\n repository: 'zkp2p/zkp2p-clients',\n commitSha: 'development',\n kind: 'development',\n distributable: false,\n },\n sdkPackageVersion: 'development',\n contractsPackageVersion: 'development',\n indexerSchemaPackageVersion: 'development',\n activeDisputeStack: {\n base: { version: 2, selectionHash: 'development' },\n baseStaging: { version: 2, selectionHash: 'development' },\n },\n};\n\n/** Immutable source and protocol identity embedded in the built SDK artifact. */\nexport const SDK_BUILD_METADATA: SdkBuildMetadata =\n typeof __ZKP2P_SDK_BUILD_METADATA__ === 'undefined'\n ? DEVELOPMENT_BUILD_METADATA\n : __ZKP2P_SDK_BUILD_METADATA__;\n","import { version as installedContractsPackageVersion } from '@zkp2p/contracts-v2';\nimport {\n base as baseManifest,\n baseStaging as baseStagingManifest,\n type DisputeStackManifest,\n type GovernedRuntimeIdentityName,\n type RuntimeIdentityName,\n} from '@zkp2p/contracts-v2/disputeStack';\nimport {\n DisputeNullifierRegistry,\n DisputeProtectionPolicy as PackagedDisputeProtectionPolicy,\n DisputeVerifier,\n IntentLifecycleHookV1,\n MultiAttestationVerifier,\n OrchestratorRegistry,\n OrchestratorV3,\n StakeVault,\n WhitelistPolicy,\n} from '@zkp2p/contracts-v2/abis/base';\nimport { DISPUTE_PROTECTION_POLICY_ABI } from '@zkp2p/core/contracts';\nimport {\n keccak256,\n zeroAddress,\n type Abi,\n type AbiEvent,\n type Address,\n type PublicClient,\n} from 'viem';\n\nimport { SDK_BUILD_METADATA, type SdkBuildMetadata } from '../buildMetadata';\nimport type { RuntimeEnv } from '../contracts';\n\nconst DisputeProtectionPolicy =\n DISPUTE_PROTECTION_POLICY_ABI ?? (PackagedDisputeProtectionPolicy as Abi);\n\nconst SUCCESSOR_RUNTIME_IDENTITIES: RuntimeIdentityName[] = [\n 'IntentLifecycleHookV1',\n 'StakeVault',\n 'DisputeProtectionPolicy',\n 'OrchestratorRegistry',\n 'WhitelistPolicy',\n 'DisputeVerifier',\n 'DisputeNullifierRegistry',\n 'MultiAttestationVerifier',\n];\n\nconst GOVERNANCE_ABIS = {\n OrchestratorRegistry,\n OrchestratorV3,\n StakeVault,\n DisputeProtectionPolicy,\n WhitelistPolicy,\n DisputeVerifier,\n DisputeNullifierRegistry,\n MultiAttestationVerifier,\n} satisfies Record<GovernedRuntimeIdentityName, Abi>;\n\nconst ORCHESTRATOR_AUTHORIZATION_EVENTS = OrchestratorRegistry.filter(\n (item): item is AbiEvent =>\n item.type === 'event' &&\n (item.name === 'OrchestratorAdded' || item.name === 'OrchestratorRemoved'),\n);\nconst LIFECYCLE_HOOK_AUTHORIZATION_EVENTS = DisputeProtectionPolicy.filter(\n (item): item is AbiEvent =>\n item.type === 'event' && item.name === 'LifecycleHookAuthorizationUpdated',\n);\nconst FALLBACK_LOG_BLOCK_SPAN = 10_000n;\nconst LOG_QUERY_CONCURRENCY = 8;\n\ntype InactiveReadinessState = 'recognized_predecessor' | 'passive_successor' | 'verified_no_hook';\n\ntype KnownReadinessBase = {\n asOfBlock: bigint;\n manifestNetwork: 'base' | 'base_staging';\n manifestSelectionHash: string;\n contractsPackageVersion: string;\n activeLifecycleHook: Address;\n orchestratorPaused: boolean;\n allowMultipleIntents: boolean;\n policyAdmissionsPaused: boolean | null;\n};\n\ntype KnownReadinessResult = KnownReadinessBase &\n (\n | {\n state: InactiveReadinessState;\n readyForDisputeProtection: false;\n }\n | {\n state: 'active_successor_verified';\n readyForDisputeProtection: boolean;\n policyAdmissionsPaused: boolean;\n }\n );\n\nexport type DisputeProtectionReadinessResult =\n | KnownReadinessResult\n | {\n state: 'mismatch';\n readyForDisputeProtection: false;\n asOfBlock: bigint | null;\n reason: string;\n };\n\nexport type DisputeProtectionReadinessOptions = {\n /** Also prove the dormant successor stack while the recognized predecessor remains active. */\n verifyPassiveSuccessor?: boolean;\n};\n\nexport type DisputeAttestationConfig = {\n asOfBlock: bigint;\n chainId: number;\n policyAddress: Address;\n verifierAddress: Address;\n trustedSigners: readonly Address[];\n requiredSignatures: number;\n};\n\nexport type ReadDisputeAttestationConfigParams = {\n publicClient: PublicClient;\n chainId: number;\n environment?: RuntimeEnv;\n};\n\ntype ReaderConfig = {\n publicClient: PublicClient;\n chainId: number;\n manifest: DisputeStackManifest;\n buildMetadata: SdkBuildMetadata;\n contractsPackageVersion: string;\n};\n\nclass ReadinessMismatch extends Error {}\n\nfunction sameAddress(actual: unknown, expected: Address): boolean {\n return typeof actual === 'string' && actual.toLowerCase() === expected.toLowerCase();\n}\n\nfunction expectAddress(label: string, actual: unknown, expected: Address): void {\n if (!sameAddress(actual, expected)) throw new ReadinessMismatch(`${label} mismatch`);\n}\n\nfunction expectBoolean(label: string, actual: unknown, expected: boolean): void {\n if (actual !== expected) throw new ReadinessMismatch(`${label} expected ${String(expected)}`);\n}\n\nfunction expectBigInt(label: string, actual: unknown, expected: bigint): void {\n if (actual !== expected) throw new ReadinessMismatch(`${label} mismatch`);\n}\n\nfunction normalizeAddressSet(label: string, addresses: unknown): string[] {\n if (!Array.isArray(addresses) || addresses.some((address) => typeof address !== 'string')) {\n throw new ReadinessMismatch(`${label} is not an address array`);\n }\n const normalized = addresses.map((address) => address.toLowerCase()).sort();\n if (new Set(normalized).size !== normalized.length) {\n throw new ReadinessMismatch(`${label} contains duplicate addresses`);\n }\n return normalized;\n}\n\nfunction expectAddressSet(label: string, actual: unknown, expected: readonly Address[]): void {\n const actualAddresses = normalizeAddressSet(label, actual);\n const expectedAddresses = normalizeAddressSet(label, expected);\n if (\n actualAddresses.length !== expectedAddresses.length ||\n actualAddresses.some((address, index) => address !== expectedAddresses[index])\n ) {\n throw new ReadinessMismatch(`${label} mismatch`);\n }\n}\n\n/**\n * Governance retires predecessor orchestrators from the live registry ahead of\n * manifest republishes (OrchestratorV2 was removed by the Safe mid-incident),\n * so exact-set equality would report the dispute stack as broken exactly when\n * the surface was deliberately reduced. Fail-closed still holds through the\n * two directions that matter: an orchestrator the manifest never listed is a\n * mismatch, and the required successor being absent is a mismatch.\n */\nfunction expectAddressSubsetWithRequired(\n label: string,\n actual: unknown,\n expected: readonly Address[],\n required: Address,\n): void {\n const actualAddresses = normalizeAddressSet(label, actual);\n const expectedAddresses = new Set(normalizeAddressSet(label, expected));\n const unknown = actualAddresses.filter((address) => !expectedAddresses.has(address));\n if (unknown.length > 0) {\n throw new ReadinessMismatch(`${label} mismatch`);\n }\n if (!actualAddresses.includes(required.toLowerCase())) {\n throw new ReadinessMismatch(`${label} is missing the active successor orchestrator`);\n }\n}\n\ntype AuthorizationEvent = {\n eventName?: string;\n blockNumber: bigint | null;\n transactionIndex: number | null;\n logIndex: number | null;\n args?: Record<string, unknown>;\n};\n\nfunction fallbackBlockRanges(fromBlock: bigint, toBlock: bigint): Array<[bigint, bigint]> {\n const ranges: Array<[bigint, bigint]> = [];\n for (let start = fromBlock; start <= toBlock; start += FALLBACK_LOG_BLOCK_SPAN) {\n const end = start + FALLBACK_LOG_BLOCK_SPAN - 1n;\n ranges.push([start, end < toBlock ? end : toBlock]);\n }\n return ranges;\n}\n\nfunction isLogRangeLimitError(cause: unknown): boolean {\n let error = cause;\n while (error instanceof Error) {\n if (\n /(?:block range.{0,40}(?:too (?:large|wide)|exceed|limit)|limited to.{0,40}(?:blocks?|range)|response size exceeded|query returned more than|too many (?:logs|results)|maximum block range)/i.test(\n error.message,\n )\n ) {\n return true;\n }\n error = (error as Error & { cause?: unknown }).cause;\n }\n return false;\n}\n\nfunction compareAuthorizationEvents(left: AuthorizationEvent, right: AuthorizationEvent): number {\n if ((left.blockNumber ?? 0n) !== (right.blockNumber ?? 0n)) {\n return (left.blockNumber ?? 0n) < (right.blockNumber ?? 0n) ? -1 : 1;\n }\n if ((left.transactionIndex ?? 0) !== (right.transactionIndex ?? 0)) {\n return (left.transactionIndex ?? 0) - (right.transactionIndex ?? 0);\n }\n return (left.logIndex ?? 0) - (right.logIndex ?? 0);\n}\n\nfunction replayAddressAuthorizations(\n label: string,\n events: readonly AuthorizationEvent[],\n addressField: string,\n enabledField?: string,\n): Address[] {\n const authorized = new Set<string>();\n for (const event of [...events].sort(compareAuthorizationEvents)) {\n const address = event.args?.[addressField];\n if (typeof address !== 'string') {\n throw new ReadinessMismatch(`${label} event address is malformed`);\n }\n const normalized = address.toLowerCase();\n const enabled = enabledField ? event.args?.[enabledField] : event.args?.enabled;\n if (typeof enabled !== 'boolean') {\n throw new ReadinessMismatch(`${label} event authorization is malformed`);\n }\n if (enabled) authorized.add(normalized);\n else authorized.delete(normalized);\n }\n return [...authorized] as Address[];\n}\n\nfunction manifestForEnvironment(\n environment: RuntimeEnv,\n): DisputeStackManifest<'base' | 'base_staging'> {\n return environment === 'staging' ? baseStagingManifest : baseManifest;\n}\n\n/** Read the canonical dispute addresses and live attestation trust roots at one block. */\nexport async function readDisputeAttestationConfig({\n publicClient,\n chainId,\n environment = 'production',\n}: ReadDisputeAttestationConfigParams): Promise<DisputeAttestationConfig> {\n const manifest = manifestForEnvironment(environment);\n if (manifest.chainId !== chainId) {\n throw new Error(\n `Dispute attestation is unavailable for chainId=${chainId}, env=${environment}`,\n );\n }\n\n const asOfBlock = await publicClient.getBlockNumber();\n const attestationVerifier = manifest.runtimeIdentities.MultiAttestationVerifier.address;\n const [rawRequiredSignatures, rawTrustedSigners] = (await publicClient.multicall({\n allowFailure: false,\n blockNumber: asOfBlock,\n contracts: [\n {\n address: attestationVerifier,\n abi: MultiAttestationVerifier,\n functionName: 'requiredSignatures',\n },\n {\n address: attestationVerifier,\n abi: MultiAttestationVerifier,\n functionName: 'witnesses',\n },\n ],\n })) as readonly unknown[];\n\n const requiredSignatures =\n typeof rawRequiredSignatures === 'bigint' ? Number(rawRequiredSignatures) : Number.NaN;\n if (!Number.isSafeInteger(requiredSignatures) || requiredSignatures < 1) {\n throw new Error('Dispute attestation verifier has an invalid signature threshold');\n }\n const trustedSigners = normalizeAddressSet(\n 'MultiAttestationVerifier.witnesses',\n rawTrustedSigners,\n ) as Address[];\n if (trustedSigners.length < requiredSignatures) {\n throw new Error('Dispute attestation verifier has fewer witnesses than required signatures');\n }\n\n return {\n asOfBlock,\n chainId: manifest.chainId,\n policyAddress: manifest.runtimeIdentities.DisputeProtectionPolicy.address,\n verifierAddress: manifest.runtimeIdentities.DisputeVerifier.address,\n trustedSigners,\n requiredSignatures,\n };\n}\n\nfunction validatePackagedIdentity(config: ReaderConfig): string | null {\n const { buildMetadata, chainId, contractsPackageVersion, manifest } = config;\n if (!buildMetadata.source.distributable) return 'SDK build metadata is not distributable';\n if (\n buildMetadata.source.kind !== 'github' ||\n buildMetadata.source.repository !== 'zkp2p/zkp2p-clients' ||\n !/^[0-9a-f]{40}$/.test(buildMetadata.source.commitSha)\n ) {\n return 'SDK build source identity is invalid';\n }\n if (buildMetadata.contractsPackageVersion !== contractsPackageVersion) {\n return 'contracts package version does not match SDK build metadata';\n }\n if (\n manifest.schemaVersion !== 2 ||\n manifest.chainId !== chainId ||\n (manifest.network !== 'base' && manifest.network !== 'base_staging')\n ) {\n return 'dispute readiness manifest chain identity mismatch';\n }\n const selected =\n manifest.network === 'base'\n ? buildMetadata.activeDisputeStack.base\n : buildMetadata.activeDisputeStack.baseStaging;\n if (\n selected.version !== manifest.activeDisputeStack.version ||\n selected.selectionHash !== manifest.activeDisputeStack.selectionHash\n ) {\n return 'active dispute manifest selection does not match SDK build metadata';\n }\n return null;\n}\n\nfunction knownResult(\n state: InactiveReadinessState,\n readyForDisputeProtection: false,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean | null,\n): KnownReadinessResult;\nfunction knownResult(\n state: 'active_successor_verified',\n readyForDisputeProtection: boolean,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean,\n): KnownReadinessResult;\nfunction knownResult(\n state: InactiveReadinessState | 'active_successor_verified',\n readyForDisputeProtection: boolean,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean | null,\n): KnownReadinessResult {\n return {\n state,\n readyForDisputeProtection,\n asOfBlock: blockNumber,\n manifestNetwork: config.manifest.network,\n manifestSelectionHash: config.manifest.activeDisputeStack.selectionHash,\n contractsPackageVersion: config.contractsPackageVersion,\n activeLifecycleHook: lifecycleHook,\n orchestratorPaused: paused,\n allowMultipleIntents,\n policyAdmissionsPaused,\n } as KnownReadinessResult;\n}\n\n/**\n * Block-pinned, fail-closed proof of the packaged dispute-protection deployment.\n * This class is exported for deterministic integration tests; applications use\n * `Zkp2pClient.getDisputeProtectionReadiness()`.\n */\nexport class DisputeProtectionReadinessReader {\n constructor(private readonly config: ReaderConfig) {}\n\n private async verifyRuntimeIdentities(\n names: RuntimeIdentityName[],\n blockNumber: bigint,\n ): Promise<void> {\n await Promise.all(\n names.map(async (name) => {\n const identity = this.config.manifest.runtimeIdentities[name];\n const bytecode = await this.config.publicClient.getBytecode({\n address: identity.address,\n blockNumber,\n });\n if (!bytecode || bytecode === '0x') {\n throw new ReadinessMismatch(`${name} runtime bytecode unavailable`);\n }\n if (keccak256(bytecode).toLowerCase() !== identity.runtimeCodeHash.toLowerCase()) {\n throw new ReadinessMismatch(`${name} runtime code hash mismatch`);\n }\n }),\n );\n }\n\n private async readOrchestrator(blockNumber: bigint): Promise<{\n lifecycleHook: Address;\n paused: boolean;\n allowMultipleIntents: boolean;\n }> {\n const { manifest, publicClient } = this.config;\n const orchestrator = manifest.runtimeIdentities.OrchestratorV3.address;\n const result = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [\n { address: orchestrator, abi: OrchestratorV3, functionName: 'lifecycleHook' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'paused' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'allowMultipleIntents' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'chainId' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'escrowRegistry' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'paymentVerifierRegistry' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'relayerRegistry' },\n ],\n })) as readonly unknown[];\n const lifecycleHook = result[0];\n if (typeof lifecycleHook !== 'string') {\n throw new ReadinessMismatch('OrchestratorV3.lifecycleHook is not an address');\n }\n expectBigInt('OrchestratorV3.chainId', result[3], BigInt(manifest.chainId));\n expectAddress(\n 'OrchestratorV3.escrowRegistry',\n result[4],\n manifest.expectedRelations.orchestratorEscrowRegistry,\n );\n expectAddress(\n 'OrchestratorV3.paymentVerifierRegistry',\n result[5],\n manifest.expectedRelations.orchestratorPaymentVerifierRegistry,\n );\n expectAddress(\n 'OrchestratorV3.relayerRegistry',\n result[6],\n manifest.expectedRelations.orchestratorRelayerRegistry,\n );\n if (typeof result[1] !== 'boolean' || typeof result[2] !== 'boolean') {\n throw new ReadinessMismatch('OrchestratorV3 readiness flags are malformed');\n }\n return {\n lifecycleHook: lifecycleHook.toLowerCase() as Address,\n paused: result[1],\n allowMultipleIntents: result[2],\n };\n }\n\n private async verifyGovernance(blockNumber: bigint): Promise<void> {\n const { manifest, publicClient } = this.config;\n const governance = manifest.expectedGovernance;\n const ownerContracts = governance.governedRuntimeIdentities.map((name) => ({\n address: manifest.runtimeIdentities[name].address,\n abi: GOVERNANCE_ABIS[name],\n functionName: 'owner',\n }));\n const pendingOwnerContracts = governance.twoStepGovernedRuntimeIdentities.map((name) => ({\n address: manifest.runtimeIdentities[name].address,\n abi: GOVERNANCE_ABIS[name],\n functionName: 'pendingOwner',\n }));\n const results = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [...ownerContracts, ...pendingOwnerContracts] as never,\n })) as readonly unknown[];\n\n governance.governedRuntimeIdentities.forEach((name, index) => {\n expectAddress(`${name}.owner`, results[index], governance.owner);\n });\n governance.twoStepGovernedRuntimeIdentities.forEach((name, index) => {\n expectAddress(\n `${name}.pendingOwner`,\n results[ownerContracts.length + index],\n governance.pendingOwner,\n );\n });\n }\n\n private async verifyAttestationTrust(blockNumber: bigint): Promise<void> {\n const { manifest, publicClient } = this.config;\n const verifier = manifest.runtimeIdentities.MultiAttestationVerifier.address;\n const results = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [\n {\n address: verifier,\n abi: MultiAttestationVerifier,\n functionName: 'requiredSignatures',\n },\n { address: verifier, abi: MultiAttestationVerifier, functionName: 'witnesses' },\n ],\n })) as readonly unknown[];\n expectBigInt(\n 'MultiAttestationVerifier.requiredSignatures',\n results[0],\n BigInt(manifest.attestationTrust.requiredSignatures),\n );\n expectAddressSet(\n 'MultiAttestationVerifier.witnesses',\n results[1],\n manifest.attestationTrust.witnesses,\n );\n }\n\n private async readAuthorizationEvents(params: {\n address: Address;\n events: readonly AbiEvent[];\n fromBlock: bigint;\n toBlock: bigint;\n }): Promise<AuthorizationEvent[]> {\n if (params.fromBlock > params.toBlock) {\n throw new ReadinessMismatch('authorization event range is invalid');\n }\n let logs: AuthorizationEvent[];\n try {\n logs = await this.readAuthorizationEventRange(params, params.fromBlock, params.toBlock);\n } catch (cause: unknown) {\n if (!isLogRangeLimitError(cause)) throw cause;\n const ranges = fallbackBlockRanges(params.fromBlock, params.toBlock);\n const batches: AuthorizationEvent[][] = [];\n for (let index = 0; index < ranges.length; index += LOG_QUERY_CONCURRENCY) {\n const batch = await Promise.all(\n ranges\n .slice(index, index + LOG_QUERY_CONCURRENCY)\n .map(([fromBlock, toBlock]) =>\n this.readAuthorizationEventRange(params, fromBlock, toBlock),\n ),\n );\n batches.push(...batch);\n }\n logs = batches.flat();\n }\n return logs;\n }\n\n private async readAuthorizationEventRange(\n params: {\n address: Address;\n events: readonly AbiEvent[];\n },\n fromBlock: bigint,\n toBlock: bigint,\n ): Promise<AuthorizationEvent[]> {\n const logs = await this.config.publicClient.getLogs({\n address: params.address,\n events: params.events,\n fromBlock,\n toBlock,\n strict: true,\n });\n return logs.map((event) => ({\n eventName: event.eventName,\n blockNumber: event.blockNumber,\n transactionIndex: event.transactionIndex,\n logIndex: event.logIndex,\n args: event.args as Record<string, unknown>,\n }));\n }\n\n private async verifyExactAuthorizationSets(\n blockNumber: bigint,\n successorActive: boolean,\n ): Promise<void> {\n const { manifest, publicClient } = this.config;\n const identities = manifest.runtimeIdentities;\n const authorizations = manifest.exactAuthorizationSets;\n const [orchestratorEvents, lifecycleHookEvents, writers] = await Promise.all([\n this.readAuthorizationEvents({\n address: identities.OrchestratorRegistry.address,\n events: ORCHESTRATOR_AUTHORIZATION_EVENTS,\n fromBlock: BigInt(authorizations.orchestratorAuthorizationFromBlock),\n toBlock: blockNumber,\n }),\n this.readAuthorizationEvents({\n address: identities.DisputeProtectionPolicy.address,\n events: LIFECYCLE_HOOK_AUTHORIZATION_EVENTS,\n fromBlock: BigInt(authorizations.lifecycleHookAuthorizationFromBlock),\n toBlock: blockNumber,\n }),\n publicClient.readContract({\n address: identities.DisputeNullifierRegistry.address,\n abi: DisputeNullifierRegistry,\n functionName: 'getWriters',\n blockNumber,\n }),\n ]);\n const orchestratorAuthorizationEvents = orchestratorEvents.map((event) => {\n if (event.eventName !== 'OrchestratorAdded' && event.eventName !== 'OrchestratorRemoved') {\n throw new ReadinessMismatch('OrchestratorRegistry authorization event is malformed');\n }\n return {\n ...event,\n args: {\n orchestrator: event.args?.orchestrator,\n enabled: event.eventName === 'OrchestratorAdded',\n },\n };\n });\n const orchestrators = replayAddressAuthorizations(\n 'OrchestratorRegistry authorization',\n orchestratorAuthorizationEvents,\n 'orchestrator',\n );\n const lifecycleHooks = replayAddressAuthorizations(\n 'DisputeProtectionPolicy lifecycle authorization',\n lifecycleHookEvents,\n 'hook',\n 'isAuthorized',\n );\n\n expectAddressSubsetWithRequired(\n 'OrchestratorRegistry authorized orchestrators',\n orchestrators,\n authorizations.authorizedOrchestrators,\n this.config.manifest.runtimeIdentities.OrchestratorV3.address,\n );\n expectAddressSet(\n 'DisputeProtectionPolicy authorized lifecycle hooks',\n lifecycleHooks,\n authorizations.authorizedLifecycleHooks,\n );\n expectAddressSet(\n 'DisputeNullifierRegistry writers',\n writers,\n successorActive\n ? authorizations.activeDisputeNullifierWriters\n : authorizations.passiveDisputeNullifierWriters,\n );\n }\n\n private async verifySuccessorState(\n blockNumber: bigint,\n successorActive: boolean,\n ): Promise<boolean> {\n const { manifest, publicClient } = this.config;\n const identities = manifest.runtimeIdentities;\n const relations = manifest.expectedRelations;\n const prerequisite = manifest.prerequisites;\n const policy = identities.DisputeProtectionPolicy.address;\n const riskWindows = Object.entries(manifest.riskWindowSecondsByPaymentMethod).sort(\n ([left], [right]) => left.localeCompare(right),\n );\n const sentinelPaymentMethod = riskWindows[0]?.[0] as `0x${string}` | undefined;\n if (!sentinelPaymentMethod) {\n throw new ReadinessMismatch('DisputeProtectionPolicy sentinel payment method is missing');\n }\n const contracts = [\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'orchestratorRegistry',\n },\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'whitelistPolicy',\n },\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'disputeProtectionPolicy',\n },\n {\n address: identities.OrchestratorRegistry.address,\n abi: OrchestratorRegistry,\n functionName: 'isOrchestrator',\n args: [relations.registeredOrchestrator],\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'groupRegistry',\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'escrowRegistry',\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'orchestratorRegistry',\n },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'stakeVault' },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'disputeVerifier' },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'disputeNullifierRegistry',\n },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'isLifecycleHookAuthorized',\n args: [relations.authorizedLifecycleHook],\n },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'admissionsPaused' },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'PENDING_COVERAGE_MATURITY',\n },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'isDisputeProtectionEnabled',\n args: [\n manifest.sentinel.escrow,\n BigInt(manifest.sentinel.depositId),\n sentinelPaymentMethod,\n ],\n },\n ...riskWindows.map(([paymentMethod]) => ({\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'getRiskWindow',\n args: [paymentMethod as `0x${string}`],\n })),\n {\n address: identities.DisputeVerifier.address,\n abi: DisputeVerifier,\n functionName: 'nullifierRegistry',\n },\n {\n address: identities.DisputeVerifier.address,\n abi: DisputeVerifier,\n functionName: 'attestationVerifier',\n },\n { address: identities.StakeVault.address, abi: StakeVault, functionName: 'controller' },\n { address: identities.StakeVault.address, abi: StakeVault, functionName: 'stakeToken' },\n {\n address: identities.StakeVault.address,\n abi: StakeVault,\n functionName: 'pendingController',\n },\n {\n address: identities.StakeVault.address,\n abi: StakeVault,\n functionName: 'pendingControllerValidAt',\n },\n ] as const;\n const result = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n // The dynamic risk-window suffix prevents viem from inferring one fixed\n // ABI tuple, while every entry remains assembled from packaged ABIs.\n contracts: contracts as never,\n })) as readonly unknown[];\n\n expectAddress(\n 'IntentLifecycleHookV1.orchestratorRegistry',\n result[0],\n relations.hookOrchestratorRegistry,\n );\n expectAddress(\n 'IntentLifecycleHookV1.whitelistPolicy',\n result[1],\n relations.hookWhitelistPolicy,\n );\n expectAddress(\n 'IntentLifecycleHookV1.disputeProtectionPolicy',\n result[2],\n relations.hookDisputeProtectionPolicy,\n );\n expectBoolean(\n 'OrchestratorRegistry.isOrchestrator',\n result[3],\n prerequisite.orchestratorRegistered,\n );\n expectAddress('WhitelistPolicy.groupRegistry', result[4], relations.whitelistGroupRegistry);\n expectAddress('WhitelistPolicy.escrowRegistry', result[5], relations.whitelistEscrowRegistry);\n expectAddress(\n 'WhitelistPolicy.orchestratorRegistry',\n result[6],\n relations.whitelistOrchestratorRegistry,\n );\n expectAddress('DisputeProtectionPolicy.stakeVault', result[7], relations.policyStakeVault);\n expectAddress(\n 'DisputeProtectionPolicy.disputeVerifier',\n result[8],\n relations.policyDisputeVerifier,\n );\n expectAddress(\n 'DisputeProtectionPolicy.disputeNullifierRegistry',\n result[9],\n relations.policyDisputeNullifierRegistry,\n );\n expectBoolean(\n 'DisputeProtectionPolicy.isLifecycleHookAuthorized',\n result[10],\n prerequisite.lifecycleHookAuthorized,\n );\n if (typeof result[11] !== 'boolean') {\n throw new ReadinessMismatch('DisputeProtectionPolicy.admissionsPaused is malformed');\n }\n const policyAdmissionsPaused = result[11];\n expectBigInt(\n 'DisputeProtectionPolicy.PENDING_COVERAGE_MATURITY',\n result[12],\n BigInt(prerequisite.pendingCoverageMaturity),\n );\n expectBoolean('DisputeProtectionPolicy.sentinel', result[13], manifest.sentinel.expected);\n\n let index = 14;\n for (const [paymentMethod, seconds] of riskWindows) {\n expectBigInt(\n `DisputeProtectionPolicy.getRiskWindow(${paymentMethod})`,\n result[index],\n BigInt(seconds),\n );\n index += 1;\n }\n expectAddress(\n 'DisputeVerifier.nullifierRegistry',\n result[index++],\n relations.disputeVerifierNullifierRegistry,\n );\n expectAddress(\n 'DisputeVerifier.attestationVerifier',\n result[index++],\n relations.disputeVerifierAttestationVerifier,\n );\n expectAddress('StakeVault.controller', result[index++], relations.vaultController);\n expectAddress('StakeVault.stakeToken', result[index++], relations.vaultStakeToken);\n expectAddress('StakeVault.pendingController', result[index++], zeroAddress);\n expectBigInt('StakeVault.pendingControllerValidAt', result[index], 0n);\n await this.verifyGovernance(blockNumber);\n await this.verifyAttestationTrust(blockNumber);\n await this.verifyExactAuthorizationSets(blockNumber, successorActive);\n return policyAdmissionsPaused;\n }\n\n async read(\n options: DisputeProtectionReadinessOptions = {},\n ): Promise<DisputeProtectionReadinessResult> {\n const packageMismatch = validatePackagedIdentity(this.config);\n if (packageMismatch) {\n return {\n state: 'mismatch',\n readyForDisputeProtection: false,\n asOfBlock: null,\n reason: packageMismatch,\n };\n }\n\n let blockNumber: bigint | null = null;\n try {\n blockNumber = await this.config.publicClient.getBlockNumber();\n await this.verifyRuntimeIdentities(['OrchestratorV3'], blockNumber);\n const orchestrator = await this.readOrchestrator(blockNumber);\n const hook = orchestrator.lifecycleHook;\n const identities = this.config.manifest.runtimeIdentities;\n\n if (sameAddress(hook, zeroAddress)) {\n return knownResult(\n 'verified_no_hook',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n null,\n );\n }\n\n if (sameAddress(hook, identities.RecognizedPredecessorHook.address)) {\n await this.verifyRuntimeIdentities(\n ['RecognizedPredecessorHook', 'RecognizedPredecessorPolicy'],\n blockNumber,\n );\n if (!options.verifyPassiveSuccessor) {\n return knownResult(\n 'recognized_predecessor',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n null,\n );\n }\n await this.verifyRuntimeIdentities(SUCCESSOR_RUNTIME_IDENTITIES, blockNumber);\n const policyAdmissionsPaused = await this.verifySuccessorState(blockNumber, false);\n return knownResult(\n 'passive_successor',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n policyAdmissionsPaused,\n );\n }\n\n if (!sameAddress(hook, identities.IntentLifecycleHookV1.address)) {\n throw new ReadinessMismatch('OrchestratorV3.lifecycleHook is not a recognized deployment');\n }\n await this.verifyRuntimeIdentities(SUCCESSOR_RUNTIME_IDENTITIES, blockNumber);\n const policyAdmissionsPaused = await this.verifySuccessorState(blockNumber, true);\n const readyForDisputeProtection =\n orchestrator.paused === this.config.manifest.prerequisites.orchestratorPaused &&\n orchestrator.allowMultipleIntents ===\n this.config.manifest.prerequisites.allowMultipleIntents &&\n policyAdmissionsPaused === this.config.manifest.prerequisites.admissionsPaused;\n return knownResult(\n 'active_successor_verified',\n readyForDisputeProtection,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n policyAdmissionsPaused,\n );\n } catch (error) {\n return {\n state: 'mismatch',\n readyForDisputeProtection: false,\n asOfBlock: blockNumber,\n reason:\n error instanceof ReadinessMismatch\n ? error.message\n : `dispute readiness RPC failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\nexport function createDisputeProtectionReadinessReader(params: {\n publicClient: PublicClient;\n chainId: number;\n environment: RuntimeEnv;\n}): DisputeProtectionReadinessReader {\n return new DisputeProtectionReadinessReader({\n publicClient: params.publicClient,\n chainId: params.chainId,\n manifest: manifestForEnvironment(params.environment),\n buildMetadata: SDK_BUILD_METADATA,\n contractsPackageVersion: installedContractsPackageVersion,\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 { Hash } from 'viem';\n\nimport { apiPostDepositDetails, apiUploadSellerCredential } from './adapters/api';\nimport type {\n CuratorSellerCredentialUploadResponse,\n PostDepositDetailsRequest,\n UploadSellerCredentialBundleParams,\n} from './types';\nimport { DEFAULT_BASE_API_URL } from './utils/constants';\n\nfunction normalizeBaseApiUrl(value: string | null | undefined): string {\n return (value?.trim().replace(/\\/+$/u, '') || DEFAULT_BASE_API_URL).replace(/\\/v1$/u, '');\n}\n\nfunction assertBundlePlatformMatches(params: UploadSellerCredentialBundleParams): void {\n if (params.bundle.platform.toLowerCase() !== params.platform) {\n throw new Error('Seller credential bundle platform does not match upload platform');\n }\n}\n\n/**\n * Store an already-encrypted seller credential bundle with curator.\n */\nexport async function apiUploadSellerCredentialBundle(\n params: UploadSellerCredentialBundleParams,\n baseApiUrl?: string | null,\n timeoutMs?: number,\n authorizationToken?: string,\n): Promise<CuratorSellerCredentialUploadResponse> {\n assertBundlePlatformMatches(params);\n\n const normalizedBaseApiUrl = normalizeBaseApiUrl(baseApiUrl);\n\n if (params.platform === 'wise') {\n return apiUploadSellerCredential(\n params.platform,\n params.bundle.payeeIdHash,\n params.bundle,\n normalizedBaseApiUrl,\n timeoutMs,\n authorizationToken,\n );\n }\n\n const registeredPayeePayload: PostDepositDetailsRequest = {\n offchainId: params.offchainId,\n processorName: params.platform,\n };\n if (params.telegramUsername !== undefined) {\n registeredPayeePayload.telegramUsername = params.telegramUsername;\n }\n if (params.metadata !== undefined) {\n registeredPayeePayload.metadata = params.metadata;\n }\n\n const registeredPayeeResponse = await apiPostDepositDetails(\n registeredPayeePayload,\n normalizedBaseApiUrl,\n timeoutMs,\n );\n\n if (!registeredPayeeResponse.success || !registeredPayeeResponse.responseObject) {\n throw new Error(registeredPayeeResponse.message || 'Failed to register seller payee details');\n }\n\n const registeredPayee = registeredPayeeResponse.responseObject;\n if (registeredPayee.hashedOnchainId.toLowerCase() !== params.bundle.payeeIdHash.toLowerCase()) {\n throw new Error('Seller credential payee hash does not match registered payee details');\n }\n\n return apiUploadSellerCredential(\n params.platform,\n registeredPayee.hashedOnchainId as Hash,\n params.bundle,\n normalizedBaseApiUrl,\n timeoutMs,\n authorizationToken,\n );\n}\n","import { formatUnits } from 'viem';\n\nimport type {\n BestByPlatformResponse,\n GetBestByPlatformResponse,\n GetPlatformQuote,\n GetQuoteResponse,\n GetQuoteSingleResponse,\n QuoteResponse,\n ReferrerFeeConfig,\n} from '../types';\n\ntype QuoteWithReferrerFeeFields = QuoteResponse['responseObject']['quotes'][number] & {\n referrerFeeAmount?: string | null;\n referrerFeeAmountFormatted?: string | null;\n referrerFeeBps?: number | null;\n};\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 options: {\n signalIntentAmount?: string | null;\n } = {},\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 backendNetAmount = BigInt(tokenAmount);\n const grossAmount = BigInt(options.signalIntentAmount ?? tokenAmount);\n const feeAmount = (grossAmount * BigInt(referrerFeeConfig.feeBps)) / 10000n;\n const netAmount = feeAmount >= backendNetAmount ? 0n : backendNetAmount - 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 enrichedQuote = quote as QuoteWithReferrerFeeFields;\n const hasCuratorReferrerFeeFields =\n enrichedQuote.referrerFeeAmount != null ||\n enrichedQuote.referrerFeeBps != null ||\n quote.takerReferralFeeAmount != null ||\n quote.takerReferralFeeBps != null;\n\n if (hasCuratorReferrerFeeFields) {\n return {\n ...enrichedQuote,\n referrerFeeAmount: enrichedQuote.referrerFeeAmount ?? quote.takerReferralFeeAmount,\n referrerFeeAmountFormatted:\n enrichedQuote.referrerFeeAmountFormatted ?? quote.takerReferralFeeAmountFormatted,\n referrerFeeBps: enrichedQuote.referrerFeeBps ?? quote.takerReferralFeeBps,\n } as GetQuoteSingleResponse;\n }\n\n const signalIntentAmount = quote.signalIntentAmount ?? quote.intent?.amount ?? quote.tokenAmount;\n const adjusted = applyReferrerFeeDisplayFieldsToTokenAmount(\n quote.tokenAmount,\n referrerFeeConfig,\n decimals,\n { signalIntentAmount },\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\nexport const appendReferrerFeeDisplayFieldsToBestByPlatform = (\n quoteResponse: BestByPlatformResponse,\n referrerFeeConfig: ReferrerFeeConfig | undefined,\n): GetBestByPlatformResponse => {\n if (!referrerFeeConfig) {\n return quoteResponse as GetBestByPlatformResponse;\n }\n\n const decimals = quoteResponse.responseObject?.token?.decimals ?? 6;\n const enrichedPlatformQuotes: GetPlatformQuote[] = (\n quoteResponse.responseObject?.platformQuotes ?? []\n ).map((platformQuote) => ({\n ...platformQuote,\n bestQuote:\n platformQuote.available && platformQuote.bestQuote\n ? applyReferrerFeeDisplayFieldsToQuote(platformQuote.bestQuote, referrerFeeConfig, decimals)\n : platformQuote.bestQuote,\n }));\n\n return {\n ...quoteResponse,\n responseObject: {\n ...quoteResponse.responseObject,\n platformQuotes: enrichedPlatformQuotes,\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","import type { Address, Chain, Hash, Hex, PublicClient, Transport, 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 { ReferralAccountOperations } from './ReferralAccountOperations';\nimport type {\n RedeemReferralCodeSignatureOptions as RedeemReferralCodeSignatureOptionsImpl,\n ReferralBearerWriteOptions as ReferralBearerWriteOptionsImpl,\n ReferralReadOptions as ReferralReadOptionsImpl,\n ReferralSignatureOptions as ReferralSignatureOptionsImpl,\n UpdateReferralCodeSignatureOptions as UpdateReferralCodeSignatureOptionsImpl,\n} from './ReferralAccountOperations';\nimport { VaultOperations } from './VaultOperations';\nimport { AccessPolicyOperations } from './AccessPolicyOperations';\nimport {\n IntentGuardianOperations,\n type IntentGuardianPolicy,\n type IntentGuardianQuote,\n type IntentGuardianWriteParams,\n} from './IntentGuardianOperations';\nimport {\n StakeOperations,\n type StakeVaultState,\n type StakeVaultWriteParams,\n} from './StakeOperations';\nimport {\n isValidHexAddress,\n normalizeAddress,\n normalizeCurrencyTuples,\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 {\n IndexerStakingService,\n type DisputeProtectionIntentPage,\n type DisputeProtectionIntentPageParams,\n type IndexedPage,\n type IndexedStakeActivity,\n type IndexedStakeLock,\n type IndexedStakingState,\n type IndexedStakingStateParams,\n type IndexedTakerStakeAuthorization,\n type StakeActivityPageParams,\n type StakeLockPageParams,\n type TakerStakeAuthorizationPageParams,\n} from '../indexer/stakingService';\nimport {\n createDisputeProtectionReadinessReader,\n type DisputeProtectionReadinessOptions,\n type DisputeProtectionReadinessResult,\n type DisputeProtectionReadinessReader,\n} from './DisputeProtectionReadiness';\nimport type {\n DepositEntity,\n DepositWithRelations,\n IntentEntity,\n IntentStatus,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n MakerProfitSnapshotEntity,\n} from '../indexer/types';\nimport {\n fetchFulfillmentAndPayment,\n type FulfillmentAndPaymentResponse,\n} from '../indexer/intentVerification';\nimport { getContracts, getRateManagerContracts, type RuntimeEnv } from '../contracts';\nimport {\n apiGetSellerCredentialStatus,\n apiGetQuote,\n apiGetQuotesBestByPlatform,\n apiPostDepositDetails,\n apiUploadGoogleOAuthSellerCredential,\n apiVerifySellerPayment,\n} from '../adapters/api';\nimport { apiCreateSellerCredentialBundle } from '../adapters/attestation';\nimport { apiUploadSellerCredentialBundle } from '../sellerCredentials';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { METHOD_NAME_TO_HASH, matchesQuotePaymentMethod } from '../utils/paymentMethodHashes';\nimport { ZERO_ADDRESS } from '../utils/address';\nimport { DEFAULT_BASE_API_URL } from '../utils/constants';\nimport type { UICurrencyRate } from '../utils/currency';\nimport { currencyKeccak256 } from '../utils/currencyKeccak256';\nimport {\n appendReferrerFeeDisplayFields,\n appendReferrerFeeDisplayFieldsToBestByPlatform,\n} from '../utils/referrerFeeDisplay';\nimport { assertValidReferrerFeeConfig } from '../referrerFeeConfig';\nimport { ValidationError } from '../errors';\nimport type {\n BestByPlatformResponse,\n CreateReferralCodeResponse,\n CuratorMetadata,\n CuratorPayeeData,\n CuratorPayeeDataInput,\n CuratorSellerCredentialStatusResponse,\n CuratorSellerCredentialUploadResponse,\n CuratorSellerVerifyResponse,\n FulfillIntentAttestationResponse,\n GetSellerCredentialStatusParams,\n GetBestByPlatformResponse,\n IdentityAttestationOutput,\n QuoteRequest,\n QuoteSingleResponse,\n QuotesBestByPlatformRequest,\n GetQuoteResponse,\n PostDepositDetailsRequest,\n RedeemReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n SellerCredentialUploadInput,\n OnchainCurrency,\n UpdateReferralCodeResponse,\n UploadSellerCredentialParams,\n UploadSellerCredentialBundleParams,\n UploadSellerCredentialOptions,\n UploadGoogleOAuthSellerCredentialParams,\n VerifySellerPaymentParams,\n ReferrerFeeConfig,\n BuyerTeePaymentProofInput,\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\ntype PayeeBoundSellerCredentialUploadInput = Extract<\n SellerCredentialUploadInput,\n { payeeId: string }\n>;\n\nexport type RedeemReferralCodeSignatureOptions = RedeemReferralCodeSignatureOptionsImpl;\nexport type ReferralBearerWriteOptions = ReferralBearerWriteOptionsImpl;\nexport type ReferralReadOptions = ReferralReadOptionsImpl;\nexport type ReferralSignatureOptions = ReferralSignatureOptionsImpl;\nexport type UpdateReferralCodeSignatureOptions = UpdateReferralCodeSignatureOptionsImpl;\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n return true;\n}\n\nfunction normalizeTelegramUsername(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction extractLegacyQuotePayeeData(depositData: unknown): CuratorPayeeData | undefined {\n if (!depositData || typeof depositData !== 'object' || Array.isArray(depositData)) {\n return undefined;\n }\n\n const stringEntries = Object.entries(depositData).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === 'string' && entry[1].trim().length > 0,\n );\n const telegramUsername = stringEntries.find(([key]) => key === 'telegramUsername')?.[1] ?? null;\n const identifierEntries = stringEntries.filter(([key]) => key !== 'telegramUsername');\n const [primaryEntry, ...metadataEntries] = identifierEntries;\n if (!primaryEntry) {\n return undefined;\n }\n\n return {\n offchainId: primaryEntry[1],\n telegramUsername,\n metadata: metadataEntries.length > 0 ? Object.fromEntries(metadataEntries) : null,\n };\n}\n\nfunction normalizeQuotePayeeData(\n maker:\n | {\n offchainId?: unknown;\n telegramUsername?: unknown;\n metadata?: unknown;\n depositData?: unknown;\n }\n | null\n | undefined,\n): CuratorPayeeData | undefined {\n const legacy = extractLegacyQuotePayeeData(maker?.depositData);\n const offchainId =\n typeof maker?.offchainId === 'string' && maker.offchainId.trim().length > 0\n ? maker.offchainId\n : legacy?.offchainId;\n\n if (!offchainId) {\n return undefined;\n }\n\n return {\n offchainId,\n telegramUsername:\n normalizeTelegramUsername(maker?.telegramUsername) ?? legacy?.telegramUsername ?? null,\n metadata: isObjectRecord(maker?.metadata) ? maker.metadata : (legacy?.metadata ?? null),\n };\n}\n\nfunction isActiveQuotePaymentMethod(quote: QuoteSingleResponse): boolean {\n if (\n !quote?.intent ||\n typeof quote.intent.processorName !== 'string' ||\n typeof quote.paymentMethod !== 'string'\n ) {\n return false;\n }\n return matchesQuotePaymentMethod(quote.intent.processorName, quote.paymentMethod);\n}\n\n/**\n * Normalizes a single payee-data entry, accepting both the current flat shape\n * ({ offchainId, telegramUsername?, metadata? }) and legacy blob shapes like\n * { email: 'x@y.z' } or { wisetag: 'foo' } that callers may still pass via\n * the deprecated `depositData` alias. Legacy shapes are coerced by extracting\n * the first non-empty string field (excluding telegramUsername) as the\n * offchainId and treating the remaining string fields as metadata.\n */\nfunction normalizePayeeDataInputItem(raw: unknown): CuratorPayeeDataInput | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return null;\n }\n\n const candidate = raw as CuratorPayeeDataInput & Record<string, unknown>;\n\n // Fast path: already in the modern flat shape — pass through unchanged.\n if (typeof candidate.offchainId === 'string' && candidate.offchainId.trim().length > 0) {\n return candidate;\n }\n\n // Fall back to legacy deposit-data blob extraction (e.g. { email: '...' }\n // or { wisetag: '...' }) for deprecated callers using `depositData`.\n const legacy = extractLegacyQuotePayeeData(raw);\n if (!legacy) {\n return null;\n }\n\n const metadata = legacy.metadata && isObjectRecord(legacy.metadata) ? { ...legacy.metadata } : {};\n if (candidate.identityAttestation !== undefined && candidate.identityAttestation !== null) {\n metadata.identityAttestation = candidate.identityAttestation;\n }\n\n return {\n offchainId: legacy.offchainId,\n telegramUsername: legacy.telegramUsername,\n metadata: Object.keys(metadata).length > 0 ? metadata : null,\n };\n}\n\nfunction getPayeeRegistrationMetadata(\n payeeData: CuratorPayeeDataInput,\n): CuratorMetadata | null | undefined {\n if (payeeData.identityAttestation === undefined || payeeData.identityAttestation === null) {\n return payeeData.metadata;\n }\n\n return {\n ...(isObjectRecord(payeeData.metadata) ? payeeData.metadata : {}),\n identityAttestation: payeeData.identityAttestation as IdentityAttestationOutput,\n };\n}\n\nfunction resolvePayeeDataInput(\n params: { payeeData?: unknown; depositData?: unknown },\n methodName: string,\n): CuratorPayeeDataInput[] {\n const payeeData = params.payeeData ?? params.depositData;\n if (!Array.isArray(payeeData)) {\n throw new Error(`${methodName} requires payeeData`);\n }\n const normalized = payeeData.map((item, index) => {\n const result = normalizePayeeDataInputItem(item);\n if (!result) {\n throw new Error(\n `${methodName}: payeeData[${index}] must include a non-empty offchainId or a recognizable legacy identifier`,\n );\n }\n return result;\n });\n return normalized;\n}\n\nfunction toPostDepositDetailsRequest(\n processorName: string,\n payeeData: CuratorPayeeDataInput | undefined,\n index: number,\n): PostDepositDetailsRequest {\n assertKnownProcessorName(processorName, `processorNames[${index}]`);\n if (!payeeData || typeof payeeData.offchainId !== 'string' || payeeData.offchainId.length === 0) {\n throw new Error(`payeeData[${index}] must include a non-empty offchainId`);\n }\n\n return {\n processorName,\n offchainId: payeeData.offchainId,\n telegramUsername: payeeData.telegramUsername,\n metadata: getPayeeRegistrationMetadata(payeeData),\n };\n}\n\nfunction assertKnownProcessorName(processorName: string, field: string): void {\n if (!METHOD_NAME_TO_HASH[processorName.toLowerCase()]) {\n throw new ValidationError(`Unknown processorName: ${processorName}`, field);\n }\n}\n\nfunction assertCatalogPaymentMethods(\n paymentMethods: readonly `0x${string}`[],\n chainId: number,\n runtimeEnv: RuntimeEnv,\n field: string,\n): void {\n const catalogHashes = new Set(\n Object.values(getPaymentMethodsCatalog(chainId, runtimeEnv)).map((entry) =>\n entry.paymentMethodHash.toLowerCase(),\n ),\n );\n\n paymentMethods.forEach((paymentMethod, index) => {\n if (!catalogHashes.has(paymentMethod.toLowerCase())) {\n throw new ValidationError(\n `Unsupported payment method hash: ${paymentMethod}`,\n `${field}[${index}]`,\n );\n }\n });\n}\n\nfunction assertCatalogCurrencies(\n paymentMethods: readonly `0x${string}`[],\n currencies: readonly (readonly OnchainCurrencyEntry[])[],\n chainId: number,\n runtimeEnv: RuntimeEnv,\n field: string,\n): void {\n const catalogByHash = new Map(\n Object.values(getPaymentMethodsCatalog(chainId, runtimeEnv)).map((entry) => [\n entry.paymentMethodHash.toLowerCase(),\n new Set(entry.currencies?.map((currency) => currency.toLowerCase()) ?? []),\n ]),\n );\n\n paymentMethods.forEach((paymentMethod, paymentMethodIndex) => {\n const allowedCurrencies = catalogByHash.get(paymentMethod.toLowerCase());\n if (!allowedCurrencies?.size) return;\n\n currencies[paymentMethodIndex]?.forEach((currency, currencyIndex) => {\n if (!allowedCurrencies.has(currency.code.toLowerCase())) {\n throw new ValidationError(\n `Unsupported currency hash ${currency.code} for payment method ${paymentMethod}`,\n `${field}[${paymentMethodIndex}][${currencyIndex}].code`,\n );\n }\n });\n });\n}\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: 'internal-curator-api-key', // Optional: internal seller verification only\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 /** Optional viem transport override for RPC reads */\n rpcTransport?: Transport;\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 /**\n * Optional internal curator API key (sent as `x-api-key`) for internal seller verification.\n * Not used by public curator endpoints such as quotes, maker reads, or intent signing.\n */\n apiKey?: string;\n /** Optional bearer token for indexer authentication and authenticated curator account APIs */\n authorizationToken?: string;\n /** Optional async token provider for indexer auth and authenticated curator account APIs */\n getAuthorizationToken?: IndexerAuthTokenProvider;\n /** Optional API key for indexer proxy authentication (sent as x-api-key header) */\n indexerApiKey?: string;\n /**\n * Extra headers sent on curator quote, orderbook, and `/v3/sign` requests.\n * Service callers use this for `x-pp-key`, which curator's `peerPayKey`\n * middleware reads to skip fee enforcement and rate limiting.\n */\n apiHeaders?: Record<string, 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 /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 /** Buyer TEE payment proof input */\n proof: BuyerTeePaymentProofInput;\n /** Allowed timestamp variance in ms (default: 300000ms) */\n timestampBufferMs?: string;\n /**\n * Alternate attestation-service origins, tried after network failures only.\n * Omit for the default Railway proxy; pass [] to disable fallback.\n */\n attestationServiceFallbackUrls?: string[];\n /** Override attestation service URL */\n attestationServiceUrl?: string;\n /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 onAttestationComplete?: (attestation: FulfillIntentAttestationResponse) => 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 = OnchainCurrency;\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 Zkp2pClient({\n * walletClient,\n * chainId: base.id,\n * });\n *\n * // Step 1: Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * payeeData: [{ offchainId: '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 * payeeData: [{ offchainId: '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', 'preproduction', 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 /** OrchestratorV3 address (if deployed) */\n readonly orchestratorV3Address?: Address;\n /** OrchestratorV3 ABI */\n readonly orchestratorV3Abi?: 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 /** AddressGroupRegistry contract address (undefined where not deployed) */\n readonly addressGroupRegistryAddress?: Address;\n /** AddressGroupRegistry ABI */\n readonly addressGroupRegistryAbi?: Abi;\n /** WhitelistPolicy contract address (undefined where not deployed) */\n readonly whitelistPolicyAddress?: Address;\n /** WhitelistPolicy ABI */\n readonly whitelistPolicyAbi?: 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 /**\n * Standalone prepaid IntentGuardian contract. Undefined where no guardian is\n * deployed, so intent extensions fail closed there.\n *\n * Not to be confused with the per-deposit `intentGuardian` parameter on\n * `createDeposit`, which is an Escrow-level intent-approval guardian.\n */\n readonly intentGuardianAddress?: Address;\n readonly intentGuardianAbi?: Abi;\n /** OrchestratorRegistry address */\n readonly orchestratorRegistryAddress?: Address;\n /** OrchestratorRegistry ABI */\n readonly orchestratorRegistryAbi?: Abi;\n /** StakeVault address (undefined when staking is not deployed) */\n readonly stakeVaultAddress?: Address;\n /** StakeVault ABI */\n readonly stakeVaultAbi?: Abi;\n /** DisputeProtectionPolicy address (undefined when the staking stack is not deployed) */\n readonly disputeProtectionPolicyAddress?: Address;\n /** DisputeProtectionPolicy ABI */\n readonly disputeProtectionPolicyAbi?: Abi;\n\n /** Base API URL for ZKP2P services */\n readonly baseApiUrl?: string;\n /** Optional internal curator API key (`x-api-key`) for internal seller verification */\n readonly apiKey?: string;\n /** Extra headers for curator quote, orderbook, and sign requests. */\n readonly apiHeaders?: Record<string, string>;\n /** Bearer token for indexer authentication and authenticated curator account APIs */\n readonly authorizationToken?: string;\n /** Optional bearer token provider for indexer and authenticated curator account APIs */\n readonly getAuthorizationToken?: IndexerAuthTokenProvider;\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 _indexerStakingService: IndexerStakingService;\n private readonly _router: ContractRouter;\n private readonly _pvReader: ProtocolViewerReader;\n private readonly _vaultOps: VaultOperations;\n private readonly _stakeOps: StakeOperations;\n private readonly _disputeProtectionReadinessReader: DisputeProtectionReadinessReader;\n private readonly _intentGuardianOps: IntentGuardianOperations;\n private readonly _intentOps: IntentOperations;\n private readonly _referralOps: ReferralAccountOperations;\n private readonly _accessPolicyOps: AccessPolicyOperations;\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.chain?.rpcUrls?.default?.http?.[0];\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, Chain> = {\n [base.id]: base,\n [hardhat.id]: hardhat,\n };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({\n chain: selectedChain,\n transport: opts.rpcTransport ?? http(rpc, { batch: false }),\n }) as unknown as PublicClient;\n this._disputeProtectionReadinessReader = createDisputeProtectionReadinessReader({\n publicClient: this.publicClient,\n chainId: this.chainId,\n environment: this.runtimeEnv,\n });\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.escrowV2 ?? addresses.escrow);\n this.escrowV2Abi = abis.escrowV2 ?? abis.escrow;\n this.orchestratorV2Address = toAddress(addresses.orchestratorV2 ?? addresses.orchestrator);\n this.orchestratorV2Abi = abis.orchestratorV2 ?? abis.orchestrator;\n this.orchestratorV3Address = toAddress(addresses.orchestratorV3);\n this.orchestratorV3Abi = abis.orchestratorV3;\n\n const configuredEscrowAddresses = (addresses.escrowAddresses ?? [])\n .map((value) => toAddress(value))\n .filter((value): value is Address => Boolean(value));\n const configuredOrchestratorAddresses = (addresses.orchestratorAddresses ?? [])\n .map((value) => toAddress(value))\n .filter((value): value is Address => Boolean(value));\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;\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 this.orchestratorV3Address,\n ...configuredOrchestratorAddresses,\n ]);\n\n this.orchestratorAddress =\n this.orchestratorV2Address ??\n toAddress(addresses.orchestrator) ??\n this.orchestratorAddresses[0];\n this.orchestratorAbi = abis.orchestrator ?? this.orchestratorV2Abi;\n\n this.unifiedPaymentVerifier = toAddress(addresses.unifiedPaymentVerifier);\n this.protocolViewerAddress = toAddress(addresses.protocolViewer);\n this.protocolViewerAbi = abis.protocolViewer;\n\n // Build the current-deployment ProtocolViewer entry set.\n const resolvedPvEntries = addresses.protocolViewerEntries;\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.rateManagerV1);\n this.rateManagerV1Abi = abis.rateManagerV1;\n this.orchestratorRegistryAddress = toAddress(addresses.orchestratorRegistry);\n this.orchestratorRegistryAbi = abis.orchestratorRegistry;\n this.addressGroupRegistryAddress = toAddress(addresses.addressGroupRegistry);\n this.addressGroupRegistryAbi = abis.addressGroupRegistry;\n this.whitelistPolicyAddress = toAddress(addresses.whitelistPolicy);\n this.whitelistPolicyAbi = abis.whitelistPolicy;\n this.rateManagerRegistryAddress =\n toAddress(addresses.rateManagerRegistry) ?? this.rateManagerV1Address;\n this.rateManagerRegistryAbi = abis.rateManagerRegistry ?? this.rateManagerV1Abi;\n this.rateManagerControllerAddress = toAddress(addresses.rateManagerController);\n this.rateManagerControllerAbi = abis.rateManagerController;\n this.intentGuardianAddress = toAddress(addresses.intentGuardian);\n this.intentGuardianAbi = abis.intentGuardian;\n this.stakeVaultAddress = toAddress(addresses.stakeVault);\n this.stakeVaultAbi = abis.stakeVault;\n this.disputeProtectionPolicyAddress = toAddress(addresses.disputeProtectionPolicy);\n this.disputeProtectionPolicyAbi = abis.disputeProtectionPolicy;\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 orchestratorV3Address: this.orchestratorV3Address,\n orchestratorV3Abi: this.orchestratorV3Abi,\n orchestratorAddresses: this.orchestratorAddresses,\n });\n\n // optional USDC convenience\n if (addresses.usdc) this._usdcAddress = addresses.usdc;\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 this._indexerStakingService = new IndexerStakingService(this._indexerClient);\n\n // http verification config\n this.baseApiUrl = opts.baseApiUrl;\n this.apiKey = opts.apiKey;\n this.apiHeaders = opts.apiHeaders;\n this.authorizationToken = opts.authorizationToken;\n this.getAuthorizationToken = opts.getAuthorizationToken;\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._stakeOps = new StakeOperations({\n getPublicClient: () => this.publicClient,\n getStakeVaultAddress: () => this.stakeVaultAddress,\n getStakeVaultAbi: () => this.stakeVaultAbi,\n getStakeTokenAddress: () => this._usdcAddress,\n getDisputeProtectionPolicyAddress: () => this.disputeProtectionPolicyAddress,\n getDisputeProtectionPolicyAbi: () => this.disputeProtectionPolicyAbi,\n });\n this._intentGuardianOps = new IntentGuardianOperations({\n getPublicClient: () => this.publicClient,\n getGuardianAddress: () => this.intentGuardianAddress,\n getGuardianAbi: () => this.intentGuardianAbi,\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 getApiHeaders: () => this.apiHeaders,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getIndexerClient: () => this._indexerClient,\n getIndexerService: () => this._indexerService,\n getEscrowV2Address: () => this.escrowV2Address,\n getOrchestratorV2Address: () => this.orchestratorV2Address,\n getOrchestratorV3Address: () => this.orchestratorV3Address,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n resolveOrchestratorContext: (options) => this.resolveOrchestratorContext(options),\n resolveEscrowAddressOrThrow: (escrowAddress, depositId, methodName) =>\n this.resolveEscrowAddressOrThrow(escrowAddress, depositId, methodName),\n prepareResolvedOrchestratorTransaction: (tx) =>\n this.prepareResolvedOrchestratorTransaction(tx),\n getFulfillIntentInputs: (intentHash, options) =>\n this.getFulfillIntentInputs(intentHash, options),\n getPvIntent: (intentHash) => this.getPvIntent(intentHash),\n },\n });\n this._accessPolicyOps = new AccessPolicyOperations({\n getPublicClient: () => this.publicClient,\n getRuntimeEnv: () => this.runtimeEnv,\n getPolicyAddress: () => this.whitelistPolicyAddress,\n getPolicyAbi: () => this.whitelistPolicyAbi,\n getRegistryAddress: () => this.addressGroupRegistryAddress,\n getRegistryAbi: () => this.addressGroupRegistryAbi,\n prepareContractTransaction: (tx) => this.prepareContractTransaction(tx),\n });\n this._referralOps = new ReferralAccountOperations({\n getWalletClient: () => this.walletClient,\n getChainId: () => this.chainId,\n getRuntimeEnv: () => this.runtimeEnv,\n getBaseApiUrl: () => this.baseApiUrl,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getAuthorizationToken: () => this.authorizationToken,\n getAuthorizationTokenProvider: () => this.getAuthorizationToken,\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 stripTrailingSlash(url: string): string {\n return url.replace(/\\/$/, '');\n }\n\n private defaultAttestationServiceForBaseApiUrl(baseApiUrl: string): string {\n try {\n const { hostname } = new URL(baseApiUrl);\n if (hostname === 'api-staging.zkp2p.xyz') {\n return 'https://attestation-service-staging.zkp2p.xyz';\n }\n // Preprod currently reuses the production attestation-service deployment.\n if (hostname === 'api-preprod.zkp2p.xyz') {\n return 'https://attestation-service.zkp2p.xyz';\n }\n if (hostname === 'api.zkp2p.xyz') {\n return 'https://attestation-service.zkp2p.xyz';\n }\n } catch {\n // Fall through to the explicit error below for unsupported custom hosts.\n }\n\n if (baseApiUrl === DEFAULT_BASE_API_URL) {\n return 'https://attestation-service.zkp2p.xyz';\n }\n\n throw new Error(\n `attestationServiceUrl is required when baseApiUrl is not a supported zkp2p API host: ${baseApiUrl}`,\n );\n }\n\n private async resolveAuthorizationToken(): Promise<string | undefined> {\n if (this.getAuthorizationToken) {\n return (await this.getAuthorizationToken()) ?? undefined;\n }\n\n return this.authorizationToken;\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: OnchainCurrencyEntry[],\n escrowAbi: Abi | undefined,\n ): Array<Record<string, unknown>> {\n return normalizeCurrencyTuples(currencies, escrowAbi);\n }\n\n supportsInlineOracleRateConfig(params?: { escrowAddress?: Address }): boolean {\n return this._vaultOps.supportsInlineOracleRateConfig({\n escrowAddress: params?.escrowAddress,\n });\n }\n\n private resolveAbiFunctionName(abi: Abi | undefined, names: string[]): string {\n return resolveAbiFunctionName(abi, names);\n }\n\n private resolveEscrowAddressOrThrow(\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n _methodName: string,\n ): Address {\n const resolved = escrowAddress ?? this.parseEscrowAddressFromCompositeDepositId(depositId);\n if (resolved) return resolved;\n return this.resolveEscrowContext().address;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig;\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 }): 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 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 ): OrchestratorContractContext | undefined {\n return this._router.resolveOrchestratorForEscrow(escrowAddress);\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 lookupIntentRoutingOnchain(intentHash: `0x${string}`): Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }> {\n const result = await this._pvReader.getPvIntentWithContext(intentHash);\n return {\n orchestratorAddress: this.normalizeAddress(result.context?.orchestrator),\n escrowAddress:\n this.normalizeAddress(result.context?.escrow) ??\n this.normalizeAddress(result.view.intent.escrow),\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 }): Promise<OrchestratorContractContext> {\n const explicit = this.getOrchestratorContextByAddress(options?.orchestratorAddress);\n if (explicit) return explicit;\n if (options?.orchestratorAddress) {\n throw new Error(`Unsupported orchestrator address: ${options.orchestratorAddress}`);\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 } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'Indexer intent routing lookup', error);\n }\n\n try {\n const routing = await this.lookupIntentRoutingOnchain(options.intentHash);\n const fromIntent = this.getOrchestratorContextByAddress(routing.orchestratorAddress);\n if (fromIntent) return fromIntent;\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'On-chain intent routing lookup', error);\n }\n }\n\n if (options?.escrowAddress) {\n const fromEscrow = this.resolveOrchestratorForEscrow(options.escrowAddress);\n if (fromEscrow) return fromEscrow;\n }\n\n if (options?.intentHash) {\n throw new Error(\n `Unable to resolve orchestrator for intent ${options.intentHash}; indexer and on-chain routing did not identify a configured orchestrator`,\n );\n }\n\n const fallback = this.resolveOrchestratorForEscrow();\n if (fallback) return fallback;\n\n throw new Error('Orchestrator not available');\n }\n\n /**\n * Spread helper for viem requests.\n * justified: TxOverrides mixes legacy gasPrice with EIP-1559 fee fields, which\n * viem's discriminated request unions reject; keep the suppression in one place.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private applyTxOverrides(overrides: Omit<TxOverrides, 'referrer'>): any {\n return overrides;\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,\n args: opts.args ?? [],\n account: this.walletClient.account!,\n ...this.applyTxOverrides(txOverrides),\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.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,\n args: prepared.args,\n account: this.walletClient.account!,\n ...this.applyTxOverrides(overrides),\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 ...this.applyTxOverrides(overrides),\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,\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,\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,\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: (params: TParams) => { 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(params);\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(params);\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 buildStakeVaultMethod<TParams extends { txOverrides?: TxOverrides }>(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n () => ({\n address: this.stakeVaultAddress,\n abi: this.stakeVaultAbi,\n label: 'StakeVault',\n }),\n functionName,\n buildArgs,\n );\n }\n\n private buildDisputeProtectionPolicyMethod<\n TParams extends { disputeProtectionPolicyAddress?: Address; txOverrides?: TxOverrides },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n (params) => ({\n address: params.disputeProtectionPolicyAddress ?? this.disputeProtectionPolicyAddress,\n abi: this.disputeProtectionPolicyAbi,\n label: 'DisputeProtectionPolicy',\n }),\n functionName,\n buildArgs,\n );\n }\n\n private buildIntentGuardianMethod<TParams extends { txOverrides?: TxOverrides }>(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n () => ({\n address: this.intentGuardianAddress,\n abi: this.intentGuardianAbi,\n label: 'IntentGuardian',\n }),\n functionName,\n buildArgs,\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 },\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 });\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 });\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 event data. Use `amount` for net USDC\n * // transferred to the taker; use getIntentFulfillmentAmounts() when you\n * // also need gross released USDC.\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 stakingService = this._indexerStakingService;\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 fulfilled intents for a vault by rate manager ID.\n */\n getIntentsByRateManager: (\n rateManagerId: string,\n statuses?: IntentStatus[],\n ): Promise<IntentEntity[]> => {\n return service.fetchIntentsByRateManager(rateManagerId, 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. `amount` is the net\n * USDC transferred to the taker after protocol/referrer fees.\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. Use\n * `takerAmountNetFees` as the buyer/taker received USDC amount.\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 maker profit snapshots for the provided deposits.\n */\n getProfitSnapshotsByDeposits: (\n depositIds: string[],\n ): Promise<MakerProfitSnapshotEntity[]> => {\n return service.fetchProfitSnapshotsByDeposits(depositIds);\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 * Composes the hard-cut 0.14.0-rc.0 staking current-state rows. Pass the\n * caller's fresh stakeOwnerOf(taker) result so the account rows can be\n * fetched together and checked against indexed ownership.\n */\n getStakingState: (\n params: IndexedStakingStateParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedStakingState> => {\n return stakingService.fetchStakingState(params, {\n signal: options?.signal,\n });\n },\n\n /** Pages stake-owner locks by immutable lock identity. */\n getStakeLocks: (\n params: StakeLockPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedStakeLock>> => {\n return stakingService.fetchStakeLocks(params, { signal: options?.signal });\n },\n\n /**\n * Pages one side of the vault's authorization graph: the takers a stake\n * owner has authorized, or the stake owners that have authorized a taker.\n */\n getTakerStakeAuthorizations: (\n params: TakerStakeAuthorizationPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedTakerStakeAuthorization>> => {\n return stakingService.fetchTakerStakeAuthorizations(params, {\n signal: options?.signal,\n });\n },\n\n /** Pages append-only activity relevant to either side of a merchant's stake delegation. */\n getStakeActivity: (\n params: StakeActivityPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedStakeActivity>> => {\n return stakingService.fetchStakeActivity(params, { signal: options?.signal });\n },\n\n /** Pages the exact active policy's finalized dispute stream. */\n getDisputeProtectionIntents: (\n params: DisputeProtectionIntentPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<DisputeProtectionIntentPage> => {\n return stakingService.fetchDisputeProtectionIntents(params, {\n signal: options?.signal,\n });\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.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 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 }).address;\n const allowance = await this.publicClient.readContract({\n address: params.token,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [owner, spender],\n });\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,\n functionName: 'approve',\n args: [spender, value],\n txOverrides: params.txOverrides,\n });\n return { hadAllowance: false, hash };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: TAKER STAKING ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Return the resolved StakeVault coordinates for advanced wallet, relayer,\n * or reactive read integrations.\n */\n getStakeVaultContract(): { address: Address; abi: Abi; stakeToken: Address } {\n return this._stakeOps.getContract();\n }\n\n /** Return the resolved OrchestratorV3 coordinates for advanced integrations. */\n getOrchestratorV3Contract(): { address: Address; abi: Abi } {\n if (!this.orchestratorV3Address || !this.orchestratorV3Abi) {\n throw new Error('OrchestratorV3 not available for this chain/environment');\n }\n return { address: this.orchestratorV3Address, abi: this.orchestratorV3Abi };\n }\n\n /** Return the resolved DisputeProtectionPolicy coordinates for keeper integrations. */\n getDisputeProtectionPolicyContract(): { address: Address; abi: Abi } {\n if (!this.disputeProtectionPolicyAddress || !this.disputeProtectionPolicyAbi) {\n throw new Error('DisputeProtectionPolicy not available for this chain/environment');\n }\n return { address: this.disputeProtectionPolicyAddress, abi: this.disputeProtectionPolicyAbi };\n }\n\n /**\n * Ensure the connected wallet has approved enough USDC for StakeVault.\n * If an approval is submitted, wait for it to confirm before depositing.\n */\n async ensureStakeAllowance(params: {\n amount: bigint;\n maxApprove?: boolean;\n txOverrides?: TxOverrides;\n }): Promise<{ hadAllowance: boolean; hash?: Hash }> {\n const { address, stakeToken } = this._stakeOps.getContract();\n return this.ensureAllowance({\n token: stakeToken,\n spender: address,\n amount: params.amount,\n maxApprove: params.maxApprove,\n txOverrides: params.txOverrides,\n });\n }\n\n /** Deposit USDC stake owned by the transaction sender. */\n readonly depositStake = this.buildStakeVaultMethod<StakeVaultWriteParams['depositStake']>(\n 'depositStake',\n (params) => [params.amount],\n );\n\n /** Withdraw the sender's free stake immediately; locked stake cannot move. */\n readonly withdrawStake = this.buildStakeVaultMethod<StakeVaultWriteParams['withdrawStake']>(\n 'withdrawStake',\n (params) => [params.amount],\n );\n\n /** Withdraw the sender's complete claimable USDC balance. */\n readonly claim = this.buildStakeVaultMethod<StakeVaultWriteParams['claim']>('claim', () => []);\n\n /** Grant or revoke a taker's access to the sender's stake. */\n readonly setTakerAuthorization = this.buildStakeVaultMethod<\n StakeVaultWriteParams['setTakerAuthorization']\n >('setTakerAuthorization', (params) => [params.taker, params.authorized]);\n\n /** Select the authorizing stake owner that backs the connected taker. */\n readonly selectStakeOwner = this.buildStakeVaultMethod<StakeVaultWriteParams['selectStakeOwner']>(\n 'selectStakeOwner',\n (params) => [params.stakeOwner],\n );\n\n /** Clear the connected taker's selection and return to self-stake. */\n readonly clearStakeOwner = this.buildStakeVaultMethod<StakeVaultWriteParams['clearStakeOwner']>(\n 'clearStakeOwner',\n () => [],\n );\n\n /** Read total stake owned by an address directly from StakeVault. */\n getStakeBalance(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getStakeBalance(stakeOwner);\n }\n\n /** Read stake committed to active StakeVault locks. */\n getLockedStake(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getLockedStake(stakeOwner);\n }\n\n /** Read stake available for immediate withdrawal or a new lock. */\n getFreeStake(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getFreeStake(stakeOwner);\n }\n\n /** Read the non-stake USDC withdrawable by a beneficiary with `claim()`. */\n getClaimable(beneficiary: Address): Promise<bigint> {\n return this._stakeOps.getClaimable(beneficiary);\n }\n\n /** Resolve the effective stake owner backing a taker. */\n getStakeOwner(taker: Address): Promise<Address> {\n return this._stakeOps.getStakeOwner(taker);\n }\n\n /** Read a taker's raw selection, which is stale once authorization is revoked. */\n getSelectedStakeOwner(taker: Address): Promise<Address> {\n return this._stakeOps.getSelectedStakeOwner(taker);\n }\n\n /** Read whether a stake owner currently authorizes a taker. */\n getTakerAuthorization(stakeOwner: Address, taker: Address): Promise<boolean> {\n return this._stakeOps.getTakerAuthorization(stakeOwner, taker);\n }\n\n /** Read the complete authoritative StakeVault state needed by a staking UI. */\n getStakeVaultState(params: { staker: Address; taker?: Address }): Promise<StakeVaultState> {\n return this._stakeOps.getStakeVaultState(params);\n }\n\n /** Read whether the DisputeProtectionPolicy is refusing new dispute-protected admissions. */\n getAdmissionsPaused(): Promise<boolean> {\n return this._stakeOps.getAdmissionsPaused();\n }\n\n /** Prove the exact packaged dispute-protection deployment at one block. */\n getDisputeProtectionReadiness(\n options?: DisputeProtectionReadinessOptions,\n ): Promise<DisputeProtectionReadinessResult> {\n return this._disputeProtectionReadinessReader.read(options);\n }\n\n /**\n * Read a payment method's minimum collateral lock window in seconds. Zero\n * means the method admits unbonded — no stake is locked at admission.\n */\n getRiskWindow(paymentMethodHash: `0x${string}`): Promise<bigint> {\n return this._stakeOps.getRiskWindow(paymentMethodHash);\n }\n\n /** Read whether an escrow deposit has opted into dispute protection. */\n isDisputeProtectionEnabled(\n escrow: Address,\n depositId: bigint,\n paymentMethod: Hex,\n ): Promise<boolean> {\n return this._stakeOps.isDisputeProtectionEnabled(escrow, depositId, paymentMethod);\n }\n\n /** Enable or disable dispute protection for one deposit. */\n readonly setDisputeProtectionEnabled = this.buildDisputeProtectionPolicyMethod<{\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n enabled: boolean;\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setDisputeProtectionEnabled', (params) => [\n params.escrow,\n params.depositId,\n params.paymentMethod,\n params.enabled,\n ]);\n\n /**\n * Release one protected intent whose risk window matured, unlocking its\n * stake cover. Permissionless once mature. Pass `disputeProtectionPolicyAddress` to\n * pin the transaction to a snapshotted deployment.\n */\n readonly releaseMaturedDisputeProtectionIntent = this.buildDisputeProtectionPolicyMethod<{\n intentHash: `0x${string}`;\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('releaseMaturedDisputeProtectionIntent', (params) => [params.intentHash]);\n\n /**\n * Release multiple matured protected intents in one transaction.\n * Pass `disputeProtectionPolicyAddress` to pin the transaction to a snapshotted deployment.\n */\n readonly releaseMaturedDisputeProtectionIntents = this.buildDisputeProtectionPolicyMethod<{\n intentHashes: readonly `0x${string}`[];\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('releaseMaturedDisputeProtectionIntents', (params) => [params.intentHashes]);\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.payeeData - Payee details per processor (e.g., [{ offchainId: 'you@example.com' }]). Required when the SDK needs to register payee details with the curator.\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 * payeeData: [{ offchainId: 'you@example.com' }],\n * });\n * // Then pass hashedOnchainIds to createDeposit\n * ```\n */\n async registerPayeeDetails(params: {\n processorNames: string[];\n payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n hashedOnchainIds: string[];\n }> {\n const payeeData = resolvePayeeDataInput(params, 'registerPayeeDetails');\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 !== payeeData.length) {\n throw new Error('processorNames and payeeData length mismatch');\n }\n const baseApiUrl = (this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(/\\/$/, '');\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => toPostDepositDetailsRequest(processorName, payeeData[index], index),\n );\n\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs)),\n );\n if (!apiResponses.every((r) => r.success)) {\n const failed = apiResponses.find((r) => !r.success);\n throw new Error(failed?.message || 'Failed to register payee details');\n }\n\n const hashedOnchainIds = apiResponses.map((r) => r.responseObject.hashedOnchainId);\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.payeeData - Payee details per processor (e.g., [{ offchainId: 'you@example.com' }])\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 - Guardian for intent approval. Defaults to the paid guardian deployed for the client's environment.\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 (empty when payee registration is skipped) and the transaction hash\n *\n * @throws Error if processorNames, payeeData, and conversionRates lengths don't match\n * @throws Error if payeeData is missing and neither payeeDetailsHashes nor full payment method overrides are provided\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 * payeeData: [{ offchainId: '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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 const hasOverrides = Boolean(\n params.paymentMethodsOverride ||\n params.paymentMethodDataOverride ||\n params.currenciesOverride,\n );\n const payeeDetailsHashes = params.payeeDetailsHashes;\n const hasPayeeHashes = payeeDetailsHashes !== undefined;\n const shouldResolvePayeeData =\n params.payeeData !== undefined || params.depositData !== undefined;\n const payeeData = shouldResolvePayeeData\n ? resolvePayeeDataInput(params, 'createDeposit')\n : null;\n\n if (!Array.isArray(params.processorNames) || params.processorNames.length === 0) {\n throw new Error('processorNames must be a non-empty array');\n }\n params.processorNames.forEach((processorName, index) =>\n assertKnownProcessorName(processorName, `processorNames[${index}]`),\n );\n if (params.processorNames.length !== params.conversionRates.length) {\n throw new Error('processorNames and conversionRates length mismatch');\n }\n if (payeeData && params.processorNames.length !== payeeData.length) {\n throw new Error('processorNames and payeeData length mismatch');\n }\n if (!hasOverrides && !hasPayeeHashes && !payeeData) {\n throw new Error(\n 'createDeposit requires payeeData unless payeeDetailsHashes or full payment method overrides are provided',\n );\n }\n\n const depositDetails: PostDepositDetailsRequest[] = payeeData\n ? params.processorNames.map((processorName, index) =>\n toPostDepositDetailsRequest(processorName, payeeData[index], index),\n )\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 assertCatalogPaymentMethods(\n params.paymentMethodsOverride,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethodsOverride',\n );\n assertCatalogCurrencies(\n params.paymentMethodsOverride,\n params.currenciesOverride,\n this.chainId,\n this.runtimeEnv,\n 'currenciesOverride',\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 (payeeDetailsHashes !== undefined) {\n // Use pre-computed hashes (e.g., from registerPayeeDetails)\n if (payeeDetailsHashes.length !== params.processorNames.length) {\n throw new Error('payeeDetailsHashes length must match processorNames length');\n }\n hashedOnchainIds = payeeDetailsHashes;\n } else {\n // Register payee details with the curator when hashes are not provided\n const baseApiUrl = (this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(/\\/$/, '');\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs)),\n );\n if (!apiResponses.every((r) => r.success)) {\n const failed = apiResponses.find((r) => !r.success);\n throw new Error(failed?.message || 'Failed to create deposit details');\n }\n hashedOnchainIds = apiResponses.map((r) => r.responseObject.hashedOnchainId);\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 // justified: callers pass arbitrary currency strings; mapConversionRatesToOnchainMinRate\n // validates each code against the currency catalog at runtime.\n currencies = mapConversionRatesToOnchainMinRate(\n params.conversionRates as UICurrencyRate[][],\n paymentMethods.length,\n );\n }\n\n const escrowContext = this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\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 ?? this.intentGuardianAddress ?? ZERO_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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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',\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',\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 * Pay to extend a live intent through the standalone prepaid IntentGuardian.\n *\n * Payment is prepaid and non-refundable and transfers to the deposit owner,\n * not the protocol. Any account may pay for any live intent — the payer does\n * not have to be the taker — so the deposit token must be approved to the\n * guardian by whoever signs this.\n *\n * `maxCost` is required slippage protection: the guardian fee is\n * owner-governed and may change between quoting and execution, in which case\n * the call reverts with ExtensionCostExceedsMax instead of overcharging.\n * Never pass an unbounded maximum.\n *\n * Escrow still enforces the cumulative intent lifetime cap; the guardian does\n * not bypass it. After confirmation, refetch the intent — canonical expiry\n * comes from Escrow's IntentExpiryExtended event, not from guardian events.\n */\n readonly extendIntentLifetime = this.buildIntentGuardianMethod<\n IntentGuardianWriteParams['extendIntent']\n >('extendIntent', (params) => [\n params.escrow,\n params.depositId,\n params.intentHash,\n params.additionalTime,\n params.maxCost,\n ]);\n\n /**\n * Live guardian policy, including whether governance has disabled extensions\n * by setting the fee to zero. Read this rather than caching a fee value.\n */\n async getIntentGuardianPolicy(): Promise<IntentGuardianPolicy> {\n return this._intentGuardianOps.getPolicy();\n }\n\n /**\n * Authoritative on-chain extension quote. Call immediately before signing and\n * derive `maxCost` from the result — a displayed quote is never a commitment.\n */\n async quoteIntentExtension(params: {\n intentAmount: bigint;\n additionalTime: bigint;\n }): Promise<IntentGuardianQuote> {\n return this._intentGuardianOps.quoteExtensionCost(params);\n }\n\n /**\n * Payer allowance/balance against the guardian for the target deposit token.\n * The guardian charges `deposit.token`, which is not necessarily USDC.\n */\n async getIntentGuardianPayerFunding(params: {\n payer: Address;\n token: Address;\n }): Promise<{ allowance: bigint; balance: bigint }> {\n return this._intentGuardianOps.getPayerFunding(params);\n }\n\n /** True when this deployment has a usable guardian. Gate UI on this. */\n hasIntentGuardian(): boolean {\n return this._intentGuardianOps.isAvailable();\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',\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 assertCatalogPaymentMethods(\n params.paymentMethods,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethods',\n );\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 assertCatalogPaymentMethods(\n params.paymentMethods,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethods',\n );\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 curator `/v3/sign` when `baseApiUrl` is configured. Deposits\n * using zero-address gating are signaled directly with an empty signature.\n * Otherwise you must provide `gatingServiceSignature` and `signatureExpiration`\n * yourself.\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 * Deposit access policies and verified address groups.\n *\n * `accessPolicy.isSupported` is false wherever the contracts are not\n * deployed. Writes are depositor-only, and saving a policy configures storage\n * rather than enforcing admission.\n */\n get accessPolicy(): AccessPolicyOperations {\n return this._accessPolicyOps;\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 - Buyer TEE payment proof input\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 if (params?.callbacks?.onTxMined) {\n await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n params.callbacks.onTxMined(txHash);\n }\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 // ───────────────────────────────────────────────────────────────────────────\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 req.paymentPlatforms.forEach((processorName, index) =>\n assertKnownProcessorName(processorName, `paymentPlatforms[${index}]`),\n );\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n // New quote traffic stays pinned to the current escrow unless the caller\n // explicitly scopes the request themselves.\n const reqWithEscrow: QuoteRequest = { ...req };\n if (!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) {\n const configuredEscrows = this.escrowV2Address\n ? [this.escrowV2Address 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(reqWithEscrow, {\n baseApiUrl,\n timeoutMs,\n headers: this.apiHeaders,\n });\n // Extract maker payee fields from the /v3/quote response into payeeData.\n // maker is a transient curator-side field that is not part of QuoteSingleResponse, so type it inline.\n type RawQuoteWithMaker = QuoteSingleResponse & {\n maker?: {\n offchainId?: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n depositData?: Record<string, string>;\n };\n };\n const quotes = (quote?.responseObject?.quotes ?? []).filter(isActiveQuotePaymentMethod);\n quote.responseObject.quotes = quotes;\n if (quote.responseObject.nearbySuggestions) {\n quote.responseObject.nearbySuggestions = {\n below: quote.responseObject.nearbySuggestions.below.filter((suggestion) =>\n isActiveQuotePaymentMethod(suggestion.quote),\n ),\n above: quote.responseObject.nearbySuggestions.above.filter((suggestion) =>\n isActiveQuotePaymentMethod(suggestion.quote),\n ),\n };\n }\n for (const q of quotes) {\n const payeeData = normalizeQuotePayeeData((q as RawQuoteWithMaker).maker);\n if (payeeData) {\n q.payeeData = payeeData;\n }\n }\n return appendReferrerFeeDisplayFields(quote, referrerFeeConfig);\n }\n\n /**\n * **Supporting Method** - Fetches the best available quote per supported payment platform.\n *\n * Returns one quote per platform when available. The API returns payee details\n * in each platform's best quote when available.\n *\n * @param req - Best-by-platform quote request parameters\n * @param opts - Optional overrides for API URL and timeout\n * @returns Best-by-platform quote response\n */\n async getQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetBestByPlatformResponse> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(\n req.referrerFeeConfig,\n 'getQuotesBestByPlatform',\n );\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const reqWithEscrow: QuotesBestByPlatformRequest = { ...req };\n if (!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) {\n const configuredEscrows = this.escrowV2Address\n ? [this.escrowV2Address]\n : this.escrowAddress\n ? [this.escrowAddress]\n : [];\n if (configuredEscrows.length > 0) {\n reqWithEscrow.escrowAddresses = configuredEscrows;\n }\n }\n\n const quote = await apiGetQuotesBestByPlatform(reqWithEscrow, {\n baseApiUrl,\n timeoutMs,\n headers: this.apiHeaders,\n });\n // Extract maker payee fields from /v3/quote/best-by-platform response into payeeData for compatibility.\n // maker is a transient curator-side field that is not part of QuoteSingleResponse, so type it inline.\n type RawBestQuoteWithMaker = QuoteSingleResponse & {\n maker?: {\n offchainId?: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n depositData?: Record<string, string>;\n };\n };\n const enrichedQuote: BestByPlatformResponse | undefined = quote\n ? {\n ...quote,\n responseObject: {\n ...quote.responseObject,\n platformQuotes: (quote.responseObject?.platformQuotes ?? [])\n .filter((platformQuote) => {\n const platform = platformQuote.platform.trim().toLowerCase();\n if (!METHOD_NAME_TO_HASH[platform]) return false;\n return (\n !platformQuote.bestQuote ||\n (platform === platformQuote.bestQuote.intent.processorName.trim().toLowerCase() &&\n isActiveQuotePaymentMethod(platformQuote.bestQuote))\n );\n })\n .map((platformQuote) => {\n const bestQuote = platformQuote?.bestQuote as RawBestQuoteWithMaker | undefined;\n const payeeData = normalizeQuotePayeeData(bestQuote?.maker);\n if (!bestQuote || !payeeData) return platformQuote;\n return {\n ...platformQuote,\n bestQuote: { ...bestQuote, payeeData },\n };\n }),\n },\n }\n : quote;\n\n return appendReferrerFeeDisplayFieldsToBestByPlatform(enrichedQuote, referrerFeeConfig);\n }\n\n /**\n * Fetch a referral dashboard. Pass `address` for a public wallet-keyed read;\n * omit it to use the authenticated caller mode.\n */\n async getReferralDashboard(opts?: ReferralReadOptions): Promise<ReferralDashboardResponse> {\n return this._referralOps.getReferralDashboard(opts);\n }\n\n /**\n * Fetch referral earnings. Pass `address` for a public wallet-keyed read;\n * omit it to use the authenticated caller mode.\n */\n async getReferralEarnings(opts?: ReferralReadOptions): Promise<ReferralEarningsResponse> {\n return this._referralOps.getReferralEarnings(opts);\n }\n\n /**\n * Publicly look up a referral code's owner wallet and active status.\n */\n async lookupReferralCode(\n code: string,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<ReferralCodeLookupResponse> {\n return this._referralOps.lookupReferralCode(code, opts);\n }\n\n /**\n * Create or fetch the authenticated caller's referral code with bearer auth.\n */\n async createReferralCode(opts?: ReferralBearerWriteOptions): Promise<CreateReferralCodeResponse> {\n return this._referralOps.createReferralCode(opts);\n }\n\n /**\n * Create or fetch the wallet's referral code with EIP-712 signature auth.\n */\n async createReferralCodeWithSignature(\n opts?: ReferralSignatureOptions,\n ): Promise<CreateReferralCodeResponse> {\n return this._referralOps.createReferralCodeWithSignature(opts);\n }\n\n /**\n * Apply another user's referral code with bearer auth.\n */\n async redeemReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<RedeemReferralCodeResponse> {\n return this._referralOps.redeemReferralCode(code, opts);\n }\n\n /**\n * Apply another user's referral code with EIP-712 signature auth. If\n * `referrerWalletAddress` is omitted, the SDK looks up the code first and signs\n * the current owner wallet into the redeem payload.\n */\n async redeemReferralCodeWithSignature(\n code: string,\n opts?: RedeemReferralCodeSignatureOptions,\n ): Promise<RedeemReferralCodeResponse> {\n return this._referralOps.redeemReferralCodeWithSignature(code, opts);\n }\n\n /**\n * Customize the authenticated caller's referral code with bearer auth.\n */\n async updateReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<UpdateReferralCodeResponse> {\n return this._referralOps.updateReferralCode(code, opts);\n }\n\n /**\n * Customize the wallet's referral code with EIP-712 signature auth.\n */\n async updateReferralCodeWithSignature(\n code: string,\n opts: UpdateReferralCodeSignatureOptions,\n ): Promise<UpdateReferralCodeResponse> {\n return this._referralOps.updateReferralCodeWithSignature(code, opts);\n }\n\n /**\n * The signed `credentialValidatedAt` field is an upload-time freshness witness minted by\n * attestation-service. `credentialExpiresAt` carries an upstream session expiry hint when one\n * can be trusted (currently `null` for all platforms). Once curator persists the bundle,\n * seller-automated-release availability is governed by curator's probe/revalidation state\n * rather than these timestamps.\n *\n * Create a signed seller credential bundle with attestation-service and store it via\n * curator's platform plus hashed payee-details route. Session-cookie platforms register\n * or recover the payee maker row before upload; Wise derives the payee hash inside the enclave\n * from the submitted Personal API Token.\n */\n async uploadSellerCredential(\n params: UploadSellerCredentialParams,\n opts?: UploadSellerCredentialOptions,\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const attestationServiceUrl = this.stripTrailingSlash(\n opts?.attestationServiceUrl ?? this.defaultAttestationServiceForBaseApiUrl(baseApiUrl),\n );\n\n const createBundle = (uploadPayload: SellerCredentialUploadInput) =>\n apiCreateSellerCredentialBundle(\n uploadPayload,\n attestationServiceUrl,\n params.platform,\n timeoutMs,\n opts?.attestationRuntime,\n opts?.attestationServiceFallbackUrls\n ? { fallbackUrls: opts.attestationServiceFallbackUrls }\n : undefined,\n );\n\n if (params.platform === 'wise') {\n const bundleResponse = await createBundle({\n ...(params.callerAddress ? { callerAddress: params.callerAddress } : {}),\n sessionMaterial: params.sessionMaterial,\n });\n\n if (!bundleResponse.success || !bundleResponse.responseObject) {\n throw new Error(bundleResponse.message || 'Failed to create seller credential bundle');\n }\n\n return this.uploadSellerCredentialBundle(\n {\n bundle: bundleResponse.responseObject,\n platform: params.platform,\n },\n { baseApiUrl, timeoutMs },\n );\n }\n\n const bundlePayload = {\n ...(params.callerAddress ? { callerAddress: params.callerAddress } : {}),\n payeeId: params.payeeId,\n sessionMaterial: params.sessionMaterial,\n } as PayeeBoundSellerCredentialUploadInput;\n const bundleResponse = await createBundle(bundlePayload);\n\n if (!bundleResponse.success || !bundleResponse.responseObject) {\n throw new Error(bundleResponse.message || 'Failed to create seller credential bundle');\n }\n\n return this.uploadSellerCredentialBundle(\n {\n bundle: bundleResponse.responseObject,\n offchainId: params.offchainId,\n platform: params.platform,\n ...(params.telegramUsername !== undefined\n ? { telegramUsername: params.telegramUsername }\n : {}),\n ...(params.metadata !== undefined ? { metadata: params.metadata } : {}),\n },\n { baseApiUrl, timeoutMs },\n );\n }\n\n /**\n * Store an already-encrypted seller credential bundle with curator.\n */\n async uploadSellerCredentialBundle(\n params: UploadSellerCredentialBundleParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const authorizationToken = await this.resolveAuthorizationToken();\n\n return apiUploadSellerCredentialBundle(params, baseApiUrl, timeoutMs, authorizationToken);\n }\n\n /**\n * Upload a seller Gmail OAuth authorization code through curator.\n *\n * Curator owns the encryption hop to attestation-service for this flow, so\n * callers send the one-time Google code plus the stable seller identity.\n */\n async uploadGoogleOAuthSellerCredential(\n params: UploadGoogleOAuthSellerCredentialParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const platform = (params as { platform?: unknown }).platform;\n if (platform !== 'paypal') {\n throw new ValidationError(\n `Unsupported Google OAuth seller credential platform: ${String(platform)}`,\n 'platform',\n );\n }\n\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const getUploadOptions = async () => {\n let authorizationToken: string | undefined;\n try {\n authorizationToken = await this.resolveAuthorizationToken();\n } catch {\n authorizationToken = undefined;\n }\n\n return {\n timeoutMs,\n ...(authorizationToken ? { authorizationToken } : {}),\n };\n };\n\n return apiUploadGoogleOAuthSellerCredential(\n 'paypal',\n params.payeeDetails,\n {\n payeeEmail: params.payeeEmail,\n authorizationCode: params.authorizationCode,\n redirectUri: params.redirectUri,\n },\n baseApiUrl,\n await getUploadOptions(),\n );\n }\n\n /**\n * Status is a coarse curator-owned signal (`active` / `inactive` / `missing`) and intentionally\n * omits low-level diagnostics. Curator may still re-probe stale credentials during verify, so callers\n * should continue to handle a 410 from `verifySellerPayment`.\n *\n * The curator status endpoint is public and keyed by platform plus hashed payee details.\n *\n * Fetch seller credential status for a maker identity from curator.\n */\n async getSellerCredentialStatus(\n params: GetSellerCredentialStatusParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialStatusResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n\n return apiGetSellerCredentialStatus(\n params.processorName,\n params.payeeDetails,\n baseApiUrl,\n timeoutMs,\n );\n }\n\n /**\n * Internal-use endpoint. The curator route requires an internal `x-api-key`; non-internal\n * API keys will be rejected. Returns 410 GONE when curator has marked the credential inactive\n * or a stale credential fails its synchronous re-probe.\n *\n * Verify a seller payment via curator's seller-credential proxy.\n */\n async verifySellerPayment(\n params: VerifySellerPaymentParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerVerifyResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n\n return apiVerifySellerPayment(\n params.platform,\n {\n txId: params.txId,\n chainId: params.chainId,\n intent: params.intent,\n ...(params.metadata !== undefined ? { metadata: params.metadata } : {}),\n },\n baseApiUrl,\n timeoutMs,\n this.apiKey,\n );\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 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 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 orchestratorV3?: Address;\n orchestratorAddresses: Address[];\n protocolViewer?: Address;\n protocolViewerEntries: Address[];\n unifiedPaymentVerifier?: Address;\n rateManagerV1?: Address;\n orchestratorRegistry?: Address;\n stakeVault?: Address;\n disputeProtectionPolicy?: 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 orchestratorV3: this.orchestratorV3Address,\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 stakeVault: this.stakeVaultAddress,\n disputeProtectionPolicy: this.disputeProtectionPolicyAddress,\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(\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ): 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 return this._intentOps.getFulfillIntentInputs(intentHash, options);\n }\n}\n","import type { SellerCredentialBundle } from './types';\n\nexport type PeerConnectionStatus = 'connected' | 'disconnected' | 'pending';\n\nexport type PeerMetadataCaptureMode = 'buyerTee' | 'sellerCredential';\n\nexport type PeerAuthenticateParams = {\n actionType: string;\n attestationActionType?: string | null;\n attestationPlatform?: string | null;\n attestationServiceUrl?: string | null;\n callerAddress?: string | null;\n captureMode?: PeerMetadataCaptureMode;\n platform: string;\n};\n\nexport type PeerBuyerTeePaymentParams = Record<string, string | number | boolean>;\n\nexport type PeerBuyerTeePaymentCapture = {\n encryptedSessionMaterial: string;\n params?: PeerBuyerTeePaymentParams[];\n};\n\nexport type PeerSarCredentialCapture = {\n credentialBundle: SellerCredentialBundle;\n offchainId: string;\n};\n\nexport type PeerMetadataRow = {\n amount?: string;\n currency?: string;\n date?: string;\n hidden: boolean;\n originalIndex: number;\n params?: PeerBuyerTeePaymentParams;\n paymentId?: string;\n recipient?: string;\n [key: string]: unknown;\n};\n\nexport type PeerMetadataMessage = {\n buyerTeeCapture?: PeerBuyerTeePaymentCapture | null;\n errorMessage?: string;\n expiresAt: number;\n metadata: PeerMetadataRow[];\n platform: string;\n requestId: string;\n sarCredentialCapture?: PeerSarCredentialCapture | null;\n};\n\nexport type PeerMetadataMessageCallback = (message: PeerMetadataMessage) => void;\n\nexport type PeerExtensionApi = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n getVersion(): Promise<string>;\n authenticate(params: PeerAuthenticateParams): void;\n onMetadataMessage(callback: PeerMetadataMessageCallback): () => void;\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 getVersion(): Promise<string>;\n authenticate(params: PeerAuthenticateParams): void;\n onMetadataMessage(callback: PeerMetadataMessageCallback): () => void;\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\ntype LegacyPeerAuthenticateParams = PeerAuthenticateParams & {\n providerConfig?: unknown;\n};\n\nconst sanitizePeerAuthenticateParams = (params: PeerAuthenticateParams): PeerAuthenticateParams => {\n const sanitizedParams: LegacyPeerAuthenticateParams = { ...params };\n delete sanitizedParams.providerConfig;\n\n return sanitizedParams;\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 getVersion: () => requirePeer(options).getVersion(),\n authenticate: (params: PeerAuthenticateParams) =>\n requirePeer(options).authenticate(sanitizePeerAuthenticateParams(params)),\n onMetadataMessage: (callback: PeerMetadataMessageCallback) =>\n requirePeer(options).onMetadataMessage(callback),\n openInstallPage: () => openPeerExtensionInstallPage(options),\n getState: () => getPeerExtensionState(options),\n});\n\nexport const peerExtensionSdk = createPeerExtensionSdk();\n","/**\n * Exact client-side counterparts of the DisputeProtectionPolicy admission rules.\n *\n * Kept inside the public SDK so its generated declarations and runtime remain\n * self-contained for external consumers. The deployed policy (contracts-v2\n * 0.4.1) is full-gross: an intent on a payment method with a non-zero risk\n * window locks the full intent amount 1:1 from the effective stake owner's\n * free stake, so stake-backed capacity IS that free stake. A method with a\n * zero (or absent) risk window admits unbonded and never touches stake.\n *\n * Intent-lifetime extension pricing is not risk math: it belongs to the\n * standalone IntentGuardian and is quoted via the guardian operations.\n */\n\nexport type IntegerLike = bigint | number | string | { toString(): string };\n\nexport type RiskMode = 'UNBONDED' | 'STAKE_BACKED';\n\nexport const RISK_BPS_DENOMINATOR = 10_000n;\n\nfunction integer(value: IntegerLike, label: string): bigint {\n if (typeof value === 'number' && (!Number.isSafeInteger(value) || value < 0)) {\n throw new RangeError(`${label} must be a non-negative safe integer`);\n }\n const parsed = BigInt(value.toString());\n if (parsed < 0n) throw new RangeError(`${label} must be non-negative`);\n return parsed;\n}\n\n/** Full-gross coverage required at admission; zero when the method is unbonded. */\nexport function calculateRequiredCoverage(amount: IntegerLike, disputeProtected: boolean): bigint {\n return disputeProtected ? integer(amount, 'amount') : 0n;\n}\n\n/** Maximum dispute-protected intent amount that can use existing stake. */\nexport function calculateStakeBackedCapacity(freeStake: IntegerLike): bigint {\n return integer(freeStake, 'freeStake');\n}\n\n/**\n * Exact admission mode under the DisputeProtectionPolicy. `disputeProtected` means the\n * payment method carries a non-zero risk window; the policy additionally\n * requires the deposit to have dispute protection enabled and admissions unpaused,\n * both of which reject the intent outright rather than changing its mode.\n */\nexport function selectRiskMode(\n amount: IntegerLike,\n freeStake: IntegerLike,\n disputeProtected: boolean,\n): RiskMode {\n const required = calculateRequiredCoverage(amount, disputeProtected);\n if (!disputeProtected) return 'UNBONDED';\n if (integer(freeStake, 'freeStake') >= required) return 'STAKE_BACKED';\n throw new RangeError('insufficient free stake for dispute-protected admission');\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/address.ts","../src/client/clientUtils.ts","../src/client/ContractRouter.ts","../src/errors/utils.ts","../src/adapters/verification.ts","../src/adapters/attestationTransport.ts","../src/adapters/attestation.ts","../src/utils/encode.ts","../src/referrerFeeConfig.ts","../src/utils/attribution.ts","../src/utils/constants.ts","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/oracleFeeds/chainlink.json","../src/utils/oracles.ts","../src/constants.ts","../src/client/IntentOperations.ts","../src/client/ProtocolViewerReader.ts","../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/schemaCompatibility.ts","../src/utils/logger.ts","../src/indexer/service.ts","../src/referral.ts","../../core/src/utils/currencyKeccak256.ts","../../core/src/types/currency.ts","../../core/src/platforms/types.ts","../../core/src/platforms/zelle.ts","../../core/src/platforms/disputeProtection.ts","../src/adapters/api.ts","../src/client/ReferralAccountOperations.ts","../src/client/VaultOperations.ts","../src/client/AccessPolicyOperations.ts","../src/client/StakeOperations.ts","../src/indexer/rateManagerService.ts","../src/indexer/stakingService.ts","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/index.js","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/disputeStack/base.js","../../../node_modules/.pnpm/@zkp2p+contracts-v2@0.4.1-rc.9_ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10__typescript@5.9.3_zod@4.5.4/node_modules/@zkp2p/contracts-v2/_esm/disputeStack/baseStaging.js","../src/buildMetadata.ts","../src/client/DisputeProtectionReadiness.ts","../src/indexer/intentVerification.ts","../src/sellerCredentials.ts","../src/utils/referrerFeeDisplay.ts","../src/utils/erc20.ts","../src/client/Zkp2pClient.ts","../src/extension.ts","../src/riskMath.ts"],"names":["base","createEncryptedBuyerTeeSessionMaterialWithAttestation","ZERO_ADDRESS","data","payee","parseDepositView","raw","results","attemptedRead","hadSuccessfulRead","lastError","parseIntentView","headers","normalizeAddress","currencyKeccak256","viemKeccak256","Currency","currencyInfo","result","DEFAULT_LIMIT","normalizeRateManagerId","keccak256","zeroAddress","policyAdmissionsPaused","hardhat","mapConversionRatesToOnchainMinRate","bundleResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Address } from 'viem';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Address;\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","import type { Address } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport { parseBigIntLike } from '../utils/bigint';\nimport { ZERO_ADDRESS, isValidHexAddress, normalizeAddress } from '../utils/address';\n\nexport { ZERO_ADDRESS, isValidHexAddress, normalizeAddress };\n\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 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' | 'v3';\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 orchestratorV3Address?: Address;\n orchestratorV3Abi?: 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 orchestratorV3Address?: Address;\n readonly orchestratorV3Abi?: 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.orchestratorV3Address = config.orchestratorV3Address;\n this.orchestratorV3Abi = config.orchestratorV3Abi;\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 pairedOrchestratorAddresses = this.orchestratorAddresses.filter(\n (address) => !isSameAddress(address, this.orchestratorV3Address),\n );\n const configuredPairCount = Math.min(\n this.escrowAddresses.length,\n pairedOrchestratorAddresses.length,\n );\n for (let index = 0; index < configuredPairCount; index += 1) {\n addEscrowOrchestratorPair(this.escrowAddresses[index], pairedOrchestratorAddresses[index]);\n }\n\n const resolveOrchestratorAbi = (address?: Address): Abi | undefined =>\n this.getOrchestratorContextByAddress(address)?.abi ??\n (isSameAddress(address, this.orchestratorV3Address)\n ? this.orchestratorV3Abi\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.orchestratorV3Address,\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 isV3 = isSameAddress(address, this.orchestratorV3Address);\n const abi = isV3\n ? this.orchestratorV3Abi\n : 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: isV3 ? 'v3' : '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(escrowAddress?: Address): 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 // EscrowV2 is shared by OrchestratorV2 and OrchestratorV3. ProtocolViewer\n // reads must cover every configured orchestrator instead of assuming a\n // one-to-one escrow/orchestrator index pairing.\n for (const orchestratorAddress of this.orchestratorAddresses) {\n add(context.address, orchestratorAddress);\n }\n }\n\n return contexts;\n }\n}\n\nexport { parseEscrowAddressFromCompositeDepositId };\n","import { APIError, NetworkError } from './index';\n\nexport function parseAPIError(response: Response, responseText?: string): APIError {\n let message = `Request failed: ${response.statusText}`;\n let parsedBody: unknown;\n try {\n parsedBody = responseText ? JSON.parse(responseText) : undefined;\n if (parsedBody && typeof parsedBody === 'object') {\n const body = parsedBody as Record<string, unknown>;\n if (body.error || body.message) {\n message = (body.error || body.message) as string;\n }\n }\n } catch {\n if (responseText && responseText.length < 200) message = responseText;\n }\n return new APIError(message, response.status, { url: response.url, responseBody: parsedBody });\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n delayMs = 1000,\n timeoutMs?: number,\n shouldRetry?: (error: unknown) => boolean,\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 || shouldRetry?.(err) === true;\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 type { Address } from 'viem';\nimport { APIError, NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport type { CuratorMetadata } from '../types';\n\nexport type SignIntentV3ReferralFee = {\n recipient: Address;\n fee: string;\n};\n\nexport type SignIntentV3Request = {\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 callerAddress: Address; // wallet that will call signalIntent on-chain\n referralFees: SignIntentV3ReferralFee[];\n postIntentHook?: Address;\n data?: `0x${string}`;\n};\n\n/** Everything curator returns on a successful `/v3/sign`. */\nexport type SignIntentV3ResponseObject = {\n offchainId?: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n signedIntent: `0x${string}`; // signature bytes\n /**\n * The intent curator signed, echoed back in full.\n *\n * Everything here is optional: the wrapper only needs the expiration, and a\n * caller that encodes `signalIntent` itself reads the rest. Field list taken\n * from a live preproduction `/v3/sign` response, not from the request shape —\n * `preIntentHookData` is declared because the SDK has always read it, though\n * curator omits it when there is no hook.\n */\n intentData?: {\n signatureExpiration?: string;\n preIntentHookData?: string;\n referralFees?: SignIntentV3ReferralFee[];\n orchestratorAddress?: string;\n escrowAddress?: string;\n depositId?: string;\n amount?: string;\n recipientAddress?: string;\n paymentMethod?: string;\n fiatCurrency?: string;\n conversionRate?: string;\n callerAddress?: string;\n chainId?: string;\n gatingServiceSignature?: string;\n postIntentHook?: string;\n data?: string;\n };\n signatureExpiration?: string;\n preIntentHookData?: string;\n referralFees?: SignIntentV3ReferralFee[];\n};\n\ntype SignIntentV3Response = {\n success: boolean;\n message: string;\n responseObject: SignIntentV3ResponseObject;\n statusCode: number;\n};\n\nexport type SignIntentApiOptions = {\n baseApiUrl: string;\n timeoutMs?: number;\n /**\n * Extra request headers, e.g. the `x-pp-key` service key that curator's\n * `peerPayKey` middleware reads to skip fee enforcement and rate limiting.\n * Merged over the defaults, so a caller can also replace `Content-Type`.\n */\n headers?: Record<string, string>;\n};\n\n/**\n * Why a `/v3/sign` call produced no curator signature.\n *\n * Curator answers 409 for more than one reason and they are not\n * interchangeable: a deposit that gates on-chain wants the intent signalled\n * directly with an empty signature, while a refusal such as an inactive\n * payment method must not be turned into an ungated signal — on a gated\n * deposit that reverts, and on an ungated one it signals an intent curator\n * just declined.\n */\nexport type SignIntentV3Result =\n | { gating: 'curator-signed'; response: SignIntentV3ResponseObject }\n | { gating: 'enforced-on-chain'; message: string };\n\n/*\n * Curator returns `This deposit is enforced on-chain and does not require a\n * curator signature` (verificationService, `intentGatingService == 0x0`). There\n * is no machine-readable code on the envelope yet, so this matches the stable\n * part of that sentence; every other 409 keeps its message and throws.\n */\nconst ENFORCED_ON_CHAIN_MESSAGE = /enforced on-chain/i;\n\nconst RETRYABLE_SIGN_INTENT_STATUSES = new Set([500, 502, 503, 504]);\n\nconst isRetryableSignIntentError = (error: unknown): boolean =>\n error instanceof APIError &&\n error.status !== undefined &&\n RETRYABLE_SIGN_INTENT_STATUSES.has(error.status);\n\nconst readCuratorMessage = (body: string): string => {\n try {\n const parsed = JSON.parse(body) as { message?: unknown };\n return typeof parsed.message === 'string' ? parsed.message : body;\n } catch {\n return body;\n }\n};\n\n/**\n * Raw `/v3/sign`: the full request in, curator's full response object out.\n *\n * Use this when the wrapper's projection is not enough — routing by the\n * quote-recorded orchestrator, submitting through a relayer with its own\n * `callerAddress`, or reading `offchainId` / `telegramUsername` / `intentData`.\n * `apiSignIntentV3` is the narrow projection of this.\n */\nexport async function apiSignIntentV3Raw(\n request: SignIntentV3Request,\n opts: SignIntentApiOptions,\n): Promise<SignIntentV3Result> {\n const baseApiUrl = opts.baseApiUrl.replace(/\\/+$/, '').replace(/\\/v[123]$/i, '');\n const url = `${baseApiUrl}/v3/sign`;\n\n return withRetry(\n async (): Promise<SignIntentV3Result> => {\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...opts.headers },\n body: JSON.stringify(request),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', {\n endpoint: '/v3/sign',\n error,\n });\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n // Only the on-chain-gating 409 means \"signal it yourself\". Anything\n // else is curator declining, and is surfaced with its own message.\n if (res.status === 409) {\n const message = readCuratorMessage(text);\n if (ENFORCED_ON_CHAIN_MESSAGE.test(message)) {\n return { gating: 'enforced-on-chain', message };\n }\n }\n throw parseAPIError(res, text);\n }\n\n const json = (await res.json()) as SignIntentV3Response;\n return { gating: 'curator-signed', response: json?.responseObject };\n },\n 3,\n 1000,\n opts.timeoutMs,\n isRetryableSignIntentError,\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 referralFees?: SignIntentV3ReferralFee[];\n}> {\n const result = await apiSignIntentV3Raw(request, opts);\n\n if (result.gating === 'enforced-on-chain') {\n // The deposit gates itself, so it needs no curator signature. An empty\n // signature against a deposit that does gate is rejected on-chain.\n return {\n signature: '0x',\n signatureExpiration: 0n,\n };\n }\n\n const { response } = result;\n const sig = response?.signedIntent as `0x${string}` | undefined;\n const expStr = response?.intentData?.signatureExpiration ?? response?.signatureExpiration;\n const preIntentHookData = response?.intentData?.preIntentHookData ?? response?.preIntentHookData;\n const referralFees = response?.intentData?.referralFees ?? response?.referralFees;\n if (!sig || !expStr) throw new Error('/v3/sign missing signature or expiration');\n return {\n signature: sig,\n signatureExpiration: BigInt(expStr),\n preIntentHookData: preIntentHookData as `0x${string}`,\n referralFees,\n };\n}\n","const DEFAULT_ATTESTATION_PROXY_URL = 'https://attestation-service-proxy.up.railway.app';\n\nexport type AttestationTransport = {\n fetch: typeof fetch;\n getActiveBaseUrl: () => string;\n};\n\nexport type AttestationTransportOptions = {\n fallbackUrls?: readonly string[] | null;\n fetch?: typeof fetch;\n};\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function normalizeAttestationBaseUrl(\n value: string | null | undefined,\n label: string,\n): string {\n const normalized = normalizeOptionalString(value)?.replace(/\\/+$/u, '');\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction resolveFallbackUrls(\n primaryBaseUrl: string,\n fallbackUrls?: readonly string[] | null,\n): string[] {\n const rawFallbackUrls = fallbackUrls == null ? [DEFAULT_ATTESTATION_PROXY_URL] : fallbackUrls;\n const normalized = rawFallbackUrls\n .map((url) => normalizeOptionalString(url)?.replace(/\\/+$/u, '') ?? null)\n .filter((url): url is string => Boolean(url));\n\n return Array.from(new Set(normalized)).filter((url) => url !== primaryBaseUrl);\n}\n\nfunction resolveFetch(requestFetch?: typeof fetch): typeof fetch {\n if (requestFetch) {\n return requestFetch;\n }\n\n if (typeof globalThis.fetch !== 'function') {\n throw new Error('fetch is not available in this runtime.');\n }\n\n return globalThis.fetch.bind(globalThis);\n}\n\nfunction inputUrl(input: RequestInfo | URL): URL | null {\n try {\n if (typeof input === 'string' || input instanceof URL) {\n return new URL(input);\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return new URL(input.url);\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction rewriteInputBaseUrl(\n input: RequestInfo | URL,\n primaryBaseUrl: string,\n targetBaseUrl: string,\n): RequestInfo | URL {\n const url = inputUrl(input);\n if (!url) {\n return input;\n }\n\n const primaryUrl = new URL(primaryBaseUrl);\n const targetUrl = new URL(targetBaseUrl);\n if (url.origin === primaryUrl.origin) {\n url.protocol = targetUrl.protocol;\n url.host = targetUrl.host;\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return new Request(url.toString(), input.clone());\n }\n\n return url.toString();\n}\n\nexport function createAttestationTransport(\n primaryBaseUrl: string,\n options: AttestationTransportOptions = {},\n): AttestationTransport {\n const requestFetch = resolveFetch(options.fetch);\n const fallbackUrls = resolveFallbackUrls(primaryBaseUrl, options.fallbackUrls);\n let activeBaseUrl = primaryBaseUrl;\n\n const transportFetch: typeof fetch = async (input, init) => {\n const attemptInput =\n activeBaseUrl === primaryBaseUrl\n ? input\n : rewriteInputBaseUrl(input, primaryBaseUrl, activeBaseUrl);\n\n try {\n return await requestFetch(attemptInput, init);\n } catch (primaryError) {\n if (activeBaseUrl !== primaryBaseUrl || fallbackUrls.length === 0) {\n throw primaryError;\n }\n\n let fallbackError: unknown = primaryError;\n for (const fallbackUrl of fallbackUrls) {\n try {\n const fallbackInput = rewriteInputBaseUrl(input, primaryBaseUrl, fallbackUrl);\n const response = await requestFetch(fallbackInput, init);\n activeBaseUrl = fallbackUrl;\n return response;\n } catch (error) {\n fallbackError = error;\n }\n }\n\n throw fallbackError;\n }\n };\n\n return {\n fetch: transportFetch,\n getActiveBaseUrl: () => activeBaseUrl,\n };\n}\n","import {\n createEncryptedBuyerTeeSessionMaterial as createEncryptedBuyerTeeSessionMaterialWithAttestation,\n type CreateEncryptedBuyerTeeSessionMaterialParams,\n createEncryptedSellerCredentialUpload,\n} from '@zkp2p/zkp2p-attestation';\n\nimport { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\nimport type {\n AttestationServiceSellerCredentialUploadResponse,\n AttestationServiceIdentityResponse,\n AttestationServiceSellerVerifyResponse,\n IdentityAttestationRequestBody,\n BuyerTeeSessionMaterialEncryptionInput,\n BuyerTeeVerifyPaymentBody,\n SellerCredentialAttestationRuntime,\n SellerCredentialUploadInput,\n SellerCredentialUploadPlatform,\n WiseCredentialUploadInput,\n} from '../types';\nimport {\n createAttestationTransport,\n normalizeAttestationBaseUrl,\n type AttestationTransport,\n} from './attestationTransport';\n\ntype AttestationRequestOptions = {\n fallbackUrls?: readonly string[] | null;\n};\n\nconst isAttestationMaterialTimeout = (error: unknown): error is Error & { code: 'TIMEOUT' } =>\n error instanceof Error && 'code' in error && error.code === 'TIMEOUT';\n\nfunction headers() {\n return { 'Content-Type': 'application/json' } as const;\n}\n\ntype PayeeBoundSellerCredentialUploadInput = Extract<\n SellerCredentialUploadInput,\n { payeeId: string }\n>;\n\nfunction isPayeeBoundSellerCredentialUploadInput(\n payload: SellerCredentialUploadInput,\n): payload is PayeeBoundSellerCredentialUploadInput {\n return typeof (payload as { payeeId?: unknown }).payeeId === 'string';\n}\n\nfunction isWiseCredentialUploadInput(\n payload: SellerCredentialUploadInput,\n): payload is WiseCredentialUploadInput {\n return (\n typeof (payload as { sessionMaterial?: { apiToken?: unknown } }).sessionMaterial?.apiToken ===\n 'string'\n );\n}\n\nasync function createEncryptedSellerCredentialUploadForPlatform({\n attestationServiceUrl,\n attestationTransport,\n cryptoRuntime,\n payload,\n platform,\n timeoutMs,\n}: {\n attestationTransport: AttestationTransport;\n attestationServiceUrl: string;\n cryptoRuntime?: Omit<SellerCredentialAttestationRuntime, 'fetch'>;\n payload: SellerCredentialUploadInput;\n platform: SellerCredentialUploadPlatform;\n timeoutMs?: number;\n}): Promise<string> {\n try {\n if (platform === 'wise') {\n if (!isWiseCredentialUploadInput(payload)) {\n throw new Error('apiToken is required for wise seller credential uploads');\n }\n\n return await createEncryptedSellerCredentialUpload({\n attestationServiceUrl,\n platform: 'wise',\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n sessionMaterial: payload.sessionMaterial,\n ...(typeof timeoutMs === 'number' ? { timeoutMs } : {}),\n fetch: attestationTransport.fetch,\n ...(cryptoRuntime?.subtle ? { subtle: cryptoRuntime.subtle } : {}),\n ...(cryptoRuntime?.getRandomValues\n ? { getRandomValues: cryptoRuntime.getRandomValues }\n : {}),\n });\n }\n\n if (!isPayeeBoundSellerCredentialUploadInput(payload)) {\n throw new Error(`payeeId is required for ${platform} seller credential uploads`);\n }\n\n return await createEncryptedSellerCredentialUpload({\n attestationServiceUrl,\n platform,\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n payeeId: payload.payeeId,\n sessionMaterial: payload.sessionMaterial,\n ...(typeof timeoutMs === 'number' ? { timeoutMs } : {}),\n fetch: attestationTransport.fetch,\n ...(cryptoRuntime?.subtle ? { subtle: cryptoRuntime.subtle } : {}),\n ...(cryptoRuntime?.getRandomValues ? { getRandomValues: cryptoRuntime.getRandomValues } : {}),\n });\n } catch (error) {\n if (isAttestationMaterialTimeout(error)) {\n throw new NetworkError(error.message, { cause: error });\n }\n throw error;\n }\n}\n\nexport async function apiVerifyBuyerTeePayment(\n payload: BuyerTeeVerifyPaymentBody,\n attestationServiceUrl: string,\n platform: string,\n actionType: string,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceSellerVerifyResponse> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = `/buyer/verify/${encodeURIComponent(platform)}/${encodeURIComponent(\n actionType,\n )}`;\n const baseUrl = normalizeAttestationBaseUrl(attestationServiceUrl, 'Attestation Service URL');\n const attestationTransport = createAttestationTransport(baseUrl, {\n fallbackUrls: options.fallbackUrls,\n });\n res = await attestationTransport.fetch(`${baseUrl}${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: `/buyer/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\nexport async function apiRequestIdentityAttestation(\n payload: IdentityAttestationRequestBody,\n attestationServiceUrl: string,\n platform: string,\n actionType: string,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceIdentityResponse> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = '/identity';\n const baseUrl = normalizeAttestationBaseUrl(attestationServiceUrl, 'Attestation Service URL');\n const attestationTransport = createAttestationTransport(baseUrl, {\n fallbackUrls: options.fallbackUrls,\n });\n res = await attestationTransport.fetch(`${baseUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify({\n platform,\n actionType,\n callerAddress: payload.callerAddress,\n encryptedSessionMaterial: payload.encryptedSessionMaterial,\n params: payload.params,\n }),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: '/identity',\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\nexport async function createEncryptedBuyerTeeSessionMaterial({\n actionType,\n attestationServiceFallbackUrls,\n attestationRuntime,\n attestationServiceUrl,\n platform,\n sessionMaterial,\n timeoutMs,\n}: BuyerTeeSessionMaterialEncryptionInput): Promise<string> {\n const normalizedAttestationServiceUrl = normalizeAttestationBaseUrl(\n attestationServiceUrl,\n 'Attestation Service URL',\n );\n const attestationTransport = createAttestationTransport(normalizedAttestationServiceUrl, {\n fallbackUrls: attestationServiceFallbackUrls,\n ...(attestationRuntime?.fetch ? { fetch: attestationRuntime.fetch } : {}),\n });\n const params = {\n actionType,\n attestationServiceUrl: normalizedAttestationServiceUrl,\n platform,\n sessionMaterial,\n ...(timeoutMs == null ? {} : { timeoutMs }),\n fetch: attestationTransport.fetch,\n ...(attestationRuntime?.subtle ? { subtle: attestationRuntime.subtle } : {}),\n ...(attestationRuntime?.getRandomValues\n ? { getRandomValues: attestationRuntime.getRandomValues }\n : {}),\n } as unknown as CreateEncryptedBuyerTeeSessionMaterialParams;\n\n return createEncryptedBuyerTeeSessionMaterialWithAttestation(params);\n}\n\nexport async function apiCreateSellerCredentialBundle(\n payload: SellerCredentialUploadInput,\n attestationServiceUrl: string,\n platform: SellerCredentialUploadPlatform,\n timeoutMs?: number,\n attestationRuntime?: SellerCredentialAttestationRuntime,\n options: AttestationRequestOptions = {},\n): Promise<AttestationServiceSellerCredentialUploadResponse> {\n return withRetry(\n async () => {\n const normalizedAttestationServiceUrl = normalizeAttestationBaseUrl(\n attestationServiceUrl,\n 'Attestation Service URL',\n );\n const attestationTransport = createAttestationTransport(normalizedAttestationServiceUrl, {\n fallbackUrls: options.fallbackUrls,\n ...(attestationRuntime?.fetch ? { fetch: attestationRuntime.fetch } : {}),\n });\n const encryptedUpload = await createEncryptedSellerCredentialUploadForPlatform({\n attestationServiceUrl: normalizedAttestationServiceUrl,\n attestationTransport,\n cryptoRuntime: {\n subtle: attestationRuntime?.subtle,\n getRandomValues: attestationRuntime?.getRandomValues,\n },\n payload,\n platform,\n timeoutMs,\n });\n\n let res: Response;\n try {\n const endpoint = `/seller/credentials/${encodeURIComponent(platform)}`;\n const activeBaseUrl = attestationTransport.getActiveBaseUrl();\n res = await attestationTransport.fetch(`${activeBaseUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify({\n encryptedUpload,\n ...(payload.callerAddress ? { callerAddress: payload.callerAddress } : {}),\n }),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: `/seller/credentials/${platform}`,\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 3,\n 1000,\n timeoutMs,\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 const metadata =\n typeof resp.metadata === 'string' && resp.metadata.length > 0\n ? (resp.metadata as Address)\n : '0x';\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, metadata]],\n ) as Address;\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' | 'getQuotesBestByPlatform' | '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 } from 'viem';\n\n// Unversioned base; callers/providers must append /v1 or /v2 in adapters\nexport const DEFAULT_BASE_API_URL = 'https://api.zkp2p.xyz';\nexport const DEFAULT_WITNESS_URL = 'https://witness-proxy.zkp2p.xyz';\n\n// Enabled payment platforms (verifiers) for enrichment and platform-aware logic\nexport const ENABLED_PLATFORMS = [\n 'venmo',\n 'revolut',\n 'cashapp',\n 'wise',\n 'mercadopago',\n 'zelle',\n 'paypal',\n 'monzo',\n] as const;\n\nexport type EnabledPlatform = (typeof ENABLED_PLATFORMS)[number];\n\ntype PlatformAddresses = { [P in EnabledPlatform]: Address };\n\nexport type ContractSet = PlatformAddresses & {\n usdc: Address;\n escrow: Address;\n gatingService: Address;\n zkp2pWitnessSigner: Address;\n};\n\ntype Contracts = {\n [chainId: number]:\n | ContractSet\n | {\n production: ContractSet;\n staging: ContractSet;\n };\n};\n\nexport const DEPLOYED_ADDRESSES: Contracts = {\n 8453: {\n production: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n\n // escrow + verifiers\n escrow: '0x777777779d229cdF3110e9de47943791c26300Ef',\n\n // Processor names to deployed addresses\n venmo: '0x9a733B55a875D0DB4915c6B36350b24F8AB99dF5',\n revolut: '0xAA5A1B62B01781E789C900d616300717CD9A41aB',\n cashapp: '0x76D33A33068D86016B806dF02376dDBb23Dd3703',\n wise: '0xFF0149799631D7A5bdE2e7eA9b306c42b3d9a9ca',\n mercadopago: '0xf2AC5be14F32Cbe6A613CFF8931d95460D6c33A3',\n zelle: '0x431a078A5029146aAB239c768A615CD484519aF7',\n paypal: '0x03d17E9371C858072E171276979f6B44571C5DeA',\n monzo: '0x0dE46433bD251027f73eD8f28E01eF05DA36a2E0',\n\n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n staging: {\n // external contracts\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n\n // escrow + verifiers\n escrow: '0xC8cd114C6274Ef1066840337E7678BC9731BEa68',\n\n // Processor names to deployed addresses\n venmo: '0xCE6454f272127ba69e8C8128B92F2388Ca343257',\n revolut: '0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b',\n cashapp: '0xdDB9d452180398F456Fe89A43Df9C65B19756CEa',\n wise: '0x79F35E2f65ff917BE35686d34932C8Ef5a30631f',\n mercadopago: '0xA2d54F983B8201c7b276C9705641C49C2FBD1A36',\n zelle: '0x0Ed3c3DB9CF8458e5D9991712552539675D2C896',\n paypal: '0xB07764999679a9136d6853a5D4c70449afbfc2f8',\n monzo: '0x179792F99C0eFBFa06c3F6747989a96c58544f6F',\n\n // offchain services\n gatingService: '0x396D31055Db28C0C6f36e8b36f18FE7227248a97',\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n },\n 31337: {\n usdc: '0x5FbDB2315678afecb367f032d93F642f64180aa3',\n escrow: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512',\n venmo: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',\n revolut: '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853',\n cashapp: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788',\n wise: '0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82',\n mercadopago: '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1',\n zelle: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c',\n paypal: '0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E',\n monzo: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042',\n\n // offchain services\n gatingService: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', // Hardhat 0\n zkp2pWitnessSigner: '0x0636c417755E3ae25C6c166D181c0607F4C572A3',\n },\n};\n\nexport function getPlatformAddressMap(addresses: ContractSet): Record<EnabledPlatform, Address> {\n const entries = ENABLED_PLATFORMS.map((p) => [p, addresses[p]] as const);\n return Object.fromEntries(entries) as Record<EnabledPlatform, Address>;\n}\n\nexport function platformFromVerifierAddress(\n addresses: ContractSet,\n verifierAddress: string,\n): EnabledPlatform | null {\n if (!verifierAddress) return null;\n const target = verifierAddress.toLowerCase();\n for (const p of ENABLED_PLATFORMS) {\n const addr = addresses[p]?.toLowerCase?.();\n if (addr && addr === target) return p;\n }\n return null;\n}\n","{\n \"generatedAt\": \"2026-08-27T23:27:33.987Z\",\n \"network\": \"base\",\n \"feeds\": [\n {\n \"pair\": \"AUD/USD\",\n \"feed\": \"0x46e51B8cA41d709928EdA9Ae43e42193E6CDf229\",\n \"decimals\": 8\n },\n {\n \"pair\": \"BRL/USD\",\n \"feed\": \"0x0b0E64c05083FdF9ED7C5D3d8262c4216eFc9394\",\n \"decimals\": 8\n },\n {\n \"pair\": \"CAD/USD\",\n \"feed\": \"0xA840145F87572E82519d578b1F36340368a25D5d\",\n \"decimals\": 8\n },\n {\n \"pair\": \"CHF/USD\",\n \"feed\": \"0x3A1d6444fb6a402470098E23DaD0B7E86E14252F\",\n \"decimals\": 8\n },\n {\n \"pair\": \"EUR/USD\",\n \"feed\": \"0xc91D87E81faB8f93699ECf7Ee9B44D11e1D53F0F\",\n \"decimals\": 8\n },\n {\n \"pair\": \"GBP/USD\",\n \"feed\": \"0xCceA6576904C118037695eB71195a5425E69Fa15\",\n \"decimals\": 8\n },\n {\n \"pair\": \"IDR/USD\",\n \"feed\": \"0x05A6cF213EcC5501A11a08EBefA4A8a60313ef97\",\n \"decimals\": 8\n },\n {\n \"pair\": \"MXN/USD\",\n \"feed\": \"0x9e8Ee77c76d4fa41306056D1C3196AF5da1600bd\",\n \"decimals\": 8\n },\n {\n \"pair\": \"NGN/USD\",\n \"feed\": \"0xdfbb5Cbc88E382de007bfe6CE99C388176ED80aD\",\n \"decimals\": 8\n },\n {\n \"pair\": \"NZD/USD\",\n \"feed\": \"0x06bdFe07E71C476157FC025d3cCD4BBe08e83EF9\",\n \"decimals\": 8\n },\n {\n \"pair\": \"PHP/USD\",\n \"feed\": \"0x0396000dc82bfAEe746A9Ac6dC69dAd3223Ca9c6\",\n \"decimals\": 8\n },\n {\n \"pair\": \"SGD/USD\",\n \"feed\": \"0x81575495532fB311Efc5C993B612564274F0949b\",\n \"decimals\": 8\n },\n {\n \"pair\": \"TRY/USD\",\n \"feed\": \"0x29413773e7CD4Dfd6Ad89a50887877b88a6C592C\",\n \"decimals\": 8\n },\n {\n \"pair\": \"ZAR/USD\",\n \"feed\": \"0x2ecc8A8B370fC6a217166b2782a35339bEBEe98B\",\n \"decimals\": 8\n }\n ]\n}","import chainlinkFeeds from '@zkp2p/contracts-v2/oracleFeeds/chainlink.json' with { type: '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 alipay: { actionType: 'transfer_alipay', actionPlatform: 'alipay' },\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')\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 if (normalized === 'zelle') {\n throw new Error(\n 'Generic Zelle buyer TEE fulfillment requires a bank-specific actionType override.',\n );\n }\n const config = PLATFORM_ATTESTATION_CONFIG[normalized];\n if (!config) {\n throw new Error(`Unknown payment platform: ${platformName}`);\n }\n return config;\n}\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { EscrowContractContext, OrchestratorContractContext } from './ContractRouter';\nimport { ZERO_ADDRESS, parseRawDepositId, resolveAbiFunctionName } from './clientUtils';\nimport { apiSignIntentV3 } from '../adapters/verification';\nimport { apiVerifyBuyerTeePayment } from '../adapters/attestation';\nimport { ValidationError } from '../errors';\nimport {\n encodeAddressAsBytes,\n encodePaymentAttestation,\n encodeVerifyPaymentData,\n} from '../utils/encode';\nimport {\n assertValidReferrerFeeConfig,\n referrerFeeConfigToPreciseUnits,\n isValidReferrerFeeRecipient,\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 { IndexerDepositService } from '../indexer/service';\nimport type {\n BuyerTeePaymentProofInput,\n FulfillIntentAttestationResponse,\n PreparedTransactionWithAbi,\n TxOverrides,\n} from '../types';\nimport type { PV_IntentView, PV_PaymentMethodData } from '../utils/protocolViewerParsers';\n\ntype FulfillIntentInputs = {\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\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\nconst GENERIC_ZELLE_ATTESTATION_ACTION_TYPES = new Set([\n 'transfer_zelle_bofa',\n 'transfer_zelle_chase',\n 'transfer_zelle_citi',\n]);\n\nfunction hasBuyerTeeRouteOverrides(\n buyerTeeProof: BuyerTeePaymentProofInput,\n): buyerTeeProof is BuyerTeePaymentProofInput & {\n actionPlatform: string;\n actionType: string;\n} {\n return Boolean(buyerTeeProof.actionPlatform && buyerTeeProof.actionType);\n}\n\nfunction resolveBuyerTeeAttestationRoute(\n platformName: string,\n buyerTeeProof: BuyerTeePaymentProofInput,\n): { actionPlatform: string; actionType: string } {\n const normalizedPlatformName = platformName.toLowerCase();\n\n if (normalizedPlatformName === 'zelle') {\n if (\n buyerTeeProof.actionPlatform !== 'zelle' ||\n !buyerTeeProof.actionType ||\n !GENERIC_ZELLE_ATTESTATION_ACTION_TYPES.has(buyerTeeProof.actionType)\n ) {\n throw new Error(\n 'Generic Zelle buyer TEE fulfillment requires actionPlatform \"zelle\" and a bank-specific transfer_zelle_* actionType.',\n );\n }\n\n return {\n actionPlatform: buyerTeeProof.actionPlatform,\n actionType: buyerTeeProof.actionType,\n };\n }\n\n if (hasBuyerTeeRouteOverrides(buyerTeeProof)) {\n return {\n actionPlatform: buyerTeeProof.actionPlatform,\n actionType: buyerTeeProof.actionType,\n };\n }\n\n const platformConfig = resolvePlatformAttestationConfig(platformName);\n return {\n actionPlatform: platformConfig.actionPlatform,\n actionType: platformConfig.actionType,\n };\n}\n\ntype FulfillIntentParams = {\n intentHash: `0x${string}`;\n proof: BuyerTeePaymentProofInput;\n timestampBufferMs?: string;\n attestationServiceFallbackUrls?: string[];\n attestationServiceUrl?: string;\n orchestratorAddress?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n precomputedAttestation?: {\n paymentProof: Hex;\n verificationData: Hex;\n };\n callbacks?: {\n onAttestationStart?: () => void;\n onAttestationComplete?: (attestation: FulfillIntentAttestationResponse) => 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 }) => EscrowContractContext;\n resolveOrchestratorContext: (options?: {\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n intentHash?: `0x${string}`;\n }) => Promise<OrchestratorContractContext>;\n resolveEscrowAddressOrThrow: (\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n methodName: string,\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: (\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ) => Promise<FulfillIntentInputs>;\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 getApiHeaders: () => Record<string, string> | undefined;\n getApiTimeoutMs: () => number;\n getProtocolViewerAddress: () => Address | undefined;\n getProtocolViewerAbi: () => Abi | undefined;\n getIndexerClient: () => IndexerClient;\n getIndexerService: () => IndexerDepositService;\n getEscrowV2Address: () => Address | undefined;\n getOrchestratorV2Address: () => Address | undefined;\n getOrchestratorV3Address: () => Address | undefined;\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 escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\n depositId: params.depositId,\n });\n const currentOrchestratorV3 = this.config.getOrchestratorV3Address();\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress ?? currentOrchestratorV3,\n escrowAddress: escrowContext.address,\n });\n const currentEscrow = this.config.getEscrowV2Address();\n if (\n (currentEscrow && escrowContext.address.toLowerCase() !== currentEscrow.toLowerCase()) ||\n !currentOrchestratorV3 ||\n orchestratorContext.address.toLowerCase() !== currentOrchestratorV3.toLowerCase()\n ) {\n throw new Error(\n 'signalIntent is only supported on the current EscrowV2 / OrchestratorV3 deployment',\n );\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 let 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 if ((gatingServiceSignature === undefined || signatureExpiration === undefined) && baseApiUrl) {\n const apiOpts = {\n baseApiUrl,\n timeoutMs: this.config.getApiTimeoutMs(),\n headers: this.config.getApiHeaders(),\n };\n\n const response = await apiSignIntentV3(\n {\n processorName: params.processorName,\n payeeDetails: params.payeeDetails,\n depositId: depositId.toString(),\n amount: amount.toString(),\n toAddress: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate: conversionRate.toString(),\n chainId: this.config.getChainId().toString(),\n orchestratorAddress: orchestratorContext.address,\n escrowAddress: escrowContext.address,\n callerAddress: this.config.getWalletClient().account!.address,\n referralFees: referralFees.map((referralFee) => ({\n recipient: referralFee.recipient,\n fee: referralFee.fee.toString(),\n })),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n },\n apiOpts,\n );\n\n gatingServiceSignature = response.signature;\n signatureExpiration = response.signatureExpiration;\n preIntentHookData = response.preIntentHookData ?? preIntentHookData;\n if (response.referralFees !== undefined) {\n referralFees = response.referralFees.map((referralFee) => {\n if (!isValidReferrerFeeRecipient(referralFee.recipient)) {\n throw new Error('/v3/sign returned invalid referral fee recipient');\n }\n\n let fee: bigint;\n try {\n fee = BigInt(referralFee.fee);\n } catch {\n throw new Error('/v3/sign returned non-integer referral fee value');\n }\n\n return {\n recipient: referralFee.recipient as Address,\n fee,\n };\n });\n }\n }\n\n if (gatingServiceSignature === undefined || signatureExpiration === undefined) {\n throw new Error('Missing gatingServiceSignature/signatureExpiration');\n }\n\n const args = [\n {\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'\n ? signatureExpiration\n : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ZERO_ADDRESS) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n referralFees,\n preIntentHookData: (preIntentHookData ?? '0x') as `0x${string}`,\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 });\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 });\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: params.orchestratorAddress,\n escrowAddress,\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 });\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\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 );\n const orchestratorContext = await this.config.host.resolveOrchestratorContext({\n orchestratorAddress: options?.orchestratorAddress,\n escrowAddress,\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 });\n const precomputed = params.precomputedAttestation;\n let paymentProof: Hex;\n let verificationData: Hex;\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 buyerTeeProof = parseBuyerTeePaymentProofInput(params.proof);\n const attestationServiceUrl =\n params.attestationServiceUrl ?? this.defaultAttestationService();\n const inputs = await this.config.host.getFulfillIntentInputs(intentHash, {\n orchestratorAddress: orchestratorContext.address,\n });\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 attestationRoute = resolveBuyerTeeAttestationRoute(platformName, buyerTeeProof);\n\n const 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\n const attestation = await apiVerifyBuyerTeePayment(\n {\n encryptedSessionMaterial: buyerTeeProof.encryptedSessionMaterial,\n params: buyerTeeProof.params,\n chainId: this.config.getChainId(),\n intent,\n },\n attestationServiceUrl,\n attestationRoute.actionPlatform,\n attestationRoute.actionType,\n { fallbackUrls: params.attestationServiceFallbackUrls },\n );\n paymentProof = encodePaymentAttestation(attestation);\n verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(attestation.responseObject.signer),\n });\n params.callbacks?.onAttestationComplete?.(attestation);\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(\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ): Promise<FulfillIntentInputs> {\n // ProtocolViewer covers both configured orchestrators sharing EscrowV2.\n // Unknown prior-era orchestrators still go straight to the indexer.\n const isProtocolViewerOrchestrator =\n !options?.orchestratorAddress ||\n options.orchestratorAddress.toLowerCase() ===\n this.config.getOrchestratorV2Address()?.toLowerCase() ||\n options.orchestratorAddress.toLowerCase() ===\n this.config.getOrchestratorV3Address()?.toLowerCase();\n\n if (isProtocolViewerOrchestrator) {\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 {\n // PV read failed, fall through to indexer.\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 status?: string | null;\n isExpired?: boolean | 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 status\n isExpired\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.status && record.status !== 'SIGNALED') {\n throw new ValidationError(\n `Intent not found or no longer fulfillable (status: ${record.status})`,\n 'intentHash',\n { intentHash, status: record.status },\n );\n }\n if (record.isExpired) {\n throw new ValidationError('Intent expired and can no longer be fulfilled', 'intentHash', {\n intentHash,\n });\n }\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 if (!deposit) {\n throw new Error(`Deposit ${record.depositId} not found on indexer for intent ${intentHash}`);\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 isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isBuyerTeeParams(value: unknown): value is BuyerTeePaymentProofInput['params'] {\n return (\n isRecord(value) &&\n Object.values(value).every(\n (entry) =>\n typeof entry === 'string' || typeof entry === 'number' || typeof entry === 'boolean',\n )\n );\n}\n\nfunction parseBuyerTeePaymentProofInput(proof: unknown): BuyerTeePaymentProofInput {\n if (!isRecord(proof) || proof.proofType !== 'buyerTee') {\n throw new Error(\n 'Buyer TEE proof input is required; legacy proof inputs are no longer supported.',\n );\n }\n\n if (typeof proof.encryptedSessionMaterial !== 'string' || !isBuyerTeeParams(proof.params)) {\n throw new Error('Buyer TEE proof requires encryptedSessionMaterial and params.');\n }\n\n const parsed: BuyerTeePaymentProofInput = {\n proofType: 'buyerTee',\n encryptedSessionMaterial: proof.encryptedSessionMaterial,\n params: proof.params,\n };\n\n if (typeof proof.actionType === 'string') {\n parsed.actionType = proof.actionType;\n }\n\n if (typeof proof.actionPlatform === 'string') {\n parsed.actionPlatform = proof.actionPlatform;\n }\n\n return parsed;\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","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 ProtocolViewerIntentResult = {\n view: PV_IntentView;\n context?: ProtocolViewerContext;\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.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 const seenEscrows = new Set<string>();\n const uniqueEscrowContexts = protocolViewerContexts.filter((context) => {\n const key = context.escrow.toLowerCase();\n if (seenEscrows.has(key)) return false;\n seenEscrows.add(key);\n return true;\n });\n return tryContexts(\n uniqueEscrowContexts,\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 unknown[];\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 unknown[];\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 unknown[];\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 unknown[];\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 unknown[];\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 getPvIntentWithContext(intentHash: `0x${string}`): Promise<ProtocolViewerIntentResult> {\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 { view: parsed, context };\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 { view: 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 async getPvIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n return (await this.getPvIntentWithContext(intentHash)).view;\n }\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 whitelistHookAddress\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 amount\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: { _ilike: $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 PROFIT_SNAPSHOTS_BY_DEPOSITS_QUERY = /* GraphQL */ `\n query GetProfitSnapshotsByDeposits($depositIds: [String!]) {\n profitSnapshots: MakerProfitSnapshot(\n where: { depositId: { _in: $depositIds } }\n order_by: { createdAt: desc }\n ) {\n id\n chainId\n maker\n intentId\n depositId\n fiatCurrency\n quoteConversionRate\n oracleRate\n spreadBps\n amount\n notionalFiatUsdCents\n feeUsd\n realizedProfitUsdCents\n priceSnapshotId\n status\n createdAt\n updatedAt\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\n/**\n * Hard-cut dispute-protection staking read model.\n *\n * The effective stake owner is supplied by the caller's authoritative\n * onchain read so the three current-state account rows can be fetched in one\n * request. The adapter verifies that owner against TakerStakeState before\n * associating the returned StakeAccountState with the taker.\n */\nexport const STAKING_STATE_QUERY = /* GraphQL */ `\n query StakingState(\n $takerStateId: String!\n $stakeAccountId: String!\n $claimAccountId: String!\n $vaultConfigId: String!\n $chainId: Int!\n $vault: String!\n $taker: String!\n $policy: String!\n ) {\n TakerStakeState_by_pk(id: $takerStateId) {\n taker\n stakeOwner\n selectedStakeOwner\n selectionAuthorized\n updatedAtBlockNumber\n updatedAt\n }\n StakeAccountState_by_pk(id: $stakeAccountId) {\n stakeOwner\n totalStake\n lockedStake\n freeStake\n updatedAtBlockNumber\n updatedAt\n }\n ClaimAccountState_by_pk(id: $claimAccountId) {\n beneficiary\n claimableAmount\n updatedAtBlockNumber\n updatedAt\n }\n TakerStakeAuthorization(\n where: { chainId: { _eq: $chainId }, vaultAddress: { _eq: $vault }, taker: { _eq: $taker } }\n order_by: { updatedAt: desc }\n ) {\n stakeOwner\n authorized\n updatedAtBlockNumber\n updatedAt\n }\n DisputeProtectionRiskWindow(\n where: { chainId: { _eq: $chainId }, policyAddress: { _eq: $policy } }\n order_by: { paymentMethod: asc }\n ) {\n paymentMethod\n riskWindow\n updatedAt\n }\n StakeVaultConfig_by_pk(id: $vaultConfigId) {\n controller\n pendingController\n pendingControllerValidAt\n updatedAtBlockNumber\n updatedAt\n }\n chain_metadata(where: { chain_id: { _eq: $chainId } }, limit: 1) {\n chain_id\n latest_processed_block\n }\n }\n`;\n\nexport const TAKER_STAKE_AUTHORIZATIONS_QUERY = /* GraphQL */ `\n query TakerStakeAuthorizations($where: TakerStakeAuthorization_bool_exp!, $limit: Int!) {\n TakerStakeAuthorization(where: $where, order_by: [{ id: asc }], limit: $limit) {\n id\n chainId\n vaultAddress\n taker\n stakeOwner\n authorized\n updatedAtBlockNumber\n updatedAt\n }\n }\n`;\n\nexport const STAKE_LOCKS_QUERY = /* GraphQL */ `\n query StakeLocks($where: StakeLock_bool_exp!, $limit: Int!) {\n StakeLock(where: $where, order_by: [{ id: asc }], limit: $limit) {\n id\n chainId\n vaultAddress\n lockId\n stakeOwner\n initialAmount\n currentAmount\n maturesAt\n status\n unlockedAmount\n claimedAmount\n createdAt\n updatedAtBlockNumber\n updatedAt\n }\n }\n`;\n\nexport const STAKE_ACTIVITY_QUERY = /* GraphQL */ `\n query StakeActivityPage($where: StakeActivity_bool_exp!, $limit: Int!) {\n StakeActivity(\n where: $where\n order_by: [{ blockNumber: asc }, { logIndex: asc }, { id: asc }]\n limit: $limit\n ) {\n id\n chainId\n vaultAddress\n stakeOwner\n taker\n beneficiary\n kind\n lockId\n counterparty\n amount\n previousAmount\n stakeBalanceAfter\n lockedStakeAfter\n freeStakeAfter\n claimableAfter\n maturesAt\n blockNumber\n logIndex\n timestamp\n }\n }\n`;\n\nexport const DISPUTE_PROTECTION_INTENTS_QUERY = /* GraphQL */ `\n query FinalizedDisputeProtectionIntents($where: DisputeProtectionIntent_bool_exp!, $limit: Int!) {\n DisputeProtectionIntent(\n where: $where\n order_by: [{ disputedAtBlockNumber: asc }, { disputedAtLogIndex: asc }, { id: asc }]\n limit: $limit\n ) {\n id\n chainId\n policyAddress\n intentHash\n status\n stakeOwner\n depositor\n taker\n paymentMethod\n amount\n riskWindow\n releaseEligibleAt\n releaseAmount\n isManualRelease\n compensatedAmount\n disputeId\n openedAt\n openedTxHash\n cancelledAt\n cancelledTxHash\n settledAt\n settledTxHash\n releasedAt\n releasedTxHash\n disputedAt\n disputedTxHash\n disputedAtBlockNumber\n disputedAtLogIndex\n updatedAt\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\ninterface ConvertLiquidityOptions {\n includePrivateOrderbooks?: boolean;\n}\n\nexport function convertDepositsForLiquidity(\n deposits: DepositWithRelations[],\n chainId: number,\n escrowAddress: string,\n options: ConvertLiquidityOptions = {},\n): EscrowDepositView[] {\n const { includePrivateOrderbooks = false } = options;\n return deposits\n .filter(\n (d) =>\n d.depositor &&\n d.depositor.toLowerCase() !== ZERO &&\n (includePrivateOrderbooks ||\n normalizeAddress(d.whitelistHookAddress).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","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 { 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 PROFIT_SNAPSHOTS_BY_DEPOSITS_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 MakerProfitSnapshotEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\nimport { isSchemaCompatibilityError } from './schemaCompatibility';\nimport { logger } from '../utils/logger';\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 }];\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 rateManagerId?: string;\n statuses?: IntentStatus[];\n limit?: number;\n offset?: number;\n orderByField?: 'signalTimestamp' | 'fulfillTimestamp';\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.rateManagerId) where.rateManagerId = { _ilike: params.rateManagerId };\n if (params.statuses?.length) where.status = { _in: params.statuses };\n if (!Object.keys(where).length) return [];\n const orderByField = params.orderByField ?? 'signalTimestamp';\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: [{ [orderByField]: '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 fetchIntentsByRateManager(\n rateManagerId: string,\n statuses?: IntentStatus[],\n ): Promise<IntentEntity[]> {\n const normalizedRateManagerId = rateManagerId?.trim();\n if (!normalizedRateManagerId) return [];\n\n return this.fetchIntents({\n rateManagerId: normalizedRateManagerId,\n statuses,\n limit: 500,\n orderByField: 'fulfillTimestamp',\n });\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 (error) {\n logger.warn(\n '[sdk] resolvePayeeHash lookup failed; returning null',\n error instanceof Error ? error.message : error,\n );\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 async fetchProfitSnapshotsByDeposits(depositIds: string[]): Promise<MakerProfitSnapshotEntity[]> {\n const normalizedDepositIds = Array.from(\n new Set(\n depositIds\n .map((depositId) => depositId?.trim())\n .filter((depositId): depositId is string => Boolean(depositId)),\n ),\n );\n if (!normalizedDepositIds.length) return [];\n\n try {\n const result = await this.client.query<{\n profitSnapshots?: MakerProfitSnapshotEntity[];\n MakerProfitSnapshot?: MakerProfitSnapshotEntity[];\n }>({\n query: PROFIT_SNAPSHOTS_BY_DEPOSITS_QUERY,\n variables: { depositIds: normalizedDepositIds },\n });\n\n return result.profitSnapshots ?? result.MakerProfitSnapshot ?? [];\n } catch (error) {\n if (!isSchemaCompatibilityError(error)) {\n throw error;\n }\n return [];\n }\n }\n}\n","export const normalizeReferralCode = (code: string): string => code.trim().toUpperCase();\n\nexport const isValidReferralCode = (code: string): boolean =>\n /^[A-Z0-9]{6}$/.test(normalizeReferralCode(code));\n\nexport const REFERRAL_SIGNATURE_DOMAIN = { name: 'ZKP2PReferral', version: '1' } as const;\n\nexport const REFERRAL_SIGNATURE_TYPES = {\n CreateCode: [\n { name: 'wallet', type: 'address' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n RedeemCode: [\n { name: 'wallet', type: 'address' },\n { name: 'code', type: 'string' },\n { name: 'referrer', type: 'address' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n RenameCode: [\n { name: 'wallet', type: 'address' },\n { name: 'oldCode', type: 'string' },\n { name: 'newCode', type: 'string' },\n { name: 'audience', type: 'string' },\n { name: 'issuedAt', type: 'uint256' },\n ],\n} as const;\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 { currencyKeccak256 } from \"../utils/currencyKeccak256\";\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 NOK: \"NOK\",\n MXN: \"MXN\",\n MYR: \"MYR\",\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};\n\nexport type CurrencyType = (typeof Currency)[keyof typeof Currency];\n\nfunction getCurrencies(): string[] {\n return Object.values(Currency);\n}\n\nexport function getCurrencyInfoFromHash(\n currencyCodeOrHash: string,\n): CurrencyData | null {\n return (\n Object.values(currencyInfo).find(\n (currency) =>\n currency.currencyCodeHash === currencyCodeOrHash ||\n currency.currencyCode === currencyCodeOrHash,\n ) ?? null\n );\n}\n\nexport function getCurrencyInfoFromCountryCode(\n countryCode: string,\n): CurrencyData | null {\n return (\n Object.values(currencyInfo).find(\n (currency) => currency.countryCode === countryCode,\n ) ?? null\n );\n}\n\nexport function isSupportedCurrency(currencyCode: string): boolean {\n return Object.values(currencyInfo).some(\n (currency) => currency.currencyCode === currencyCode,\n );\n}\n\nexport const currencies = getCurrencies();\n\ninterface CurrencyData {\n currency: CurrencyType;\n currencyCode: string;\n currencyName: string;\n currencySymbol: string;\n currencyCodeHash: string;\n countryCode: string;\n}\n\nexport const currencyInfo: Record<CurrencyType, CurrencyData> = {\n [Currency.AED]: {\n currency: Currency.AED,\n currencyCode: \"AED\",\n currencyName: \"United Arab Emirates Dirham\",\n currencyCodeHash: currencyKeccak256(\"AED\"),\n currencySymbol: \"د.إ\",\n countryCode: \"ae\",\n },\n [Currency.ARS]: {\n currency: Currency.ARS,\n currencyCode: \"ARS\",\n currencyName: \"Argentine Peso\",\n currencyCodeHash: currencyKeccak256(\"ARS\"),\n currencySymbol: \"$\",\n countryCode: \"ar\",\n },\n [Currency.AUD]: {\n currency: Currency.AUD,\n currencyCode: \"AUD\",\n currencyName: \"Australian Dollar\",\n currencyCodeHash: currencyKeccak256(\"AUD\"),\n currencySymbol: \"A$\",\n countryCode: \"au\",\n },\n [Currency.BRL]: {\n currency: Currency.BRL,\n currencyCode: \"BRL\",\n currencyName: \"Brazilian Real\",\n currencyCodeHash: currencyKeccak256(\"BRL\"),\n currencySymbol: \"R$\",\n countryCode: \"br\",\n },\n [Currency.CAD]: {\n currency: Currency.CAD,\n currencyCode: \"CAD\",\n currencyName: \"Canadian Dollar\",\n currencyCodeHash: currencyKeccak256(\"CAD\"),\n currencySymbol: \"C$\",\n countryCode: \"ca\",\n },\n [Currency.CHF]: {\n currency: Currency.CHF,\n currencyCode: \"CHF\",\n currencyName: \"Swiss Franc\",\n currencyCodeHash: currencyKeccak256(\"CHF\"),\n currencySymbol: \"Fr\",\n countryCode: \"ch\",\n },\n [Currency.CNY]: {\n currency: Currency.CNY,\n currencyCode: \"CNY\",\n currencyName: \"Chinese Yuan\",\n currencyCodeHash: currencyKeccak256(\"CNY\"),\n currencySymbol: \"¥\",\n countryCode: \"cn\",\n },\n [Currency.CZK]: {\n currency: Currency.CZK,\n currencyCode: \"CZK\",\n currencyName: \"Czech Koruna\",\n currencyCodeHash: currencyKeccak256(\"CZK\"),\n currencySymbol: \"Kč\",\n countryCode: \"cz\",\n },\n [Currency.DKK]: {\n currency: Currency.DKK,\n currencyCode: \"DKK\",\n currencyName: \"Danish Krone\",\n currencyCodeHash: currencyKeccak256(\"DKK\"),\n currencySymbol: \"kr\",\n countryCode: \"dk\",\n },\n [Currency.EUR]: {\n currency: Currency.EUR,\n currencyCode: \"EUR\",\n currencyName: \"Euro\",\n currencyCodeHash: currencyKeccak256(\"EUR\"),\n currencySymbol: \"€\",\n countryCode: \"eu\",\n },\n [Currency.GBP]: {\n currency: Currency.GBP,\n currencyCode: \"GBP\",\n currencyName: \"British Pound\",\n currencyCodeHash: currencyKeccak256(\"GBP\"),\n currencySymbol: \"£\",\n countryCode: \"gb\",\n },\n [Currency.HKD]: {\n currency: Currency.HKD,\n currencyCode: \"HKD\",\n currencyName: \"Hong Kong Dollar\",\n currencyCodeHash: currencyKeccak256(\"HKD\"),\n currencySymbol: \"HK$\",\n countryCode: \"hk\",\n },\n [Currency.HUF]: {\n currency: Currency.HUF,\n currencyCode: \"HUF\",\n currencyName: \"Hungarian Forint\",\n currencyCodeHash: currencyKeccak256(\"HUF\"),\n currencySymbol: \"Ft\",\n countryCode: \"hu\",\n },\n [Currency.IDR]: {\n currency: Currency.IDR,\n currencyCode: \"IDR\",\n currencyName: \"Indonesian Rupiah\",\n currencyCodeHash: currencyKeccak256(\"IDR\"),\n currencySymbol: \"Rp\",\n countryCode: \"id\",\n },\n [Currency.INR]: {\n currency: Currency.INR,\n currencyCode: \"INR\",\n currencyName: \"Indian Rupee\",\n currencyCodeHash: currencyKeccak256(\"INR\"),\n currencySymbol: \"₹\",\n countryCode: \"in\",\n },\n [Currency.ILS]: {\n currency: Currency.ILS,\n currencyCode: \"ILS\",\n currencyName: \"Israeli New Shekel\",\n currencyCodeHash: currencyKeccak256(\"ILS\"),\n currencySymbol: \"₪\",\n countryCode: \"il\",\n },\n [Currency.JPY]: {\n currency: Currency.JPY,\n currencyCode: \"JPY\",\n currencyName: \"Japanese Yen\",\n currencyCodeHash: currencyKeccak256(\"JPY\"),\n currencySymbol: \"¥\",\n countryCode: \"jp\",\n },\n [Currency.KES]: {\n currency: Currency.KES,\n currencyCode: \"KES\",\n currencyName: \"Kenyan Shilling\",\n currencyCodeHash: currencyKeccak256(\"KES\"),\n currencySymbol: \"KSh\",\n countryCode: \"ke\",\n },\n [Currency.MXN]: {\n currency: Currency.MXN,\n currencyCode: \"MXN\",\n currencyName: \"Mexican Peso\",\n currencyCodeHash: currencyKeccak256(\"MXN\"),\n currencySymbol: \"$\",\n countryCode: \"mx\",\n },\n [Currency.MYR]: {\n currency: Currency.MYR,\n currencyCode: \"MYR\",\n currencyName: \"Malaysian Ringgit\",\n currencyCodeHash: currencyKeccak256(\"MYR\"),\n currencySymbol: \"RM\",\n countryCode: \"my\",\n },\n [Currency.NOK]: {\n currency: Currency.NOK,\n currencyCode: \"NOK\",\n currencyName: \"Norwegian Krone\",\n currencyCodeHash: currencyKeccak256(\"NOK\"),\n currencySymbol: \"kr\",\n countryCode: \"no\",\n },\n [Currency.NZD]: {\n currency: Currency.NZD,\n currencyCode: \"NZD\",\n currencyName: \"New Zealand Dollar\",\n currencyCodeHash: currencyKeccak256(\"NZD\"),\n currencySymbol: \"NZ$\",\n countryCode: \"nz\",\n },\n [Currency.PHP]: {\n currency: Currency.PHP,\n currencyCode: \"PHP\",\n currencyName: \"Philippine Peso\",\n currencyCodeHash: currencyKeccak256(\"PHP\"),\n currencySymbol: \"₱\",\n countryCode: \"ph\",\n },\n [Currency.PLN]: {\n currency: Currency.PLN,\n currencyCode: \"PLN\",\n currencyName: \"Polish Złoty\",\n currencyCodeHash: currencyKeccak256(\"PLN\"),\n currencySymbol: \"zł\",\n countryCode: \"pl\",\n },\n [Currency.RON]: {\n currency: Currency.RON,\n currencyCode: \"RON\",\n currencyName: \"Romanian Leu\",\n currencyCodeHash: currencyKeccak256(\"RON\"),\n currencySymbol: \"lei\",\n countryCode: \"ro\",\n },\n [Currency.SAR]: {\n currency: Currency.SAR,\n currencyCode: \"SAR\",\n currencyName: \"Saudi Riyal\",\n currencyCodeHash: currencyKeccak256(\"SAR\"),\n currencySymbol: \"﷼\",\n countryCode: \"sa\",\n },\n [Currency.SEK]: {\n currency: Currency.SEK,\n currencyCode: \"SEK\",\n currencyName: \"Swedish Krona\",\n currencyCodeHash: currencyKeccak256(\"SEK\"),\n currencySymbol: \"kr\",\n countryCode: \"se\",\n },\n [Currency.SGD]: {\n currency: Currency.SGD,\n currencyCode: \"SGD\",\n currencyName: \"Singapore Dollar\",\n currencyCodeHash: currencyKeccak256(\"SGD\"),\n currencySymbol: \"S$\",\n countryCode: \"sg\",\n },\n [Currency.THB]: {\n currency: Currency.THB,\n currencyCode: \"THB\",\n currencyName: \"Thai Baht\",\n currencyCodeHash: currencyKeccak256(\"THB\"),\n currencySymbol: \"฿\",\n countryCode: \"th\",\n },\n [Currency.TRY]: {\n currency: Currency.TRY,\n currencyCode: \"TRY\",\n currencyName: \"Turkish Lira\",\n currencyCodeHash: currencyKeccak256(\"TRY\"),\n currencySymbol: \"₺\",\n countryCode: \"tr\",\n },\n [Currency.UGX]: {\n currency: Currency.UGX,\n currencyCode: \"UGX\",\n currencyName: \"Ugandan Shilling\",\n currencyCodeHash: currencyKeccak256(\"UGX\"),\n currencySymbol: \"USh\",\n countryCode: \"ug\",\n },\n [Currency.USD]: {\n currency: Currency.USD,\n currencyCode: \"USD\",\n currencyName: \"United States Dollar\",\n currencyCodeHash: currencyKeccak256(\"USD\"),\n currencySymbol: \"$\",\n countryCode: \"us\",\n },\n [Currency.VND]: {\n currency: Currency.VND,\n currencyCode: \"VND\",\n currencyName: \"Vietnamese Dong\",\n currencyCodeHash: currencyKeccak256(\"VND\"),\n currencySymbol: \"₫\",\n countryCode: \"vn\",\n },\n [Currency.ZAR]: {\n currency: Currency.ZAR,\n currencyCode: \"ZAR\",\n currencyName: \"South African Rand\",\n currencyCodeHash: currencyKeccak256(\"ZAR\"),\n currencySymbol: \"R\",\n countryCode: \"za\",\n },\n};\n\n// Utility helpers to safely resolve currency values at runtime\nexport function resolveCurrency(currencyCode?: string | null): CurrencyType {\n const code = (currencyCode || \"\").toUpperCase();\n return isSupportedCurrency(code) ? (code as CurrencyType) : Currency.USD;\n}\n\nexport const resolveCurrencyCode = (\n value?: string | null,\n): CurrencyType | undefined => {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n if (!trimmed.startsWith(\"0x\")) {\n const upper = trimmed.toUpperCase() as CurrencyType;\n return currencyInfo[upper] ? upper : undefined;\n }\n\n const info = getCurrencyInfoFromHash(trimmed);\n return info ? (info.currencyCode as CurrencyType) : undefined;\n};\n","import { CurrencyType } from \"../types/currency\";\nimport { ExtensionRequestMetadata } from \"../types/browserExtension\";\nimport type { CuratorMetadata } from \"../types/curator\";\n\n// Platforms that can be used to send payments\nexport const PaymentPlatform = {\n VENMO: \"venmo\",\n CASHAPP: \"cashapp\",\n CHIME: \"chime\",\n LUXON: \"luxon\",\n REVOLUT: \"revolut\",\n WISE: \"wise\",\n MERCADO_PAGO: \"mercadopago\",\n ZELLE: \"zelle\",\n PAYPAL: \"paypal\",\n MONZO: \"monzo\",\n N26: \"n26\",\n ALIPAY: \"alipay\",\n UPI: \"upi\",\n};\n\nexport const paymentPlatforms = [...Object.values(PaymentPlatform)];\nexport type PaymentPlatformType =\n (typeof PaymentPlatform)[keyof typeof PaymentPlatform];\n\n// Payment platform enums and interfaces\nexport enum PaymentPlatformDefaultPaymentMode {\n QR_CODE = \"QR_CODE\",\n WEB_PAYMENT = \"WEB_PAYMENT\",\n}\n\nexport interface ParsedPaymentDetails {\n amount: string;\n parsedAmount: boolean; // whether the amount was successfully parsed\n date: string;\n parsedDate: boolean; // whether the date was successfully parsed\n recipientId: string;\n parsedRecipientId: boolean; // whether the recipientId was successfully parsed\n currency: string;\n parsedCurrency: boolean; // whether the currency was successfully parsed\n}\n\nexport interface SendPaymentConfig {\n paymentMethodName?: string;\n paymentMethodIcon?: string;\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode;\n useCustomQRCode?: boolean;\n payeeDetailPrefix?: string;\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n memo?: string,\n ) => string;\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n memo?: string,\n ) => string;\n deepLinkEmbedsRecipient: boolean;\n supportsSendingPaymentOnWeb: boolean;\n showTroubleScanningQRCodeLink: boolean;\n sendPaymentWarning?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => string;\n sendPaymentInfo?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => string;\n // Optional structured guidance for clearer bullets and emphasis\n sendPaymentDos?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => Array<{ text: string; emphasize?: string[] }>;\n sendPaymentDonts?: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => Array<{ text: string; emphasize?: string[] }>;\n}\n\nexport interface PaymentVerificationConfig {\n authLink: string;\n actionType: string;\n // Action type used for attestation-service routing. Defaults to `actionType`.\n // Override when the extension provider config and the attestation verifier\n // are keyed differently.\n attestationActionType?: string;\n // Platform used for attestation-service routing. Defaults to `actionPlatform`.\n // Override when capture uses a provider-specific platform but verification\n // uses a generic on-chain platform.\n attestationPlatform?: string;\n actionPlatform: string;\n buyerTeeParams?: {\n includeMetadataIndex?: boolean;\n };\n numPaymentsFetched: number;\n minExtensionVersion: string;\n supportsAppclip: boolean;\n parseMetadata: (metadata: ExtensionRequestMetadata) => ParsedPaymentDetails;\n reverseTransactionHistoryOrder?: boolean;\n getSubjectText: (metadata: ExtensionRequestMetadata) => string;\n totalProofs: number;\n}\n\nexport interface PlatformExtensionConfig {\n providerId: string;\n minExtensionVersion: string;\n}\n\nexport interface PlatformExtensionRegistrationConfig extends PlatformExtensionConfig {\n ctaLabel: string;\n requiredPrompt: string;\n ctaSubtext?: string;\n}\n\nexport type PlatformPayeeData = {\n offchainId: string;\n telegramUsername?: string | null;\n metadata?: CuratorMetadata | null;\n};\n\ninterface PlatformDepositConfigBase {\n payeeDetailInputPlaceholder: string;\n payeeDetailInputHelperText: string;\n payeeDetailValidationFailureMessage: string;\n // Attestation the maker must tick before a deposit can bind this account.\n // Set it only where enrollment cannot be checked programmatically, so the\n // maker is the one confirming the account can actually receive a payment.\n payeeEnrollmentConfirmation?: string;\n getDepositData: (payeeDetails: string) => PlatformPayeeData;\n getPayeeDetail: (data: PlatformPayeeData) => string;\n}\n\nexport type PlatformDepositConfig =\n | (PlatformDepositConfigBase & {\n shouldVerifyOnExtension: true;\n extensionRegistration: PlatformExtensionRegistrationConfig;\n })\n | (PlatformDepositConfigBase & {\n shouldVerifyOnExtension?: false;\n extensionRegistration?: PlatformExtensionRegistrationConfig;\n });\n\nexport interface PaymentPlatformConfig {\n platformId: PaymentPlatformType;\n platformLogo?: string | undefined;\n platformName: string;\n platformCurrencies: CurrencyType[];\n minFiatAmount: string;\n localeTimeString: string;\n platformIcon?: string;\n platformColor?: string; // Platform's brand color for fallback logo background\n isBeta?: boolean; // Platform is available but may still be unstable\n // Optional client-side caps for better pre-validation UX\n maxUsdcPerIntent?: string; // e.g., '5000' means 5000 USDC cap\n\n // One deposit config per platform\n depositConfig: PlatformDepositConfig;\n\n // Override when payment links use a recipient identifier that differs from\n // the canonical offchain ID shown to the buyer.\n getPaymentLinkRecipientId?: (data: PlatformPayeeData) => string;\n\n hasMultiplePaymentMethods: boolean;\n hasMultipleVerificationMethods: boolean;\n // Multiple payment methods per platform\n paymentMethods: Array<{\n sendConfig: SendPaymentConfig;\n verifyConfig: PaymentVerificationConfig;\n }>;\n}\n","import { Currency, CurrencyType, currencyInfo } from \"../types/currency\";\nimport { ExtensionRequestMetadata } from \"../types/browserExtension\";\nimport {\n PaymentPlatform,\n PaymentPlatformDefaultPaymentMode,\n ParsedPaymentDetails,\n PaymentPlatformConfig,\n SendPaymentConfig,\n PaymentVerificationConfig,\n PlatformDepositConfig,\n} from \"./types\";\n\n/**\n * Encodes a Zelle recipient ID into a base64 string\n * @param recipientId The Zelle recipient ID to encode\n * @returns Base64 encoded string\n */\nexport const encodeZelleRecipientId = (recipientId: string): string => {\n const payload = {\n name: \"\",\n action: \"payment\",\n token: recipientId,\n };\n return btoa(JSON.stringify(payload));\n};\n\nexport const GENERIC_ZELLE_BANK_ORDER = [\"chase\", \"bofa\", \"citi\"] as const;\nexport type GenericZelleBankId = (typeof GENERIC_ZELLE_BANK_ORDER)[number];\n\nexport type GenericZelleBankRoute = {\n bankId: GenericZelleBankId;\n sendConfig: SendPaymentConfig;\n verifyConfig: PaymentVerificationConfig;\n};\n\n// Bank of America configuration\n// ----------------------------\n\n// Define Bank of America send payment config\nconst zelleBankOfAmericaSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Bank of America\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => `https://www.bankofamerica.com/`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n // QR-code deeplink never worked, so deeplink to the BOA Zelle page instead.\n return `https://www.bankofamerica.com/movemoney`;\n },\n deepLinkEmbedsRecipient: false,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Bank of America's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Only use Bank of America. Scan the QR code and manually enter the recipient email. Double-check the email before sending.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Bank of America\", emphasize: [\"Bank of America\"] },\n {\n text: \"Scan the QR code and manually enter the recipient email\",\n emphasize: [\"manually\", \"recipient email\"],\n },\n {\n text: \"Double-check the email before sending\",\n emphasize: [\"Double-check\"],\n },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not use any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Bank of America verification config\nconst zelleBankOfAmericaVerifyConfig: PaymentVerificationConfig = {\n authLink: \"https://www.bankofamerica.com/\",\n actionType: \"transfer_zelle_bofa\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 1,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 10) {\n // Check if it's in format \"2025-05-04\"\n dateStr = `${dateStr}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: false,\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Chase configuration\n// ----------------------------\n\n// Define Chase send config\nconst zelleChaseSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Chase\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) =>\n `https://secure.chase.com/web/auth/dashboard#/dashboard/singleDoor/singleDoorController/index`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n const encodedRecipientId = encodeZelleRecipientId(recipientId);\n return `https://enroll.zellepay.com/qr-codes?data=${encodedRecipientId}`;\n },\n deepLinkEmbedsRecipient: true,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Chase's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Do not send using any other bank.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Chase for this payment\", emphasize: [\"Chase\"] },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not send using any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Chase payment verification config\nconst zelleChaseVerifyConfig: PaymentVerificationConfig = {\n authLink:\n \"https://secure.chase.com/web/auth/dashboard#/dashboard/singleDoor/payments/activity;params=qp,sentactivity\",\n actionType: \"transfer_zelle_chase\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 2,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 8) {\n // Check if it's in format \"20250504\"\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n dateStr = `${year}-${month}-${day}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: false,\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Citi configuration\n// ----------------------------\n\n// Define Citi send config\nconst zelleCitiSendConfig: SendPaymentConfig = {\n paymentMethodName: \"Citi\",\n paymentMethodIcon: undefined, // Icon provided by client-side assets\n defaultPaymentMode: PaymentPlatformDefaultPaymentMode.QR_CODE,\n useCustomQRCode: true,\n troubleScanningQRCodeLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => `https://online.citi.com/US/nga/zelle/transfer`,\n getFormattedSendLink: (\n recipientId: string,\n sendCurrency?: CurrencyType,\n amountFiatToSend?: string,\n ) => {\n const encodedRecipientId = encodeZelleRecipientId(recipientId);\n return `https://enroll.zellepay.com/qr-codes?data=${encodedRecipientId}`;\n },\n deepLinkEmbedsRecipient: true,\n supportsSendingPaymentOnWeb: true,\n showTroubleScanningQRCodeLink: true,\n sendPaymentWarning: (\n sendCurrency: CurrencyType,\n amountFiatToSend: string,\n ) => {\n return `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment through Citi's Zelle.`;\n },\n sendPaymentInfo: (sendCurrency: CurrencyType, amountFiatToSend: string) => {\n return `Do not send using any other bank.`;\n },\n sendPaymentDos: (sendCurrency: CurrencyType, amountFiatToSend: string) => [\n { text: \"Use Citi for this payment\", emphasize: [\"Citi\"] },\n {\n text: `Send exactly ${amountFiatToSend} ${currencyInfo[sendCurrency].currencyCode} in a single payment`,\n emphasize: [\n \"exactly\",\n amountFiatToSend,\n currencyInfo[sendCurrency].currencyCode,\n \"single\",\n ],\n },\n ],\n sendPaymentDonts: () => [\n { text: \"Do not send using any other bank\", emphasize: [\"Do not\"] },\n ],\n};\n\n// Define Citi verification config\nconst zelleCitiVerifyConfig: PaymentVerificationConfig = {\n authLink: \"https://online.citi.com/US/nga/zelle/transfer\",\n actionType: \"transfer_zelle_citi\",\n actionPlatform: PaymentPlatform.ZELLE,\n buyerTeeParams: {\n includeMetadataIndex: true,\n },\n numPaymentsFetched: 15,\n minExtensionVersion: \"0.6.3\",\n supportsAppclip: false,\n totalProofs: 1,\n parseMetadata: (metadata: ExtensionRequestMetadata): ParsedPaymentDetails => {\n const amountStr = metadata.amount ?? \"\";\n let dateStr = metadata.date ?? \"\";\n if (dateStr && dateStr.length === 8) {\n // Check if it's in format \"20250504\"\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n dateStr = `${year}-${month}-${day}T23:59:59`;\n }\n\n const recipientIdStr = metadata.recipient || \"\";\n return {\n amount: amountStr,\n parsedAmount: amountStr !== \"\",\n date: dateStr,\n parsedDate: dateStr !== \"\",\n recipientId: recipientIdStr,\n parsedRecipientId: recipientIdStr !== \"\",\n currency: Currency.USD,\n parsedCurrency: true,\n };\n },\n getSubjectText: (metadata: ExtensionRequestMetadata): string => {\n if (!metadata.amount || !metadata.recipient) {\n return \"\";\n }\n return `Transfer of $${Number(metadata.amount)} to ${metadata.recipient}`;\n },\n};\n\n// Define the Zelle deposit configuration (common for all banks)\nconst zelleDepositConfig: PlatformDepositConfig = {\n payeeDetailInputPlaceholder: \"Enter your email\",\n payeeDetailInputHelperText: \"This is the email you use with Zelle\",\n payeeDetailValidationFailureMessage:\n \"Make sure there are no typos in your email\",\n // Zelle enrollment lives with the bank, so nothing here can verify it. A\n // maker who registers an unenrolled email only finds out when a buyer's\n // payment fails, so make them confirm it before the deposit is created.\n payeeEnrollmentConfirmation:\n \"I have enrolled this email address with Zelle and can receive payments at it\",\n getDepositData: (payeeDetails: string) => {\n return {\n offchainId: payeeDetails.trim().toLowerCase(),\n };\n },\n getPayeeDetail: (data) => {\n return data.offchainId;\n },\n};\n\nexport const genericZelleBankRoutes = [\n {\n bankId: \"chase\",\n sendConfig: zelleChaseSendConfig,\n verifyConfig: zelleChaseVerifyConfig,\n },\n {\n bankId: \"bofa\",\n sendConfig: zelleBankOfAmericaSendConfig,\n verifyConfig: zelleBankOfAmericaVerifyConfig,\n },\n {\n bankId: \"citi\",\n sendConfig: zelleCitiSendConfig,\n verifyConfig: zelleCitiVerifyConfig,\n },\n] as const satisfies ReadonlyArray<GenericZelleBankRoute>;\n\nconst genericZellePaymentMethods: PaymentPlatformConfig[\"paymentMethods\"] =\n genericZelleBankRoutes.map(({ sendConfig, verifyConfig }) => ({\n sendConfig,\n verifyConfig,\n }));\n\n// Export the complete Zelle platform configuration with multiple payment methods\nexport const zelleConfig: PaymentPlatformConfig = {\n platformId: PaymentPlatform.ZELLE,\n platformName: \"Zelle\",\n platformLogo: \"\",\n platformColor: \"#6D1ED4\", // Zelle's brand purple color\n platformCurrencies: [Currency.USD],\n minFiatAmount: \"0.1\", // 0.1 USD\n localeTimeString: \"en-US\",\n depositConfig: zelleDepositConfig,\n hasMultiplePaymentMethods: true,\n hasMultipleVerificationMethods: false,\n paymentMethods: genericZellePaymentMethods,\n};\n","import { PaymentPlatform, type PaymentPlatformType } from \"./types\";\n\n/** Payment methods with a nonzero dispute-protection stake window. */\nexport const DISPUTE_PROTECTION_STAKE_PLATFORMS = [\n PaymentPlatform.VENMO,\n PaymentPlatform.PAYPAL,\n] as const satisfies readonly PaymentPlatformType[];\n\nconst disputeProtectionStakePlatformSet = new Set<PaymentPlatformType>(\n DISPUTE_PROTECTION_STAKE_PLATFORMS,\n);\n\nexport const isDisputeProtectionStakePlatform = (\n platform: PaymentPlatformType,\n): boolean => disputeProtectionStakePlatformSet.has(platform);\n\nexport const hasDisputeProtectionStakePlatform = (\n platforms: readonly PaymentPlatformType[],\n): boolean => platforms.some(isDisputeProtectionStakePlatform);\n\nexport interface DisputeProtectionProjection {\n disputeProtectionOptedOut?: unknown;\n disputeProtectionRequiresStake?: unknown;\n}\n\n/**\n * Validates the Curator-owned projection as one canonical pair. Stake cannot\n * be required for an explicitly opted-out deposit/payment-method tuple.\n */\nexport const isCanonicalDisputeProtectionProjection = (\n projection: DisputeProtectionProjection,\n): projection is {\n disputeProtectionOptedOut: boolean;\n disputeProtectionRequiresStake: boolean;\n} =>\n typeof projection.disputeProtectionOptedOut === \"boolean\" &&\n typeof projection.disputeProtectionRequiresStake === \"boolean\" &&\n (!projection.disputeProtectionRequiresStake ||\n !projection.disputeProtectionOptedOut);\n","import type {\n BestByPlatformResponse,\n PostDepositDetailsRequest,\n PostDepositDetailsResponse,\n SellerCredentialBundleUpload,\n QuotesBestByPlatformRequest,\n QuoteRequest,\n QuoteResponse,\n GetPayeeDetailsRequest,\n GetPayeeDetailsResponse,\n ValidatePayeeDetailsRequest,\n ValidatePayeeDetailsResponse,\n GetOwnerDepositsRequest,\n GetOwnerDepositsResponse,\n ApiDeposit,\n DepositVerifier,\n DepositVerifierCurrency,\n GetDepositBundleParams,\n GetDepositBundleResponse,\n GetOrderbookParams,\n GetOrderbookResponse,\n GetOrderbookTableResponse,\n OrderbookTableRow,\n CreateReferralCodeRequest,\n CreateReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n ReferralReadRequest,\n RedeemReferralCodeRequest,\n RedeemReferralCodeResponse,\n UpdateReferralCodeRequest,\n UpdateReferralCodeResponse,\n ApiAdapterOptions,\n CuratorSellerCredentialStatusResponse,\n CuratorSellerCredentialUploadResponse,\n CuratorSellerVerifyResponse,\n GoogleOAuthSellerCredentialPlatform,\n GoogleOAuthSellerCredentialUploadBodyByPlatform,\n SellerCredentialUploadPlatform,\n SellerPlatform,\n SellerVerifyProxyBody,\n} from '../types';\nimport type { Hash } from 'viem';\nimport { getContracts, type RuntimeEnv } from '../contracts';\nimport { SUPPORTED_CHAIN_IDS } from '../constants';\nimport { isValidHexAddress } from '../utils/address';\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';\nimport { logger } from '../utils/logger';\nimport { normalizeReferralCode } from '../referral';\nimport { isCanonicalDisputeProtectionProjection } from '@zkp2p/core/platforms';\nimport {\n METHOD_NAME_TO_HASH,\n SUPPORTED_PAYMENT_METHOD_HASHES,\n matchesPaymentMethodNameAndHash,\n matchesQuotePaymentMethod,\n} from '../utils/paymentMethodHashes';\n\n/**\n * Creates headers for Curator API requests.\n */\nfunction createHeaders(\n apiKey?: string,\n authorizationToken?: string,\n extraHeaders?: Record<string, string>,\n): 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 }\n // Caller headers land last so a service key like `x-pp-key` can be added and,\n // where a caller means to, an SDK-set header can be replaced outright.\n return { ...headers, ...extraHeaders };\n}\n\n// Normalize base API URL to avoid duplicate version segments.\nfunction withApiBase(baseApiUrl: string): string {\n const trimmed = (baseApiUrl || '').trim();\n // remove trailing slashes\n let base = trimmed.replace(/\\/+$/, '');\n // Versioned routes are selected per operation below.\n base = base.replace(/\\/v[123]$/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 authorizationToken,\n headers: extraHeaders,\n timeoutMs,\n retryCount = 3,\n retryDelayMs = 1000,\n}: {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n body?: any;\n apiKey?: string;\n authorizationToken?: string;\n headers?: Record<string, 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, authorizationToken, extraHeaders),\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\ntype CuratorEnvelope<T> = {\n success: boolean;\n message: string;\n responseObject: T;\n statusCode: number;\n};\n\nfunction unwrapResponseObject<T>(payload: CuratorEnvelope<T> | T): T {\n if (payload && typeof payload === 'object' && 'responseObject' in payload) {\n return (payload as CuratorEnvelope<T>).responseObject;\n }\n return payload as T;\n}\n\nfunction requireAuthorizationToken(\n authorizationToken: string | undefined,\n endpoint: string,\n): string {\n if (!authorizationToken) {\n throw new ValidationError(\n `authorizationToken is required for ${endpoint}`,\n 'authorizationToken',\n );\n }\n return authorizationToken;\n}\n\nfunction requireReferralWriteAuth(\n authorizationToken: string | undefined,\n signature: unknown,\n endpoint: string,\n): string | undefined {\n if (authorizationToken && signature) {\n throw new ValidationError(\n `Use either authorizationToken or signature for ${endpoint}, not both`,\n 'authorizationToken',\n );\n }\n if (!authorizationToken && !signature) {\n throw new ValidationError(\n `authorizationToken or signature is required for ${endpoint}`,\n 'authorizationToken',\n );\n }\n return authorizationToken;\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 normalizeReferralAddress(address: string, field: string): string {\n const normalized = address.trim().toLowerCase();\n if (!isValidHexAddress(normalized)) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return normalized;\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 if (!SUPPORTED_PAYMENT_METHOD_HASHES.has(methodHash.toLowerCase())) continue;\n const resolvedConversionRate = currency.conversionRate ?? currency.minConversionRate;\n if (resolvedConversionRate === null || resolvedConversionRate === undefined) {\n logger.warn(\n `[sdk] Skipping currency with missing conversion rate (deposit ${deposit.depositId}, currency ${currency.currencyCode})`,\n );\n continue;\n }\n const bucket = currenciesByMethod.get(methodHash) ?? [];\n bucket.push({\n currencyCode: currency.currencyCode,\n conversionRate: resolvedConversionRate,\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(\n (paymentMethod) =>\n paymentMethod.active !== false &&\n SUPPORTED_PAYMENT_METHOD_HASHES.has(paymentMethod.paymentMethodHash.toLowerCase()),\n )\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 apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/makers/create`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuote(\n req: QuoteRequest,\n opts: ApiAdapterOptions,\n): Promise<QuoteResponse>;\nexport async function apiGetQuote(\n req: QuoteRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<QuoteResponse>;\nexport async function apiGetQuote(\n req: QuoteRequest,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMsArg?: number,\n): Promise<QuoteResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? { baseApiUrl: optsOrBaseApiUrl, timeoutMs: timeoutMsArg }\n : optsOrBaseApiUrl;\n const baseApiUrl = opts.baseApiUrl;\n const timeoutMs = opts.timeoutMs;\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 if (!isValidHexAddress(req.user)) {\n throw new ValidationError('user must be a valid Ethereum address', 'user');\n }\n if (!isValidHexAddress(req.recipient)) {\n throw new ValidationError('recipient must be a valid Ethereum address', 'recipient');\n }\n if (!isValidHexAddress(req.destinationToken)) {\n throw new ValidationError(\n 'destinationToken must be a valid Ethereum address',\n 'destinationToken',\n );\n }\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'exact-fiat' : 'exact-token';\n let url = `${withApiBase(baseApiUrl)}/v3/quote/${endpoint}`;\n if (req.quotesToReturn) url += `?quotesToReturn=${req.quotesToReturn}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: String(req.amount),\n amount: undefined,\n isExactFiat: undefined,\n quotesToReturn: undefined,\n referrerFeeConfig: undefined,\n referralFees: req.referralFees ?? (req.referrerFeeConfig ? [req.referrerFeeConfig] : 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 headers: opts.headers,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n opts: ApiAdapterOptions,\n): Promise<BestByPlatformResponse>;\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<BestByPlatformResponse>;\nexport async function apiGetQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMsArg?: number,\n): Promise<BestByPlatformResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? { baseApiUrl: optsOrBaseApiUrl, timeoutMs: timeoutMsArg }\n : optsOrBaseApiUrl;\n const baseApiUrl = opts.baseApiUrl;\n const timeoutMs = opts.timeoutMs;\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'best-by-platform' : 'best-by-platform-exact-token';\n const url = `${withApiBase(baseApiUrl)}/v3/quote/${endpoint}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: String(req.amount),\n amount: undefined,\n isExactFiat: undefined,\n referrerFeeConfig: undefined,\n referralFees: req.referralFees ?? (req.referrerFeeConfig ? [req.referrerFeeConfig] : undefined),\n };\n Object.keys(requestBody).forEach(\n (key) => requestBody[key] === undefined && delete requestBody[key],\n );\n\n const response = await apiFetch<BestByPlatformResponse>({\n url,\n method: 'POST',\n body: requestBody,\n headers: opts.headers,\n timeoutMs,\n });\n\n return {\n ...response,\n responseObject: {\n ...response.responseObject,\n platformQuotes: (response.responseObject?.platformQuotes ?? []).filter((platformQuote) => {\n const platform = platformQuote.platform.trim().toLowerCase();\n if (!METHOD_NAME_TO_HASH[platform]) return false;\n if (!platformQuote.bestQuote) return true;\n return (\n platform === platformQuote.bestQuote.intent.processorName.trim().toLowerCase() &&\n matchesQuotePaymentMethod(\n platformQuote.bestQuote.intent.processorName,\n platformQuote.bestQuote.paymentMethod,\n )\n );\n }),\n },\n };\n}\n\nexport async function apiGetPayeeDetails(\n req: GetPayeeDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetPayeeDetailsResponse> {\n return apiFetch<GetPayeeDetailsResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/makers/${req.processorName}/${req.hashedOnchainId}`,\n method: 'GET',\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: `${withApiBase(baseApiUrl)}/v2/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\nexport async function apiGetReferralDashboard(\n opts: ApiAdapterOptions & ReferralReadRequest,\n): Promise<ReferralDashboardResponse> {\n const address = opts.address ? normalizeReferralAddress(opts.address, 'address') : undefined;\n const endpoint = address\n ? `/v2/referral?${new URLSearchParams({ address }).toString()}`\n : '/v2/referral';\n const authorizationToken = address\n ? undefined\n : requireAuthorizationToken(opts.authorizationToken, endpoint);\n const response = await apiFetch<\n CuratorEnvelope<ReferralDashboardResponse> | ReferralDashboardResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiGetReferralEarnings(\n opts: ApiAdapterOptions & ReferralReadRequest,\n): Promise<ReferralEarningsResponse> {\n const address = opts.address ? normalizeReferralAddress(opts.address, 'address') : undefined;\n const endpoint = address\n ? `/v2/referral/earnings?${new URLSearchParams({ address }).toString()}`\n : '/v2/referral/earnings';\n const authorizationToken = address\n ? undefined\n : requireAuthorizationToken(opts.authorizationToken, endpoint);\n const response = await apiFetch<\n CuratorEnvelope<ReferralEarningsResponse> | ReferralEarningsResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiLookupReferralCode(\n code: string,\n opts: ApiAdapterOptions,\n): Promise<ReferralCodeLookupResponse> {\n const normalizedCode = normalizeReferralCode(code);\n const endpoint = `/v2/referral/code/${encodeURIComponent(normalizedCode)}`;\n const response = await apiFetch<\n CuratorEnvelope<ReferralCodeLookupResponse> | ReferralCodeLookupResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiCreateReferralCode(\n req: CreateReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<CreateReferralCodeResponse> {\n const endpoint = '/v2/referral/code';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<CreateReferralCodeResponse> | CreateReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: req.signature ? { signature: req.signature } : {},\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiRedeemReferralCode(\n req: RedeemReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<RedeemReferralCodeResponse> {\n const endpoint = '/v2/referral/redeem';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<RedeemReferralCodeResponse> | RedeemReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: {\n code: normalizeReferralCode(req.code),\n ...(req.signature ? { signature: req.signature } : {}),\n },\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiUpdateReferralCode(\n req: UpdateReferralCodeRequest,\n opts: ApiAdapterOptions,\n): Promise<UpdateReferralCodeResponse> {\n const endpoint = '/v2/referral/code';\n const authorizationToken = requireReferralWriteAuth(\n opts.authorizationToken,\n req.signature,\n endpoint,\n );\n const response = await apiFetch<\n CuratorEnvelope<UpdateReferralCodeResponse> | UpdateReferralCodeResponse\n >({\n url: `${withApiBase(opts.baseApiUrl)}${endpoint}`,\n method: 'PATCH',\n body: {\n code: normalizeReferralCode(req.code),\n ...(req.signature ? { signature: req.signature } : {}),\n },\n authorizationToken,\n timeoutMs: opts.timeoutMs,\n });\n return unwrapResponseObject(response);\n}\n\nexport async function apiUploadSellerCredential(\n processorName: SellerCredentialUploadPlatform,\n payeeDetails: Hash,\n bundle: SellerCredentialBundleUpload,\n baseApiUrl: string,\n timeoutMs?: number,\n authorizationToken?: string,\n): Promise<CuratorSellerCredentialUploadResponse> {\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential`;\n\n return apiFetch<CuratorSellerCredentialUploadResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'POST',\n body: bundle,\n timeoutMs,\n authorizationToken,\n });\n}\n\nexport async function apiUploadGoogleOAuthSellerCredential(\n processorName: GoogleOAuthSellerCredentialPlatform,\n payeeDetails: Hash,\n body: GoogleOAuthSellerCredentialUploadBodyByPlatform[GoogleOAuthSellerCredentialPlatform],\n baseApiUrl: string,\n opts?: { timeoutMs?: number; authorizationToken?: string },\n): Promise<CuratorSellerCredentialUploadResponse> {\n if ((processorName as string) !== 'paypal') {\n throw new ValidationError(\n `Unsupported Google OAuth seller credential platform: ${String(processorName)}`,\n 'processorName',\n );\n }\n\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential/google-oauth`;\n\n // Forward the caller's Privy bearer token when present. Curator's google-oauth\n // route runs optional Privy auth: an authenticated upload is claimed to the\n // caller's maker profile (surfaced via /v2/me); an anonymous one is stored\n // unclaimed exactly as before.\n return apiFetch<CuratorSellerCredentialUploadResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'POST',\n body,\n timeoutMs: opts?.timeoutMs,\n authorizationToken: opts?.authorizationToken,\n });\n}\n\nexport async function apiGetSellerCredentialStatus(\n processorName: SellerPlatform,\n payeeDetails: Hash,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<CuratorSellerCredentialStatusResponse> {\n const endpoint = `/v2/makers/${encodeURIComponent(processorName)}/${encodeURIComponent(\n payeeDetails,\n )}/seller-credential/status`;\n\n return apiFetch<CuratorSellerCredentialStatusResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n timeoutMs,\n });\n}\n\nexport async function apiVerifySellerPayment(\n platform: SellerPlatform,\n req: SellerVerifyProxyBody,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n): Promise<CuratorSellerVerifyResponse> {\n const body: SellerVerifyProxyBody = {\n txId: req.txId,\n chainId: req.chainId,\n intent: req.intent,\n ...(req.metadata !== undefined ? { metadata: req.metadata } : {}),\n };\n\n return apiFetch<CuratorSellerVerifyResponse>({\n url: `${withApiBase(baseApiUrl)}/v2/verify/seller/${encodeURIComponent(platform)}`,\n method: 'POST',\n body,\n apiKey,\n timeoutMs,\n });\n}\n\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n opts: ApiAdapterOptions,\n): Promise<GetOrderbookResponse>;\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetOrderbookResponse>;\nexport async function apiGetOrderbook(\n params: GetOrderbookParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetOrderbookResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n query.set(key, String(value));\n });\n\n const response = await apiFetch<{\n success: boolean;\n message: string;\n responseObject: GetOrderbookResponse;\n }>({\n url: `${withApiBase(opts.baseApiUrl)}/v3/orderbook?${query.toString()}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n\n return {\n ...response.responseObject,\n entries: response.responseObject.entries.filter((entry) =>\n matchesPaymentMethodNameAndHash(entry.paymentPlatform, entry.paymentMethodHash),\n ),\n };\n}\n\n/**\n * The one escrow whose rows `signalIntent` will accept, or `undefined` when the\n * caller did not say which deployment it targets.\n *\n * Resolution is deliberately all-or-nothing: without a `runtimeEnv` there is no\n * safe default, because guessing `production` against a staging caller would\n * discard every row it has.\n */\nfunction resolveSignalableEscrow(\n chainId: number | undefined,\n runtimeEnv: RuntimeEnv | undefined,\n): string | undefined {\n if (!runtimeEnv) return undefined;\n try {\n return getContracts(\n chainId ?? SUPPORTED_CHAIN_IDS.BASE_MAINNET,\n runtimeEnv,\n ).addresses.escrowV2?.toLowerCase();\n } catch {\n // An unknown chain has no deployment to compare against; leaving the book\n // whole is better than emptying it on a resolution failure.\n return undefined;\n }\n}\n\n/**\n * RC1 replaced curator's legacy chargeback flag with the required\n * `disputeProtectionOptedOut`/`disputeProtectionRequiresStake` pair, and\n * clients derive access from `whitelistEnabled` and stake gating from this\n * pair. The deployment-order contract is curator first, SDK second: a curator that has not cut over\n * serves rows without the pair, and passing those through would surface a\n * dispute-gated row as freely takeable, failing only later at `signalIntent`.\n * Dropping such rows fails closed, mirroring the web Express quote guard.\n */\nfunction hasDisputeProtectionFields(row: OrderbookTableRow): boolean {\n return isCanonicalDisputeProtectionProjection(row);\n}\n\n/**\n * A row is fillable only from the current escrow. Curator keeps serving retired\n * escrows, but `signalIntent` throws on them, so surfacing those rows offers\n * liquidity that cannot be taken.\n */\nfunction isSignalableEscrowRow(\n rowEscrowAddress: string | undefined,\n signalableEscrow: string | undefined,\n): boolean {\n if (!signalableEscrow) return true;\n // A row with no escrow cannot be proven current, and signalling resolves it\n // to the current deployment anyway, so keep it rather than dropping blind.\n if (!rowEscrowAddress) return true;\n return rowEscrowAddress.toLowerCase() === signalableEscrow;\n}\n\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n opts: ApiAdapterOptions,\n): Promise<GetOrderbookTableResponse>;\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetOrderbookTableResponse>;\nexport async function apiGetOrderbookTable(\n params: GetOrderbookParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetOrderbookTableResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n query.set(key, String(value));\n });\n\n const response = await apiFetch<CuratorEnvelope<GetOrderbookTableResponse>>({\n url: `${withApiBase(opts.baseApiUrl)}/v3/orderbook/table?${query.toString()}`,\n method: 'GET',\n headers: opts.headers,\n timeoutMs: opts.timeoutMs,\n });\n\n const responseObject = unwrapResponseObject(response);\n const signalableEscrow = resolveSignalableEscrow(params.chainId, opts.runtimeEnv);\n return {\n ...responseObject,\n rows: responseObject.rows.filter(\n (row) =>\n hasDisputeProtectionFields(row) &&\n matchesPaymentMethodNameAndHash(row.paymentPlatform, row.paymentMethodHash) &&\n isSignalableEscrowRow(row.escrowAddress, signalableEscrow),\n ),\n };\n}\n\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n opts: ApiAdapterOptions,\n): Promise<GetDepositBundleResponse>;\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n baseApiUrl: string,\n timeoutMs?: number,\n): Promise<GetDepositBundleResponse>;\nexport async function apiGetDepositBundle(\n params: GetDepositBundleParams,\n optsOrBaseApiUrl: ApiAdapterOptions | string,\n timeoutMs?: number,\n): Promise<GetDepositBundleResponse> {\n const opts: ApiAdapterOptions =\n typeof optsOrBaseApiUrl === 'string'\n ? {\n baseApiUrl: optsOrBaseApiUrl,\n timeoutMs,\n }\n : optsOrBaseApiUrl;\n\n const escrowAddress = requireEscrowAddress(\n params.escrowAddress,\n 'apiGetDepositBundle requires escrowAddress',\n );\n const query = new URLSearchParams({ escrowAddress });\n\n if (params.dailySnapshotLimit !== undefined) {\n query.set('dailySnapshotLimit', String(params.dailySnapshotLimit));\n }\n\n const response = await apiFetch<{\n success: boolean;\n message: string;\n responseObject: GetDepositBundleResponse;\n }>({\n url: `${withApiBase(opts.baseApiUrl)}/v2/deposits/${params.depositId}/bundle?${query.toString()}`,\n method: 'GET',\n timeoutMs: opts.timeoutMs,\n });\n\n return response.responseObject;\n}\n","import type { Address, WalletClient } from 'viem';\nimport { hardhat } from 'viem/chains';\n\nimport {\n apiCreateReferralCode,\n apiGetReferralDashboard,\n apiGetReferralEarnings,\n apiLookupReferralCode,\n apiRedeemReferralCode,\n apiUpdateReferralCode,\n} from '../adapters/api';\nimport { type RuntimeEnv } from '../contracts';\nimport { ValidationError } from '../errors';\nimport { type IndexerAuthTokenProvider } from '../indexer/client';\nimport {\n REFERRAL_SIGNATURE_DOMAIN,\n REFERRAL_SIGNATURE_TYPES,\n normalizeReferralCode,\n} from '../referral';\nimport type {\n CreateReferralCodeResponse,\n RedeemReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n ReferralSignatureBody,\n UpdateReferralCodeResponse,\n} from '../types';\nimport { DEFAULT_BASE_API_URL } from '../utils/constants';\nimport { normalizeAddress } from './clientUtils';\n\nexport type ReferralReadOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n /** Public wallet-address read target. Omit to use bearer-authenticated caller mode. */\n address?: Address;\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n};\n\nexport type ReferralBearerWriteOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n};\n\nexport type ReferralSignatureOptions = {\n baseApiUrl?: string;\n timeoutMs?: number;\n /** Defaults to base_production for production/preproduction, base_staging for staging. */\n audience?: string;\n /** Unix timestamp in seconds. Defaults to now. */\n issuedAt?: number;\n};\n\nexport type RedeemReferralCodeSignatureOptions = ReferralSignatureOptions & {\n /** Expected owner wallet for the code. If omitted, the SDK looks it up before signing. */\n referrerWalletAddress?: Address;\n};\n\nexport type UpdateReferralCodeSignatureOptions = ReferralSignatureOptions & {\n /** Current code, signed to prevent stale rename replay. */\n oldCode: string;\n};\n\nexport interface ReferralAccountOperationsConfig {\n getWalletClient: () => WalletClient;\n getChainId: () => number;\n getRuntimeEnv: () => RuntimeEnv;\n getBaseApiUrl: () => string | undefined;\n getApiTimeoutMs: () => number;\n getAuthorizationToken: () => string | undefined;\n getAuthorizationTokenProvider: () => IndexerAuthTokenProvider | undefined;\n}\n\nexport class ReferralAccountOperations {\n constructor(private readonly config: ReferralAccountOperationsConfig) {}\n\n async getReferralDashboard(opts?: ReferralReadOptions): Promise<ReferralDashboardResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = opts?.address\n ? undefined\n : await this.resolveAuthorizationToken(opts);\n return apiGetReferralDashboard({\n baseApiUrl,\n timeoutMs,\n authorizationToken,\n address: opts?.address,\n });\n }\n\n async getReferralEarnings(opts?: ReferralReadOptions): Promise<ReferralEarningsResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = opts?.address\n ? undefined\n : await this.resolveAuthorizationToken(opts);\n return apiGetReferralEarnings({\n baseApiUrl,\n timeoutMs,\n authorizationToken,\n address: opts?.address,\n });\n }\n\n async lookupReferralCode(\n code: string,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<ReferralCodeLookupResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n return apiLookupReferralCode(code, { baseApiUrl, timeoutMs });\n }\n\n async createReferralCode(opts?: ReferralBearerWriteOptions): Promise<CreateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiCreateReferralCode({}, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async createReferralCodeWithSignature(\n opts?: ReferralSignatureOptions,\n ): Promise<CreateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const signature = await this.signCreateReferralCode(opts);\n return apiCreateReferralCode({ signature }, { baseApiUrl, timeoutMs });\n }\n\n async redeemReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<RedeemReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiRedeemReferralCode({ code }, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async redeemReferralCodeWithSignature(\n code: string,\n opts?: RedeemReferralCodeSignatureOptions,\n ): Promise<RedeemReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const normalizedCode = normalizeReferralCode(code);\n const lookup = opts?.referrerWalletAddress\n ? undefined\n : await this.lookupReferralCode(normalizedCode, { baseApiUrl, timeoutMs });\n const referrerWalletAddress = opts?.referrerWalletAddress ?? lookup?.referrerWalletAddress;\n if (!referrerWalletAddress) {\n throw new ValidationError(\n 'referrerWalletAddress is required for referral signature auth',\n 'referrerWalletAddress',\n );\n }\n if (lookup && !lookup.isActive) {\n throw new ValidationError('Referral code is not active', 'code');\n }\n const signature = await this.signRedeemReferralCode(\n normalizedCode,\n referrerWalletAddress,\n opts,\n );\n return apiRedeemReferralCode({ code: normalizedCode, signature }, { baseApiUrl, timeoutMs });\n }\n\n async updateReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<UpdateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const authorizationToken = await this.resolveAuthorizationToken(opts);\n return apiUpdateReferralCode({ code }, { baseApiUrl, timeoutMs, authorizationToken });\n }\n\n async updateReferralCodeWithSignature(\n code: string,\n opts: UpdateReferralCodeSignatureOptions,\n ): Promise<UpdateReferralCodeResponse> {\n const { baseApiUrl, timeoutMs } = this.resolveRequestOptions(opts);\n const signature = await this.signRenameReferralCode(code, opts.oldCode, opts);\n return apiUpdateReferralCode({ code, signature }, { baseApiUrl, timeoutMs });\n }\n\n private resolveRequestOptions(opts?: { baseApiUrl?: string; timeoutMs?: number }): {\n baseApiUrl: string;\n timeoutMs: number;\n } {\n return {\n baseApiUrl: this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.config.getBaseApiUrl() ?? DEFAULT_BASE_API_URL,\n ),\n timeoutMs: opts?.timeoutMs ?? this.config.getApiTimeoutMs(),\n };\n }\n\n private stripTrailingSlash(url: string): string {\n return url.replace(/\\/$/, '');\n }\n\n private async resolveAuthorizationToken(opts?: {\n authorizationToken?: string;\n getAuthorizationToken?: IndexerAuthTokenProvider;\n }): Promise<string | undefined> {\n if (opts?.authorizationToken !== undefined) {\n return opts.authorizationToken;\n }\n\n const provider = opts?.getAuthorizationToken ?? this.config.getAuthorizationTokenProvider();\n if (provider) {\n return (await provider()) ?? undefined;\n }\n\n return this.config.getAuthorizationToken();\n }\n\n private resolveAudience(audience?: string): string {\n if (audience) return audience;\n if (this.config.getChainId() === hardhat.id) return 'localhardhat';\n if (this.config.getRuntimeEnv() === 'staging') return 'base_staging';\n return 'base_production';\n }\n\n private resolveIssuedAt(issuedAt?: number): number {\n const resolved = issuedAt ?? Math.floor(Date.now() / 1000);\n if (!Number.isInteger(resolved) || resolved <= 0) {\n throw new ValidationError('issuedAt must be a positive unix timestamp', 'issuedAt');\n }\n return resolved;\n }\n\n private getSigningAccount(): {\n account: NonNullable<WalletClient['account']>;\n walletAddress: Address;\n } {\n const walletClient = this.config.getWalletClient();\n const account = walletClient.account;\n if (!account) {\n throw new ValidationError(\n 'walletClient account is required for referral signature auth',\n 'walletClient.account',\n );\n }\n\n const rawAddress = typeof account === 'string' ? account : account.address;\n const walletAddress = normalizeAddress(rawAddress);\n if (!walletAddress) {\n throw new ValidationError(\n 'walletClient account address is required for referral signature auth',\n 'walletClient.account',\n );\n }\n\n return { account, walletAddress };\n }\n\n private normalizeReferralWalletAddress(address: Address, field: string): Address {\n const normalized = normalizeAddress(address.toLowerCase());\n if (!normalized) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return normalized;\n }\n\n private async signCreateReferralCode(\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'CreateCode',\n message: { wallet: walletAddress, audience, issuedAt: BigInt(issuedAt) },\n });\n\n return { walletAddress, signature, issuedAt, audience };\n }\n\n private async signRedeemReferralCode(\n code: string,\n referrerWalletAddress: Address,\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const normalizedCode = normalizeReferralCode(code);\n const referrer = this.normalizeReferralWalletAddress(\n referrerWalletAddress,\n 'referrerWalletAddress',\n );\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'RedeemCode',\n message: {\n wallet: walletAddress,\n code: normalizedCode,\n referrer,\n audience,\n issuedAt: BigInt(issuedAt),\n },\n });\n\n return { walletAddress, signature, issuedAt, audience, referrer };\n }\n\n private async signRenameReferralCode(\n newCode: string,\n oldCode: string,\n opts?: ReferralSignatureOptions,\n ): Promise<ReferralSignatureBody> {\n const { account, walletAddress } = this.getSigningAccount();\n const issuedAt = this.resolveIssuedAt(opts?.issuedAt);\n const audience = this.resolveAudience(opts?.audience);\n const normalizedOldCode = normalizeReferralCode(oldCode);\n const normalizedNewCode = normalizeReferralCode(newCode);\n const signature = await this.config.getWalletClient().signTypedData({\n account,\n domain: REFERRAL_SIGNATURE_DOMAIN,\n types: REFERRAL_SIGNATURE_TYPES,\n primaryType: 'RenameCode',\n message: {\n wallet: walletAddress,\n oldCode: normalizedOldCode,\n newCode: normalizedNewCode,\n audience,\n issuedAt: BigInt(issuedAt),\n },\n });\n\n return { walletAddress, signature, issuedAt, audience, oldCode: normalizedOldCode };\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 }) => 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?: { escrowAddress?: Address }): boolean {\n const escrowContext = this.config.host.resolveEscrowContext({\n escrowAddress: params?.escrowAddress,\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 });\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 });\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 });\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 });\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 });\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","import type { Address, Hex, PublicClient } from 'viem';\nimport type { Abi } from 'abitype';\n\nimport type { RuntimeEnv } from '../contracts';\nimport type { PreparedTransactionWithAbi, TxOverrides } from '../types';\n\nconst PEER_PAY_MERCHANT_GROUP_ID_BY_ENVIRONMENT = {\n production: '0x174b8a29536721a3eae290bfd55651b85a53fc334b971d993fa93ed8dde15e48',\n preproduction: '0x174b8a29536721a3eae290bfd55651b85a53fc334b971d993fa93ed8dde15e48',\n staging: '0xc82c20c00033046a2f017b65532d7148a337282f17c73296663a530e49ba00f7',\n} as const satisfies Record<RuntimeEnv, Hex>;\n\nexport type AccessPolicyOperationsConfig = {\n getPublicClient: () => PublicClient;\n /** Required only for environment-owned policy writes. */\n getRuntimeEnv?: () => RuntimeEnv;\n /** Undefined wherever the policy is not deployed. */\n getPolicyAddress: () => Address | undefined;\n getPolicyAbi: () => Abi | undefined;\n getRegistryAddress: () => Address | undefined;\n getRegistryAbi: () => Abi | undefined;\n prepareContractTransaction: (opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n }) => PreparedTransactionWithAbi;\n};\n\nexport class AccessPolicyUnsupportedError extends Error {\n constructor(contract: 'WhitelistPolicy' | 'AddressGroupRegistry') {\n super(`${contract} is not deployed for this environment.`);\n this.name = 'AccessPolicyUnsupportedError';\n }\n}\n\n/**\n * Historical reads and narrowly scoped writes for `WhitelistPolicy` and\n * `AddressGroupRegistry`.\n *\n * Writes are depositor-only at the contract level: `onlyDepositor` resolves the\n * escrow's recorded depositor, so a deposit delegate is rejected. Callers must\n * gate the UI on that rather than relying on a revert.\n *\n * General-purpose group management is retired. New sell deposits may still\n * configure the protocol-owned Peer Pay merchant default; every other write\n * remains limited to failing open or removing historical entries.\n */\nexport class AccessPolicyOperations {\n constructor(private readonly config: AccessPolicyOperationsConfig) {}\n\n get isSupported(): boolean {\n return Boolean(\n this.config.getPolicyAddress() &&\n this.config.getPolicyAbi() &&\n this.config.getRegistryAddress() &&\n this.config.getRegistryAbi(),\n );\n }\n\n private requirePolicy(): { address: Address; abi: Abi } {\n const address = this.config.getPolicyAddress();\n const abi = this.config.getPolicyAbi();\n if (!address || !abi) throw new AccessPolicyUnsupportedError('WhitelistPolicy');\n return { address, abi };\n }\n\n private requireRegistry(): { address: Address; abi: Abi } {\n const address = this.config.getRegistryAddress();\n const abi = this.config.getRegistryAbi();\n if (!address || !abi) throw new AccessPolicyUnsupportedError('AddressGroupRegistry');\n return { address, abi };\n }\n\n /* ============ Reads ============ */\n\n async isEnabled(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n }): Promise<boolean> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'enabled',\n args: [params.escrow, params.depositId, params.paymentMethod],\n })) as boolean;\n }\n\n /** Groups are enumerable onchain; direct addresses deliberately are not. */\n async getAllowedGroups(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n }): Promise<Hex[]> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'getAllowedGroups',\n args: [params.escrow, params.depositId, params.paymentMethod],\n })) as Hex[];\n }\n\n /**\n * Point check for one address. There is no enumeration getter, so this can\n * confirm a known address but can never reconstruct a missing list.\n */\n async isWhitelisted(params: {\n escrow: Address;\n depositId: bigint;\n taker: Address;\n }): Promise<boolean> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'isWhitelisted',\n args: [params.escrow, params.depositId, params.taker],\n })) as boolean;\n }\n\n async maxGroupsPerDepositPaymentMethod(): Promise<bigint> {\n const { address, abi } = this.requirePolicy();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'MAX_GROUPS_PER_DEPOSIT_PAYMENT_METHOD',\n })) as bigint;\n }\n\n async groupExists(groupId: Hex): Promise<boolean> {\n const { address, abi } = this.requireRegistry();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'groupExists',\n args: [groupId],\n })) as boolean;\n }\n\n /** Curated membership OR resolver. Resolver failures fail closed. */\n async isMember(params: { groupId: Hex; account: Address }): Promise<boolean> {\n const { address, abi } = this.requireRegistry();\n return (await this.config.getPublicClient().readContract({\n address,\n abi,\n functionName: 'isMember',\n args: [params.groupId, params.account],\n })) as boolean;\n }\n\n /* ============ Prepareable writes ============ */\n\n private preparePolicyCall(\n functionName: string,\n args: readonly unknown[],\n txOverrides?: TxOverrides,\n ): PreparedTransactionWithAbi {\n const { address, abi } = this.requirePolicy();\n return this.config.prepareContractTransaction({\n address,\n abi,\n functionName,\n args,\n txOverrides,\n });\n }\n\n /** Configure the fixed Peer Pay merchant default while creating a sell deposit. */\n prepareConfigurePeerPayMerchantDeposit(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n const runtimeEnv = this.config.getRuntimeEnv?.();\n if (!runtimeEnv) {\n throw new Error('Runtime environment is required to configure the Peer Pay merchant policy.');\n }\n const merchantGroupId = PEER_PAY_MERCHANT_GROUP_ID_BY_ENVIRONMENT[runtimeEnv];\n return this.preparePolicyCall(\n 'configureDeposit',\n [params.escrow, params.depositId, params.paymentMethod, true, [merchantGroupId], []],\n params.txOverrides,\n );\n }\n\n /** Fail open before removing historical policy entries. */\n prepareDisable(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'setEnabled',\n [params.escrow, params.depositId, params.paymentMethod, false],\n params.txOverrides,\n );\n }\n\n prepareRemoveAllowedGroups(params: {\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n groupIds: readonly Hex[];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'removeAllowedGroups',\n [params.escrow, params.depositId, params.paymentMethod, params.groupIds],\n params.txOverrides,\n );\n }\n\n prepareRemoveWhitelistedAddresses(params: {\n escrow: Address;\n depositId: bigint;\n takers: readonly Address[];\n txOverrides?: TxOverrides;\n }): PreparedTransactionWithAbi {\n return this.preparePolicyCall(\n 'removeWhitelistedAddresses',\n [params.escrow, params.depositId, params.takers],\n params.txOverrides,\n );\n }\n}\n","import type { Abi } from 'abitype';\nimport type { Address, PublicClient } from 'viem';\nimport { zeroAddress } from 'viem';\n\nimport type { TxOverrides } from '../types';\n\nexport type StakeVaultWriteFunction =\n | 'depositStake'\n | 'withdrawStake'\n | 'claim'\n | 'setTakerAuthorization'\n | 'selectStakeOwner'\n | 'clearStakeOwner';\n\ntype StakeWriteBase = {\n txOverrides?: TxOverrides;\n};\n\nexport type StakeVaultWriteParams = {\n depositStake: StakeWriteBase & { amount: bigint };\n withdrawStake: StakeWriteBase & { amount: bigint };\n claim: StakeWriteBase;\n setTakerAuthorization: StakeWriteBase & { taker: Address; authorized: boolean };\n selectStakeOwner: StakeWriteBase & { stakeOwner: Address };\n clearStakeOwner: StakeWriteBase;\n};\n\n/**\n * Vault accounting for one staker plus the delegation view for one taker.\n * `stakeOwner` is the EFFECTIVE owner from `stakeOwnerOf(taker)`;\n * `selectedStakeOwner` is the raw selection, which is only meaningful while\n * `selectionAuthorized` remains true. The two must never be conflated: a\n * stale selection falls back to self-stake on the contract side.\n * `admissionsPaused` comes from the vault's DisputeProtectionPolicy controller and\n * blocks new dispute-protected admissions while true.\n */\nexport type StakeVaultState = {\n staker: Address;\n taker: Address;\n stakeToken: Address;\n stakeOwner: Address;\n selectedStakeOwner: Address | null;\n selectionAuthorized: boolean;\n staked: bigint;\n locked: bigint;\n free: bigint;\n claimable: bigint;\n admissionsPaused: boolean;\n};\n\ntype StakeOperationsConfig = {\n getPublicClient: () => PublicClient;\n getStakeVaultAddress: () => Address | undefined;\n getStakeVaultAbi: () => Abi | undefined;\n getStakeTokenAddress: () => Address | undefined;\n getDisputeProtectionPolicyAddress: () => Address | undefined;\n getDisputeProtectionPolicyAbi: () => Abi | undefined;\n};\n\nexport class StakeOperations {\n constructor(private readonly config: StakeOperationsConfig) {}\n\n getContract(): { address: Address; abi: Abi; stakeToken: Address } {\n const address = this.config.getStakeVaultAddress();\n const abi = this.config.getStakeVaultAbi();\n const stakeToken = this.config.getStakeTokenAddress();\n if (!address || !abi || !stakeToken) {\n throw new Error('StakeVault not available for this chain/environment');\n }\n return { address, abi, stakeToken };\n }\n\n getPolicyContract(): { address: Address; abi: Abi } {\n const address = this.config.getDisputeProtectionPolicyAddress();\n const abi = this.config.getDisputeProtectionPolicyAbi();\n if (!address || !abi) {\n throw new Error('DisputeProtectionPolicy not available for this chain/environment');\n }\n return { address, abi };\n }\n\n private read<T>(functionName: string, args: readonly unknown[] = []): Promise<T> {\n const { address, abi } = this.getContract();\n return this.config.getPublicClient().readContract({\n address,\n abi,\n functionName,\n args,\n }) as unknown as Promise<T>;\n }\n\n private readPolicy<T>(functionName: string, args: readonly unknown[] = []): Promise<T> {\n const { address, abi } = this.getPolicyContract();\n return this.config.getPublicClient().readContract({\n address,\n abi,\n functionName,\n args,\n }) as unknown as Promise<T>;\n }\n\n getStakeBalance(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('stakeBalance', [stakeOwner]);\n }\n\n getLockedStake(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('lockedStake', [stakeOwner]);\n }\n\n getFreeStake(stakeOwner: Address): Promise<bigint> {\n return this.read<bigint>('freeStake', [stakeOwner]);\n }\n\n getClaimable(beneficiary: Address): Promise<bigint> {\n return this.read<bigint>('claimable', [beneficiary]);\n }\n\n getStakeOwner(taker: Address): Promise<Address> {\n return this.read<Address>('stakeOwnerOf', [taker]);\n }\n\n getSelectedStakeOwner(taker: Address): Promise<Address> {\n return this.read<Address>('selectedStakeOwner', [taker]);\n }\n\n getTakerAuthorization(stakeOwner: Address, taker: Address): Promise<boolean> {\n return this.read<boolean>('authorizedTakers', [stakeOwner, taker]);\n }\n\n /** Whether the policy is refusing new dispute-protected admissions. */\n getAdmissionsPaused(): Promise<boolean> {\n return this.readPolicy<boolean>('admissionsPaused');\n }\n\n /**\n * Minimum collateral lock window for a payment method, in seconds. Zero\n * means intents on this method admit unbonded — no stake is locked at all.\n */\n getRiskWindow(paymentMethodHash: `0x${string}`): Promise<bigint> {\n return this.readPolicy<bigint>('getRiskWindow', [paymentMethodHash]);\n }\n\n /** Whether a specific escrow deposit payment method has opted into dispute protection. */\n isDisputeProtectionEnabled(\n escrow: Address,\n depositId: bigint,\n paymentMethod: `0x${string}`,\n ): Promise<boolean> {\n return this.readPolicy<boolean>('isDisputeProtectionEnabled', [\n escrow,\n depositId,\n paymentMethod,\n ]);\n }\n\n async getStakeVaultState(params: { staker: Address; taker?: Address }): Promise<StakeVaultState> {\n const taker = params.taker ?? params.staker;\n const { stakeToken } = this.getContract();\n const [stakeOwner, rawSelection, staked, locked, free, claimable, admissionsPaused] =\n await Promise.all([\n this.getStakeOwner(taker),\n this.getSelectedStakeOwner(taker),\n this.getStakeBalance(params.staker),\n this.getLockedStake(params.staker),\n this.getFreeStake(params.staker),\n this.getClaimable(params.staker),\n this.getAdmissionsPaused(),\n ]);\n\n const selectedStakeOwner = rawSelection === zeroAddress ? null : rawSelection;\n const selectionAuthorized = selectedStakeOwner\n ? await this.getTakerAuthorization(selectedStakeOwner, taker)\n : false;\n\n return {\n staker: params.staker,\n taker,\n stakeToken,\n stakeOwner,\n selectedStakeOwner,\n selectionAuthorized,\n staked,\n locked,\n free,\n claimable,\n admissionsPaused,\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;\nconst EVM_ADDRESS_REGEX = /^0x[a-f0-9]{40}$/;\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 escapeLikePatternLiteral(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\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 (!EVM_ADDRESS_REGEX.test(rateManagerAddress) || !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 = escapeLikePatternLiteral(normalizeRateManagerId(rateManagerId));\n const normalizedRateManagerAddress = escapeLikePatternLiteral(\n normalizeAddress(rateManagerAddress),\n );\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 if (value.includes(':')) {\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: 'desc' }],\n limit: options?.limit ?? 365,\n },\n });\n\n return (result.ManagerDailySnapshot ?? []).reverse();\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\n try {\n // Raw event IDs use chainId_blockNumber_logIndex format, NOT the\n // scoped address pattern used by aggregate entities. Filtering by\n // rateManagerId alone is sufficient — the rateManagerAddress scope\n // does not appear in raw event IDs.\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 },\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 // Legacy V1 events use chainId_blockNumber_logIndex IDs, not the\n // scoped pattern — filter by rateManagerId alone.\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 },\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 { isAddress, type Address } from 'viem';\n\nimport { ValidationError } from '../errors';\nimport type { StakeEnvironment, TakerStakeBalances } from '../types';\nimport type { IndexerClient } from './client';\nimport {\n DISPUTE_PROTECTION_INTENTS_QUERY,\n STAKE_ACTIVITY_QUERY,\n STAKE_LOCKS_QUERY,\n STAKING_STATE_QUERY,\n TAKER_STAKE_AUTHORIZATIONS_QUERY,\n} from './queries';\nimport type {\n DisputeProtectionIntentEntity,\n DisputeProtectionRiskWindowEntity,\n ClaimAccountStateEntity,\n StakeActivityEntity,\n StakeActivityKind,\n StakeAccountStateEntity,\n StakeLockEntity,\n StakeLockStatus,\n StakeVaultConfigEntity,\n TakerStakeAuthorizationEntity,\n TakerStakeAuthorizationRowEntity,\n TakerStakeStateEntity,\n} from './types';\n\nconst DEFAULT_PAGE_LIMIT = 50;\nconst MAX_PAGE_LIMIT = 100;\n\nexport type IndexedPageAsOf = {\n /** Latest entity update/event block observed in this page, not an indexer-head guarantee. */\n blockNumber: string;\n /** Timestamp paired with the observed page row. */\n timestamp: string;\n};\n\nexport type IndexedPage<T> = {\n items: T[];\n /** Opaque keyset cursor. Pass it back unchanged; null means this page is exhausted. */\n nextCursor: string | null;\n /** Latest row observed in this page. This is not a strong-consistency watermark. */\n asOf: IndexedPageAsOf | null;\n};\n\ntype PageParams = {\n chainId: number;\n limit?: number;\n cursor?: string;\n};\n\nexport type StakeLockPageParams = PageParams & {\n vaultAddress: Address;\n stakeOwner: Address;\n status?: StakeLockStatus;\n};\n\n/**\n * Exactly one of `stakeOwner` (owner side: the takers this stake owner has\n * authorized) or `taker` (taker side: the stake owners that have authorized\n * this taker) scopes the page.\n */\nexport type TakerStakeAuthorizationPageParams = PageParams & {\n vaultAddress: Address;\n authorized?: boolean;\n} & ({ stakeOwner: Address; taker?: never } | { taker: Address; stakeOwner?: never });\n\nexport type StakeActivityPageParams = PageParams & {\n vaultAddress: Address;\n /** Merchant address matched against either the immutable owner or taker side. */\n merchant: Address;\n kind?: StakeActivityKind;\n};\n\nexport type DisputeProtectionIntentPageParams = PageParams & {\n /** Exact active policy whose finalized dispute stream is being consumed. */\n policyAddress: Address;\n /** Inclusive code-owned finality cutoff for this ingestion pass. */\n throughBlockNumber: string;\n};\n\nexport type IndexedStakeLock = {\n lockId: string;\n stakeOwner: Address;\n initialAmount: string;\n currentAmount: string;\n maturesAt: string;\n status: StakeLockStatus;\n unlockedAmount: string;\n claimedAmount: string;\n createdAt: string;\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedTakerStakeAuthorization = {\n taker: Address;\n stakeOwner: Address;\n authorized: boolean;\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedStakeActivity = {\n stakeOwner: Address | null;\n taker: Address | null;\n beneficiary: Address | null;\n kind: StakeActivityKind;\n lockId: string | null;\n counterparty: Address | null;\n amount: string;\n previousAmount: string | null;\n stakeBalanceAfter: string | null;\n lockedStakeAfter: string | null;\n freeStakeAfter: string | null;\n claimableAfter: string | null;\n maturesAt: string | null;\n blockNumber: string;\n logIndex: string;\n timestamp: string;\n};\n\nexport type IndexedDisputeProtectionIntent = {\n policyAddress: Address;\n intentHash: string;\n status: 'DISPUTED';\n stakeOwner: Address;\n depositor: Address;\n taker: Address;\n paymentMethod: string;\n amount: string;\n riskWindow: string;\n releaseEligibleAt: string | null;\n releaseAmount: string | null;\n isManualRelease: boolean | null;\n compensatedAmount: string | null;\n disputeId: string | null;\n openedAt: string;\n openedTxHash: string;\n cancelledAt: string | null;\n cancelledTxHash: string | null;\n settledAt: string | null;\n settledTxHash: string | null;\n releasedAt: string | null;\n releasedTxHash: string | null;\n disputedAt: string;\n disputedTxHash: string;\n disputedAtBlockNumber: string;\n disputedAtLogIndex: string;\n updatedAt: string;\n};\n\nexport type DisputeProtectionIntentPage = IndexedPage<IndexedDisputeProtectionIntent> & {\n /**\n * Opaque cursor for the final returned item, including a terminal page.\n * Persist this after committing the page; null means the page was empty.\n */\n endCursor: string | null;\n};\n\ntype EventCursor = {\n blockNumber: string;\n logIndex: string;\n id: string;\n};\n\ntype LocksGraphQLResponse = { StakeLock: StakeLockEntity[] };\ntype AuthorizationsGraphQLResponse = {\n TakerStakeAuthorization: TakerStakeAuthorizationRowEntity[];\n};\ntype ActivityGraphQLResponse = { StakeActivity: StakeActivityEntity[] };\ntype DisputesGraphQLResponse = {\n DisputeProtectionIntent: DisputeProtectionIntentEntity[];\n};\n\nexport type IndexedStakingStateParams = {\n chainId: number;\n environment: StakeEnvironment;\n vaultAddress: Address;\n disputeProtectionPolicyAddress: Address;\n taker: Address;\n /** Effective owner from the caller's fresh stakeOwnerOf(taker) read. */\n stakeOwner: Address;\n};\n\nexport type IndexedStakingRowFreshness = {\n updatedAtBlockNumber: string;\n updatedAt: string;\n};\n\nexport type IndexedTakerAuthorization = {\n stakeOwner: Address;\n authorized: boolean;\n freshness: IndexedStakingRowFreshness;\n};\n\nexport type IndexedRiskWindow = {\n /** Payment method hash the window applies to. */\n paymentMethod: string;\n /**\n * Minimum collateral lock window in seconds. The policy locks the full\n * intent amount for at least this long after settlement; a method with no\n * row (or a zero window) admits unbonded.\n */\n riskWindowSeconds: string;\n updatedAt: string;\n};\n\nexport type IndexedStakingState = {\n chainId: number;\n environment: StakeEnvironment;\n taker: Address;\n /** Effective owner from the indexed TakerStakeState, or the taker when absent. */\n stakeOwner: Address;\n selectedStakeOwner: Address | null;\n selectionAuthorized: boolean;\n stake: TakerStakeBalances;\n claimableUsdc: string;\n authorizations: IndexedTakerAuthorization[];\n /**\n * Per-payment-method minimum lock windows from the DisputeProtectionPolicy. The\n * global admissions pause is intentionally absent from the indexed model —\n * read it on-chain (`admissionsPaused()`), where it is authoritative.\n */\n riskWindows: IndexedRiskWindow[];\n vault: {\n controller: Address | null;\n pendingController: Address | null;\n pendingControllerValidAt: string | null;\n } | null;\n /**\n * False when the indexer's effective owner has not caught up with the\n * caller's onchain owner. In that case stake defaults to zero rather than\n * attributing another owner's account to this taker.\n */\n stakeAccountMatchesEffectiveOwner: boolean;\n freshness: {\n takerStakeState: IndexedStakingRowFreshness | null;\n stakeAccountState: IndexedStakingRowFreshness | null;\n claimAccountState: IndexedStakingRowFreshness | null;\n stakeVaultConfig: IndexedStakingRowFreshness | null;\n authorizations: IndexedStakingRowFreshness[];\n /**\n * Latest block fully processed by the indexer for this chain. Entity\n * update blocks above remain provenance and do not measure indexer lag.\n */\n indexerHeadBlockNumber: string | null;\n };\n};\n\ntype ChainMetadataEntity = {\n chain_id: number;\n latest_processed_block: number;\n};\n\ntype StakingStateGraphQLResponse = {\n TakerStakeState_by_pk: TakerStakeStateEntity | null;\n StakeAccountState_by_pk: StakeAccountStateEntity | null;\n ClaimAccountState_by_pk: ClaimAccountStateEntity | null;\n TakerStakeAuthorization: TakerStakeAuthorizationEntity[];\n DisputeProtectionRiskWindow: DisputeProtectionRiskWindowEntity[];\n StakeVaultConfig_by_pk: StakeVaultConfigEntity | null;\n chain_metadata: ChainMetadataEntity[];\n};\n\nexport type StakingEntityIds = {\n takerStateId: string;\n stakeAccountId: string;\n claimAccountId: string;\n vaultConfigId: string;\n /** Lowercased policy address used to filter risk-window rows. */\n policy: string;\n};\n\nconst ZERO_STAKE: TakerStakeBalances = {\n totalUsdc: '0',\n lockedUsdc: '0',\n freeUsdc: '0',\n};\n\nfunction normalizeAddress(value: string, field: string): Address {\n if (!isAddress(value)) {\n throw new ValidationError(`${field} must be a valid Ethereum address`, field);\n }\n return value.toLowerCase() as Address;\n}\n\nfunction normalizeNullableAddress(value: string | null | undefined, field: string): Address | null {\n return value ? normalizeAddress(value, field) : null;\n}\n\nfunction normalizeDecimal(value: string, field: string): string {\n if (!/^\\d+$/.test(value)) {\n throw new Error(`${field} must be an unsigned decimal string`);\n }\n return value;\n}\n\nfunction normalizeOptionalDecimal(value: string | null | undefined, field: string): string | null {\n return value === null || value === undefined ? null : normalizeDecimal(value, field);\n}\n\nfunction validateChainId(chainId: number): void {\n if (!Number.isInteger(chainId) || chainId <= 0) {\n throw new ValidationError('chainId must be a positive integer', 'chainId');\n }\n}\n\nfunction validateLimit(limit: number | undefined): number {\n const resolved = limit ?? DEFAULT_PAGE_LIMIT;\n if (!Number.isInteger(resolved) || resolved < 1 || resolved > MAX_PAGE_LIMIT) {\n throw new ValidationError('limit must be an integer from 1 to 100', 'limit');\n }\n return resolved;\n}\n\nfunction encodeCursor(prefix: string, value: unknown): string {\n const encoded = btoa(JSON.stringify(value))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n return `${prefix}.${encoded}`;\n}\n\nfunction decodeCursor<T>(cursor: string, prefix: string, validate: (value: unknown) => T): T {\n try {\n const encoded = cursor\n .slice(prefix.length + 1)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n const padded = encoded.padEnd(Math.ceil(encoded.length / 4) * 4, '=');\n if (!cursor.startsWith(`${prefix}.`) || encoded.length === 0) {\n throw new Error('wrong cursor kind');\n }\n return validate(JSON.parse(atob(padded)));\n } catch {\n throw new ValidationError(`cursor must be a valid ${prefix} cursor`, 'cursor');\n }\n}\n\nfunction decodeIdCursor(cursor: string, prefix: string): string {\n return decodeCursor(cursor, prefix, (value) => {\n if (\n typeof value !== 'object' ||\n value === null ||\n typeof Reflect.get(value, 'id') !== 'string'\n ) {\n throw new Error('invalid id cursor');\n }\n const id = Reflect.get(value, 'id') as string;\n if (id.length === 0) throw new Error('invalid id cursor');\n return id;\n });\n}\n\nfunction decodeEventCursor(cursor: string, prefix: string): EventCursor {\n return decodeCursor(cursor, prefix, (value) => {\n if (typeof value !== 'object' || value === null) throw new Error('invalid event cursor');\n const blockNumber = Reflect.get(value, 'blockNumber');\n const logIndex = Reflect.get(value, 'logIndex');\n const id = Reflect.get(value, 'id');\n if (typeof blockNumber !== 'string' || typeof logIndex !== 'string' || typeof id !== 'string') {\n throw new Error('invalid event cursor');\n }\n if (id.length === 0) throw new Error('invalid event cursor');\n return {\n blockNumber: normalizeDecimal(blockNumber, 'cursor.blockNumber'),\n logIndex: normalizeDecimal(logIndex, 'cursor.logIndex'),\n id,\n };\n });\n}\n\nfunction compareEventCursor(left: EventCursor, right: EventCursor): number {\n const leftBlock = BigInt(left.blockNumber);\n const rightBlock = BigInt(right.blockNumber);\n if (leftBlock !== rightBlock) return leftBlock < rightBlock ? -1 : 1;\n const leftLog = BigInt(left.logIndex);\n const rightLog = BigInt(right.logIndex);\n if (leftLog !== rightLog) return leftLog < rightLog ? -1 : 1;\n return left.id === right.id ? 0 : left.id < right.id ? -1 : 1;\n}\n\nfunction eventKeysetPredicate(cursor: EventCursor, blockField: string, logField: string) {\n return {\n _or: [\n { [blockField]: { _gt: cursor.blockNumber } },\n {\n _and: [\n { [blockField]: { _eq: cursor.blockNumber } },\n { [logField]: { _gt: cursor.logIndex } },\n ],\n },\n {\n _and: [\n { [blockField]: { _eq: cursor.blockNumber } },\n { [logField]: { _eq: cursor.logIndex } },\n { id: { _gt: cursor.id } },\n ],\n },\n ],\n };\n}\n\nconst STAKE_LOCK_STATUSES = new Set<StakeLockStatus>(['ACTIVE', 'UNLOCKED', 'RESOLVED']);\nconst STAKE_ACTIVITY_KINDS = new Set<StakeActivityKind>([\n 'DEPOSITED',\n 'WITHDRAWN',\n 'TAKER_AUTHORIZATION_UPDATED',\n 'STAKE_OWNER_SELECTED',\n 'LOCK_FUNDED',\n 'STAKE_LOCKED',\n 'STAKE_LOCK_INCREASED',\n 'STAKE_LOCK_RESIZED',\n 'STAKE_UNLOCKED',\n 'STAKE_LOCK_RESOLVED',\n 'CLAIM_CREATED',\n 'CLAIM_WITHDRAWN',\n]);\n\nfunction normalizeLockStatus(value: string, field: string): StakeLockStatus {\n if (!STAKE_LOCK_STATUSES.has(value as StakeLockStatus)) {\n throw new Error(`${field} is not a supported stake lock status`);\n }\n return value as StakeLockStatus;\n}\n\nfunction normalizeActivityKind(value: string, field: string): StakeActivityKind {\n if (!STAKE_ACTIVITY_KINDS.has(value as StakeActivityKind)) {\n throw new Error(`${field} is not a supported stake activity kind`);\n }\n return value as StakeActivityKind;\n}\n\nfunction latestUpdatedAsOf(\n items: Array<{ updatedAtBlockNumber: string; updatedAt: string }>,\n): IndexedPageAsOf | null {\n if (items.length === 0) return null;\n const latest = items.reduce((current, item) =>\n BigInt(item.updatedAtBlockNumber) > BigInt(current.updatedAtBlockNumber) ? item : current,\n );\n return { blockNumber: latest.updatedAtBlockNumber, timestamp: latest.updatedAt };\n}\n\nfunction assertNonEmptyId(id: string, field: string): string {\n if (id.length === 0) throw new Error(`${field} must not be empty`);\n return id;\n}\n\nfunction normalizeStakeLockRow(\n row: StakeLockEntity,\n index: number,\n scope: { chainId: number; vaultAddress: Address; stakeOwner: Address; status?: StakeLockStatus },\n): IndexedStakeLock {\n const field = `StakeLock[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const stakeOwner = normalizeAddress(row.stakeOwner, `${field}.stakeOwner`);\n if (stakeOwner !== scope.stakeOwner) {\n throw new Error(`${field}.stakeOwner does not match the query`);\n }\n const status = normalizeLockStatus(row.status, `${field}.status`);\n if (scope.status && status !== scope.status) {\n throw new Error(`${field}.status does not match the query`);\n }\n return {\n lockId: assertNonEmptyId(row.lockId, `${field}.lockId`),\n stakeOwner,\n initialAmount: normalizeDecimal(row.initialAmount, `${field}.initialAmount`),\n currentAmount: normalizeDecimal(row.currentAmount, `${field}.currentAmount`),\n maturesAt: normalizeDecimal(row.maturesAt, `${field}.maturesAt`),\n status,\n unlockedAmount: normalizeDecimal(row.unlockedAmount, `${field}.unlockedAmount`),\n claimedAmount: normalizeDecimal(row.claimedAmount, `${field}.claimedAmount`),\n createdAt: normalizeDecimal(row.createdAt, `${field}.createdAt`),\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction normalizeTakerStakeAuthorizationRow(\n row: TakerStakeAuthorizationRowEntity,\n index: number,\n scope: {\n chainId: number;\n vaultAddress: Address;\n side: 'stakeOwner' | 'taker';\n scopedAddress: Address;\n authorized?: boolean;\n },\n): IndexedTakerStakeAuthorization {\n const field = `TakerStakeAuthorization[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const taker = normalizeAddress(row.taker, `${field}.taker`);\n const stakeOwner = normalizeAddress(row.stakeOwner, `${field}.stakeOwner`);\n const scoped = scope.side === 'stakeOwner' ? stakeOwner : taker;\n if (scoped !== scope.scopedAddress) {\n throw new Error(`${field}.${scope.side} does not match the query`);\n }\n if (typeof row.authorized !== 'boolean') {\n throw new Error(`${field}.authorized must be a boolean`);\n }\n if (scope.authorized !== undefined && row.authorized !== scope.authorized) {\n throw new Error(`${field}.authorized does not match the query`);\n }\n return {\n taker,\n stakeOwner,\n authorized: row.authorized,\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction normalizeStakeActivityRow(\n row: StakeActivityEntity,\n index: number,\n scope: { chainId: number; vaultAddress: Address; merchant: Address; kind?: StakeActivityKind },\n): { item: IndexedStakeActivity; cursor: EventCursor } {\n const field = `StakeActivity[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n if (normalizeAddress(row.vaultAddress, `${field}.vaultAddress`) !== scope.vaultAddress) {\n throw new Error(`${field}.vaultAddress does not match the query`);\n }\n const stakeOwner = normalizeNullableAddress(row.stakeOwner, `${field}.stakeOwner`);\n const taker = normalizeNullableAddress(row.taker, `${field}.taker`);\n if (stakeOwner !== scope.merchant && taker !== scope.merchant) {\n throw new Error(`${field} is not relevant to the requested merchant`);\n }\n const kind = normalizeActivityKind(row.kind, `${field}.kind`);\n if (scope.kind && kind !== scope.kind) {\n throw new Error(`${field}.kind does not match the query`);\n }\n const blockNumber = normalizeDecimal(row.blockNumber, `${field}.blockNumber`);\n const logIndex = normalizeDecimal(row.logIndex, `${field}.logIndex`);\n const id = assertNonEmptyId(row.id, `${field}.id`);\n return {\n item: {\n stakeOwner,\n taker,\n beneficiary: normalizeNullableAddress(row.beneficiary, `${field}.beneficiary`),\n kind,\n lockId: row.lockId ?? null,\n counterparty: normalizeNullableAddress(row.counterparty, `${field}.counterparty`),\n amount: normalizeDecimal(row.amount, `${field}.amount`),\n previousAmount: normalizeOptionalDecimal(row.previousAmount, `${field}.previousAmount`),\n stakeBalanceAfter: normalizeOptionalDecimal(\n row.stakeBalanceAfter,\n `${field}.stakeBalanceAfter`,\n ),\n lockedStakeAfter: normalizeOptionalDecimal(row.lockedStakeAfter, `${field}.lockedStakeAfter`),\n freeStakeAfter: normalizeOptionalDecimal(row.freeStakeAfter, `${field}.freeStakeAfter`),\n claimableAfter: normalizeOptionalDecimal(row.claimableAfter, `${field}.claimableAfter`),\n maturesAt: normalizeOptionalDecimal(row.maturesAt, `${field}.maturesAt`),\n blockNumber,\n logIndex,\n timestamp: normalizeDecimal(row.timestamp, `${field}.timestamp`),\n },\n cursor: { blockNumber, logIndex, id },\n };\n}\n\nfunction normalizeDisputeRow(\n row: DisputeProtectionIntentEntity,\n index: number,\n scope: { chainId: number; policyAddress: Address; throughBlockNumber: string },\n): { item: IndexedDisputeProtectionIntent; cursor: EventCursor } {\n const field = `DisputeProtectionIntent[${index}]`;\n if (row.chainId !== scope.chainId) throw new Error(`${field}.chainId does not match the query`);\n const policyAddress = normalizeAddress(row.policyAddress, `${field}.policyAddress`);\n if (policyAddress !== scope.policyAddress) {\n throw new Error(`${field}.policyAddress does not match the query`);\n }\n if (row.status !== 'DISPUTED') throw new Error(`${field}.status must be DISPUTED`);\n if (\n row.disputedAtBlockNumber === null ||\n row.disputedAtBlockNumber === undefined ||\n row.disputedAtLogIndex === null ||\n row.disputedAtLogIndex === undefined ||\n row.disputedAt === null ||\n row.disputedAt === undefined ||\n row.disputedTxHash === null ||\n row.disputedTxHash === undefined\n ) {\n throw new Error(`${field} DISPUTED row must include its finalized event cursor`);\n }\n const blockNumber = normalizeDecimal(row.disputedAtBlockNumber, `${field}.disputedAtBlockNumber`);\n if (BigInt(blockNumber) > BigInt(scope.throughBlockNumber)) {\n throw new Error(`${field}.disputedAtBlockNumber exceeds throughBlockNumber`);\n }\n const logIndex = normalizeDecimal(row.disputedAtLogIndex, `${field}.disputedAtLogIndex`);\n const disputedAt = normalizeDecimal(row.disputedAt, `${field}.disputedAt`);\n const id = assertNonEmptyId(row.id, `${field}.id`);\n return {\n item: {\n policyAddress,\n intentHash: row.intentHash,\n status: 'DISPUTED',\n stakeOwner: normalizeAddress(row.stakeOwner, `${field}.stakeOwner`),\n depositor: normalizeAddress(row.depositor, `${field}.depositor`),\n taker: normalizeAddress(row.taker, `${field}.taker`),\n paymentMethod: row.paymentMethod,\n amount: normalizeDecimal(row.amount, `${field}.amount`),\n riskWindow: normalizeDecimal(row.riskWindow, `${field}.riskWindow`),\n releaseEligibleAt: normalizeOptionalDecimal(\n row.releaseEligibleAt,\n `${field}.releaseEligibleAt`,\n ),\n releaseAmount: normalizeOptionalDecimal(row.releaseAmount, `${field}.releaseAmount`),\n isManualRelease: row.isManualRelease ?? null,\n compensatedAmount: normalizeOptionalDecimal(\n row.compensatedAmount,\n `${field}.compensatedAmount`,\n ),\n disputeId: row.disputeId ?? null,\n openedAt: normalizeDecimal(row.openedAt, `${field}.openedAt`),\n openedTxHash: row.openedTxHash,\n cancelledAt: normalizeOptionalDecimal(row.cancelledAt, `${field}.cancelledAt`),\n cancelledTxHash: row.cancelledTxHash ?? null,\n settledAt: normalizeOptionalDecimal(row.settledAt, `${field}.settledAt`),\n settledTxHash: row.settledTxHash ?? null,\n releasedAt: normalizeOptionalDecimal(row.releasedAt, `${field}.releasedAt`),\n releasedTxHash: row.releasedTxHash ?? null,\n disputedAt,\n disputedTxHash: row.disputedTxHash,\n disputedAtBlockNumber: blockNumber,\n disputedAtLogIndex: logIndex,\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n },\n cursor: { blockNumber, logIndex, id },\n };\n}\n\nfunction freshnessOf(\n row: { updatedAtBlockNumber: string; updatedAt: string } | null,\n field: string,\n): IndexedStakingRowFreshness | null {\n if (!row) return null;\n return {\n updatedAtBlockNumber: normalizeDecimal(\n row.updatedAtBlockNumber,\n `${field}.updatedAtBlockNumber`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `${field}.updatedAt`),\n };\n}\n\nfunction indexerHeadBlockNumber(rows: ChainMetadataEntity[], chainId: number): string | null {\n const row = rows[0];\n if (row === undefined) return null;\n if (row.chain_id !== chainId) {\n throw new Error('chain_metadata.chain_id does not match the query');\n }\n if (!Number.isSafeInteger(row.latest_processed_block) || row.latest_processed_block < 0) {\n throw new Error('chain_metadata.latest_processed_block must be a non-negative safe integer');\n }\n return row.latest_processed_block.toString();\n}\n\nexport function buildStakingEntityIds(params: IndexedStakingStateParams): StakingEntityIds {\n if (!Number.isInteger(params.chainId) || params.chainId <= 0) {\n throw new ValidationError('chainId must be a positive integer', 'chainId');\n }\n\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const disputeProtectionPolicyAddress = normalizeAddress(\n params.disputeProtectionPolicyAddress,\n 'disputeProtectionPolicyAddress',\n );\n const taker = normalizeAddress(params.taker, 'taker');\n const stakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n\n return {\n takerStateId: `${params.chainId}_${vaultAddress}_${taker}`,\n stakeAccountId: `${params.chainId}_${vaultAddress}_${stakeOwner}`,\n claimAccountId: `${params.chainId}_${vaultAddress}_${taker}`,\n vaultConfigId: `${params.chainId}_${vaultAddress}`,\n policy: disputeProtectionPolicyAddress,\n };\n}\n\nexport class IndexerStakingService {\n constructor(private readonly client: IndexerClient) {}\n\n async fetchStakeLocks(\n params: StakeLockPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedStakeLock>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const stakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n const status = params.status ? normalizeLockStatus(params.status, 'status') : undefined;\n const afterId = params.cursor ? decodeIdCursor(params.cursor, 'zkp2p-lock-v1') : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n { stakeOwner: { _eq: stakeOwner } },\n ];\n if (status) filters.push({ status: { _eq: status } });\n if (afterId) filters.push({ id: { _gt: afterId } });\n\n const data = await this.client.query<LocksGraphQLResponse>(\n {\n query: STAKE_LOCKS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previousId = afterId;\n const normalized = data.StakeLock.map((row, index) => {\n const id = assertNonEmptyId(row.id, `StakeLock[${index}].id`);\n if (previousId !== undefined && id <= previousId) {\n throw new Error('StakeLock cursor did not advance');\n }\n previousId = id;\n return {\n item: normalizeStakeLockRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n stakeOwner,\n status,\n }),\n id,\n };\n });\n const visible = normalized.slice(0, limit);\n const items = visible.map(({ item }) => item);\n return {\n items,\n nextCursor:\n normalized.length > limit\n ? encodeCursor('zkp2p-lock-v1', { id: visible[visible.length - 1]!.id })\n : null,\n asOf: latestUpdatedAsOf(items),\n };\n }\n\n /**\n * Pages one side of the vault's authorization graph: takers a stake owner\n * has authorized, or stake owners that have authorized a taker. Exactly one\n * of `stakeOwner` or `taker` scopes the page.\n */\n async fetchTakerStakeAuthorizations(\n params: TakerStakeAuthorizationPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedTakerStakeAuthorization>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n if ((params.stakeOwner === undefined) === (params.taker === undefined)) {\n throw new ValidationError(\n 'exactly one of stakeOwner or taker must be provided',\n 'stakeOwner',\n );\n }\n const scope =\n params.stakeOwner !== undefined\n ? ({\n side: 'stakeOwner',\n address: normalizeAddress(params.stakeOwner, 'stakeOwner'),\n } as const)\n : ({ side: 'taker', address: normalizeAddress(params.taker, 'taker') } as const);\n const afterId = params.cursor\n ? decodeIdCursor(params.cursor, 'zkp2p-stake-auth-v1')\n : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n { [scope.side]: { _eq: scope.address } },\n ];\n if (params.authorized !== undefined) filters.push({ authorized: { _eq: params.authorized } });\n if (afterId) filters.push({ id: { _gt: afterId } });\n\n const data = await this.client.query<AuthorizationsGraphQLResponse>(\n {\n query: TAKER_STAKE_AUTHORIZATIONS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previousId = afterId;\n const normalized = data.TakerStakeAuthorization.map((row, index) => {\n const id = assertNonEmptyId(row.id, `TakerStakeAuthorization[${index}].id`);\n if (previousId !== undefined && id <= previousId) {\n throw new Error('TakerStakeAuthorization cursor did not advance');\n }\n previousId = id;\n return {\n item: normalizeTakerStakeAuthorizationRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n side: scope.side,\n scopedAddress: scope.address,\n authorized: params.authorized,\n }),\n id,\n };\n });\n const visible = normalized.slice(0, limit);\n const items = visible.map(({ item }) => item);\n return {\n items,\n nextCursor:\n normalized.length > limit\n ? encodeCursor('zkp2p-stake-auth-v1', { id: visible[visible.length - 1]!.id })\n : null,\n asOf: latestUpdatedAsOf(items),\n };\n }\n\n async fetchStakeActivity(\n params: StakeActivityPageParams,\n init?: RequestInit,\n ): Promise<IndexedPage<IndexedStakeActivity>> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const merchant = normalizeAddress(params.merchant, 'merchant');\n const kind = params.kind ? normalizeActivityKind(params.kind, 'kind') : undefined;\n const after = params.cursor ? decodeEventCursor(params.cursor, 'zkp2p-activity-v1') : undefined;\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { vaultAddress: { _eq: vaultAddress } },\n {\n _or: [{ stakeOwner: { _eq: merchant } }, { taker: { _eq: merchant } }],\n },\n ];\n if (kind) filters.push({ kind: { _eq: kind } });\n if (after) filters.push(eventKeysetPredicate(after, 'blockNumber', 'logIndex'));\n\n const data = await this.client.query<ActivityGraphQLResponse>(\n {\n query: STAKE_ACTIVITY_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previous = after;\n const normalized = data.StakeActivity.map((row, index) => {\n const result = normalizeStakeActivityRow(row, index, {\n chainId: params.chainId,\n vaultAddress,\n merchant,\n kind,\n });\n if (previous && compareEventCursor(result.cursor, previous) <= 0) {\n throw new Error('StakeActivity cursor did not advance');\n }\n previous = result.cursor;\n return result;\n });\n const visible = normalized.slice(0, limit);\n const last = visible[visible.length - 1];\n return {\n items: visible.map(({ item }) => item),\n nextCursor:\n normalized.length > limit && last ? encodeCursor('zkp2p-activity-v1', last.cursor) : null,\n asOf: last ? { blockNumber: last.item.blockNumber, timestamp: last.item.timestamp } : null,\n };\n }\n\n async fetchDisputeProtectionIntents(\n params: DisputeProtectionIntentPageParams,\n init?: RequestInit,\n ): Promise<DisputeProtectionIntentPage> {\n validateChainId(params.chainId);\n const limit = validateLimit(params.limit);\n const policyAddress = normalizeAddress(params.policyAddress, 'policyAddress');\n const throughBlockNumber = normalizeDecimal(params.throughBlockNumber, 'throughBlockNumber');\n const after = params.cursor ? decodeEventCursor(params.cursor, 'zkp2p-dispute-v1') : undefined;\n if (after && BigInt(after.blockNumber) > BigInt(throughBlockNumber)) {\n throw new ValidationError('cursor exceeds throughBlockNumber', 'cursor');\n }\n const filters: Array<Record<string, unknown>> = [\n { chainId: { _eq: params.chainId } },\n { policyAddress: { _eq: policyAddress } },\n { status: { _eq: 'DISPUTED' } },\n { disputedAtBlockNumber: { _lte: throughBlockNumber } },\n ];\n if (after) {\n filters.push(eventKeysetPredicate(after, 'disputedAtBlockNumber', 'disputedAtLogIndex'));\n }\n\n const data = await this.client.query<DisputesGraphQLResponse>(\n {\n query: DISPUTE_PROTECTION_INTENTS_QUERY,\n variables: { limit: limit + 1, where: { _and: filters } },\n },\n init,\n );\n let previous = after;\n const normalized = data.DisputeProtectionIntent.map((row, index) => {\n const result = normalizeDisputeRow(row, index, {\n chainId: params.chainId,\n policyAddress,\n throughBlockNumber,\n });\n if (previous && compareEventCursor(result.cursor, previous) <= 0) {\n throw new Error('DisputeProtectionIntent cursor did not advance');\n }\n previous = result.cursor;\n return result;\n });\n const visible = normalized.slice(0, limit);\n const last = visible[visible.length - 1];\n return {\n items: visible.map(({ item }) => item),\n nextCursor:\n normalized.length > limit && last ? encodeCursor('zkp2p-dispute-v1', last.cursor) : null,\n endCursor: last ? encodeCursor('zkp2p-dispute-v1', last.cursor) : null,\n asOf: last\n ? { blockNumber: last.item.disputedAtBlockNumber, timestamp: last.item.disputedAt }\n : null,\n };\n }\n\n async fetchStakingState(\n params: IndexedStakingStateParams,\n init?: RequestInit,\n ): Promise<IndexedStakingState> {\n const ids = buildStakingEntityIds(params);\n const vaultAddress = normalizeAddress(params.vaultAddress, 'vaultAddress');\n const taker = normalizeAddress(params.taker, 'taker');\n const requestedStakeOwner = normalizeAddress(params.stakeOwner, 'stakeOwner');\n\n const data = await this.client.query<StakingStateGraphQLResponse>(\n {\n query: STAKING_STATE_QUERY,\n variables: {\n ...ids,\n chainId: params.chainId,\n vault: vaultAddress,\n taker,\n },\n },\n init,\n );\n\n const takerState = data.TakerStakeState_by_pk;\n const indexedStakeOwner = takerState\n ? normalizeAddress(takerState.stakeOwner, 'TakerStakeState.stakeOwner')\n : taker;\n const selectedStakeOwner = normalizeNullableAddress(\n takerState?.selectedStakeOwner,\n 'TakerStakeState.selectedStakeOwner',\n );\n const stakeAccount = data.StakeAccountState_by_pk;\n const stakeAccountOwner = stakeAccount\n ? normalizeAddress(stakeAccount.stakeOwner, 'StakeAccountState.stakeOwner')\n : requestedStakeOwner;\n const stakeAccountMatchesEffectiveOwner =\n requestedStakeOwner === indexedStakeOwner && stakeAccountOwner === indexedStakeOwner;\n const claimAccount = data.ClaimAccountState_by_pk;\n\n if (\n claimAccount &&\n normalizeAddress(claimAccount.beneficiary, 'ClaimAccountState.beneficiary') !== taker\n ) {\n throw new Error('ClaimAccountState beneficiary does not match the requested taker');\n }\n\n const authorizations = data.TakerStakeAuthorization.map((authorization, index) => ({\n stakeOwner: normalizeAddress(\n authorization.stakeOwner,\n `TakerStakeAuthorization[${index}].stakeOwner`,\n ),\n authorized: authorization.authorized,\n freshness: freshnessOf(\n authorization,\n `TakerStakeAuthorization[${index}]`,\n ) as IndexedStakingRowFreshness,\n }));\n\n const riskWindows = data.DisputeProtectionRiskWindow.map((row, index) => ({\n paymentMethod: row.paymentMethod,\n riskWindowSeconds: normalizeDecimal(\n row.riskWindow,\n `DisputeProtectionRiskWindow[${index}].riskWindow`,\n ),\n updatedAt: normalizeDecimal(row.updatedAt, `DisputeProtectionRiskWindow[${index}].updatedAt`),\n }));\n\n const takerFreshness = freshnessOf(takerState, 'TakerStakeState');\n const stakeFreshness = freshnessOf(stakeAccount, 'StakeAccountState');\n const claimFreshness = freshnessOf(claimAccount, 'ClaimAccountState');\n const vaultFreshness = freshnessOf(data.StakeVaultConfig_by_pk, 'StakeVaultConfig');\n const authorizationFreshness = authorizations.map((authorization) => authorization.freshness);\n\n return {\n chainId: params.chainId,\n environment: params.environment,\n taker,\n stakeOwner: indexedStakeOwner,\n selectedStakeOwner,\n selectionAuthorized: takerState?.selectionAuthorized ?? false,\n stake:\n stakeAccount && stakeAccountMatchesEffectiveOwner\n ? {\n totalUsdc: normalizeDecimal(stakeAccount.totalStake, 'StakeAccountState.totalStake'),\n lockedUsdc: normalizeDecimal(\n stakeAccount.lockedStake,\n 'StakeAccountState.lockedStake',\n ),\n freeUsdc: normalizeDecimal(stakeAccount.freeStake, 'StakeAccountState.freeStake'),\n }\n : { ...ZERO_STAKE },\n claimableUsdc: claimAccount\n ? normalizeDecimal(claimAccount.claimableAmount, 'ClaimAccountState.claimableAmount')\n : '0',\n authorizations,\n riskWindows,\n vault: data.StakeVaultConfig_by_pk\n ? {\n controller: normalizeNullableAddress(\n data.StakeVaultConfig_by_pk.controller,\n 'StakeVaultConfig.controller',\n ),\n pendingController: normalizeNullableAddress(\n data.StakeVaultConfig_by_pk.pendingController,\n 'StakeVaultConfig.pendingController',\n ),\n pendingControllerValidAt: data.StakeVaultConfig_by_pk.pendingControllerValidAt\n ? normalizeDecimal(\n data.StakeVaultConfig_by_pk.pendingControllerValidAt,\n 'StakeVaultConfig.pendingControllerValidAt',\n )\n : null,\n }\n : null,\n stakeAccountMatchesEffectiveOwner,\n freshness: {\n takerStakeState: takerFreshness,\n stakeAccountState: stakeFreshness,\n claimAccountState: claimFreshness,\n stakeVaultConfig: vaultFreshness,\n authorizations: authorizationFreshness,\n indexerHeadBlockNumber: indexerHeadBlockNumber(data.chain_metadata, params.chainId),\n },\n };\n }\n}\n","// Auto-generated main entry point\nexport const version = \"0.4.1-rc.9\";\n","const data = {\n \"schemaVersion\": 2,\n \"network\": \"base\",\n \"chainId\": 8453,\n \"activeDisputeStack\": {\n \"version\": 2,\n \"selectionHash\": \"ba40c2954b408d0c658881a8d28e5bfcc9bade5cc3d953fd17eae1eca69d841c\"\n },\n \"runtimeIdentities\": {\n \"Orchestrator\": {\n \"address\": \"0x88888883Ed048FF0a415271B28b2F52d431810D0\",\n \"runtimeCodeHash\": \"0xf511343f2903dd1877c490796cc9423fac66b162b59004d55e522046c1ceb050\"\n },\n \"OrchestratorV2\": {\n \"address\": \"0x888888359E981B5225CA48fbCdCeff702FC3b888\",\n \"runtimeCodeHash\": \"0xcf70a08cc24fcc00799f9f365d0998abe37c718c93ee370a78d1ca06c60d01e0\"\n },\n \"OrchestratorV3\": {\n \"address\": \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\",\n \"runtimeCodeHash\": \"0x4e58f26129559301c017ff264b61dd2255ed2107593d308472ef32d07b8745e9\"\n },\n \"StakeVault\": {\n \"address\": \"0x47c26258222e2f96424bD2B21bf173f0DA5034C7\",\n \"runtimeCodeHash\": \"0xfd8d2a910b9ac2c55675ae06d0504f9aac43b02b7022755cf229b571156c681d\"\n },\n \"DisputeProtectionPolicy\": {\n \"address\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"runtimeCodeHash\": \"0xf5a7756f16556da69c91c55bdcffd9fd95cc8cbdb772699827ec4c66db136dfe\"\n },\n \"IntentLifecycleHookV1\": {\n \"address\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"runtimeCodeHash\": \"0x2b479a570ddea7a990f2cae8fa95eb3b8599fc8b367332b8dab92f7d0cebf7e0\"\n },\n \"RecognizedPredecessorHook\": {\n \"address\": \"0x71467dCac3B50eeED5A485aC6a70f27B1EAC1970\",\n \"runtimeCodeHash\": \"0x35789014e608a248f3244b61210fa259fee3566c33f50fd0e3fa1f5ae22e370b\"\n },\n \"RecognizedPredecessorPolicy\": {\n \"address\": \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\",\n \"runtimeCodeHash\": \"0x9c4be279da216021183638eaef79ebf98db248472685e9ecd0de3f24a513a641\"\n },\n \"OrchestratorRegistry\": {\n \"address\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"runtimeCodeHash\": \"0xf0d132d621ac03181a6fade6a93bd0968d33830c8bf393793236787e7978aee1\"\n },\n \"WhitelistPolicy\": {\n \"address\": \"0x389Cd9bA91FfFcd83d267B241E975541892759Ce\",\n \"runtimeCodeHash\": \"0xa83d138a5b89d2fd2861702febc6333e542dcdc8994ee76c345dcbd22fe685a4\"\n },\n \"DisputeVerifier\": {\n \"address\": \"0x30d4947f005653637005eed991005119D9eB2f34\",\n \"runtimeCodeHash\": \"0x65246e11392befc33d92246cf3ac2467d1f338a8b73c6514b76fab0a70a01ead\"\n },\n \"DisputeNullifierRegistry\": {\n \"address\": \"0xA845615b5203F7a21321DdF5e3a1ca024D93a443\",\n \"runtimeCodeHash\": \"0x1a711749b7700142265363c9c184c195ac81a1415e2142aa84edcbf1cd88142a\"\n },\n \"MultiAttestationVerifier\": {\n \"address\": \"0x9Fe920b24e50e6a6362BA71a1BeB502A99c402d5\",\n \"runtimeCodeHash\": \"0x828a5dae520d3eaed904dfed56994dc6e892eb6416b58ad952c079e220ef841a\"\n }\n },\n \"addressExpectations\": {\n \"AddressGroupRegistry\": \"0x39F80118f9eB619135f116171b6Cb91D372C5AF2\",\n \"EscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"PaymentVerifierRegistry\": \"0x2b82D24437ff66Fb173eabDfD67ee2ACeb8bEb1e\",\n \"RelayerRegistry\": \"0xEbA979889a9c97382A92472fF3703786fF180083\",\n \"NullifierRegistryV2\": \"0x5455e761b866dfa6A2f5Dc6d6525825bf9C09aeB\",\n \"StakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedRelations\": {\n \"activeLifecycleHook\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"recognizedPredecessorPolicy\": \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\",\n \"registeredOrchestrator\": \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\",\n \"authorizedLifecycleHook\": \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\",\n \"disputeNullifierAuthorizedWriter\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"orchestratorEscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"orchestratorPaymentVerifierRegistry\": \"0x2b82D24437ff66Fb173eabDfD67ee2ACeb8bEb1e\",\n \"orchestratorRelayerRegistry\": \"0xEbA979889a9c97382A92472fF3703786fF180083\",\n \"hookOrchestratorRegistry\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"hookWhitelistPolicy\": \"0x389Cd9bA91FfFcd83d267B241E975541892759Ce\",\n \"hookDisputeProtectionPolicy\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"whitelistGroupRegistry\": \"0x39F80118f9eB619135f116171b6Cb91D372C5AF2\",\n \"whitelistEscrowRegistry\": \"0xeD0e847B101abc96E796260AC358e12BAa2f5B21\",\n \"whitelistOrchestratorRegistry\": \"0xBe9fED15ED7A4B915C03EFcEcb9662739C3382A9\",\n \"policyStakeVault\": \"0x47c26258222e2f96424bD2B21bf173f0DA5034C7\",\n \"policyDisputeVerifier\": \"0x30d4947f005653637005eed991005119D9eB2f34\",\n \"policyDisputeNullifierRegistry\": \"0xA845615b5203F7a21321DdF5e3a1ca024D93a443\",\n \"disputeVerifierNullifierRegistry\": \"0x5455e761b866dfa6A2f5Dc6d6525825bf9C09aeB\",\n \"disputeVerifierAttestationVerifier\": \"0x9Fe920b24e50e6a6362BA71a1BeB502A99c402d5\",\n \"vaultController\": \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\",\n \"vaultStakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedGovernance\": {\n \"owner\": \"0x0bC26FF515411396DD588Abd6Ef6846E04470227\",\n \"governedRuntimeIdentities\": [\n \"OrchestratorRegistry\",\n \"OrchestratorV3\",\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"WhitelistPolicy\",\n \"DisputeVerifier\",\n \"DisputeNullifierRegistry\",\n \"MultiAttestationVerifier\"\n ],\n \"pendingOwner\": \"0x0000000000000000000000000000000000000000\",\n \"twoStepGovernedRuntimeIdentities\": [\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"DisputeVerifier\"\n ]\n },\n \"attestationTrust\": {\n \"requiredSignatures\": \"1\",\n \"witnesses\": [\n \"0xDB4Ed7FAF170F0f6493E3adaaCaaFaF47092c754\",\n \"0xE078D93bFdd87A8c5C5cCA5905DCbA0Dd7A1F0BD\"\n ]\n },\n \"exactAuthorizationSets\": {\n \"orchestratorAuthorizationFromBlock\": \"42878566\",\n \"authorizedOrchestrators\": [\n \"0x88888883Ed048FF0a415271B28b2F52d431810D0\",\n \"0x888888359E981B5225CA48fbCdCeff702FC3b888\",\n \"0x014025fDE093f8701d86e9f38e2C3a9b779cb5c7\"\n ],\n \"lifecycleHookAuthorizationFromBlock\": \"50537204\",\n \"authorizedLifecycleHooks\": [\n \"0x5Dd6C675a7406fE8C9f0D93394a36fd6e8c50031\"\n ],\n \"passiveDisputeNullifierWriters\": [\n \"0xcEc48F7242eDBf02875BB4629115Bd927e1287aA\"\n ],\n \"activeDisputeNullifierWriters\": [\n \"0xbF4B769dB70DBEc89b6b2c44988304a7aD2de4Fc\"\n ]\n },\n \"riskWindowSecondsByPaymentMethod\": {\n \"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d\": \"1209600\",\n \"0x3ccc3d4d5e769b1f82dc4988485551dc0cd3c7a3926d7d8a4dde91507199490f\": \"1209600\",\n \"0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5\": \"0\",\n \"0x5908bb0c9b87763ac6171d4104847667e7f02b4c47b574fe890c1f439ed128bb\": \"0\",\n \"0x617f88ab82b5c1b014c539f7e75121427f0bb50a4c58b187a238531e7d58605d\": \"0\",\n \"0x62c7ed738ad3e7618111348af32691b5767777fbaf46a2d8943237625552645c\": \"0\",\n \"0x90262a3db0edd0be2369c6b28f9e8511ec0bac7136cefbada0880602f87e7268\": \"1209600\",\n \"0xa5418819c024239299ea32e09defae8ec412c03e58f5c75f1b2fe84c857f5483\": \"0\",\n \"0xcac9daea62d7b89d75ac73af4ee14dcf25721012ae82b568c2ea5c808eaa04ff\": \"0\",\n \"0xf752c7d19698ecb0bb8988abf9b9a53a4c3657f3bc8850a6fb59fdf3e3ce8cd3\": \"0\"\n },\n \"sentinel\": {\n \"escrow\": \"0x0000000000000000000000000000000000000001\",\n \"depositId\": \"0\",\n \"expected\": false\n },\n \"prerequisites\": {\n \"orchestratorPaused\": false,\n \"admissionsPaused\": false,\n \"allowMultipleIntents\": true,\n \"orchestratorRegistered\": true,\n \"lifecycleHookAuthorized\": true,\n \"disputeNullifierWriterAuthorized\": true,\n \"vaultControllerActivated\": true,\n \"vaultPendingController\": \"0x0000000000000000000000000000000000000000\",\n \"vaultPendingControllerValidAt\": \"0\",\n \"pendingCoverageMaturity\": \"18446744073709551615\"\n }\n};\nexport default data;\n","const data = {\n \"schemaVersion\": 2,\n \"network\": \"base_staging\",\n \"chainId\": 8453,\n \"activeDisputeStack\": {\n \"version\": 2,\n \"selectionHash\": \"6c49c1ce51eec594a22385c4efcab08aa9926b6b63a725e14a0027ec5d2f4fc9\"\n },\n \"runtimeIdentities\": {\n \"Orchestrator\": {\n \"address\": \"0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e\",\n \"runtimeCodeHash\": \"0xf511343f2903dd1877c490796cc9423fac66b162b59004d55e522046c1ceb050\"\n },\n \"OrchestratorV2\": {\n \"address\": \"0xc17a59227B136c45fAa153086a15EF87ED14bE00\",\n \"runtimeCodeHash\": \"0xcf70a08cc24fcc00799f9f365d0998abe37c718c93ee370a78d1ca06c60d01e0\"\n },\n \"OrchestratorV3\": {\n \"address\": \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\",\n \"runtimeCodeHash\": \"0x4e58f26129559301c017ff264b61dd2255ed2107593d308472ef32d07b8745e9\"\n },\n \"StakeVault\": {\n \"address\": \"0x92d7B59E99e1CD2066540Cd2413b8714948b731f\",\n \"runtimeCodeHash\": \"0xfd8d2a910b9ac2c55675ae06d0504f9aac43b02b7022755cf229b571156c681d\"\n },\n \"DisputeProtectionPolicy\": {\n \"address\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"runtimeCodeHash\": \"0x70c43bfae8253a6a166f9697ddc27b2d77b4d9841e01fefc2db84037d9a98622\"\n },\n \"IntentLifecycleHookV1\": {\n \"address\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"runtimeCodeHash\": \"0xb9ce42108c706f9241aeb41ffdc0da6b7584e8482183055452098b2f16c7abfd\"\n },\n \"RecognizedPredecessorHook\": {\n \"address\": \"0x19D9F0Fcb08C60D8bd0CD061C34eae27eF8b6e65\",\n \"runtimeCodeHash\": \"0xba70239e37624f5808e2f79e100e83a17daeb1558f310543187f5d8a121ec367\"\n },\n \"RecognizedPredecessorPolicy\": {\n \"address\": \"0x21517b7743E727ae47A66FafF93550B689c15020\",\n \"runtimeCodeHash\": \"0x4e6617a94819ad15693289b173a9a66a78cfe1dd706f6b4fdc5a5f6ad6a32971\"\n },\n \"OrchestratorRegistry\": {\n \"address\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"runtimeCodeHash\": \"0xf0d132d621ac03181a6fade6a93bd0968d33830c8bf393793236787e7978aee1\"\n },\n \"WhitelistPolicy\": {\n \"address\": \"0xF79aAD1BAaB617fF3Eb299225c80893F22F743Fe\",\n \"runtimeCodeHash\": \"0x1ece96bb7be9cdd2433a2aad66c9b2d710e3e210a65876e0f8c1e43662ee5653\"\n },\n \"DisputeVerifier\": {\n \"address\": \"0x973578148c5Fd49b9f68B50B26066555325AC708\",\n \"runtimeCodeHash\": \"0xb3b34734cfd162cd129d0c84285461c751321545213ec20164745b8e72f9dd6c\"\n },\n \"DisputeNullifierRegistry\": {\n \"address\": \"0xE0B05a9655AF0f31E32904267baa50FbC7f217ea\",\n \"runtimeCodeHash\": \"0x1a711749b7700142265363c9c184c195ac81a1415e2142aa84edcbf1cd88142a\"\n },\n \"MultiAttestationVerifier\": {\n \"address\": \"0x9855a39aC5975069632e91160d8712CBfF19e864\",\n \"runtimeCodeHash\": \"0x828a5dae520d3eaed904dfed56994dc6e892eb6416b58ad952c079e220ef841a\"\n }\n },\n \"addressExpectations\": {\n \"AddressGroupRegistry\": \"0x54Ff7788Cb42B46FE2F016a65Fd0f654Bb9BcF3D\",\n \"EscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"PaymentVerifierRegistry\": \"0x2261416DA54C85f975C73FA56EF4D2D6b0aEF7Cc\",\n \"RelayerRegistry\": \"0xB214650b424E6b5fdcB1259566eB7A512D8Bd25E\",\n \"NullifierRegistryV2\": \"0x2eb43d6C7c7Ec4220Aa6B8735BC053824a71778C\",\n \"StakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedRelations\": {\n \"activeLifecycleHook\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"recognizedPredecessorPolicy\": \"0x21517b7743E727ae47A66FafF93550B689c15020\",\n \"registeredOrchestrator\": \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\",\n \"authorizedLifecycleHook\": \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\",\n \"disputeNullifierAuthorizedWriter\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"orchestratorEscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"orchestratorPaymentVerifierRegistry\": \"0x2261416DA54C85f975C73FA56EF4D2D6b0aEF7Cc\",\n \"orchestratorRelayerRegistry\": \"0xB214650b424E6b5fdcB1259566eB7A512D8Bd25E\",\n \"hookOrchestratorRegistry\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"hookWhitelistPolicy\": \"0xF79aAD1BAaB617fF3Eb299225c80893F22F743Fe\",\n \"hookDisputeProtectionPolicy\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"whitelistGroupRegistry\": \"0x54Ff7788Cb42B46FE2F016a65Fd0f654Bb9BcF3D\",\n \"whitelistEscrowRegistry\": \"0xc545f336eC77E69bf115729acCbf2e557A00ac91\",\n \"whitelistOrchestratorRegistry\": \"0xfA6384EB6176cfEC049540526A3d2126C3666d8A\",\n \"policyStakeVault\": \"0x92d7B59E99e1CD2066540Cd2413b8714948b731f\",\n \"policyDisputeVerifier\": \"0x973578148c5Fd49b9f68B50B26066555325AC708\",\n \"policyDisputeNullifierRegistry\": \"0xE0B05a9655AF0f31E32904267baa50FbC7f217ea\",\n \"disputeVerifierNullifierRegistry\": \"0x2eb43d6C7c7Ec4220Aa6B8735BC053824a71778C\",\n \"disputeVerifierAttestationVerifier\": \"0x9855a39aC5975069632e91160d8712CBfF19e864\",\n \"vaultController\": \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\",\n \"vaultStakeToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"\n },\n \"expectedGovernance\": {\n \"owner\": \"0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929\",\n \"governedRuntimeIdentities\": [\n \"OrchestratorRegistry\",\n \"OrchestratorV3\",\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"WhitelistPolicy\",\n \"DisputeVerifier\",\n \"DisputeNullifierRegistry\",\n \"MultiAttestationVerifier\"\n ],\n \"pendingOwner\": \"0x0000000000000000000000000000000000000000\",\n \"twoStepGovernedRuntimeIdentities\": [\n \"StakeVault\",\n \"DisputeProtectionPolicy\",\n \"DisputeVerifier\"\n ]\n },\n \"attestationTrust\": {\n \"requiredSignatures\": \"1\",\n \"witnesses\": [\n \"0x66649F896521b0fb487fE2077b4FBDA283d7f19a\",\n \"0x4ab950AE1e3326578Bf7e643a2031E858aBa2927\"\n ]\n },\n \"exactAuthorizationSets\": {\n \"orchestratorAuthorizationFromBlock\": \"42614859\",\n \"authorizedOrchestrators\": [\n \"0xF9b9CD27Deea496B960b3cb5221b514705fCaF5e\",\n \"0xc17a59227B136c45fAa153086a15EF87ED14bE00\",\n \"0x2b5E8Ab562e45fA89D73802605E145ED3E3EeF4f\"\n ],\n \"lifecycleHookAuthorizationFromBlock\": \"50536390\",\n \"authorizedLifecycleHooks\": [\n \"0x5A7f6cb7397134da1fDEFA7E2D434b4Cf18E56D9\"\n ],\n \"passiveDisputeNullifierWriters\": [\n \"0x21517b7743E727ae47A66FafF93550B689c15020\"\n ],\n \"activeDisputeNullifierWriters\": [\n \"0x484fA07F085eb66bb7C2b649Ea9d5894b2B6681c\"\n ]\n },\n \"riskWindowSecondsByPaymentMethod\": {\n \"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d\": \"1209600\",\n \"0x1d966dbd6aeb8674d7c05174bd0ded7b56a798672bfb862ef20bbe8c2bbfce18\": \"0\",\n \"0x3ccc3d4d5e769b1f82dc4988485551dc0cd3c7a3926d7d8a4dde91507199490f\": \"1209600\",\n \"0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5\": \"0\",\n \"0x5908bb0c9b87763ac6171d4104847667e7f02b4c47b574fe890c1f439ed128bb\": \"0\",\n \"0x617f88ab82b5c1b014c539f7e75121427f0bb50a4c58b187a238531e7d58605d\": \"0\",\n \"0x62c7ed738ad3e7618111348af32691b5767777fbaf46a2d8943237625552645c\": \"0\",\n \"0x90262a3db0edd0be2369c6b28f9e8511ec0bac7136cefbada0880602f87e7268\": \"1209600\",\n \"0xa5418819c024239299ea32e09defae8ec412c03e58f5c75f1b2fe84c857f5483\": \"0\",\n \"0xcac9daea62d7b89d75ac73af4ee14dcf25721012ae82b568c2ea5c808eaa04ff\": \"0\",\n \"0xf752c7d19698ecb0bb8988abf9b9a53a4c3657f3bc8850a6fb59fdf3e3ce8cd3\": \"0\",\n \"0xf81480907d808d639ad3230869e4b05a3b01b2d34e323af40f2efab807effd32\": \"0\"\n },\n \"sentinel\": {\n \"escrow\": \"0x0000000000000000000000000000000000000001\",\n \"depositId\": \"0\",\n \"expected\": false\n },\n \"prerequisites\": {\n \"orchestratorPaused\": false,\n \"admissionsPaused\": false,\n \"allowMultipleIntents\": false,\n \"orchestratorRegistered\": true,\n \"lifecycleHookAuthorized\": true,\n \"disputeNullifierWriterAuthorized\": true,\n \"vaultControllerActivated\": true,\n \"vaultPendingController\": \"0x0000000000000000000000000000000000000000\",\n \"vaultPendingControllerValidAt\": \"0\",\n \"pendingCoverageMaturity\": \"18446744073709551615\"\n }\n};\nexport default data;\n","export type SdkBuildMetadata = {\n readonly schemaVersion: 2;\n readonly source: {\n readonly repository: 'zkp2p/zkp2p-clients';\n readonly commitSha: string;\n readonly kind: 'development' | 'github';\n readonly distributable: boolean;\n };\n readonly sdkPackageVersion: string;\n readonly contractsPackageVersion: string;\n readonly indexerSchemaPackageVersion: string;\n readonly activeDisputeStack: {\n readonly base: { readonly version: 2; readonly selectionHash: string };\n readonly baseStaging: { readonly version: 2; readonly selectionHash: string };\n };\n};\n\ndeclare const __ZKP2P_SDK_BUILD_METADATA__: SdkBuildMetadata;\n\nconst DEVELOPMENT_BUILD_METADATA: SdkBuildMetadata = {\n schemaVersion: 2,\n source: {\n repository: 'zkp2p/zkp2p-clients',\n commitSha: 'development',\n kind: 'development',\n distributable: false,\n },\n sdkPackageVersion: 'development',\n contractsPackageVersion: 'development',\n indexerSchemaPackageVersion: 'development',\n activeDisputeStack: {\n base: { version: 2, selectionHash: 'development' },\n baseStaging: { version: 2, selectionHash: 'development' },\n },\n};\n\n/** Immutable source and protocol identity embedded in the built SDK artifact. */\nexport const SDK_BUILD_METADATA: SdkBuildMetadata =\n typeof __ZKP2P_SDK_BUILD_METADATA__ === 'undefined'\n ? DEVELOPMENT_BUILD_METADATA\n : __ZKP2P_SDK_BUILD_METADATA__;\n","import { version as installedContractsPackageVersion } from '@zkp2p/contracts-v2';\nimport {\n base as baseManifest,\n baseStaging as baseStagingManifest,\n type DisputeStackManifest,\n type GovernedRuntimeIdentityName,\n type RuntimeIdentityName,\n} from '@zkp2p/contracts-v2/disputeStack';\nimport {\n DisputeNullifierRegistry,\n DisputeProtectionPolicy as PackagedDisputeProtectionPolicy,\n DisputeVerifier,\n IntentLifecycleHookV1,\n MultiAttestationVerifier,\n OrchestratorRegistry,\n OrchestratorV3,\n StakeVault,\n WhitelistPolicy,\n} from '@zkp2p/contracts-v2/abis/base';\nimport { DISPUTE_PROTECTION_POLICY_ABI } from '@zkp2p/core/contracts';\nimport {\n keccak256,\n zeroAddress,\n type Abi,\n type AbiEvent,\n type Address,\n type PublicClient,\n} from 'viem';\n\nimport { SDK_BUILD_METADATA, type SdkBuildMetadata } from '../buildMetadata';\nimport type { RuntimeEnv } from '../contracts';\n\nconst DisputeProtectionPolicy =\n DISPUTE_PROTECTION_POLICY_ABI ?? (PackagedDisputeProtectionPolicy as Abi);\n\nconst SUCCESSOR_RUNTIME_IDENTITIES: RuntimeIdentityName[] = [\n 'IntentLifecycleHookV1',\n 'StakeVault',\n 'DisputeProtectionPolicy',\n 'OrchestratorRegistry',\n 'WhitelistPolicy',\n 'DisputeVerifier',\n 'DisputeNullifierRegistry',\n 'MultiAttestationVerifier',\n];\n\nconst GOVERNANCE_ABIS = {\n OrchestratorRegistry,\n OrchestratorV3,\n StakeVault,\n DisputeProtectionPolicy,\n WhitelistPolicy,\n DisputeVerifier,\n DisputeNullifierRegistry,\n MultiAttestationVerifier,\n} satisfies Record<GovernedRuntimeIdentityName, Abi>;\n\nconst ORCHESTRATOR_AUTHORIZATION_EVENTS = OrchestratorRegistry.filter(\n (item): item is AbiEvent =>\n item.type === 'event' &&\n (item.name === 'OrchestratorAdded' || item.name === 'OrchestratorRemoved'),\n);\nconst LIFECYCLE_HOOK_AUTHORIZATION_EVENTS = DisputeProtectionPolicy.filter(\n (item): item is AbiEvent =>\n item.type === 'event' && item.name === 'LifecycleHookAuthorizationUpdated',\n);\nconst FALLBACK_LOG_BLOCK_SPAN = 10_000n;\nconst LOG_QUERY_CONCURRENCY = 8;\n\ntype InactiveReadinessState = 'recognized_predecessor' | 'passive_successor' | 'verified_no_hook';\n\ntype KnownReadinessBase = {\n asOfBlock: bigint;\n manifestNetwork: 'base' | 'base_staging';\n manifestSelectionHash: string;\n contractsPackageVersion: string;\n activeLifecycleHook: Address;\n orchestratorPaused: boolean;\n allowMultipleIntents: boolean;\n policyAdmissionsPaused: boolean | null;\n};\n\ntype KnownReadinessResult = KnownReadinessBase &\n (\n | {\n state: InactiveReadinessState;\n readyForDisputeProtection: false;\n }\n | {\n state: 'active_successor_verified';\n readyForDisputeProtection: boolean;\n policyAdmissionsPaused: boolean;\n }\n );\n\nexport type DisputeProtectionReadinessResult =\n | KnownReadinessResult\n | {\n state: 'mismatch';\n readyForDisputeProtection: false;\n asOfBlock: bigint | null;\n reason: string;\n };\n\nexport type DisputeProtectionReadinessOptions = {\n /** Also prove the dormant successor stack while the recognized predecessor remains active. */\n verifyPassiveSuccessor?: boolean;\n};\n\nexport type DisputeAttestationConfig = {\n asOfBlock: bigint;\n chainId: number;\n policyAddress: Address;\n verifierAddress: Address;\n trustedSigners: readonly Address[];\n requiredSignatures: number;\n};\n\nexport type ReadDisputeAttestationConfigParams = {\n publicClient: PublicClient;\n chainId: number;\n environment?: RuntimeEnv;\n};\n\ntype ReaderConfig = {\n publicClient: PublicClient;\n chainId: number;\n manifest: DisputeStackManifest;\n buildMetadata: SdkBuildMetadata;\n contractsPackageVersion: string;\n};\n\nclass ReadinessMismatch extends Error {}\n\nfunction sameAddress(actual: unknown, expected: Address): boolean {\n return typeof actual === 'string' && actual.toLowerCase() === expected.toLowerCase();\n}\n\nfunction expectAddress(label: string, actual: unknown, expected: Address): void {\n if (!sameAddress(actual, expected)) throw new ReadinessMismatch(`${label} mismatch`);\n}\n\nfunction expectBoolean(label: string, actual: unknown, expected: boolean): void {\n if (actual !== expected) throw new ReadinessMismatch(`${label} expected ${String(expected)}`);\n}\n\nfunction expectBigInt(label: string, actual: unknown, expected: bigint): void {\n if (actual !== expected) throw new ReadinessMismatch(`${label} mismatch`);\n}\n\nfunction normalizeAddressSet(label: string, addresses: unknown): string[] {\n if (!Array.isArray(addresses) || addresses.some((address) => typeof address !== 'string')) {\n throw new ReadinessMismatch(`${label} is not an address array`);\n }\n const normalized = addresses.map((address) => address.toLowerCase()).sort();\n if (new Set(normalized).size !== normalized.length) {\n throw new ReadinessMismatch(`${label} contains duplicate addresses`);\n }\n return normalized;\n}\n\nfunction expectAddressSet(label: string, actual: unknown, expected: readonly Address[]): void {\n const actualAddresses = normalizeAddressSet(label, actual);\n const expectedAddresses = normalizeAddressSet(label, expected);\n if (\n actualAddresses.length !== expectedAddresses.length ||\n actualAddresses.some((address, index) => address !== expectedAddresses[index])\n ) {\n throw new ReadinessMismatch(`${label} mismatch`);\n }\n}\n\n/**\n * Governance retires predecessor orchestrators from the live registry ahead of\n * manifest republishes (OrchestratorV2 was removed by the Safe mid-incident),\n * so exact-set equality would report the dispute stack as broken exactly when\n * the surface was deliberately reduced. Fail-closed still holds through the\n * two directions that matter: an orchestrator the manifest never listed is a\n * mismatch, and the required successor being absent is a mismatch.\n */\nfunction expectAddressSubsetWithRequired(\n label: string,\n actual: unknown,\n expected: readonly Address[],\n required: Address,\n): void {\n const actualAddresses = normalizeAddressSet(label, actual);\n const expectedAddresses = new Set(normalizeAddressSet(label, expected));\n const unknown = actualAddresses.filter((address) => !expectedAddresses.has(address));\n if (unknown.length > 0) {\n throw new ReadinessMismatch(`${label} mismatch`);\n }\n if (!actualAddresses.includes(required.toLowerCase())) {\n throw new ReadinessMismatch(`${label} is missing the active successor orchestrator`);\n }\n}\n\ntype AuthorizationEvent = {\n eventName?: string;\n blockNumber: bigint | null;\n transactionIndex: number | null;\n logIndex: number | null;\n args?: Record<string, unknown>;\n};\n\nfunction fallbackBlockRanges(fromBlock: bigint, toBlock: bigint): Array<[bigint, bigint]> {\n const ranges: Array<[bigint, bigint]> = [];\n for (let start = fromBlock; start <= toBlock; start += FALLBACK_LOG_BLOCK_SPAN) {\n const end = start + FALLBACK_LOG_BLOCK_SPAN - 1n;\n ranges.push([start, end < toBlock ? end : toBlock]);\n }\n return ranges;\n}\n\nfunction isLogRangeLimitError(cause: unknown): boolean {\n let error = cause;\n while (error instanceof Error) {\n if (\n /(?:block range.{0,40}(?:too (?:large|wide)|exceed|limit)|limited to.{0,40}(?:blocks?|range)|response size exceeded|query returned more than|too many (?:logs|results)|maximum block range)/i.test(\n error.message,\n )\n ) {\n return true;\n }\n error = (error as Error & { cause?: unknown }).cause;\n }\n return false;\n}\n\nfunction compareAuthorizationEvents(left: AuthorizationEvent, right: AuthorizationEvent): number {\n if ((left.blockNumber ?? 0n) !== (right.blockNumber ?? 0n)) {\n return (left.blockNumber ?? 0n) < (right.blockNumber ?? 0n) ? -1 : 1;\n }\n if ((left.transactionIndex ?? 0) !== (right.transactionIndex ?? 0)) {\n return (left.transactionIndex ?? 0) - (right.transactionIndex ?? 0);\n }\n return (left.logIndex ?? 0) - (right.logIndex ?? 0);\n}\n\nfunction replayAddressAuthorizations(\n label: string,\n events: readonly AuthorizationEvent[],\n addressField: string,\n enabledField?: string,\n): Address[] {\n const authorized = new Set<string>();\n for (const event of [...events].sort(compareAuthorizationEvents)) {\n const address = event.args?.[addressField];\n if (typeof address !== 'string') {\n throw new ReadinessMismatch(`${label} event address is malformed`);\n }\n const normalized = address.toLowerCase();\n const enabled = enabledField ? event.args?.[enabledField] : event.args?.enabled;\n if (typeof enabled !== 'boolean') {\n throw new ReadinessMismatch(`${label} event authorization is malformed`);\n }\n if (enabled) authorized.add(normalized);\n else authorized.delete(normalized);\n }\n return [...authorized] as Address[];\n}\n\nfunction manifestForEnvironment(\n environment: RuntimeEnv,\n): DisputeStackManifest<'base' | 'base_staging'> {\n return environment === 'staging' ? baseStagingManifest : baseManifest;\n}\n\n/** Read the canonical dispute addresses and live attestation trust roots at one block. */\nexport async function readDisputeAttestationConfig({\n publicClient,\n chainId,\n environment = 'production',\n}: ReadDisputeAttestationConfigParams): Promise<DisputeAttestationConfig> {\n const manifest = manifestForEnvironment(environment);\n if (manifest.chainId !== chainId) {\n throw new Error(\n `Dispute attestation is unavailable for chainId=${chainId}, env=${environment}`,\n );\n }\n\n const asOfBlock = await publicClient.getBlockNumber();\n const attestationVerifier = manifest.runtimeIdentities.MultiAttestationVerifier.address;\n const [rawRequiredSignatures, rawTrustedSigners] = (await publicClient.multicall({\n allowFailure: false,\n blockNumber: asOfBlock,\n contracts: [\n {\n address: attestationVerifier,\n abi: MultiAttestationVerifier,\n functionName: 'requiredSignatures',\n },\n {\n address: attestationVerifier,\n abi: MultiAttestationVerifier,\n functionName: 'witnesses',\n },\n ],\n })) as readonly unknown[];\n\n const requiredSignatures =\n typeof rawRequiredSignatures === 'bigint' ? Number(rawRequiredSignatures) : Number.NaN;\n if (!Number.isSafeInteger(requiredSignatures) || requiredSignatures < 1) {\n throw new Error('Dispute attestation verifier has an invalid signature threshold');\n }\n const trustedSigners = normalizeAddressSet(\n 'MultiAttestationVerifier.witnesses',\n rawTrustedSigners,\n ) as Address[];\n if (trustedSigners.length < requiredSignatures) {\n throw new Error('Dispute attestation verifier has fewer witnesses than required signatures');\n }\n\n return {\n asOfBlock,\n chainId: manifest.chainId,\n policyAddress: manifest.runtimeIdentities.DisputeProtectionPolicy.address,\n verifierAddress: manifest.runtimeIdentities.DisputeVerifier.address,\n trustedSigners,\n requiredSignatures,\n };\n}\n\nfunction validatePackagedIdentity(config: ReaderConfig): string | null {\n const { buildMetadata, chainId, contractsPackageVersion, manifest } = config;\n if (!buildMetadata.source.distributable) return 'SDK build metadata is not distributable';\n if (\n buildMetadata.source.kind !== 'github' ||\n buildMetadata.source.repository !== 'zkp2p/zkp2p-clients' ||\n !/^[0-9a-f]{40}$/.test(buildMetadata.source.commitSha)\n ) {\n return 'SDK build source identity is invalid';\n }\n if (buildMetadata.contractsPackageVersion !== contractsPackageVersion) {\n return 'contracts package version does not match SDK build metadata';\n }\n if (\n manifest.schemaVersion !== 2 ||\n manifest.chainId !== chainId ||\n (manifest.network !== 'base' && manifest.network !== 'base_staging')\n ) {\n return 'dispute readiness manifest chain identity mismatch';\n }\n const selected =\n manifest.network === 'base'\n ? buildMetadata.activeDisputeStack.base\n : buildMetadata.activeDisputeStack.baseStaging;\n if (\n selected.version !== manifest.activeDisputeStack.version ||\n selected.selectionHash !== manifest.activeDisputeStack.selectionHash\n ) {\n return 'active dispute manifest selection does not match SDK build metadata';\n }\n return null;\n}\n\nfunction knownResult(\n state: InactiveReadinessState,\n readyForDisputeProtection: false,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean | null,\n): KnownReadinessResult;\nfunction knownResult(\n state: 'active_successor_verified',\n readyForDisputeProtection: boolean,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean,\n): KnownReadinessResult;\nfunction knownResult(\n state: InactiveReadinessState | 'active_successor_verified',\n readyForDisputeProtection: boolean,\n blockNumber: bigint,\n config: ReaderConfig,\n lifecycleHook: Address,\n paused: boolean,\n allowMultipleIntents: boolean,\n policyAdmissionsPaused: boolean | null,\n): KnownReadinessResult {\n return {\n state,\n readyForDisputeProtection,\n asOfBlock: blockNumber,\n manifestNetwork: config.manifest.network,\n manifestSelectionHash: config.manifest.activeDisputeStack.selectionHash,\n contractsPackageVersion: config.contractsPackageVersion,\n activeLifecycleHook: lifecycleHook,\n orchestratorPaused: paused,\n allowMultipleIntents,\n policyAdmissionsPaused,\n } as KnownReadinessResult;\n}\n\n/**\n * Block-pinned, fail-closed proof of the packaged dispute-protection deployment.\n * This class is exported for deterministic integration tests; applications use\n * `Zkp2pClient.getDisputeProtectionReadiness()`.\n */\nexport class DisputeProtectionReadinessReader {\n constructor(private readonly config: ReaderConfig) {}\n\n private async verifyRuntimeIdentities(\n names: RuntimeIdentityName[],\n blockNumber: bigint,\n ): Promise<void> {\n await Promise.all(\n names.map(async (name) => {\n const identity = this.config.manifest.runtimeIdentities[name];\n const bytecode = await this.config.publicClient.getBytecode({\n address: identity.address,\n blockNumber,\n });\n if (!bytecode || bytecode === '0x') {\n throw new ReadinessMismatch(`${name} runtime bytecode unavailable`);\n }\n if (keccak256(bytecode).toLowerCase() !== identity.runtimeCodeHash.toLowerCase()) {\n throw new ReadinessMismatch(`${name} runtime code hash mismatch`);\n }\n }),\n );\n }\n\n private async readOrchestrator(blockNumber: bigint): Promise<{\n lifecycleHook: Address;\n paused: boolean;\n allowMultipleIntents: boolean;\n }> {\n const { manifest, publicClient } = this.config;\n const orchestrator = manifest.runtimeIdentities.OrchestratorV3.address;\n const result = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [\n { address: orchestrator, abi: OrchestratorV3, functionName: 'lifecycleHook' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'paused' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'allowMultipleIntents' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'chainId' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'escrowRegistry' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'paymentVerifierRegistry' },\n { address: orchestrator, abi: OrchestratorV3, functionName: 'relayerRegistry' },\n ],\n })) as readonly unknown[];\n const lifecycleHook = result[0];\n if (typeof lifecycleHook !== 'string') {\n throw new ReadinessMismatch('OrchestratorV3.lifecycleHook is not an address');\n }\n expectBigInt('OrchestratorV3.chainId', result[3], BigInt(manifest.chainId));\n expectAddress(\n 'OrchestratorV3.escrowRegistry',\n result[4],\n manifest.expectedRelations.orchestratorEscrowRegistry,\n );\n expectAddress(\n 'OrchestratorV3.paymentVerifierRegistry',\n result[5],\n manifest.expectedRelations.orchestratorPaymentVerifierRegistry,\n );\n expectAddress(\n 'OrchestratorV3.relayerRegistry',\n result[6],\n manifest.expectedRelations.orchestratorRelayerRegistry,\n );\n if (typeof result[1] !== 'boolean' || typeof result[2] !== 'boolean') {\n throw new ReadinessMismatch('OrchestratorV3 readiness flags are malformed');\n }\n return {\n lifecycleHook: lifecycleHook.toLowerCase() as Address,\n paused: result[1],\n allowMultipleIntents: result[2],\n };\n }\n\n private async verifyGovernance(blockNumber: bigint): Promise<void> {\n const { manifest, publicClient } = this.config;\n const governance = manifest.expectedGovernance;\n const ownerContracts = governance.governedRuntimeIdentities.map((name) => ({\n address: manifest.runtimeIdentities[name].address,\n abi: GOVERNANCE_ABIS[name],\n functionName: 'owner',\n }));\n const pendingOwnerContracts = governance.twoStepGovernedRuntimeIdentities.map((name) => ({\n address: manifest.runtimeIdentities[name].address,\n abi: GOVERNANCE_ABIS[name],\n functionName: 'pendingOwner',\n }));\n const results = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [...ownerContracts, ...pendingOwnerContracts] as never,\n })) as readonly unknown[];\n\n governance.governedRuntimeIdentities.forEach((name, index) => {\n expectAddress(`${name}.owner`, results[index], governance.owner);\n });\n governance.twoStepGovernedRuntimeIdentities.forEach((name, index) => {\n expectAddress(\n `${name}.pendingOwner`,\n results[ownerContracts.length + index],\n governance.pendingOwner,\n );\n });\n }\n\n private async verifyAttestationTrust(blockNumber: bigint): Promise<void> {\n const { manifest, publicClient } = this.config;\n const verifier = manifest.runtimeIdentities.MultiAttestationVerifier.address;\n const results = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n contracts: [\n {\n address: verifier,\n abi: MultiAttestationVerifier,\n functionName: 'requiredSignatures',\n },\n { address: verifier, abi: MultiAttestationVerifier, functionName: 'witnesses' },\n ],\n })) as readonly unknown[];\n expectBigInt(\n 'MultiAttestationVerifier.requiredSignatures',\n results[0],\n BigInt(manifest.attestationTrust.requiredSignatures),\n );\n expectAddressSet(\n 'MultiAttestationVerifier.witnesses',\n results[1],\n manifest.attestationTrust.witnesses,\n );\n }\n\n private async readAuthorizationEvents(params: {\n address: Address;\n events: readonly AbiEvent[];\n fromBlock: bigint;\n toBlock: bigint;\n }): Promise<AuthorizationEvent[]> {\n if (params.fromBlock > params.toBlock) {\n throw new ReadinessMismatch('authorization event range is invalid');\n }\n let logs: AuthorizationEvent[];\n try {\n logs = await this.readAuthorizationEventRange(params, params.fromBlock, params.toBlock);\n } catch (cause: unknown) {\n if (!isLogRangeLimitError(cause)) throw cause;\n const ranges = fallbackBlockRanges(params.fromBlock, params.toBlock);\n const batches: AuthorizationEvent[][] = [];\n for (let index = 0; index < ranges.length; index += LOG_QUERY_CONCURRENCY) {\n const batch = await Promise.all(\n ranges\n .slice(index, index + LOG_QUERY_CONCURRENCY)\n .map(([fromBlock, toBlock]) =>\n this.readAuthorizationEventRange(params, fromBlock, toBlock),\n ),\n );\n batches.push(...batch);\n }\n logs = batches.flat();\n }\n return logs;\n }\n\n private async readAuthorizationEventRange(\n params: {\n address: Address;\n events: readonly AbiEvent[];\n },\n fromBlock: bigint,\n toBlock: bigint,\n ): Promise<AuthorizationEvent[]> {\n const logs = await this.config.publicClient.getLogs({\n address: params.address,\n events: params.events,\n fromBlock,\n toBlock,\n strict: true,\n });\n return logs.map((event) => ({\n eventName: event.eventName,\n blockNumber: event.blockNumber,\n transactionIndex: event.transactionIndex,\n logIndex: event.logIndex,\n args: event.args as Record<string, unknown>,\n }));\n }\n\n private async verifyExactAuthorizationSets(\n blockNumber: bigint,\n successorActive: boolean,\n ): Promise<void> {\n const { manifest, publicClient } = this.config;\n const identities = manifest.runtimeIdentities;\n const authorizations = manifest.exactAuthorizationSets;\n const [orchestratorEvents, lifecycleHookEvents, writers] = await Promise.all([\n this.readAuthorizationEvents({\n address: identities.OrchestratorRegistry.address,\n events: ORCHESTRATOR_AUTHORIZATION_EVENTS,\n fromBlock: BigInt(authorizations.orchestratorAuthorizationFromBlock),\n toBlock: blockNumber,\n }),\n this.readAuthorizationEvents({\n address: identities.DisputeProtectionPolicy.address,\n events: LIFECYCLE_HOOK_AUTHORIZATION_EVENTS,\n fromBlock: BigInt(authorizations.lifecycleHookAuthorizationFromBlock),\n toBlock: blockNumber,\n }),\n publicClient.readContract({\n address: identities.DisputeNullifierRegistry.address,\n abi: DisputeNullifierRegistry,\n functionName: 'getWriters',\n blockNumber,\n }),\n ]);\n const orchestratorAuthorizationEvents = orchestratorEvents.map((event) => {\n if (event.eventName !== 'OrchestratorAdded' && event.eventName !== 'OrchestratorRemoved') {\n throw new ReadinessMismatch('OrchestratorRegistry authorization event is malformed');\n }\n return {\n ...event,\n args: {\n orchestrator: event.args?.orchestrator,\n enabled: event.eventName === 'OrchestratorAdded',\n },\n };\n });\n const orchestrators = replayAddressAuthorizations(\n 'OrchestratorRegistry authorization',\n orchestratorAuthorizationEvents,\n 'orchestrator',\n );\n const lifecycleHooks = replayAddressAuthorizations(\n 'DisputeProtectionPolicy lifecycle authorization',\n lifecycleHookEvents,\n 'hook',\n 'isAuthorized',\n );\n\n expectAddressSubsetWithRequired(\n 'OrchestratorRegistry authorized orchestrators',\n orchestrators,\n authorizations.authorizedOrchestrators,\n this.config.manifest.runtimeIdentities.OrchestratorV3.address,\n );\n expectAddressSet(\n 'DisputeProtectionPolicy authorized lifecycle hooks',\n lifecycleHooks,\n authorizations.authorizedLifecycleHooks,\n );\n expectAddressSet(\n 'DisputeNullifierRegistry writers',\n writers,\n successorActive\n ? authorizations.activeDisputeNullifierWriters\n : authorizations.passiveDisputeNullifierWriters,\n );\n }\n\n private async verifySuccessorState(\n blockNumber: bigint,\n successorActive: boolean,\n ): Promise<boolean> {\n const { manifest, publicClient } = this.config;\n const identities = manifest.runtimeIdentities;\n const relations = manifest.expectedRelations;\n const prerequisite = manifest.prerequisites;\n const policy = identities.DisputeProtectionPolicy.address;\n const riskWindows = Object.entries(manifest.riskWindowSecondsByPaymentMethod).sort(\n ([left], [right]) => left.localeCompare(right),\n );\n const sentinelPaymentMethod = riskWindows[0]?.[0] as `0x${string}` | undefined;\n if (!sentinelPaymentMethod) {\n throw new ReadinessMismatch('DisputeProtectionPolicy sentinel payment method is missing');\n }\n const contracts = [\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'orchestratorRegistry',\n },\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'whitelistPolicy',\n },\n {\n address: identities.IntentLifecycleHookV1.address,\n abi: IntentLifecycleHookV1,\n functionName: 'disputeProtectionPolicy',\n },\n {\n address: identities.OrchestratorRegistry.address,\n abi: OrchestratorRegistry,\n functionName: 'isOrchestrator',\n args: [relations.registeredOrchestrator],\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'groupRegistry',\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'escrowRegistry',\n },\n {\n address: identities.WhitelistPolicy.address,\n abi: WhitelistPolicy,\n functionName: 'orchestratorRegistry',\n },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'stakeVault' },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'disputeVerifier' },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'disputeNullifierRegistry',\n },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'isLifecycleHookAuthorized',\n args: [relations.authorizedLifecycleHook],\n },\n { address: policy, abi: DisputeProtectionPolicy, functionName: 'admissionsPaused' },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'PENDING_COVERAGE_MATURITY',\n },\n {\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'isDisputeProtectionEnabled',\n args: [\n manifest.sentinel.escrow,\n BigInt(manifest.sentinel.depositId),\n sentinelPaymentMethod,\n ],\n },\n ...riskWindows.map(([paymentMethod]) => ({\n address: policy,\n abi: DisputeProtectionPolicy,\n functionName: 'getRiskWindow',\n args: [paymentMethod as `0x${string}`],\n })),\n {\n address: identities.DisputeVerifier.address,\n abi: DisputeVerifier,\n functionName: 'nullifierRegistry',\n },\n {\n address: identities.DisputeVerifier.address,\n abi: DisputeVerifier,\n functionName: 'attestationVerifier',\n },\n { address: identities.StakeVault.address, abi: StakeVault, functionName: 'controller' },\n { address: identities.StakeVault.address, abi: StakeVault, functionName: 'stakeToken' },\n {\n address: identities.StakeVault.address,\n abi: StakeVault,\n functionName: 'pendingController',\n },\n {\n address: identities.StakeVault.address,\n abi: StakeVault,\n functionName: 'pendingControllerValidAt',\n },\n ] as const;\n const result = (await publicClient.multicall({\n allowFailure: false,\n blockNumber,\n // The dynamic risk-window suffix prevents viem from inferring one fixed\n // ABI tuple, while every entry remains assembled from packaged ABIs.\n contracts: contracts as never,\n })) as readonly unknown[];\n\n expectAddress(\n 'IntentLifecycleHookV1.orchestratorRegistry',\n result[0],\n relations.hookOrchestratorRegistry,\n );\n expectAddress(\n 'IntentLifecycleHookV1.whitelistPolicy',\n result[1],\n relations.hookWhitelistPolicy,\n );\n expectAddress(\n 'IntentLifecycleHookV1.disputeProtectionPolicy',\n result[2],\n relations.hookDisputeProtectionPolicy,\n );\n expectBoolean(\n 'OrchestratorRegistry.isOrchestrator',\n result[3],\n prerequisite.orchestratorRegistered,\n );\n expectAddress('WhitelistPolicy.groupRegistry', result[4], relations.whitelistGroupRegistry);\n expectAddress('WhitelistPolicy.escrowRegistry', result[5], relations.whitelistEscrowRegistry);\n expectAddress(\n 'WhitelistPolicy.orchestratorRegistry',\n result[6],\n relations.whitelistOrchestratorRegistry,\n );\n expectAddress('DisputeProtectionPolicy.stakeVault', result[7], relations.policyStakeVault);\n expectAddress(\n 'DisputeProtectionPolicy.disputeVerifier',\n result[8],\n relations.policyDisputeVerifier,\n );\n expectAddress(\n 'DisputeProtectionPolicy.disputeNullifierRegistry',\n result[9],\n relations.policyDisputeNullifierRegistry,\n );\n expectBoolean(\n 'DisputeProtectionPolicy.isLifecycleHookAuthorized',\n result[10],\n prerequisite.lifecycleHookAuthorized,\n );\n if (typeof result[11] !== 'boolean') {\n throw new ReadinessMismatch('DisputeProtectionPolicy.admissionsPaused is malformed');\n }\n const policyAdmissionsPaused = result[11];\n expectBigInt(\n 'DisputeProtectionPolicy.PENDING_COVERAGE_MATURITY',\n result[12],\n BigInt(prerequisite.pendingCoverageMaturity),\n );\n expectBoolean('DisputeProtectionPolicy.sentinel', result[13], manifest.sentinel.expected);\n\n let index = 14;\n for (const [paymentMethod, seconds] of riskWindows) {\n expectBigInt(\n `DisputeProtectionPolicy.getRiskWindow(${paymentMethod})`,\n result[index],\n BigInt(seconds),\n );\n index += 1;\n }\n expectAddress(\n 'DisputeVerifier.nullifierRegistry',\n result[index++],\n relations.disputeVerifierNullifierRegistry,\n );\n expectAddress(\n 'DisputeVerifier.attestationVerifier',\n result[index++],\n relations.disputeVerifierAttestationVerifier,\n );\n expectAddress('StakeVault.controller', result[index++], relations.vaultController);\n expectAddress('StakeVault.stakeToken', result[index++], relations.vaultStakeToken);\n expectAddress('StakeVault.pendingController', result[index++], zeroAddress);\n expectBigInt('StakeVault.pendingControllerValidAt', result[index], 0n);\n await this.verifyGovernance(blockNumber);\n await this.verifyAttestationTrust(blockNumber);\n await this.verifyExactAuthorizationSets(blockNumber, successorActive);\n return policyAdmissionsPaused;\n }\n\n async read(\n options: DisputeProtectionReadinessOptions = {},\n ): Promise<DisputeProtectionReadinessResult> {\n const packageMismatch = validatePackagedIdentity(this.config);\n if (packageMismatch) {\n return {\n state: 'mismatch',\n readyForDisputeProtection: false,\n asOfBlock: null,\n reason: packageMismatch,\n };\n }\n\n let blockNumber: bigint | null = null;\n try {\n blockNumber = await this.config.publicClient.getBlockNumber();\n await this.verifyRuntimeIdentities(['OrchestratorV3'], blockNumber);\n const orchestrator = await this.readOrchestrator(blockNumber);\n const hook = orchestrator.lifecycleHook;\n const identities = this.config.manifest.runtimeIdentities;\n\n if (sameAddress(hook, zeroAddress)) {\n return knownResult(\n 'verified_no_hook',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n null,\n );\n }\n\n if (sameAddress(hook, identities.RecognizedPredecessorHook.address)) {\n await this.verifyRuntimeIdentities(\n ['RecognizedPredecessorHook', 'RecognizedPredecessorPolicy'],\n blockNumber,\n );\n if (!options.verifyPassiveSuccessor) {\n return knownResult(\n 'recognized_predecessor',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n null,\n );\n }\n await this.verifyRuntimeIdentities(SUCCESSOR_RUNTIME_IDENTITIES, blockNumber);\n const policyAdmissionsPaused = await this.verifySuccessorState(blockNumber, false);\n return knownResult(\n 'passive_successor',\n false,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n policyAdmissionsPaused,\n );\n }\n\n if (!sameAddress(hook, identities.IntentLifecycleHookV1.address)) {\n throw new ReadinessMismatch('OrchestratorV3.lifecycleHook is not a recognized deployment');\n }\n await this.verifyRuntimeIdentities(SUCCESSOR_RUNTIME_IDENTITIES, blockNumber);\n const policyAdmissionsPaused = await this.verifySuccessorState(blockNumber, true);\n const readyForDisputeProtection =\n orchestrator.paused === this.config.manifest.prerequisites.orchestratorPaused &&\n orchestrator.allowMultipleIntents ===\n this.config.manifest.prerequisites.allowMultipleIntents &&\n policyAdmissionsPaused === this.config.manifest.prerequisites.admissionsPaused;\n return knownResult(\n 'active_successor_verified',\n readyForDisputeProtection,\n blockNumber,\n this.config,\n hook,\n orchestrator.paused,\n orchestrator.allowMultipleIntents,\n policyAdmissionsPaused,\n );\n } catch (error) {\n return {\n state: 'mismatch',\n readyForDisputeProtection: false,\n asOfBlock: blockNumber,\n reason:\n error instanceof ReadinessMismatch\n ? error.message\n : `dispute readiness RPC failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\nexport function createDisputeProtectionReadinessReader(params: {\n publicClient: PublicClient;\n chainId: number;\n environment: RuntimeEnv;\n}): DisputeProtectionReadinessReader {\n return new DisputeProtectionReadinessReader({\n publicClient: params.publicClient,\n chainId: params.chainId,\n manifest: manifestForEnvironment(params.environment),\n buildMetadata: SDK_BUILD_METADATA,\n contractsPackageVersion: installedContractsPackageVersion,\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 { Hash } from 'viem';\n\nimport { apiPostDepositDetails, apiUploadSellerCredential } from './adapters/api';\nimport type {\n CuratorSellerCredentialUploadResponse,\n PostDepositDetailsRequest,\n UploadSellerCredentialBundleParams,\n} from './types';\nimport { DEFAULT_BASE_API_URL } from './utils/constants';\n\nfunction normalizeBaseApiUrl(value: string | null | undefined): string {\n return (value?.trim().replace(/\\/+$/u, '') || DEFAULT_BASE_API_URL).replace(/\\/v1$/u, '');\n}\n\nfunction assertBundlePlatformMatches(params: UploadSellerCredentialBundleParams): void {\n if (params.bundle.platform.toLowerCase() !== params.platform) {\n throw new Error('Seller credential bundle platform does not match upload platform');\n }\n}\n\n/**\n * Store an already-encrypted seller credential bundle with curator.\n */\nexport async function apiUploadSellerCredentialBundle(\n params: UploadSellerCredentialBundleParams,\n baseApiUrl?: string | null,\n timeoutMs?: number,\n authorizationToken?: string,\n): Promise<CuratorSellerCredentialUploadResponse> {\n assertBundlePlatformMatches(params);\n\n const normalizedBaseApiUrl = normalizeBaseApiUrl(baseApiUrl);\n\n if (params.platform === 'wise') {\n return apiUploadSellerCredential(\n params.platform,\n params.bundle.payeeIdHash,\n params.bundle,\n normalizedBaseApiUrl,\n timeoutMs,\n authorizationToken,\n );\n }\n\n const registeredPayeePayload: PostDepositDetailsRequest = {\n offchainId: params.offchainId,\n processorName: params.platform,\n };\n if (params.telegramUsername !== undefined) {\n registeredPayeePayload.telegramUsername = params.telegramUsername;\n }\n if (params.metadata !== undefined) {\n registeredPayeePayload.metadata = params.metadata;\n }\n\n const registeredPayeeResponse = await apiPostDepositDetails(\n registeredPayeePayload,\n normalizedBaseApiUrl,\n timeoutMs,\n );\n\n if (!registeredPayeeResponse.success || !registeredPayeeResponse.responseObject) {\n throw new Error(registeredPayeeResponse.message || 'Failed to register seller payee details');\n }\n\n const registeredPayee = registeredPayeeResponse.responseObject;\n if (registeredPayee.hashedOnchainId.toLowerCase() !== params.bundle.payeeIdHash.toLowerCase()) {\n throw new Error('Seller credential payee hash does not match registered payee details');\n }\n\n return apiUploadSellerCredential(\n params.platform,\n registeredPayee.hashedOnchainId as Hash,\n params.bundle,\n normalizedBaseApiUrl,\n timeoutMs,\n authorizationToken,\n );\n}\n","import { formatUnits } from 'viem';\n\nimport type {\n GetBestByPlatformResponse,\n GetPlatformQuote,\n GetQuoteResponse,\n GetQuoteSingleResponse,\n ReferrerFeeConfig,\n} from '../types';\n\ntype QuoteWithReferrerFeeFields = Omit<\n GetQuoteSingleResponse,\n 'referrerFeeAmount' | 'referrerFeeAmountFormatted' | 'referrerFeeBps'\n> & {\n referrerFeeAmount?: string | null;\n referrerFeeAmountFormatted?: string | null;\n referrerFeeBps?: number | null;\n};\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 options: {\n signalIntentAmount?: string | null;\n } = {},\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 backendNetAmount = BigInt(tokenAmount);\n const grossAmount = BigInt(options.signalIntentAmount ?? tokenAmount);\n const feeAmount = (grossAmount * BigInt(referrerFeeConfig.feeBps)) / 10000n;\n const netAmount = feeAmount >= backendNetAmount ? 0n : backendNetAmount - 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: QuoteWithReferrerFeeFields,\n referrerFeeConfig: ReferrerFeeConfig,\n decimals: number,\n): GetQuoteSingleResponse => {\n const enrichedQuote = quote;\n const hasCuratorReferrerFeeFields =\n enrichedQuote.referrerFeeAmount != null ||\n enrichedQuote.referrerFeeBps != null ||\n quote.takerReferralFeeAmount != null ||\n quote.takerReferralFeeBps != null;\n\n if (hasCuratorReferrerFeeFields) {\n return {\n ...enrichedQuote,\n referrerFeeAmount: enrichedQuote.referrerFeeAmount ?? quote.takerReferralFeeAmount,\n referrerFeeAmountFormatted:\n enrichedQuote.referrerFeeAmountFormatted ?? quote.takerReferralFeeAmountFormatted,\n referrerFeeBps: enrichedQuote.referrerFeeBps ?? quote.takerReferralFeeBps,\n };\n }\n\n const signalIntentAmount = quote.signalIntentAmount ?? quote.intent?.amount ?? quote.tokenAmount;\n const adjusted = applyReferrerFeeDisplayFieldsToTokenAmount(\n quote.tokenAmount,\n referrerFeeConfig,\n decimals,\n { signalIntentAmount },\n );\n if (!adjusted) {\n return {\n ...quote,\n referrerFeeAmount: quote.referrerFeeAmount ?? undefined,\n referrerFeeAmountFormatted: quote.referrerFeeAmountFormatted ?? undefined,\n referrerFeeBps: quote.referrerFeeBps ?? undefined,\n };\n }\n\n return {\n ...quote,\n ...adjusted,\n };\n};\n\nexport const appendReferrerFeeDisplayFields = (\n quoteResponse: GetQuoteResponse,\n referrerFeeConfig: ReferrerFeeConfig | undefined,\n): GetQuoteResponse => {\n if (!referrerFeeConfig) {\n return quoteResponse;\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\nexport const appendReferrerFeeDisplayFieldsToBestByPlatform = (\n quoteResponse: GetBestByPlatformResponse,\n referrerFeeConfig: ReferrerFeeConfig | undefined,\n): GetBestByPlatformResponse => {\n if (!referrerFeeConfig) {\n return quoteResponse;\n }\n\n const decimals = quoteResponse.responseObject?.token?.decimals ?? 6;\n const enrichedPlatformQuotes: GetPlatformQuote[] = (\n quoteResponse.responseObject?.platformQuotes ?? []\n ).map((platformQuote) => ({\n ...platformQuote,\n bestQuote:\n platformQuote.available && platformQuote.bestQuote\n ? applyReferrerFeeDisplayFieldsToQuote(platformQuote.bestQuote, referrerFeeConfig, decimals)\n : platformQuote.bestQuote,\n }));\n\n return {\n ...quoteResponse,\n responseObject: {\n ...quoteResponse.responseObject,\n platformQuotes: enrichedPlatformQuotes,\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","import type { Address, Chain, Hash, Hex, PublicClient, Transport, 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 { ReferralAccountOperations } from './ReferralAccountOperations';\nimport type {\n RedeemReferralCodeSignatureOptions as RedeemReferralCodeSignatureOptionsImpl,\n ReferralBearerWriteOptions as ReferralBearerWriteOptionsImpl,\n ReferralReadOptions as ReferralReadOptionsImpl,\n ReferralSignatureOptions as ReferralSignatureOptionsImpl,\n UpdateReferralCodeSignatureOptions as UpdateReferralCodeSignatureOptionsImpl,\n} from './ReferralAccountOperations';\nimport { VaultOperations } from './VaultOperations';\nimport { AccessPolicyOperations } from './AccessPolicyOperations';\nimport {\n IntentGuardianOperations,\n type IntentGuardianPolicy,\n type IntentGuardianQuote,\n type IntentGuardianWriteParams,\n} from './IntentGuardianOperations';\nimport {\n StakeOperations,\n type StakeVaultState,\n type StakeVaultWriteParams,\n} from './StakeOperations';\nimport {\n isValidHexAddress,\n normalizeAddress,\n normalizeCurrencyTuples,\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 {\n IndexerStakingService,\n type DisputeProtectionIntentPage,\n type DisputeProtectionIntentPageParams,\n type IndexedPage,\n type IndexedStakeActivity,\n type IndexedStakeLock,\n type IndexedStakingState,\n type IndexedStakingStateParams,\n type IndexedTakerStakeAuthorization,\n type StakeActivityPageParams,\n type StakeLockPageParams,\n type TakerStakeAuthorizationPageParams,\n} from '../indexer/stakingService';\nimport {\n createDisputeProtectionReadinessReader,\n type DisputeProtectionReadinessOptions,\n type DisputeProtectionReadinessResult,\n type DisputeProtectionReadinessReader,\n} from './DisputeProtectionReadiness';\nimport type {\n DepositEntity,\n DepositWithRelations,\n IntentEntity,\n IntentStatus,\n IntentFulfilledEntity,\n IntentFulfillmentAmountsEntity,\n DepositFundActivityEntity,\n DepositDailySnapshotEntity,\n MakerProfitSnapshotEntity,\n} from '../indexer/types';\nimport {\n fetchFulfillmentAndPayment,\n type FulfillmentAndPaymentResponse,\n} from '../indexer/intentVerification';\nimport { getContracts, getRateManagerContracts, type RuntimeEnv } from '../contracts';\nimport {\n apiGetSellerCredentialStatus,\n apiGetQuote,\n apiGetQuotesBestByPlatform,\n apiPostDepositDetails,\n apiUploadGoogleOAuthSellerCredential,\n apiVerifySellerPayment,\n} from '../adapters/api';\nimport { apiCreateSellerCredentialBundle } from '../adapters/attestation';\nimport { apiUploadSellerCredentialBundle } from '../sellerCredentials';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { METHOD_NAME_TO_HASH, matchesQuotePaymentMethod } from '../utils/paymentMethodHashes';\nimport { ZERO_ADDRESS } from '../utils/address';\nimport { DEFAULT_BASE_API_URL } from '../utils/constants';\nimport type { UICurrencyRate } from '../utils/currency';\nimport { currencyKeccak256 } from '../utils/currencyKeccak256';\nimport {\n appendReferrerFeeDisplayFields,\n appendReferrerFeeDisplayFieldsToBestByPlatform,\n} from '../utils/referrerFeeDisplay';\nimport { assertValidReferrerFeeConfig } from '../referrerFeeConfig';\nimport { ValidationError } from '../errors';\nimport type {\n CreateReferralCodeResponse,\n CuratorMetadata,\n CuratorPayeeDataInput,\n CuratorSellerCredentialStatusResponse,\n CuratorSellerCredentialUploadResponse,\n CuratorSellerVerifyResponse,\n FulfillIntentAttestationResponse,\n GetSellerCredentialStatusParams,\n GetBestByPlatformResponse,\n GetNearbyQuote,\n GetPlatformQuote,\n GetQuoteSingleResponse,\n IdentityAttestationOutput,\n NearbyQuote,\n QuoteRequest,\n QuoteMakerIdentity,\n QuoteSingleResponse,\n QuotesBestByPlatformRequest,\n GetQuoteResponse,\n PostDepositDetailsRequest,\n RedeemReferralCodeResponse,\n ReferralCodeLookupResponse,\n ReferralDashboardResponse,\n ReferralEarningsResponse,\n SellerCredentialUploadInput,\n OnchainCurrency,\n UpdateReferralCodeResponse,\n UploadSellerCredentialParams,\n UploadSellerCredentialBundleParams,\n UploadSellerCredentialOptions,\n UploadGoogleOAuthSellerCredentialParams,\n VerifySellerPaymentParams,\n ReferrerFeeConfig,\n BuyerTeePaymentProofInput,\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\ntype PayeeBoundSellerCredentialUploadInput = Extract<\n SellerCredentialUploadInput,\n { payeeId: string }\n>;\n\nexport type RedeemReferralCodeSignatureOptions = RedeemReferralCodeSignatureOptionsImpl;\nexport type ReferralBearerWriteOptions = ReferralBearerWriteOptionsImpl;\nexport type ReferralReadOptions = ReferralReadOptionsImpl;\nexport type ReferralSignatureOptions = ReferralSignatureOptionsImpl;\nexport type UpdateReferralCodeSignatureOptions = UpdateReferralCodeSignatureOptionsImpl;\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n return true;\n}\n\ntype LegacyPayeeDataInput = {\n offchainId: string;\n telegramUsername: string | null;\n metadata: CuratorMetadata | null;\n};\n\nfunction extractLegacyPayeeDataInput(depositData: unknown): LegacyPayeeDataInput | undefined {\n if (!depositData || typeof depositData !== 'object' || Array.isArray(depositData)) {\n return undefined;\n }\n\n const stringEntries = Object.entries(depositData).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === 'string' && entry[1].trim().length > 0,\n );\n const telegramUsername = stringEntries.find(([key]) => key === 'telegramUsername')?.[1] ?? null;\n const identifierEntries = stringEntries.filter(([key]) => key !== 'telegramUsername');\n const [primaryEntry, ...metadataEntries] = identifierEntries;\n if (!primaryEntry) {\n return undefined;\n }\n\n return {\n offchainId: primaryEntry[1],\n telegramUsername,\n metadata: metadataEntries.length > 0 ? Object.fromEntries(metadataEntries) : null,\n };\n}\n\nfunction readQuoteMakerIdentity(quote: QuoteSingleResponse): QuoteMakerIdentity | undefined {\n if (typeof quote.maker?.offchainId !== 'string') {\n return undefined;\n }\n\n const offchainId = quote.maker.offchainId.trim();\n return offchainId.length > 0 ? { offchainId } : undefined;\n}\n\nfunction warnDroppedQuoteWithoutMakerIdentity(\n method: 'getQuote' | 'getQuotesBestByPlatform',\n quote: QuoteSingleResponse,\n): void {\n console.warn(`[zkp2p/sdk] ${method}: dropping quote without maker.offchainId`, {\n depositId: quote.intent?.depositId,\n processorName: quote.intent?.processorName,\n });\n}\n\nfunction withQuotePayeeData(\n method: 'getQuote' | 'getQuotesBestByPlatform',\n quote: QuoteSingleResponse,\n): GetQuoteSingleResponse | undefined {\n const payeeData = readQuoteMakerIdentity(quote);\n if (!payeeData) {\n warnDroppedQuoteWithoutMakerIdentity(method, quote);\n return undefined;\n }\n\n return { ...quote, maker: payeeData, payeeData };\n}\n\nfunction isActiveQuotePaymentMethod(quote: QuoteSingleResponse): boolean {\n if (\n !quote?.intent ||\n typeof quote.intent.processorName !== 'string' ||\n typeof quote.paymentMethod !== 'string'\n ) {\n return false;\n }\n return matchesQuotePaymentMethod(quote.intent.processorName, quote.paymentMethod);\n}\n\nfunction enrichActiveQuotes(quotes: QuoteSingleResponse[]): GetQuoteSingleResponse[] {\n return quotes\n .map((quote) => {\n if (!isActiveQuotePaymentMethod(quote)) return undefined;\n\n return withQuotePayeeData('getQuote', quote);\n })\n .filter((quote) => quote !== undefined);\n}\n\nfunction enrichNearbySuggestions(suggestions: NearbyQuote[]): GetNearbyQuote[] {\n return suggestions\n .map((suggestion) => {\n if (!isActiveQuotePaymentMethod(suggestion.quote)) return undefined;\n\n const quote = withQuotePayeeData('getQuote', suggestion.quote);\n return quote ? { ...suggestion, quote } : undefined;\n })\n .filter((suggestion) => suggestion !== undefined);\n}\n\n/**\n * Normalizes a single payee-data entry, accepting both the current flat shape\n * ({ offchainId, telegramUsername?, metadata? }) and legacy blob shapes like\n * { email: 'x@y.z' } or { wisetag: 'foo' } that callers may still pass via\n * the deprecated `depositData` alias. Legacy shapes are coerced by extracting\n * the first non-empty string field (excluding telegramUsername) as the\n * offchainId and treating the remaining string fields as metadata.\n */\nfunction normalizePayeeDataInputItem(raw: unknown): CuratorPayeeDataInput | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return null;\n }\n\n const candidate = raw as CuratorPayeeDataInput & Record<string, unknown>;\n\n // Fast path: already in the modern flat shape — pass through unchanged.\n if (typeof candidate.offchainId === 'string' && candidate.offchainId.trim().length > 0) {\n return candidate;\n }\n\n // Fall back to legacy deposit-data blob extraction (e.g. { email: '...' }\n // or { wisetag: '...' }) for deprecated callers using `depositData`.\n const legacy = extractLegacyPayeeDataInput(raw);\n if (!legacy) {\n return null;\n }\n\n const metadata = legacy.metadata && isObjectRecord(legacy.metadata) ? { ...legacy.metadata } : {};\n if (candidate.identityAttestation !== undefined && candidate.identityAttestation !== null) {\n metadata.identityAttestation = candidate.identityAttestation;\n }\n\n return {\n offchainId: legacy.offchainId,\n telegramUsername: legacy.telegramUsername,\n metadata: Object.keys(metadata).length > 0 ? metadata : null,\n };\n}\n\nfunction getPayeeRegistrationMetadata(\n payeeData: CuratorPayeeDataInput,\n): CuratorMetadata | null | undefined {\n if (payeeData.identityAttestation === undefined || payeeData.identityAttestation === null) {\n return payeeData.metadata;\n }\n\n return {\n ...(isObjectRecord(payeeData.metadata) ? payeeData.metadata : {}),\n identityAttestation: payeeData.identityAttestation as IdentityAttestationOutput,\n };\n}\n\nfunction resolvePayeeDataInput(\n params: { payeeData?: unknown; depositData?: unknown },\n methodName: string,\n): CuratorPayeeDataInput[] {\n const payeeData = params.payeeData ?? params.depositData;\n if (!Array.isArray(payeeData)) {\n throw new Error(`${methodName} requires payeeData`);\n }\n const normalized = payeeData.map((item, index) => {\n const result = normalizePayeeDataInputItem(item);\n if (!result) {\n throw new Error(\n `${methodName}: payeeData[${index}] must include a non-empty offchainId or a recognizable legacy identifier`,\n );\n }\n return result;\n });\n return normalized;\n}\n\nfunction toPostDepositDetailsRequest(\n processorName: string,\n payeeData: CuratorPayeeDataInput | undefined,\n index: number,\n): PostDepositDetailsRequest {\n assertKnownProcessorName(processorName, `processorNames[${index}]`);\n if (!payeeData || typeof payeeData.offchainId !== 'string' || payeeData.offchainId.length === 0) {\n throw new Error(`payeeData[${index}] must include a non-empty offchainId`);\n }\n\n return {\n processorName,\n offchainId: payeeData.offchainId,\n telegramUsername: payeeData.telegramUsername,\n metadata: getPayeeRegistrationMetadata(payeeData),\n };\n}\n\nfunction assertKnownProcessorName(processorName: string, field: string): void {\n if (!METHOD_NAME_TO_HASH[processorName.toLowerCase()]) {\n throw new ValidationError(`Unknown processorName: ${processorName}`, field);\n }\n}\n\nfunction assertCatalogPaymentMethods(\n paymentMethods: readonly `0x${string}`[],\n chainId: number,\n runtimeEnv: RuntimeEnv,\n field: string,\n): void {\n const catalogHashes = new Set(\n Object.values(getPaymentMethodsCatalog(chainId, runtimeEnv)).map((entry) =>\n entry.paymentMethodHash.toLowerCase(),\n ),\n );\n\n paymentMethods.forEach((paymentMethod, index) => {\n if (!catalogHashes.has(paymentMethod.toLowerCase())) {\n throw new ValidationError(\n `Unsupported payment method hash: ${paymentMethod}`,\n `${field}[${index}]`,\n );\n }\n });\n}\n\nfunction assertCatalogCurrencies(\n paymentMethods: readonly `0x${string}`[],\n currencies: readonly (readonly OnchainCurrencyEntry[])[],\n chainId: number,\n runtimeEnv: RuntimeEnv,\n field: string,\n): void {\n const catalogByHash = new Map(\n Object.values(getPaymentMethodsCatalog(chainId, runtimeEnv)).map((entry) => [\n entry.paymentMethodHash.toLowerCase(),\n new Set(entry.currencies?.map((currency) => currency.toLowerCase()) ?? []),\n ]),\n );\n\n paymentMethods.forEach((paymentMethod, paymentMethodIndex) => {\n const allowedCurrencies = catalogByHash.get(paymentMethod.toLowerCase());\n if (!allowedCurrencies?.size) return;\n\n currencies[paymentMethodIndex]?.forEach((currency, currencyIndex) => {\n if (!allowedCurrencies.has(currency.code.toLowerCase())) {\n throw new ValidationError(\n `Unsupported currency hash ${currency.code} for payment method ${paymentMethod}`,\n `${field}[${paymentMethodIndex}][${currencyIndex}].code`,\n );\n }\n });\n });\n}\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: 'internal-curator-api-key', // Optional: internal seller verification only\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 /** Optional viem transport override for RPC reads */\n rpcTransport?: Transport;\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 /**\n * Optional internal curator API key (sent as `x-api-key`) for internal seller verification.\n * Not used by public curator endpoints such as quotes, maker reads, or intent signing.\n */\n apiKey?: string;\n /** Optional bearer token for indexer authentication and authenticated curator account APIs */\n authorizationToken?: string;\n /** Optional async token provider for indexer auth and authenticated curator account APIs */\n getAuthorizationToken?: IndexerAuthTokenProvider;\n /** Optional API key for indexer proxy authentication (sent as x-api-key header) */\n indexerApiKey?: string;\n /**\n * Extra headers sent on curator quote, orderbook, and `/v3/sign` requests.\n * Service callers use this for `x-pp-key`, which curator's `peerPayKey`\n * middleware reads to skip fee enforcement and rate limiting.\n */\n apiHeaders?: Record<string, 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 /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 /** Buyer TEE payment proof input */\n proof: BuyerTeePaymentProofInput;\n /** Allowed timestamp variance in ms (default: 300000ms) */\n timestampBufferMs?: string;\n /**\n * Alternate attestation-service origins, tried after network failures only.\n * Omit for the default Railway proxy; pass [] to disable fallback.\n */\n attestationServiceFallbackUrls?: string[];\n /** Override attestation service URL */\n attestationServiceUrl?: string;\n /**\n * Optional caller-pinned orchestrator target. Must resolve to an orchestrator\n * in the configured deployment; an unrecognized address throws.\n */\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 onAttestationComplete?: (attestation: FulfillIntentAttestationResponse) => 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 = OnchainCurrency;\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 Zkp2pClient({\n * walletClient,\n * chainId: base.id,\n * });\n *\n * // Step 1: Register payee details (separate from deposit creation)\n * const { hashedOnchainIds } = await client.registerPayeeDetails({\n * processorNames: ['wise'],\n * payeeData: [{ offchainId: '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 * payeeData: [{ offchainId: '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', 'preproduction', 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 /** OrchestratorV3 address (if deployed) */\n readonly orchestratorV3Address?: Address;\n /** OrchestratorV3 ABI */\n readonly orchestratorV3Abi?: 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 /** AddressGroupRegistry contract address (undefined where not deployed) */\n readonly addressGroupRegistryAddress?: Address;\n /** AddressGroupRegistry ABI */\n readonly addressGroupRegistryAbi?: Abi;\n /** WhitelistPolicy contract address (undefined where not deployed) */\n readonly whitelistPolicyAddress?: Address;\n /** WhitelistPolicy ABI */\n readonly whitelistPolicyAbi?: 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 /**\n * Standalone prepaid IntentGuardian contract. Undefined where no guardian is\n * deployed, so intent extensions fail closed there.\n *\n * Not to be confused with the per-deposit `intentGuardian` parameter on\n * `createDeposit`, which is an Escrow-level intent-approval guardian.\n */\n readonly intentGuardianAddress?: Address;\n readonly intentGuardianAbi?: Abi;\n /** OrchestratorRegistry address */\n readonly orchestratorRegistryAddress?: Address;\n /** OrchestratorRegistry ABI */\n readonly orchestratorRegistryAbi?: Abi;\n /** StakeVault address (undefined when staking is not deployed) */\n readonly stakeVaultAddress?: Address;\n /** StakeVault ABI */\n readonly stakeVaultAbi?: Abi;\n /** DisputeProtectionPolicy address (undefined when the staking stack is not deployed) */\n readonly disputeProtectionPolicyAddress?: Address;\n /** DisputeProtectionPolicy ABI */\n readonly disputeProtectionPolicyAbi?: Abi;\n\n /** Base API URL for ZKP2P services */\n readonly baseApiUrl?: string;\n /** Optional internal curator API key (`x-api-key`) for internal seller verification */\n readonly apiKey?: string;\n /** Extra headers for curator quote, orderbook, and sign requests. */\n readonly apiHeaders?: Record<string, string>;\n /** Bearer token for indexer authentication and authenticated curator account APIs */\n readonly authorizationToken?: string;\n /** Optional bearer token provider for indexer and authenticated curator account APIs */\n readonly getAuthorizationToken?: IndexerAuthTokenProvider;\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 _indexerStakingService: IndexerStakingService;\n private readonly _router: ContractRouter;\n private readonly _pvReader: ProtocolViewerReader;\n private readonly _vaultOps: VaultOperations;\n private readonly _stakeOps: StakeOperations;\n private readonly _disputeProtectionReadinessReader: DisputeProtectionReadinessReader;\n private readonly _intentGuardianOps: IntentGuardianOperations;\n private readonly _intentOps: IntentOperations;\n private readonly _referralOps: ReferralAccountOperations;\n private readonly _accessPolicyOps: AccessPolicyOperations;\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.chain?.rpcUrls?.default?.http?.[0];\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, Chain> = {\n [base.id]: base,\n [hardhat.id]: hardhat,\n };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({\n chain: selectedChain,\n transport: opts.rpcTransport ?? http(rpc, { batch: false }),\n }) as unknown as PublicClient;\n this._disputeProtectionReadinessReader = createDisputeProtectionReadinessReader({\n publicClient: this.publicClient,\n chainId: this.chainId,\n environment: this.runtimeEnv,\n });\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.escrowV2 ?? addresses.escrow);\n this.escrowV2Abi = abis.escrowV2 ?? abis.escrow;\n this.orchestratorV2Address = toAddress(addresses.orchestratorV2 ?? addresses.orchestrator);\n this.orchestratorV2Abi = abis.orchestratorV2 ?? abis.orchestrator;\n this.orchestratorV3Address = toAddress(addresses.orchestratorV3);\n this.orchestratorV3Abi = abis.orchestratorV3;\n\n const configuredEscrowAddresses = (addresses.escrowAddresses ?? [])\n .map((value) => toAddress(value))\n .filter((value): value is Address => Boolean(value));\n const configuredOrchestratorAddresses = (addresses.orchestratorAddresses ?? [])\n .map((value) => toAddress(value))\n .filter((value): value is Address => Boolean(value));\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;\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 this.orchestratorV3Address,\n ...configuredOrchestratorAddresses,\n ]);\n\n this.orchestratorAddress =\n this.orchestratorV2Address ??\n toAddress(addresses.orchestrator) ??\n this.orchestratorAddresses[0];\n this.orchestratorAbi = abis.orchestrator ?? this.orchestratorV2Abi;\n\n this.unifiedPaymentVerifier = toAddress(addresses.unifiedPaymentVerifier);\n this.protocolViewerAddress = toAddress(addresses.protocolViewer);\n this.protocolViewerAbi = abis.protocolViewer;\n\n // Build the current-deployment ProtocolViewer entry set.\n const resolvedPvEntries = addresses.protocolViewerEntries;\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.rateManagerV1);\n this.rateManagerV1Abi = abis.rateManagerV1;\n this.orchestratorRegistryAddress = toAddress(addresses.orchestratorRegistry);\n this.orchestratorRegistryAbi = abis.orchestratorRegistry;\n this.addressGroupRegistryAddress = toAddress(addresses.addressGroupRegistry);\n this.addressGroupRegistryAbi = abis.addressGroupRegistry;\n this.whitelistPolicyAddress = toAddress(addresses.whitelistPolicy);\n this.whitelistPolicyAbi = abis.whitelistPolicy;\n this.rateManagerRegistryAddress =\n toAddress(addresses.rateManagerRegistry) ?? this.rateManagerV1Address;\n this.rateManagerRegistryAbi = abis.rateManagerRegistry ?? this.rateManagerV1Abi;\n this.rateManagerControllerAddress = toAddress(addresses.rateManagerController);\n this.rateManagerControllerAbi = abis.rateManagerController;\n this.intentGuardianAddress = toAddress(addresses.intentGuardian);\n this.intentGuardianAbi = abis.intentGuardian;\n this.stakeVaultAddress = toAddress(addresses.stakeVault);\n this.stakeVaultAbi = abis.stakeVault;\n this.disputeProtectionPolicyAddress = toAddress(addresses.disputeProtectionPolicy);\n this.disputeProtectionPolicyAbi = abis.disputeProtectionPolicy;\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 orchestratorV3Address: this.orchestratorV3Address,\n orchestratorV3Abi: this.orchestratorV3Abi,\n orchestratorAddresses: this.orchestratorAddresses,\n });\n\n // optional USDC convenience\n if (addresses.usdc) this._usdcAddress = addresses.usdc;\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 this._indexerStakingService = new IndexerStakingService(this._indexerClient);\n\n // http verification config\n this.baseApiUrl = opts.baseApiUrl;\n this.apiKey = opts.apiKey;\n this.apiHeaders = opts.apiHeaders;\n this.authorizationToken = opts.authorizationToken;\n this.getAuthorizationToken = opts.getAuthorizationToken;\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._stakeOps = new StakeOperations({\n getPublicClient: () => this.publicClient,\n getStakeVaultAddress: () => this.stakeVaultAddress,\n getStakeVaultAbi: () => this.stakeVaultAbi,\n getStakeTokenAddress: () => this._usdcAddress,\n getDisputeProtectionPolicyAddress: () => this.disputeProtectionPolicyAddress,\n getDisputeProtectionPolicyAbi: () => this.disputeProtectionPolicyAbi,\n });\n this._intentGuardianOps = new IntentGuardianOperations({\n getPublicClient: () => this.publicClient,\n getGuardianAddress: () => this.intentGuardianAddress,\n getGuardianAbi: () => this.intentGuardianAbi,\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 getApiHeaders: () => this.apiHeaders,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getProtocolViewerAddress: () => this.protocolViewerAddress,\n getProtocolViewerAbi: () => this.protocolViewerAbi,\n getIndexerClient: () => this._indexerClient,\n getIndexerService: () => this._indexerService,\n getEscrowV2Address: () => this.escrowV2Address,\n getOrchestratorV2Address: () => this.orchestratorV2Address,\n getOrchestratorV3Address: () => this.orchestratorV3Address,\n host: {\n resolveEscrowContext: (options) => this.resolveEscrowContext(options),\n resolveOrchestratorContext: (options) => this.resolveOrchestratorContext(options),\n resolveEscrowAddressOrThrow: (escrowAddress, depositId, methodName) =>\n this.resolveEscrowAddressOrThrow(escrowAddress, depositId, methodName),\n prepareResolvedOrchestratorTransaction: (tx) =>\n this.prepareResolvedOrchestratorTransaction(tx),\n getFulfillIntentInputs: (intentHash, options) =>\n this.getFulfillIntentInputs(intentHash, options),\n getPvIntent: (intentHash) => this.getPvIntent(intentHash),\n },\n });\n this._accessPolicyOps = new AccessPolicyOperations({\n getPublicClient: () => this.publicClient,\n getRuntimeEnv: () => this.runtimeEnv,\n getPolicyAddress: () => this.whitelistPolicyAddress,\n getPolicyAbi: () => this.whitelistPolicyAbi,\n getRegistryAddress: () => this.addressGroupRegistryAddress,\n getRegistryAbi: () => this.addressGroupRegistryAbi,\n prepareContractTransaction: (tx) => this.prepareContractTransaction(tx),\n });\n this._referralOps = new ReferralAccountOperations({\n getWalletClient: () => this.walletClient,\n getChainId: () => this.chainId,\n getRuntimeEnv: () => this.runtimeEnv,\n getBaseApiUrl: () => this.baseApiUrl,\n getApiTimeoutMs: () => this.apiTimeoutMs,\n getAuthorizationToken: () => this.authorizationToken,\n getAuthorizationTokenProvider: () => this.getAuthorizationToken,\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 stripTrailingSlash(url: string): string {\n return url.replace(/\\/$/, '');\n }\n\n private defaultAttestationServiceForBaseApiUrl(baseApiUrl: string): string {\n try {\n const { hostname } = new URL(baseApiUrl);\n if (hostname === 'api-staging.zkp2p.xyz') {\n return 'https://attestation-service-staging.zkp2p.xyz';\n }\n // Preprod currently reuses the production attestation-service deployment.\n if (hostname === 'api-preprod.zkp2p.xyz') {\n return 'https://attestation-service.zkp2p.xyz';\n }\n if (hostname === 'api.zkp2p.xyz') {\n return 'https://attestation-service.zkp2p.xyz';\n }\n } catch {\n // Fall through to the explicit error below for unsupported custom hosts.\n }\n\n if (baseApiUrl === DEFAULT_BASE_API_URL) {\n return 'https://attestation-service.zkp2p.xyz';\n }\n\n throw new Error(\n `attestationServiceUrl is required when baseApiUrl is not a supported zkp2p API host: ${baseApiUrl}`,\n );\n }\n\n private async resolveAuthorizationToken(): Promise<string | undefined> {\n if (this.getAuthorizationToken) {\n return (await this.getAuthorizationToken()) ?? undefined;\n }\n\n return this.authorizationToken;\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: OnchainCurrencyEntry[],\n escrowAbi: Abi | undefined,\n ): Array<Record<string, unknown>> {\n return normalizeCurrencyTuples(currencies, escrowAbi);\n }\n\n supportsInlineOracleRateConfig(params?: { escrowAddress?: Address }): boolean {\n return this._vaultOps.supportsInlineOracleRateConfig({\n escrowAddress: params?.escrowAddress,\n });\n }\n\n private resolveAbiFunctionName(abi: Abi | undefined, names: string[]): string {\n return resolveAbiFunctionName(abi, names);\n }\n\n private resolveEscrowAddressOrThrow(\n escrowAddress: Address | undefined,\n depositId: bigint | number | string,\n _methodName: string,\n ): Address {\n const resolved = escrowAddress ?? this.parseEscrowAddressFromCompositeDepositId(depositId);\n if (resolved) return resolved;\n return this.resolveEscrowContext().address;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig;\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 }): 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 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 ): OrchestratorContractContext | undefined {\n return this._router.resolveOrchestratorForEscrow(escrowAddress);\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 lookupIntentRoutingOnchain(intentHash: `0x${string}`): Promise<{\n orchestratorAddress?: Address;\n escrowAddress?: Address;\n }> {\n const result = await this._pvReader.getPvIntentWithContext(intentHash);\n return {\n orchestratorAddress: this.normalizeAddress(result.context?.orchestrator),\n escrowAddress:\n this.normalizeAddress(result.context?.escrow) ??\n this.normalizeAddress(result.view.intent.escrow),\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 }): Promise<OrchestratorContractContext> {\n const explicit = this.getOrchestratorContextByAddress(options?.orchestratorAddress);\n if (explicit) return explicit;\n if (options?.orchestratorAddress) {\n throw new Error(`Unsupported orchestrator address: ${options.orchestratorAddress}`);\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 } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'Indexer intent routing lookup', error);\n }\n\n try {\n const routing = await this.lookupIntentRoutingOnchain(options.intentHash);\n const fromIntent = this.getOrchestratorContextByAddress(routing.orchestratorAddress);\n if (fromIntent) return fromIntent;\n } catch (error) {\n this.warnOrchestratorFallback(options.intentHash, 'On-chain intent routing lookup', error);\n }\n }\n\n if (options?.escrowAddress) {\n const fromEscrow = this.resolveOrchestratorForEscrow(options.escrowAddress);\n if (fromEscrow) return fromEscrow;\n }\n\n if (options?.intentHash) {\n throw new Error(\n `Unable to resolve orchestrator for intent ${options.intentHash}; indexer and on-chain routing did not identify a configured orchestrator`,\n );\n }\n\n const fallback = this.resolveOrchestratorForEscrow();\n if (fallback) return fallback;\n\n throw new Error('Orchestrator not available');\n }\n\n /**\n * Spread helper for viem requests.\n * justified: TxOverrides mixes legacy gasPrice with EIP-1559 fee fields, which\n * viem's discriminated request unions reject; keep the suppression in one place.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private applyTxOverrides(overrides: Omit<TxOverrides, 'referrer'>): any {\n return overrides;\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,\n args: opts.args ?? [],\n account: this.walletClient.account!,\n ...this.applyTxOverrides(txOverrides),\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.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,\n args: prepared.args,\n account: this.walletClient.account!,\n ...this.applyTxOverrides(overrides),\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 ...this.applyTxOverrides(overrides),\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,\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,\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,\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: (params: TParams) => { 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(params);\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(params);\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 buildStakeVaultMethod<TParams extends { txOverrides?: TxOverrides }>(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n () => ({\n address: this.stakeVaultAddress,\n abi: this.stakeVaultAbi,\n label: 'StakeVault',\n }),\n functionName,\n buildArgs,\n );\n }\n\n private buildDisputeProtectionPolicyMethod<\n TParams extends { disputeProtectionPolicyAddress?: Address; txOverrides?: TxOverrides },\n >(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n (params) => ({\n address: params.disputeProtectionPolicyAddress ?? this.disputeProtectionPolicyAddress,\n abi: this.disputeProtectionPolicyAbi,\n label: 'DisputeProtectionPolicy',\n }),\n functionName,\n buildArgs,\n );\n }\n\n private buildIntentGuardianMethod<TParams extends { txOverrides?: TxOverrides }>(\n functionName: string,\n buildArgs: (params: TParams) => readonly unknown[],\n ): PrepareableMethod<TParams, Hash> {\n return this.buildContractMethod(\n () => ({\n address: this.intentGuardianAddress,\n abi: this.intentGuardianAbi,\n label: 'IntentGuardian',\n }),\n functionName,\n buildArgs,\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 },\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 });\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 });\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 event data. Use `amount` for net USDC\n * // transferred to the taker; use getIntentFulfillmentAmounts() when you\n * // also need gross released USDC.\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 stakingService = this._indexerStakingService;\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 fulfilled intents for a vault by rate manager ID.\n */\n getIntentsByRateManager: (\n rateManagerId: string,\n statuses?: IntentStatus[],\n ): Promise<IntentEntity[]> => {\n return service.fetchIntentsByRateManager(rateManagerId, 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. `amount` is the net\n * USDC transferred to the taker after protocol/referrer fees.\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. Use\n * `takerAmountNetFees` as the buyer/taker received USDC amount.\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 maker profit snapshots for the provided deposits.\n */\n getProfitSnapshotsByDeposits: (\n depositIds: string[],\n ): Promise<MakerProfitSnapshotEntity[]> => {\n return service.fetchProfitSnapshotsByDeposits(depositIds);\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 * Composes the hard-cut 0.14.0-rc.0 staking current-state rows. Pass the\n * caller's fresh stakeOwnerOf(taker) result so the account rows can be\n * fetched together and checked against indexed ownership.\n */\n getStakingState: (\n params: IndexedStakingStateParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedStakingState> => {\n return stakingService.fetchStakingState(params, {\n signal: options?.signal,\n });\n },\n\n /** Pages stake-owner locks by immutable lock identity. */\n getStakeLocks: (\n params: StakeLockPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedStakeLock>> => {\n return stakingService.fetchStakeLocks(params, { signal: options?.signal });\n },\n\n /**\n * Pages one side of the vault's authorization graph: the takers a stake\n * owner has authorized, or the stake owners that have authorized a taker.\n */\n getTakerStakeAuthorizations: (\n params: TakerStakeAuthorizationPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedTakerStakeAuthorization>> => {\n return stakingService.fetchTakerStakeAuthorizations(params, {\n signal: options?.signal,\n });\n },\n\n /** Pages append-only activity relevant to either side of a merchant's stake delegation. */\n getStakeActivity: (\n params: StakeActivityPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<IndexedPage<IndexedStakeActivity>> => {\n return stakingService.fetchStakeActivity(params, { signal: options?.signal });\n },\n\n /** Pages the exact active policy's finalized dispute stream. */\n getDisputeProtectionIntents: (\n params: DisputeProtectionIntentPageParams,\n options?: { signal?: AbortSignal },\n ): Promise<DisputeProtectionIntentPage> => {\n return stakingService.fetchDisputeProtectionIntents(params, {\n signal: options?.signal,\n });\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.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 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 }).address;\n const allowance = await this.publicClient.readContract({\n address: params.token,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [owner, spender],\n });\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,\n functionName: 'approve',\n args: [spender, value],\n txOverrides: params.txOverrides,\n });\n return { hadAllowance: false, hash };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: TAKER STAKING ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Return the resolved StakeVault coordinates for advanced wallet, relayer,\n * or reactive read integrations.\n */\n getStakeVaultContract(): { address: Address; abi: Abi; stakeToken: Address } {\n return this._stakeOps.getContract();\n }\n\n /** Return the resolved OrchestratorV3 coordinates for advanced integrations. */\n getOrchestratorV3Contract(): { address: Address; abi: Abi } {\n if (!this.orchestratorV3Address || !this.orchestratorV3Abi) {\n throw new Error('OrchestratorV3 not available for this chain/environment');\n }\n return { address: this.orchestratorV3Address, abi: this.orchestratorV3Abi };\n }\n\n /** Return the resolved DisputeProtectionPolicy coordinates for keeper integrations. */\n getDisputeProtectionPolicyContract(): { address: Address; abi: Abi } {\n if (!this.disputeProtectionPolicyAddress || !this.disputeProtectionPolicyAbi) {\n throw new Error('DisputeProtectionPolicy not available for this chain/environment');\n }\n return { address: this.disputeProtectionPolicyAddress, abi: this.disputeProtectionPolicyAbi };\n }\n\n /**\n * Ensure the connected wallet has approved enough USDC for StakeVault.\n * If an approval is submitted, wait for it to confirm before depositing.\n */\n async ensureStakeAllowance(params: {\n amount: bigint;\n maxApprove?: boolean;\n txOverrides?: TxOverrides;\n }): Promise<{ hadAllowance: boolean; hash?: Hash }> {\n const { address, stakeToken } = this._stakeOps.getContract();\n return this.ensureAllowance({\n token: stakeToken,\n spender: address,\n amount: params.amount,\n maxApprove: params.maxApprove,\n txOverrides: params.txOverrides,\n });\n }\n\n /** Deposit USDC stake owned by the transaction sender. */\n readonly depositStake = this.buildStakeVaultMethod<StakeVaultWriteParams['depositStake']>(\n 'depositStake',\n (params) => [params.amount],\n );\n\n /** Withdraw the sender's free stake immediately; locked stake cannot move. */\n readonly withdrawStake = this.buildStakeVaultMethod<StakeVaultWriteParams['withdrawStake']>(\n 'withdrawStake',\n (params) => [params.amount],\n );\n\n /** Withdraw the sender's complete claimable USDC balance. */\n readonly claim = this.buildStakeVaultMethod<StakeVaultWriteParams['claim']>('claim', () => []);\n\n /** Grant or revoke a taker's access to the sender's stake. */\n readonly setTakerAuthorization = this.buildStakeVaultMethod<\n StakeVaultWriteParams['setTakerAuthorization']\n >('setTakerAuthorization', (params) => [params.taker, params.authorized]);\n\n /** Select the authorizing stake owner that backs the connected taker. */\n readonly selectStakeOwner = this.buildStakeVaultMethod<StakeVaultWriteParams['selectStakeOwner']>(\n 'selectStakeOwner',\n (params) => [params.stakeOwner],\n );\n\n /** Clear the connected taker's selection and return to self-stake. */\n readonly clearStakeOwner = this.buildStakeVaultMethod<StakeVaultWriteParams['clearStakeOwner']>(\n 'clearStakeOwner',\n () => [],\n );\n\n /** Read total stake owned by an address directly from StakeVault. */\n getStakeBalance(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getStakeBalance(stakeOwner);\n }\n\n /** Read stake committed to active StakeVault locks. */\n getLockedStake(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getLockedStake(stakeOwner);\n }\n\n /** Read stake available for immediate withdrawal or a new lock. */\n getFreeStake(stakeOwner: Address): Promise<bigint> {\n return this._stakeOps.getFreeStake(stakeOwner);\n }\n\n /** Read the non-stake USDC withdrawable by a beneficiary with `claim()`. */\n getClaimable(beneficiary: Address): Promise<bigint> {\n return this._stakeOps.getClaimable(beneficiary);\n }\n\n /** Resolve the effective stake owner backing a taker. */\n getStakeOwner(taker: Address): Promise<Address> {\n return this._stakeOps.getStakeOwner(taker);\n }\n\n /** Read a taker's raw selection, which is stale once authorization is revoked. */\n getSelectedStakeOwner(taker: Address): Promise<Address> {\n return this._stakeOps.getSelectedStakeOwner(taker);\n }\n\n /** Read whether a stake owner currently authorizes a taker. */\n getTakerAuthorization(stakeOwner: Address, taker: Address): Promise<boolean> {\n return this._stakeOps.getTakerAuthorization(stakeOwner, taker);\n }\n\n /** Read the complete authoritative StakeVault state needed by a staking UI. */\n getStakeVaultState(params: { staker: Address; taker?: Address }): Promise<StakeVaultState> {\n return this._stakeOps.getStakeVaultState(params);\n }\n\n /** Read whether the DisputeProtectionPolicy is refusing new dispute-protected admissions. */\n getAdmissionsPaused(): Promise<boolean> {\n return this._stakeOps.getAdmissionsPaused();\n }\n\n /** Prove the exact packaged dispute-protection deployment at one block. */\n getDisputeProtectionReadiness(\n options?: DisputeProtectionReadinessOptions,\n ): Promise<DisputeProtectionReadinessResult> {\n return this._disputeProtectionReadinessReader.read(options);\n }\n\n /**\n * Read a payment method's minimum collateral lock window in seconds. Zero\n * means the method admits unbonded — no stake is locked at admission.\n */\n getRiskWindow(paymentMethodHash: `0x${string}`): Promise<bigint> {\n return this._stakeOps.getRiskWindow(paymentMethodHash);\n }\n\n /** Read whether an escrow deposit has opted into dispute protection. */\n isDisputeProtectionEnabled(\n escrow: Address,\n depositId: bigint,\n paymentMethod: Hex,\n ): Promise<boolean> {\n return this._stakeOps.isDisputeProtectionEnabled(escrow, depositId, paymentMethod);\n }\n\n /** Enable or disable dispute protection for one deposit. */\n readonly setDisputeProtectionEnabled = this.buildDisputeProtectionPolicyMethod<{\n escrow: Address;\n depositId: bigint;\n paymentMethod: Hex;\n enabled: boolean;\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('setDisputeProtectionEnabled', (params) => [\n params.escrow,\n params.depositId,\n params.paymentMethod,\n params.enabled,\n ]);\n\n /**\n * Release one protected intent whose risk window matured, unlocking its\n * stake cover. Permissionless once mature. Pass `disputeProtectionPolicyAddress` to\n * pin the transaction to a snapshotted deployment.\n */\n readonly releaseMaturedDisputeProtectionIntent = this.buildDisputeProtectionPolicyMethod<{\n intentHash: `0x${string}`;\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('releaseMaturedDisputeProtectionIntent', (params) => [params.intentHash]);\n\n /**\n * Release multiple matured protected intents in one transaction.\n * Pass `disputeProtectionPolicyAddress` to pin the transaction to a snapshotted deployment.\n */\n readonly releaseMaturedDisputeProtectionIntents = this.buildDisputeProtectionPolicyMethod<{\n intentHashes: readonly `0x${string}`[];\n disputeProtectionPolicyAddress?: Address;\n txOverrides?: TxOverrides;\n }>('releaseMaturedDisputeProtectionIntents', (params) => [params.intentHashes]);\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.payeeData - Payee details per processor (e.g., [{ offchainId: 'you@example.com' }]). Required when the SDK needs to register payee details with the curator.\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 * payeeData: [{ offchainId: 'you@example.com' }],\n * });\n * // Then pass hashedOnchainIds to createDeposit\n * ```\n */\n async registerPayeeDetails(params: {\n processorNames: string[];\n payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\n }): Promise<{\n depositDetails: PostDepositDetailsRequest[];\n hashedOnchainIds: string[];\n }> {\n const payeeData = resolvePayeeDataInput(params, 'registerPayeeDetails');\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 !== payeeData.length) {\n throw new Error('processorNames and payeeData length mismatch');\n }\n const baseApiUrl = (this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(/\\/$/, '');\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map(\n (processorName, index) => toPostDepositDetailsRequest(processorName, payeeData[index], index),\n );\n\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs)),\n );\n if (!apiResponses.every((r) => r.success)) {\n const failed = apiResponses.find((r) => !r.success);\n throw new Error(failed?.message || 'Failed to register payee details');\n }\n\n const hashedOnchainIds = apiResponses.map((r) => r.responseObject.hashedOnchainId);\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.payeeData - Payee details per processor (e.g., [{ offchainId: 'you@example.com' }])\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 - Guardian for intent approval. Defaults to the paid guardian deployed for the client's environment.\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 (empty when payee registration is skipped) and the transaction hash\n *\n * @throws Error if processorNames, payeeData, and conversionRates lengths don't match\n * @throws Error if payeeData is missing and neither payeeDetailsHashes nor full payment method overrides are provided\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 * payeeData: [{ offchainId: '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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 payeeData?: CuratorPayeeDataInput[];\n depositData?: CuratorPayeeDataInput[];\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 const hasOverrides = Boolean(\n params.paymentMethodsOverride ||\n params.paymentMethodDataOverride ||\n params.currenciesOverride,\n );\n const payeeDetailsHashes = params.payeeDetailsHashes;\n const hasPayeeHashes = payeeDetailsHashes !== undefined;\n const shouldResolvePayeeData =\n params.payeeData !== undefined || params.depositData !== undefined;\n const payeeData = shouldResolvePayeeData\n ? resolvePayeeDataInput(params, 'createDeposit')\n : null;\n\n if (!Array.isArray(params.processorNames) || params.processorNames.length === 0) {\n throw new Error('processorNames must be a non-empty array');\n }\n params.processorNames.forEach((processorName, index) =>\n assertKnownProcessorName(processorName, `processorNames[${index}]`),\n );\n if (params.processorNames.length !== params.conversionRates.length) {\n throw new Error('processorNames and conversionRates length mismatch');\n }\n if (payeeData && params.processorNames.length !== payeeData.length) {\n throw new Error('processorNames and payeeData length mismatch');\n }\n if (!hasOverrides && !hasPayeeHashes && !payeeData) {\n throw new Error(\n 'createDeposit requires payeeData unless payeeDetailsHashes or full payment method overrides are provided',\n );\n }\n\n const depositDetails: PostDepositDetailsRequest[] = payeeData\n ? params.processorNames.map((processorName, index) =>\n toPostDepositDetailsRequest(processorName, payeeData[index], index),\n )\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 assertCatalogPaymentMethods(\n params.paymentMethodsOverride,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethodsOverride',\n );\n assertCatalogCurrencies(\n params.paymentMethodsOverride,\n params.currenciesOverride,\n this.chainId,\n this.runtimeEnv,\n 'currenciesOverride',\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 (payeeDetailsHashes !== undefined) {\n // Use pre-computed hashes (e.g., from registerPayeeDetails)\n if (payeeDetailsHashes.length !== params.processorNames.length) {\n throw new Error('payeeDetailsHashes length must match processorNames length');\n }\n hashedOnchainIds = payeeDetailsHashes;\n } else {\n // Register payee details with the curator when hashes are not provided\n const baseApiUrl = (this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(/\\/$/, '');\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs)),\n );\n if (!apiResponses.every((r) => r.success)) {\n const failed = apiResponses.find((r) => !r.success);\n throw new Error(failed?.message || 'Failed to create deposit details');\n }\n hashedOnchainIds = apiResponses.map((r) => r.responseObject.hashedOnchainId);\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 // justified: callers pass arbitrary currency strings; mapConversionRatesToOnchainMinRate\n // validates each code against the currency catalog at runtime.\n currencies = mapConversionRatesToOnchainMinRate(\n params.conversionRates as UICurrencyRate[][],\n paymentMethods.length,\n );\n }\n\n const escrowContext = this.resolveEscrowContext({\n escrowAddress: params.escrowAddress,\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 ?? this.intentGuardianAddress ?? ZERO_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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig[][];\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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: CurrencyOracleRateConfig;\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',\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',\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 * Pay to extend a live intent through the standalone prepaid IntentGuardian.\n *\n * Payment is prepaid and non-refundable and transfers to the deposit owner,\n * not the protocol. Any account may pay for any live intent — the payer does\n * not have to be the taker — so the deposit token must be approved to the\n * guardian by whoever signs this.\n *\n * `maxCost` is required slippage protection: the guardian fee is\n * owner-governed and may change between quoting and execution, in which case\n * the call reverts with ExtensionCostExceedsMax instead of overcharging.\n * Never pass an unbounded maximum.\n *\n * Escrow still enforces the cumulative intent lifetime cap; the guardian does\n * not bypass it. After confirmation, refetch the intent — canonical expiry\n * comes from Escrow's IntentExpiryExtended event, not from guardian events.\n */\n readonly extendIntentLifetime = this.buildIntentGuardianMethod<\n IntentGuardianWriteParams['extendIntent']\n >('extendIntent', (params) => [\n params.escrow,\n params.depositId,\n params.intentHash,\n params.additionalTime,\n params.maxCost,\n ]);\n\n /**\n * Live guardian policy, including whether governance has disabled extensions\n * by setting the fee to zero. Read this rather than caching a fee value.\n */\n async getIntentGuardianPolicy(): Promise<IntentGuardianPolicy> {\n return this._intentGuardianOps.getPolicy();\n }\n\n /**\n * Authoritative on-chain extension quote. Call immediately before signing and\n * derive `maxCost` from the result — a displayed quote is never a commitment.\n */\n async quoteIntentExtension(params: {\n intentAmount: bigint;\n additionalTime: bigint;\n }): Promise<IntentGuardianQuote> {\n return this._intentGuardianOps.quoteExtensionCost(params);\n }\n\n /**\n * Payer allowance/balance against the guardian for the target deposit token.\n * The guardian charges `deposit.token`, which is not necessarily USDC.\n */\n async getIntentGuardianPayerFunding(params: {\n payer: Address;\n token: Address;\n }): Promise<{ allowance: bigint; balance: bigint }> {\n return this._intentGuardianOps.getPayerFunding(params);\n }\n\n /** True when this deployment has a usable guardian. Gate UI on this. */\n hasIntentGuardian(): boolean {\n return this._intentGuardianOps.isAvailable();\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',\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 assertCatalogPaymentMethods(\n params.paymentMethods,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethods',\n );\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 assertCatalogPaymentMethods(\n params.paymentMethods,\n this.chainId,\n this.runtimeEnv,\n 'paymentMethods',\n );\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 curator `/v3/sign` when `baseApiUrl` is configured. Deposits\n * using zero-address gating are signaled directly with an empty signature.\n * Otherwise you must provide `gatingServiceSignature` and `signatureExpiration`\n * yourself.\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 * Deposit access policies and verified address groups.\n *\n * `accessPolicy.isSupported` is false wherever the contracts are not\n * deployed. Writes are depositor-only, and saving a policy configures storage\n * rather than enforcing admission.\n */\n get accessPolicy(): AccessPolicyOperations {\n return this._accessPolicyOps;\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 - Buyer TEE payment proof input\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 if (params?.callbacks?.onTxMined) {\n await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n params.callbacks.onTxMined(txHash);\n }\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 // ───────────────────────────────────────────────────────────────────────────\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. Quotes carry `payeeData.offchainId` derived from the curator v3\n * `maker` identity; quotes without it are dropped.\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 req.paymentPlatforms.forEach((processorName, index) =>\n assertKnownProcessorName(processorName, `paymentPlatforms[${index}]`),\n );\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n // New quote traffic stays pinned to the current escrow unless the caller\n // explicitly scopes the request themselves.\n const reqWithEscrow: QuoteRequest = { ...req };\n if (!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) {\n const configuredEscrows = this.escrowV2Address\n ? [this.escrowV2Address 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(reqWithEscrow, {\n baseApiUrl,\n timeoutMs,\n headers: this.apiHeaders,\n });\n const quotes = enrichActiveQuotes(quote.responseObject.quotes);\n const enrichedQuote: GetQuoteResponse = {\n ...quote,\n responseObject: {\n ...quote.responseObject,\n quotes,\n nearbySuggestions: quote.responseObject.nearbySuggestions\n ? {\n below: enrichNearbySuggestions(quote.responseObject.nearbySuggestions.below),\n above: enrichNearbySuggestions(quote.responseObject.nearbySuggestions.above),\n }\n : undefined,\n },\n };\n return appendReferrerFeeDisplayFields(enrichedQuote, referrerFeeConfig);\n }\n\n /**\n * **Supporting Method** - Fetches the best available quote per supported payment platform.\n *\n * Returns one quote per platform when available. Best quotes carry\n * `payeeData.offchainId` derived from the curator v3 `maker` identity; best\n * quotes without it are dropped.\n *\n * @param req - Best-by-platform quote request parameters\n * @param opts - Optional overrides for API URL and timeout\n * @returns Best-by-platform quote response\n */\n async getQuotesBestByPlatform(\n req: QuotesBestByPlatformRequest,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<GetBestByPlatformResponse> {\n const referrerFeeConfig = assertValidReferrerFeeConfig(\n req.referrerFeeConfig,\n 'getQuotesBestByPlatform',\n );\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL).replace(\n /\\/$/,\n '',\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const reqWithEscrow: QuotesBestByPlatformRequest = { ...req };\n if (!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) {\n const configuredEscrows = this.escrowV2Address\n ? [this.escrowV2Address]\n : this.escrowAddress\n ? [this.escrowAddress]\n : [];\n if (configuredEscrows.length > 0) {\n reqWithEscrow.escrowAddresses = configuredEscrows;\n }\n }\n\n const quote = await apiGetQuotesBestByPlatform(reqWithEscrow, {\n baseApiUrl,\n timeoutMs,\n headers: this.apiHeaders,\n });\n const platformQuotes = quote.responseObject.platformQuotes\n .filter((platformQuote) => {\n const platform = platformQuote.platform.trim().toLowerCase();\n if (!METHOD_NAME_TO_HASH[platform]) return false;\n return (\n !platformQuote.bestQuote ||\n (platform === platformQuote.bestQuote.intent.processorName.trim().toLowerCase() &&\n isActiveQuotePaymentMethod(platformQuote.bestQuote))\n );\n })\n .flatMap<GetPlatformQuote>((platformQuote) => {\n const bestQuote = platformQuote.bestQuote;\n if (!bestQuote) return [{ ...platformQuote, bestQuote: undefined }];\n\n const enrichedBestQuote = withQuotePayeeData('getQuotesBestByPlatform', bestQuote);\n return enrichedBestQuote ? [{ ...platformQuote, bestQuote: enrichedBestQuote }] : [];\n });\n const enrichedQuote: GetBestByPlatformResponse = {\n ...quote,\n responseObject: {\n ...quote.responseObject,\n platformQuotes,\n },\n };\n\n return appendReferrerFeeDisplayFieldsToBestByPlatform(enrichedQuote, referrerFeeConfig);\n }\n\n /**\n * Fetch a referral dashboard. Pass `address` for a public wallet-keyed read;\n * omit it to use the authenticated caller mode.\n */\n async getReferralDashboard(opts?: ReferralReadOptions): Promise<ReferralDashboardResponse> {\n return this._referralOps.getReferralDashboard(opts);\n }\n\n /**\n * Fetch referral earnings. Pass `address` for a public wallet-keyed read;\n * omit it to use the authenticated caller mode.\n */\n async getReferralEarnings(opts?: ReferralReadOptions): Promise<ReferralEarningsResponse> {\n return this._referralOps.getReferralEarnings(opts);\n }\n\n /**\n * Publicly look up a referral code's owner wallet and active status.\n */\n async lookupReferralCode(\n code: string,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<ReferralCodeLookupResponse> {\n return this._referralOps.lookupReferralCode(code, opts);\n }\n\n /**\n * Create or fetch the authenticated caller's referral code with bearer auth.\n */\n async createReferralCode(opts?: ReferralBearerWriteOptions): Promise<CreateReferralCodeResponse> {\n return this._referralOps.createReferralCode(opts);\n }\n\n /**\n * Create or fetch the wallet's referral code with EIP-712 signature auth.\n */\n async createReferralCodeWithSignature(\n opts?: ReferralSignatureOptions,\n ): Promise<CreateReferralCodeResponse> {\n return this._referralOps.createReferralCodeWithSignature(opts);\n }\n\n /**\n * Apply another user's referral code with bearer auth.\n */\n async redeemReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<RedeemReferralCodeResponse> {\n return this._referralOps.redeemReferralCode(code, opts);\n }\n\n /**\n * Apply another user's referral code with EIP-712 signature auth. If\n * `referrerWalletAddress` is omitted, the SDK looks up the code first and signs\n * the current owner wallet into the redeem payload.\n */\n async redeemReferralCodeWithSignature(\n code: string,\n opts?: RedeemReferralCodeSignatureOptions,\n ): Promise<RedeemReferralCodeResponse> {\n return this._referralOps.redeemReferralCodeWithSignature(code, opts);\n }\n\n /**\n * Customize the authenticated caller's referral code with bearer auth.\n */\n async updateReferralCode(\n code: string,\n opts?: ReferralBearerWriteOptions,\n ): Promise<UpdateReferralCodeResponse> {\n return this._referralOps.updateReferralCode(code, opts);\n }\n\n /**\n * Customize the wallet's referral code with EIP-712 signature auth.\n */\n async updateReferralCodeWithSignature(\n code: string,\n opts: UpdateReferralCodeSignatureOptions,\n ): Promise<UpdateReferralCodeResponse> {\n return this._referralOps.updateReferralCodeWithSignature(code, opts);\n }\n\n /**\n * The signed `credentialValidatedAt` field is an upload-time freshness witness minted by\n * attestation-service. `credentialExpiresAt` carries an upstream session expiry hint when one\n * can be trusted (currently `null` for all platforms). Once curator persists the bundle,\n * seller-automated-release availability is governed by curator's probe/revalidation state\n * rather than these timestamps.\n *\n * Create a signed seller credential bundle with attestation-service and store it via\n * curator's platform plus hashed payee-details route. Session-cookie platforms register\n * or recover the payee maker row before upload; Wise derives the payee hash inside the enclave\n * from the submitted Personal API Token.\n */\n async uploadSellerCredential(\n params: UploadSellerCredentialParams,\n opts?: UploadSellerCredentialOptions,\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const attestationServiceUrl = this.stripTrailingSlash(\n opts?.attestationServiceUrl ?? this.defaultAttestationServiceForBaseApiUrl(baseApiUrl),\n );\n\n const createBundle = (uploadPayload: SellerCredentialUploadInput) =>\n apiCreateSellerCredentialBundle(\n uploadPayload,\n attestationServiceUrl,\n params.platform,\n timeoutMs,\n opts?.attestationRuntime,\n opts?.attestationServiceFallbackUrls\n ? { fallbackUrls: opts.attestationServiceFallbackUrls }\n : undefined,\n );\n\n if (params.platform === 'wise') {\n const bundleResponse = await createBundle({\n ...(params.callerAddress ? { callerAddress: params.callerAddress } : {}),\n sessionMaterial: params.sessionMaterial,\n });\n\n if (!bundleResponse.success || !bundleResponse.responseObject) {\n throw new Error(bundleResponse.message || 'Failed to create seller credential bundle');\n }\n\n return this.uploadSellerCredentialBundle(\n {\n bundle: bundleResponse.responseObject,\n platform: params.platform,\n },\n { baseApiUrl, timeoutMs },\n );\n }\n\n const bundlePayload = {\n ...(params.callerAddress ? { callerAddress: params.callerAddress } : {}),\n payeeId: params.payeeId,\n sessionMaterial: params.sessionMaterial,\n } as PayeeBoundSellerCredentialUploadInput;\n const bundleResponse = await createBundle(bundlePayload);\n\n if (!bundleResponse.success || !bundleResponse.responseObject) {\n throw new Error(bundleResponse.message || 'Failed to create seller credential bundle');\n }\n\n return this.uploadSellerCredentialBundle(\n {\n bundle: bundleResponse.responseObject,\n offchainId: params.offchainId,\n platform: params.platform,\n ...(params.telegramUsername !== undefined\n ? { telegramUsername: params.telegramUsername }\n : {}),\n ...(params.metadata !== undefined ? { metadata: params.metadata } : {}),\n },\n { baseApiUrl, timeoutMs },\n );\n }\n\n /**\n * Store an already-encrypted seller credential bundle with curator.\n */\n async uploadSellerCredentialBundle(\n params: UploadSellerCredentialBundleParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const authorizationToken = await this.resolveAuthorizationToken();\n\n return apiUploadSellerCredentialBundle(params, baseApiUrl, timeoutMs, authorizationToken);\n }\n\n /**\n * Upload a seller Gmail OAuth authorization code through curator.\n *\n * Curator owns the encryption hop to attestation-service for this flow, so\n * callers send the one-time Google code plus the stable seller identity.\n */\n async uploadGoogleOAuthSellerCredential(\n params: UploadGoogleOAuthSellerCredentialParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialUploadResponse> {\n const platform = (params as { platform?: unknown }).platform;\n if (platform !== 'paypal') {\n throw new ValidationError(\n `Unsupported Google OAuth seller credential platform: ${String(platform)}`,\n 'platform',\n );\n }\n\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n const getUploadOptions = async () => {\n let authorizationToken: string | undefined;\n try {\n authorizationToken = await this.resolveAuthorizationToken();\n } catch {\n authorizationToken = undefined;\n }\n\n return {\n timeoutMs,\n ...(authorizationToken ? { authorizationToken } : {}),\n };\n };\n\n return apiUploadGoogleOAuthSellerCredential(\n 'paypal',\n params.payeeDetails,\n {\n payeeEmail: params.payeeEmail,\n authorizationCode: params.authorizationCode,\n redirectUri: params.redirectUri,\n },\n baseApiUrl,\n await getUploadOptions(),\n );\n }\n\n /**\n * Status is a coarse curator-owned signal (`active` / `inactive` / `missing`) and intentionally\n * omits low-level diagnostics. Curator may still re-probe stale credentials during verify, so callers\n * should continue to handle a 410 from `verifySellerPayment`.\n *\n * The curator status endpoint is public and keyed by platform plus hashed payee details.\n *\n * Fetch seller credential status for a maker identity from curator.\n */\n async getSellerCredentialStatus(\n params: GetSellerCredentialStatusParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerCredentialStatusResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n\n return apiGetSellerCredentialStatus(\n params.processorName,\n params.payeeDetails,\n baseApiUrl,\n timeoutMs,\n );\n }\n\n /**\n * Internal-use endpoint. The curator route requires an internal `x-api-key`; non-internal\n * API keys will be rejected. Returns 410 GONE when curator has marked the credential inactive\n * or a stale credential fails its synchronous re-probe.\n *\n * Verify a seller payment via curator's seller-credential proxy.\n */\n async verifySellerPayment(\n params: VerifySellerPaymentParams,\n opts?: { baseApiUrl?: string; timeoutMs?: number },\n ): Promise<CuratorSellerVerifyResponse> {\n const baseApiUrl = this.stripTrailingSlash(\n opts?.baseApiUrl ?? this.baseApiUrl ?? DEFAULT_BASE_API_URL,\n );\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n\n return apiVerifySellerPayment(\n params.platform,\n {\n txId: params.txId,\n chainId: params.chainId,\n intent: params.intent,\n ...(params.metadata !== undefined ? { metadata: params.metadata } : {}),\n },\n baseApiUrl,\n timeoutMs,\n this.apiKey,\n );\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 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 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 orchestratorV3?: Address;\n orchestratorAddresses: Address[];\n protocolViewer?: Address;\n protocolViewerEntries: Address[];\n unifiedPaymentVerifier?: Address;\n rateManagerV1?: Address;\n orchestratorRegistry?: Address;\n stakeVault?: Address;\n disputeProtectionPolicy?: 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 orchestratorV3: this.orchestratorV3Address,\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 stakeVault: this.stakeVaultAddress,\n disputeProtectionPolicy: this.disputeProtectionPolicyAddress,\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(\n intentHash: `0x${string}`,\n options?: { orchestratorAddress?: `0x${string}` },\n ): 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 return this._intentOps.getFulfillIntentInputs(intentHash, options);\n }\n}\n","import type { SellerCredentialBundle } from './types';\n\nexport type PeerConnectionStatus = 'connected' | 'disconnected' | 'pending';\n\nexport type PeerMetadataCaptureMode = 'buyerTee' | 'sellerCredential';\n\nexport type PeerAuthenticateParams = {\n actionType: string;\n attestationActionType?: string | null;\n attestationPlatform?: string | null;\n attestationServiceUrl?: string | null;\n callerAddress?: string | null;\n captureMode?: PeerMetadataCaptureMode;\n platform: string;\n};\n\nexport type PeerBuyerTeePaymentParams = Record<string, string | number | boolean>;\n\nexport type PeerBuyerTeePaymentCapture = {\n encryptedSessionMaterial: string;\n params?: PeerBuyerTeePaymentParams[];\n};\n\nexport type PeerSarCredentialCapture = {\n credentialBundle: SellerCredentialBundle;\n offchainId: string;\n};\n\nexport type PeerMetadataRow = {\n amount?: string;\n currency?: string;\n date?: string;\n hidden: boolean;\n originalIndex: number;\n params?: PeerBuyerTeePaymentParams;\n paymentId?: string;\n recipient?: string;\n [key: string]: unknown;\n};\n\nexport type PeerMetadataMessage = {\n buyerTeeCapture?: PeerBuyerTeePaymentCapture | null;\n errorMessage?: string;\n expiresAt: number;\n metadata: PeerMetadataRow[];\n platform: string;\n requestId: string;\n sarCredentialCapture?: PeerSarCredentialCapture | null;\n};\n\nexport type PeerMetadataMessageCallback = (message: PeerMetadataMessage) => void;\n\nexport type PeerExtensionApi = {\n requestConnection(): Promise<boolean>;\n checkConnectionStatus(): Promise<PeerConnectionStatus>;\n getVersion(): Promise<string>;\n authenticate(params: PeerAuthenticateParams): void;\n onMetadataMessage(callback: PeerMetadataMessageCallback): () => void;\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 getVersion(): Promise<string>;\n authenticate(params: PeerAuthenticateParams): void;\n onMetadataMessage(callback: PeerMetadataMessageCallback): () => void;\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\ntype LegacyPeerAuthenticateParams = PeerAuthenticateParams & {\n providerConfig?: unknown;\n};\n\nconst sanitizePeerAuthenticateParams = (params: PeerAuthenticateParams): PeerAuthenticateParams => {\n const sanitizedParams: LegacyPeerAuthenticateParams = { ...params };\n delete sanitizedParams.providerConfig;\n\n return sanitizedParams;\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 getVersion: () => requirePeer(options).getVersion(),\n authenticate: (params: PeerAuthenticateParams) =>\n requirePeer(options).authenticate(sanitizePeerAuthenticateParams(params)),\n onMetadataMessage: (callback: PeerMetadataMessageCallback) =>\n requirePeer(options).onMetadataMessage(callback),\n openInstallPage: () => openPeerExtensionInstallPage(options),\n getState: () => getPeerExtensionState(options),\n});\n\nexport const peerExtensionSdk = createPeerExtensionSdk();\n","/**\n * Exact client-side counterparts of the DisputeProtectionPolicy admission rules.\n *\n * Kept inside the public SDK so its generated declarations and runtime remain\n * self-contained for external consumers. The deployed policy (contracts-v2\n * 0.4.1) is full-gross: an intent on a payment method with a non-zero risk\n * window locks the full intent amount 1:1 from the effective stake owner's\n * free stake, so stake-backed capacity IS that free stake. A method with a\n * zero (or absent) risk window admits unbonded and never touches stake.\n *\n * Intent-lifetime extension pricing is not risk math: it belongs to the\n * standalone IntentGuardian and is quoted via the guardian operations.\n */\n\nexport type IntegerLike = bigint | number | string | { toString(): string };\n\nexport type RiskMode = 'UNBONDED' | 'STAKE_BACKED';\n\nexport const RISK_BPS_DENOMINATOR = 10_000n;\n\nfunction integer(value: IntegerLike, label: string): bigint {\n if (typeof value === 'number' && (!Number.isSafeInteger(value) || value < 0)) {\n throw new RangeError(`${label} must be a non-negative safe integer`);\n }\n const parsed = BigInt(value.toString());\n if (parsed < 0n) throw new RangeError(`${label} must be non-negative`);\n return parsed;\n}\n\n/** Full-gross coverage required at admission; zero when the method is unbonded. */\nexport function calculateRequiredCoverage(amount: IntegerLike, disputeProtected: boolean): bigint {\n return disputeProtected ? integer(amount, 'amount') : 0n;\n}\n\n/** Maximum dispute-protected intent amount that can use existing stake. */\nexport function calculateStakeBackedCapacity(freeStake: IntegerLike): bigint {\n return integer(freeStake, 'freeStake');\n}\n\n/**\n * Exact admission mode under the DisputeProtectionPolicy. `disputeProtected` means the\n * payment method carries a non-zero risk window; the policy additionally\n * requires the deposit to have dispute protection enabled and admissions unpaused,\n * both of which reject the intent outright rather than changing its mode.\n */\nexport function selectRiskMode(\n amount: IntegerLike,\n freeStake: IntegerLike,\n disputeProtected: boolean,\n): RiskMode {\n const required = calculateRequiredCoverage(amount, disputeProtected);\n if (!disputeProtected) return 'UNBONDED';\n if (integer(freeStake, 'freeStake') >= required) return 'STAKE_BACKED';\n throw new RangeError('insufficient free stake for dispute-protected admission');\n}\n"]}