@bind-protocol/sdk 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +1 -0
  2. package/dist/{index-CASjN9Qe.d.ts → adapter-53dB8ogG.d.ts} +3 -67
  3. package/dist/{index-5j-fuebC.d.cts → adapter-DyAYLtIy.d.cts} +3 -67
  4. package/dist/adapters/dimo/index.d.cts +3 -2
  5. package/dist/adapters/dimo/index.d.ts +3 -2
  6. package/dist/adapters/index.cjs +499 -0
  7. package/dist/adapters/index.cjs.map +1 -1
  8. package/dist/adapters/index.d.cts +6 -2
  9. package/dist/adapters/index.d.ts +6 -2
  10. package/dist/adapters/index.js +497 -1
  11. package/dist/adapters/index.js.map +1 -1
  12. package/dist/adapters/zktls/index.cjs +503 -0
  13. package/dist/adapters/zktls/index.cjs.map +1 -0
  14. package/dist/adapters/zktls/index.d.cts +117 -0
  15. package/dist/adapters/zktls/index.d.ts +117 -0
  16. package/dist/adapters/zktls/index.js +499 -0
  17. package/dist/adapters/zktls/index.js.map +1 -0
  18. package/dist/client-BSwO4sTC.d.ts +135 -0
  19. package/dist/client-Bh8Di-5n.d.cts +135 -0
  20. package/dist/core/index.cjs +162 -1
  21. package/dist/core/index.cjs.map +1 -1
  22. package/dist/core/index.d.cts +25 -61
  23. package/dist/core/index.d.ts +25 -61
  24. package/dist/core/index.js +159 -2
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/index.cjs +315 -1
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +6 -3
  29. package/dist/index.d.ts +6 -3
  30. package/dist/index.js +309 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/types-B6S0axfE.d.cts +200 -0
  33. package/dist/types-B6S0axfE.d.ts +200 -0
  34. package/dist/types-Be7Jc5V8.d.cts +68 -0
  35. package/dist/types-D1-qiyJO.d.ts +68 -0
  36. package/package.json +10 -2
  37. package/dist/types-o4sbOK_a.d.cts +0 -101
  38. package/dist/types-o4sbOK_a.d.ts +0 -101
package/dist/index.cjs CHANGED
@@ -44,11 +44,37 @@ var InsufficientCreditsError = class extends BindError {
44
44
  this.name = "InsufficientCreditsError";
45
45
  }
46
46
  };
47
+ var ZkTlsSessionExpiredError = class extends BindError {
48
+ constructor(sessionId) {
49
+ super(`zkTLS session expired: ${sessionId}`, "ZKTLS_SESSION_EXPIRED", { sessionId });
50
+ this.sessionId = sessionId;
51
+ this.name = "ZkTlsSessionExpiredError";
52
+ }
53
+ };
54
+ var ZkTlsSessionFailedError = class extends BindError {
55
+ constructor(sessionId, sessionError) {
56
+ super(`zkTLS session failed: ${sessionError}`, "ZKTLS_SESSION_FAILED", { sessionId, sessionError });
57
+ this.sessionId = sessionId;
58
+ this.sessionError = sessionError;
59
+ this.name = "ZkTlsSessionFailedError";
60
+ }
61
+ };
62
+ var ZkTlsExtractorError = class extends BindError {
63
+ constructor(extractorId, message) {
64
+ super(message, "ZKTLS_EXTRACTOR_ERROR", { extractorId });
65
+ this.extractorId = extractorId;
66
+ this.name = "ZkTlsExtractorError";
67
+ }
68
+ };
47
69
 
48
70
  // src/core/client.ts
49
71
  var DEFAULT_BASE_URL = "https://api.bindprotocol.com";
50
72
  var DEFAULT_POLL_INTERVAL_MS = 2e3;
51
73
  var DEFAULT_TIMEOUT_MS = 3e5;
74
+ function deriveCircuitId(policyId, version) {
75
+ const sanitizedVersion = version.replace(/\./g, "_");
76
+ return `${policyId}.v${sanitizedVersion}`;
77
+ }
52
78
  var BindClient = class {
53
79
  apiKey;
54
80
  baseUrl;
@@ -158,7 +184,8 @@ var BindClient = class {
158
184
  response.status
159
185
  );
160
186
  }
161
- return response.json();
187
+ const json = await response.json();
188
+ return json.data ?? json;
162
189
  }
163
190
  /**
164
191
  * Get a specific policy by ID
@@ -179,6 +206,136 @@ var BindClient = class {
179
206
  response.status
180
207
  );
181
208
  }
209
+ const json = await response.json();
210
+ return json.data ?? json;
211
+ }
212
+ // ==========================================================================
213
+ // zkTLS Methods
214
+ // ==========================================================================
215
+ /**
216
+ * List available zkTLS extractors (data sources)
217
+ * @returns Array of available extractors
218
+ */
219
+ async listExtractors() {
220
+ const response = await this.fetch("/api/zktls/extractors");
221
+ return response.json();
222
+ }
223
+ /**
224
+ * List zkTLS attestations for the authenticated organization
225
+ * @returns Array of attestations
226
+ */
227
+ async listAttestations() {
228
+ const response = await this.fetch("/api/zktls/attestations");
229
+ return response.json();
230
+ }
231
+ /**
232
+ * Get a specific attestation by ID
233
+ * @param attestationId - The attestation UUID
234
+ * @returns The attestation or null if not found
235
+ */
236
+ async getAttestation(attestationId) {
237
+ const response = await this.fetch(`/api/zktls/attestations/${encodeURIComponent(attestationId)}`);
238
+ return response.json();
239
+ }
240
+ /**
241
+ * Create a new zkTLS session for data attestation
242
+ * @param extractorId - The extractor to use (e.g., "coinbase")
243
+ * @param callbackUrl - URL to redirect to after authentication
244
+ * @returns Session ID and auth URL to redirect user to
245
+ */
246
+ async createZkTlsSession(extractorId, callbackUrl) {
247
+ const response = await this.fetch("/api/zktls/sessions", {
248
+ method: "POST",
249
+ body: JSON.stringify({ extractor: extractorId, callbackUrl })
250
+ });
251
+ return response.json();
252
+ }
253
+ /**
254
+ * Get the status of a zkTLS session
255
+ * @param sessionId - The session UUID
256
+ * @returns Session status and attestation if completed
257
+ */
258
+ async getZkTlsSession(sessionId) {
259
+ const response = await this.fetch(`/api/zktls/sessions/${encodeURIComponent(sessionId)}`);
260
+ return response.json();
261
+ }
262
+ /**
263
+ * Wait for a zkTLS session to complete
264
+ * @param sessionId - The session UUID
265
+ * @param options - Polling options
266
+ * @returns The completed session with attestation
267
+ * @throws {ZkTlsSessionExpiredError} If session expires
268
+ * @throws {ZkTlsSessionFailedError} If session fails
269
+ * @throws {TimeoutError} If timeout is reached
270
+ */
271
+ async waitForZkTlsSession(sessionId, options = {}) {
272
+ const intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;
273
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
274
+ const startTime = Date.now();
275
+ while (Date.now() - startTime < timeoutMs) {
276
+ const result = await this.getZkTlsSession(sessionId);
277
+ if (!result.success || !result.data) {
278
+ throw new ApiError(
279
+ result.error || "Failed to get zkTLS session",
280
+ 500,
281
+ result
282
+ );
283
+ }
284
+ const session = result.data;
285
+ if (options.onProgress) {
286
+ options.onProgress(session);
287
+ }
288
+ if (session.status === "completed") {
289
+ return session;
290
+ }
291
+ if (session.status === "failed") {
292
+ throw new ZkTlsSessionFailedError(sessionId, session.error || "Unknown error");
293
+ }
294
+ if (session.status === "expired") {
295
+ throw new ZkTlsSessionExpiredError(sessionId);
296
+ }
297
+ await this.sleep(intervalMs);
298
+ }
299
+ throw new TimeoutError(
300
+ `Timeout waiting for zkTLS session ${sessionId} after ${timeoutMs}ms`,
301
+ timeoutMs
302
+ );
303
+ }
304
+ // ==========================================================================
305
+ // Circuit Methods
306
+ // ==========================================================================
307
+ /**
308
+ * List available circuits
309
+ * @param options - Optional filters
310
+ * @returns Array of circuits
311
+ */
312
+ async listCircuits(options = {}) {
313
+ const params = new URLSearchParams();
314
+ if (options.status) params.set("status", options.status);
315
+ if (options.policyId) params.set("policyId", options.policyId);
316
+ const queryString = params.toString();
317
+ const path = queryString ? `/api/circuits?${queryString}` : "/api/circuits";
318
+ const response = await this.fetch(path);
319
+ return response.json();
320
+ }
321
+ /**
322
+ * Get a specific circuit by ID
323
+ * @param circuitId - The circuit identifier
324
+ * @returns The circuit details or null if not found
325
+ */
326
+ async getCircuit(circuitId) {
327
+ const response = await this.fetch(`/api/circuits/${encodeURIComponent(circuitId)}`);
328
+ return response.json();
329
+ }
330
+ /**
331
+ * Activate a circuit (requires validation to have passed)
332
+ * @param circuitId - The circuit identifier to activate
333
+ * @returns The activation result
334
+ */
335
+ async activateCircuit(circuitId) {
336
+ const response = await this.fetch(`/api/circuits/${encodeURIComponent(circuitId)}/activate`, {
337
+ method: "POST"
338
+ });
182
339
  return response.json();
183
340
  }
