@zkproofport-app/sdk 0.2.2 → 0.2.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.mjs CHANGED
@@ -67,6 +67,12 @@ const CIRCUIT_METADATA = {
67
67
  publicInputsCount: 14,
68
68
  publicInputNames: ['signal_hash', 'signer_list_merkle_root', 'country_list', 'country_list_length', 'is_included'],
69
69
  },
70
+ oidc_domain_attestation: {
71
+ name: 'OIDC Domain',
72
+ description: 'Prove email domain affiliation via OIDC JWT',
73
+ publicInputsCount: 420,
74
+ publicInputNames: ['pubkey_modulus_limbs', 'domain', 'scope', 'nullifier'],
75
+ },
70
76
  };
71
77
  /**
72
78
  * Standard verifier contract ABI shared across all Barretenberg-generated verifiers.
@@ -198,6 +204,34 @@ const COINBASE_COUNTRY_PUBLIC_INPUT_LAYOUT = {
198
204
  NULLIFIER_START: 118,
199
205
  NULLIFIER_END: 149,
200
206
  };
207
+ /**
208
+ * OIDC Domain Attestation circuit public input layout (byte offsets).
209
+ * Defines the byte positions of each field in the flattened public inputs array.
210
+ *
211
+ * Public inputs are packed as individual field elements (one byte per element):
212
+ * - pubkey_modulus_limbs: 18 x u128 = 18 x 16 bytes = 288 bytes → fields 0–287
213
+ * - domain (BoundedVec<u8, 64>): 4-byte length (u32) + 64-byte storage = 68 fields → fields 288–355
214
+ * - scope: 32 bytes → fields 356–387
215
+ * - nullifier: 32 bytes → fields 388–419
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * const scope = publicInputs.slice(
220
+ * OIDC_DOMAIN_ATTESTATION_PUBLIC_INPUT_LAYOUT.SCOPE_START,
221
+ * OIDC_DOMAIN_ATTESTATION_PUBLIC_INPUT_LAYOUT.SCOPE_END + 1
222
+ * );
223
+ * ```
224
+ */
225
+ const OIDC_DOMAIN_ATTESTATION_PUBLIC_INPUT_LAYOUT = {
226
+ PUBKEY_MODULUS_START: 0,
227
+ PUBKEY_MODULUS_END: 287,
228
+ DOMAIN_START: 288,
229
+ DOMAIN_END: 355,
230
+ SCOPE_START: 356,
231
+ SCOPE_END: 387,
232
+ NULLIFIER_START: 388,
233
+ NULLIFIER_END: 419,
234
+ };
201
235
 
