@zenland/sdk 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -102,6 +102,7 @@ query Agent($id: String!) {
102
102
  contact
103
103
  totalResolved
104
104
  activeCases
105
+ totalEscrowsAssigned
105
106
  registrationTime
106
107
  lastEngagementTimestamp
107
108
  totalEarnings
@@ -142,6 +143,7 @@ query Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $li
142
143
  contact
143
144
  totalResolved
144
145
  activeCases
146
+ totalEscrowsAssigned
145
147
  registrationTime
146
148
  lastEngagementTimestamp
147
149
  totalEarnings
@@ -243,6 +245,11 @@ query protocolStats($id: String! = "mainnet") {
243
245
  totalAgentsRegistered
244
246
  activeAgentsCount
245
247
  }
248
+ agents(where: { isActive: true }, limit: 1000) {
249
+ items {
250
+ stablecoinStake
251
+ }
252
+ }
246
253
  }
247
254
  `;
248
255
  var TRANSACTION_LOGS_QUERY = `
@@ -376,14 +383,21 @@ function createAgentsDomain(baseUrl) {
376
383
 
377
384
  // src/domains/protocol-stats.ts
378
385
  var DEFAULT_STATS_ID = "mainnet";
379
- function normalizeProtocolStats(raw) {
386
+ function normalizeProtocolStats(raw, activeAgents) {
387
+ const escrowTVL = BigInt(raw.currentTVL);
388
+ const agentStakingTVL = activeAgents.reduce(
389
+ (sum, a) => sum + BigInt(a.stablecoinStake),
390
+ 0n
391
+ );
380
392
  return {
381
393
  id: raw.id,
382
394
  chainId: raw.chainId,
383
395
  totalEscrowsCreated: raw.totalEscrowsCreated,
384
396
  totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),
385
397
  totalFeesCollected: BigInt(raw.totalFeesCollected),
386
- currentTVL: BigInt(raw.currentTVL),
398
+ currentTVL: escrowTVL + agentStakingTVL,
399
+ escrowTVL,
400
+ agentStakingTVL,
387
401
  activeEscrowCount: raw.activeEscrowCount,
388
402
  totalAgentsRegistered: raw.totalAgentsRegistered,
389
403
  activeAgentsCount: raw.activeAgentsCount
@@ -400,7 +414,7 @@ function createProtocolStatsDomain(baseUrl) {
400
414
  if (!response.protocolStats) {
401
415
  return null;
402
416
  }
403
- return normalizeProtocolStats(response.protocolStats);
417
+ return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);
404
418
  }
405
419
  async function getRaw(options) {
406
420
  const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/agents/eligibility.ts"],"sourcesContent":["/**\n * @zenland/sdk\n *\n * Official SDK for interacting with the Zenland escrow protocol indexer.\n *\n * @example\n * ```typescript\n * import { createZenlandClient, zenland } from '@zenland/sdk';\n *\n * // Use the default client (production API)\n * const escrows = await zenland.escrows.list();\n *\n * // Or create a custom client\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n * const agents = await client.agents.list({ onlyActive: true });\n * ```\n */\n\n// Main client\nexport { createZenlandClient, zenland } from \"./client\";\nexport type { ZenlandClient, ZenlandClientConfig } from \"./client\";\n\n// Domain modules (for advanced usage)\nexport {\n createEscrowsDomain,\n createAgentsDomain,\n createProtocolStatsDomain,\n createTransactionLogsDomain,\n STATE_GROUPS,\n} from \"./domains\";\nexport type {\n EscrowsDomain,\n AgentsDomain,\n ProtocolStatsDomain,\n TransactionLogsDomain,\n ListEscrowsArgs,\n ListAgentsArgs,\n ListTransactionLogsArgs,\n StateGroup,\n ProtocolStats,\n} from \"./domains\";\n\n// Types\nexport type {\n // GraphQL types\n GqlAgent,\n GqlAgentCase,\n GqlAgentCasePage,\n GqlAgentPage,\n GqlAgentFilter,\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n GqlProtocolStats,\n GqlTransactionLog,\n GqlTransactionLogPage,\n GqlTransactionLogFilter,\n GqlPageInfo,\n BigIntScalar,\n Maybe,\n InputMaybe,\n} from \"./generated/types\";\n\n// Protocol / business-logic utilities\nexport {\n computeAgentMavUsd,\n isAgentEligibleForEscrow,\n} from \"./agents/eligibility\";\nexport type {\n IndexerAgent,\n AgentEligibilityFailureReason,\n AgentEligibilityResult,\n} from \"./agents/eligibility\";\n\n// Errors\nexport { ZenlandGraphQLError, ZenlandRequestError } from \"./request\";\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n currentTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(raw: GqlProtocolStats): ProtocolStats {\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: BigInt(raw.currentTVL),\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","/**\n * Agent eligibility utilities.\n *\n * This is protocol/business logic (React-agnostic) and is safe to consume\n * from any app (interface, backend, bots, etc.).\n */\n\n/**\n * Minimal view of an Agent returned by the indexer.\n */\nexport type IndexerAgent = {\n id: string;\n isActive: boolean;\n isAvailable: boolean;\n stablecoinStake: bigint;\n stablecoinDecimals: number;\n registrationTime: bigint;\n activeCases: number;\n totalResolved: number;\n};\n\nexport type AgentEligibilityFailureReason =\n | \"NOT_REGISTERED\"\n | \"NOT_ACTIVE\"\n | \"NOT_AVAILABLE\"\n | \"INSUFFICIENT_MAV\";\n\nexport type AgentEligibilityResult =\n | {\n ok: true;\n agentMavUsd: bigint;\n requiredUsd: bigint;\n }\n | {\n ok: false;\n reason: AgentEligibilityFailureReason;\n agentMavUsd?: bigint;\n requiredUsd: bigint;\n };\n\n/**\n * MAV multiplier - how much MAV you get per dollar staked.\n * $1 stake * 20 = $20 MAV\n */\nconst MAV_MULTIPLIER = 20n;\n\n/**\n * Compute agent MAV from its stablecoin stake.\n *\n * Bigint-safe:\n * - stablecoinStake is in smallest units (stablecoinDecimals)\n * - return MAV in the same smallest units (stablecoinDecimals)\n */\nexport function computeAgentMavUsd(\n agent: Pick<IndexerAgent, \"stablecoinStake\" | \"stablecoinDecimals\">,\n): bigint {\n // decimals are not used in arithmetic; they’re carried for formatting.\n // MAV is a simple multiplier in the same units.\n return BigInt(agent.stablecoinStake) * MAV_MULTIPLIER;\n}\n\n/**\n * Evaluate whether an agent is eligible for a given escrow amount.\n *\n * NOTE: escrowAmount must be the escrow principal ONLY (fees excluded).\n */\nexport function isAgentEligibleForEscrow(args: {\n agent: IndexerAgent | null | undefined;\n escrowAmount: bigint;\n}): AgentEligibilityResult {\n const requiredUsd = args.escrowAmount;\n\n if (!args.agent) {\n return { ok: false, reason: \"NOT_REGISTERED\", requiredUsd };\n }\n\n if (!args.agent.isActive) {\n return { ok: false, reason: \"NOT_ACTIVE\", requiredUsd };\n }\n\n if (!args.agent.isAvailable) {\n return { ok: false, reason: \"NOT_AVAILABLE\", requiredUsd };\n }\n\n const agentMavUsd = computeAgentMavUsd(args.agent);\n\n if (agentMavUsd < requiredUsd) {\n return { ok: false, reason: \"INSUFFICIENT_MAV\", agentMavUsd, requiredUsd };\n }\n\n return { ok: true, agentMavUsd, requiredUsd };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/agents/eligibility.ts"],"sourcesContent":["/**\n * @zenland/sdk\n *\n * Official SDK for interacting with the Zenland escrow protocol indexer.\n *\n * @example\n * ```typescript\n * import { createZenlandClient, zenland } from '@zenland/sdk';\n *\n * // Use the default client (production API)\n * const escrows = await zenland.escrows.list();\n *\n * // Or create a custom client\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n * const agents = await client.agents.list({ onlyActive: true });\n * ```\n */\n\n// Main client\nexport { createZenlandClient, zenland } from \"./client\";\nexport type { ZenlandClient, ZenlandClientConfig } from \"./client\";\n\n// Domain modules (for advanced usage)\nexport {\n createEscrowsDomain,\n createAgentsDomain,\n createProtocolStatsDomain,\n createTransactionLogsDomain,\n STATE_GROUPS,\n} from \"./domains\";\nexport type {\n EscrowsDomain,\n AgentsDomain,\n ProtocolStatsDomain,\n TransactionLogsDomain,\n ListEscrowsArgs,\n ListAgentsArgs,\n ListTransactionLogsArgs,\n StateGroup,\n ProtocolStats,\n} from \"./domains\";\n\n// Types\nexport type {\n // GraphQL types\n GqlAgent,\n GqlAgentCase,\n GqlAgentCasePage,\n GqlAgentPage,\n GqlAgentFilter,\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n GqlProtocolStats,\n GqlTransactionLog,\n GqlTransactionLogPage,\n GqlTransactionLogFilter,\n GqlPageInfo,\n BigIntScalar,\n Maybe,\n InputMaybe,\n} from \"./generated/types\";\n\n// Protocol / business-logic utilities\nexport {\n computeAgentMavUsd,\n isAgentEligibleForEscrow,\n} from \"./agents/eligibility\";\nexport type {\n IndexerAgent,\n AgentEligibilityFailureReason,\n AgentEligibilityResult,\n} from \"./agents/eligibility\";\n\n// Errors\nexport { ZenlandGraphQLError, ZenlandRequestError } from \"./request\";\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n agents(where: { isActive: true }, limit: 1000) {\n items {\n stablecoinStake\n }\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n /** True TVL = escrowTVL + agentStakingTVL */\n currentTVL: bigint;\n /** TVL held in active escrow contracts only */\n escrowTVL: bigint;\n /** TVL held as agent stablecoin collateral in the registry */\n agentStakingTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(\n raw: GqlProtocolStats,\n activeAgents: Array<{ stablecoinStake: string | number | bigint }>,\n): ProtocolStats {\n const escrowTVL = BigInt(raw.currentTVL);\n const agentStakingTVL = activeAgents.reduce(\n (sum, a) => sum + BigInt(a.stablecoinStake),\n 0n,\n );\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: escrowTVL + agentStakingTVL,\n escrowTVL,\n agentStakingTVL,\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","/**\n * Agent eligibility utilities.\n *\n * This is protocol/business logic (React-agnostic) and is safe to consume\n * from any app (interface, backend, bots, etc.).\n */\n\n/**\n * Minimal view of an Agent returned by the indexer.\n */\nexport type IndexerAgent = {\n id: string;\n isActive: boolean;\n isAvailable: boolean;\n stablecoinStake: bigint;\n stablecoinDecimals: number;\n registrationTime: bigint;\n activeCases: number;\n totalResolved: number;\n};\n\nexport type AgentEligibilityFailureReason =\n | \"NOT_REGISTERED\"\n | \"NOT_ACTIVE\"\n | \"NOT_AVAILABLE\"\n | \"INSUFFICIENT_MAV\";\n\nexport type AgentEligibilityResult =\n | {\n ok: true;\n agentMavUsd: bigint;\n requiredUsd: bigint;\n }\n | {\n ok: false;\n reason: AgentEligibilityFailureReason;\n agentMavUsd?: bigint;\n requiredUsd: bigint;\n };\n\n/**\n * MAV multiplier - how much MAV you get per dollar staked.\n * $1 stake * 20 = $20 MAV\n */\nconst MAV_MULTIPLIER = 20n;\n\n/**\n * Compute agent MAV from its stablecoin stake.\n *\n * Bigint-safe:\n * - stablecoinStake is in smallest units (stablecoinDecimals)\n * - return MAV in the same smallest units (stablecoinDecimals)\n */\nexport function computeAgentMavUsd(\n agent: Pick<IndexerAgent, \"stablecoinStake\" | \"stablecoinDecimals\">,\n): bigint {\n // decimals are not used in arithmetic; they’re carried for formatting.\n // MAV is a simple multiplier in the same units.\n return BigInt(agent.stablecoinStake) * MAV_MULTIPLIER;\n}\n\n/**\n * Evaluate whether an agent is eligible for a given escrow amount.\n *\n * NOTE: escrowAmount must be the escrow principal ONLY (fees excluded).\n */\nexport function isAgentEligibleForEscrow(args: {\n agent: IndexerAgent | null | undefined;\n escrowAmount: bigint;\n}): AgentEligibilityResult {\n const requiredUsd = args.escrowAmount;\n\n if (!args.agent) {\n return { ok: false, reason: \"NOT_REGISTERED\", requiredUsd };\n }\n\n if (!args.agent.isActive) {\n return { ok: false, reason: \"NOT_ACTIVE\", requiredUsd };\n }\n\n if (!args.agent.isAvailable) {\n return { ok: false, reason: \"NOT_AVAILABLE\", requiredUsd };\n }\n\n const agentMavUsd = computeAgentMavUsd(args.agent);\n\n if (agentMavUsd < requiredUsd) {\n return { ok: false, reason: \"INSUFFICIENT_MAV\", agentMavUsd, requiredUsd };\n }\n\n return { ok: true, agentMavUsd, requiredUsd };\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -27,6 +27,7 @@ interface GqlAgent {
27
27
  contact: string;
28
28
  totalResolved: number;
29
29
  activeCases: number;
30
+ totalEscrowsAssigned: number;
30
31
  registrationTime: BigIntScalar;
31
32
  lastEngagementTimestamp: BigIntScalar;
32
33
  totalEarnings: BigIntScalar;
@@ -221,7 +222,12 @@ interface ProtocolStats {
221
222
  totalEscrowsCreated: number;
222
223
  totalVolumeEscrowed: bigint;
223
224
  totalFeesCollected: bigint;
225
+ /** True TVL = escrowTVL + agentStakingTVL */
224
226
  currentTVL: bigint;
227
+ /** TVL held in active escrow contracts only */
228
+ escrowTVL: bigint;
229
+ /** TVL held as agent stablecoin collateral in the registry */
230
+ agentStakingTVL: bigint;
225
231
  activeEscrowCount: number;
226
232
  totalAgentsRegistered: number;
227
233
  activeAgentsCount: number;
package/dist/index.d.ts CHANGED
@@ -27,6 +27,7 @@ interface GqlAgent {
27
27
  contact: string;
28
28
  totalResolved: number;
29
29
  activeCases: number;
30
+ totalEscrowsAssigned: number;
30
31
  registrationTime: BigIntScalar;
31
32
  lastEngagementTimestamp: BigIntScalar;
32
33
  totalEarnings: BigIntScalar;
@@ -221,7 +222,12 @@ interface ProtocolStats {
221
222
  totalEscrowsCreated: number;
222
223
  totalVolumeEscrowed: bigint;
223
224
  totalFeesCollected: bigint;
225
+ /** True TVL = escrowTVL + agentStakingTVL */
224
226
  currentTVL: bigint;
227
+ /** TVL held in active escrow contracts only */
228
+ escrowTVL: bigint;
229
+ /** TVL held as agent stablecoin collateral in the registry */
230
+ agentStakingTVL: bigint;
225
231
  activeEscrowCount: number;
226
232
  totalAgentsRegistered: number;
227
233
  activeAgentsCount: number;
package/dist/index.js CHANGED
@@ -66,6 +66,7 @@ query Agent($id: String!) {
66
66
  contact
67
67
  totalResolved
68
68
  activeCases
69
+ totalEscrowsAssigned
69
70
  registrationTime
70
71
  lastEngagementTimestamp
71
72
  totalEarnings
@@ -106,6 +107,7 @@ query Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $li
106
107
  contact
107
108
  totalResolved
108
109
  activeCases
110
+ totalEscrowsAssigned
109
111
  registrationTime
110
112
  lastEngagementTimestamp
111
113
  totalEarnings
@@ -207,6 +209,11 @@ query protocolStats($id: String! = "mainnet") {
207
209
  totalAgentsRegistered
208
210
  activeAgentsCount
209
211
  }
212
+ agents(where: { isActive: true }, limit: 1000) {
213
+ items {
214
+ stablecoinStake
215
+ }
216
+ }
210
217
  }
211
218
  `;
212
219
  var TRANSACTION_LOGS_QUERY = `
@@ -340,14 +347,21 @@ function createAgentsDomain(baseUrl) {
340
347
 
341
348
  // src/domains/protocol-stats.ts
342
349
  var DEFAULT_STATS_ID = "mainnet";
343
- function normalizeProtocolStats(raw) {
350
+ function normalizeProtocolStats(raw, activeAgents) {
351
+ const escrowTVL = BigInt(raw.currentTVL);
352
+ const agentStakingTVL = activeAgents.reduce(
353
+ (sum, a) => sum + BigInt(a.stablecoinStake),
354
+ 0n
355
+ );
344
356
  return {
345
357
  id: raw.id,
346
358
  chainId: raw.chainId,
347
359
  totalEscrowsCreated: raw.totalEscrowsCreated,
348
360
  totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),
349
361
  totalFeesCollected: BigInt(raw.totalFeesCollected),
350
- currentTVL: BigInt(raw.currentTVL),
362
+ currentTVL: escrowTVL + agentStakingTVL,
363
+ escrowTVL,
364
+ agentStakingTVL,
351
365
  activeEscrowCount: raw.activeEscrowCount,
352
366
  totalAgentsRegistered: raw.totalAgentsRegistered,
353
367
  activeAgentsCount: raw.activeAgentsCount
@@ -364,7 +378,7 @@ function createProtocolStatsDomain(baseUrl) {
364
378
  if (!response.protocolStats) {
365
379
  return null;
366
380
  }
367
- return normalizeProtocolStats(response.protocolStats);
381
+ return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);
368
382
  }
369
383
  async function getRaw(options) {
370
384
  const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/agents/eligibility.ts"],"sourcesContent":["/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n currentTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(raw: GqlProtocolStats): ProtocolStats {\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: BigInt(raw.currentTVL),\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","/**\n * Agent eligibility utilities.\n *\n * This is protocol/business logic (React-agnostic) and is safe to consume\n * from any app (interface, backend, bots, etc.).\n */\n\n/**\n * Minimal view of an Agent returned by the indexer.\n */\nexport type IndexerAgent = {\n id: string;\n isActive: boolean;\n isAvailable: boolean;\n stablecoinStake: bigint;\n stablecoinDecimals: number;\n registrationTime: bigint;\n activeCases: number;\n totalResolved: number;\n};\n\nexport type AgentEligibilityFailureReason =\n | \"NOT_REGISTERED\"\n | \"NOT_ACTIVE\"\n | \"NOT_AVAILABLE\"\n | \"INSUFFICIENT_MAV\";\n\nexport type AgentEligibilityResult =\n | {\n ok: true;\n agentMavUsd: bigint;\n requiredUsd: bigint;\n }\n | {\n ok: false;\n reason: AgentEligibilityFailureReason;\n agentMavUsd?: bigint;\n requiredUsd: bigint;\n };\n\n/**\n * MAV multiplier - how much MAV you get per dollar staked.\n * $1 stake * 20 = $20 MAV\n */\nconst MAV_MULTIPLIER = 20n;\n\n/**\n * Compute agent MAV from its stablecoin stake.\n *\n * Bigint-safe:\n * - stablecoinStake is in smallest units (stablecoinDecimals)\n * - return MAV in the same smallest units (stablecoinDecimals)\n */\nexport function computeAgentMavUsd(\n agent: Pick<IndexerAgent, \"stablecoinStake\" | \"stablecoinDecimals\">,\n): bigint {\n // decimals are not used in arithmetic; they’re carried for formatting.\n // MAV is a simple multiplier in the same units.\n return BigInt(agent.stablecoinStake) * MAV_MULTIPLIER;\n}\n\n/**\n * Evaluate whether an agent is eligible for a given escrow amount.\n *\n * NOTE: escrowAmount must be the escrow principal ONLY (fees excluded).\n */\nexport function isAgentEligibleForEscrow(args: {\n agent: IndexerAgent | null | undefined;\n escrowAmount: bigint;\n}): AgentEligibilityResult {\n const requiredUsd = args.escrowAmount;\n\n if (!args.agent) {\n return { ok: false, reason: \"NOT_REGISTERED\", requiredUsd };\n }\n\n if (!args.agent.isActive) {\n return { ok: false, reason: \"NOT_ACTIVE\", requiredUsd };\n }\n\n if (!args.agent.isAvailable) {\n return { ok: false, reason: \"NOT_AVAILABLE\", requiredUsd };\n }\n\n const agentMavUsd = computeAgentMavUsd(args.agent);\n\n if (agentMavUsd < requiredUsd) {\n return { ok: false, reason: \"INSUFFICIENT_MAV\", agentMavUsd, requiredUsd };\n }\n\n return { ok: true, agentMavUsd, requiredUsd };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/agents/eligibility.ts"],"sourcesContent":["/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n agents(where: { isActive: true }, limit: 1000) {\n items {\n stablecoinStake\n }\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n /** True TVL = escrowTVL + agentStakingTVL */\n currentTVL: bigint;\n /** TVL held in active escrow contracts only */\n escrowTVL: bigint;\n /** TVL held as agent stablecoin collateral in the registry */\n agentStakingTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(\n raw: GqlProtocolStats,\n activeAgents: Array<{ stablecoinStake: string | number | bigint }>,\n): ProtocolStats {\n const escrowTVL = BigInt(raw.currentTVL);\n const agentStakingTVL = activeAgents.reduce(\n (sum, a) => sum + BigInt(a.stablecoinStake),\n 0n,\n );\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: escrowTVL + agentStakingTVL,\n escrowTVL,\n agentStakingTVL,\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","/**\n * Agent eligibility utilities.\n *\n * This is protocol/business logic (React-agnostic) and is safe to consume\n * from any app (interface, backend, bots, etc.).\n */\n\n/**\n * Minimal view of an Agent returned by the indexer.\n */\nexport type IndexerAgent = {\n id: string;\n isActive: boolean;\n isAvailable: boolean;\n stablecoinStake: bigint;\n stablecoinDecimals: number;\n registrationTime: bigint;\n activeCases: number;\n totalResolved: number;\n};\n\nexport type AgentEligibilityFailureReason =\n | \"NOT_REGISTERED\"\n | \"NOT_ACTIVE\"\n | \"NOT_AVAILABLE\"\n | \"INSUFFICIENT_MAV\";\n\nexport type AgentEligibilityResult =\n | {\n ok: true;\n agentMavUsd: bigint;\n requiredUsd: bigint;\n }\n | {\n ok: false;\n reason: AgentEligibilityFailureReason;\n agentMavUsd?: bigint;\n requiredUsd: bigint;\n };\n\n/**\n * MAV multiplier - how much MAV you get per dollar staked.\n * $1 stake * 20 = $20 MAV\n */\nconst MAV_MULTIPLIER = 20n;\n\n/**\n * Compute agent MAV from its stablecoin stake.\n *\n * Bigint-safe:\n * - stablecoinStake is in smallest units (stablecoinDecimals)\n * - return MAV in the same smallest units (stablecoinDecimals)\n */\nexport function computeAgentMavUsd(\n agent: Pick<IndexerAgent, \"stablecoinStake\" | \"stablecoinDecimals\">,\n): bigint {\n // decimals are not used in arithmetic; they’re carried for formatting.\n // MAV is a simple multiplier in the same units.\n return BigInt(agent.stablecoinStake) * MAV_MULTIPLIER;\n}\n\n/**\n * Evaluate whether an agent is eligible for a given escrow amount.\n *\n * NOTE: escrowAmount must be the escrow principal ONLY (fees excluded).\n */\nexport function isAgentEligibleForEscrow(args: {\n agent: IndexerAgent | null | undefined;\n escrowAmount: bigint;\n}): AgentEligibilityResult {\n const requiredUsd = args.escrowAmount;\n\n if (!args.agent) {\n return { ok: false, reason: \"NOT_REGISTERED\", requiredUsd };\n }\n\n if (!args.agent.isActive) {\n return { ok: false, reason: \"NOT_ACTIVE\", requiredUsd };\n }\n\n if (!args.agent.isAvailable) {\n return { ok: false, reason: \"NOT_AVAILABLE\", requiredUsd };\n }\n\n const agentMavUsd = computeAgentMavUsd(args.agent);\n\n if (agentMavUsd < requiredUsd) {\n return { ok: false, reason: \"INSUFFICIENT_MAV\", agentMavUsd, requiredUsd };\n }\n\n return { ok: true, agentMavUsd, requiredUsd };\n}\n"],"mappings":"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","names":[]}
package/dist/react.cjs CHANGED
@@ -109,6 +109,7 @@ query Agent($id: String!) {
109
109
  contact
110
110
  totalResolved
111
111
  activeCases
112
+ totalEscrowsAssigned
112
113
  registrationTime
113
114
  lastEngagementTimestamp
114
115
  totalEarnings
@@ -149,6 +150,7 @@ query Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $li
149
150
  contact
150
151
  totalResolved
151
152
  activeCases
153
+ totalEscrowsAssigned
152
154
  registrationTime
153
155
  lastEngagementTimestamp
154
156
  totalEarnings
@@ -250,6 +252,11 @@ query protocolStats($id: String! = "mainnet") {
250
252
  totalAgentsRegistered
251
253
  activeAgentsCount
252
254
  }
255
+ agents(where: { isActive: true }, limit: 1000) {
256
+ items {
257
+ stablecoinStake
258
+ }
259
+ }
253
260
  }
254
261
  `;
255
262
  var TRANSACTION_LOGS_QUERY = `
@@ -383,14 +390,21 @@ function createAgentsDomain(baseUrl) {
383
390
 
384
391
  // src/domains/protocol-stats.ts
385
392
  var DEFAULT_STATS_ID = "mainnet";
386
- function normalizeProtocolStats(raw) {
393
+ function normalizeProtocolStats(raw, activeAgents) {
394
+ const escrowTVL = BigInt(raw.currentTVL);
395
+ const agentStakingTVL = activeAgents.reduce(
396
+ (sum, a) => sum + BigInt(a.stablecoinStake),
397
+ 0n
398
+ );
387
399
  return {
388
400
  id: raw.id,
389
401
  chainId: raw.chainId,
390
402
  totalEscrowsCreated: raw.totalEscrowsCreated,
391
403
  totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),
392
404
  totalFeesCollected: BigInt(raw.totalFeesCollected),
393
- currentTVL: BigInt(raw.currentTVL),
405
+ currentTVL: escrowTVL + agentStakingTVL,
406
+ escrowTVL,
407
+ agentStakingTVL,
394
408
  activeEscrowCount: raw.activeEscrowCount,
395
409
  totalAgentsRegistered: raw.totalAgentsRegistered,
396
410
  activeAgentsCount: raw.activeAgentsCount
@@ -407,7 +421,7 @@ function createProtocolStatsDomain(baseUrl) {
407
421
  if (!response.protocolStats) {
408
422
  return null;
409
423
  }
410
- return normalizeProtocolStats(response.protocolStats);
424
+ return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);
411
425
  }
412
426
  async function getRaw(options) {
413
427
  const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts","../src/react/context.tsx","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/react/hooks/useEscrow.ts","../src/react/hooks/useEscrows.ts","../src/react/hooks/useAgent.ts","../src/react/hooks/useAgents.ts","../src/react/hooks/useProtocolStats.ts","../src/react/hooks/useRecentEscrows.ts","../src/react/hooks/useUserStats.ts","../src/react/hooks/useTransactionLogsByEscrow.ts"],"sourcesContent":["/**\n * @zenland/sdk/react\n *\n * React hooks and components for the Zenland SDK.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider, useEscrows, useAgent } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <MyComponent />\n * </ZenlandProvider>\n * );\n * }\n *\n * function MyComponent() {\n * const { data: escrows } = useEscrows({ address: '0x...' });\n * const { data: agent } = useAgent('0x...');\n * // ...\n * }\n * ```\n */\n\n// Context and provider\nexport { ZenlandProvider, useZenlandClient, useZenlandClientOptional } from \"./react/context\";\nexport type { ZenlandProviderProps } from \"./react/context\";\n\n// Hooks\nexport {\n useEscrow,\n useEscrows,\n useAgent,\n useAgents,\n useProtocolStats,\n useUserStats,\n useGlobalStats,\n useTransactionLogsByEscrow,\n useRecentEscrows,\n STATE_GROUPS,\n} from \"./react/hooks\";\nexport type {\n UseEscrowOptions,\n UseEscrowsArgs,\n EscrowRole,\n EscrowStateTab,\n UseAgentOptions,\n UseAgentsArgs,\n UseProtocolStatsOptions,\n UseRecentEscrowsOptions,\n UserDashboardStats,\n UseTransactionLogsByEscrowOptions,\n ProtocolStats,\n} from \"./react/hooks\";\n\n// Re-export types from core for convenience\nexport type {\n GqlAgent,\n GqlAgentPage,\n GqlEscrow,\n GqlEscrowPage,\n GqlProtocolStats,\n GqlTransactionLog,\n GqlPageInfo,\n} from \"./generated/types\";\n\n// Re-export client for advanced usage\nexport { createZenlandClient } from \"./client\";\nexport type { ZenlandClient, ZenlandClientConfig } from \"./client\";\n","\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { createZenlandClient, type ZenlandClient, type ZenlandClientConfig } from \"../client\";\n\nconst ZenlandContext = createContext<ZenlandClient | null>(null);\n\nexport interface ZenlandProviderProps {\n children: ReactNode;\n /** Optional configuration for the SDK client */\n config?: ZenlandClientConfig;\n}\n\n/**\n * Provider component for the Zenland SDK.\n *\n * Wrap your app with this provider to use the React hooks.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <YourApp />\n * </ZenlandProvider>\n * );\n * }\n *\n * // With custom config\n * <ZenlandProvider config={{ baseUrl: 'http://localhost:42069' }}>\n * <YourApp />\n * </ZenlandProvider>\n * ```\n */\nexport function ZenlandProvider({ children, config }: ZenlandProviderProps) {\n const client = useMemo(() => createZenlandClient(config), [config]);\n\n return <ZenlandContext.Provider value={client}>{children}</ZenlandContext.Provider>;\n}\n\n/**\n * Hook to access the Zenland SDK client.\n *\n * Must be used within a ZenlandProvider.\n *\n * @example\n * ```tsx\n * import { useZenlandClient } from '@zenland/sdk/react';\n *\n * function MyComponent() {\n * const client = useZenlandClient();\n * // Use client.escrows, client.agents, etc.\n * }\n * ```\n */\nexport function useZenlandClient(): ZenlandClient {\n const context = useContext(ZenlandContext);\n if (!context) {\n throw new Error(\"useZenlandClient must be used within a ZenlandProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Zenland SDK client, creating a default one if not in a provider.\n *\n * This is useful for components that might be used outside of a ZenlandProvider.\n */\nexport function useZenlandClientOptional(): ZenlandClient {\n const context = useContext(ZenlandContext);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => context ?? createZenlandClient(), [context]);\n}\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n currentTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(raw: GqlProtocolStats): ProtocolStats {\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: BigInt(raw.currentTVL),\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single escrow by ID.\n *\n * @example\n * ```tsx\n * import { useEscrow } from '@zenland/sdk/react';\n *\n * function EscrowDetail({ id }: { id: string }) {\n * const { data: escrow, isLoading, error } = useEscrow(id);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!escrow) return <div>Escrow not found</div>;\n *\n * return <div>{escrow.state}</div>;\n * }\n * ```\n */\nexport function useEscrow(id: string | undefined, options?: UseEscrowOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlEscrow | null>({\n queryKey: [\"zenland\", \"escrow\", id],\n queryFn: () => {\n if (!id) return null;\n return client.escrows.getById(id);\n },\n enabled: !!id && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS, type StateGroup } from \"../../domains/escrows\";\nimport type { GqlEscrowPage } from \"../../generated/types\";\n\nexport type EscrowRole = \"all\" | \"buyer\" | \"seller\" | \"agent\";\nexport type EscrowStateTab = \"all\" | StateGroup;\n\nexport interface UseEscrowsArgs {\n /** User address to filter by */\n address?: string;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Filter by role (requires address) */\n role?: EscrowRole;\n /** Filter by state group */\n stateTab?: EscrowStateTab;\n /** Filter by specific state */\n state?: string;\n /** Filter by multiple states */\n states?: string[];\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch escrows with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useEscrows } from '@zenland/sdk/react';\n *\n * function MyEscrows({ address }: { address: string }) {\n * const { data, isLoading } = useEscrows({\n * address,\n * role: 'buyer',\n * stateTab: 'ACTIVE',\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(escrow => (\n * <li key={escrow.id}>{escrow.state}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useEscrows(args?: UseEscrowsArgs) {\n const client = useZenlandClientOptional();\n const { address, role = \"all\", stateTab, enabled = true } = args ?? {};\n\n // Determine states to filter based on stateTab\n const getStatesFromTab = (): string[] | undefined => {\n if (!stateTab || stateTab === \"all\") {\n return args?.states;\n }\n return [...STATE_GROUPS[stateTab]];\n };\n\n return useQuery<GqlEscrowPage>({\n queryKey: [\"zenland\", \"escrows\", address, role, stateTab, args?.state, args?.states, args?.limit, args?.offset],\n queryFn: async () => {\n if (!address) {\n return { items: [], totalCount: 0, pageInfo: { hasNextPage: false, hasPreviousPage: false } };\n }\n\n const states = getStatesFromTab();\n\n return client.escrows.list({\n limit: args?.limit,\n offset: args?.offset,\n buyer: role === \"buyer\" ? address : undefined,\n seller: role === \"seller\" ? address : undefined,\n agent: role === \"agent\" ? address : undefined,\n user: role === \"all\" ? address : undefined,\n state: args?.state,\n states,\n });\n },\n enabled: !!address && enabled,\n });\n}\n\n// Re-export for convenience\nexport { STATE_GROUPS } from \"../../domains/escrows\";\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgent } from \"../../generated/types\";\n\nexport interface UseAgentOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single agent by address.\n *\n * @example\n * ```tsx\n * import { useAgent } from '@zenland/sdk/react';\n *\n * function AgentProfile({ address }: { address: string }) {\n * const { data: agent, isLoading, error } = useAgent(address);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!agent) return <div>Agent not found</div>;\n *\n * return <div>{agent.description}</div>;\n * }\n * ```\n */\nexport function useAgent(address: string | undefined, options?: UseAgentOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlAgent | null>({\n queryKey: [\"zenland\", \"agent\", address],\n queryFn: () => {\n if (!address) return null;\n return client.agents.getById(address);\n },\n enabled: !!address && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgentPage } from \"../../generated/types\";\n\nexport interface UseAgentsArgs {\n /** Only return active agents */\n onlyActive?: boolean;\n /** Only return available agents */\n onlyAvailable?: boolean;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch agents with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useAgents } from '@zenland/sdk/react';\n *\n * function AgentList() {\n * const { data, isLoading } = useAgents({ onlyActive: true });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(agent => (\n * <li key={agent.id}>{agent.description}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useAgents(args?: UseAgentsArgs) {\n const client = useZenlandClientOptional();\n const { enabled = true, ...filterArgs } = args ?? {};\n\n return useQuery<GqlAgentPage>({\n queryKey: [\"zenland\", \"agents\", filterArgs.onlyActive, filterArgs.onlyAvailable, filterArgs.limit, filterArgs.offset],\n queryFn: () => client.agents.list(filterArgs),\n enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { ProtocolStats } from \"../../domains/protocol-stats\";\n\nexport interface UseProtocolStatsOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 60s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch global protocol statistics.\n *\n * @example\n * ```tsx\n * import { useProtocolStats } from '@zenland/sdk/react';\n *\n * function ProtocolOverview() {\n * const { data: stats, isLoading } = useProtocolStats();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!stats) return <div>Stats not available</div>;\n *\n * return (\n * <div>\n * <p>Total Escrows: {stats.totalEscrowsCreated}</p>\n * <p>TVL: {stats.currentTVL.toString()}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProtocolStats(options?: UseProtocolStatsOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<ProtocolStats | null>({\n queryKey: [\"zenland\", \"protocolStats\"],\n queryFn: () => client.protocolStats.get(),\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 30 * 1000, // 30 seconds\n refetchInterval: options?.refetchInterval ?? 60 * 1000, // 1 minute\n });\n}\n\nexport type { ProtocolStats };\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseRecentEscrowsOptions {\n /** Number of escrows to fetch (default: 5) */\n limit?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 15s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 30s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch recent escrows for activity feeds.\n *\n * @example\n * ```tsx\n * import { useRecentEscrows } from '@zenland/sdk/react';\n *\n * function ActivityFeed() {\n * const { data: escrows, isLoading } = useRecentEscrows({ limit: 10 });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {escrows?.map(escrow => (\n * <li key={escrow.id}>\n * {escrow.state} - {escrow.amount}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRecentEscrows(options?: UseRecentEscrowsOptions) {\n const client = useZenlandClientOptional();\n const limit = options?.limit ?? 5;\n\n return useQuery<GqlEscrow[]>({\n queryKey: [\"zenland\", \"recentEscrows\", limit],\n queryFn: async () => {\n const result = await client.escrows.list({\n limit,\n orderBy: \"createdAt\",\n orderDirection: \"desc\",\n });\n return result.items;\n },\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 15 * 1000, // 15 seconds\n refetchInterval: options?.refetchInterval ?? 30 * 1000, // 30 seconds\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS } from \"../../domains/escrows\";\nimport type { GqlEscrow, ZenlandClient } from \"../../index\";\n\n/** State groups for categorization */\nconst ACTIVE_STATES = STATE_GROUPS.ACTIVE;\nconst DISPUTE_STATES = STATE_GROUPS.IN_DISPUTE;\nconst COMPLETED_STATES = STATE_GROUPS.COMPLETED;\nconst TVL_STATES = [...ACTIVE_STATES, ...DISPUTE_STATES] as const;\n\nexport interface UserDashboardStats {\n activeCount: number;\n disputeCount: number;\n completedCount: number;\n tvl: bigint;\n recentEscrows: GqlEscrow[];\n}\n\n/**\n * Fetch count of escrows for a user filtered by states.\n */\nasync function fetchUserEscrowCount(\n client: ZenlandClient,\n userAddress: string,\n states: readonly string[],\n): Promise<number> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1,\n user: userLower,\n states: [...states],\n });\n\n return result.totalCount;\n}\n\n/**\n * Fetch user's escrows that contribute to TVL and calculate sum.\n */\nasync function fetchUserTVL(client: ZenlandClient, userAddress: string): Promise<bigint> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1000,\n user: userLower,\n states: [...TVL_STATES],\n });\n\n return result.items.reduce((sum, escrow) => sum + BigInt(escrow.amount), BigInt(0));\n}\n\n/**\n * Fetch user's recent escrows for dashboard display.\n */\nasync function fetchUserRecentEscrows(\n client: ZenlandClient,\n userAddress: string,\n limit: number = 5,\n): Promise<GqlEscrow[]> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit,\n user: userLower,\n });\n\n return result.items;\n}\n\n/**\n * Fetch all user dashboard stats in parallel.\n */\nasync function getUserDashboardStats(\n client: ZenlandClient,\n userAddress: string,\n): Promise<UserDashboardStats> {\n const [activeCount, disputeCount, completedCount, tvl, recentEscrows] = await Promise.all([\n fetchUserEscrowCount(client, userAddress, ACTIVE_STATES),\n fetchUserEscrowCount(client, userAddress, DISPUTE_STATES),\n fetchUserEscrowCount(client, userAddress, COMPLETED_STATES),\n fetchUserTVL(client, userAddress),\n fetchUserRecentEscrows(client, userAddress, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl,\n recentEscrows,\n };\n}\n\n/**\n * Fetch global dashboard stats.\n */\nasync function getGlobalDashboardStats(\n client: ZenlandClient,\n): Promise<Omit<UserDashboardStats, \"tvl\"> & { tvl: null }> {\n const [activeCount, disputeCount, completedCount, recentEscrows] = await Promise.all([\n fetchGlobalEscrowCount(client, [...ACTIVE_STATES]),\n fetchGlobalEscrowCount(client, [...DISPUTE_STATES]),\n fetchGlobalEscrowCount(client, [...COMPLETED_STATES]),\n fetchGlobalRecentEscrows(client, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl: null,\n recentEscrows,\n };\n}\n\nasync function fetchGlobalEscrowCount(client: ZenlandClient, states: string[]): Promise<number> {\n const result = await client.escrows.list({\n limit: 1,\n states,\n });\n return result.totalCount;\n}\n\nasync function fetchGlobalRecentEscrows(client: ZenlandClient, limit: number = 5): Promise<GqlEscrow[]> {\n const result = await client.escrows.list({ limit });\n return result.items;\n}\n\n/**\n * Hook to fetch user-specific dashboard statistics.\n */\nexport function useUserStats(userAddress: string | undefined) {\n const client = useZenlandClientOptional();\n return useQuery<UserDashboardStats | null>({\n queryKey: [\"zenland\", \"userStats\", userAddress],\n queryFn: async () => {\n if (!userAddress) return null;\n return getUserDashboardStats(client, userAddress);\n },\n enabled: !!userAddress,\n staleTime: 15 * 1000,\n refetchInterval: 30 * 1000,\n });\n}\n\n/**\n * Hook to fetch global dashboard statistics.\n */\nexport function useGlobalStats() {\n const client = useZenlandClientOptional();\n return useQuery({\n queryKey: [\"zenland\", \"globalStats\"],\n queryFn: () => getGlobalDashboardStats(client),\n staleTime: 30 * 1000,\n refetchInterval: 60 * 1000,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlTransactionLog } from \"../../generated/types\";\nimport type { ListTransactionLogsArgs } from \"../../domains/transaction-logs\";\n\nexport interface UseTransactionLogsByEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds */\n refetchInterval?: number;\n /** Transaction log list options */\n list?: Omit<ListTransactionLogsArgs, \"escrowAddress\">;\n}\n\n/**\n * Hook to fetch transaction logs for a specific escrow.\n */\nexport function useTransactionLogsByEscrow(\n escrowAddress: string | undefined | null,\n options?: UseTransactionLogsByEscrowOptions,\n) {\n const client = useZenlandClientOptional();\n const addr = escrowAddress?.toLowerCase();\n\n return useQuery<GqlTransactionLog[]>({\n queryKey: [\n \"zenland\",\n \"transactionLogs\",\n \"escrow\",\n addr,\n options?.list?.limit,\n options?.list?.offset,\n options?.list?.orderBy,\n options?.list?.orderDirection,\n ],\n queryFn: async () => {\n if (!addr) return [];\n return client.transactionLogs.getByEscrow(addr, options?.list);\n },\n enabled: !!addr && (options?.enabled ?? true),\n staleTime: options?.staleTime ?? 30_000,\n refetchInterval: options?.refetchInterval,\n refetchOnWindowFocus: false,\n });\n}\n"],"mappings":"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","names":["import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query"]}
1
+ {"version":3,"sources":["../src/react.ts","../src/react/context.tsx","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/react/hooks/useEscrow.ts","../src/react/hooks/useEscrows.ts","../src/react/hooks/useAgent.ts","../src/react/hooks/useAgents.ts","../src/react/hooks/useProtocolStats.ts","../src/react/hooks/useRecentEscrows.ts","../src/react/hooks/useUserStats.ts","../src/react/hooks/useTransactionLogsByEscrow.ts"],"sourcesContent":["/**\n * @zenland/sdk/react\n *\n * React hooks and components for the Zenland SDK.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider, useEscrows, useAgent } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <MyComponent />\n * </ZenlandProvider>\n * );\n * }\n *\n * function MyComponent() {\n * const { data: escrows } = useEscrows({ address: '0x...' });\n * const { data: agent } = useAgent('0x...');\n * // ...\n * }\n * ```\n */\n\n// Context and provider\nexport { ZenlandProvider, useZenlandClient, useZenlandClientOptional } from \"./react/context\";\nexport type { ZenlandProviderProps } from \"./react/context\";\n\n// Hooks\nexport {\n useEscrow,\n useEscrows,\n useAgent,\n useAgents,\n useProtocolStats,\n useUserStats,\n useGlobalStats,\n useTransactionLogsByEscrow,\n useRecentEscrows,\n STATE_GROUPS,\n} from \"./react/hooks\";\nexport type {\n UseEscrowOptions,\n UseEscrowsArgs,\n EscrowRole,\n EscrowStateTab,\n UseAgentOptions,\n UseAgentsArgs,\n UseProtocolStatsOptions,\n UseRecentEscrowsOptions,\n UserDashboardStats,\n UseTransactionLogsByEscrowOptions,\n ProtocolStats,\n} from \"./react/hooks\";\n\n// Re-export types from core for convenience\nexport type {\n GqlAgent,\n GqlAgentPage,\n GqlEscrow,\n GqlEscrowPage,\n GqlProtocolStats,\n GqlTransactionLog,\n GqlPageInfo,\n} from \"./generated/types\";\n\n// Re-export client for advanced usage\nexport { createZenlandClient } from \"./client\";\nexport type { ZenlandClient, ZenlandClientConfig } from \"./client\";\n","\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { createZenlandClient, type ZenlandClient, type ZenlandClientConfig } from \"../client\";\n\nconst ZenlandContext = createContext<ZenlandClient | null>(null);\n\nexport interface ZenlandProviderProps {\n children: ReactNode;\n /** Optional configuration for the SDK client */\n config?: ZenlandClientConfig;\n}\n\n/**\n * Provider component for the Zenland SDK.\n *\n * Wrap your app with this provider to use the React hooks.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <YourApp />\n * </ZenlandProvider>\n * );\n * }\n *\n * // With custom config\n * <ZenlandProvider config={{ baseUrl: 'http://localhost:42069' }}>\n * <YourApp />\n * </ZenlandProvider>\n * ```\n */\nexport function ZenlandProvider({ children, config }: ZenlandProviderProps) {\n const client = useMemo(() => createZenlandClient(config), [config]);\n\n return <ZenlandContext.Provider value={client}>{children}</ZenlandContext.Provider>;\n}\n\n/**\n * Hook to access the Zenland SDK client.\n *\n * Must be used within a ZenlandProvider.\n *\n * @example\n * ```tsx\n * import { useZenlandClient } from '@zenland/sdk/react';\n *\n * function MyComponent() {\n * const client = useZenlandClient();\n * // Use client.escrows, client.agents, etc.\n * }\n * ```\n */\nexport function useZenlandClient(): ZenlandClient {\n const context = useContext(ZenlandContext);\n if (!context) {\n throw new Error(\"useZenlandClient must be used within a ZenlandProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Zenland SDK client, creating a default one if not in a provider.\n *\n * This is useful for components that might be used outside of a ZenlandProvider.\n */\nexport function useZenlandClientOptional(): ZenlandClient {\n const context = useContext(ZenlandContext);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => context ?? createZenlandClient(), [context]);\n}\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n agents(where: { isActive: true }, limit: 1000) {\n items {\n stablecoinStake\n }\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n /** True TVL = escrowTVL + agentStakingTVL */\n currentTVL: bigint;\n /** TVL held in active escrow contracts only */\n escrowTVL: bigint;\n /** TVL held as agent stablecoin collateral in the registry */\n agentStakingTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(\n raw: GqlProtocolStats,\n activeAgents: Array<{ stablecoinStake: string | number | bigint }>,\n): ProtocolStats {\n const escrowTVL = BigInt(raw.currentTVL);\n const agentStakingTVL = activeAgents.reduce(\n (sum, a) => sum + BigInt(a.stablecoinStake),\n 0n,\n );\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: escrowTVL + agentStakingTVL,\n escrowTVL,\n agentStakingTVL,\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single escrow by ID.\n *\n * @example\n * ```tsx\n * import { useEscrow } from '@zenland/sdk/react';\n *\n * function EscrowDetail({ id }: { id: string }) {\n * const { data: escrow, isLoading, error } = useEscrow(id);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!escrow) return <div>Escrow not found</div>;\n *\n * return <div>{escrow.state}</div>;\n * }\n * ```\n */\nexport function useEscrow(id: string | undefined, options?: UseEscrowOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlEscrow | null>({\n queryKey: [\"zenland\", \"escrow\", id],\n queryFn: () => {\n if (!id) return null;\n return client.escrows.getById(id);\n },\n enabled: !!id && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS, type StateGroup } from \"../../domains/escrows\";\nimport type { GqlEscrowPage } from \"../../generated/types\";\n\nexport type EscrowRole = \"all\" | \"buyer\" | \"seller\" | \"agent\";\nexport type EscrowStateTab = \"all\" | StateGroup;\n\nexport interface UseEscrowsArgs {\n /** User address to filter by */\n address?: string;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Filter by role (requires address) */\n role?: EscrowRole;\n /** Filter by state group */\n stateTab?: EscrowStateTab;\n /** Filter by specific state */\n state?: string;\n /** Filter by multiple states */\n states?: string[];\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch escrows with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useEscrows } from '@zenland/sdk/react';\n *\n * function MyEscrows({ address }: { address: string }) {\n * const { data, isLoading } = useEscrows({\n * address,\n * role: 'buyer',\n * stateTab: 'ACTIVE',\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(escrow => (\n * <li key={escrow.id}>{escrow.state}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useEscrows(args?: UseEscrowsArgs) {\n const client = useZenlandClientOptional();\n const { address, role = \"all\", stateTab, enabled = true } = args ?? {};\n\n // Determine states to filter based on stateTab\n const getStatesFromTab = (): string[] | undefined => {\n if (!stateTab || stateTab === \"all\") {\n return args?.states;\n }\n return [...STATE_GROUPS[stateTab]];\n };\n\n return useQuery<GqlEscrowPage>({\n queryKey: [\"zenland\", \"escrows\", address, role, stateTab, args?.state, args?.states, args?.limit, args?.offset],\n queryFn: async () => {\n if (!address) {\n return { items: [], totalCount: 0, pageInfo: { hasNextPage: false, hasPreviousPage: false } };\n }\n\n const states = getStatesFromTab();\n\n return client.escrows.list({\n limit: args?.limit,\n offset: args?.offset,\n buyer: role === \"buyer\" ? address : undefined,\n seller: role === \"seller\" ? address : undefined,\n agent: role === \"agent\" ? address : undefined,\n user: role === \"all\" ? address : undefined,\n state: args?.state,\n states,\n });\n },\n enabled: !!address && enabled,\n });\n}\n\n// Re-export for convenience\nexport { STATE_GROUPS } from \"../../domains/escrows\";\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgent } from \"../../generated/types\";\n\nexport interface UseAgentOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single agent by address.\n *\n * @example\n * ```tsx\n * import { useAgent } from '@zenland/sdk/react';\n *\n * function AgentProfile({ address }: { address: string }) {\n * const { data: agent, isLoading, error } = useAgent(address);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!agent) return <div>Agent not found</div>;\n *\n * return <div>{agent.description}</div>;\n * }\n * ```\n */\nexport function useAgent(address: string | undefined, options?: UseAgentOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlAgent | null>({\n queryKey: [\"zenland\", \"agent\", address],\n queryFn: () => {\n if (!address) return null;\n return client.agents.getById(address);\n },\n enabled: !!address && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgentPage } from \"../../generated/types\";\n\nexport interface UseAgentsArgs {\n /** Only return active agents */\n onlyActive?: boolean;\n /** Only return available agents */\n onlyAvailable?: boolean;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch agents with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useAgents } from '@zenland/sdk/react';\n *\n * function AgentList() {\n * const { data, isLoading } = useAgents({ onlyActive: true });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(agent => (\n * <li key={agent.id}>{agent.description}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useAgents(args?: UseAgentsArgs) {\n const client = useZenlandClientOptional();\n const { enabled = true, ...filterArgs } = args ?? {};\n\n return useQuery<GqlAgentPage>({\n queryKey: [\"zenland\", \"agents\", filterArgs.onlyActive, filterArgs.onlyAvailable, filterArgs.limit, filterArgs.offset],\n queryFn: () => client.agents.list(filterArgs),\n enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { ProtocolStats } from \"../../domains/protocol-stats\";\n\nexport interface UseProtocolStatsOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 60s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch global protocol statistics.\n *\n * @example\n * ```tsx\n * import { useProtocolStats } from '@zenland/sdk/react';\n *\n * function ProtocolOverview() {\n * const { data: stats, isLoading } = useProtocolStats();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!stats) return <div>Stats not available</div>;\n *\n * return (\n * <div>\n * <p>Total Escrows: {stats.totalEscrowsCreated}</p>\n * <p>TVL: {stats.currentTVL.toString()}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProtocolStats(options?: UseProtocolStatsOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<ProtocolStats | null>({\n queryKey: [\"zenland\", \"protocolStats\"],\n queryFn: () => client.protocolStats.get(),\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 30 * 1000, // 30 seconds\n refetchInterval: options?.refetchInterval ?? 60 * 1000, // 1 minute\n });\n}\n\nexport type { ProtocolStats };\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseRecentEscrowsOptions {\n /** Number of escrows to fetch (default: 5) */\n limit?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 15s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 30s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch recent escrows for activity feeds.\n *\n * @example\n * ```tsx\n * import { useRecentEscrows } from '@zenland/sdk/react';\n *\n * function ActivityFeed() {\n * const { data: escrows, isLoading } = useRecentEscrows({ limit: 10 });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {escrows?.map(escrow => (\n * <li key={escrow.id}>\n * {escrow.state} - {escrow.amount}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRecentEscrows(options?: UseRecentEscrowsOptions) {\n const client = useZenlandClientOptional();\n const limit = options?.limit ?? 5;\n\n return useQuery<GqlEscrow[]>({\n queryKey: [\"zenland\", \"recentEscrows\", limit],\n queryFn: async () => {\n const result = await client.escrows.list({\n limit,\n orderBy: \"createdAt\",\n orderDirection: \"desc\",\n });\n return result.items;\n },\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 15 * 1000, // 15 seconds\n refetchInterval: options?.refetchInterval ?? 30 * 1000, // 30 seconds\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS } from \"../../domains/escrows\";\nimport type { GqlEscrow, ZenlandClient } from \"../../index\";\n\n/** State groups for categorization */\nconst ACTIVE_STATES = STATE_GROUPS.ACTIVE;\nconst DISPUTE_STATES = STATE_GROUPS.IN_DISPUTE;\nconst COMPLETED_STATES = STATE_GROUPS.COMPLETED;\nconst TVL_STATES = [...ACTIVE_STATES, ...DISPUTE_STATES] as const;\n\nexport interface UserDashboardStats {\n activeCount: number;\n disputeCount: number;\n completedCount: number;\n tvl: bigint;\n recentEscrows: GqlEscrow[];\n}\n\n/**\n * Fetch count of escrows for a user filtered by states.\n */\nasync function fetchUserEscrowCount(\n client: ZenlandClient,\n userAddress: string,\n states: readonly string[],\n): Promise<number> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1,\n user: userLower,\n states: [...states],\n });\n\n return result.totalCount;\n}\n\n/**\n * Fetch user's escrows that contribute to TVL and calculate sum.\n */\nasync function fetchUserTVL(client: ZenlandClient, userAddress: string): Promise<bigint> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1000,\n user: userLower,\n states: [...TVL_STATES],\n });\n\n return result.items.reduce((sum, escrow) => sum + BigInt(escrow.amount), BigInt(0));\n}\n\n/**\n * Fetch user's recent escrows for dashboard display.\n */\nasync function fetchUserRecentEscrows(\n client: ZenlandClient,\n userAddress: string,\n limit: number = 5,\n): Promise<GqlEscrow[]> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit,\n user: userLower,\n });\n\n return result.items;\n}\n\n/**\n * Fetch all user dashboard stats in parallel.\n */\nasync function getUserDashboardStats(\n client: ZenlandClient,\n userAddress: string,\n): Promise<UserDashboardStats> {\n const [activeCount, disputeCount, completedCount, tvl, recentEscrows] = await Promise.all([\n fetchUserEscrowCount(client, userAddress, ACTIVE_STATES),\n fetchUserEscrowCount(client, userAddress, DISPUTE_STATES),\n fetchUserEscrowCount(client, userAddress, COMPLETED_STATES),\n fetchUserTVL(client, userAddress),\n fetchUserRecentEscrows(client, userAddress, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl,\n recentEscrows,\n };\n}\n\n/**\n * Fetch global dashboard stats.\n */\nasync function getGlobalDashboardStats(\n client: ZenlandClient,\n): Promise<Omit<UserDashboardStats, \"tvl\"> & { tvl: null }> {\n const [activeCount, disputeCount, completedCount, recentEscrows] = await Promise.all([\n fetchGlobalEscrowCount(client, [...ACTIVE_STATES]),\n fetchGlobalEscrowCount(client, [...DISPUTE_STATES]),\n fetchGlobalEscrowCount(client, [...COMPLETED_STATES]),\n fetchGlobalRecentEscrows(client, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl: null,\n recentEscrows,\n };\n}\n\nasync function fetchGlobalEscrowCount(client: ZenlandClient, states: string[]): Promise<number> {\n const result = await client.escrows.list({\n limit: 1,\n states,\n });\n return result.totalCount;\n}\n\nasync function fetchGlobalRecentEscrows(client: ZenlandClient, limit: number = 5): Promise<GqlEscrow[]> {\n const result = await client.escrows.list({ limit });\n return result.items;\n}\n\n/**\n * Hook to fetch user-specific dashboard statistics.\n */\nexport function useUserStats(userAddress: string | undefined) {\n const client = useZenlandClientOptional();\n return useQuery<UserDashboardStats | null>({\n queryKey: [\"zenland\", \"userStats\", userAddress],\n queryFn: async () => {\n if (!userAddress) return null;\n return getUserDashboardStats(client, userAddress);\n },\n enabled: !!userAddress,\n staleTime: 15 * 1000,\n refetchInterval: 30 * 1000,\n });\n}\n\n/**\n * Hook to fetch global dashboard statistics.\n */\nexport function useGlobalStats() {\n const client = useZenlandClientOptional();\n return useQuery({\n queryKey: [\"zenland\", \"globalStats\"],\n queryFn: () => getGlobalDashboardStats(client),\n staleTime: 30 * 1000,\n refetchInterval: 60 * 1000,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlTransactionLog } from \"../../generated/types\";\nimport type { ListTransactionLogsArgs } from \"../../domains/transaction-logs\";\n\nexport interface UseTransactionLogsByEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds */\n refetchInterval?: number;\n /** Transaction log list options */\n list?: Omit<ListTransactionLogsArgs, \"escrowAddress\">;\n}\n\n/**\n * Hook to fetch transaction logs for a specific escrow.\n */\nexport function useTransactionLogsByEscrow(\n escrowAddress: string | undefined | null,\n options?: UseTransactionLogsByEscrowOptions,\n) {\n const client = useZenlandClientOptional();\n const addr = escrowAddress?.toLowerCase();\n\n return useQuery<GqlTransactionLog[]>({\n queryKey: [\n \"zenland\",\n \"transactionLogs\",\n \"escrow\",\n addr,\n options?.list?.limit,\n options?.list?.offset,\n options?.list?.orderBy,\n options?.list?.orderDirection,\n ],\n queryFn: async () => {\n if (!addr) return [];\n return client.transactionLogs.getByEscrow(addr, options?.list);\n },\n enabled: !!addr && (options?.enabled ?? true),\n staleTime: options?.staleTime ?? 30_000,\n refetchInterval: options?.refetchInterval,\n refetchOnWindowFocus: false,\n });\n}\n"],"mappings":"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","names":["import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query"]}
package/dist/react.d.cts CHANGED
@@ -30,6 +30,7 @@ interface GqlAgent {
30
30
  contact: string;
31
31
  totalResolved: number;
32
32
  activeCases: number;
33
+ totalEscrowsAssigned: number;
33
34
  registrationTime: BigIntScalar;
34
35
  lastEngagementTimestamp: BigIntScalar;
35
36
  totalEarnings: BigIntScalar;
@@ -191,7 +192,12 @@ interface ProtocolStats {
191
192
  totalEscrowsCreated: number;
192
193
  totalVolumeEscrowed: bigint;
193
194
  totalFeesCollected: bigint;
195
+ /** True TVL = escrowTVL + agentStakingTVL */
194
196
  currentTVL: bigint;
197
+ /** TVL held in active escrow contracts only */
198
+ escrowTVL: bigint;
199
+ /** TVL held as agent stablecoin collateral in the registry */
200
+ agentStakingTVL: bigint;
195
201
  activeEscrowCount: number;
196
202
  totalAgentsRegistered: number;
197
203
  activeAgentsCount: number;
package/dist/react.d.ts CHANGED
@@ -30,6 +30,7 @@ interface GqlAgent {
30
30
  contact: string;
31
31
  totalResolved: number;
32
32
  activeCases: number;
33
+ totalEscrowsAssigned: number;
33
34
  registrationTime: BigIntScalar;
34
35
  lastEngagementTimestamp: BigIntScalar;
35
36
  totalEarnings: BigIntScalar;
@@ -191,7 +192,12 @@ interface ProtocolStats {
191
192
  totalEscrowsCreated: number;
192
193
  totalVolumeEscrowed: bigint;
193
194
  totalFeesCollected: bigint;
195
+ /** True TVL = escrowTVL + agentStakingTVL */
194
196
  currentTVL: bigint;
197
+ /** TVL held in active escrow contracts only */
198
+ escrowTVL: bigint;
199
+ /** TVL held as agent stablecoin collateral in the registry */
200
+ agentStakingTVL: bigint;
195
201
  activeEscrowCount: number;
196
202
  totalAgentsRegistered: number;
197
203
  activeAgentsCount: number;
package/dist/react.js CHANGED
@@ -71,6 +71,7 @@ query Agent($id: String!) {
71
71
  contact
72
72
  totalResolved
73
73
  activeCases
74
+ totalEscrowsAssigned
74
75
  registrationTime
75
76
  lastEngagementTimestamp
76
77
  totalEarnings
@@ -111,6 +112,7 @@ query Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $li
111
112
  contact
112
113
  totalResolved
113
114
  activeCases
115
+ totalEscrowsAssigned
114
116
  registrationTime
115
117
  lastEngagementTimestamp
116
118
  totalEarnings
@@ -212,6 +214,11 @@ query protocolStats($id: String! = "mainnet") {
212
214
  totalAgentsRegistered
213
215
  activeAgentsCount
214
216
  }
217
+ agents(where: { isActive: true }, limit: 1000) {
218
+ items {
219
+ stablecoinStake
220
+ }
221
+ }
215
222
  }
216
223
  `;
217
224
  var TRANSACTION_LOGS_QUERY = `
@@ -345,14 +352,21 @@ function createAgentsDomain(baseUrl) {
345
352
 
346
353
  // src/domains/protocol-stats.ts
347
354
  var DEFAULT_STATS_ID = "mainnet";
348
- function normalizeProtocolStats(raw) {
355
+ function normalizeProtocolStats(raw, activeAgents) {
356
+ const escrowTVL = BigInt(raw.currentTVL);
357
+ const agentStakingTVL = activeAgents.reduce(
358
+ (sum, a) => sum + BigInt(a.stablecoinStake),
359
+ 0n
360
+ );
349
361
  return {
350
362
  id: raw.id,
351
363
  chainId: raw.chainId,
352
364
  totalEscrowsCreated: raw.totalEscrowsCreated,
353
365
  totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),
354
366
  totalFeesCollected: BigInt(raw.totalFeesCollected),
355
- currentTVL: BigInt(raw.currentTVL),
367
+ currentTVL: escrowTVL + agentStakingTVL,
368
+ escrowTVL,
369
+ agentStakingTVL,
356
370
  activeEscrowCount: raw.activeEscrowCount,
357
371
  totalAgentsRegistered: raw.totalAgentsRegistered,
358
372
  activeAgentsCount: raw.activeAgentsCount
@@ -369,7 +383,7 @@ function createProtocolStatsDomain(baseUrl) {
369
383
  if (!response.protocolStats) {
370
384
  return null;
371
385
  }
372
- return normalizeProtocolStats(response.protocolStats);
386
+ return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);
373
387
  }
374
388
  async function getRaw(options) {
375
389
  const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/context.tsx","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/react/hooks/useEscrow.ts","../src/react/hooks/useEscrows.ts","../src/react/hooks/useAgent.ts","../src/react/hooks/useAgents.ts","../src/react/hooks/useProtocolStats.ts","../src/react/hooks/useRecentEscrows.ts","../src/react/hooks/useUserStats.ts","../src/react/hooks/useTransactionLogsByEscrow.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { createZenlandClient, type ZenlandClient, type ZenlandClientConfig } from \"../client\";\n\nconst ZenlandContext = createContext<ZenlandClient | null>(null);\n\nexport interface ZenlandProviderProps {\n children: ReactNode;\n /** Optional configuration for the SDK client */\n config?: ZenlandClientConfig;\n}\n\n/**\n * Provider component for the Zenland SDK.\n *\n * Wrap your app with this provider to use the React hooks.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <YourApp />\n * </ZenlandProvider>\n * );\n * }\n *\n * // With custom config\n * <ZenlandProvider config={{ baseUrl: 'http://localhost:42069' }}>\n * <YourApp />\n * </ZenlandProvider>\n * ```\n */\nexport function ZenlandProvider({ children, config }: ZenlandProviderProps) {\n const client = useMemo(() => createZenlandClient(config), [config]);\n\n return <ZenlandContext.Provider value={client}>{children}</ZenlandContext.Provider>;\n}\n\n/**\n * Hook to access the Zenland SDK client.\n *\n * Must be used within a ZenlandProvider.\n *\n * @example\n * ```tsx\n * import { useZenlandClient } from '@zenland/sdk/react';\n *\n * function MyComponent() {\n * const client = useZenlandClient();\n * // Use client.escrows, client.agents, etc.\n * }\n * ```\n */\nexport function useZenlandClient(): ZenlandClient {\n const context = useContext(ZenlandContext);\n if (!context) {\n throw new Error(\"useZenlandClient must be used within a ZenlandProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Zenland SDK client, creating a default one if not in a provider.\n *\n * This is useful for components that might be used outside of a ZenlandProvider.\n */\nexport function useZenlandClientOptional(): ZenlandClient {\n const context = useContext(ZenlandContext);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => context ?? createZenlandClient(), [context]);\n}\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n currentTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(raw: GqlProtocolStats): ProtocolStats {\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: BigInt(raw.currentTVL),\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single escrow by ID.\n *\n * @example\n * ```tsx\n * import { useEscrow } from '@zenland/sdk/react';\n *\n * function EscrowDetail({ id }: { id: string }) {\n * const { data: escrow, isLoading, error } = useEscrow(id);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!escrow) return <div>Escrow not found</div>;\n *\n * return <div>{escrow.state}</div>;\n * }\n * ```\n */\nexport function useEscrow(id: string | undefined, options?: UseEscrowOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlEscrow | null>({\n queryKey: [\"zenland\", \"escrow\", id],\n queryFn: () => {\n if (!id) return null;\n return client.escrows.getById(id);\n },\n enabled: !!id && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS, type StateGroup } from \"../../domains/escrows\";\nimport type { GqlEscrowPage } from \"../../generated/types\";\n\nexport type EscrowRole = \"all\" | \"buyer\" | \"seller\" | \"agent\";\nexport type EscrowStateTab = \"all\" | StateGroup;\n\nexport interface UseEscrowsArgs {\n /** User address to filter by */\n address?: string;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Filter by role (requires address) */\n role?: EscrowRole;\n /** Filter by state group */\n stateTab?: EscrowStateTab;\n /** Filter by specific state */\n state?: string;\n /** Filter by multiple states */\n states?: string[];\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch escrows with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useEscrows } from '@zenland/sdk/react';\n *\n * function MyEscrows({ address }: { address: string }) {\n * const { data, isLoading } = useEscrows({\n * address,\n * role: 'buyer',\n * stateTab: 'ACTIVE',\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(escrow => (\n * <li key={escrow.id}>{escrow.state}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useEscrows(args?: UseEscrowsArgs) {\n const client = useZenlandClientOptional();\n const { address, role = \"all\", stateTab, enabled = true } = args ?? {};\n\n // Determine states to filter based on stateTab\n const getStatesFromTab = (): string[] | undefined => {\n if (!stateTab || stateTab === \"all\") {\n return args?.states;\n }\n return [...STATE_GROUPS[stateTab]];\n };\n\n return useQuery<GqlEscrowPage>({\n queryKey: [\"zenland\", \"escrows\", address, role, stateTab, args?.state, args?.states, args?.limit, args?.offset],\n queryFn: async () => {\n if (!address) {\n return { items: [], totalCount: 0, pageInfo: { hasNextPage: false, hasPreviousPage: false } };\n }\n\n const states = getStatesFromTab();\n\n return client.escrows.list({\n limit: args?.limit,\n offset: args?.offset,\n buyer: role === \"buyer\" ? address : undefined,\n seller: role === \"seller\" ? address : undefined,\n agent: role === \"agent\" ? address : undefined,\n user: role === \"all\" ? address : undefined,\n state: args?.state,\n states,\n });\n },\n enabled: !!address && enabled,\n });\n}\n\n// Re-export for convenience\nexport { STATE_GROUPS } from \"../../domains/escrows\";\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgent } from \"../../generated/types\";\n\nexport interface UseAgentOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single agent by address.\n *\n * @example\n * ```tsx\n * import { useAgent } from '@zenland/sdk/react';\n *\n * function AgentProfile({ address }: { address: string }) {\n * const { data: agent, isLoading, error } = useAgent(address);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!agent) return <div>Agent not found</div>;\n *\n * return <div>{agent.description}</div>;\n * }\n * ```\n */\nexport function useAgent(address: string | undefined, options?: UseAgentOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlAgent | null>({\n queryKey: [\"zenland\", \"agent\", address],\n queryFn: () => {\n if (!address) return null;\n return client.agents.getById(address);\n },\n enabled: !!address && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgentPage } from \"../../generated/types\";\n\nexport interface UseAgentsArgs {\n /** Only return active agents */\n onlyActive?: boolean;\n /** Only return available agents */\n onlyAvailable?: boolean;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch agents with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useAgents } from '@zenland/sdk/react';\n *\n * function AgentList() {\n * const { data, isLoading } = useAgents({ onlyActive: true });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(agent => (\n * <li key={agent.id}>{agent.description}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useAgents(args?: UseAgentsArgs) {\n const client = useZenlandClientOptional();\n const { enabled = true, ...filterArgs } = args ?? {};\n\n return useQuery<GqlAgentPage>({\n queryKey: [\"zenland\", \"agents\", filterArgs.onlyActive, filterArgs.onlyAvailable, filterArgs.limit, filterArgs.offset],\n queryFn: () => client.agents.list(filterArgs),\n enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { ProtocolStats } from \"../../domains/protocol-stats\";\n\nexport interface UseProtocolStatsOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 60s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch global protocol statistics.\n *\n * @example\n * ```tsx\n * import { useProtocolStats } from '@zenland/sdk/react';\n *\n * function ProtocolOverview() {\n * const { data: stats, isLoading } = useProtocolStats();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!stats) return <div>Stats not available</div>;\n *\n * return (\n * <div>\n * <p>Total Escrows: {stats.totalEscrowsCreated}</p>\n * <p>TVL: {stats.currentTVL.toString()}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProtocolStats(options?: UseProtocolStatsOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<ProtocolStats | null>({\n queryKey: [\"zenland\", \"protocolStats\"],\n queryFn: () => client.protocolStats.get(),\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 30 * 1000, // 30 seconds\n refetchInterval: options?.refetchInterval ?? 60 * 1000, // 1 minute\n });\n}\n\nexport type { ProtocolStats };\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseRecentEscrowsOptions {\n /** Number of escrows to fetch (default: 5) */\n limit?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 15s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 30s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch recent escrows for activity feeds.\n *\n * @example\n * ```tsx\n * import { useRecentEscrows } from '@zenland/sdk/react';\n *\n * function ActivityFeed() {\n * const { data: escrows, isLoading } = useRecentEscrows({ limit: 10 });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {escrows?.map(escrow => (\n * <li key={escrow.id}>\n * {escrow.state} - {escrow.amount}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRecentEscrows(options?: UseRecentEscrowsOptions) {\n const client = useZenlandClientOptional();\n const limit = options?.limit ?? 5;\n\n return useQuery<GqlEscrow[]>({\n queryKey: [\"zenland\", \"recentEscrows\", limit],\n queryFn: async () => {\n const result = await client.escrows.list({\n limit,\n orderBy: \"createdAt\",\n orderDirection: \"desc\",\n });\n return result.items;\n },\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 15 * 1000, // 15 seconds\n refetchInterval: options?.refetchInterval ?? 30 * 1000, // 30 seconds\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS } from \"../../domains/escrows\";\nimport type { GqlEscrow, ZenlandClient } from \"../../index\";\n\n/** State groups for categorization */\nconst ACTIVE_STATES = STATE_GROUPS.ACTIVE;\nconst DISPUTE_STATES = STATE_GROUPS.IN_DISPUTE;\nconst COMPLETED_STATES = STATE_GROUPS.COMPLETED;\nconst TVL_STATES = [...ACTIVE_STATES, ...DISPUTE_STATES] as const;\n\nexport interface UserDashboardStats {\n activeCount: number;\n disputeCount: number;\n completedCount: number;\n tvl: bigint;\n recentEscrows: GqlEscrow[];\n}\n\n/**\n * Fetch count of escrows for a user filtered by states.\n */\nasync function fetchUserEscrowCount(\n client: ZenlandClient,\n userAddress: string,\n states: readonly string[],\n): Promise<number> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1,\n user: userLower,\n states: [...states],\n });\n\n return result.totalCount;\n}\n\n/**\n * Fetch user's escrows that contribute to TVL and calculate sum.\n */\nasync function fetchUserTVL(client: ZenlandClient, userAddress: string): Promise<bigint> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1000,\n user: userLower,\n states: [...TVL_STATES],\n });\n\n return result.items.reduce((sum, escrow) => sum + BigInt(escrow.amount), BigInt(0));\n}\n\n/**\n * Fetch user's recent escrows for dashboard display.\n */\nasync function fetchUserRecentEscrows(\n client: ZenlandClient,\n userAddress: string,\n limit: number = 5,\n): Promise<GqlEscrow[]> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit,\n user: userLower,\n });\n\n return result.items;\n}\n\n/**\n * Fetch all user dashboard stats in parallel.\n */\nasync function getUserDashboardStats(\n client: ZenlandClient,\n userAddress: string,\n): Promise<UserDashboardStats> {\n const [activeCount, disputeCount, completedCount, tvl, recentEscrows] = await Promise.all([\n fetchUserEscrowCount(client, userAddress, ACTIVE_STATES),\n fetchUserEscrowCount(client, userAddress, DISPUTE_STATES),\n fetchUserEscrowCount(client, userAddress, COMPLETED_STATES),\n fetchUserTVL(client, userAddress),\n fetchUserRecentEscrows(client, userAddress, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl,\n recentEscrows,\n };\n}\n\n/**\n * Fetch global dashboard stats.\n */\nasync function getGlobalDashboardStats(\n client: ZenlandClient,\n): Promise<Omit<UserDashboardStats, \"tvl\"> & { tvl: null }> {\n const [activeCount, disputeCount, completedCount, recentEscrows] = await Promise.all([\n fetchGlobalEscrowCount(client, [...ACTIVE_STATES]),\n fetchGlobalEscrowCount(client, [...DISPUTE_STATES]),\n fetchGlobalEscrowCount(client, [...COMPLETED_STATES]),\n fetchGlobalRecentEscrows(client, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl: null,\n recentEscrows,\n };\n}\n\nasync function fetchGlobalEscrowCount(client: ZenlandClient, states: string[]): Promise<number> {\n const result = await client.escrows.list({\n limit: 1,\n states,\n });\n return result.totalCount;\n}\n\nasync function fetchGlobalRecentEscrows(client: ZenlandClient, limit: number = 5): Promise<GqlEscrow[]> {\n const result = await client.escrows.list({ limit });\n return result.items;\n}\n\n/**\n * Hook to fetch user-specific dashboard statistics.\n */\nexport function useUserStats(userAddress: string | undefined) {\n const client = useZenlandClientOptional();\n return useQuery<UserDashboardStats | null>({\n queryKey: [\"zenland\", \"userStats\", userAddress],\n queryFn: async () => {\n if (!userAddress) return null;\n return getUserDashboardStats(client, userAddress);\n },\n enabled: !!userAddress,\n staleTime: 15 * 1000,\n refetchInterval: 30 * 1000,\n });\n}\n\n/**\n * Hook to fetch global dashboard statistics.\n */\nexport function useGlobalStats() {\n const client = useZenlandClientOptional();\n return useQuery({\n queryKey: [\"zenland\", \"globalStats\"],\n queryFn: () => getGlobalDashboardStats(client),\n staleTime: 30 * 1000,\n refetchInterval: 60 * 1000,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlTransactionLog } from \"../../generated/types\";\nimport type { ListTransactionLogsArgs } from \"../../domains/transaction-logs\";\n\nexport interface UseTransactionLogsByEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds */\n refetchInterval?: number;\n /** Transaction log list options */\n list?: Omit<ListTransactionLogsArgs, \"escrowAddress\">;\n}\n\n/**\n * Hook to fetch transaction logs for a specific escrow.\n */\nexport function useTransactionLogsByEscrow(\n escrowAddress: string | undefined | null,\n options?: UseTransactionLogsByEscrowOptions,\n) {\n const client = useZenlandClientOptional();\n const addr = escrowAddress?.toLowerCase();\n\n return useQuery<GqlTransactionLog[]>({\n queryKey: [\n \"zenland\",\n \"transactionLogs\",\n \"escrow\",\n addr,\n options?.list?.limit,\n options?.list?.offset,\n options?.list?.orderBy,\n options?.list?.orderDirection,\n ],\n queryFn: async () => {\n if (!addr) return [];\n return client.transactionLogs.getByEscrow(addr, options?.list);\n },\n enabled: !!addr && (options?.enabled ?? true),\n staleTime: options?.staleTime ?? 30_000,\n refetchInterval: options?.refetchInterval,\n refetchOnWindowFocus: false,\n });\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery"]}
1
+ {"version":3,"sources":["../src/react/context.tsx","../src/request.ts","../src/queries.ts","../src/domains/escrows.ts","../src/domains/agents.ts","../src/domains/protocol-stats.ts","../src/domains/transaction-logs.ts","../src/client.ts","../src/react/hooks/useEscrow.ts","../src/react/hooks/useEscrows.ts","../src/react/hooks/useAgent.ts","../src/react/hooks/useAgents.ts","../src/react/hooks/useProtocolStats.ts","../src/react/hooks/useRecentEscrows.ts","../src/react/hooks/useUserStats.ts","../src/react/hooks/useTransactionLogsByEscrow.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { createZenlandClient, type ZenlandClient, type ZenlandClientConfig } from \"../client\";\n\nconst ZenlandContext = createContext<ZenlandClient | null>(null);\n\nexport interface ZenlandProviderProps {\n children: ReactNode;\n /** Optional configuration for the SDK client */\n config?: ZenlandClientConfig;\n}\n\n/**\n * Provider component for the Zenland SDK.\n *\n * Wrap your app with this provider to use the React hooks.\n *\n * @example\n * ```tsx\n * import { ZenlandProvider } from '@zenland/sdk/react';\n *\n * function App() {\n * return (\n * <ZenlandProvider>\n * <YourApp />\n * </ZenlandProvider>\n * );\n * }\n *\n * // With custom config\n * <ZenlandProvider config={{ baseUrl: 'http://localhost:42069' }}>\n * <YourApp />\n * </ZenlandProvider>\n * ```\n */\nexport function ZenlandProvider({ children, config }: ZenlandProviderProps) {\n const client = useMemo(() => createZenlandClient(config), [config]);\n\n return <ZenlandContext.Provider value={client}>{children}</ZenlandContext.Provider>;\n}\n\n/**\n * Hook to access the Zenland SDK client.\n *\n * Must be used within a ZenlandProvider.\n *\n * @example\n * ```tsx\n * import { useZenlandClient } from '@zenland/sdk/react';\n *\n * function MyComponent() {\n * const client = useZenlandClient();\n * // Use client.escrows, client.agents, etc.\n * }\n * ```\n */\nexport function useZenlandClient(): ZenlandClient {\n const context = useContext(ZenlandContext);\n if (!context) {\n throw new Error(\"useZenlandClient must be used within a ZenlandProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Zenland SDK client, creating a default one if not in a provider.\n *\n * This is useful for components that might be used outside of a ZenlandProvider.\n */\nexport function useZenlandClientOptional(): ZenlandClient {\n const context = useContext(ZenlandContext);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => context ?? createZenlandClient(), [context]);\n}\n","/**\n * GraphQL request utilities for the Zenland SDK\n */\n\ntype GraphQLErrorLike = {\n message?: string;\n [key: string]: unknown;\n};\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: GraphQLErrorLike[];\n};\n\n/**\n * Error thrown when the indexer returns GraphQL errors\n */\nexport class ZenlandGraphQLError extends Error {\n public readonly errors: GraphQLErrorLike[];\n\n constructor(message: string, errors: GraphQLErrorLike[]) {\n super(message);\n this.name = \"ZenlandGraphQLError\";\n this.errors = errors;\n }\n}\n\n/**\n * Error thrown when the indexer request fails at the network/HTTP level\n */\nexport class ZenlandRequestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.name = \"ZenlandRequestError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport interface GraphQLRequestOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Execute a GraphQL request against the Zenland indexer\n */\nexport async function graphqlRequest<TData, TVariables extends object | undefined>(\n baseUrl: string,\n document: string,\n variables?: TVariables,\n options?: GraphQLRequestOptions,\n): Promise<TData> {\n const endpoint = `${baseUrl}/graphql`;\n\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ query: document, variables }),\n signal: options?.signal,\n cache: \"no-store\",\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new ZenlandRequestError(\n `Zenland request failed (${res.status} ${res.statusText})${text ? `: ${text}` : \"\"}`,\n res.status,\n res.statusText,\n );\n }\n\n const json = (await res.json()) as GraphQLResponse<TData>;\n\n if (json.errors?.length) {\n throw new ZenlandGraphQLError(\n json.errors.map((e) => e.message ?? \"GraphQL error\").join(\"; \"),\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new Error(\"Zenland response missing data.\");\n }\n\n return json.data;\n}\n","/**\n * GraphQL query strings for the Zenland indexer.\n * These are compiled into the SDK to avoid runtime parsing.\n */\n\nexport const AGENT_QUERY = `\nquery Agent($id: String!) {\n agent(id: $id) {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinToken\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n cases(limit: 5, orderBy: \"invitedAt\", orderDirection: \"desc\") {\n items {\n id\n escrow\n invitedAt\n resolvedAt\n timedOut\n escrowRef {\n id\n amount\n token\n state\n }\n }\n totalCount\n }\n }\n}\n`;\n\nexport const AGENTS_QUERY = `\nquery Agents($where: agentFilter, $orderBy: String, $orderDirection: String, $limit: Int, $offset: Int) {\n agents(where: $where, orderBy: $orderBy, orderDirection: $orderDirection, limit: $limit, offset: $offset) {\n totalCount\n items {\n id\n isActive\n isAvailable\n stablecoinDecimals\n stablecoinStake\n daoTokenStake\n disputeFeeBps\n assignmentFeeBps\n description\n contact\n totalResolved\n activeCases\n totalEscrowsAssigned\n registrationTime\n lastEngagementTimestamp\n totalEarnings\n totalSlashed\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n }\n}\n`;\n\nexport const ESCROW_QUERY = `\nquery escrow($id: String!) {\n escrow(id: $id) {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n sellerAcceptDeadline\n buyerProtectionTime\n termsHash\n version\n fundedAt\n fulfilledAt\n resolvedAt\n agentInvitedAt\n splitProposer\n proposedBuyerBps\n proposedSellerBps\n buyerApprovedSplit\n sellerApprovedSplit\n agentFeeReceived\n buyerReceived\n sellerReceived\n creationFee\n }\n}\n`;\n\nexport const ESCROWS_QUERY = `\nquery escrows(\n $limit: Int = 30\n $offset: Int = 0\n $orderBy: String = \"createdAt\"\n $orderDirection: String = \"desc\"\n $where: escrowFilter\n) {\n escrows(\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n where: $where\n ) {\n items {\n id\n chainId\n buyer\n seller\n agent\n amount\n token\n state\n createdAt\n fundedAt\n fulfilledAt\n sellerAcceptDeadline\n agentInvitedAt\n buyerProtectionTime\n splitProposer\n buyerApprovedSplit\n sellerApprovedSplit\n proposedBuyerBps\n proposedSellerBps\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n }\n totalCount\n }\n}\n`;\n\nexport const PROTOCOL_STATS_QUERY = `\nquery protocolStats($id: String! = \"mainnet\") {\n protocolStats(id: $id) {\n id\n chainId\n totalEscrowsCreated\n totalVolumeEscrowed\n totalFeesCollected\n currentTVL\n activeEscrowCount\n totalAgentsRegistered\n activeAgentsCount\n }\n agents(where: { isActive: true }, limit: 1000) {\n items {\n stablecoinStake\n }\n }\n}\n`;\n\nexport const RECENT_ESCROWS_QUERY = `\nquery recentEscrows($limit: Int = 5) {\n escrows(\n limit: $limit\n orderBy: \"createdAt\"\n orderDirection: \"desc\"\n ) {\n items {\n id\n amount\n token\n state\n createdAt\n }\n }\n}\n`;\n\nexport const TRANSACTION_LOGS_QUERY = `\nquery transactionLogs(\n $escrowAddress: String\n $limit: Int\n $offset: Int\n $orderBy: String\n $orderDirection: String\n) {\n transactionLogs(\n where: { escrowAddress: $escrowAddress }\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n orderDirection: $orderDirection\n ) {\n items {\n id\n txHash\n blockNumber\n timestamp\n eventName\n contractAddress\n contractType\n escrowAddress\n agentAddress\n userAddress\n eventData\n }\n }\n}\n`;\n","/**\n * Escrow domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { ESCROW_QUERY, ESCROWS_QUERY } from \"../queries\";\nimport type {\n GqlEscrow,\n GqlEscrowPage,\n GqlEscrowFilter,\n EscrowQueryResponse,\n EscrowsQueryResponse,\n} from \"../generated/types\";\n\n/** State groups for filtering escrows */\nexport const STATE_GROUPS = {\n ACTIVE: [\"PENDING\", \"ACTIVE\", \"FULFILLED\"] as const,\n IN_DISPUTE: [\"DISPUTED\", \"AGENT_INVITED\"] as const,\n COMPLETED: [\"RELEASED\", \"AGENT_RESOLVED\", \"REFUNDED\", \"SPLIT\"] as const,\n} as const;\n\nexport type StateGroup = keyof typeof STATE_GROUPS;\n\nexport interface ListEscrowsArgs {\n limit?: number;\n offset?: number;\n buyer?: string;\n seller?: string;\n agent?: string;\n /** Search across buyer, seller, or agent roles */\n user?: string;\n state?: string;\n /** Multiple states for group filtering */\n states?: string[];\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates escrow domain functions bound to a base URL\n */\nexport function createEscrowsDomain(baseUrl: string) {\n /**\n * List escrows with filtering and pagination\n */\n async function list(args?: ListEscrowsArgs): Promise<GqlEscrowPage> {\n const where: GqlEscrowFilter = {};\n\n // Role-specific filters\n if (args?.buyer) where.buyer = args.buyer.toLowerCase();\n if (args?.seller) where.seller = args.seller.toLowerCase();\n if (args?.agent) where.agent = args.agent.toLowerCase();\n\n // State filters - single or multiple\n if (args?.states && args.states.length > 0) {\n where.state_in = args.states;\n } else if (args?.state) {\n where.state = args.state;\n }\n\n // User filter: search across buyer, seller, or agent roles\n if (args?.user) {\n const userLower = args.user.toLowerCase();\n where.OR = [{ buyer: userLower }, { seller: userLower }, { agent: userLower }];\n }\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"createdAt\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<EscrowsQueryResponse, typeof variables>(\n baseUrl,\n ESCROWS_QUERY,\n variables,\n );\n\n return response.escrows;\n }\n\n /**\n * Get a single escrow by ID (address)\n */\n async function getById(id: string): Promise<GqlEscrow | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<EscrowQueryResponse, typeof variables>(\n baseUrl,\n ESCROW_QUERY,\n variables,\n );\n\n return response.escrow;\n }\n\n /**\n * Get escrows for a specific user across all roles\n */\n async function getByUser(\n userAddress: string,\n args?: Omit<ListEscrowsArgs, \"user\" | \"buyer\" | \"seller\" | \"agent\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, user: userAddress });\n }\n\n /**\n * Get escrows by state group\n */\n async function getByStateGroup(\n stateGroup: StateGroup,\n args?: Omit<ListEscrowsArgs, \"state\" | \"states\">,\n ): Promise<GqlEscrowPage> {\n return list({ ...args, states: [...STATE_GROUPS[stateGroup]] });\n }\n\n return {\n list,\n getById,\n getByUser,\n getByStateGroup,\n };\n}\n\nexport type EscrowsDomain = ReturnType<typeof createEscrowsDomain>;\n","/**\n * Agent domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { AGENT_QUERY, AGENTS_QUERY } from \"../queries\";\nimport type {\n GqlAgent,\n GqlAgentPage,\n GqlAgentFilter,\n AgentQueryResponse,\n AgentsQueryResponse,\n} from \"../generated/types\";\n\nexport interface ListAgentsArgs {\n limit?: number;\n offset?: number;\n onlyActive?: boolean;\n onlyAvailable?: boolean;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates agent domain functions bound to a base URL\n */\nexport function createAgentsDomain(baseUrl: string) {\n /**\n * List agents with filtering and pagination\n */\n async function list(args?: ListAgentsArgs): Promise<GqlAgentPage> {\n const where: GqlAgentFilter = {};\n\n if (args?.onlyActive) where.isActive = true;\n if (args?.onlyAvailable) where.isAvailable = true;\n\n const variables = {\n limit: args?.limit ?? 30,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"totalResolved\",\n orderDirection: args?.orderDirection ?? \"desc\",\n where: Object.keys(where).length > 0 ? where : undefined,\n };\n\n const response = await graphqlRequest<AgentsQueryResponse, typeof variables>(\n baseUrl,\n AGENTS_QUERY,\n variables,\n );\n\n return response.agents;\n }\n\n /**\n * Get a single agent by ID (address)\n */\n async function getById(id: string): Promise<GqlAgent | null> {\n const variables = { id: id.toLowerCase() };\n\n const response = await graphqlRequest<AgentQueryResponse, typeof variables>(\n baseUrl,\n AGENT_QUERY,\n variables,\n );\n\n return response.agent;\n }\n\n /**\n * Get all active and available agents\n */\n async function getAvailable(args?: Omit<ListAgentsArgs, \"onlyActive\" | \"onlyAvailable\">): Promise<GqlAgentPage> {\n return list({ ...args, onlyActive: true, onlyAvailable: true });\n }\n\n return {\n list,\n getById,\n getAvailable,\n };\n}\n\nexport type AgentsDomain = ReturnType<typeof createAgentsDomain>;\n","/**\n * Protocol Stats domain module for the Zenland SDK\n * \n * Stats are tracked per-chain. By default, mainnet stats are returned\n * for production UI. Use chainId parameter to query other networks.\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { PROTOCOL_STATS_QUERY } from \"../queries\";\nimport type { GqlProtocolStats, ProtocolStatsQueryResponse } from \"../generated/types\";\n\n/** Default stats ID for production (Ethereum mainnet) */\nconst DEFAULT_STATS_ID = \"mainnet\";\n\n/** Normalized protocol stats with BigInt values */\nexport interface ProtocolStats {\n id: string;\n chainId?: number;\n totalEscrowsCreated: number;\n totalVolumeEscrowed: bigint;\n totalFeesCollected: bigint;\n /** True TVL = escrowTVL + agentStakingTVL */\n currentTVL: bigint;\n /** TVL held in active escrow contracts only */\n escrowTVL: bigint;\n /** TVL held as agent stablecoin collateral in the registry */\n agentStakingTVL: bigint;\n activeEscrowCount: number;\n totalAgentsRegistered: number;\n activeAgentsCount: number;\n}\n\n/**\n * Convert raw GraphQL response to normalized ProtocolStats\n */\nfunction normalizeProtocolStats(\n raw: GqlProtocolStats,\n activeAgents: Array<{ stablecoinStake: string | number | bigint }>,\n): ProtocolStats {\n const escrowTVL = BigInt(raw.currentTVL);\n const agentStakingTVL = activeAgents.reduce(\n (sum, a) => sum + BigInt(a.stablecoinStake),\n 0n,\n );\n return {\n id: raw.id,\n chainId: (raw as any).chainId,\n totalEscrowsCreated: raw.totalEscrowsCreated,\n totalVolumeEscrowed: BigInt(raw.totalVolumeEscrowed),\n totalFeesCollected: BigInt(raw.totalFeesCollected),\n currentTVL: escrowTVL + agentStakingTVL,\n escrowTVL,\n agentStakingTVL,\n activeEscrowCount: raw.activeEscrowCount,\n totalAgentsRegistered: raw.totalAgentsRegistered,\n activeAgentsCount: raw.activeAgentsCount,\n };\n}\n\nexport interface GetProtocolStatsOptions {\n /** \n * Stats ID to query. Defaults to \"mainnet\".\n * Use \"sepolia\" for testnet stats.\n */\n statsId?: string;\n}\n\n/**\n * Creates protocol stats domain functions bound to a base URL\n */\nexport function createProtocolStatsDomain(baseUrl: string) {\n /**\n * Fetch protocol statistics for a specific chain.\n * Defaults to mainnet for production use.\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function get(options?: GetProtocolStatsOptions): Promise<ProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n if (!response.protocolStats) {\n return null;\n }\n\n return normalizeProtocolStats(response.protocolStats, response.agents?.items ?? []);\n }\n\n /**\n * Fetch raw protocol statistics (without BigInt conversion)\n * \n * @param options - Optional parameters\n * @param options.statsId - Stats ID to query (default: \"mainnet\")\n */\n async function getRaw(options?: GetProtocolStatsOptions): Promise<GqlProtocolStats | null> {\n const variables = { id: options?.statsId ?? DEFAULT_STATS_ID };\n\n const response = await graphqlRequest<ProtocolStatsQueryResponse, typeof variables>(\n baseUrl,\n PROTOCOL_STATS_QUERY,\n variables,\n );\n\n return response.protocolStats;\n }\n\n return {\n get,\n getRaw,\n };\n}\n\nexport type ProtocolStatsDomain = ReturnType<typeof createProtocolStatsDomain>;\n","/**\n * Transaction Logs domain module for the Zenland SDK\n */\n\nimport { graphqlRequest } from \"../request\";\nimport { TRANSACTION_LOGS_QUERY } from \"../queries\";\nimport type { GqlTransactionLog, TransactionLogsQueryResponse } from \"../generated/types\";\n\nexport interface ListTransactionLogsArgs {\n escrowAddress?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n}\n\n/**\n * Creates transaction logs domain functions bound to a base URL\n */\nexport function createTransactionLogsDomain(baseUrl: string) {\n /**\n * List transaction logs with filtering and pagination\n */\n async function list(args?: ListTransactionLogsArgs): Promise<GqlTransactionLog[]> {\n const variables = {\n escrowAddress: args?.escrowAddress?.toLowerCase(),\n limit: args?.limit ?? 100,\n offset: args?.offset ?? 0,\n orderBy: args?.orderBy ?? \"timestamp\",\n orderDirection: args?.orderDirection ?? \"asc\",\n };\n\n const response = await graphqlRequest<TransactionLogsQueryResponse, typeof variables>(\n baseUrl,\n TRANSACTION_LOGS_QUERY,\n variables,\n );\n\n return response.transactionLogs.items;\n }\n\n /**\n * Get transaction logs for a specific escrow\n */\n async function getByEscrow(\n escrowAddress: string,\n args?: Omit<ListTransactionLogsArgs, \"escrowAddress\">,\n ): Promise<GqlTransactionLog[]> {\n return list({ ...args, escrowAddress });\n }\n\n /**\n * Parse eventData JSON string from a transaction log\n */\n function parseEventData(eventData: string): Record<string, unknown> {\n try {\n return JSON.parse(eventData);\n } catch {\n return {};\n }\n }\n\n return {\n list,\n getByEscrow,\n parseEventData,\n };\n}\n\nexport type TransactionLogsDomain = ReturnType<typeof createTransactionLogsDomain>;\n","/**\n * Zenland SDK Client\n *\n * The main entry point for interacting with the Zenland indexer.\n */\n\nimport { createEscrowsDomain, type EscrowsDomain } from \"./domains/escrows\";\nimport { createAgentsDomain, type AgentsDomain } from \"./domains/agents\";\nimport { createProtocolStatsDomain, type ProtocolStatsDomain } from \"./domains/protocol-stats\";\nimport { createTransactionLogsDomain, type TransactionLogsDomain } from \"./domains/transaction-logs\";\n\n/** Default production indexer URL */\nconst DEFAULT_BASE_URL = \"https://api.zen.land\";\n\nexport interface ZenlandClientConfig {\n /** Base URL for the indexer API. Defaults to https://api.zen.land */\n baseUrl?: string;\n}\n\nexport interface ZenlandClient {\n /** The base URL being used by this client */\n readonly baseUrl: string;\n\n /** Escrow-related operations */\n readonly escrows: EscrowsDomain;\n\n /** Agent-related operations */\n readonly agents: AgentsDomain;\n\n /** Protocol statistics */\n readonly protocolStats: ProtocolStatsDomain;\n\n /** Transaction logs */\n readonly transactionLogs: TransactionLogsDomain;\n}\n\n/**\n * Create a new Zenland SDK client.\n *\n * @example\n * ```typescript\n * // Use production API (default)\n * const client = createZenlandClient();\n *\n * // Use custom endpoint (e.g., local development)\n * const client = createZenlandClient({ baseUrl: 'http://localhost:42069' });\n *\n * // Fetch escrows\n * const { items, totalCount } = await client.escrows.list({ limit: 10 });\n *\n * // Fetch a specific escrow\n * const escrow = await client.escrows.getById('0x...');\n *\n * // Fetch agents\n * const agents = await client.agents.list({ onlyActive: true });\n *\n * // Fetch protocol stats\n * const stats = await client.protocolStats.get();\n * ```\n */\nexport function createZenlandClient(config?: ZenlandClientConfig): ZenlandClient {\n const baseUrl = normalizeBaseUrl(config?.baseUrl ?? DEFAULT_BASE_URL);\n\n return {\n baseUrl,\n escrows: createEscrowsDomain(baseUrl),\n agents: createAgentsDomain(baseUrl),\n protocolStats: createProtocolStatsDomain(baseUrl),\n transactionLogs: createTransactionLogsDomain(baseUrl),\n };\n}\n\n/**\n * Normalize base URL by removing trailing slash\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/**\n * Default client instance using production API.\n * Use this for quick access without creating a new client.\n *\n * @example\n * ```typescript\n * import { zenland } from '@zenland/sdk';\n *\n * const escrows = await zenland.escrows.list();\n * ```\n */\nexport const zenland = createZenlandClient();\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single escrow by ID.\n *\n * @example\n * ```tsx\n * import { useEscrow } from '@zenland/sdk/react';\n *\n * function EscrowDetail({ id }: { id: string }) {\n * const { data: escrow, isLoading, error } = useEscrow(id);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!escrow) return <div>Escrow not found</div>;\n *\n * return <div>{escrow.state}</div>;\n * }\n * ```\n */\nexport function useEscrow(id: string | undefined, options?: UseEscrowOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlEscrow | null>({\n queryKey: [\"zenland\", \"escrow\", id],\n queryFn: () => {\n if (!id) return null;\n return client.escrows.getById(id);\n },\n enabled: !!id && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS, type StateGroup } from \"../../domains/escrows\";\nimport type { GqlEscrowPage } from \"../../generated/types\";\n\nexport type EscrowRole = \"all\" | \"buyer\" | \"seller\" | \"agent\";\nexport type EscrowStateTab = \"all\" | StateGroup;\n\nexport interface UseEscrowsArgs {\n /** User address to filter by */\n address?: string;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Filter by role (requires address) */\n role?: EscrowRole;\n /** Filter by state group */\n stateTab?: EscrowStateTab;\n /** Filter by specific state */\n state?: string;\n /** Filter by multiple states */\n states?: string[];\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch escrows with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useEscrows } from '@zenland/sdk/react';\n *\n * function MyEscrows({ address }: { address: string }) {\n * const { data, isLoading } = useEscrows({\n * address,\n * role: 'buyer',\n * stateTab: 'ACTIVE',\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(escrow => (\n * <li key={escrow.id}>{escrow.state}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useEscrows(args?: UseEscrowsArgs) {\n const client = useZenlandClientOptional();\n const { address, role = \"all\", stateTab, enabled = true } = args ?? {};\n\n // Determine states to filter based on stateTab\n const getStatesFromTab = (): string[] | undefined => {\n if (!stateTab || stateTab === \"all\") {\n return args?.states;\n }\n return [...STATE_GROUPS[stateTab]];\n };\n\n return useQuery<GqlEscrowPage>({\n queryKey: [\"zenland\", \"escrows\", address, role, stateTab, args?.state, args?.states, args?.limit, args?.offset],\n queryFn: async () => {\n if (!address) {\n return { items: [], totalCount: 0, pageInfo: { hasNextPage: false, hasPreviousPage: false } };\n }\n\n const states = getStatesFromTab();\n\n return client.escrows.list({\n limit: args?.limit,\n offset: args?.offset,\n buyer: role === \"buyer\" ? address : undefined,\n seller: role === \"seller\" ? address : undefined,\n agent: role === \"agent\" ? address : undefined,\n user: role === \"all\" ? address : undefined,\n state: args?.state,\n states,\n });\n },\n enabled: !!address && enabled,\n });\n}\n\n// Re-export for convenience\nexport { STATE_GROUPS } from \"../../domains/escrows\";\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgent } from \"../../generated/types\";\n\nexport interface UseAgentOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch a single agent by address.\n *\n * @example\n * ```tsx\n * import { useAgent } from '@zenland/sdk/react';\n *\n * function AgentProfile({ address }: { address: string }) {\n * const { data: agent, isLoading, error } = useAgent(address);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!agent) return <div>Agent not found</div>;\n *\n * return <div>{agent.description}</div>;\n * }\n * ```\n */\nexport function useAgent(address: string | undefined, options?: UseAgentOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<GqlAgent | null>({\n queryKey: [\"zenland\", \"agent\", address],\n queryFn: () => {\n if (!address) return null;\n return client.agents.getById(address);\n },\n enabled: !!address && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlAgentPage } from \"../../generated/types\";\n\nexport interface UseAgentsArgs {\n /** Only return active agents */\n onlyActive?: boolean;\n /** Only return available agents */\n onlyAvailable?: boolean;\n /** Pagination limit */\n limit?: number;\n /** Pagination offset */\n offset?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\n/**\n * Hook to fetch agents with filtering and pagination.\n *\n * @example\n * ```tsx\n * import { useAgents } from '@zenland/sdk/react';\n *\n * function AgentList() {\n * const { data, isLoading } = useAgents({ onlyActive: true });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {data?.items.map(agent => (\n * <li key={agent.id}>{agent.description}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useAgents(args?: UseAgentsArgs) {\n const client = useZenlandClientOptional();\n const { enabled = true, ...filterArgs } = args ?? {};\n\n return useQuery<GqlAgentPage>({\n queryKey: [\"zenland\", \"agents\", filterArgs.onlyActive, filterArgs.onlyAvailable, filterArgs.limit, filterArgs.offset],\n queryFn: () => client.agents.list(filterArgs),\n enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { ProtocolStats } from \"../../domains/protocol-stats\";\n\nexport interface UseProtocolStatsOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 60s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch global protocol statistics.\n *\n * @example\n * ```tsx\n * import { useProtocolStats } from '@zenland/sdk/react';\n *\n * function ProtocolOverview() {\n * const { data: stats, isLoading } = useProtocolStats();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!stats) return <div>Stats not available</div>;\n *\n * return (\n * <div>\n * <p>Total Escrows: {stats.totalEscrowsCreated}</p>\n * <p>TVL: {stats.currentTVL.toString()}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProtocolStats(options?: UseProtocolStatsOptions) {\n const client = useZenlandClientOptional();\n\n return useQuery<ProtocolStats | null>({\n queryKey: [\"zenland\", \"protocolStats\"],\n queryFn: () => client.protocolStats.get(),\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 30 * 1000, // 30 seconds\n refetchInterval: options?.refetchInterval ?? 60 * 1000, // 1 minute\n });\n}\n\nexport type { ProtocolStats };\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlEscrow } from \"../../generated/types\";\n\nexport interface UseRecentEscrowsOptions {\n /** Number of escrows to fetch (default: 5) */\n limit?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 15s) */\n staleTime?: number;\n /** Refetch interval in milliseconds (default: 30s) */\n refetchInterval?: number;\n}\n\n/**\n * Hook to fetch recent escrows for activity feeds.\n *\n * @example\n * ```tsx\n * import { useRecentEscrows } from '@zenland/sdk/react';\n *\n * function ActivityFeed() {\n * const { data: escrows, isLoading } = useRecentEscrows({ limit: 10 });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {escrows?.map(escrow => (\n * <li key={escrow.id}>\n * {escrow.state} - {escrow.amount}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRecentEscrows(options?: UseRecentEscrowsOptions) {\n const client = useZenlandClientOptional();\n const limit = options?.limit ?? 5;\n\n return useQuery<GqlEscrow[]>({\n queryKey: [\"zenland\", \"recentEscrows\", limit],\n queryFn: async () => {\n const result = await client.escrows.list({\n limit,\n orderBy: \"createdAt\",\n orderDirection: \"desc\",\n });\n return result.items;\n },\n enabled: options?.enabled ?? true,\n staleTime: options?.staleTime ?? 15 * 1000, // 15 seconds\n refetchInterval: options?.refetchInterval ?? 30 * 1000, // 30 seconds\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport { STATE_GROUPS } from \"../../domains/escrows\";\nimport type { GqlEscrow, ZenlandClient } from \"../../index\";\n\n/** State groups for categorization */\nconst ACTIVE_STATES = STATE_GROUPS.ACTIVE;\nconst DISPUTE_STATES = STATE_GROUPS.IN_DISPUTE;\nconst COMPLETED_STATES = STATE_GROUPS.COMPLETED;\nconst TVL_STATES = [...ACTIVE_STATES, ...DISPUTE_STATES] as const;\n\nexport interface UserDashboardStats {\n activeCount: number;\n disputeCount: number;\n completedCount: number;\n tvl: bigint;\n recentEscrows: GqlEscrow[];\n}\n\n/**\n * Fetch count of escrows for a user filtered by states.\n */\nasync function fetchUserEscrowCount(\n client: ZenlandClient,\n userAddress: string,\n states: readonly string[],\n): Promise<number> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1,\n user: userLower,\n states: [...states],\n });\n\n return result.totalCount;\n}\n\n/**\n * Fetch user's escrows that contribute to TVL and calculate sum.\n */\nasync function fetchUserTVL(client: ZenlandClient, userAddress: string): Promise<bigint> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit: 1000,\n user: userLower,\n states: [...TVL_STATES],\n });\n\n return result.items.reduce((sum, escrow) => sum + BigInt(escrow.amount), BigInt(0));\n}\n\n/**\n * Fetch user's recent escrows for dashboard display.\n */\nasync function fetchUserRecentEscrows(\n client: ZenlandClient,\n userAddress: string,\n limit: number = 5,\n): Promise<GqlEscrow[]> {\n const userLower = userAddress.toLowerCase();\n\n const result = await client.escrows.list({\n limit,\n user: userLower,\n });\n\n return result.items;\n}\n\n/**\n * Fetch all user dashboard stats in parallel.\n */\nasync function getUserDashboardStats(\n client: ZenlandClient,\n userAddress: string,\n): Promise<UserDashboardStats> {\n const [activeCount, disputeCount, completedCount, tvl, recentEscrows] = await Promise.all([\n fetchUserEscrowCount(client, userAddress, ACTIVE_STATES),\n fetchUserEscrowCount(client, userAddress, DISPUTE_STATES),\n fetchUserEscrowCount(client, userAddress, COMPLETED_STATES),\n fetchUserTVL(client, userAddress),\n fetchUserRecentEscrows(client, userAddress, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl,\n recentEscrows,\n };\n}\n\n/**\n * Fetch global dashboard stats.\n */\nasync function getGlobalDashboardStats(\n client: ZenlandClient,\n): Promise<Omit<UserDashboardStats, \"tvl\"> & { tvl: null }> {\n const [activeCount, disputeCount, completedCount, recentEscrows] = await Promise.all([\n fetchGlobalEscrowCount(client, [...ACTIVE_STATES]),\n fetchGlobalEscrowCount(client, [...DISPUTE_STATES]),\n fetchGlobalEscrowCount(client, [...COMPLETED_STATES]),\n fetchGlobalRecentEscrows(client, 5),\n ]);\n\n return {\n activeCount,\n disputeCount,\n completedCount,\n tvl: null,\n recentEscrows,\n };\n}\n\nasync function fetchGlobalEscrowCount(client: ZenlandClient, states: string[]): Promise<number> {\n const result = await client.escrows.list({\n limit: 1,\n states,\n });\n return result.totalCount;\n}\n\nasync function fetchGlobalRecentEscrows(client: ZenlandClient, limit: number = 5): Promise<GqlEscrow[]> {\n const result = await client.escrows.list({ limit });\n return result.items;\n}\n\n/**\n * Hook to fetch user-specific dashboard statistics.\n */\nexport function useUserStats(userAddress: string | undefined) {\n const client = useZenlandClientOptional();\n return useQuery<UserDashboardStats | null>({\n queryKey: [\"zenland\", \"userStats\", userAddress],\n queryFn: async () => {\n if (!userAddress) return null;\n return getUserDashboardStats(client, userAddress);\n },\n enabled: !!userAddress,\n staleTime: 15 * 1000,\n refetchInterval: 30 * 1000,\n });\n}\n\n/**\n * Hook to fetch global dashboard statistics.\n */\nexport function useGlobalStats() {\n const client = useZenlandClientOptional();\n return useQuery({\n queryKey: [\"zenland\", \"globalStats\"],\n queryFn: () => getGlobalDashboardStats(client),\n staleTime: 30 * 1000,\n refetchInterval: 60 * 1000,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useZenlandClientOptional } from \"../context\";\nimport type { GqlTransactionLog } from \"../../generated/types\";\nimport type { ListTransactionLogsArgs } from \"../../domains/transaction-logs\";\n\nexport interface UseTransactionLogsByEscrowOptions {\n /** Whether to enable the query */\n enabled?: boolean;\n /** Stale time in milliseconds (default: 30s) */\n staleTime?: number;\n /** Refetch interval in milliseconds */\n refetchInterval?: number;\n /** Transaction log list options */\n list?: Omit<ListTransactionLogsArgs, \"escrowAddress\">;\n}\n\n/**\n * Hook to fetch transaction logs for a specific escrow.\n */\nexport function useTransactionLogsByEscrow(\n escrowAddress: string | undefined | null,\n options?: UseTransactionLogsByEscrowOptions,\n) {\n const client = useZenlandClientOptional();\n const addr = escrowAddress?.toLowerCase();\n\n return useQuery<GqlTransactionLog[]>({\n queryKey: [\n \"zenland\",\n \"transactionLogs\",\n \"escrow\",\n addr,\n options?.list?.limit,\n options?.list?.offset,\n options?.list?.orderBy,\n options?.list?.orderDirection,\n ],\n queryFn: async () => {\n if (!addr) return [];\n return client.transactionLogs.getByEscrow(addr, options?.list);\n },\n enabled: !!addr && (options?.enabled ?? true),\n staleTime: options?.staleTime ?? 30_000,\n refetchInterval: options?.refetchInterval,\n refetchOnWindowFocus: false,\n });\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenland/sdk",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Official SDK for interacting with the Zenland escrow protocol indexer",
5
5
  "license": "MIT",
6
6
  "author": "Zenland",