184
341
  // ==========================================================================
@@ -302,16 +459,173 @@ function createDimoAdapter(config) {
302
459
  return new DimoAdapter(config);
303
460
  }
304
461
 
462
+ // src/adapters/zktls/adapter.ts
463
+ var ZkTlsAdapter = class {
464
+ client;
465
+ constructor(config) {
466
+ this.client = new BindClient({
467
+ apiKey: config.apiKey,
468
+ baseUrl: config.baseUrl
469
+ });
470
+ }
471
+ /**
472
+ * Fetch attestation data - either from existing attestation or by creating session
473
+ */
474
+ async fetchData(query) {
475
+ if (query.attestationId) {
476
+ return this.fetchExistingAttestation(query.attestationId);
477
+ }
478
+ if (query.callbackUrl) {
479
+ return this.initiateSession(query.callbackUrl);
480
+ }
481
+ throw new Error("Either attestationId or callbackUrl must be provided");
482
+ }
483
+ /**
484
+ * Get supported circuits
485
+ */
486
+ getSupportedCircuits() {
487
+ return [...this.supportedCircuits];
488
+ }
489
+ /**
490
+ * Create a zkTLS session and return the auth URL
491
+ * Client should redirect user to this URL
492
+ */
493
+ async createSession(callbackUrl) {
494
+ const result = await this.client.createZkTlsSession(this.extractorId, callbackUrl);
495
+ if (!result.success || !result.data) {
496
+ throw new Error(result.error || "Failed to create zkTLS session");
497
+ }
498
+ return result.data;
499
+ }
500
+ /**
501
+ * Wait for session completion and return attestation
502
+ */
503
+ async waitForSession(sessionId, options) {
504
+ const session = await this.client.waitForZkTlsSession(sessionId, options);
505
+ if (!session.attestation) {
506
+ throw new Error("Session completed but no attestation found");
507
+ }
508
+ const extractors = await this.client.listExtractors();
509
+ const extractor = extractors.data?.find((e) => e.id === this.extractorId);
510
+ if (!extractor) {
511
+ throw new Error(`Extractor not found: ${this.extractorId}`);
512
+ }
513
+ return {
514
+ attestation: session.attestation,
515
+ extractor
516
+ };
517
+ }
518
+ // ===========================================================================
519
+ // Protected helpers
520
+ // ===========================================================================
521
+ async fetchExistingAttestation(attestationId) {
522
+ const result = await this.client.getAttestation(attestationId);
523
+ if (!result.success || !result.data) {
524
+ throw new Error(result.error || "Attestation not found");
525
+ }
526
+ const extractors = await this.client.listExtractors();
527
+ const extractor = extractors.data?.find((e) => e.id === result.data.extractor);
528
+ if (!extractor) {
529
+ throw new Error(`Extractor not found: ${result.data.extractor}`);
530
+ }
531
+ return {
532
+ attestation: result.data,
533
+ extractor
534
+ };
535
+ }
536
+ async initiateSession(callbackUrl) {
537
+ const { sessionId } = await this.createSession(callbackUrl);
538
+ return this.waitForSession(sessionId);
539
+ }
540
+ validateCircuit(circuitId) {
541
+ if (!this.supportedCircuits.includes(circuitId)) {
542
+ throw new Error(
543
+ `Circuit "${circuitId}" is not supported by ${this.name}. Supported circuits: ${this.supportedCircuits.join(", ")}`
544
+ );
545
+ }
546
+ }
547
+ };
548
+
549
+ // src/adapters/zktls/coinbase.ts
550
+ var SUPPORTED_CIRCUITS2 = [
551
+ "bind.identity.kyc.v1",
552
+ "bind.identity.coinbase.v1"
553
+ ];
554
+ var CoinbaseAdapter = class extends ZkTlsAdapter {
555
+ id = "coinbase-kyc";
556
+ name = "Coinbase KYC";
557
+ description = "Fetches KYC verification status from Coinbase via zkTLS attestation";
558
+ extractorId = "coinbase";
559
+ supportedCircuits = SUPPORTED_CIRCUITS2;
560
+ constructor(config) {
561
+ super(config);
562
+ }
563
+ /**
564
+ * Transform Coinbase attestation to circuit inputs
565
+ */
566
+ toCircuitInputs(data, circuitId) {
567
+ this.validateCircuit(circuitId);
568
+ const claims = data.attestation.claims;
569
+ switch (circuitId) {
570
+ case "bind.identity.kyc.v1":
571
+ return this.toKycInputs(data, claims);
572
+ case "bind.identity.coinbase.v1":
573
+ return this.toCoinbaseInputs(data, claims);
574
+ default:
575
+ throw new Error(`No input transformer for circuit: ${circuitId}`);
576
+ }
577
+ }
578
+ // ===========================================================================
579
+ // Private transformers
580
+ // ===========================================================================
581
+ toKycInputs(data, claims) {
582
+ return {
583
+ kycVerified: String(claims.kyc_verified),
584
+ kycLevel: String(claims.kyc_level ?? 0),
585
+ countryCode: claims.country_code ?? "",
586
+ attestationId: data.attestation.id,
587
+ witnessId: data.attestation.witness.id,
588
+ signature: data.attestation.signature,
589
+ timestamp: String(data.attestation.createdAt)
590
+ };
591
+ }
592
+ toCoinbaseInputs(data, claims) {
593
+ return {
594
+ kycVerified: String(claims.kyc_verified),
595
+ kycLevel: String(claims.kyc_level ?? 0),
596
+ countryCode: claims.country_code ?? "",
597
+ accountCreatedAt: claims.account_created_at ?? "",
598
+ attestationId: data.attestation.id,
599
+ witnessId: data.attestation.witness.id,
600
+ witnessPublicKey: data.attestation.witness.publicKey,
601
+ signature: data.attestation.signature,
602
+ url: data.attestation.url,
603
+ method: data.attestation.method,
604
+ expiresAt: String(data.attestation.expiresAt)
605
+ };
606
+ }
607
+ };
608
+ function createCoinbaseAdapter(config) {
609
+ return new CoinbaseAdapter(config);
610
+ }
611
+
305
612
  exports.ApiError = ApiError;
