@zkp2p/sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/indexer/client.ts","../src/indexer/queries.ts","../src/indexer/converters.ts","../src/indexer/service.ts","../src/indexer/intentVerification.ts","../src/adapters/verification.ts","../src/errors/utils.ts","../src/adapters/attestation.ts","../src/utils/encode.ts","../src/adapters/api.ts","../src/utils/erc20.ts","../src/utils/attribution.ts","../src/client/Zkp2pClient.ts","../src/utils/logger.ts"],"names":["base","headers","mapConversionRatesToOnchainMinRate","resolvePaymentMethodNameFromHash","parseDepositView","raw","parseIntentView","payee"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Minimal fetch-based GraphQL client for the ZKP2P indexer.\n * No external GraphQL dependencies; works in Node and browser.\n */\n\nexport type GraphQLRequest = {\n query: string;\n variables?: Record<string, unknown>;\n};\n\nexport type GraphQLErrorShape = { message: string; extensions?: Record<string, unknown> };\n\nexport type GraphQLResponse<T = any> = {\n data?: T;\n errors?: GraphQLErrorShape[];\n};\n\nexport class IndexerClient {\n constructor(private endpoint: string) {}\n\n private async _post<T>(request: GraphQLRequest, init?: RequestInit): Promise<T> {\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n cache: 'no-store',\n ...init,\n });\n if (!res.ok) throw new Error(`Indexer request failed: ${res.status} ${res.statusText}`);\n const json: GraphQLResponse<T> = await res.json();\n if (json.errors?.length) {\n const msg = json.errors.map(e => e.message).join(', ');\n throw new Error(`GraphQL errors: ${msg}`);\n }\n if (!json.data) throw new Error('No data returned from indexer');\n return json.data;\n }\n\n async query<T = any>(request: GraphQLRequest, init?: RequestInit & { retries?: number }): Promise<T> {\n const retries = init?.retries ?? 1;\n let lastErr: unknown;\n for (let i = 0; i <= retries; i++) {\n try {\n return await this._post<T>(request, init);\n } catch (e) {\n lastErr = e;\n if (i === retries) break;\n await new Promise(r => setTimeout(r, 200 * (i + 1)));\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n}\n\nexport type DeploymentEnv = 'PRODUCTION' | 'PREPRODUCTION' | 'STAGING' | 'DEV' | 'LOCAL' | 'STAGING_TESTNET';\n\nexport function defaultIndexerEndpoint(env: DeploymentEnv = 'PRODUCTION'): string {\n switch (env) {\n case 'PRODUCTION':\n return 'https://indexer.hyperindex.xyz/8fd74dc/v1/graphql';\n case 'PREPRODUCTION':\n return 'https://indexer.hyperindex.xyz/186c193/v1/graphql';\n case 'STAGING':\n return 'https://indexer.dev.hyperindex.xyz/3b6e163/v1/graphql';\n case 'DEV':\n case 'LOCAL':\n case 'STAGING_TESTNET':\n // Not used by consumers; map to staging endpoint by default\n return 'https://indexer.dev.hyperindex.xyz/3b6e163/v1/graphql';\n default:\n return 'https://indexer.hyperindex.xyz/8fd74dc/v1/graphql';\n }\n}\n","/**\n * GraphQL queries for Hasura-backed ZKP2P indexer\n */\n\nconst DEPOSIT_FIELDS = `\n id\n chainId\n escrowAddress\n depositId\n depositor\n token\n remainingDeposits\n intentAmountMin\n intentAmountMax\n acceptingIntents\n status\n outstandingIntentAmount\n totalAmountTaken\n totalWithdrawn\n successRateBps\n totalIntents\n signaledIntents\n fulfilledIntents\n prunedIntents\n blockNumber\n timestamp\n txHash\n updatedAt\n`;\n\nexport const DEPOSITS_QUERY = /* GraphQL */ `\n query GetDeposits(\n $where: Deposit_bool_exp\n $order_by: [Deposit_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Deposit(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n ${DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const DEPOSITS_BY_IDS_QUERY = /* GraphQL */ `\n query GetDepositsByIds($ids: [String!]) {\n Deposit(where: { id: { _in: $ids } }) {\n ${DEPOSIT_FIELDS}\n }\n }\n`;\n\nexport const DEPOSIT_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositRelations($depositIds: [String!]) {\n DepositPaymentMethod(where: { depositId: { _in: $depositIds } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _in: $depositIds } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n }\n }\n`;\n\nexport const PAYMENT_METHODS_BY_PAYEE_HASH_QUERY = /* GraphQL */ `\n query GetPaymentMethodsByPayeeHash(\n $where: DepositPaymentMethod_bool_exp!\n $limit: Int\n ) {\n DepositPaymentMethod(where: $where, limit: $limit) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n }\n`;\n\nexport const DEPOSIT_WITH_RELATIONS_QUERY = /* GraphQL */ `\n query GetDepositWithRelations($id: String!) {\n Deposit_by_pk(id: $id) {\n ${DEPOSIT_FIELDS}\n }\n DepositPaymentMethod(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n verifierAddress\n intentGatingService\n payeeDetailsHash\n active\n }\n MethodCurrency(where: { depositId: { _eq: $id } }) {\n id\n chainId\n depositIdOnContract\n depositId\n paymentMethodHash\n currencyCode\n minConversionRate\n }\n }\n`;\n\nexport const INTENTS_QUERY = /* GraphQL */ `\n query GetIntents(\n $where: Intent_bool_exp\n $order_by: [Intent_order_by!]\n $limit: Int\n $offset: Int\n ) {\n Intent(where: $where, order_by: $order_by, limit: $limit, offset: $offset) {\n id\n intentHash\n depositId\n orchestratorAddress\n verifier\n owner\n toAddress\n amount\n fiatCurrency\n conversionRate\n status\n isExpired\n signalTimestamp\n expiryTime\n fulfillTimestamp\n pruneTimestamp\n updatedAt\n signalTxHash\n fulfillTxHash\n pruneTxHash\n paymentMethodHash\n paymentAmount\n paymentCurrency\n paymentTimestamp\n paymentId\n releasedAmount\n takerAmountNetFees\n }\n }\n`;\n\nexport const EXPIRED_INTENTS_QUERY = /* GraphQL */ `\n query GetExpiredIntents(\n $now: numeric!\n $limit: Int\n $depositIds: [String!]\n ) {\n Intent(\n where: {\n status: { _eq: \"SIGNALED\" }\n expiryTime: { _lt: $now }\n depositId: { _in: $depositIds }\n }\n order_by: { expiryTime: asc }\n limit: $limit\n ) {\n id\n intentHash\n depositId\n owner\n toAddress\n amount\n expiryTime\n isExpired\n updatedAt\n paymentMethodHash\n }\n }\n`;\n\nexport const INTENT_FULFILLMENTS_QUERY = /* GraphQL */ `\n query GetFulfilledIntents($intentHashes: [String!]) {\n Orchestrator_V21_IntentFulfilled(\n where: { intentHash: { _in: $intentHashes } }\n ) {\n intentHash\n isManualRelease\n fundsTransferredTo\n }\n }\n`;\n\nexport const FULFILLMENT_AND_PAYMENT_QUERY = /* GraphQL */ `\n query PaymentVerificationForFulfilledIntent($intentHash: String!) {\n Orchestrator_V21_IntentFulfilled(\n where: { intentHash: { _eq: $intentHash } }\n ) {\n id\n intentHash\n amount\n isManualRelease\n fundsTransferredTo\n }\n UnifiedVerifier_V21_PaymentVerified(\n where: { intentHash: { _eq: $intentHash } }\n ) {\n id\n intentHash\n method\n currency\n amount\n timestamp\n paymentId\n payeeId\n }\n }\n`;\n","import type { DepositWithRelations, IntentEntity } from './types';\nimport type { EscrowDepositView, EscrowIntentView } from '../types';\n\nconst ZERO = '0x0000000000000000000000000000000000000000';\n\nfunction toBigInt(value: string | number | bigint | null | undefined): bigint {\n if (value === null || value === undefined) return 0n;\n try { return typeof value === 'bigint' ? value : BigInt(value); } catch { return 0n; }\n}\n\nfunction normalizeAddress(value?: string | null): string {\n if (!value) return ZERO;\n return value.startsWith('0x') ? value : ZERO;\n}\n\nexport function extractDepositId(compositeId: string): string {\n const parts = compositeId.split('_');\n return parts[1] || '0';\n}\n\nexport function createCompositeDepositId(escrowAddress: string, depositId: string | bigint): string {\n return `${escrowAddress.toLowerCase()}_${depositId.toString()}`;\n}\n\nexport function convertIndexerDepositToEscrowView(deposit: DepositWithRelations, _chainId: number, _escrowAddress: string): EscrowDepositView {\n const paymentMethods = (deposit.paymentMethods ?? []).filter(pm => (pm as any).active !== false);\n const currencies = deposit.currencies ?? [];\n\n const currenciesByPaymentMethod = new Map<string, typeof currencies>();\n for (const c of currencies) {\n const bucket = currenciesByPaymentMethod.get(c.paymentMethodHash) ?? [];\n bucket.push(c);\n currenciesByPaymentMethod.set(c.paymentMethodHash, bucket);\n }\n\n const verifiers = paymentMethods.map(pm => ({\n verifier: normalizeAddress(pm.verifierAddress),\n verificationData: {\n intentGatingService: normalizeAddress(pm.intentGatingService),\n payeeDetails: pm.payeeDetailsHash ?? '',\n data: '' as `0x${string}`,\n },\n currencies: (currenciesByPaymentMethod.get(pm.paymentMethodHash) ?? []).map(cur => ({\n code: cur.currencyCode as `0x${string}`,\n conversionRate: toBigInt(cur.minConversionRate),\n })),\n methodHash: pm.paymentMethodHash as `0x${string}`,\n }));\n\n const uniqueIntentHashes = new Set((deposit.intents ?? []).map(i => i.intentHash));\n const remaining = toBigInt(deposit.remainingDeposits);\n const outstanding = toBigInt(deposit.outstandingIntentAmount);\n\n const depositAmount = remaining + outstanding + toBigInt(deposit.totalAmountTaken ?? 0) + toBigInt(deposit.totalWithdrawn ?? 0);\n\n return {\n depositId: toBigInt(deposit.depositId),\n deposit: {\n depositor: normalizeAddress(deposit.depositor),\n token: normalizeAddress(deposit.token),\n depositAmount,\n intentAmountRange: { min: toBigInt(deposit.intentAmountMin), max: toBigInt(deposit.intentAmountMax) },\n acceptingIntents: Boolean(deposit.acceptingIntents),\n remainingDepositAmount: remaining,\n outstandingIntentAmount: outstanding,\n intentHashes: Array.from(uniqueIntentHashes),\n },\n verifiers,\n };\n}\n\nexport function convertDepositsForLiquidity(deposits: DepositWithRelations[], chainId: number, escrowAddress: string): EscrowDepositView[] {\n return deposits\n .filter(d => d.depositor && d.depositor.toLowerCase() !== ZERO && d.acceptingIntents && toBigInt(d.remainingDeposits) > 0n && d.status === 'ACTIVE')\n .map(d => convertIndexerDepositToEscrowView(d, chainId, escrowAddress));\n}\n\nexport function convertIndexerIntentsToEscrowViews(intents: IntentEntity[], depositViewsById: Map<string, EscrowDepositView>): EscrowIntentView[] {\n const result: EscrowIntentView[] = [];\n for (const intent of intents) {\n const depositView = depositViewsById.get(intent.depositId.toLowerCase());\n if (!depositView) continue;\n const rawDepositId = extractDepositId(intent.depositId);\n result.push({\n intentHash: intent.intentHash as `0x${string}`,\n intent: {\n owner: normalizeAddress(intent.owner),\n to: normalizeAddress(intent.toAddress),\n depositId: toBigInt(rawDepositId),\n amount: toBigInt(intent.amount),\n timestamp: toBigInt(intent.signalTimestamp),\n paymentVerifier: normalizeAddress(intent.verifier),\n fiatCurrency: intent.fiatCurrency,\n conversionRate: toBigInt(intent.conversionRate),\n },\n deposit: depositView,\n });\n }\n return result;\n}\n","import { IndexerClient } from './client';\nimport {\n DEPOSITS_QUERY,\n DEPOSITS_BY_IDS_QUERY,\n DEPOSIT_RELATIONS_QUERY,\n DEPOSIT_WITH_RELATIONS_QUERY,\n INTENTS_QUERY,\n EXPIRED_INTENTS_QUERY,\n INTENT_FULFILLMENTS_QUERY,\n PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n} from './queries';\nimport type {\n DepositEntity,\n DepositPaymentMethodEntity,\n MethodCurrencyEntity,\n IntentEntity,\n IntentStatus,\n DepositWithRelations,\n IntentFulfilledEntity,\n} from './types';\nimport { createCompositeDepositId } from './converters';\n\nexport type DepositOrderField =\n | 'remainingDeposits'\n | 'outstandingIntentAmount'\n | 'totalAmountTaken'\n | 'totalWithdrawn'\n | 'updatedAt'\n | 'timestamp';\nexport type OrderDirection = 'asc' | 'desc';\n\nexport type DepositFilter = Partial<{\n status: 'ACTIVE' | 'CLOSED';\n depositor: string;\n chainId: number;\n escrowAddress: string;\n escrowAddresses: string[];\n minLiquidity: string;\n acceptingIntents: boolean;\n}>;\n\nexport type PaginationOptions = Partial<{\n limit: number;\n offset: number;\n orderBy: DepositOrderField;\n orderDirection: OrderDirection;\n}>;\n\nfunction groupByDepositId<T extends { depositId: string | null | undefined }>(items: T[]): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n if (!item.depositId) continue;\n const key = item.depositId.toLowerCase();\n const bucket = map.get(key);\n if (bucket) bucket.push(item); else map.set(key, [item]);\n }\n return map;\n}\n\nconst DEFAULT_LIMIT = 100;\nconst DEFAULT_ORDER_FIELD: NonNullable<PaginationOptions['orderBy']> = 'remainingDeposits';\n\nexport class IndexerDepositService {\n constructor(private client: IndexerClient) {}\n\n private buildDepositWhere(filter?: DepositFilter): Record<string, unknown> | undefined {\n if (!filter) return undefined;\n const where: Record<string, unknown> = {};\n if (filter.status) where.status = { _eq: filter.status };\n if (filter.depositor) where.depositor = { _ilike: filter.depositor };\n if (filter.chainId) where.chainId = { _eq: filter.chainId };\n if (filter.escrowAddresses && filter.escrowAddresses.length) {\n where.escrowAddress = { _in: filter.escrowAddresses };\n } else if (filter.escrowAddress) {\n where.escrowAddress = { _ilike: filter.escrowAddress };\n }\n if (filter.acceptingIntents !== undefined) where.acceptingIntents = { _eq: filter.acceptingIntents };\n // Filter by remainingDeposits; this is schema-stable across deployments.\n if (filter.minLiquidity) where.remainingDeposits = { _gte: filter.minLiquidity };\n return Object.keys(where).length ? where : undefined;\n }\n\n private buildOrderBy(pagination?: PaginationOptions): Array<Record<string, 'asc' | 'desc'>> {\n const field: NonNullable<PaginationOptions['orderBy']> = pagination?.orderBy ?? DEFAULT_ORDER_FIELD;\n const direction = pagination?.orderDirection === 'asc' ? 'asc' : 'desc';\n return [{ [field]: direction } as any];\n }\n\n private async fetchRelations(depositIds: string[]) {\n if (!depositIds.length) {\n return {\n paymentMethodsByDeposit: new Map<string, DepositPaymentMethodEntity[]>(),\n currenciesByDeposit: new Map<string, MethodCurrencyEntity[]>(),\n };\n }\n\n const result = await this.client.query<{\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({ query: DEPOSIT_RELATIONS_QUERY, variables: { depositIds } });\n\n const paymentMethodsByDeposit = groupByDepositId(result.DepositPaymentMethod ?? []);\n const currenciesByDeposit = groupByDepositId(result.MethodCurrency ?? []);\n return { paymentMethodsByDeposit, currenciesByDeposit };\n }\n\n private async fetchIntents(params: { depositIds?: string[]; owner?: string; statuses?: IntentStatus[]; limit?: number; offset?: number }): Promise<IntentEntity[]> {\n const where: Record<string, unknown> = {};\n if (params.depositIds?.length) where.depositId = { _in: params.depositIds };\n if (params.owner) where.owner = { _ilike: params.owner };\n if (params.statuses?.length) where.status = { _in: params.statuses };\n if (!Object.keys(where).length) return [];\n\n const result = await this.client.query<{ Intent?: IntentEntity[] }>({\n query: INTENTS_QUERY,\n variables: { where, order_by: [{ signalTimestamp: 'desc' }], limit: params.limit, offset: params.offset },\n });\n return result.Intent ?? [];\n }\n\n private async attachRelations(\n deposits: DepositEntity[],\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n if (!deposits.length) return [];\n const depositIds = deposits.map(d => d.id);\n const [{ paymentMethodsByDeposit, currenciesByDeposit }, intents] = await Promise.all([\n this.fetchRelations(depositIds),\n options.includeIntents ? this.fetchIntents({ depositIds, statuses: options.intentStatuses }) : Promise.resolve([]),\n ]);\n const intentsByDeposit = options.includeIntents ? groupByDepositId(intents) : new Map<string, IntentEntity[]>();\n return deposits.map(d => {\n const key = d.id.toLowerCase();\n return {\n ...d,\n paymentMethods: paymentMethodsByDeposit.get(key) ?? [],\n currencies: currenciesByDeposit.get(key) ?? [],\n intents: options.includeIntents ? intentsByDeposit.get(key) ?? [] : undefined,\n };\n });\n }\n\n async fetchDeposits(filter?: DepositFilter, pagination?: PaginationOptions): Promise<DepositEntity[]> {\n const result = await this.client.query<{ Deposit?: DepositEntity[] }>({\n query: DEPOSITS_QUERY,\n variables: {\n where: this.buildDepositWhere(filter),\n order_by: this.buildOrderBy(pagination),\n limit: pagination?.limit ?? DEFAULT_LIMIT,\n offset: pagination?.offset ?? 0,\n },\n });\n return result.Deposit ?? [];\n }\n\n async fetchDepositsWithRelations(\n filter?: DepositFilter,\n pagination?: PaginationOptions,\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n const deposits = await this.fetchDeposits(filter, pagination);\n return this.attachRelations(deposits, options);\n }\n\n async fetchDepositsByIds(ids: string[]): Promise<DepositEntity[]> {\n if (!ids.length) return [];\n const result = await this.client.query<{ Deposit?: DepositEntity[] }>({ query: DEPOSITS_BY_IDS_QUERY, variables: { ids } });\n return result.Deposit ?? [];\n }\n\n async fetchDepositsByIdsWithRelations(\n ids: string[],\n options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}\n ): Promise<DepositWithRelations[]> {\n const deposits = await this.fetchDepositsByIds(ids);\n return this.attachRelations(deposits, options);\n }\n\n async fetchIntentsForDeposits(depositIds: string[], statuses?: IntentStatus[]): Promise<IntentEntity[]> {\n if (!depositIds.length) return [];\n return this.fetchIntents({ depositIds, statuses });\n }\n\n async fetchIntentsByOwner(owner: string, statuses?: IntentStatus[]): Promise<IntentEntity[]> {\n if (!owner) return [];\n return this.fetchIntents({ owner, statuses });\n }\n\n async fetchDepositWithRelations(id: string, options: { includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations | null> {\n const result = await this.client.query<{\n Deposit_by_pk?: DepositEntity | null;\n DepositPaymentMethod?: DepositPaymentMethodEntity[];\n MethodCurrency?: MethodCurrencyEntity[];\n }>({ query: DEPOSIT_WITH_RELATIONS_QUERY, variables: { id } });\n\n const deposit = result.Deposit_by_pk;\n if (!deposit) return null;\n const base: DepositWithRelations = { ...deposit, paymentMethods: result.DepositPaymentMethod ?? [], currencies: result.MethodCurrency ?? [] };\n if (!options.includeIntents) return base;\n const intents = await this.fetchIntents({ depositIds: [deposit.id], statuses: options.intentStatuses });\n return { ...base, intents };\n }\n\n async fetchExpiredIntents(params: { now: bigint | string; depositIds: string[]; limit?: number }): Promise<IntentEntity[]> {\n const depositIds = params.depositIds.map(id => id.toLowerCase());\n if (!depositIds.length) return [];\n\n const result = await this.client.query<{ Intent?: IntentEntity[] }>({\n query: EXPIRED_INTENTS_QUERY,\n variables: {\n now: typeof params.now === 'bigint' ? params.now.toString() : params.now,\n limit: params.limit ?? 1000,\n depositIds,\n },\n });\n\n return result.Intent ?? [];\n }\n\n async fetchFulfilledIntentEvents(intentHashes: string[]): Promise<IntentFulfilledEntity[]> {\n if (!intentHashes.length) return [];\n\n const uniqueHashes = Array.from(new Set(intentHashes)).filter(Boolean);\n if (!uniqueHashes.length) return [];\n\n const result = await this.client.query<{ Orchestrator_V21_IntentFulfilled?: IntentFulfilledEntity[] }>({\n query: INTENT_FULFILLMENTS_QUERY,\n variables: { intentHashes: uniqueHashes },\n });\n\n return result.Orchestrator_V21_IntentFulfilled ?? [];\n }\n\n async resolvePayeeHash(params: { escrowAddress?: string | null; depositId?: string | number | bigint | null; paymentMethodHash?: string | null }): Promise<string | null> {\n try {\n const { escrowAddress, depositId, paymentMethodHash } = params;\n if (!escrowAddress || depositId === null || depositId === undefined || !paymentMethodHash) return null;\n const compositeId = createCompositeDepositId(\n escrowAddress,\n typeof depositId === 'bigint' ? depositId : depositId?.toString() ?? ''\n );\n const detail = await this.fetchDepositWithRelations(compositeId, { includeIntents: false });\n if (!detail?.paymentMethods?.length) return null;\n const target = paymentMethodHash.toLowerCase();\n const match = detail.paymentMethods.find(pm => (pm.paymentMethodHash ?? '').toLowerCase() === target);\n return match?.payeeDetailsHash ?? null;\n } catch {\n return null;\n }\n }\n\n async fetchDepositsByPayeeHash(payeeHash: string, options: { paymentMethodHash?: string; limit?: number; includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations[]> {\n if (!payeeHash) return [];\n const normalizedHash = payeeHash.toLowerCase();\n\n const where: Record<string, unknown> = {\n payeeDetailsHash: { _ilike: normalizedHash },\n };\n if (options.paymentMethodHash) {\n where.paymentMethodHash = { _eq: options.paymentMethodHash.toLowerCase?.() ?? options.paymentMethodHash };\n }\n\n const result = await this.client.query<{ DepositPaymentMethod?: DepositPaymentMethodEntity[] }>({\n query: PAYMENT_METHODS_BY_PAYEE_HASH_QUERY,\n variables: { where, limit: options.limit },\n });\n\n const seen = new Set<string>();\n const depositIds: string[] = [];\n for (const pm of result.DepositPaymentMethod ?? []) {\n const id = pm.depositId;\n if (!id) continue;\n const key = id.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n depositIds.push(id);\n }\n\n if (!depositIds.length) return [];\n return this.fetchDepositsByIdsWithRelations(depositIds, {\n includeIntents: options.includeIntents,\n intentStatuses: options.intentStatuses,\n });\n }\n}\n","import { IndexerClient } from './client';\nimport { FULFILLMENT_AND_PAYMENT_QUERY } from './queries';\n\nexport type FulfillmentRecord = {\n id: string;\n intentHash: string;\n amount: string;\n isManualRelease: boolean;\n fundsTransferredTo: string | null;\n};\n\nexport type PaymentVerifiedRecord = {\n id: string;\n intentHash: string;\n method: string;\n currency: string;\n amount: string;\n timestamp: string;\n paymentId: string | null;\n payeeId: string | null;\n};\n\nexport type FulfillmentAndPaymentResponse = {\n Orchestrator_V21_IntentFulfilled: FulfillmentRecord[];\n UnifiedVerifier_V21_PaymentVerified: PaymentVerifiedRecord[];\n};\n\nexport async function fetchFulfillmentAndPayment(\n client: IndexerClient,\n intentHash: string\n): Promise<FulfillmentAndPaymentResponse> {\n return client.query<FulfillmentAndPaymentResponse>({\n query: FULFILLMENT_AND_PAYMENT_QUERY,\n variables: { intentHash },\n });\n}\n","import type { Address } from 'viem';\n\nexport type SignIntentV2Request = {\n processorName: string;\n payeeDetails: string;\n depositId: string; // decimal string\n amount: string; // decimal string\n toAddress: Address;\n paymentMethod: `0x${string}`; // bytes32\n fiatCurrency: `0x${string}`; // bytes32\n conversionRate: string; // decimal string\n chainId: string; // decimal string\n orchestratorAddress: Address;\n escrowAddress: Address;\n};\n\nexport type SignIntentV2Response = {\n success: boolean;\n message: string;\n responseObject: {\n depositData?: Record<string, unknown>;\n signedIntent: `0x${string}`; // signature bytes\n intentData?: { signatureExpiration?: string };\n signatureExpiration?: string;\n };\n statusCode: number;\n};\n\nexport async function apiSignIntentV2(\n request: SignIntentV2Request,\n opts: { baseApiUrl: string; apiKey?: string; authorizationToken?: string; timeoutMs?: number }\n): Promise<{ signature: `0x${string}`; signatureExpiration: bigint }> {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (opts.apiKey) headers['x-api-key'] = opts.apiKey;\n if (opts.authorizationToken) headers['authorization'] = `Bearer ${opts.authorizationToken}`;\n\n const res = await fetch(`${opts.baseApiUrl.replace(/\\/$/, '')}/v2/verify/intent`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`verify/intent failed: ${res.status} ${res.statusText} ${text}`);\n }\n const json = (await res.json()) as SignIntentV2Response;\n const sig = json?.responseObject?.signedIntent as `0x${string}` | undefined;\n const expStr = json?.responseObject?.intentData?.signatureExpiration ?? json?.responseObject?.signatureExpiration;\n if (!sig || !expStr) throw new Error('verify/intent missing signature or expiration');\n return { signature: sig, signatureExpiration: BigInt(expStr) };\n } finally {\n clearTimeout(id);\n }\n}\n\n","import { APIError, NetworkError } from './index';\n\nexport function parseAPIError(response: Response, responseText?: string): APIError {\n let message = `Request failed: ${response.statusText}`;\n try {\n const parsed = responseText ? JSON.parse(responseText) : undefined;\n if (parsed && (parsed.error || parsed.message)) {\n message = parsed.error || parsed.message;\n }\n } catch {\n if (responseText && responseText.length < 200) message = responseText;\n }\n if (response.status === 429) {\n message = 'Too many requests. Please try again later.';\n }\n return new APIError(message, response.status, { url: response.url });\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n delayMs = 1000,\n timeoutMs?: number\n): Promise<T> {\n let lastErr: unknown;\n for (let i = 0; i < maxRetries; i++) {\n try {\n // Apply timeout if specified\n if (timeoutMs) {\n const { withTimeout } = await import('../utils/timeout');\n return await withTimeout(fn(), timeoutMs, `Operation timed out after ${timeoutMs}ms`);\n }\n return await fn();\n } catch (err) {\n lastErr = err;\n const isNetwork = err instanceof NetworkError;\n const isRateLimit = err instanceof APIError && err.status === 429;\n const retryable = isNetwork || isRateLimit;\n if (!retryable || i === maxRetries - 1) throw err;\n const base = isRateLimit ? delayMs * Math.pow(2, i) : delayMs;\n const jitter = Math.floor(Math.random() * Math.min(1000, base));\n await new Promise((r) => setTimeout(r, base + jitter));\n }\n }\n throw lastErr as Error;\n}\n","import { NetworkError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\n\nfunction headers() {\n return { 'Content-Type': 'application/json' } as const;\n}\n\n// Posts a zkTLS proof JSON string to the Attestation Service and returns the attestation response\n// Endpoint shape: /verify/:platform/:actionType\nexport async function apiCreatePaymentAttestation(\n payload: Record<string, unknown>,\n attestationServiceUrl: string,\n platform: string,\n actionType: string\n): Promise<any> {\n return withRetry(async () => {\n let res: Response;\n try {\n const endpoint = `/verify/${encodeURIComponent(platform)}/${encodeURIComponent(actionType)}`;\n res = await fetch(`${attestationServiceUrl}${endpoint}`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(payload),\n });\n } catch (error) {\n throw new NetworkError('Failed to connect to Attestation Service', {\n endpoint: `/verify/${platform}/${actionType}`,\n error,\n });\n }\n\n if (!res.ok) {\n const errorText = await res.text();\n throw parseAPIError(res, errorText);\n }\n\n return res.json();\n });\n}\n\n","import { AbiCoder } from 'ethers';\n\nexport type Address = `0x${string}`;\n\nexport type AttestationTypedDataSpec = {\n primaryType: string;\n types: Record<string, { type: string; name: string }[]>;\n};\n\nexport type AttestationResponse = {\n success: boolean;\n message: string;\n responseObject: {\n platform: string;\n actionType: string;\n signature: string;\n signer: string;\n domainSeparator: string;\n typeHash: string;\n typedDataSpec: AttestationTypedDataSpec;\n typedDataValue: { intentHash: string; releaseAmount: string; dataHash: string };\n proofInput: string;\n encodedPaymentDetails: string;\n metadata: string;\n };\n statusCode: number;\n};\n\nconst abiCoder = AbiCoder.defaultAbiCoder();\n\nexport function encodeVerifyPaymentData(params: {\n intentHash: Address;\n paymentProof: Address;\n data: Address;\n}): Address {\n return abiCoder.encode(\n ['tuple(bytes32,bytes,bytes)'],\n [[params.intentHash, params.paymentProof, params.data]]\n ) as Address;\n}\n\nexport function encodeAddressAsBytes(addr: string): Address {\n return abiCoder.encode(['address'], [addr]) as Address;\n}\n\n// Encodes a PaymentAttestation struct into bytes consumable by UnifiedPaymentVerifier\nexport function encodePaymentAttestation(attestation: AttestationResponse): Address {\n const resp = attestation.responseObject;\n\n const td = resp.typedDataValue;\n const intentHash = td.intentHash as Address;\n const releaseAmount = BigInt(td.releaseAmount);\n const dataHash = td.dataHash as Address;\n const signatures: string[] = [resp.signature];\n const encodedPaymentDetails = resp.encodedPaymentDetails as Address;\n\n if (!intentHash || !releaseAmount || !dataHash || !encodedPaymentDetails) {\n throw new Error('Attestation response missing required fields');\n }\n\n return abiCoder.encode(\n ['tuple(bytes32,uint256,bytes32,bytes[],bytes,bytes)'],\n [[intentHash, releaseAmount, dataHash, signatures, encodedPaymentDetails, '0x']]\n ) as Address;\n}\n\n","import type {\n IntentSignalRequest,\n PostDepositDetailsRequest,\n SignalIntentResponse,\n PostDepositDetailsResponse,\n QuoteRequest,\n QuoteResponse,\n GetPayeeDetailsRequest,\n GetPayeeDetailsResponse,\n ValidatePayeeDetailsRequest,\n ValidatePayeeDetailsResponse,\n GetOwnerDepositsRequest,\n GetOwnerDepositsResponse,\n GetOwnerIntentsRequest,\n GetOwnerIntentsResponse,\n GetIntentsByDepositRequest,\n GetIntentsByDepositResponse,\n GetIntentsByTakerRequest,\n GetIntentsByTakerResponse,\n GetIntentByHashRequest,\n GetIntentByHashResponse,\n GetDepositByIdRequest,\n GetDepositByIdResponse,\n GetDepositsOrderStatsRequest,\n GetDepositsOrderStatsResponse,\n GetTakerTierRequest,\n GetTakerTierResponse,\n GetIntentsByRecipientRequest,\n GetIntentsByRecipientResponse,\n ListPayeesResponse,\n} from '../types';\nimport { NetworkError, ValidationError } from '../errors';\nimport { parseAPIError, withRetry } from '../errors/utils';\n\n/**\n * Creates headers for API requests with optional authentication\n */\nfunction createHeaders(apiKey?: string, authToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['x-api-key'] = apiKey;\n if (authToken) headers['Authorization'] = authToken.startsWith('Bearer ') ? authToken : `Bearer ${authToken}`;\n return headers;\n}\n\n// Normalize base API URL to avoid duplicate version segments (e.g., avoid /v1/v1, /v2/v2)\nfunction withApiBase(baseApiUrl: string): string {\n const trimmed = (baseApiUrl || '').trim();\n // remove trailing slashes\n let base = trimmed.replace(/\\/+$/, '');\n // remove trailing /v1 if a caller accidentally includes it\n base = base.replace(/\\/v1$/i, '');\n // remove trailing /v2 if a caller accidentally includes it\n base = base.replace(/\\/v2$/i, '');\n return base;\n}\n\n/**\n * Base fetch wrapper with common error handling and retry logic\n */\nasync function apiFetch<T>({\n url,\n method = 'GET',\n body,\n apiKey,\n authToken,\n timeoutMs,\n retryCount = 3,\n retryDelayMs = 1000,\n}: {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n body?: any;\n apiKey?: string;\n authToken?: string;\n timeoutMs?: number;\n retryCount?: number;\n retryDelayMs?: number;\n}): Promise<T> {\n const endpoint = url.replace(/^[^/]*\\/\\/[^/]*/, ''); // Extract endpoint for error messages\n\n return withRetry(async () => {\n let res: Response;\n try {\n const options: RequestInit = {\n method,\n headers: createHeaders(apiKey, authToken),\n };\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n res = await fetch(url, options);\n } catch (error) {\n throw new NetworkError('Failed to connect to API server', { endpoint, error });\n }\n\n if (!res.ok) {\n const errorText = await res.text();\n throw parseAPIError(res, errorText);\n }\n\n return res.json();\n }, retryCount, retryDelayMs, timeoutMs);\n}\n\n/**\n * Process API response with optional date transformation\n */\nfunction processApiResponse<T extends Record<string, any>>(\n data: any,\n transformDates: boolean = true\n): T {\n if (!transformDates) return data;\n\n // Apply date transformation to responseObject if it exists\n if (data.responseObject) {\n if (Array.isArray(data.responseObject)) {\n data.responseObject = data.responseObject.map((item: any) => transformDatesToObjects(item));\n } else {\n data.responseObject = transformDatesToObjects(data.responseObject);\n }\n }\n\n return data;\n}\n\n/**\n * Build query string from status parameter\n */\nfunction buildStatusQuery(status?: string | string[]): string {\n if (!status) return '';\n const statusParam = Array.isArray(status) ? status.join(',') : status;\n return `?status=${statusParam}`;\n}\n\nexport async function apiSignalIntent(\n req: IntentSignalRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<SignalIntentResponse> {\n return apiFetch<SignalIntentResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v2/verify/intent`,\n method: 'POST',\n body: req,\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\n/**\n * Get intents by recipient address with optional status filter\n */\nexport async function apiGetIntentsByRecipient(\n req: GetIntentsByRecipientRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByRecipientResponse> {\n const endpoint = `/v1/orders/recipient/${req.recipientAddress}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByRecipientResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Makers list\nexport async function apiListPayees(\n processorName: string | undefined,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<ListPayeesResponse> {\n const endpoint = processorName ? `/v1/makers?processorName=${encodeURIComponent(processorName)}` : '/v1/makers';\n const data = await apiFetch<ListPayeesResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Deposit spreads\nexport async function apiGetDepositSpread(\n depositId: number,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiListDepositSpreads(\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiGetSpreadsByDepositIds(\n depositIds: number[],\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads/bulk`,\n method: 'POST',\n body: { depositIds },\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiCreateSpread(\n body: { depositId: number; spread: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/spreads`,\n method: 'POST',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiUpdateSpread(\n depositId: number,\n body: { spread?: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'PUT',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiUpsertSpread(\n depositId: number,\n body: { spread?: number; minPrice?: number | null; maxPrice?: number | null },\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n const data = await apiFetch<any>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'POST',\n body,\n apiKey,\n authToken,\n timeoutMs,\n });\n return transformDatesToObjects(data);\n}\n\nexport async function apiDeleteSpread(\n depositId: number,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n) {\n return apiFetch({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${depositId}/spread`,\n method: 'DELETE',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\nexport async function apiPostDepositDetails(\n req: PostDepositDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number\n): Promise<PostDepositDetailsResponse> {\n return apiFetch<PostDepositDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/create`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n}\n\nexport async function apiGetQuote(\n req: QuoteRequest,\n baseApiUrl: string,\n timeoutMs?: number,\n apiKey?: string,\n authToken?: string\n): Promise<QuoteResponse> {\n if (req.quotesToReturn !== undefined) {\n if (!Number.isInteger(req.quotesToReturn) || (req.quotesToReturn as number) < 1) {\n throw new ValidationError('quotesToReturn must be a positive integer', 'quotesToReturn');\n }\n }\n const isExactFiat = req.isExactFiat !== false;\n const endpoint = isExactFiat ? 'exact-fiat' : 'exact-token';\n // Use /v2/quote which returns maker.depositData when authenticated\n let url = `${withApiBase(baseApiUrl)}/v2/quote/${endpoint}`;\n if (req.quotesToReturn) url += `?quotesToReturn=${req.quotesToReturn}`;\n\n const requestBody: Record<string, unknown> = {\n ...req,\n [isExactFiat ? 'exactFiatAmount' : 'exactTokenAmount']: req.amount,\n amount: undefined,\n isExactFiat: undefined,\n quotesToReturn: undefined,\n };\n Object.keys(requestBody).forEach((k) => requestBody[k] === undefined && delete requestBody[k]);\n\n return apiFetch<QuoteResponse>({\n url,\n method: 'POST',\n body: requestBody,\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\nexport async function apiGetPayeeDetails(\n req: GetPayeeDetailsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetPayeeDetailsResponse> {\n return apiFetch<GetPayeeDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/${req.processorName}/${req.hashedOnchainId}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\nexport async function apiValidatePayeeDetails(\n req: ValidatePayeeDetailsRequest,\n baseApiUrl: string,\n timeoutMs?: number\n): Promise<ValidatePayeeDetailsResponse> {\n const data = await apiFetch<ValidatePayeeDetailsResponse>({\n url: `${baseApiUrl.replace(/\\/$/, '')}/v1/makers/validate`,\n method: 'POST',\n body: req,\n timeoutMs,\n });\n // Back-compat: some APIs may return boolean in responseObject. Normalize to { isValid }.\n if (typeof data?.responseObject === 'boolean') {\n return {\n ...data,\n responseObject: { isValid: data.responseObject },\n } as ValidatePayeeDetailsResponse;\n }\n return data;\n}\n\n\n// Helper function to transform date strings to Date objects\nfunction transformDatesToObjects<T extends Record<string, any>>(obj: T): T {\n const dateFields = ['createdAt', 'updatedAt', 'signalTimestamp', 'fulfillTimestamp', 'prunedTimestamp'];\n const transformed = { ...obj };\n\n for (const key in transformed) {\n const value = transformed[key];\n\n if (dateFields.includes(key) && typeof value === 'string') {\n transformed[key] = new Date(value) as any;\n } else if (Array.isArray(value)) {\n transformed[key] = value.map((item: any) =>\n typeof item === 'object' && item !== null\n ? transformDatesToObjects(item)\n : item\n ) as any;\n } else if (typeof value === 'object' && value !== null) {\n transformed[key] = transformDatesToObjects(value) as any;\n }\n }\n\n return transformed;\n}\n\nexport async function apiGetOwnerDeposits(\n req: GetOwnerDepositsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetOwnerDepositsResponse> {\n const statusQuery = req.status ? `?status=${encodeURIComponent(req.status)}` : '';\n const data = await apiFetch<GetOwnerDepositsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/maker/${req.ownerAddress}${statusQuery}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\nexport async function apiGetOwnerIntents(\n req: GetOwnerIntentsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetOwnerIntentsResponse> {\n const data = await apiFetch<GetOwnerIntentsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/orders/maker/${req.ownerAddress}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get intents by deposit ID with optional status filter\n */\nexport async function apiGetIntentsByDeposit(\n req: GetIntentsByDepositRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByDepositResponse> {\n const endpoint = `/v1/orders/deposit/${req.depositId}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByDepositResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get intents by taker address with optional status filter\n */\nexport async function apiGetIntentsByTaker(\n req: GetIntentsByTakerRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentsByTakerResponse> {\n const endpoint = `/v1/orders/taker/${req.takerAddress}${buildStatusQuery(req.status)}`;\n const data = await apiFetch<GetIntentsByTakerResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get a single intent by its hash\n */\nexport async function apiGetIntentByHash(\n req: GetIntentByHashRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetIntentByHashResponse> {\n const data = await apiFetch<GetIntentByHashResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/orders/${req.intentHash}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n// Deposits API Functions\n\n/**\n * Get a single deposit by its ID\n */\nexport async function apiGetDepositById(\n req: GetDepositByIdRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetDepositByIdResponse> {\n const data = await apiFetch<GetDepositByIdResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/${req.depositId}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n return processApiResponse(data);\n}\n\n/**\n * Get order statistics for multiple deposits\n */\nexport async function apiGetDepositsOrderStats(\n req: GetDepositsOrderStatsRequest,\n apiKey: string,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetDepositsOrderStatsResponse> {\n return apiFetch<GetDepositsOrderStatsResponse>({\n url: `${withApiBase(baseApiUrl)}/v1/deposits/order-stats`,\n method: 'POST',\n body: { depositIds: req.depositIds },\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n\n/**\n * Get taker tier information for a specific address.\n */\nexport async function apiGetTakerTier(\n req: GetTakerTierRequest,\n apiKey: string | undefined,\n baseApiUrl: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<GetTakerTierResponse> {\n const normalizedOwner = req.owner.toLowerCase();\n const query = new URLSearchParams({\n owner: normalizedOwner,\n chainId: String(req.chainId),\n });\n const endpoint = `/v2/taker/tier?${query.toString()}`;\n\n return apiFetch<GetTakerTierResponse>({\n url: `${withApiBase(baseApiUrl)}${endpoint}`,\n method: 'GET',\n apiKey,\n authToken,\n timeoutMs,\n });\n}\n","export const ERC20_ABI = [\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n ],\n outputs: [{ name: 'amount', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ name: 'success', type: 'bool' }],\n },\n] as const;\n\n","import { Attribution } from 'ox/erc8021';\nimport type { Abi } from 'abitype';\nimport {\n type Hash,\n type Hex,\n type WalletClient,\n concatHex,\n encodeFunctionData,\n} from 'viem';\nimport type { TxOverrides } from '../types';\n\n// =============================================================================\n// BASE BUILDER CODES - ERC-8021 Attribution\n// =============================================================================\n// Builder codes for Base Builder Rewards program.\n// https://docs.base.org/base-chain/quickstart/builder-codes\n// =============================================================================\n\n/**\n * Base Builder Code for ZKP2P app (registered with Base).\n * This is ALWAYS included as the last code in attribution and cannot be overridden.\n */\nexport const BASE_BUILDER_CODE = 'bc_nbn6qkni';\n\n/**\n * ZKP2P iOS app referrer code - pass via txOverrides.referrer\n */\nexport const ZKP2P_IOS_REFERRER = 'zkp2p-ios';\n\n/**\n * ZKP2P Android app referrer code - pass via txOverrides.referrer\n */\nexport const ZKP2P_ANDROID_REFERRER = 'zkp2p-android';\n\n/**\n * Generate the ERC-8021 attribution data suffix for transactions.\n *\n * The Base builder code (bc_nbn6qkni) is ALWAYS appended last and cannot be overridden.\n * Custom referrer codes are prepended before the base builder code.\n *\n * @param referrer - Optional referrer code(s) to prepend before the base builder code.\n * Can be a single string or array of strings.\n * These will appear BEFORE the base builder code in the attribution.\n * @returns Hex-encoded attribution suffix\n */\nexport function getAttributionDataSuffix(referrer?: string | string[]): Hex {\n const codes: string[] = [];\n\n if (referrer) {\n if (Array.isArray(referrer)) {\n codes.push(...referrer);\n } else {\n codes.push(referrer);\n }\n }\n\n // Base builder code is ALWAYS last\n codes.push(BASE_BUILDER_CODE);\n\n return Attribution.toDataSuffix({ codes });\n}\n\n/**\n * Append attribution data suffix to existing calldata\n *\n * @param calldata - Original transaction calldata\n * @param referrer - Optional referrer code(s) to prepend before the base builder code\n * @returns Calldata with attribution suffix appended\n */\nexport function appendAttributionToCalldata(calldata: Hex, referrer?: string | string[]): Hex {\n const suffix = getAttributionDataSuffix(referrer);\n return concatHex([calldata, suffix]);\n}\n\n/**\n * Request parameters for sendTransactionWithAttribution\n */\nexport interface AttributionRequest {\n address: `0x${string}`;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n value?: bigint;\n}\n\ntype OverrideFields = Omit<TxOverrides, 'referrer'>;\n\n/**\n * Send a contract transaction with ERC-8021 attribution.\n *\n * 1. Encodes the function call data using encodeFunctionData\n * 2. Appends the attribution suffix\n * 3. Sends via sendTransaction (wallet estimates gas automatically)\n *\n * @param walletClient - The viem wallet client\n * @param request - The request with abi, functionName, args, address, value\n * @param referrer - Optional referrer code(s) from txOverrides.referrer\n * @param overrides - Optional transaction overrides (gas, nonce, etc.)\n * @returns Transaction hash\n */\nexport async function sendTransactionWithAttribution(\n walletClient: WalletClient,\n request: AttributionRequest,\n referrer?: string | string[],\n overrides?: OverrideFields\n): Promise<Hash> {\n // Encode the function call data\n const functionData = encodeFunctionData({\n abi: request.abi,\n functionName: request.functionName as any,\n args: request.args || [],\n });\n\n // Append attribution suffix\n const dataWithAttribution = appendAttributionToCalldata(functionData, referrer);\n\n const {\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n value,\n accessList,\n authorizationList,\n } = overrides ?? {};\n\n const optionalOverrides = {\n ...(gas !== undefined ? { gas } : {}),\n ...(gasPrice !== undefined ? { gasPrice } : {}),\n ...(maxFeePerGas !== undefined ? { maxFeePerGas } : {}),\n ...(maxPriorityFeePerGas !== undefined ? { maxPriorityFeePerGas } : {}),\n ...(nonce !== undefined ? { nonce } : {}),\n ...(accessList !== undefined ? { accessList } : {}),\n ...(authorizationList !== undefined ? { authorizationList } : {}),\n };\n\n // Send transaction - wallet/RPC handles gas estimation\n return walletClient.sendTransaction({\n to: request.address,\n data: dataWithAttribution,\n value: value ?? request.value,\n account: walletClient.account!,\n chain: walletClient.chain,\n ...optionalOverrides,\n } as any) as Promise<Hash>;\n}\n","import type { Address, Hash, PublicClient, WalletClient } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport { base, baseSepolia, hardhat } from 'viem/chains';\nimport type { Abi } from 'abitype';\n\nimport type { PV_DepositView, PV_IntentView } from '../utils/protocolViewerParsers';\nimport { defaultIndexerEndpoint, IndexerClient } from '../indexer/client';\nimport { IndexerDepositService, type DepositFilter, type PaginationOptions } from '../indexer/service';\nimport type { DepositEntity, DepositWithRelations, IntentEntity, IntentStatus, IntentFulfilledEntity } from '../indexer/types';\nimport { fetchFulfillmentAndPayment, type FulfillmentAndPaymentResponse } from '../indexer/intentVerification';\nimport { getContracts, type RuntimeEnv } from '../contracts';\nimport { apiSignIntentV2 } from '../adapters/verification';\nimport { apiCreatePaymentAttestation } from '../adapters/attestation';\nimport { encodeAddressAsBytes, encodePaymentAttestation, encodeVerifyPaymentData } from '../utils/encode';\nimport { apiGetQuote, apiGetTakerTier, apiPostDepositDetails } from '../adapters/api';\nimport { getGatingServiceAddress, getPaymentMethodsCatalog } from '../contracts';\nimport { resolveFiatCurrencyBytes32, resolvePaymentMethodHashFromCatalog } from '../utils/paymentResolution';\nimport { currencyKeccak256 } from '../utils/keccak';\nimport type { QuoteRequest, QuoteResponse, PostDepositDetailsRequest, GetTakerTierRequest, GetTakerTierResponse } from '../types';\nimport { ERC20_ABI } from '../utils/erc20';\nimport { sendTransactionWithAttribution } from '../utils/attribution';\nimport type { TxOverrides } from '../types';\n\n/**\n * Configuration options for creating a Zkp2pClient instance.\n *\n * @example\n * ```typescript\n * const options: Zkp2pNextOptions = {\n * walletClient,\n * chainId: 8453, // Base mainnet\n * runtimeEnv: 'production',\n * apiKey: 'your-api-key',\n * };\n * ```\n */\nexport type Zkp2pNextOptions = {\n /** viem WalletClient instance with an account for signing transactions */\n walletClient: WalletClient;\n /** Chain ID (8453 for Base mainnet, 84532 for Base Sepolia) */\n chainId: number;\n /** Optional RPC URL override (defaults to wallet's chain RPC, then https://mainnet.base.org for Base or https://sepolia.base.org for Base Sepolia) */\n rpcUrl?: string;\n /** Runtime environment: 'production' or 'staging' (defaults to 'production') */\n runtimeEnv?: RuntimeEnv;\n /** Optional indexer URL override */\n indexerUrl?: string;\n /** Base API URL for ZKP2P services (defaults to https://api.zkp2p.xyz) */\n baseApiUrl?: string;\n /** API key for authenticated endpoints (required for createDeposit, signalIntent) */\n apiKey?: string;\n /** Optional bearer token for hybrid authentication */\n authorizationToken?: string;\n /** Timeout configuration */\n timeouts?: {\n /** API call timeout in milliseconds (default: 15000) */\n api?: number;\n };\n};\n\n/**\n * SDK client for ZKP2P liquidity providers (offramp peers).\n *\n * This SDK is designed for **liquidity providers** who want to:\n * - Create and manage USDC deposits that accept fiat payments\n * - Configure payment methods, currencies, and conversion rates\n * - Monitor deposit utilization and manage liquidity\n *\n * ## Core Functionality (Deposit Management)\n *\n * The primary use case is managing deposits as a liquidity provider:\n *\n * | Method | Description |\n * |--------|-------------|\n * | `createDeposit()` | Create a new USDC deposit |\n * | `addFunds()` / `removeFunds()` | Adjust deposit balance |\n * | `withdrawDeposit()` | Fully withdraw a deposit |\n * | `setAcceptingIntents()` | Enable/disable new intents |\n * | `setIntentRange()` | Set min/max intent amounts |\n * | `setCurrencyMinRate()` | Update conversion rates |\n * | `addPaymentMethods()` | Add payment platforms |\n * | `getDeposits()` | Query your deposits |\n *\n * ## Supporting Functionality\n *\n * These methods support the broader ZKP2P ecosystem but are not the\n * primary focus of this SDK:\n *\n * - **Intent Operations**: `signalIntent()`, `fulfillIntent()`, `cancelIntent()`\n * (typically used by takers/buyers, not liquidity providers)\n * - **Quote API**: `getQuote()` (used by frontends to find available liquidity)\n *\n * @example Creating a Deposit (Primary Use Case)\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { base } from 'viem/chains';\n * import { privateKeyToAccount } from 'viem/accounts';\n * import { Zkp2pClient } from '@zkp2p/client-sdk';\n *\n * const walletClient = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: base,\n * transport: http(),\n * });\n *\n * const client = new OfframpClient({\n * walletClient,\n * chainId: base.id,\n * apiKey: 'your-api-key',\n * });\n *\n * // Create a 1000 USDC deposit accepting Wise payments\n * const { hash } = await client.createDeposit({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', // USDC\n * amount: 1000_000000n,\n * intentAmountRange: { min: 10_000000n, max: 500_000000n },\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * conversionRates: [[\n * { currency: 'USD', conversionRate: '1020000000000000000' },\n * { currency: 'EUR', conversionRate: '1100000000000000000' },\n * ]],\n * });\n *\n * // Monitor your deposits\n * const deposits = await client.getDeposits({ owner: walletClient.account.address });\n * ```\n */\nexport class Zkp2pClient {\n /** The viem WalletClient used for signing transactions */\n readonly walletClient: WalletClient;\n /** The viem PublicClient used for reading contract state */\n readonly publicClient: PublicClient;\n /** The chain ID this client is configured for */\n readonly chainId: number;\n /** Runtime environment ('production' or 'staging') */\n readonly runtimeEnv: RuntimeEnv;\n\n /** Escrow contract address */\n readonly escrowAddress: Address;\n /** Escrow contract ABI */\n readonly escrowAbi: Abi;\n /** Orchestrator contract address (handles intent signaling/fulfillment) */\n readonly orchestratorAddress?: Address;\n /** Orchestrator contract ABI */\n readonly orchestratorAbi?: Abi;\n /** UnifiedPaymentVerifier contract address */\n readonly unifiedPaymentVerifier?: Address;\n /** ProtocolViewer contract address (for batch reads) */\n readonly protocolViewerAddress?: Address;\n /** ProtocolViewer contract ABI */\n readonly protocolViewerAbi?: Abi;\n\n /** Base API URL for ZKP2P services */\n readonly baseApiUrl?: string;\n /** API key for authenticated endpoints */\n readonly apiKey?: string;\n /** Bearer token for hybrid authentication */\n readonly authorizationToken?: string;\n /** API timeout in milliseconds */\n readonly apiTimeoutMs: number;\n private _usdcAddress?: Address;\n\n // Indexer for advanced/historical queries\n private readonly _indexerClient: IndexerClient;\n private readonly _indexerService: IndexerDepositService;\n\n /**\n * Creates a new Zkp2pClient instance.\n *\n * @param opts - Configuration options\n * @throws Error if walletClient is missing an account\n */\n constructor(opts: Zkp2pNextOptions) {\n this.walletClient = opts.walletClient;\n this.chainId = opts.chainId;\n this.runtimeEnv = opts.runtimeEnv ?? 'production';\n const inferredRpc = (this.walletClient as any)?.chain?.rpcUrls?.default?.http?.[0] as string | undefined;\n // Chain-specific default RPC URLs\n const defaultRpcUrls: Record<number, string> = {\n [base.id]: 'https://mainnet.base.org',\n [baseSepolia.id]: 'https://sepolia.base.org',\n [hardhat.id]: 'http://127.0.0.1:8545',\n };\n const rpc = opts.rpcUrl ?? inferredRpc ?? defaultRpcUrls[opts.chainId] ?? 'https://mainnet.base.org';\n const chainMap: Record<number, any> = { [base.id]: base, [baseSepolia.id]: baseSepolia, [hardhat.id]: hardhat };\n const selectedChain = chainMap[this.chainId];\n this.publicClient = createPublicClient({ chain: selectedChain as any, transport: http(rpc, { batch: false }) }) as unknown as PublicClient;\n\n // contracts-v3 resolution (via contracts-v2 package)\n const { addresses, abis } = getContracts(this.chainId, this.runtimeEnv);\n this.escrowAddress = addresses.escrow as Address;\n this.escrowAbi = abis.escrow;\n this.orchestratorAddress = addresses.orchestrator as Address | undefined;\n this.orchestratorAbi = abis.orchestrator;\n this.unifiedPaymentVerifier = addresses.unifiedPaymentVerifier as Address | undefined;\n this.protocolViewerAddress = (addresses as any).protocolViewer as Address | undefined;\n this.protocolViewerAbi = (abis as any).protocolViewer as Abi | undefined;\n // optional USDC convenience\n const maybeUsdc = (addresses as any).usdc as Address | undefined;\n if (maybeUsdc) (this as any)._usdcAddress = maybeUsdc;\n\n // Indexer for advanced/historical queries\n const indexerEndpoint = opts.indexerUrl ?? defaultIndexerEndpoint(this.runtimeEnv === 'staging' ? 'STAGING' : 'PRODUCTION');\n this._indexerClient = new IndexerClient(indexerEndpoint);\n this._indexerService = new IndexerDepositService(this._indexerClient);\n\n // http verification config\n this.baseApiUrl = opts.baseApiUrl;\n this.apiKey = opts.apiKey;\n this.authorizationToken = opts.authorizationToken;\n this.apiTimeoutMs = opts.timeouts?.api ?? 15000;\n }\n\n private isValidHexAddress(addr?: string | null): boolean {\n if (typeof addr !== 'string') return false;\n return /^0x[0-9a-fA-F]{40}$/.test(addr);\n }\n\n /**\n * Simulate a contract call (validation only) and send with ERC-8021 attribution.\n * Referrer codes are stripped from overrides for simulation and appended to calldata.\n */\n private async simulateAndSendWithAttribution(opts: {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n txOverrides?: TxOverrides;\n value?: bigint;\n }): Promise<Hash> {\n const { referrer, ...txOverrides } = opts.txOverrides ?? {};\n\n await this.publicClient.simulateContract({\n address: opts.address,\n abi: opts.abi,\n functionName: opts.functionName as any,\n args: (opts.args ?? []) as any,\n account: this.walletClient.account!,\n ...(txOverrides as any),\n });\n\n return sendTransactionWithAttribution(\n this.walletClient,\n {\n address: opts.address as `0x${string}`,\n abi: opts.abi,\n functionName: opts.functionName,\n args: opts.args ?? [],\n value: opts.value ?? (txOverrides as any).value,\n },\n referrer,\n txOverrides\n );\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT QUERIES (RPC-first via ProtocolViewer) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Fetches all deposits owned by the connected wallet from on-chain.\n *\n * This is the primary method for liquidity providers to query their deposits.\n * Uses ProtocolViewer for instant on-chain reads (no indexer lag).\n *\n * @returns Array of deposit views with payment methods and currencies\n *\n * @example\n * ```typescript\n * const deposits = await client.getDeposits();\n * for (const d of deposits) {\n * console.log(`Deposit ${d.depositId}: ${d.availableLiquidity} available`);\n * }\n * ```\n */\n async getDeposits(): Promise<PV_DepositView[]> {\n const owner = this.walletClient.account?.address;\n if (!owner) throw new Error('Wallet client is missing account');\n return this.getAccountDeposits(owner);\n }\n\n /**\n * Fetches all deposits owned by a specific address from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @param owner - The owner's Ethereum address\n * @returns Array of deposit views with payment methods and currencies\n *\n * @example\n * ```typescript\n * const deposits = await client.getAccountDeposits('0x...');\n * ```\n */\n async getAccountDeposits(owner: Address): Promise<PV_DepositView[]> {\n return this.getPvAccountDeposits(owner);\n }\n\n /**\n * Fetches a single deposit by its numeric ID from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @param depositId - The deposit ID (numeric)\n * @returns Deposit view with payment methods, currencies, and intent hashes\n *\n * @example\n * ```typescript\n * const deposit = await client.getDeposit(42n);\n * console.log(`Available: ${deposit.availableLiquidity}`);\n * console.log(`Payment methods: ${deposit.paymentMethods.length}`);\n * ```\n */\n async getDeposit(depositId: bigint | number | string): Promise<PV_DepositView> {\n const id = typeof depositId === 'bigint' ? depositId : BigInt(depositId);\n return this.getPvDepositById(id);\n }\n\n /**\n * Fetches multiple deposits by their IDs from on-chain in a batch.\n *\n * @param depositIds - Array of deposit IDs\n * @returns Array of deposit views\n */\n async getDepositsById(depositIds: Array<bigint | number | string>): Promise<PV_DepositView[]> {\n const ids = depositIds.map(id => typeof id === 'bigint' ? id : BigInt(id));\n return this.getPvDepositsFromIds(ids);\n }\n\n /**\n * Fetches all intents created by the connected wallet from on-chain.\n *\n * Uses ProtocolViewer for instant on-chain reads.\n *\n * @returns Array of intent views with deposit context\n *\n * @example\n * ```typescript\n * const intents = await client.getIntents();\n * for (const i of intents) {\n * console.log(`Intent ${i.intentHash}: ${i.intent.amount} tokens`);\n * }\n * ```\n */\n async getIntents(): Promise<PV_IntentView[]> {\n const owner = this.walletClient.account?.address;\n if (!owner) throw new Error('Wallet client is missing account');\n return this.getAccountIntents(owner);\n }\n\n /**\n * Fetches all intents created by a specific address from on-chain.\n *\n * @param owner - The owner's Ethereum address\n * @returns Array of intent views with deposit context\n */\n async getAccountIntents(owner: Address): Promise<PV_IntentView[]> {\n return this.getPvAccountIntents(owner);\n }\n\n /**\n * Fetches a single intent by its hash from on-chain.\n *\n * @param intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @returns Intent view with deposit context\n */\n async getIntent(intentHash: `0x${string}`): Promise<PV_IntentView> {\n return this.getPvIntent(intentHash);\n }\n\n /**\n * Resolves the payee details hash for a deposit's payment method from on-chain.\n *\n * @param depositId - The deposit ID\n * @param paymentMethodHash - The payment method hash\n * @returns The payee details hash, or null if not found\n */\n async resolvePayeeHash(depositId: bigint | number | string, paymentMethodHash: string): Promise<string | null> {\n const deposit = await this.getDeposit(depositId);\n const pmLower = paymentMethodHash.toLowerCase();\n for (const pm of deposit.paymentMethods) {\n if (pm.paymentMethod.toLowerCase() === pmLower) {\n return pm.verificationData.payeeDetails;\n }\n }\n return null;\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ ADVANCED: INDEXER QUERIES (for historical/filtered data) ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Access to the indexer for advanced queries.\n *\n * Use this for:\n * - Historical data (totalAmountTaken, totalWithdrawn)\n * - Filtered queries across all deposits (not just by owner)\n * - Pagination with ordering\n * - Fulfillment/verification records\n *\n * @example\n * ```typescript\n * // Query deposits with filters and pagination\n * const deposits = await client.indexer.getDeposits(\n * { status: 'ACTIVE', minLiquidity: '1000000' },\n * { limit: 50, orderBy: 'remainingDeposits', orderDirection: 'desc' }\n * );\n *\n * // Get historical fulfillment data\n * const fulfillments = await client.indexer.getFulfilledIntentEvents(['0x...']);\n * ```\n */\n get indexer() {\n const service = this._indexerService;\n const client = this._indexerClient;\n return {\n /** Raw GraphQL client for custom queries */\n client,\n\n /**\n * Fetches deposits from the indexer with optional filtering and pagination.\n * Use for advanced queries across all deposits, not just by owner.\n */\n getDeposits: (filter?: DepositFilter, pagination?: PaginationOptions): Promise<DepositEntity[]> => {\n return service.fetchDeposits(filter, pagination);\n },\n\n /**\n * Fetches deposits with their related payment methods and optionally intents.\n */\n getDepositsWithRelations: (filter?: DepositFilter, pagination?: PaginationOptions, options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] }): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsWithRelations(filter, pagination, options);\n },\n\n /**\n * Fetches a single deposit by its composite ID with all related data.\n * @param id - Composite ID format: \"chainId_escrowAddress_depositId\"\n */\n getDepositById: (id: string, options?: { includeIntents?: boolean; intentStatuses?: IntentStatus[] }): Promise<DepositWithRelations | null> => {\n return service.fetchDepositWithRelations(id, options);\n },\n\n /**\n * Fetches intents for multiple deposits.\n */\n getIntentsForDeposits: (depositIds: string[], statuses: IntentStatus[] = ['SIGNALED']): Promise<IntentEntity[]> => {\n return service.fetchIntentsForDeposits(depositIds, statuses);\n },\n\n /**\n * Fetches all intents created by a specific owner address.\n */\n getOwnerIntents: (owner: string, statuses?: IntentStatus[]): Promise<IntentEntity[]> => {\n return service.fetchIntentsByOwner(owner, statuses);\n },\n\n /**\n * Fetches intents that have expired.\n */\n getExpiredIntents: (params: { now: bigint | string; depositIds: string[]; limit?: number }): Promise<IntentEntity[]> => {\n return service.fetchExpiredIntents(params);\n },\n\n /**\n * Fetches fulfillment events for completed intents.\n */\n getFulfilledIntentEvents: (intentHashes: string[]): Promise<IntentFulfilledEntity[]> => {\n return service.fetchFulfilledIntentEvents(intentHashes);\n },\n\n /**\n * Fetches both the fulfillment record and payment verification for an intent.\n */\n getFulfillmentAndPayment: (intentHash: string): Promise<FulfillmentAndPaymentResponse> => {\n return fetchFulfillmentAndPayment(client, intentHash);\n },\n\n /**\n * Fetches deposits that match a specific payee details hash.\n */\n getDepositsByPayeeHash: (payeeHash: string, options: { paymentMethodHash?: string; limit?: number; includeIntents?: boolean; intentStatuses?: IntentStatus[] } = {}): Promise<DepositWithRelations[]> => {\n return service.fetchDepositsByPayeeHash(payeeHash, options);\n },\n };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT CREATION ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Ensures ERC20 token allowance is sufficient for the Escrow contract.\n *\n * If the current allowance is less than the requested amount, this method\n * will submit an approval transaction. Use `maxApprove: true` for unlimited\n * approval to avoid repeated approval transactions.\n *\n * @param params.token - ERC20 token address to approve\n * @param params.amount - Minimum required allowance amount\n * @param params.spender - Spender address (defaults to Escrow contract)\n * @param params.maxApprove - If true, approves MaxUint256 instead of exact amount\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Object with `hadAllowance` (true if no approval needed) and optional `hash`\n *\n * @example\n * ```typescript\n * // Ensure allowance for 1000 USDC\n * const { hadAllowance, hash } = await client.ensureAllowance({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: 1000_000000n,\n * maxApprove: true,\n * });\n *\n * if (!hadAllowance) {\n * console.log('Approval tx:', hash);\n * }\n * ```\n */\n async ensureAllowance(params: { token: Address; amount: bigint; spender?: Address; maxApprove?: boolean; txOverrides?: TxOverrides }): Promise<{ hadAllowance: boolean; hash?: Hash }> {\n const owner = this.walletClient.account?.address as Address | undefined;\n if (!owner) throw new Error('Wallet client is missing account');\n const spender = params.spender ?? this.escrowAddress;\n const allowance = (await this.publicClient.readContract({ address: params.token, abi: ERC20_ABI as any, functionName: 'allowance', args: [owner, spender] })) as bigint;\n if (allowance >= params.amount) return { hadAllowance: true };\n const MAX = (1n << 256n) - 1n;\n const value = params.maxApprove ? MAX : params.amount;\n const hash = await this.simulateAndSendWithAttribution({\n address: params.token,\n abi: ERC20_ABI as any,\n functionName: 'approve',\n args: [spender, value],\n txOverrides: params.txOverrides,\n });\n return { hadAllowance: false, hash };\n }\n\n /**\n * Creates a new USDC deposit in the Escrow contract.\n *\n * This is the primary method for liquidity providers to add funds to the protocol.\n * The deposit can accept intents from multiple payment platforms with different\n * conversion rates per currency.\n *\n * **Important**: Requires `apiKey` or `authorizationToken` to be set.\n * Call `ensureAllowance()` first to approve USDC spending.\n *\n * @param params.token - Token address (USDC)\n * @param params.amount - Total deposit amount in token units (6 decimals for USDC)\n * @param params.intentAmountRange - Min/max amount per intent\n * @param params.processorNames - Payment platforms to accept (e.g., ['wise', 'revolut'])\n * @param params.depositData - Payee details per processor (e.g., [{ email: '...' }])\n * @param params.conversionRates - Conversion rates per processor, grouped by currency\n * @param params.delegate - Optional delegate address that can manage the deposit\n * @param params.intentGuardian - Optional guardian for intent approval\n * @param params.retainOnEmpty - Keep deposit active when balance reaches zero\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns The deposit details posted to API and the transaction hash\n *\n * @throws Error if apiKey/authorizationToken is missing\n * @throws Error if processorNames, depositData, and conversionRates lengths don't match\n * @throws Error if a currency is not supported by the specified processor\n *\n * @example\n * ```typescript\n * // Create a 1000 USDC deposit accepting Wise payments in USD and EUR\n * const { hash } = await client.createDeposit({\n * token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: 1000_000000n,\n * intentAmountRange: { min: 10_000000n, max: 500_000000n },\n * processorNames: ['wise'],\n * depositData: [{ email: 'you@example.com' }],\n * conversionRates: [[\n * { currency: 'USD', conversionRate: '1020000000000000000' }, // 1.02\n * { currency: 'EUR', conversionRate: '1100000000000000000' }, // 1.10\n * ]],\n * });\n * ```\n */\n async createDeposit(params: {\n token: Address;\n amount: bigint;\n intentAmountRange: { min: bigint; max: bigint };\n processorNames: string[];\n depositData: { [key: string]: string }[];\n conversionRates: { currency: string; conversionRate: string }[][];\n delegate?: Address;\n intentGuardian?: Address;\n retainOnEmpty?: boolean;\n txOverrides?: TxOverrides;\n }): Promise<{ depositDetails: PostDepositDetailsRequest[]; hash: Hash }> {\n const methods = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n if (!Array.isArray(params.processorNames) || params.processorNames.length === 0) {\n throw new Error('processorNames must be a non-empty array');\n }\n if (params.processorNames.length !== params.conversionRates.length) {\n throw new Error('processorNames and conversionRates length mismatch');\n }\n if (params.processorNames.length !== params.depositData.length) {\n throw new Error('processorNames and depositData length mismatch');\n }\n\n const paymentMethods = params.processorNames.map((name) => resolvePaymentMethodHashFromCatalog(name, methods));\n const intentGatingService = getGatingServiceAddress(this.chainId, this.runtimeEnv);\n // Post deposit details to API to produce hashed on-chain ids\n const baseApiUrl = (this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n if (!this.apiKey && !this.authorizationToken) {\n throw new Error('createDeposit requires apiKey or authorizationToken to post deposit details');\n }\n const depositDetails: PostDepositDetailsRequest[] = params.processorNames.map((processorName, index) => ({\n processorName,\n depositData: params.depositData[index] || {},\n }));\n const apiResponses = await Promise.all(\n depositDetails.map((req) => apiPostDepositDetails(req, baseApiUrl, this.apiTimeoutMs))\n );\n if (!apiResponses.every((r) => (r as any)?.success)) {\n const failed = apiResponses.find((r) => !(r as any)?.success) as any;\n throw new Error(failed?.message || 'Failed to create deposit details');\n }\n const hashedOnchainIds = apiResponses.map((r: any) => r.responseObject?.hashedOnchainId as string);\n const paymentMethodData = hashedOnchainIds.map((hid) => ({ intentGatingService, payeeDetails: hid, data: '0x' as `0x${string}` }));\n\n // Validate currency support per processor when catalog lists allowed currencies\n // Note: catalog stores keccak256 hashes of currency codes, not ASCII-bytes32\n params.conversionRates.forEach((group, i) => {\n const key = params.processorNames[i]?.toLowerCase();\n const allowed = methods[key!]?.currencies?.map((c) => c.toLowerCase());\n if (allowed && allowed.length) {\n for (const { currency } of group) {\n const codeHash = currencyKeccak256(String(currency).toUpperCase()).toLowerCase();\n if (!allowed.includes(codeHash)) {\n throw new Error(`Currency ${currency} not supported by ${params.processorNames[i]}. Allowed: ${allowed.join(', ')}`);\n }\n }\n }\n });\n\n // Map UI currency groups to on-chain tuple[][] with minConversionRate\n const { mapConversionRatesToOnchainMinRate } = await import('../utils/currency');\n const normalized = params.conversionRates.map((group) => group.map((r) => ({ currency: r.currency as any, conversionRate: r.conversionRate })));\n const currencies = mapConversionRatesToOnchainMinRate(normalized as any, paymentMethods.length);\n\n const args = [{\n token: params.token,\n amount: params.amount,\n intentAmountRange: params.intentAmountRange,\n paymentMethods,\n paymentMethodData,\n currencies,\n delegate: (params.delegate ?? '0x0000000000000000000000000000000000000000') as Address,\n intentGuardian: (params.intentGuardian ?? '0x0000000000000000000000000000000000000000') as Address,\n retainOnEmpty: Boolean(params.retainOnEmpty ?? false),\n }];\n\n const hash = await this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'createDeposit',\n args,\n txOverrides: params.txOverrides,\n });\n return { depositDetails, hash };\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: DEPOSIT MANAGEMENT ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Enables or disables a deposit from accepting new intents.\n *\n * @param params.depositId - The deposit ID\n * @param params.accepting - Whether to accept new intents\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setAcceptingIntents(params: { depositId: bigint; accepting: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setAcceptingIntents',\n args: [params.depositId, params.accepting],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Updates the min/max intent amount range for a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.min - Minimum intent amount\n * @param params.max - Maximum intent amount\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setIntentRange(params: { depositId: bigint; min: bigint; max: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setIntentRange',\n args: [params.depositId, { min: params.min, max: params.max }],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Updates the minimum conversion rate for a specific currency on a payment method.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash (bytes32)\n * @param params.fiatCurrency - Fiat currency hash (bytes32)\n * @param params.minConversionRate - New minimum conversion rate (18 decimals)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setCurrencyMinRate(params: { depositId: bigint; paymentMethod: `0x${string}`; fiatCurrency: `0x${string}`; minConversionRate: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setCurrencyMinRate',\n args: [params.depositId, params.paymentMethod, params.fiatCurrency, params.minConversionRate],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Adds additional funds to an existing deposit.\n * Requires prior approval of the token amount.\n *\n * @param params.depositId - The deposit ID to add funds to\n * @param params.amount - Amount to add (in token units)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addFunds(params: { depositId: bigint; amount: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addFunds',\n args: [params.depositId, params.amount],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes funds from a deposit (partial withdrawal).\n * Can only withdraw available (non-locked) funds.\n *\n * @param params.depositId - The deposit ID\n * @param params.amount - Amount to remove (in token units)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeFunds(params: { depositId: bigint; amount: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'removeFunds',\n args: [params.depositId, params.amount],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Fully withdraws a deposit, returning all available funds to the owner.\n * The deposit must have no active intents.\n *\n * @param params.depositId - The deposit ID to withdraw\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async withdrawDeposit(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'withdrawDeposit',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ADVANCED DEPOSIT CONFIGURATION ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Sets whether a deposit should remain active when its balance reaches zero.\n *\n * @param params.depositId - The deposit ID\n * @param params.retain - If true, deposit stays active when empty\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setRetainOnEmpty(params: { depositId: bigint; retain: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setRetainOnEmpty',\n args: [params.depositId, params.retain],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Assigns a delegate address that can manage the deposit on behalf of the owner.\n *\n * @param params.depositId - The deposit ID\n * @param params.delegate - Address to delegate management to\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setDelegate(params: { depositId: bigint; delegate: Address; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setDelegate',\n args: [params.depositId, params.delegate],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes the delegate from a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeDelegate(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'removeDelegate',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Adds new payment methods to an existing deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethods - Array of payment method hashes to add\n * @param params.paymentMethodData - Corresponding payment method configuration\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addPaymentMethods(params: { depositId: bigint; paymentMethods: `0x${string}`[]; paymentMethodData: { intentGatingService: Address; payeeDetails: string; data: `0x${string}` }[]; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addPaymentMethods',\n args: [params.depositId, params.paymentMethods, params.paymentMethodData],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Activates or deactivates a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to modify\n * @param params.isActive - Whether the payment method should accept intents\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async setPaymentMethodActive(params: { depositId: bigint; paymentMethod: `0x${string}`; isActive: boolean; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'setPaymentMethodActive',\n args: [params.depositId, params.paymentMethod, params.isActive],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Deactivates a payment method on a deposit (convenience alias for setPaymentMethodActive).\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to deactivate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removePaymentMethod(params: { depositId: bigint; paymentMethod: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.setPaymentMethodActive({ depositId: params.depositId, paymentMethod: params.paymentMethod, isActive: false, txOverrides: params.txOverrides });\n }\n\n /**\n * Adds new currencies to a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash to add currencies to\n * @param params.currencies - Array of currency configurations with code and min rate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async addCurrencies(params: { depositId: bigint; paymentMethod: `0x${string}`; currencies: { code: `0x${string}`; minConversionRate: bigint }[]; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'addCurrencies',\n args: [params.depositId, params.paymentMethod, params.currencies],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Deactivates a currency for a payment method on a deposit.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash\n * @param params.currencyCode - Currency code hash to deactivate\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async deactivateCurrency(params: { depositId: bigint; paymentMethod: `0x${string}`; currencyCode: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'deactivateCurrency',\n args: [params.depositId, params.paymentMethod, params.currencyCode],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * Removes (deactivates) a currency from a payment method.\n * Alias for deactivateCurrency.\n *\n * @param params.depositId - The deposit ID\n * @param params.paymentMethod - Payment method hash\n * @param params.currencyCode - Currency code hash to remove\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async removeCurrency(params: { depositId: bigint; paymentMethod: `0x${string}`; currencyCode: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.deactivateCurrency(params);\n }\n\n /**\n * Removes expired intents from a deposit, freeing up locked funds.\n * Can be called by anyone (permissionless cleanup).\n *\n * @param params.depositId - The deposit ID to prune\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async pruneExpiredIntents(params: { depositId: bigint; txOverrides?: TxOverrides }): Promise<Hash> {\n return this.simulateAndSendWithAttribution({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'pruneExpiredIntents',\n args: [params.depositId],\n txOverrides: params.txOverrides,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: INTENT OPERATIONS\n // (Used by takers/buyers - not primary SDK functionality)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Signals intent to use a deposit.\n *\n * > **Note**: This method is typically used by takers/buyers who want to\n * > purchase crypto by paying fiat. Liquidity providers generally don't\n * > need to call this method directly.\n *\n * This reserves funds from a deposit and creates an intent that must be\n * fulfilled (via `fulfillIntent`) or will expire. The taker commits to\n * sending fiat payment to the deposit's payee.\n *\n * If `gatingServiceSignature` is not provided, the SDK will automatically\n * fetch one from the API (requires `apiKey` or `authorizationToken`).\n *\n * @param params.depositId - The deposit to use\n * @param params.amount - Amount of tokens to claim (in token units)\n * @param params.toAddress - Address to receive the tokens when fulfilled\n * @param params.processorName - Payment platform (e.g., 'wise', 'revolut')\n * @param params.payeeDetails - Hashed payee details (from deposit)\n * @param params.fiatCurrencyCode - Fiat currency code (e.g., 'USD', 'EUR')\n * @param params.conversionRate - Agreed conversion rate (18 decimals)\n * @param params.referrer - Optional referrer address for fee sharing\n * @param params.referrerFee - Optional referrer fee amount\n * @param params.postIntentHook - Optional hook contract to call after signaling\n * @param params.data - Optional data to pass to the hook\n * @param params.gatingServiceSignature - Pre-obtained signature (if not auto-fetching)\n * @param params.signatureExpiration - Signature expiration timestamp\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const hash = await client.signalIntent({\n * depositId: 42n,\n * amount: 100_000000n, // 100 USDC\n * toAddress: '0x...',\n * processorName: 'wise',\n * payeeDetails: '0x...',\n * fiatCurrencyCode: 'USD',\n * conversionRate: 1_020000000000000000n, // 1.02\n * });\n * ```\n */\n async signalIntent(params: {\n depositId: bigint | string;\n amount: bigint | string;\n toAddress: Address;\n processorName: string;\n payeeDetails: string;\n fiatCurrencyCode: string;\n conversionRate: bigint | string;\n referrer?: Address;\n referrerFee?: bigint | string;\n postIntentHook?: Address;\n data?: `0x${string}`;\n gatingServiceSignature?: `0x${string}`;\n signatureExpiration?: bigint | string;\n txOverrides?: TxOverrides;\n }): Promise<Hash> {\n // Resolve missing addresses opportunistically before sending\n // await this.ensureContractsForSignal(params.depositId);\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n const catalog = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n const paymentMethod = resolvePaymentMethodHashFromCatalog(params.processorName, catalog);\n const fiatCurrency = resolveFiatCurrencyBytes32(params.fiatCurrencyCode);\n const depositId = typeof params.depositId === 'bigint' ? params.depositId : BigInt(params.depositId);\n const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);\n const conversionRate = typeof params.conversionRate === 'bigint' ? params.conversionRate : BigInt(params.conversionRate);\n const referrerFee = params.referrerFee === undefined ? 0n : (typeof params.referrerFee === 'bigint' ? params.referrerFee : BigInt(params.referrerFee));\n\n let { gatingServiceSignature, signatureExpiration } = params;\n if ((!gatingServiceSignature || !signatureExpiration) && this.baseApiUrl && (this.apiKey || this.authorizationToken)) {\n const resp = await apiSignIntentV2(\n {\n processorName: params.processorName,\n payeeDetails: params.payeeDetails,\n depositId: depositId.toString(),\n amount: amount.toString(),\n toAddress: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate: conversionRate.toString(),\n chainId: this.chainId.toString(),\n orchestratorAddress: this.orchestratorAddress!,\n escrowAddress: this.escrowAddress,\n },\n { baseApiUrl: this.baseApiUrl, apiKey: this.apiKey, authorizationToken: this.authorizationToken, timeoutMs: this.apiTimeoutMs }\n );\n gatingServiceSignature = resp.signature;\n signatureExpiration = resp.signatureExpiration;\n }\n\n if (!gatingServiceSignature || !signatureExpiration) throw new Error('Missing gatingServiceSignature/signatureExpiration');\n\n const args = [{\n escrow: this.escrowAddress,\n depositId,\n amount,\n to: params.toAddress,\n paymentMethod,\n fiatCurrency,\n conversionRate,\n referrer: (params.referrer ?? ('0x0000000000000000000000000000000000000000' as Address)) as Address,\n referrerFee,\n gatingServiceSignature,\n signatureExpiration: typeof signatureExpiration === 'bigint' ? signatureExpiration : BigInt(signatureExpiration),\n postIntentHook: (params.postIntentHook ?? ('0x0000000000000000000000000000000000000000' as Address)) as Address,\n data: (params.data ?? '0x') as `0x${string}`,\n }];\n\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'signalIntent',\n args,\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Cancels a signaled intent before fulfillment.\n *\n * Only the intent owner can cancel. Releases reserved funds back to the deposit.\n *\n * @param params.intentHash - The intent hash to cancel (0x-prefixed, 32 bytes)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async cancelIntent(params: { intentHash: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'cancelIntent',\n args: [params.intentHash],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Releases funds back to the deposit owner.\n *\n * Called by the deposit owner when they want to reject an intent\n * (e.g., payment verification failed or intent expired).\n *\n * @param params.intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @param params.txOverrides - Optional viem transaction overrides\n * @returns Transaction hash\n */\n async releaseFundsToPayer(params: { intentHash: `0x${string}`; txOverrides?: TxOverrides }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n return this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'releaseFundsToPayer',\n args: [params.intentHash],\n txOverrides: params.txOverrides,\n });\n }\n\n /**\n * **Supporting Method** - Fulfills an intent by submitting a payment proof.\n *\n * > **Note**: This method is typically used by takers/buyers after they've\n * > sent fiat payment. Liquidity providers generally don't call this directly.\n *\n * This is the final step in the off-ramp flow. After the taker has sent\n * fiat payment, they generate a proof (via the browser extension) and\n * submit it here. The SDK handles attestation service calls automatically.\n *\n * **Flow:**\n * 1. Intent parameters are derived from the indexer/ProtocolViewer\n * 2. Proof is sent to the attestation service for verification\n * 3. Attestation response is encoded and submitted on-chain\n * 4. Funds are released to the intent's `toAddress`\n *\n * @param params.intentHash - The intent hash to fulfill (0x-prefixed, 32 bytes)\n * @param params.proof - Payment proof from Reclaim (object or JSON string)\n * @param params.timestampBufferMs - Allowed timestamp variance (default: 300000ms)\n * @param params.attestationServiceUrl - Override attestation service URL\n * @param params.verifyingContract - Override verifier contract address\n * @param params.postIntentHookData - Data to pass to post-intent hook\n * @param params.txOverrides - Optional viem transaction overrides\n * @param params.callbacks - Lifecycle callbacks for UI updates\n * @returns Transaction hash\n */\n async fulfillIntent(params: {\n intentHash: `0x${string}`;\n proof: Record<string, unknown> | string;\n timestampBufferMs?: string;\n attestationServiceUrl?: string;\n verifyingContract?: Address;\n postIntentHookData?: `0x${string}`;\n txOverrides?: TxOverrides;\n callbacks?: { onAttestationStart?: () => void; onTxSent?: (hash: Hash) => void; onTxMined?: (hash: Hash) => void };\n }): Promise<Hash> {\n if (!this.orchestratorAddress || !this.orchestratorAbi) throw new Error('Orchestrator not available');\n\n const intentHash: `0x${string}` = params.intentHash;\n const attUrl: string = (params.attestationServiceUrl ?? this.defaultAttestationService());\n const verifyingContract = (params.verifyingContract ?? this.unifiedPaymentVerifier) as Address | undefined;\n // Derive intent inputs via indexer/ProtocolViewer (source of truth)\n const inputs = await this.getFulfillIntentInputs(intentHash);\n const amount = inputs.amount;\n const fiatCurrency = inputs.fiatCurrency;\n const conversionRate = inputs.conversionRate;\n const payeeDetails = inputs.payeeDetails;\n const timestampMs = inputs.intentTimestampMs;\n const paymentMethodHash = inputs.paymentMethodHash || '0x';\n const timestampBufferMs = params.timestampBufferMs ?? '300000'; // note: service should default; keep explicit for now\n\n // Map paymentMethodHash -> platform/actionType for Attestation Service endpoint\n const catalog = getPaymentMethodsCatalog(this.chainId, this.runtimeEnv);\n const { resolvePaymentMethodNameFromHash } = await import('../utils/paymentResolution');\n const platformName = resolvePaymentMethodNameFromHash(paymentMethodHash, catalog);\n if (!platformName) throw new Error('Unknown paymentMethodHash for this network/env; update SDK catalogs.');\n const { resolvePlatformAttestationConfig } = await import('../constants');\n const cfg = resolvePlatformAttestationConfig(platformName);\n const platform = cfg.actionPlatform;\n const actionType = cfg.actionType;\n\n const zkTlsProof = typeof params.proof === 'string' ? params.proof : JSON.stringify(params.proof);\n const payload = {\n proofType: 'reclaim',\n proof: zkTlsProof,\n chainId: this.chainId,\n verifyingContract,\n intent: {\n intentHash,\n amount,\n timestampMs,\n paymentMethod: paymentMethodHash,\n fiatCurrency,\n conversionRate,\n payeeDetails,\n timestampBufferMs,\n },\n } as Record<string, unknown>;\n\n params?.callbacks?.onAttestationStart?.();\n const att = await apiCreatePaymentAttestation(payload, attUrl, platform, actionType);\n const paymentProof = encodePaymentAttestation(att);\n const verificationData = encodeVerifyPaymentData({\n intentHash,\n paymentProof,\n data: encodeAddressAsBytes(att.responseObject.signer),\n });\n\n const args = [{\n paymentProof,\n intentHash,\n verificationData,\n postIntentHookData: (params.postIntentHookData ?? '0x') as `0x${string}`,\n }];\n const txHash = await this.simulateAndSendWithAttribution({\n address: this.orchestratorAddress,\n abi: this.orchestratorAbi,\n functionName: 'fulfillIntent',\n args,\n txOverrides: params.txOverrides,\n });\n params?.callbacks?.onTxSent?.(txHash);\n // We do not wait for receipt here; caller can wait or use callback if we later add it\n return txHash;\n }\n\n private defaultAttestationService(): string {\n return this.runtimeEnv === 'staging'\n ? 'https://attestation-service-staging.zkp2p.xyz'\n : 'https://attestation-service.zkp2p.xyz';\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: QUOTES API\n // (Used by frontends to find available liquidity)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Fetches quotes for available liquidity.\n *\n * > **Note**: This method is typically used by frontend applications to\n * > display available off-ramp options to users. Liquidity providers can\n * > use it to see how their deposits appear to takers.\n *\n * Returns available quotes from liquidity providers matching the request\n * criteria. When authenticated, the API returns payee details in each quote.\n *\n * @param req - Quote request parameters\n * @param req.paymentPlatforms - Payment platforms to search (e.g., ['wise', 'revolut'])\n * @param req.fiatCurrency - Target fiat currency code (e.g., 'USD')\n * @param req.user - User's address\n * @param req.recipient - Token recipient address\n * @param req.destinationChainId - Chain ID for token delivery\n * @param req.destinationToken - Token address to receive\n * @param req.amount - Amount (in fiat if isExactFiat, else in tokens)\n * @param req.isExactFiat - If true, amount is in fiat; quotes return token amounts\n * @param req.escrowAddresses - Optional filter for specific escrow contracts\n * @param opts - Optional overrides for API URL and timeout\n * @returns Quote response with available options\n *\n * @example\n * ```typescript\n * const quote = await client.getQuote({\n * paymentPlatforms: ['wise'],\n * fiatCurrency: 'EUR',\n * user: '0x...',\n * recipient: '0x...',\n * destinationChainId: 8453,\n * destinationToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n * amount: '100',\n * isExactFiat: true,\n * });\n *\n * for (const q of quote.responseObject.quotes) {\n * console.log(`${q.tokenAmountFormatted} USDC for ${q.fiatAmountFormatted}`);\n * }\n * ```\n */\n async getQuote(req: QuoteRequest, opts?: { baseApiUrl?: string; timeoutMs?: number }): Promise<QuoteResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n // Include the native escrow only when caller did not provide filters\n const reqWithEscrow = { ...(req as any) } as QuoteRequest & { escrowAddresses?: string[] };\n if ((!reqWithEscrow.escrowAddresses || reqWithEscrow.escrowAddresses.length === 0) && this.escrowAddress) {\n reqWithEscrow.escrowAddresses = [this.escrowAddress as string];\n }\n const quote = await apiGetQuote(reqWithEscrow as any, baseApiUrl, timeoutMs, this.apiKey, this.authorizationToken);\n // Extract maker.depositData from /v2/quote response into payeeData for backward compatibility\n // This eliminates the need for separate apiGetPayeeDetails calls\n const quotes = quote?.responseObject?.quotes ?? [];\n for (const q of quotes) {\n const maker = (q as any)?.maker;\n if (maker?.depositData && typeof q === 'object') {\n (q as any).payeeData = maker.depositData;\n }\n }\n return quote;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // SUPPORTING: TAKER TIER\n // (Used by frontends to display taker limits)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * **Supporting Method** - Fetches taker tier information for an address.\n *\n * > **Note**: Requires `apiKey` or `authorizationToken` to be set.\n *\n * @param req - Taker tier request parameters\n * @param req.owner - Taker address\n * @param req.chainId - Chain ID\n * @param opts - Optional overrides for API URL and timeout\n * @returns Taker tier response\n */\n async getTakerTier(req: GetTakerTierRequest, opts?: { baseApiUrl?: string; timeoutMs?: number }): Promise<GetTakerTierResponse> {\n const baseApiUrl = (opts?.baseApiUrl ?? this.baseApiUrl ?? 'https://api.zkp2p.xyz').replace(/\\/$/, '');\n const timeoutMs = opts?.timeoutMs ?? this.apiTimeoutMs;\n if (!this.apiKey && !this.authorizationToken) {\n throw new Error('getTakerTier requires apiKey or authorizationToken');\n }\n return apiGetTakerTier(req, this.apiKey, baseApiUrl, this.authorizationToken, timeoutMs);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: ON-CHAIN DEPOSIT VIEWS ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n private requireProtocolViewer() {\n if (!this.protocolViewerAddress || !this.protocolViewerAbi) {\n throw new Error('ProtocolViewer not available for this network');\n }\n return { address: this.protocolViewerAddress, abi: this.protocolViewerAbi } as const;\n }\n\n /**\n * Fetches a deposit directly from on-chain ProtocolViewer contract.\n * Falls back to Escrow.getDeposit if ProtocolViewer is unavailable.\n *\n * @param depositId - The deposit ID (string or bigint)\n * @returns Parsed deposit view with all payment methods and currencies\n */\n async getPvDepositById(depositId: string | bigint) {\n const id = typeof depositId === 'bigint' ? depositId : BigInt(depositId);\n try {\n const { address, abi } = this.requireProtocolViewer();\n const raw = await this.publicClient.readContract({ address, abi, functionName: 'getDeposit', args: [id] });\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return parseDepositView(raw);\n } catch (e) {\n // Fallback to Escrow.getDeposit\n const raw = await this.publicClient.readContract({ address: this.escrowAddress, abi: this.escrowAbi, functionName: 'getDeposit', args: [id] });\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return parseDepositView(raw);\n }\n }\n\n /**\n * Fetches multiple deposits by ID from on-chain in a batch call.\n *\n * @param ids - Array of deposit IDs\n * @returns Array of parsed deposit views\n */\n async getPvDepositsFromIds(ids: Array<string | bigint>) {\n // When ProtocolViewer is unavailable, fall back to per-id Escrow.getDeposit reads\n if (!this.protocolViewerAddress || !this.protocolViewerAbi) {\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n const results: any[] = [];\n for (const id of ids) {\n const raw = await this.publicClient.readContract({\n address: this.escrowAddress,\n abi: this.escrowAbi,\n functionName: 'getDeposit',\n args: [typeof id === 'bigint' ? id : BigInt(id)],\n });\n results.push(parseDepositView(raw));\n }\n return results;\n }\n const bn = ids.map((id) => (typeof id === 'bigint' ? id : BigInt(id)));\n const raw = (await this.publicClient.readContract({\n address: this.protocolViewerAddress!,\n abi: this.protocolViewerAbi!,\n functionName: 'getDepositFromIds',\n args: [bn],\n })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n }\n\n /**\n * Fetches all deposits owned by an address from on-chain.\n *\n * @param owner - The owner address\n * @returns Array of parsed deposit views\n */\n async getPvAccountDeposits(owner: Address) {\n try {\n const { address, abi } = this.requireProtocolViewer();\n const raw = (await this.publicClient.readContract({ address, abi, functionName: 'getAccountDeposits', args: [owner] })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n } catch (e) {\n const raw = (await this.publicClient.readContract({ address: this.escrowAddress, abi: this.escrowAbi, functionName: 'getAccountDeposits', args: [owner] })) as any[];\n const { parseDepositView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseDepositView);\n }\n }\n\n /**\n * Fetches all intents created by an address from on-chain.\n * Requires ProtocolViewer to be available.\n *\n * @param owner - The owner address\n * @returns Array of parsed intent views\n */\n async getPvAccountIntents(owner: Address) {\n const { address, abi } = this.requireProtocolViewer();\n const raw = (await this.publicClient.readContract({\n address,\n abi,\n functionName: 'getAccountIntents',\n args: [owner],\n })) as any[];\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n return raw.map(parseIntentView);\n }\n\n /**\n * Fetches a single intent by hash from on-chain.\n *\n * @param intentHash - The intent hash (0x-prefixed, 32 bytes)\n * @returns Parsed intent view with deposit context\n */\n async getPvIntent(intentHash: `0x${string}`) {\n const { address, abi } = this.requireProtocolViewer();\n const raw = await this.publicClient.readContract({\n address,\n abi,\n functionName: 'getIntent',\n args: [intentHash],\n });\n const { parseIntentView } = await import('../utils/protocolViewerParsers');\n return parseIntentView(raw);\n }\n\n // ╔═══════════════════════════════════════════════════════════════════════════╗\n // ║ CORE: UTILITIES ║\n // ╚═══════════════════════════════════════════════════════════════════════════╝\n\n /**\n * Returns the USDC token address for the current network (if known).\n *\n * @returns USDC address or undefined if not configured\n */\n getUsdcAddress(): Address | undefined {\n return this._usdcAddress;\n }\n\n /**\n * Returns all deployed contract addresses for the current network/environment.\n *\n * @returns Object with escrow, orchestrator, protocolViewer, verifier, and USDC addresses\n */\n getDeployedAddresses(): { escrow: Address; orchestrator?: Address; protocolViewer?: Address; unifiedPaymentVerifier?: Address; usdc?: Address } {\n return {\n escrow: this.escrowAddress,\n orchestrator: this.orchestratorAddress,\n protocolViewer: this.protocolViewerAddress,\n unifiedPaymentVerifier: this.unifiedPaymentVerifier,\n usdc: this._usdcAddress,\n };\n }\n\n /**\n * Resolves all parameters needed to fulfill an intent.\n *\n * Attempts to fetch from ProtocolViewer first (on-chain source of truth),\n * then falls back to the indexer. This is called internally by `fulfillIntent`\n * but exposed for advanced use cases.\n *\n * @param intentHash - The intent hash to resolve\n * @returns Intent parameters needed for fulfillment\n * @throws Error if intent not found or payee details cannot be resolved\n */\n async getFulfillIntentInputs(intentHash: `0x${string}`): Promise<{\n amount: string;\n fiatCurrency: `0x${string}`;\n conversionRate: string;\n payeeDetails: `0x${string}`;\n intentTimestampMs: string; // on-chain snapshot timestamp in ms\n paymentMethodHash: `0x${string}`;\n }> {\n // 1) Try ProtocolViewer when available\n try {\n if (this.protocolViewerAddress && this.protocolViewerAbi) {\n const view = await this.getPvIntent(intentHash);\n const pmHash = (view.intent.paymentMethod as string).toLowerCase();\n const matched = (view.deposit.paymentMethods || []).find((pm: any) => (pm.paymentMethod as string)?.toLowerCase?.() === pmHash);\n const payee = matched?.verificationData?.payeeDetails as `0x${string}` | undefined;\n if (payee) {\n return {\n amount: (view.intent.amount as bigint).toString(),\n fiatCurrency: view.intent.fiatCurrency as `0x${string}`,\n conversionRate: (view.intent.conversionRate as bigint).toString(),\n payeeDetails: payee,\n intentTimestampMs: (BigInt(view.intent.timestamp as any) * 1000n).toString(),\n paymentMethodHash: view.intent.paymentMethod as `0x${string}`,\n };\n }\n }\n } catch {/* fall through */ }\n\n // 2) Fallback: indexer — fetch intent + deposit relations to recover payeeDetails\n const query = /* GraphQL */ `\n query GetIntentMinimal($hash: String!) {\n Intent(where: { intentHash: { _eq: $hash } }, limit: 1) {\n amount\n fiatCurrency\n conversionRate\n paymentMethodHash\n depositId\n signalTimestamp\n }\n }\n `;\n const res = await this._indexerClient.query<{ Intent?: Array<{ amount: string; fiatCurrency: string; conversionRate: string; paymentMethodHash?: string | null; depositId: string; signalTimestamp?: string }> }>({\n query,\n variables: { hash: intentHash.toLowerCase() },\n });\n const rec = res?.Intent?.[0];\n if (!rec) throw new Error('Intent not found on indexer');\n if (!rec.signalTimestamp) throw new Error('Intent signal timestamp not found on indexer');\n const deposit = await this._indexerService.fetchDepositWithRelations(rec.depositId, { includeIntents: false });\n let payee: string | undefined;\n const pmHashLower = (rec.paymentMethodHash || '').toLowerCase();\n for (const pm of deposit?.paymentMethods || []) {\n if ((pm.paymentMethodHash || '').toLowerCase() === pmHashLower) {\n payee = pm.payeeDetailsHash;\n break;\n }\n }\n if (!payee) throw new Error('Payee details not found for intent');\n return {\n amount: rec.amount,\n fiatCurrency: rec.fiatCurrency as `0x${string}`,\n conversionRate: rec.conversionRate,\n payeeDetails: payee as `0x${string}`,\n intentTimestampMs: (BigInt(rec.signalTimestamp) * 1000n).toString(),\n paymentMethodHash: (rec.paymentMethodHash || '0x0000000000000000000000000000000000000000000000000000000000000000') as `0x${string}`,\n };\n }\n}\n","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};"]}
@@ -0,0 +1,3 @@
1
+ export { resolveFiatCurrencyBytes32, resolvePaymentMethodHash, resolvePaymentMethodHashFromCatalog, resolvePaymentMethodNameFromHash } from './chunk-M6S5FL2X.mjs';
2
+ //# sourceMappingURL=paymentResolution-S6GZR3OY.mjs.map
3
+ //# sourceMappingURL=paymentResolution-S6GZR3OY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"paymentResolution-S6GZR3OY.mjs"}
@@ -0,0 +1,5 @@
1
+ export { enrichPvDepositView, enrichPvIntentView, parseDepositView, parseIntentView } from './chunk-O7DHVBCL.mjs';
2
+ import './chunk-M6S5FL2X.mjs';
3
+ import './chunk-PBBMWRNE.mjs';
4
+ //# sourceMappingURL=protocolViewerParsers-DTJLHUCH.mjs.map
5
+ //# sourceMappingURL=protocolViewerParsers-DTJLHUCH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"protocolViewerParsers-DTJLHUCH.mjs"}