@zkproofport-app/sdk 0.5.0-beta.1 → 0.5.0-beta.3

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/README.md CHANGED
@@ -81,7 +81,7 @@ const qrDataUrl = await sdk.generateQRCode(relay.deepLink);
81
81
  const result = await sdk.waitForProof(relay.requestId);
82
82
 
83
83
  if (result.status === 'completed') {
84
- // 6. Verify on-chain — the relay result carries the verifier to call
84
+ // 6. Verify on-chain — against the SDK's own verifier for this circuit
85
85
  const response: ProofResponse = {
86
86
  requestId: result.requestId,
87
87
  circuit: result.circuit as CircuitType,
@@ -296,9 +296,8 @@ One more difference worth knowing if you count people: its nullifier is
296
296
  a constant compiled into the circuit, so one wallet in one scope has exactly
297
297
  one nullifier and there is no input a prover can vary.
298
298
 
299
- **Testnet only.** The verifier lives on GIWA Sepolia (chain `91342`) and
300
- nowhere else, so the mobile app keeps it behind Developer Mode. A mainnet
301
- deployment is planned; until it exists, do not ship on this.
299
+ The verifier is deployed on GIWA Sepolia (chain `91342`). The mobile app shows
300
+ this circuit in its Laboratory, which the user turns on in More.
302
301
 
303
302
  ### `dojang_playground`
304
303
 
@@ -350,7 +349,7 @@ something the circuit never saw.
350
349
 
351
350
  ## Planned Circuits
352
351
 
353
- The identifiers below are reserved and exported, and the circuits exist — but they are **not officially supported yet**. Availability, input shape and public-input layout can change without a major version bump, so treat anything here as provisional. `CIRCUIT_SUPPORT_STATUS` reports each of them as `planned`.
352
+ ZKProofport is registered with the Ministry of the Interior and Safety as a Korea Mobile ID integration service (모바일 신분증 연계서비스). The three circuits below are in beta: `CIRCUIT_SUPPORT_STATUS` reports each of them as `planned`, and their input shape and public-input layout can change without a major version bump.
354
353
 
355
354
  ### `mdl_kr_ownership`
356
355
 
@@ -677,8 +676,8 @@ When you are done, `sdk.disconnect()` closes any open socket.
677
676
  circuit: 'coinbase_attestation',
678
677
  proof: '0x1f8b0a…', // proof bytes, opaque
679
678
  publicInputs: ['0x00…2f', '0x00…a1', …], // ordered — 128 entries for this circuit
680
- verifierAddress: '0x…', // contract that can check this proof
681
- chainId: …, // network that contract lives on
679
+ verifierAddress: '0x…', // the verifier the app reports (checked, not trusted)
680
+ chainId: …, // the network the app reports (checked, not trusted)
682
681
  deepLink: 'zkproofport://proof-request?data=…',
683
682
  createdAt: '2026-02-07T09:14:02.101Z',
684
683
  updatedAt: '2026-02-07T09:14:48.902Z',
@@ -692,8 +691,8 @@ When you are done, `sdk.disconnect()` closes any open socket.
692
691
  | `circuit` | `string` | terminal results | Which circuit produced the proof, as reported by the mobile app. You need it to read `publicInputs`, because the layout is per circuit. Undefined while the request is still pending. |
693
692
  | `proof` | `string` | `'completed'` | The proof bytes as a `0x` hex string. Opaque: the only thing to do with it is hand it to a verifier. |
694
693
  | `publicInputs` | `string[]` | `'completed'` | The circuit's public inputs **in circuit order**. This is the part that carries meaning — what each index holds is in [Public Input Layout Constants](#public-input-layout-constants). |
695
- | `verifierAddress` | `string` | `'completed'` | Address of the Solidity verifier contract that can check this exact proof. It comes from the mobile app — forward it, do not hardcode one. |
696
- | `chainId` | `number` | `'completed'` | The chain that `verifierAddress` lives on. Same rule: forward it. |
694
+ | `verifierAddress` | `string` | `'completed'` | The verifier contract the mobile app reports. Forward it: the SDK compares it with the verifier it ships with and refuses the proof if they differ. It never verifies against this address. |
695
+ | `chainId` | `number` | `'completed'` | The network the mobile app reports. Same rule: compared, never trusted. |
697
696
  | `error` | `string` | `'error'`, `'failed'`, `'expired'` | Human-readable reason from the mobile app or the relay. |
698
697
  | `errorCode` | `string` | some `'error'` results | The app's error code, `E` + four digits (e.g. `'E2007'`). Absent when the app did not send one. |
699
698
  | `deepLink` | `string` | polling path only | The deep link the request was created with. |
@@ -771,8 +770,8 @@ The relay answers `'expired'` before the SDK's default `timeoutMs` (300 000 ms)
771
770
  | `status` | `'pending' \| 'completed' \| 'error' \| 'cancelled'` | Yes | `'completed'`. Anything else and verification returns `{ valid: false, error: 'Invalid or incomplete response' }` without touching the chain. Note the relay says `'failed'` where this type says `'error'` |
772
771
  | `proof` | `string` | When completed | `result.proof` |
773
772
  | `publicInputs` | `string[]` | When completed | `result.publicInputs` |
774
- | `verifierAddress` | `string` | When completed | `result.verifierAddress`. Without it there is no contract to call and verification fails with `No verifier address provided…` |
775
- | `chainId` | `number` | When completed | `result.chainId`. Used to pick a network when you pass no provider of your own |
773
+ | `verifierAddress` | `string` | No | `result.verifierAddress`. Optional. When present it must match the SDK's own verifier for the circuit, or verification is refused |
774
+ | `chainId` | `number` | No | `result.chainId`. Optional. When present it must match the network the SDK verifies the circuit on, or verification is refused |
776
775
  | `numPublicInputs` | `number` | No | Never delivered by the relay, and never read during verification — `publicInputs.length` is used instead. Omit it |
777
776
  | `timestamp` | `number` | No | Not delivered by the relay. Omit it |
778
777
  | `error` | `string` | On failure | `result.error`. Carried for your own logging; verification ignores it |
@@ -783,7 +782,17 @@ There is no `nullifier` field here either.
783
782
 
784
783
  Verify the proof cryptographically by calling the deployed Solidity verifier contract.
785
784
 
786
- The relay result tells you which contract to call (`verifierAddress`) and on which chain (`chainId`), so verification goes through `verifyResponseOnChain`, which reads both off the response:
785
+ `verifyResponseOnChain` checks the proof against the verifier contract the SDK ships with for that circuit. Which contract judges a proof is never taken from the proof's own response: the SDK carries the deployed verifiers, generated from the circuits' deployment records, and a response whose `verifierAddress` or `chainId` differs from them is refused rather than checked elsewhere. If you configure your own verifier in the SDK's `verifiers` option, that one is used instead.
786
+
787
+ For OIDC domain proofs the SDK first checks what the proof says about the sign-in token: it must have been issued to a ZKProofport sign-in client (not to some other website), the proof must have been made within the last 15 minutes (and not more than 5 minutes ahead of your clock), and a proof made by the ZKProofport app must carry the nonce of **your** request — so a proof made for another request cannot be replayed as the answer to yours. For a request you created with `createRelayRequest` on the same SDK instance this happens automatically. If you verify in a different process (or after a restart), pass the request back: `sdk.verifyResponseOnChain(response, provider, { request: { scope, requestId } })`, with the scope you requested and the `requestId` the relay returned; without it an OIDC response is refused. `verifyOnChain` and `verifyResponseOffChain` take the same `request` option.
788
+
789
+ The SDK also checks that the proof was made with a signing key Google or Microsoft actually publishes. That key is part of the proof's public inputs, so a proof made with a self-generated key would otherwise pass the contract. The SDK fetches the provider's published keys, caches them as the provider's own cache headers allow, and returns `{ valid: false, error }` when the key is not among them or the keys cannot be fetched. Every verify method does this; there is nothing to call separately.
790
+
791
+ For Coinbase KYC, Coinbase country and GIWA proofs the SDK checks that the attestation's signer belongs to the published signer set: the proof carries the root of the signer list it was made against, and a proof made against any other list is refused with `{ valid: false, error }`. This too runs in every verify method.
792
+
793
+ The one limit: a proof made with a key the provider has already withdrawn, which this process never saw while it was published, cannot be checked and is refused. Keys seen while published stay acceptable for 24 hours after they disappear.
794
+
795
+
787
796
 
788
797
  ```typescript
789
798
  import type { CircuitType, ProofResponse } from '@zkproofport-app/sdk';
@@ -815,11 +824,11 @@ The SDK connects to the right network on its own. Pass your own ethers `Provider
815
824
  const verification = await sdk.verifyResponseOnChain(response, myProvider);
816
825
  ```
817
826
 
818
- `verifyResponseOnChain` reports failures instead of throwing them. An incomplete response (`status` other than `'completed'`, or a missing `proof` / `publicInputs`) returns `{ valid: false, error: 'Invalid or incomplete response' }` without making a network call; a missing `verifierAddress` returns `{ valid: false, error: 'No verifier address provided…' }`; and a reverting contract call returns `{ valid: false, error }` carrying the revert message. It does throw in one case: a response carrying a `chainId` the SDK has no built-in endpoint for, when you passed no provider of your own. Pass your own provider if you ever hit that.
827
+ `verifyResponseOnChain` reports failures instead of throwing them. An incomplete response (`status` other than `'completed'`, or a missing `proof` / `publicInputs`) returns `{ valid: false, error: 'Invalid or incomplete response' }` without making a network call; an unknown circuit, a response naming a different verifier, an OIDC signing key the provider does not publish and a reverting contract call each return `{ valid: false, error }` saying which.
819
828
 
820
829
  `valid: true` means the verifier contract accepted the proof: it is a real proof for that circuit, and its public inputs are the ones it was proved against. It does **not** yet mean the proof answers *your* question — that it was bound to your scope, or that the domain or country in it is the one you asked for. Those live in the public inputs, and reading them is Step 8. `valid: false` is a rejected proof, not an outage: do not retry it, refuse the user.
821
830
 
822
- > **Why not `verifyOnChain`?** `sdk.verifyOnChain(circuit, proof, publicInputs, providerOrSigner?)` takes the same proof in raw pieces. Those pieces carry no verifier address, and it never looks at a response for one — it consults only the `verifiers` map the SDK was constructed with, which `ProofportSDK.create()` leaves empty. Out of the box it therefore returns `{ valid: false, error: 'No verifier address provided. Configure via SDK or ensure proof response includes verifierAddress.' }`. Use `verifyResponseOnChain`.
831
+ > **`verifyOnChain` and `verifyResponseOffChain`.** `sdk.verifyOnChain(circuit, proof, publicInputs, providerOrSigner?)` takes the same proof in raw pieces and checks it against the same built-in verifier, with the same OIDC key check. `sdk.verifyResponseOffChain(response)` checks the proof against the circuit's verification key with no chain involved, and runs the same OIDC key check. Prefer `verifyResponseOnChain` when the answer has to be the one a contract gives.
823
832
 
824
833
  ### Step 8: Extract Scope, Nullifier, and Domain
825
834
 
@@ -925,7 +934,7 @@ import {
925
934
  const scope = extractScopeFromPublicInputs(publicInputs, 'coinbase_attestation');
926
935
  const nullifier = extractNullifierFromPublicInputs(publicInputs, 'coinbase_attestation');
927
936
 
928
- // OIDC domain attestation uses a different public input layout (148 fields)
937
+ // OIDC domain attestation uses a different public input layout (214 fields)
929
938
  const oidcScope = extractScopeFromPublicInputs(publicInputs, 'oidc_domain_attestation');
930
939
  const oidcNullifier = extractNullifierFromPublicInputs(publicInputs, 'oidc_domain_attestation');
931
940
 
@@ -1025,7 +1034,7 @@ async function verifyUser() {
1025
1034
 
1026
1035
  ## Configuration
1027
1036
 
1028
- `ProofportSDK.create()` returns a fully configured SDK instance. No manual configuration is needed: the relay endpoint is built in, and the verifier contract and network to check a proof against arrive with the proof itself (`verifierAddress`, `chainId`).
1037
+ `ProofportSDK.create()` returns a fully configured SDK instance. No manual configuration is needed: the relay endpoint and the verifier contracts proofs are checked against are built in. The verifier a proof response names is compared with them, never used in their place.
1029
1038
 
1030
1039
  ## Types Reference
1031
1040
 
@@ -1149,7 +1158,7 @@ const signalHash = toBytes32(publicInputs.slice(L.SIGNAL_HASH_START, L.SIGNAL_HA
1149
1158
 
1150
1159
  The country list and the `is_included` flag are public inputs, which means the proof is only as strong as the list it was proved against. Read indices 64–85 back and confirm they are the list and the direction you asked for; a valid proof against a different list is still a valid proof.
1151
1160
 
1152
- ### `oidc_domain_attestation` — 148 entries
1161
+ ### `oidc_domain_attestation` — 214 entries
1153
1162
 
1154
1163
  | Index | Constants | Circuit field | What it is |
1155
1164
  |-------|-----------|---------------|------------|
@@ -1159,6 +1168,12 @@ The country list and the `is_included` flag are public inputs, which means the p
1159
1168
  | 83–114 | `SCOPE_START` / `_END` | `scope` | `bytes32` scope hash |
1160
1169
  | 115–146 | `NULLIFIER_START` / `_END` | `nullifier` | `bytes32` over the user's email and the scope |
1161
1170
  | 147 | `PROVIDER` | `provider` | `0` = Google, `1` = Microsoft. The circuit accepts no other value |
1171
+ | 148–179 | `AUD_HASH_START` / `_END` | `aud_hash` | keccak256 of the ID token's `aud` (the sign-in client it was issued to) |
1172
+ | 180 | `NONCE_MODE` | `nonce_mode` | `1` = the token's nonce is bound to your request, `0` = no nonce (agent device sign-in) |
1173
+ | 181–212 | `NONCE_BINDING_START` / `_END` | `nonce_binding` | In mode `1`, keccak256("zkproofport-oidc-v1" ‖ keccak256(scope) ‖ requestId); all zero in mode `0` |
1174
+ | 213 | `NOW` | `now` | Unix seconds the proof was made at; the circuit proves the token was valid then |
1175
+
1176
+ Proofs from the earlier 148-entry version of this circuit bind no audience, expiry or nonce and are refused by every verify method.
1162
1177
 
1163
1178
  `DOMAIN_START` and `DOMAIN_END` are kept as deprecated aliases of `DOMAIN_STORAGE_START` and `DOMAIN_LEN`. Use the current names — the old pair reads as a range and is not one.
1164
1179
 
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { ProofRequest, ProofResponse, CircuitType, CircuitInputs, ProofportConfig, QRCodeOptions, ChallengeResponse, WalletSigner, RelayProofRequest, RelayProofResult } from './types';
5
5
  import { type OffChainVerifyOptions } from './offChainVerifier';
6
+ import { type OidcRequestContext } from './verifier';
6
7
  import type { SDKEnvironment } from './types';
7
8
  /**
8
9
  * Main SDK class for interacting with the ZKProofport mobile app.
@@ -41,9 +42,24 @@ import type { SDKEnvironment } from './types';
41
42
  export declare class ProofportSDK {
42
43
  private config;
43
44
  private pendingRequests;
45
+ /**
46
+ * requestId -> scope of the relay requests this instance created, so that
47
+ * verifyResponse* can check an OIDC proof's request-bound nonce without the
48
+ * dApp passing the request back in. Oldest entries go first past
49
+ * {@link ProofportSDK.MAX_REMEMBERED_RELAY_REQUESTS}.
50
+ */
51
+ private relayRequests;
52
+ /** Bound on {@link relayRequests}; a dApp that verifies later can pass the request explicitly. */
53
+ static readonly MAX_REMEMBERED_RELAY_REQUESTS = 1000;
44
54
  private signer;
45
55
  private relayUrl;
46
56
  private socket;
57
+ /**
58
+ * Set by {@link ProofportSDK.create} from its environment preset. It decides
59
+ * which chain a proof is verified on when the dApp configured no verifier
60
+ * for the circuit; a custom-config SDK has none and must configure one.
61
+ */
62
+ private environment;
47
63
  /**
48
64
  * Creates a new ProofportSDK instance.
49
65
  *
@@ -73,13 +89,11 @@ export declare class ProofportSDK {
73
89
  constructor(config?: ProofportConfig);
74
90
  /**
75
91
  * @internal
76
- * Creates a Coinbase KYC verification proof request.
77
- *
78
- * Generates a proof request for verifying Coinbase KYC status without revealing
79
- * the actual attestation data. The proof confirms the user has passed Coinbase KYC
80
- * while maintaining privacy through zero-knowledge proofs.
92
+ * Creates a proof request for a circuit whose dapp-side input is a scope
93
+ * (Coinbase KYC, OIDC domain, GIWA, Dojang), keeping that circuit's id.
81
94
  *
82
- * @param inputs - Circuit inputs for Coinbase KYC
95
+ * @param circuit - The circuit requested; it is the request's circuit
96
+ * @param inputs - Circuit inputs; `scope` is required (and `domain` for OIDC)
83
97
  * @param inputs.scope - Application-specific scope (e.g., domain name)
84
98
  * @param options - Request configuration options
85
99
 
@@ -94,7 +108,7 @@ export declare class ProofportSDK {
94
108
  *
95
109
  * @example
96
110
  * ```typescript
97
- * const request = sdk.createCoinbaseKycRequest({
111
+ * const request = sdk.createScopedRequest('coinbase_attestation', {
98
112
  * scope: 'myapp.com'
99
113
  * }, {
100
114
  * dappName: 'My DApp',
@@ -104,7 +118,7 @@ export declare class ProofportSDK {
104
118
  * const deepLink = sdk.getDeepLinkUrl(request);
105
119
  * ```
106
120
  */
107
- private createCoinbaseKycRequest;
121
+ private createScopedRequest;
108
122
  /**
109
123
  * @internal
110
124
  * Creates a Coinbase Country attestation proof request.
@@ -169,6 +183,12 @@ export declare class ProofportSDK {
169
183
  * ```
170
184
  */
171
185
  private createProofRequest;
186
+ /**
187
+ * How each circuit's request is built and checked. Keyed by circuit id and
188
+ * exhaustive over it, so a new circuit is a compile error here instead of
189
+ * falling through to another circuit's builder.
190
+ */
191
+ private static readonly REQUEST_BUILDERS;
172
192
  /**
173
193
  * @internal
174
194
  * Creates a Korea Mobile ID (mDL) proof request for any of the three
@@ -487,10 +507,30 @@ export declare class ProofportSDK {
487
507
  * }
488
508
  * ```
489
509
  */
490
- verifyOnChain(circuit: CircuitType, proof: string, publicInputs: string[], providerOrSigner?: any): Promise<{
510
+ verifyOnChain(circuit: CircuitType, proof: string, publicInputs: string[], providerOrSigner?: any, options?: {
511
+ request?: OidcRequestContext;
512
+ }): Promise<{
491
513
  valid: boolean;
492
514
  error?: string;
493
515
  }>;
516
+ /**
517
+ * The request an `oidc_domain_attestation` response answers: the one the
518
+ * caller passed, else the relay request this instance created under the
519
+ * response's requestId. `{ error }` when there is none, or when the two
520
+ * disagree -- an OIDC proof made with a request-bound nonce is only
521
+ * meaningful against the request it was bound to, so a response this SDK
522
+ * cannot place is refused rather than checked without it.
523
+ */
524
+ private oidcRequestFor;
525
+ /** @internal Remember a relay request's scope for verifyResponse*. */
526
+ private rememberRelayRequest;
527
+ /**
528
+ * The verifier for a circuit: the one the dApp configured, otherwise the
529
+ * pinned deployment on the chain this SDK's environment verifies that
530
+ * circuit on. `undefined` when neither exists, which core reports as an
531
+ * error. Never anything a proof response said.
532
+ */
533
+ private verifierTarget;
494
534
  /**
495
535
  * Verifies a proof response on-chain using the deployed verifier contract.
496
536
  *
@@ -499,6 +539,9 @@ export declare class ProofportSDK {
499
539
  *
500
540
  * @param response - ProofResponse object from parseResponse()
501
541
  * @param providerOrSigner - ethers v6 Provider or Signer (defaults to base mainnet public RPC)
542
+ * @param options.request - For `oidc_domain_attestation`: the `{ scope, requestId }`
543
+ * the response answers. Not needed for a relay request this SDK instance
544
+ * created; an OIDC response this instance cannot place is refused without it.
502
545
  *
503
546
  * @returns Promise resolving to verification result with valid boolean and optional error message
504
547
  *
@@ -525,7 +568,9 @@ export declare class ProofportSDK {
525
568
  * });
526
569
  * ```
527
570
  */
528
- verifyResponseOnChain(response: ProofResponse, providerOrSigner?: any): Promise<{
571
+ verifyResponseOnChain(response: ProofResponse, providerOrSigner?: any, options?: {
572
+ request?: OidcRequestContext;
573
+ }): Promise<{
529
574
  valid: boolean;
530
575
  error?: string;
531
576
  }>;
@@ -575,6 +620,8 @@ export declare class ProofportSDK {
575
620
  * ```
576
621
  */
577
622
  getVerifierAddress(circuit: CircuitType): string;
623
+ /** The configured or pinned verifier, or an error saying why there is none. */
624
+ private requireVerifier;
578
625
  /**
579
626
  * Gets the blockchain chain ID where the verifier contract is deployed.
580
627
  *
@@ -731,6 +778,8 @@ export declare class ProofportSDK {
731
778
  * ```
732
779
  */
733
780
  static create(envOrConfig?: SDKEnvironment | ProofportConfig): ProofportSDK;
781
+ /** @internal An SDK on an environment preset's relay, verifying on that environment's chains. */
782
+ private static forEnvironment;
734
783
  /**
735
784
  * Detects if the code is running on a mobile device.
736
785
  *
@@ -13,6 +13,49 @@ import type { CircuitType, SDKEnvironment } from './types';
13
13
  * ```
14
14
  */
15
15
  export declare const RELAY_URLS: Record<SDKEnvironment, string>;
16
+ /**
17
+ * The chain each circuit is verified on, per environment. Complete: a circuit
18
+ * added to the SDK is a compile error here until somebody names its chain.
19
+ *
20
+ * Mirrors the mobile app's `CIRCUIT_NETWORKS` (proofport-app
21
+ * src/config/contracts.ts), because a proof is checked where the app said its
22
+ * verifier is: Base for the Coinbase and OIDC circuits, GIWA Sepolia for GIWA
23
+ * and Dojang (testnet-only), Base Sepolia for Korea Mobile ID (testnet-only).
24
+ * The ADDRESS on that chain always comes from core's pinned table, never from
25
+ * a proof response.
26
+ */
27
+ export declare const VERIFICATION_CHAINS: {
28
+ readonly production: {
29
+ readonly coinbase_attestation: 8453;
30
+ readonly coinbase_country_attestation: 8453;
31
+ readonly oidc_domain_attestation: 8453;
32
+ readonly giwa_attestation: 91342;
33
+ readonly dojang_playground: 91342;
34
+ readonly mdl_kr_ownership: 84532;
35
+ readonly mdl_kr_age: 84532;
36
+ readonly mdl_kr_region: 84532;
37
+ };
38
+ readonly staging: {
39
+ readonly coinbase_attestation: 84532;
40
+ readonly coinbase_country_attestation: 84532;
41
+ readonly oidc_domain_attestation: 84532;
42
+ readonly giwa_attestation: 91342;
43
+ readonly dojang_playground: 91342;
44
+ readonly mdl_kr_ownership: 84532;
45
+ readonly mdl_kr_age: 84532;
46
+ readonly mdl_kr_region: 84532;
47
+ };
48
+ readonly local: {
49
+ readonly coinbase_attestation: 84532;
50
+ readonly coinbase_country_attestation: 84532;
51
+ readonly oidc_domain_attestation: 84532;
52
+ readonly giwa_attestation: 91342;
53
+ readonly dojang_playground: 91342;
54
+ readonly mdl_kr_ownership: 84532;
55
+ readonly mdl_kr_age: 84532;
56
+ readonly mdl_kr_region: 84532;
57
+ };
58
+ };
16
59
  /**
17
60
  * Default deep link URL scheme for ZKProofport mobile app.
18
61
  * Used to construct deep link URLs that open the mobile app.
package/dist/index.d.ts CHANGED
@@ -30,6 +30,10 @@ export { extractScopeFromPublicInputs, extractNullifierFromPublicInputs, extract
30
30
  export { CIRCUIT_IDS, CIRCUIT_SUPPORT_STATUS, ALL_CIRCUIT_IDS, SUPPORTED_CIRCUIT_IDS, EXPERIMENTAL_CIRCUIT_IDS, PLANNED_CIRCUIT_IDS, isCircuitId, isSupportedCircuitId, getCircuitSupportStatus, CIRCUIT_VK_PATHS, } from './circuits';
31
31
  export { verifyProofOffChain } from './offChainVerifier';
32
32
  export type { OffChainVerifyResult, OffChainVerifyOptions, } from './offChainVerifier';
33
+ export { PINNED_VERIFIERS, getPinnedVerifier } from './verifier';
34
+ export type { PinnedVerifier } from './verifier';
35
+ export { checkOidcPolicy, deriveOidcNonceBinding, oidcAudienceHash, OIDC_ALLOWED_AUDIENCES, OIDC_NONCE_DOMAIN, OIDC_NOW_MAX_AGE_SECONDS, OIDC_NOW_MAX_FUTURE_SECONDS, OIDC_V1_PUBLIC_INPUT_COUNT, OIDC_V2_PUBLIC_INPUT_COUNT, } from './verifier';
36
+ export type { OidcRequestContext, OidcAudience, OidcNonceMode } from './verifier';
33
37
  export { COINBASE_ATTESTATION_PUBLIC_INPUT_LAYOUT, COINBASE_COUNTRY_PUBLIC_INPUT_LAYOUT, OIDC_DOMAIN_ATTESTATION_PUBLIC_INPUT_LAYOUT, MDL_KR_PUBLIC_INPUT_LAYOUT, } from './constants';
34
38
  export type { CircuitId, CircuitSupportStatus } from './circuits';
35
39
  export { CIRCUIT_ACTION_BINDING, circuitActionBinding, } from './circuits';