306
613
  exports.AuthenticationError = AuthenticationError;
307
614
  exports.BindClient = BindClient;
308
615
  exports.BindError = BindError;
616
+ exports.CoinbaseAdapter = CoinbaseAdapter;
309
617
  exports.DimoAdapter = DimoAdapter;
310
618
  exports.InsufficientCreditsError = InsufficientCreditsError;
311
619
  exports.TimeoutError = TimeoutError;
620
+ exports.ZkTlsAdapter = ZkTlsAdapter;
621
+ exports.ZkTlsExtractorError = ZkTlsExtractorError;
622
+ exports.ZkTlsSessionExpiredError = ZkTlsSessionExpiredError;
623
+ exports.ZkTlsSessionFailedError = ZkTlsSessionFailedError;
312
624
  exports.buildCustomTelemetryQuery = buildCustomTelemetryQuery;
313
625
  exports.buildTelemetryQuery = buildTelemetryQuery;
626
+ exports.createCoinbaseAdapter = createCoinbaseAdapter;
314
627
  exports.createDimoAdapter = createDimoAdapter;
315
628
  exports.default = BindClient;
629
+ exports.deriveCircuitId = deriveCircuitId;
316
630
  //# sourceMappingURL=index.cjs.map
317
631
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/adapters/dimo/queries.ts","../src/adapters/dimo/adapter.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Custom error classes for the Bind Protocol SDK\n */\n\nexport class BindError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'BindError';\n }\n}\n\nexport class ApiError extends BindError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly response?: unknown\n ) {\n super(message, 'API_ERROR', { status, response });\n this.name = 'ApiError';\n }\n}\n\nexport class AuthenticationError extends BindError {\n constructor(message = 'Authentication failed') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class TimeoutError extends BindError {\n constructor(message: string, public readonly timeoutMs: number) {\n super(message, 'TIMEOUT_ERROR', { timeoutMs });\n this.name = 'TimeoutError';\n }\n}\n\nexport class InsufficientCreditsError extends BindError {\n constructor(\n public readonly required: number,\n public readonly available: number\n ) {\n super(\n `Insufficient credits: need ${required}, have ${available}`,\n 'INSUFFICIENT_CREDITS',\n { required, available }\n );\n this.name = 'InsufficientCreditsError';\n }\n}\n","/**\n * BindClient - Main client for interacting with the Bind Protocol API\n */\nimport type { PublicPolicySpec } from '@bind-protocol/policy-spec';\nimport {\n ApiError,\n AuthenticationError,\n InsufficientCreditsError,\n TimeoutError,\n} from './errors';\nimport type {\n BindClientOptions,\n ProveJobInputs,\n SubmitProveJobResponse,\n GetProveJobResponse,\n ListProveJobsOptions,\n ListProveJobsResponse,\n ProveJob,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.bindprotocol.com';\nconst DEFAULT_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\n\nexport class BindClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(options: BindClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || process.env.BIND_API_URL || DEFAULT_BASE_URL;\n this.headers = {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n };\n }\n\n // ==========================================================================\n // Prove Job Methods\n // ==========================================================================\n\n /**\n * Submit a prove job for async processing\n * @param circuitId - The circuit identifier (e.g., \"bind.mobility.riskband.v1\")\n * @param inputs - Circuit inputs as key-value pairs (all values must be strings)\n * @returns The submitted job details\n * @throws {ApiError} If the API request fails\n * @throws {InsufficientCreditsError} If there aren't enough credits\n */\n async submitProveJob(\n circuitId: string,\n inputs: ProveJobInputs\n ): Promise<SubmitProveJobResponse> {\n const response = await this.fetch('/api/prove', {\n method: 'POST',\n body: JSON.stringify({ circuitId, inputs }),\n });\n\n const result: SubmitProveJobResponse = await response.json();\n\n // Check for insufficient credits\n if (!result.success && result.requiredCredits !== undefined && result.availableCredits !== undefined) {\n throw new InsufficientCreditsError(result.requiredCredits, result.availableCredits);\n }\n\n return result;\n }\n\n /**\n * Get the status and results of a prove job\n * @param jobId - The unique job identifier\n * @returns The job details including status and outputs\n */\n async getProveJob(jobId: string): Promise<GetProveJobResponse> {\n const response = await this.fetch(`/api/prove/${encodeURIComponent(jobId)}`);\n return response.json();\n }\n\n /**\n * List prove jobs for the authenticated organization\n * @param options - Optional filters for status, limit, and offset\n * @returns Paginated list of prove jobs\n */\n async listProveJobs(options: ListProveJobsOptions = {}): Promise<ListProveJobsResponse> {\n const params = new URLSearchParams();\n if (options.status) params.set('status', options.status);\n if (options.limit !== undefined) params.set('limit', options.limit.toString());\n if (options.offset !== undefined) params.set('offset', options.offset.toString());\n\n const queryString = params.toString();\n const path = queryString ? `/api/prove?${queryString}` : '/api/prove';\n\n const response = await this.fetch(path);\n return response.json();\n }\n\n /**\n * Poll for prove job completion\n * @param jobId - The unique job identifier\n * @param options - Polling options\n * @returns The completed or failed job\n * @throws {TimeoutError} If the job doesn't complete within the timeout\n */\n async waitForProveJob(\n jobId: string,\n options: {\n intervalMs?: number;\n timeoutMs?: number;\n onProgress?: (job: ProveJob) => void;\n } = {}\n ): Promise<ProveJob> {\n const intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const result = await this.getProveJob(jobId);\n\n if (!result.success || !result.data) {\n throw new ApiError(\n result.error || 'Failed to get prove job',\n 500,\n result\n );\n }\n\n const job = result.data;\n\n if (options.onProgress) {\n options.onProgress(job);\n }\n\n if (job.status === 'completed' || job.status === 'failed') {\n return job;\n }\n\n await this.sleep(intervalMs);\n }\n\n throw new TimeoutError(\n `Timeout waiting for prove job ${jobId} after ${timeoutMs}ms`,\n timeoutMs\n );\n }\n\n // ==========================================================================\n // Policy Methods (Public, no authentication required)\n // ==========================================================================\n\n /**\n * List all available public policies\n * @returns Array of public policy specifications\n */\n async listPolicies(): Promise<PublicPolicySpec[]> {\n const response = await fetch(`${this.baseUrl}/api/policies`, {\n method: 'GET',\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch policies: ${response.statusText}`,\n response.status\n );\n }\n\n return response.json();\n }\n\n /**\n * Get a specific policy by ID\n * @param policyId - The unique policy identifier\n * @returns The public policy specification, or null if not found\n */\n async getPolicy(policyId: string): Promise<PublicPolicySpec | null> {\n const response = await fetch(\n `${this.baseUrl}/api/policies/${encodeURIComponent(policyId)}`,\n { method: 'GET' }\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch policy: ${response.statusText}`,\n response.status\n );\n }\n\n return response.json();\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n private async fetch(path: string, init?: RequestInit): Promise<Response> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: {\n ...this.headers,\n ...init?.headers,\n },\n });\n\n if (response.status === 401) {\n throw new AuthenticationError();\n }\n\n return response;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * DIMO GraphQL query builders\n */\n\n/**\n * Build a GraphQL query for fetching vehicle telemetry\n * @param vehicleTokenId - The DIMO vehicle token ID\n * @param from - Start date (ISO 8601 or date string)\n * @param to - End date (ISO 8601 or date string)\n * @returns GraphQL query string\n */\nexport function buildTelemetryQuery(\n vehicleTokenId: string,\n from: string,\n to: string\n): string {\n return `{\n signals(\n tokenId: ${vehicleTokenId},\n interval: \"1h\",\n from: ${from},\n to: ${to}\n ) {\n powertrainTransmissionTravelledDistance(agg: AVG)\n speed(agg: AVG)\n powertrainCombustionEngineSpeed(agg: AVG)\n obdEngineLoad(agg: AVG)\n obdDTCList(agg: UNIQUE)\n obdRunTime(agg: AVG)\n timestamp\n }\n}`;\n}\n\n/**\n * Build a GraphQL query for fetching specific signals\n * Allows customization of which signals to fetch and their aggregation\n */\nexport function buildCustomTelemetryQuery(\n vehicleTokenId: string,\n from: string,\n to: string,\n signals: Array<{\n name: string;\n aggregation?: 'AVG' | 'SUM' | 'MIN' | 'MAX' | 'UNIQUE' | 'COUNT';\n }>,\n interval = '1h'\n): string {\n const signalLines = signals\n .map((s) => {\n if (s.aggregation) {\n return ` ${s.name}(agg: ${s.aggregation})`;\n }\n return ` ${s.name}`;\n })\n .join('\\n');\n\n return `{\n signals(\n tokenId: ${vehicleTokenId},\n interval: \"${interval}\",\n from: ${from},\n to: ${to}\n ) {\n${signalLines}\n timestamp\n }\n}`;\n}\n","/**\n * DIMO Adapter\n *\n * Fetches vehicle telemetry data from the DIMO network and transforms it\n * into circuit inputs for Bind Protocol prove jobs.\n */\n\nimport type { DataAdapter } from '../types';\nimport type { ProveJobInputs } from '../../core/types';\nimport type { DimoAdapterConfig, DimoQuery, DimoTelemetryData, DimoClient } from './types';\nimport { buildTelemetryQuery } from './queries';\n\nconst SUPPORTED_CIRCUITS = [\n 'bind.mobility.riskband.v1',\n];\n\nexport class DimoAdapter implements DataAdapter<DimoAdapterConfig, DimoQuery, DimoTelemetryData> {\n readonly id = 'dimo';\n readonly name = 'DIMO Network';\n readonly description = 'Fetches vehicle telemetry data from the DIMO decentralized network';\n\n private readonly dimoClient: DimoClient;\n\n constructor(config: DimoAdapterConfig) {\n this.dimoClient = config.dimoClient;\n }\n\n /**\n * Fetch telemetry data from DIMO for a vehicle\n * @param query - Query parameters including vehicle token ID and date range\n * @returns Raw telemetry data from DIMO\n */\n async fetchData(query: DimoQuery): Promise<DimoTelemetryData> {\n const graphqlQuery = buildTelemetryQuery(query.vehicleTokenId, query.from, query.to);\n const result = await this.dimoClient.telemetry.query(graphqlQuery);\n return result;\n }\n\n /**\n * Transform DIMO telemetry data into circuit inputs\n * @param data - Raw telemetry data from DIMO\n * @param circuitId - Target circuit ID\n * @returns Inputs ready for prove job submission\n */\n toCircuitInputs(data: DimoTelemetryData, circuitId: string): ProveJobInputs {\n if (!SUPPORTED_CIRCUITS.includes(circuitId)) {\n throw new Error(\n `Circuit \"${circuitId}\" is not supported by the DIMO adapter. ` +\n `Supported circuits: ${SUPPORTED_CIRCUITS.join(', ')}`\n );\n }\n\n // Transform based on circuit type\n switch (circuitId) {\n case 'bind.mobility.riskband.v1':\n return this.toRiskBandInputs(data);\n default:\n throw new Error(`No input transformer for circuit: ${circuitId}`);\n }\n }\n\n /**\n * Get the list of circuits this adapter supports\n */\n getSupportedCircuits(): string[] {\n return [...SUPPORTED_CIRCUITS];\n }\n\n // ===========================================================================\n // Private transformers\n // ===========================================================================\n\n private toRiskBandInputs(data: DimoTelemetryData): ProveJobInputs {\n return {\n signals: JSON.stringify(data.signals),\n timestamp: data.timestamp,\n };\n }\n}\n\n/**\n * Factory function to create a DIMO adapter\n */\nexport function createDimoAdapter(config: DimoAdapterConfig): DimoAdapter {\n return new DimoAdapter(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/adapters/dimo/queries.ts","../src/adapters/dimo/adapter.ts","../src/adapters/zktls/adapter.ts","../src/adapters/zktls/coinbase.ts"],"names":["SUPPORTED_CIRCUITS"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Custom error classes for the Bind Protocol SDK\n */\n\nexport class BindError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'BindError';\n }\n}\n\nexport class ApiError extends BindError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly response?: unknown\n ) {\n super(message, 'API_ERROR', { status, response });\n this.name = 'ApiError';\n }\n}\n\nexport class AuthenticationError extends BindError {\n constructor(message = 'Authentication failed') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class TimeoutError extends BindError {\n constructor(message: string, public readonly timeoutMs: number) {\n super(message, 'TIMEOUT_ERROR', { timeoutMs });\n this.name = 'TimeoutError';\n }\n}\n\nexport class InsufficientCreditsError extends BindError {\n constructor(\n public readonly required: number,\n public readonly available: number\n ) {\n super(\n `Insufficient credits: need ${required}, have ${available}`,\n 'INSUFFICIENT_CREDITS',\n { required, available }\n );\n this.name = 'InsufficientCreditsError';\n }\n}\n\n/**\n * Thrown when a zkTLS session expires before completion\n */\nexport class ZkTlsSessionExpiredError extends BindError {\n constructor(public readonly sessionId: string) {\n super(`zkTLS session expired: ${sessionId}`, 'ZKTLS_SESSION_EXPIRED', { sessionId });\n this.name = 'ZkTlsSessionExpiredError';\n }\n}\n\n/**\n * Thrown when a zkTLS session fails\n */\nexport class ZkTlsSessionFailedError extends BindError {\n constructor(\n public readonly sessionId: string,\n public readonly sessionError: string\n ) {\n super(`zkTLS session failed: ${sessionError}`, 'ZKTLS_SESSION_FAILED', { sessionId, sessionError });\n this.name = 'ZkTlsSessionFailedError';\n }\n}\n\n/**\n * Thrown when an extractor is not found or disabled\n */\nexport class ZkTlsExtractorError extends BindError {\n constructor(\n public readonly extractorId: string,\n message: string\n ) {\n super(message, 'ZKTLS_EXTRACTOR_ERROR', { extractorId });\n this.name = 'ZkTlsExtractorError';\n }\n}\n","/**\n * BindClient - Main client for interacting with the Bind Protocol API\n */\nimport type { PublicPolicySpec } from '@bind-protocol/policy-spec';\nimport {\n ApiError,\n AuthenticationError,\n InsufficientCreditsError,\n TimeoutError,\n ZkTlsSessionExpiredError,\n ZkTlsSessionFailedError,\n} from './errors';\nimport type {\n BindClientOptions,\n ProveJobInputs,\n SubmitProveJobResponse,\n GetProveJobResponse,\n ListProveJobsOptions,\n ListProveJobsResponse,\n ProveJob,\n ListExtractorsResponse,\n ListAttestationsResponse,\n GetAttestationResponse,\n CreateSessionResponse,\n GetSessionResponse,\n ZkTlsSession,\n Circuit,\n ListCircuitsResponse,\n GetCircuitResponse,\n ActivateCircuitResponse,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.bindprotocol.com';\nconst DEFAULT_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_TIMEOUT_MS = 300000; // 5 minutes\n\n/**\n * Derive a circuit ID from policy ID and version\n * This matches the server's auto-generation logic.\n * Format: {policyId}.v{version} with version dots replaced by underscores\n *\n * @example\n * deriveCircuitId(\"bind.demo.credit-score\", \"0.1.0\")\n * // Returns: \"bind.demo.credit-score.v0_1_0\"\n */\nexport function deriveCircuitId(policyId: string, version: string): string {\n const sanitizedVersion = version.replace(/\\./g, '_');\n return `${policyId}.v${sanitizedVersion}`;\n}\n\nexport class BindClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(options: BindClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || process.env.BIND_API_URL || DEFAULT_BASE_URL;\n this.headers = {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n };\n }\n\n // ==========================================================================\n // Prove Job Methods\n // ==========================================================================\n\n /**\n * Submit a prove job for async processing\n * @param circuitId - The circuit identifier (e.g., \"bind.mobility.riskband.v1\")\n * @param inputs - Circuit inputs as key-value pairs (all values must be strings)\n * @returns The submitted job details\n * @throws {ApiError} If the API request fails\n * @throws {InsufficientCreditsError} If there aren't enough credits\n */\n async submitProveJob(\n circuitId: string,\n inputs: ProveJobInputs\n ): Promise<SubmitProveJobResponse> {\n const response = await this.fetch('/api/prove', {\n method: 'POST',\n body: JSON.stringify({ circuitId, inputs }),\n });\n\n const result: SubmitProveJobResponse = await response.json();\n\n // Check for insufficient credits\n if (!result.success && result.requiredCredits !== undefined && result.availableCredits !== undefined) {\n throw new InsufficientCreditsError(result.requiredCredits, result.availableCredits);\n }\n\n return result;\n }\n\n /**\n * Get the status and results of a prove job\n * @param jobId - The unique job identifier\n * @returns The job details including status and outputs\n */\n async getProveJob(jobId: string): Promise<GetProveJobResponse> {\n const response = await this.fetch(`/api/prove/${encodeURIComponent(jobId)}`);\n return response.json();\n }\n\n /**\n * List prove jobs for the authenticated organization\n * @param options - Optional filters for status, limit, and offset\n * @returns Paginated list of prove jobs\n */\n async listProveJobs(options: ListProveJobsOptions = {}): Promise<ListProveJobsResponse> {\n const params = new URLSearchParams();\n if (options.status) params.set('status', options.status);\n if (options.limit !== undefined) params.set('limit', options.limit.toString());\n if (options.offset !== undefined) params.set('offset', options.offset.toString());\n\n const queryString = params.toString();\n const path = queryString ? `/api/prove?${queryString}` : '/api/prove';\n\n const response = await this.fetch(path);\n return response.json();\n }\n\n /**\n * Poll for prove job completion\n * @param jobId - The unique job identifier\n * @param options - Polling options\n * @returns The completed or failed job\n * @throws {TimeoutError} If the job doesn't complete within the timeout\n */\n async waitForProveJob(\n jobId: string,\n options: {\n intervalMs?: number;\n timeoutMs?: number;\n onProgress?: (job: ProveJob) => void;\n } = {}\n ): Promise<ProveJob> {\n const intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const result = await this.getProveJob(jobId);\n\n if (!result.success || !result.data) {\n throw new ApiError(\n result.error || 'Failed to get prove job',\n 500,\n result\n );\n }\n\n const job = result.data;\n\n if (options.onProgress) {\n options.onProgress(job);\n }\n\n if (job.status === 'completed' || job.status === 'failed') {\n return job;\n }\n\n await this.sleep(intervalMs);\n }\n\n throw new TimeoutError(\n `Timeout waiting for prove job ${jobId} after ${timeoutMs}ms`,\n timeoutMs\n );\n }\n\n // ==========================================================================\n // Policy Methods (Public, no authentication required)\n // ==========================================================================\n\n /**\n * List all available public policies\n * @returns Array of public policy specifications\n */\n async listPolicies(): Promise<PublicPolicySpec[]> {\n const response = await fetch(`${this.baseUrl}/api/policies`, {\n method: 'GET',\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch policies: ${response.statusText}`,\n response.status\n );\n }\n\n const json = await response.json();\n // API wraps response in { success, data }\n return json.data ?? json;\n }\n\n /**\n * Get a specific policy by ID\n * @param policyId - The unique policy identifier\n * @returns The public policy specification, or null if not found\n */\n async getPolicy(policyId: string): Promise<PublicPolicySpec | null> {\n const response = await fetch(\n `${this.baseUrl}/api/policies/${encodeURIComponent(policyId)}`,\n { method: 'GET' }\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch policy: ${response.statusText}`,\n response.status\n );\n }\n\n const json = await response.json();\n // API wraps response in { success, data }\n return json.data ?? json;\n }\n\n // ==========================================================================\n // zkTLS Methods\n // ==========================================================================\n\n /**\n * List available zkTLS extractors (data sources)\n * @returns Array of available extractors\n */\n async listExtractors(): Promise<ListExtractorsResponse> {\n const response = await this.fetch('/api/zktls/extractors');\n return response.json();\n }\n\n /**\n * List zkTLS attestations for the authenticated organization\n * @returns Array of attestations\n */\n async listAttestations(): Promise<ListAttestationsResponse> {\n const response = await this.fetch('/api/zktls/attestations');\n return response.json();\n }\n\n /**\n * Get a specific attestation by ID\n * @param attestationId - The attestation UUID\n * @returns The attestation or null if not found\n */\n async getAttestation(attestationId: string): Promise<GetAttestationResponse> {\n const response = await this.fetch(`/api/zktls/attestations/${encodeURIComponent(attestationId)}`);\n return response.json();\n }\n\n /**\n * Create a new zkTLS session for data attestation\n * @param extractorId - The extractor to use (e.g., \"coinbase\")\n * @param callbackUrl - URL to redirect to after authentication\n * @returns Session ID and auth URL to redirect user to\n */\n async createZkTlsSession(\n extractorId: string,\n callbackUrl: string\n ): Promise<CreateSessionResponse> {\n const response = await this.fetch('/api/zktls/sessions', {\n method: 'POST',\n body: JSON.stringify({ extractor: extractorId, callbackUrl }),\n });\n return response.json();\n }\n\n /**\n * Get the status of a zkTLS session\n * @param sessionId - The session UUID\n * @returns Session status and attestation if completed\n */\n async getZkTlsSession(sessionId: string): Promise<GetSessionResponse> {\n const response = await this.fetch(`/api/zktls/sessions/${encodeURIComponent(sessionId)}`);\n return response.json();\n }\n\n /**\n * Wait for a zkTLS session to complete\n * @param sessionId - The session UUID\n * @param options - Polling options\n * @returns The completed session with attestation\n * @throws {ZkTlsSessionExpiredError} If session expires\n * @throws {ZkTlsSessionFailedError} If session fails\n * @throws {TimeoutError} If timeout is reached\n */\n async waitForZkTlsSession(\n sessionId: string,\n options: {\n intervalMs?: number;\n timeoutMs?: number;\n onProgress?: (session: ZkTlsSession) => void;\n } = {}\n ): Promise<ZkTlsSession> {\n const intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const result = await this.getZkTlsSession(sessionId);\n\n if (!result.success || !result.data) {\n throw new ApiError(\n result.error || 'Failed to get zkTLS session',\n 500,\n result\n );\n }\n\n const session = result.data;\n\n if (options.onProgress) {\n options.onProgress(session);\n }\n\n if (session.status === 'completed') {\n return session;\n }\n\n if (session.status === 'failed') {\n throw new ZkTlsSessionFailedError(sessionId, session.error || 'Unknown error');\n }\n\n if (session.status === 'expired') {\n throw new ZkTlsSessionExpiredError(sessionId);\n }\n\n await this.sleep(intervalMs);\n }\n\n throw new TimeoutError(\n `Timeout waiting for zkTLS session ${sessionId} after ${timeoutMs}ms`,\n timeoutMs\n );\n }\n\n // ==========================================================================\n // Circuit Methods\n // ==========================================================================\n\n /**\n * List available circuits\n * @param options - Optional filters\n * @returns Array of circuits\n */\n async listCircuits(options: { status?: 'active' | 'all'; policyId?: string } = {}): Promise<ListCircuitsResponse> {\n const params = new URLSearchParams();\n if (options.status) params.set('status', options.status);\n if (options.policyId) params.set('policyId', options.policyId);\n\n const queryString = params.toString();\n const path = queryString ? `/api/circuits?${queryString}` : '/api/circuits';\n\n const response = await this.fetch(path);\n return response.json();\n }\n\n /**\n * Get a specific circuit by ID\n * @param circuitId - The circuit identifier\n * @returns The circuit details or null if not found\n */\n async getCircuit(circuitId: string): Promise<GetCircuitResponse> {\n const response = await this.fetch(`/api/circuits/${encodeURIComponent(circuitId)}`);\n return response.json();\n }\n\n /**\n * Activate a circuit (requires validation to have passed)\n * @param circuitId - The circuit identifier to activate\n * @returns The activation result\n */\n async activateCircuit(circuitId: string): Promise<ActivateCircuitResponse> {\n const response = await this.fetch(`/api/circuits/${encodeURIComponent(circuitId)}/activate`, {\n method: 'POST',\n });\n return response.json();\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n private async fetch(path: string, init?: RequestInit): Promise<Response> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: {\n ...this.headers,\n ...init?.headers,\n },\n });\n\n if (response.status === 401) {\n throw new AuthenticationError();\n }\n\n return response;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * DIMO GraphQL query builders\n */\n\n/**\n * Build a GraphQL query for fetching vehicle telemetry\n * @param vehicleTokenId - The DIMO vehicle token ID\n * @param from - Start date (ISO 8601 or date string)\n * @param to - End date (ISO 8601 or date string)\n * @returns GraphQL query string\n */\nexport function buildTelemetryQuery(\n vehicleTokenId: string,\n from: string,\n to: string\n): string {\n return `{\n signals(\n tokenId: ${vehicleTokenId},\n interval: \"1h\",\n from: ${from},\n to: ${to}\n ) {\n powertrainTransmissionTravelledDistance(agg: AVG)\n speed(agg: AVG)\n powertrainCombustionEngineSpeed(agg: AVG)\n obdEngineLoad(agg: AVG)\n obdDTCList(agg: UNIQUE)\n obdRunTime(agg: AVG)\n timestamp\n }\n}`;\n}\n\n/**\n * Build a GraphQL query for fetching specific signals\n * Allows customization of which signals to fetch and their aggregation\n */\nexport function buildCustomTelemetryQuery(\n vehicleTokenId: string,\n from: string,\n to: string,\n signals: Array<{\n name: string;\n aggregation?: 'AVG' | 'SUM' | 'MIN' | 'MAX' | 'UNIQUE' | 'COUNT';\n }>,\n interval = '1h'\n): string {\n const signalLines = signals\n .map((s) => {\n if (s.aggregation) {\n return ` ${s.name}(agg: ${s.aggregation})`;\n }\n return ` ${s.name}`;\n })\n .join('\\n');\n\n return `{\n signals(\n tokenId: ${vehicleTokenId},\n interval: \"${interval}\",\n from: ${from},\n to: ${to}\n ) {\n${signalLines}\n timestamp\n }\n}`;\n}\n","/**\n * DIMO Adapter\n *\n * Fetches vehicle telemetry data from the DIMO network and transforms it\n * into circuit inputs for Bind Protocol prove jobs.\n */\n\nimport type { DataAdapter } from '../types';\nimport type { ProveJobInputs } from '../../core/types';\nimport type { DimoAdapterConfig, DimoQuery, DimoTelemetryData, DimoClient } from './types';\nimport { buildTelemetryQuery } from './queries';\n\nconst SUPPORTED_CIRCUITS = [\n 'bind.mobility.riskband.v1',\n];\n\nexport class DimoAdapter implements DataAdapter<DimoAdapterConfig, DimoQuery, DimoTelemetryData> {\n readonly id = 'dimo';\n readonly name = 'DIMO Network';\n readonly description = 'Fetches vehicle telemetry data from the DIMO decentralized network';\n\n private readonly dimoClient: DimoClient;\n\n constructor(config: DimoAdapterConfig) {\n this.dimoClient = config.dimoClient;\n }\n\n /**\n * Fetch telemetry data from DIMO for a vehicle\n * @param query - Query parameters including vehicle token ID and date range\n * @returns Raw telemetry data from DIMO\n */\n async fetchData(query: DimoQuery): Promise<DimoTelemetryData> {\n const graphqlQuery = buildTelemetryQuery(query.vehicleTokenId, query.from, query.to);\n const result = await this.dimoClient.telemetry.query(graphqlQuery);\n return result;\n }\n\n /**\n * Transform DIMO telemetry data into circuit inputs\n * @param data - Raw telemetry data from DIMO\n * @param circuitId - Target circuit ID\n * @returns Inputs ready for prove job submission\n */\n toCircuitInputs(data: DimoTelemetryData, circuitId: string): ProveJobInputs {\n if (!SUPPORTED_CIRCUITS.includes(circuitId)) {\n throw new Error(\n `Circuit \"${circuitId}\" is not supported by the DIMO adapter. ` +\n `Supported circuits: ${SUPPORTED_CIRCUITS.join(', ')}`\n );\n }\n\n // Transform based on circuit type\n switch (circuitId) {\n case 'bind.mobility.riskband.v1':\n return this.toRiskBandInputs(data);\n default:\n throw new Error(`No input transformer for circuit: ${circuitId}`);\n }\n }\n\n /**\n * Get the list of circuits this adapter supports\n */\n getSupportedCircuits(): string[] {\n return [...SUPPORTED_CIRCUITS];\n }\n\n // ===========================================================================\n // Private transformers\n // ===========================================================================\n\n private toRiskBandInputs(data: DimoTelemetryData): ProveJobInputs {\n return {\n signals: JSON.stringify(data.signals),\n timestamp: data.timestamp,\n };\n }\n}\n\n/**\n * Factory function to create a DIMO adapter\n */\nexport function createDimoAdapter(config: DimoAdapterConfig): DimoAdapter {\n return new DimoAdapter(config);\n}\n","/**\n * Base zkTLS Adapter\n *\n * Provides common functionality for zkTLS-based data sources.\n */\n\nimport { BindClient } from '../../core/client';\nimport type { DataAdapter } from '../types';\nimport type { ProveJobInputs } from '../../core/types';\nimport type { ZkTlsAdapterConfig, ZkTlsQuery, ZkTlsAttestationData } from './types';\n\nexport abstract class ZkTlsAdapter implements DataAdapter<ZkTlsAdapterConfig, ZkTlsQuery, ZkTlsAttestationData> {\n abstract readonly id: string;\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly extractorId: string;\n protected abstract readonly supportedCircuits: string[];\n\n protected readonly client: BindClient;\n\n constructor(config: ZkTlsAdapterConfig) {\n this.client = new BindClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n }\n\n /**\n * Fetch attestation data - either from existing attestation or by creating session\n */\n async fetchData(query: ZkTlsQuery): Promise<ZkTlsAttestationData> {\n if (query.attestationId) {\n return this.fetchExistingAttestation(query.attestationId);\n }\n\n if (query.callbackUrl) {\n return this.initiateSession(query.callbackUrl);\n }\n\n throw new Error('Either attestationId or callbackUrl must be provided');\n }\n\n /**\n * Transform attestation to circuit inputs\n */\n abstract toCircuitInputs(data: ZkTlsAttestationData, circuitId: string): ProveJobInputs;\n\n /**\n * Get supported circuits\n */\n getSupportedCircuits(): string[] {\n return [...this.supportedCircuits];\n }\n\n /**\n * Create a zkTLS session and return the auth URL\n * Client should redirect user to this URL\n */\n async createSession(callbackUrl: string): Promise<{ sessionId: string; authUrl: string }> {\n const result = await this.client.createZkTlsSession(this.extractorId, callbackUrl);\n\n if (!result.success || !result.data) {\n throw new Error(result.error || 'Failed to create zkTLS session');\n }\n\n return result.data;\n }\n\n /**\n * Wait for session completion and return attestation\n */\n async waitForSession(\n sessionId: string,\n options?: { intervalMs?: number; timeoutMs?: number }\n ): Promise<ZkTlsAttestationData> {\n const session = await this.client.waitForZkTlsSession(sessionId, options);\n\n if (!session.attestation) {\n throw new Error('Session completed but no attestation found');\n }\n\n const extractors = await this.client.listExtractors();\n const extractor = extractors.data?.find(e => e.id === this.extractorId);\n\n if (!extractor) {\n throw new Error(`Extractor not found: ${this.extractorId}`);\n }\n\n return {\n attestation: session.attestation,\n extractor,\n };\n }\n\n // ===========================================================================\n // Protected helpers\n // ===========================================================================\n\n protected async fetchExistingAttestation(attestationId: string): Promise<ZkTlsAttestationData> {\n const result = await this.client.getAttestation(attestationId);\n\n if (!result.success || !result.data) {\n throw new Error(result.error || 'Attestation not found');\n }\n\n const extractors = await this.client.listExtractors();\n const extractor = extractors.data?.find(e => e.id === result.data!.extractor);\n\n if (!extractor) {\n throw new Error(`Extractor not found: ${result.data.extractor}`);\n }\n\n return {\n attestation: result.data,\n extractor,\n };\n }\n\n protected async initiateSession(callbackUrl: string): Promise<ZkTlsAttestationData> {\n const { sessionId } = await this.createSession(callbackUrl);\n // Note: In a real flow, you'd redirect user and poll later\n // This is for programmatic use where auth is already done\n return this.waitForSession(sessionId);\n }\n\n protected validateCircuit(circuitId: string): void {\n if (!this.supportedCircuits.includes(circuitId)) {\n throw new Error(\n `Circuit \"${circuitId}\" is not supported by ${this.name}. ` +\n `Supported circuits: ${this.supportedCircuits.join(', ')}`\n );\n }\n }\n}\n","/**\n * Coinbase KYC Adapter\n *\n * Fetches KYC attestation data from Coinbase via zkTLS\n * and transforms it for identity verification circuits.\n */\n\nimport { ZkTlsAdapter } from './adapter';\nimport type { ProveJobInputs } from '../../core/types';\nimport type { ZkTlsAdapterConfig, ZkTlsAttestationData, CoinbaseKycClaims } from './types';\n\nconst SUPPORTED_CIRCUITS = [\n 'bind.identity.kyc.v1',\n 'bind.identity.coinbase.v1',\n];\n\nexport class CoinbaseAdapter extends ZkTlsAdapter {\n readonly id = 'coinbase-kyc';\n readonly name = 'Coinbase KYC';\n readonly description = 'Fetches KYC verification status from Coinbase via zkTLS attestation';\n readonly extractorId = 'coinbase';\n protected readonly supportedCircuits = SUPPORTED_CIRCUITS;\n\n constructor(config: ZkTlsAdapterConfig) {\n super(config);\n }\n\n /**\n * Transform Coinbase attestation to circuit inputs\n */\n toCircuitInputs(data: ZkTlsAttestationData, circuitId: string): ProveJobInputs {\n this.validateCircuit(circuitId);\n\n const claims = data.attestation.claims as unknown as CoinbaseKycClaims;\n\n switch (circuitId) {\n case 'bind.identity.kyc.v1':\n return this.toKycInputs(data, claims);\n case 'bind.identity.coinbase.v1':\n return this.toCoinbaseInputs(data, claims);\n default:\n throw new Error(`No input transformer for circuit: ${circuitId}`);\n }\n }\n\n // ===========================================================================\n // Private transformers\n // ===========================================================================\n\n private toKycInputs(data: ZkTlsAttestationData, claims: CoinbaseKycClaims): ProveJobInputs {\n return {\n kycVerified: String(claims.kyc_verified),\n kycLevel: String(claims.kyc_level ?? 0),\n countryCode: claims.country_code ?? '',\n attestationId: data.attestation.id,\n witnessId: data.attestation.witness.id,\n signature: data.attestation.signature,\n timestamp: String(data.attestation.createdAt),\n };\n }\n\n private toCoinbaseInputs(data: ZkTlsAttestationData, claims: CoinbaseKycClaims): ProveJobInputs {\n return {\n kycVerified: String(claims.kyc_verified),\n kycLevel: String(claims.kyc_level ?? 0),\n countryCode: claims.country_code ?? '',\n accountCreatedAt: claims.account_created_at ?? '',\n attestationId: data.attestation.id,\n witnessId: data.attestation.witness.id,\n witnessPublicKey: data.attestation.witness.publicKey,\n signature: data.attestation.signature,\n url: data.attestation.url,\n method: data.attestation.method,\n expiresAt: String(data.attestation.expiresAt),\n };\n }\n}\n\n/**\n * Factory function to create a Coinbase adapter\n */\nexport function createCoinbaseAdapter(config: ZkTlsAdapterConfig): CoinbaseAdapter {\n return new CoinbaseAdapter(config);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,8 @@
1
- export { ApiError, AuthenticationError, BindClient, BindError, InsufficientCreditsError, TimeoutError, BindClient as default } from './core/index.cjs';
2
- export { B as BindClientOptions, g as BindCredential, G as GetProveJobResponse, L as ListProveJobsOptions, f as ListProveJobsResponse, c as ProveJob, a as ProveJobInputs, b as ProveJobOutputs, P as ProveJobStatus, d as ProveJobSummary, S as SubmitProveJobRequest, e as SubmitProveJobResponse } from './types-o4sbOK_a.cjs';
3
- export { A as AdapterRegistration, g as DataAdapter, D as DimoAdapter, a as DimoAdapterConfig, f as DimoClient, b as DimoQuery, e as DimoSignal, d as DimoTelemetryData, T as TelemetryData, h as TelemetrySignal, c as createDimoAdapter } from './index-5j-fuebC.cjs';
1
+ export { B as BindClient, B as default, d as deriveCircuitId } from './client-Bh8Di-5n.cjs';
2
+ export { A as ActivateCircuitResponse, B as BindClientOptions, k as BindCredential, h as Circuit, C as CircuitStatus, g as CircuitValidationStatus, s as CreateSessionResponse, r as GetAttestationResponse, j as GetCircuitResponse, G as GetProveJobResponse, t as GetSessionResponse, q as ListAttestationsResponse, i as ListCircuitsResponse, p as ListExtractorsResponse, L as ListProveJobsOptions, f as ListProveJobsResponse, c as ProveJob, a as ProveJobInputs, b as ProveJobOutputs, P as ProveJobStatus, d as ProveJobSummary, S as SubmitProveJobRequest, e as SubmitProveJobResponse, n as ZkTlsAttestation, l as ZkTlsExtractor, o as ZkTlsSession, Z as ZkTlsSessionStatus, m as ZkTlsWitness } from './types-B6S0axfE.cjs';
3
+ export { ApiError, AuthenticationError, BindError, InsufficientCreditsError, TimeoutError, ZkTlsExtractorError, ZkTlsSessionExpiredError, ZkTlsSessionFailedError } from './core/index.cjs';
4
+ export { A as AdapterRegistration, D as DataAdapter, T as TelemetryData, a as TelemetrySignal } from './types-Be7Jc5V8.cjs';
5
+ export { D as DimoAdapter, a as DimoAdapterConfig, f as DimoClient, b as DimoQuery, e as DimoSignal, d as DimoTelemetryData, c as createDimoAdapter } from './adapter-DyAYLtIy.cjs';
4
6
  export { buildCustomTelemetryQuery, buildTelemetryQuery } from './adapters/dimo/index.cjs';
7
+ export { CoinbaseAdapter, CoinbaseKycClaims, ZkTlsAdapter, ZkTlsAdapterConfig, ZkTlsAttestationData, ZkTlsQuery, createCoinbaseAdapter } from './adapters/zktls/index.cjs';
5
8
  export { DisclosureSpec, OutputClaimSpec, PolicyId, PolicyMetadata, PublicPolicySpec, SubjectSpec, ValiditySpec } from '@bind-protocol/policy-spec';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
- export { ApiError, AuthenticationError, BindClient, BindError, InsufficientCreditsError, TimeoutError, BindClient as default } from './core/index.js';
2
- export { B as BindClientOptions, g as BindCredential, G as GetProveJobResponse, L as ListProveJobsOptions, f as ListProveJobsResponse, c as ProveJob, a as ProveJobInputs, b as ProveJobOutputs, P as ProveJobStatus, d as ProveJobSummary, S as SubmitProveJobRequest, e as SubmitProveJobResponse } from './types-o4sbOK_a.js';
3
- export { A as AdapterRegistration, g as DataAdapter, D as DimoAdapter, a as DimoAdapterConfig, f as DimoClient, b as DimoQuery, e as DimoSignal, d as DimoTelemetryData, T as TelemetryData, h as TelemetrySignal, c as createDimoAdapter } from './index-CASjN9Qe.js';
1
+ export { B as BindClient, B as default, d as deriveCircuitId } from './client-BSwO4sTC.js';
2
+ export { A as ActivateCircuitResponse, B as BindClientOptions, k as BindCredential, h as Circuit, C as CircuitStatus, g as CircuitValidationStatus, s as CreateSessionResponse, r as GetAttestationResponse, j as GetCircuitResponse, G as GetProveJobResponse, t as GetSessionResponse, q as ListAttestationsResponse, i as ListCircuitsResponse, p as ListExtractorsResponse, L as ListProveJobsOptions, f as ListProveJobsResponse, c as ProveJob, a as ProveJobInputs, b as ProveJobOutputs, P as ProveJobStatus, d as ProveJobSummary, S as SubmitProveJobRequest, e as SubmitProveJobResponse, n as ZkTlsAttestation, l as ZkTlsExtractor, o as ZkTlsSession, Z as ZkTlsSessionStatus, m as ZkTlsWitness } from './types-B6S0axfE.js';
3
+ export { ApiError, AuthenticationError, BindError, InsufficientCreditsError, TimeoutError, ZkTlsExtractorError, ZkTlsSessionExpiredError, ZkTlsSessionFailedError } from './core/index.js';
4
+ export { A as AdapterRegistration, D as DataAdapter, T as TelemetryData, a as TelemetrySignal } from './types-D1-qiyJO.js';
5
+ export { D as DimoAdapter, a as DimoAdapterConfig, f as DimoClient, b as DimoQuery, e as DimoSignal, d as DimoTelemetryData, c as createDimoAdapter } from './adapter-53dB8ogG.js';
4
6
  export { buildCustomTelemetryQuery, buildTelemetryQuery } from './adapters/dimo/index.js';
7
+ export { CoinbaseAdapter, CoinbaseKycClaims, ZkTlsAdapter, ZkTlsAdapterConfig, ZkTlsAttestationData, ZkTlsQuery, createCoinbaseAdapter } from './adapters/zktls/index.js';
5
8
  export { DisclosureSpec, OutputClaimSpec, PolicyId, PolicyMetadata, PublicPolicySpec, SubjectSpec, ValiditySpec } from '@bind-protocol/policy-spec';