202
236
  /**
203
237
  * Deep Link utilities for ZKProofport SDK
@@ -450,7 +484,7 @@ function validateProofRequest(request) {
450
484
  if (!request.circuit) {
451
485
  return { valid: false, error: 'Missing circuit type' };
452
486
  }
453
- if (!['coinbase_attestation', 'coinbase_country_attestation'].includes(request.circuit)) {
487
+ if (!['coinbase_attestation', 'coinbase_country_attestation', 'oidc_domain_attestation'].includes(request.circuit)) {
454
488
  return { valid: false, error: `Invalid circuit type: ${request.circuit}` };
455
489
  }
456
490
  if (!request.callbackUrl) {
@@ -480,6 +514,18 @@ function validateProofRequest(request) {
480
514
  return { valid: false, error: 'isIncluded is required and must be a boolean' };
481
515
  }
482
516
  }
517
+ else if (request.circuit === 'oidc_domain_attestation') {
518
+ const inputs = request.inputs;
519
+ if (!inputs.domain || typeof inputs.domain !== 'string' || inputs.domain.trim() === '') {
520
+ return { valid: false, error: 'domain is required and must be a non-empty string' };
521
+ }
522
+ if (!inputs.scope || typeof inputs.scope !== 'string' || inputs.scope.trim() === '') {
523
+ return { valid: false, error: 'scope is required and must be a non-empty string' };
524
+ }
525
+ if (inputs.provider !== undefined && (typeof inputs.provider !== 'string' || inputs.provider.trim() === '')) {
526
+ return { valid: false, error: 'provider must be a non-empty string when specified' };
527
+ }
528
+ }
483
529
  // Check expiry
484
530
  if (request.expiresAt && Date.now() > request.expiresAt) {
485
531
  return { valid: false, error: 'Request has expired' };
@@ -3781,6 +3827,10 @@ function extractScopeFromPublicInputs(publicInputsHex, circuit) {
3781
3827
  start = 86;
3782
3828
  end = 117;
3783
3829
  }
3830
+ else if (circuit === 'oidc_domain_attestation') {
3831
+ start = 356;
3832
+ end = 387;
3833
+ }
3784
3834
  else {
3785
3835
  start = 64;
3786
3836
  end = 95;
@@ -3814,6 +3864,10 @@ function extractNullifierFromPublicInputs(publicInputsHex, circuit) {
3814
3864
  start = 118;
3815
3865
  end = 149;
3816
3866
  }
3867
+ else if (circuit === 'oidc_domain_attestation') {
3868
+ start = 388;
3869
+ end = 419;
3870
+ }
3817
3871
  else {
3818
3872
  start = 96;
3819
3873
  end = 127;
@@ -4705,53 +4759,26 @@ class ProofportSDK {
4705
4759
  }
4706
4760
  return await response.json();
4707
4761
  }
4708
- /**
4709
- * Creates a proof request through the relay server.
4710
- *
4711
- * This is the recommended way to create proof requests. The relay server:
4712
- * - Issues a server-side requestId (validated by the mobile app)
4713
- * - Tracks request status in Redis
4714
- * - Builds the deep link with relay callback URL
4715
- * - Stores inputs hash for deep link integrity verification
4716
- *
4717
- * @param circuit - Circuit type identifier
4718
- * @param inputs - Circuit-specific inputs
4719
- * @param options - Request options (message, dappName, dappIcon, nonce)
4720
- * @returns Promise resolving to RelayProofRequest with requestId, deepLink, pollUrl
4721
- * @throws Error if signer not set or relay request fails
4722
- *
4723
- * @example
4724
- * ```typescript
4725
- * const sdk = ProofportSDK.create();
4726
- * sdk.setSigner(signer);
4727
- *
4728
- * const relay = await sdk.createRelayRequest('coinbase_attestation', {
4729
- * scope: 'myapp.com'
4730
- * }, { dappName: 'My DApp' });
4731
- *
4732
- * // Generate QR code from relay deep link
4733
- * const qr = await sdk.generateQRCode(relay.deepLink);
4734
- *
4735
- * // Wait for proof (WebSocket primary, polling fallback)
4736
- * const result = await sdk.waitForProof(relay.requestId);
4737
- * ```
4738
- */
4739
4762
  async createRelayRequest(circuit, inputs, options = {}) {
4740
- if (!this.signer) {
4741
- throw new Error('Signer not set. Call setSigner() first.');
4742
- }
4743
4763
  if (!this.relayUrl) {
4744
4764
  throw new Error('relayUrl is required. Set it in ProofportSDK config.');
4745
4765
  }
4746
- // Get challenge from relay and sign it
4747
- const { challenge } = await this.getChallenge();
4748
- const signature = await this.signer.signMessage(challenge);
4766
+ const needsSignature = ProofportSDK.WALLET_SIGNATURE_CIRCUITS.includes(circuit);
4767
+ if (needsSignature && !this.signer) {
4768
+ throw new Error('Signer not set. Call setSigner() first. Wallet signature is required for this circuit.');
4769
+ }
4770
+ // Get challenge + requestId from relay
4771
+ const { requestId, challenge } = await this.getChallenge();
4749
4772
  const body = {
4773
+ requestId,
4750
4774
  circuitId: circuit,
4751
4775
  inputs,
4752
4776
  challenge,
4753
- signature,
4754
4777
  };
4778
+ // Sign challenge for circuits that require wallet signature
4779
+ if (needsSignature && this.signer) {
4780
+ body.signature = await this.signer.signMessage(challenge);
4781
+ }
4755
4782
  if (options.message)
4756
4783
  body.message = options.message;
4757
4784
  if (options.dappName)
@@ -5028,6 +5055,42 @@ class ProofportSDK {
5028
5055
  return extractNullifierFromPublicInputs(publicInputs, circuit);
5029
5056
  }
5030
5057
  }
5058
+ /**
5059
+ * Creates a proof request through the relay server.
5060
+ *
5061
+ * This is the recommended way to create proof requests. The relay server:
5062
+ * - Issues a server-side requestId (validated by the mobile app)
5063
+ * - Tracks request status in Redis
5064
+ * - Builds the deep link with relay callback URL
5065
+ * - Stores inputs hash for deep link integrity verification
5066
+ *
5067
+ * @param circuit - Circuit type identifier
5068
+ * @param inputs - Circuit-specific inputs
5069
+ * @param options - Request options (message, dappName, dappIcon, nonce)
5070
+ * @returns Promise resolving to RelayProofRequest with requestId, deepLink, pollUrl
5071
+ * @throws Error if signer not set or relay request fails
5072
+ *
5073
+ * @example
5074
+ * ```typescript
5075
+ * const sdk = ProofportSDK.create();
5076
+ * sdk.setSigner(signer);
5077
+ *
5078
+ * const relay = await sdk.createRelayRequest('coinbase_attestation', {
5079
+ * scope: 'myapp.com'
5080
+ * }, { dappName: 'My DApp' });
5081
+ *
5082
+ * // Generate QR code from relay deep link
5083
+ * const qr = await sdk.generateQRCode(relay.deepLink);
5084
+ *
5085
+ * // Wait for proof (WebSocket primary, polling fallback)
5086
+ * const result = await sdk.waitForProof(relay.requestId);
5087
+ * ```
5088
+ */
5089
+ // Circuits that require wallet signature (used as circuit input)
5090
+ ProofportSDK.WALLET_SIGNATURE_CIRCUITS = [
5091
+ 'coinbase_attestation',
5092
+ 'coinbase_country_attestation',
5093
+ ];
5031
5094
 
5032
- export { COINBASE_ATTESTATION_PUBLIC_INPUT_LAYOUT, COINBASE_COUNTRY_PUBLIC_INPUT_LAYOUT, ProofportSDK, ProofportSDK as default, extractNullifierFromPublicInputs, extractScopeFromPublicInputs };
5095
+ export { COINBASE_ATTESTATION_PUBLIC_INPUT_LAYOUT, COINBASE_COUNTRY_PUBLIC_INPUT_LAYOUT, OIDC_DOMAIN_ATTESTATION_PUBLIC_INPUT_LAYOUT, ProofportSDK, ProofportSDK as default, extractNullifierFromPublicInputs, extractScopeFromPublicInputs };
5033
5096
  //# sourceMappingURL=index.mjs.map