@zama-fhe/react-sdk 3.0.0-alpha.34 → 3.0.0-alpha.36

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.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import * as _$_zama_fhe_sdk0 from "@zama-fhe/sdk";
4
- import { Address, BatchBalancesResult, ClearValueType, EIP712TypedData, EncryptParams, PaginatedResult, PublicKeyData, ReadonlyToken, Token, TokenWrapperPair, TokenWrapperPairWithMetadata, TransactionResult, ZKProofLike, ZamaConfig, ZamaSDK } from "@zama-fhe/sdk";
4
+ import { Address, BatchBalancesResult, ClearValueType, EIP712TypedData, EncryptParams, PaginatedResult, PublicKeyData, Token, TokenWrapperPair, TokenWrapperPairWithMetadata, TransactionResult, WrappedToken, ZKProofLike, ZamaConfig, ZamaSDK } from "@zama-fhe/sdk";
5
5
  import { ApproveUnderlyingParams, BatchDecryptBalancesAsParams, ConfidentialSetOperatorParams, ConfidentialTransferFromParams, ConfidentialTransferParams, CreateDelegatedUserDecryptEIP712Params, CreateEIP712Params, DecryptBalanceAsParams, DecryptResult, DelegateDecryptionParams, DelegatedUserDecryptMutationParams, DelegationStatusData, FinalizeUnwrapParams, ResumeUnshieldParams, RevokeDelegationParams, ShieldParams, TokenMetadata, UnshieldAllParams, UnshieldParams, UnwrapParams, UserDecryptQueryConfig } from "@zama-fhe/sdk/query";
6
6
  import * as _$_tanstack_react_query0 from "@tanstack/react-query";
7
7
  import { UseMutationOptions, UseMutationResult, UseQueryOptions } from "@tanstack/react-query";
@@ -306,47 +306,47 @@ declare function useRevokePermits(options?: UseMutationOptions<void, Error, Addr
306
306
  declare function useClearCredentials(options?: UseMutationOptions<void>): _$_tanstack_react_query0.UseMutationResult<void, Error, void, unknown>;
307
307
  //#endregion
308
308
  //#region src/token/use-token.d.ts
309
- /** Base configuration shared by all mutation hooks that need a Token instance. */
310
- interface UseZamaConfig {
311
- /** Address of the confidential token contract. */
312
- tokenAddress: Address;
313
- /** Address of the wrapper contract (required for shield/unshield operations). */
314
- wrapperAddress?: Address;
315
- }
316
309
  /**
317
- * Get a {@link Token} instance, memoized by address pair.
310
+ * Get a {@link Token} instance for an ERC-7984 confidential token, memoized by address.
311
+ * Supports balance queries, transfers, and operator approval.
312
+ *
313
+ * For ERC-7984 wrappers (shield/unshield), use {@link useWrappedToken} instead.
318
314
  *
319
- * @param config - Token and optional wrapper addresses.
315
+ * @param address - The confidential token contract address.
320
316
  * @returns A memoized `Token` instance.
321
317
  *
322
318
  * @example
323
319
  * ```tsx
324
- * const token = useToken({ tokenAddress: "0xToken", wrapperAddress: "0xWrapper" });
320
+ * const token = useToken("0xToken");
321
+ * // token.balanceOf(), token.confidentialTransfer(), etc.
325
322
  * ```
326
323
  */
327
- declare function useToken(config: UseZamaConfig): Token;
324
+ declare function useToken(address: Address): Token;
328
325
  //#endregion
329
- //#region src/token/use-readonly-token.d.ts
326
+ //#region src/token/use-wrapped-token.d.ts
330
327
  /**
331
- * Get a {@link ReadonlyToken} instance, memoized by address.
332
- * Supports balance queries, ERC-165 checks, and authorization — no wrapper needed.
333
- * Reads signer and storage from the nearest {@link ZamaProvider}.
328
+ * Get a {@link WrappedToken} instance for an ERC-7984 ERC-20 wrapper,
329
+ * memoized by address. Adds wrapper-specific operations (shield, unshield,
330
+ * underlying, allowance) on top of the base {@link useToken} API.
334
331
  *
335
- * @param address - Address of the confidential token contract.
336
- * @returns A memoized `ReadonlyToken` instance.
332
+ * The address is the wrapper contract address itself — the wrapper IS the
333
+ * confidential token.
334
+ *
335
+ * @param address - The confidential wrapper contract address.
336
+ * @returns A memoized `WrappedToken` instance.
337
337
  *
338
338
  * @example
339
339
  * ```tsx
340
- * const token = useReadonlyToken("0xToken");
341
- * // token.balanceOf(), token.isConfidential(), etc.
340
+ * const wrapped = useWrappedToken("0xWrapper");
341
+ * // wrapped.shield(1000n), wrapped.unshield(500n), etc.
342
342
  * ```
343
343
  */
344
- declare function useReadonlyToken(address: Address): _$_zama_fhe_sdk0.ReadonlyToken;
344
+ declare function useWrappedToken(address: Address): WrappedToken;
345
345
  //#endregion
346
346
  //#region src/balance/use-confidential-balance.d.ts
347
347
  interface UseConfidentialBalanceConfig {
348
348
  /** Address of the confidential token contract. */
349
- tokenAddress: Address;
349
+ address: Address;
350
350
  /** Account to fetch balance for. The query is disabled while `undefined`. */
351
351
  account: Address | undefined;
352
352
  }
@@ -362,7 +362,7 @@ interface UseConfidentialBalanceOptions extends Omit<UseQueryOptions<bigint>, "q
362
362
  * @example
363
363
  * ```tsx
364
364
  * const { data: balance } = useConfidentialBalance({
365
- * tokenAddress: "0xToken",
365
+ * address: "0xToken",
366
366
  * account: "0xAccount",
367
367
  * });
368
368
  * ```
@@ -372,7 +372,7 @@ declare function useConfidentialBalance(config: UseConfidentialBalanceConfig, op
372
372
  //#region src/balance/use-confidential-balances.d.ts
373
373
  interface UseConfidentialBalancesConfig {
374
374
  /** Addresses of the confidential token contracts to batch-query. The query is disabled while empty. */
375
- tokenAddresses: Address[];
375
+ addresses: Address[];
376
376
  /** Account to fetch balances for. The query is disabled while `undefined`. */
377
377
  account: Address | undefined;
378
378
  }
@@ -384,6 +384,7 @@ interface UseConfidentialBalancesOptions extends Omit<UseQueryOptions<BatchBalan
384
384
  * Hook for fetching multiple confidential token balances in batch. Returns
385
385
  * partial results when some tokens fail — successful balances are available
386
386
  * alongside per-token error information.
387
+ *
387
388
  * @param config - Token addresses configuration.
388
389
  * @param options - React Query options forwarded to the balance query.
389
390
  * @returns The balance query result.
@@ -391,7 +392,7 @@ interface UseConfidentialBalancesOptions extends Omit<UseQueryOptions<BatchBalan
391
392
  * @example
392
393
  * ```tsx
393
394
  * const { data } = useConfidentialBalances({
394
- * tokenAddresses: ["0xTokenA", "0xTokenB"],
395
+ * addresses: ["0xTokenA", "0xTokenB"],
395
396
  * account: "0xAccount",
396
397
  * });
397
398
  * const balance = data?.results.get("0xTokenA");
@@ -404,7 +405,9 @@ declare function useConfidentialBalances(config: UseConfidentialBalancesConfig,
404
405
  //#endregion
405
406
  //#region src/transfer/use-confidential-transfer.d.ts
406
407
  /** Configuration for {@link useConfidentialTransfer}. */
407
- interface UseConfidentialTransferConfig extends UseZamaConfig {
408
+ interface UseConfidentialTransferConfig {
409
+ /** Address of the confidential token contract. */
410
+ address: Address;
408
411
  /**
409
412
  * When `true`, optimistically subtracts the transfer amount from cached balance
410
413
  * before the transaction confirms. Rolls back on error.
@@ -427,7 +430,7 @@ interface UseConfidentialTransferConfig extends UseZamaConfig {
427
430
  * @example
428
431
  * ```tsx
429
432
  * const transfer = useConfidentialTransfer({
430
- * tokenAddress: "0x...",
433
+ * address: "0xToken",
431
434
  * optimistic: true,
432
435
  * });
433
436
  * transfer.mutate(
@@ -454,16 +457,16 @@ declare function useConfidentialTransfer<TContext = unknown>(config: UseConfiden
454
457
  * - {@link EncryptionFailedError} — FHE encryption of the transfer amount failed
455
458
  * - {@link TransactionRevertedError} — on-chain transaction reverted
456
459
  *
457
- * @param config - Token address (and optional wrapper) identifying the token.
460
+ * @param address - Address of the confidential token contract.
458
461
  * @param options - React Query mutation options.
459
462
  *
460
463
  * @example
461
464
  * ```tsx
462
- * const transferFrom = useConfidentialTransferFrom({ tokenAddress: "0x..." });
465
+ * const transferFrom = useConfidentialTransferFrom("0xToken");
463
466
  * transferFrom.mutate({ from: "0xOwner", to: "0xRecipient", amount: 500n });
464
467
  * ```
465
468
  */
466
- declare function useConfidentialTransferFrom(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferFromParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ConfidentialTransferFromParams, `0x${string}`>;
469
+ declare function useConfidentialTransferFrom(address: Address, options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferFromParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ConfidentialTransferFromParams, `0x${string}`>;
467
470
  //#endregion
468
471
  //#region src/operator/use-confidential-set-operator.d.ts
469
472
  /**
@@ -473,21 +476,21 @@ declare function useConfidentialTransferFrom(config: UseZamaConfig, options?: Us
473
476
  * - {@link SigningRejectedError} — user rejected the wallet prompt
474
477
  * - {@link TransactionRevertedError} — on-chain transaction reverted
475
478
  *
476
- * @param config - Token address (and optional wrapper) identifying the token.
479
+ * @param address - Address of the confidential token contract.
477
480
  * @param options - React Query mutation options.
478
481
  *
479
482
  * @example
480
483
  * ```tsx
481
- * const setOperator = useConfidentialSetOperator({ tokenAddress: "0x..." });
484
+ * const setOperator = useConfidentialSetOperator("0xToken");
482
485
  * setOperator.mutate({ operator: "0xOperator" });
483
486
  * ```
484
487
  */
485
- declare function useConfidentialSetOperator(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, ConfidentialSetOperatorParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ConfidentialSetOperatorParams, `0x${string}`>;
488
+ declare function useConfidentialSetOperator(address: Address, options?: UseMutationOptions<TransactionResult, Error, ConfidentialSetOperatorParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ConfidentialSetOperatorParams, `0x${string}`>;
486
489
  //#endregion
487
490
  //#region src/operator/use-confidential-is-operator.d.ts
488
491
  interface UseConfidentialIsOperatorConfig {
489
492
  /** Address of the confidential token contract. The query is disabled while `undefined`. */
490
- tokenAddress: Address | undefined;
493
+ address: Address | undefined;
491
494
  /** Address to check operator status for. The query is disabled while `undefined`. */
492
495
  spender: Address | undefined;
493
496
  /** Token holder address. The query is disabled while `undefined`. */
@@ -495,7 +498,7 @@ interface UseConfidentialIsOperatorConfig {
495
498
  }
496
499
  interface UseConfidentialIsOperatorSuspenseConfig {
497
500
  /** Address of the confidential token contract. */
498
- tokenAddress: Address;
501
+ address: Address;
499
502
  /** Address to check operator status for. */
500
503
  spender: Address;
501
504
  /** Token holder address. */
@@ -503,14 +506,15 @@ interface UseConfidentialIsOperatorSuspenseConfig {
503
506
  }
504
507
  /**
505
508
  * Check if a spender is an approved operator for a holder.
506
- * @param config - Token address, spender, and optional holder to check.
509
+ *
510
+ * @param config - Token address, spender, and holder to check.
507
511
  * @param options - React Query options (forwarded to `useQuery`).
508
512
  * @returns Query result with `data: boolean`.
509
513
  *
510
514
  * @example
511
515
  * ```tsx
512
516
  * const { data: isOperator } = useConfidentialIsOperator({
513
- * tokenAddress: "0xToken",
517
+ * address: "0xToken",
514
518
  * spender: "0xSpender",
515
519
  * holder: "0xHolder",
516
520
  * });
@@ -524,7 +528,7 @@ declare function useConfidentialIsOperator(config: UseConfidentialIsOperatorConf
524
528
  * @example
525
529
  * ```tsx
526
530
  * const { data: isOperator } = useConfidentialIsOperatorSuspense({
527
- * tokenAddress: "0xToken",
531
+ * address: "0xToken",
528
532
  * spender: "0xSpender",
529
533
  * holder: "0xHolder",
530
534
  * });
@@ -534,7 +538,9 @@ declare function useConfidentialIsOperatorSuspense(config: UseConfidentialIsOper
534
538
  //#endregion
535
539
  //#region src/shield/use-shield.d.ts
536
540
  /** Configuration for {@link useShield}. */
537
- interface UseShieldConfig extends UseZamaConfig {
541
+ interface UseShieldConfig {
542
+ /** Address of the confidential wrapper contract. */
543
+ address: Address;
538
544
  /**
539
545
  * When `true`, optimistically adds the wrap amount to the cached confidential balance
540
546
  * before the transaction confirms. Rolls back on error.
@@ -551,13 +557,12 @@ interface UseShieldConfig extends UseZamaConfig {
551
557
  * - {@link ApprovalFailedError} — ERC-20 approval transaction failed
552
558
  * - {@link TransactionRevertedError} — shield transaction reverted
553
559
  *
554
- * @param config - Token and wrapper addresses.
555
- * Set `optimistic: true` to add the amount to the cached balance immediately.
560
+ * @param config - Wrapper address (and optional `optimistic` flag).
556
561
  * @param options - React Query mutation options.
557
562
  *
558
563
  * @example
559
564
  * ```tsx
560
- * const shield = useShield({ tokenAddress: "0x...", wrapperAddress: "0x...", optimistic: true });
565
+ * const shield = useShield({ address: "0xWrapper", optimistic: true });
561
566
  * shield.mutate({ amount: 1000n });
562
567
  * ```
563
568
  */
@@ -574,16 +579,16 @@ declare function useShield<TContext = unknown>(config: UseShieldConfig, options?
574
579
  * - {@link EncryptionFailedError} — FHE encryption of the unwrap amount failed
575
580
  * - {@link TransactionRevertedError} — on-chain transaction reverted
576
581
  *
577
- * @param config - Token address (and optional wrapper) identifying the token.
582
+ * @param address - Address of the confidential wrapper contract.
578
583
  * @param options - React Query mutation options.
579
584
  *
580
585
  * @example
581
586
  * ```tsx
582
- * const unwrap = useUnwrap({ tokenAddress: "0x..." });
587
+ * const unwrap = useUnwrap("0xWrapper");
583
588
  * unwrap.mutate({ amount: 500n });
584
589
  * ```
585
590
  */
586
- declare function useUnwrap(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, UnwrapParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, UnwrapParams, `0x${string}`>;
591
+ declare function useUnwrap(address: Address, options?: UseMutationOptions<TransactionResult, Error, UnwrapParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, UnwrapParams, `0x${string}`>;
587
592
  //#endregion
588
593
  //#region src/unwrap/use-unwrap-all.d.ts
589
594
  /**
@@ -595,16 +600,16 @@ declare function useUnwrap(config: UseZamaConfig, options?: UseMutationOptions<T
595
600
  * - {@link SigningRejectedError} — user rejected the wallet prompt
596
601
  * - {@link TransactionRevertedError} — on-chain transaction reverted
597
602
  *
598
- * @param config - Token address (and optional wrapper) identifying the token.
603
+ * @param address - Address of the confidential wrapper contract.
599
604
  * @param options - React Query mutation options.
600
605
  *
601
606
  * @example
602
607
  * ```tsx
603
- * const unwrapAll = useUnwrapAll({ tokenAddress: "0x..." });
608
+ * const unwrapAll = useUnwrapAll("0xWrapper");
604
609
  * unwrapAll.mutate();
605
610
  * ```
606
611
  */
607
- declare function useUnwrapAll(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, void, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, void, `0x${string}`>;
612
+ declare function useUnwrapAll(address: Address, options?: UseMutationOptions<TransactionResult, Error, void, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, void, `0x${string}`>;
608
613
  //#endregion
609
614
  //#region src/unwrap/use-finalize-unwrap.d.ts
610
615
  /**
@@ -616,12 +621,12 @@ declare function useUnwrapAll(config: UseZamaConfig, options?: UseMutationOption
616
621
  * - {@link DecryptionFailedError} — public decryption of the burn amount failed
617
622
  * - {@link TransactionRevertedError} — on-chain finalize transaction reverted
618
623
  *
619
- * @param config - Token address (and optional wrapper) identifying the token.
624
+ * @param address - Address of the confidential wrapper contract.
620
625
  * @param options - React Query mutation options.
621
626
  *
622
627
  * @example
623
628
  * ```tsx
624
- * const finalize = useFinalizeUnwrap({ tokenAddress: "0x..." });
629
+ * const finalize = useFinalizeUnwrap("0xWrapper");
625
630
  * const event = findUnwrapRequested(receipt.logs);
626
631
  * // Pass unwrapRequestId from upgraded events, or fall back to encryptedAmount for legacy ones.
627
632
  * finalize.mutate(
@@ -631,7 +636,7 @@ declare function useUnwrapAll(config: UseZamaConfig, options?: UseMutationOption
631
636
  * );
632
637
  * ```
633
638
  */
634
- declare function useFinalizeUnwrap(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, FinalizeUnwrapParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, FinalizeUnwrapParams, `0x${string}`>;
639
+ declare function useFinalizeUnwrap(address: Address, options?: UseMutationOptions<TransactionResult, Error, FinalizeUnwrapParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, FinalizeUnwrapParams, `0x${string}`>;
635
640
  //#endregion
636
641
  //#region src/unshield/use-unshield.d.ts
637
642
  /**
@@ -644,16 +649,16 @@ declare function useFinalizeUnwrap(config: UseZamaConfig, options?: UseMutationO
644
649
  * - {@link DecryptionFailedError} — public decryption failed during finalize
645
650
  * - {@link TransactionRevertedError} — on-chain transaction reverted
646
651
  *
647
- * @param config - Token and wrapper addresses.
652
+ * @param address - Address of the confidential wrapper contract.
648
653
  * @param options - React Query mutation options.
649
654
  *
650
655
  * @example
651
656
  * ```tsx
652
- * const unshield = useUnshield({ tokenAddress: "0x...", wrapperAddress: "0x..." });
657
+ * const unshield = useUnshield("0xWrapper");
653
658
  * unshield.mutate({ amount: 500n });
654
659
  * ```
655
660
  */
656
- declare function useUnshield(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, UnshieldParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, UnshieldParams, `0x${string}`>;
661
+ declare function useUnshield(address: Address, options?: UseMutationOptions<TransactionResult, Error, UnshieldParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, UnshieldParams, `0x${string}`>;
657
662
  //#endregion
658
663
  //#region src/unshield/use-unshield-all.d.ts
659
664
  /**
@@ -665,16 +670,16 @@ declare function useUnshield(config: UseZamaConfig, options?: UseMutationOptions
665
670
  * - {@link DecryptionFailedError} — public decryption failed during finalize
666
671
  * - {@link TransactionRevertedError} — on-chain transaction reverted
667
672
  *
668
- * @param config - Token and wrapper addresses.
673
+ * @param address - Address of the confidential wrapper contract.
669
674
  * @param options - React Query mutation options.
670
675
  *
671
676
  * @example
672
677
  * ```tsx
673
- * const unshieldAll = useUnshieldAll({ tokenAddress: "0x...", wrapperAddress: "0x..." });
678
+ * const unshieldAll = useUnshieldAll("0xWrapper");
674
679
  * unshieldAll.mutate();
675
680
  * ```
676
681
  */
677
- declare function useUnshieldAll(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, UnshieldAllParams | void, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, void | UnshieldAllParams, `0x${string}`>;
682
+ declare function useUnshieldAll(address: Address, options?: UseMutationOptions<TransactionResult, Error, UnshieldAllParams | void, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, void | UnshieldAllParams, `0x${string}`>;
678
683
  //#endregion
679
684
  //#region src/unshield/use-resume-unshield.d.ts
680
685
  /**
@@ -686,31 +691,27 @@ declare function useUnshieldAll(config: UseZamaConfig, options?: UseMutationOpti
686
691
  * - {@link DecryptionFailedError} — public decryption failed during finalize
687
692
  * - {@link TransactionRevertedError} — on-chain transaction reverted
688
693
  *
689
- * @param config - Token and wrapper addresses.
694
+ * @param address - Address of the confidential wrapper contract.
690
695
  * @param options - React Query mutation options.
691
696
  *
692
697
  * @example
693
698
  * ```tsx
694
- * const resumeUnshield = useResumeUnshield({ tokenAddress: "0x...", wrapperAddress: "0x..." });
699
+ * const resumeUnshield = useResumeUnshield("0xWrapper");
695
700
  * resumeUnshield.mutate({ unwrapTxHash: "0xabc..." });
696
701
  * ```
697
702
  */
698
- declare function useResumeUnshield(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, ResumeUnshieldParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ResumeUnshieldParams, `0x${string}`>;
703
+ declare function useResumeUnshield(address: Address, options?: UseMutationOptions<TransactionResult, Error, ResumeUnshieldParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ResumeUnshieldParams, `0x${string}`>;
699
704
  //#endregion
700
705
  //#region src/shield/use-underlying-allowance.d.ts
701
706
  interface UseUnderlyingAllowanceConfig {
702
- /** Address of the confidential token contract used to scope the query cache. */
703
- tokenAddress: Address;
704
- /** Address of the wrapper contract whose underlying ERC-20 allowance is checked. */
705
- wrapperAddress: Address;
707
+ /** Address of the confidential wrapper contract. */
708
+ address: Address;
706
709
  /** Owner to fetch allowance for. The query is disabled while `undefined`. */
707
710
  owner: Address | undefined;
708
711
  }
709
712
  interface UseUnderlyingAllowanceSuspenseConfig {
710
- /** Address of the confidential token contract used to scope the query cache. */
711
- tokenAddress: Address;
712
- /** Address of the wrapper contract whose underlying ERC-20 allowance is checked. */
713
- wrapperAddress: Address;
713
+ /** Address of the confidential wrapper contract. */
714
+ address: Address;
714
715
  /** Owner to fetch allowance for. */
715
716
  owner: Address;
716
717
  }
@@ -721,8 +722,7 @@ interface UseUnderlyingAllowanceSuspenseConfig {
721
722
  * @example
722
723
  * ```tsx
723
724
  * const { data: allowance } = useUnderlyingAllowance({
724
- * tokenAddress: "0xConfidentialToken",
725
- * wrapperAddress: "0xWrapper",
725
+ * address: "0xWrapper",
726
726
  * owner: "0xOwner",
727
727
  * });
728
728
  * ```
@@ -735,8 +735,7 @@ declare function useUnderlyingAllowance(config: UseUnderlyingAllowanceConfig, op
735
735
  * @example
736
736
  * ```tsx
737
737
  * const { data: allowance } = useUnderlyingAllowanceSuspense({
738
- * tokenAddress: "0xConfidentialToken",
739
- * wrapperAddress: "0xWrapper",
738
+ * address: "0xWrapper",
740
739
  * owner: "0xOwner",
741
740
  * });
742
741
  * ```
@@ -833,33 +832,34 @@ declare function useMetadataSuspense(tokenAddress: Address): _$_tanstack_react_q
833
832
  //#endregion
834
833
  //#region src/delegation/use-delegate-decryption.d.ts
835
834
  /**
836
- * Delegate FHE decryption rights for a token to another address via the on-chain ACL.
835
+ * Delegate FHE decryption rights for a confidential contract to another address
836
+ * via the on-chain ACL.
837
837
  *
838
- * @param config - Token address identifying the confidential token.
838
+ * @param address - Confidential contract address to delegate on.
839
839
  * @param options - React Query mutation options.
840
840
  *
841
841
  * @example
842
842
  * ```tsx
843
- * const delegate = useDelegateDecryption({ tokenAddress: "0x..." });
843
+ * const delegate = useDelegateDecryption("0xToken");
844
844
  * delegate.mutate({ delegateAddress: "0xDelegate" });
845
845
  * ```
846
846
  */
847
- declare function useDelegateDecryption(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, DelegateDecryptionParams>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, DelegateDecryptionParams, unknown>;
847
+ declare function useDelegateDecryption(address: Address, options?: UseMutationOptions<TransactionResult, Error, DelegateDecryptionParams>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, DelegateDecryptionParams, unknown>;
848
848
  //#endregion
849
849
  //#region src/delegation/use-revoke-delegation.d.ts
850
850
  /**
851
- * Revoke FHE decryption delegation for a token from a delegate address.
851
+ * Revoke FHE decryption delegation for a confidential contract from a delegate address.
852
852
  *
853
- * @param config - Token address identifying the confidential token.
853
+ * @param address - Confidential contract address to revoke delegation on.
854
854
  * @param options - React Query mutation options.
855
855
  *
856
856
  * @example
857
857
  * ```tsx
858
- * const revoke = useRevokeDelegation({ tokenAddress: "0x..." });
858
+ * const revoke = useRevokeDelegation("0xToken");
859
859
  * revoke.mutate({ delegateAddress: "0xDelegate" });
860
860
  * ```
861
861
  */
862
- declare function useRevokeDelegation(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, RevokeDelegationParams>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, RevokeDelegationParams, unknown>;
862
+ declare function useRevokeDelegation(address: Address, options?: UseMutationOptions<TransactionResult, Error, RevokeDelegationParams>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, RevokeDelegationParams, unknown>;
863
863
  //#endregion
864
864
  //#region src/delegation/use-delegation-status.d.ts
865
865
  interface UseDelegationStatusConfig {
@@ -893,7 +893,7 @@ declare function useDelegationStatus(config: UseDelegationStatusConfig, options?
893
893
  /**
894
894
  * Decrypt another user's confidential balance as a delegate.
895
895
  *
896
- * @param tokenAddress - Address of the confidential token contract.
896
+ * @param address - Address of the confidential token contract.
897
897
  * @param options - React Query mutation options.
898
898
  *
899
899
  * @example
@@ -903,13 +903,13 @@ declare function useDelegationStatus(config: UseDelegationStatusConfig, options?
903
903
  * // decryptAs.data => 1000n
904
904
  * ```
905
905
  */
906
- declare function useDecryptBalanceAs(tokenAddress: Address, options?: UseMutationOptions<bigint, Error, DecryptBalanceAsParams>): _$_tanstack_react_query0.UseMutationResult<bigint, Error, DecryptBalanceAsParams, unknown>;
906
+ declare function useDecryptBalanceAs(address: Address, options?: UseMutationOptions<bigint, Error, DecryptBalanceAsParams>): _$_tanstack_react_query0.UseMutationResult<bigint, Error, DecryptBalanceAsParams, unknown>;
907
907
  //#endregion
908
908
  //#region src/delegation/use-batch-decrypt-balances-as.d.ts
909
909
  /**
910
910
  * Batch decrypt confidential balances as a delegate across multiple tokens.
911
911
  *
912
- * @param tokens - ReadonlyToken instances to decrypt balances for.
912
+ * @param tokens - {@link Token} instances to decrypt balances for.
913
913
  * @param options - React Query mutation options.
914
914
  *
915
915
  * @example
@@ -921,7 +921,7 @@ declare function useDecryptBalanceAs(tokenAddress: Address, options?: UseMutatio
921
921
  * // batchDecryptAs.data => Map { "0xTokenA" => 100n, "0xTokenB" => 200n }
922
922
  * ```
923
923
  */
924
- declare function useBatchDecryptBalancesAs(tokens: ReadonlyToken[], options?: UseMutationOptions<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>): _$_tanstack_react_query0.UseMutationResult<Map<`0x${string}`, bigint>, Error, _$_zama_fhe_sdk0.BatchDecryptAsOptions, unknown>;
924
+ declare function useBatchDecryptBalancesAs(tokens: Token[], options?: UseMutationOptions<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>): _$_tanstack_react_query0.UseMutationResult<Map<`0x${string}`, bigint>, Error, _$_zama_fhe_sdk0.BatchDecryptAsOptions, unknown>;
925
925
  //#endregion
926
926
  //#region src/shield/use-approve-underlying.d.ts
927
927
  /**
@@ -933,17 +933,17 @@ declare function useBatchDecryptBalancesAs(tokens: ReadonlyToken[], options?: Us
933
933
  * - {@link SigningRejectedError} — user rejected the wallet prompt
934
934
  * - {@link TransactionRevertedError} — approval transaction reverted
935
935
  *
936
- * @param config - Token and wrapper addresses.
936
+ * @param address - Address of the confidential wrapper contract.
937
937
  * @param options - React Query mutation options.
938
938
  *
939
939
  * @example
940
940
  * ```tsx
941
- * const approve = useApproveUnderlying({ tokenAddress: "0x...", wrapperAddress: "0x..." });
941
+ * const approve = useApproveUnderlying("0xWrapper");
942
942
  * approve.mutate({}); // max approval
943
943
  * approve.mutate({ amount: 1000n }); // exact amount
944
944
  * ```
945
945
  */
946
- declare function useApproveUnderlying(config: UseZamaConfig, options?: UseMutationOptions<TransactionResult, Error, ApproveUnderlyingParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ApproveUnderlyingParams, `0x${string}`>;
946
+ declare function useApproveUnderlying(address: Address, options?: UseMutationOptions<TransactionResult, Error, ApproveUnderlyingParams, Address>): _$_tanstack_react_query0.UseMutationResult<TransactionResult, Error, ApproveUnderlyingParams, `0x${string}`>;
947
947
  //#endregion
948
948
  //#region src/token/use-is-confidential.d.ts
949
949
  /**
@@ -1144,5 +1144,5 @@ declare function useListPairs({
1144
1144
  metadata?: boolean;
1145
1145
  }): _$_tanstack_react_query0.UseQueryResult<PaginatedResult<TokenWrapperPair | TokenWrapperPairWithMetadata>, Error>;
1146
1146
  //#endregion
1147
- export { type UseConfidentialBalanceConfig, type UseConfidentialBalanceOptions, type UseConfidentialBalancesConfig, type UseConfidentialBalancesOptions, type UseConfidentialIsOperatorConfig, type UseConfidentialIsOperatorSuspenseConfig, type UseConfidentialTransferConfig, type UseDelegationStatusConfig, type UseIsAllowedConfig, type UseShieldConfig, type UseUnderlyingAllowanceConfig, type UseUnderlyingAllowanceSuspenseConfig, type UseUserDecryptResult, type UseWrapperDiscoveryConfig, type UseWrapperDiscoverySuspenseConfig, type UseZamaConfig, ZamaProvider, type ZamaProviderProps, useAllow, useApproveUnderlying, useBatchDecryptBalancesAs, useClearCredentials, useConfidentialBalance, useConfidentialBalances, useConfidentialIsOperator, useConfidentialIsOperatorSuspense, useConfidentialSetOperator, useConfidentialTokenAddress, useConfidentialTransfer, useConfidentialTransferFrom, useCreateDelegatedUserDecryptEIP712, useCreateEIP712, useDecryptBalanceAs, useDelegateDecryption, useDelegatedUserDecrypt, useDelegationStatus, useEncrypt, useFinalizeUnwrap, useGenerateKeypair, useIsAllowed, useIsConfidential, useIsConfidentialSuspense, useIsConfidentialTokenValid, useIsWrapper, useIsWrapperSuspense, useListPairs, useMetadata, useMetadataSuspense, usePublicDecrypt, usePublicKey, usePublicParams, useReadonlyToken, useRequestZKProofVerification, useResumeUnshield, useRevokeDelegation, useRevokePermits, useShield, useToken, useTokenAddress, useTokenPair, useTokenPairsLength, useTokenPairsRegistry, useTokenPairsSlice, useTotalSupply, useTotalSupplySuspense, useUnderlyingAllowance, useUnderlyingAllowanceSuspense, useUnshield, useUnshieldAll, useUnwrap, useUnwrapAll, useUserDecrypt, useWrapperDiscovery, useWrapperDiscoverySuspense, useWrappersRegistryAddress, useZamaSDK };
1147
+ export { type UseConfidentialBalanceConfig, type UseConfidentialBalanceOptions, type UseConfidentialBalancesConfig, type UseConfidentialBalancesOptions, type UseConfidentialIsOperatorConfig, type UseConfidentialIsOperatorSuspenseConfig, type UseConfidentialTransferConfig, type UseDelegationStatusConfig, type UseIsAllowedConfig, type UseShieldConfig, type UseUnderlyingAllowanceConfig, type UseUnderlyingAllowanceSuspenseConfig, type UseUserDecryptResult, type UseWrapperDiscoveryConfig, type UseWrapperDiscoverySuspenseConfig, ZamaProvider, type ZamaProviderProps, useAllow, useApproveUnderlying, useBatchDecryptBalancesAs, useClearCredentials, useConfidentialBalance, useConfidentialBalances, useConfidentialIsOperator, useConfidentialIsOperatorSuspense, useConfidentialSetOperator, useConfidentialTokenAddress, useConfidentialTransfer, useConfidentialTransferFrom, useCreateDelegatedUserDecryptEIP712, useCreateEIP712, useDecryptBalanceAs, useDelegateDecryption, useDelegatedUserDecrypt, useDelegationStatus, useEncrypt, useFinalizeUnwrap, useGenerateKeypair, useIsAllowed, useIsConfidential, useIsConfidentialSuspense, useIsConfidentialTokenValid, useIsWrapper, useIsWrapperSuspense, useListPairs, useMetadata, useMetadataSuspense, usePublicDecrypt, usePublicKey, usePublicParams, useRequestZKProofVerification, useResumeUnshield, useRevokeDelegation, useRevokePermits, useShield, useToken, useTokenAddress, useTokenPair, useTokenPairsLength, useTokenPairsRegistry, useTokenPairsSlice, useTotalSupply, useTotalSupplySuspense, useUnderlyingAllowance, useUnderlyingAllowanceSuspense, useUnshield, useUnshieldAll, useUnwrap, useUnwrapAll, useUserDecrypt, useWrappedToken, useWrapperDiscovery, useWrapperDiscoverySuspense, useWrappersRegistryAddress, useZamaSDK };
1148
1148
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use client";import{ZamaSDK as e}from"@zama-fhe/sdk";import{allowMutationOptions as t,approveUnderlyingMutationOptions as n,batchDecryptBalancesAsMutationOptions as r,clearCredentialsMutationOptions as i,confidentialBalanceQueryOptions as a,confidentialBalancesQueryOptions as o,confidentialIsOperatorQueryOptions as s,confidentialSetOperatorMutationOptions as c,confidentialTokenAddressQueryOptions as ee,confidentialTransferFromMutationOptions as te,confidentialTransferMutationOptions as ne,createDelegatedUserDecryptEIP712MutationOptions as re,createEIP712MutationOptions as ie,decryptBalanceAsMutationOptions as ae,delegateDecryptionMutationOptions as oe,delegatedUserDecryptMutationOptions as se,delegationStatusQueryOptions as ce,encryptMutationOptions as le,finalizeUnwrapMutationOptions as ue,generateKeypairMutationOptions as de,hashFn as l,invalidateAfterApproveUnderlying as u,invalidateAfterSetOperator as d,invalidateAfterShield as fe,invalidateAfterTransfer as f,invalidateAfterUnshield as p,invalidateAfterUnwrap as m,invalidateWalletLifecycleQueries as h,isAllowedQueryOptions as pe,isConfidentialQueryOptions as g,isConfidentialTokenValidQueryOptions as me,isWrapperQueryOptions as _,listPairsQueryOptions as he,publicDecryptMutationOptions as ge,publicKeyQueryOptions as _e,publicParamsQueryOptions as ve,requestZKProofVerificationMutationOptions as v,resumeUnshieldMutationOptions as y,revokeDelegationMutationOptions as b,revokePermitsMutationOptions as x,shieldMutationOptions as S,tokenAddressQueryOptions as C,tokenMetadataQueryOptions as w,tokenPairQueryOptions as T,tokenPairsLengthQueryOptions as E,tokenPairsQueryOptions as D,tokenPairsSliceQueryOptions as O,totalSupplyQueryOptions as k,underlyingAllowanceQueryOptions as A,unshieldAllMutationOptions as j,unshieldMutationOptions as M,unwrapAllMutationOptions as N,unwrapMutationOptions as P,userDecryptQueryOptions as F,wrapperDiscoveryQueryOptions as I,zamaQueryKeys as L}from"@zama-fhe/sdk/query";import{useMutation as R,useQuery as ye,useQueryClient as z,useSuspenseQuery as be}from"@tanstack/react-query";import{createContext as xe,useContext as Se,useEffect as B,useMemo as V,useRef as Ce,useSyncExternalStore as we}from"react";import{jsx as Te}from"react/jsx-runtime";const H=xe(null);function Ee({children:t,config:n}){let r=z(),i=Ce(n.onEvent);B(()=>{i.current=n.onEvent});let a=V(()=>new e({...n,onEvent:i.current}),[n]);return B(()=>a.onWalletAccountChange(({previous:e})=>{e&&h(r)}),[a,r]),B(()=>()=>a.dispose(),[a]),Te(H.Provider,{value:a,children:t})}function U(){let e=Se(H);if(!e)throw Error(`useZamaSDK must be used within a <ZamaProvider>. Wrap your component tree in <ZamaProvider config={createConfig(...)}>.`);return e}function De(){return R(le(U()))}function W(e){return ye({...e,queryKeyHashFn:l})}function G(e){return be({...e,queryKeyHashFn:l})}function K(e){return we(t=>e.onWalletAccountChange(t),()=>e.signer?.walletAccount.getSnapshot(),()=>void 0)}function Oe(e,t){let n=U(),r=F(n,e,{walletAccount:K(n)});return W({...r,...t,enabled:r.enabled&&(t?.enabled??!1)})}function ke(){return R(ge(U()))}function Ae(){return R(de(U()))}function je(){return R(ie(U()))}function Me(){return R(re(U()))}function Ne(){return R(se(U()))}function q(){return R(v(U()))}function Pe(){return W(_e(U()))}function Fe(e){return W(ve(U(),e))}function Ie(e){return R({...t(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all})}})}function Le(e){let t=U();return W(pe(t,e,{walletAccount:K(t)}))}function Re(e){return R({...x(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all}),i.client.removeQueries({queryKey:L.decryption.all})}})}function ze(e){return R({...i(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all}),i.client.removeQueries({queryKey:L.decryption.all})}})}function J(e){let t=U();return V(()=>t.createToken(e.tokenAddress,e.wrapperAddress),[t,e.tokenAddress,e.wrapperAddress])}function Y(e){let t=U();return V(()=>t.createReadonlyToken(e),[t,e])}function Be(e,t){let{tokenAddress:n,account:r}=e,{enabled:i=!0}=t??{},o=Y(n),s=K(o.sdk),c=a(o,{tokenAddress:n,account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function Ve(e,t){let{tokenAddresses:n,account:r}=e,{enabled:i=!0}=t??{},a=U(),s=K(a),c=o(V(()=>n.map(e=>a.createReadonlyToken(e)),[a,n]),{account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function X(e,t){let n=e?t:void 0;return{wrappedContext:n,callerContext:e?n?.callerContext:t}}async function Z({queryClient:e,tokenAddress:t,amount:n,mode:r}){let i=L.confidentialBalance.token(t);await e.cancelQueries({queryKey:i});let a=e.getQueriesData({queryKey:i});for(let[t,i]of a)i!==void 0&&e.setQueryData(t,r===`add`?i+n:i-n);return a}function Q(e,t){for(let[n,r]of t)e.setQueryData(n,r)}function He({optimistic:e,tokenAddress:t,queryClient:n,options:r}){return{onMutate:e?async(e,i)=>({snapshot:await Z({queryClient:n,tokenAddress:t,amount:e.amount,mode:`add`}),callerContext:await r?.onMutate?.(e,i)}):r?.onMutate,onError:(t,i,a,o)=>{let{wrappedContext:s,callerContext:c}=X(e,a);try{s&&Q(n,s.snapshot)}finally{r?.onError?.(t,i,c,o)}},onSuccess:(n,i,a,o)=>{let{callerContext:s}=X(e,a);r?.onSuccess?.(n,i,s,o),fe(o.client,t)},onSettled:(t,n,i,a,o)=>{let{callerContext:s}=X(e,a);r?.onSettled?.(t,n,i,s,o)}}}function Ue(e,t){let n=J(e),r=z();return R({...ne(n),...t,onMutate:e.optimistic?async(e,i)=>({snapshot:await Z({queryClient:r,tokenAddress:n.address,amount:e.amount,mode:`subtract`}),callerContext:await t?.onMutate?.(e,i)}):t?.onMutate,onError:(n,i,a,o)=>{let{wrappedContext:s,callerContext:c}=X(e.optimistic,a);try{s&&Q(r,s.snapshot)}finally{t?.onError?.(n,i,c,o)}},onSuccess:(r,i,a,o)=>{let{callerContext:s}=X(e.optimistic,a);t?.onSuccess?.(r,i,s,o),f(o.client,n.address)},onSettled:(n,r,i,a,o)=>{let{callerContext:s}=X(e.optimistic,a);t?.onSettled?.(n,r,i,s,o)}})}function We(e,t){let n=J(e);return R({...te(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),f(a.client,n.address)}})}function Ge(e,t){let n=J(e);return R({...c(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),d(a.client,n.address)}})}function Ke(e,t){let{tokenAddress:n,spender:r,holder:i}=e,a=s(U(),n,{holder:i,spender:r});return W({...a,...t,enabled:(a.enabled??!0)&&(t?.enabled??!0)})}function qe(e){let{spender:t,holder:n,tokenAddress:r}=e;return G(s(U(),r,{holder:n,spender:t}))}function Je(e,t){let n=J(e),r=z();return R({...S(n),...t,...He({optimistic:e.optimistic,tokenAddress:n.address,queryClient:r,options:t})})}function Ye(e,t){let n=J(e);return R({...P(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),m(a.client,n.address)}})}function Xe(e,t){let n=J(e);return R({...N(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),m(a.client,n.address)}})}function Ze(e,t){let n=J(e);return R({...ue(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function Qe(e,t){let n=J(e);return R({...M(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function $e(e,t){let n=J(e);return R({...j(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function et(e,t){let n=J(e);return R({...y(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function tt(e,t){let{tokenAddress:n,wrapperAddress:r,owner:i}=e,a=A(U(),n,{owner:i,wrapperAddress:r});return W({...a,...t,enabled:(a.enabled??!0)&&(t?.enabled??!0)})}function nt(e){let{tokenAddress:t,wrapperAddress:n,owner:r}=e;return G(A(U(),t,{owner:r,wrapperAddress:n}))}function $(){let e=U(),{data:t}=W({queryKey:L.wrappersRegistry.chainId(),queryFn:()=>e.provider.getChainId(),staleTime:3e4});return t===void 0?void 0:e.registry.getAddress(t)}function rt(e,t){let{tokenAddress:n,erc20Address:r}=e,i=U(),a=$(),o=I(i.registry,{tokenAddress:n,erc20Address:r,registryAddress:a});return W({...o,...t,enabled:(o.enabled??!0)&&(t?.enabled??!0)})}function it(e){let{tokenAddress:t,erc20Address:n}=e,r=U(),i=$();return G(I(r.registry,{tokenAddress:t,erc20Address:n,registryAddress:i}))}function at(e,t){return W({...w(U(),e),...t})}function ot(e){return G(w(U(),e))}function st(e,t){return R({...oe(J(e)),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:L.delegationStatus.all})}}})}function ct(e,t){return R({...b(J(e)),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:L.delegationStatus.all})}}})}function lt(e,t){let n=ce(U(),e);return W({...n,...t,enabled:(n.enabled??!0)&&(t?.enabled??!0)})}function ut(e,t){return R({...ae(Y(e)),...t})}function dt(e,t){return R({...r(e),...t})}function ft(e,t){let r=J(e);return R({...n(r),...t,onSuccess:(e,n,i,a)=>{t?.onSuccess?.(e,n,i,a),u(a.client,r.address)}})}function pt(e,t){return W({...g(U(),e),...t})}function mt(e){return G(g(U(),e))}function ht(e,t){return W({..._(U(),e),...t})}function gt(e){return G(_(U(),e))}function _t(e,t){return W({...k(U(),e),...t})}function vt(e){return G(k(U(),e))}function yt(){return W(D(U(),{registryAddress:$()}))}function bt(){return W(E(U(),{registryAddress:$()}))}function xt({fromIndex:e,toIndex:t}){return W(O(U(),{registryAddress:$(),fromIndex:e,toIndex:t}))}function St({index:e}){return W(T(U(),{registryAddress:$(),index:e}))}function Ct({tokenAddress:e}){return W(ee(U(),{registryAddress:$(),tokenAddress:e}))}function wt({confidentialTokenAddress:e}){return W(C(U(),{registryAddress:$(),confidentialTokenAddress:e}))}function Tt({confidentialTokenAddress:e}){return W(me(U(),{registryAddress:$(),confidentialTokenAddress:e}))}function Et({page:e=1,pageSize:t=100,metadata:n=!1}={}){let r=U(),i=$();return W(he(r.registry,{registryAddress:i,page:e,pageSize:t,metadata:n}))}export{Ee as ZamaProvider,Ie as useAllow,ft as useApproveUnderlying,dt as useBatchDecryptBalancesAs,ze as useClearCredentials,Be as useConfidentialBalance,Ve as useConfidentialBalances,Ke as useConfidentialIsOperator,qe as useConfidentialIsOperatorSuspense,Ge as useConfidentialSetOperator,Ct as useConfidentialTokenAddress,Ue as useConfidentialTransfer,We as useConfidentialTransferFrom,Me as useCreateDelegatedUserDecryptEIP712,je as useCreateEIP712,ut as useDecryptBalanceAs,st as useDelegateDecryption,Ne as useDelegatedUserDecrypt,lt as useDelegationStatus,De as useEncrypt,Ze as useFinalizeUnwrap,Ae as useGenerateKeypair,Le as useIsAllowed,pt as useIsConfidential,mt as useIsConfidentialSuspense,Tt as useIsConfidentialTokenValid,ht as useIsWrapper,gt as useIsWrapperSuspense,Et as useListPairs,at as useMetadata,ot as useMetadataSuspense,ke as usePublicDecrypt,Pe as usePublicKey,Fe as usePublicParams,Y as useReadonlyToken,q as useRequestZKProofVerification,et as useResumeUnshield,ct as useRevokeDelegation,Re as useRevokePermits,Je as useShield,J as useToken,wt as useTokenAddress,St as useTokenPair,bt as useTokenPairsLength,yt as useTokenPairsRegistry,xt as useTokenPairsSlice,_t as useTotalSupply,vt as useTotalSupplySuspense,tt as useUnderlyingAllowance,nt as useUnderlyingAllowanceSuspense,Qe as useUnshield,$e as useUnshieldAll,Ye as useUnwrap,Xe as useUnwrapAll,Oe as useUserDecrypt,rt as useWrapperDiscovery,it as useWrapperDiscoverySuspense,$ as useWrappersRegistryAddress,U as useZamaSDK};
1
+ "use client";import{ZamaSDK as e}from"@zama-fhe/sdk";import{allowMutationOptions as t,approveUnderlyingMutationOptions as n,batchDecryptBalancesAsMutationOptions as r,clearCredentialsMutationOptions as i,confidentialBalanceQueryOptions as a,confidentialBalancesQueryOptions as o,confidentialIsOperatorQueryOptions as s,confidentialSetOperatorMutationOptions as c,confidentialTokenAddressQueryOptions as ee,confidentialTransferFromMutationOptions as te,confidentialTransferMutationOptions as ne,createDelegatedUserDecryptEIP712MutationOptions as re,createEIP712MutationOptions as ie,decryptBalanceAsMutationOptions as ae,delegateDecryptionMutationOptions as oe,delegatedUserDecryptMutationOptions as se,delegationStatusQueryOptions as ce,encryptMutationOptions as le,finalizeUnwrapMutationOptions as ue,generateKeypairMutationOptions as de,hashFn as l,invalidateAfterApproveUnderlying as fe,invalidateAfterSetOperator as pe,invalidateAfterShield as u,invalidateAfterTransfer as d,invalidateAfterUnshield as f,invalidateAfterUnwrap as p,invalidateWalletLifecycleQueries as m,isAllowedQueryOptions as h,isConfidentialQueryOptions as g,isConfidentialTokenValidQueryOptions as me,isWrapperQueryOptions as _,listPairsQueryOptions as he,publicDecryptMutationOptions as ge,publicKeyQueryOptions as _e,publicParamsQueryOptions as ve,requestZKProofVerificationMutationOptions as v,resumeUnshieldMutationOptions as y,revokeDelegationMutationOptions as b,revokePermitsMutationOptions as x,shieldMutationOptions as S,tokenAddressQueryOptions as C,tokenMetadataQueryOptions as w,tokenPairQueryOptions as T,tokenPairsLengthQueryOptions as E,tokenPairsQueryOptions as D,tokenPairsSliceQueryOptions as O,totalSupplyQueryOptions as k,underlyingAllowanceQueryOptions as A,unshieldAllMutationOptions as j,unshieldMutationOptions as M,unwrapAllMutationOptions as N,unwrapMutationOptions as P,userDecryptQueryOptions as F,wrapperDiscoveryQueryOptions as I,zamaQueryKeys as L}from"@zama-fhe/sdk/query";import{useMutation as R,useQuery as ye,useQueryClient as z,useSuspenseQuery as be}from"@tanstack/react-query";import{createContext as xe,useContext as Se,useEffect as B,useMemo as V,useRef as Ce,useSyncExternalStore as we}from"react";import{jsx as Te}from"react/jsx-runtime";const H=xe(null);function Ee({children:t,config:n}){let r=z(),i=Ce(n.onEvent);B(()=>{i.current=n.onEvent});let a=V(()=>new e({...n,onEvent:i.current}),[n]);return B(()=>a.onWalletAccountChange(({previous:e})=>{e&&m(r)}),[a,r]),B(()=>()=>a.dispose(),[a]),Te(H.Provider,{value:a,children:t})}function U(){let e=Se(H);if(!e)throw Error(`useZamaSDK must be used within a <ZamaProvider>. Wrap your component tree in <ZamaProvider config={createConfig(...)}>.`);return e}function De(){return R(le(U()))}function W(e){return ye({...e,queryKeyHashFn:l})}function G(e){return be({...e,queryKeyHashFn:l})}function K(e){return we(t=>e.onWalletAccountChange(t),()=>e.signer?.walletAccount.getSnapshot(),()=>void 0)}function Oe(e,t){let n=U(),r=F(n,e,{walletAccount:K(n)});return W({...r,...t,enabled:r.enabled&&(t?.enabled??!1)})}function ke(){return R(ge(U()))}function Ae(){return R(de(U()))}function je(){return R(ie(U()))}function q(){return R(re(U()))}function Me(){return R(se(U()))}function Ne(){return R(v(U()))}function Pe(){return W(_e(U()))}function Fe(e){return W(ve(U(),e))}function Ie(e){return R({...t(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all})}})}function Le(e){let t=U();return W(h(t,e,{walletAccount:K(t)}))}function Re(e){return R({...x(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all}),i.client.removeQueries({queryKey:L.decryption.all})}})}function ze(e){return R({...i(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:L.isAllowed.all}),i.client.removeQueries({queryKey:L.decryption.all})}})}function J(e){let t=U();return V(()=>t.createToken(e),[t,e])}function Y(e){let t=U();return V(()=>t.createWrappedToken(e),[t,e])}function Be(e,t){let{address:n,account:r}=e,{enabled:i=!0}=t??{},o=J(n),s=K(o.sdk),c=a(o,{tokenAddress:n,account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function Ve(e,t){let{addresses:n,account:r}=e,{enabled:i=!0}=t??{},a=U(),s=K(a),c=o(V(()=>n.map(e=>a.createToken(e)),[a,n]),{account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function X(e,t){let n=e?t:void 0;return{wrappedContext:n,callerContext:e?n?.callerContext:t}}async function Z({queryClient:e,tokenAddress:t,amount:n,mode:r}){let i=L.confidentialBalance.token(t);await e.cancelQueries({queryKey:i});let a=e.getQueriesData({queryKey:i});for(let[t,i]of a)i!==void 0&&e.setQueryData(t,r===`add`?i+n:i-n);return a}function Q(e,t){for(let[n,r]of t)e.setQueryData(n,r)}function He({optimistic:e,tokenAddress:t,queryClient:n,options:r}){return{onMutate:e?async(e,i)=>({snapshot:await Z({queryClient:n,tokenAddress:t,amount:e.amount,mode:`add`}),callerContext:await r?.onMutate?.(e,i)}):r?.onMutate,onError:(t,i,a,o)=>{let{wrappedContext:s,callerContext:c}=X(e,a);try{s&&Q(n,s.snapshot)}finally{r?.onError?.(t,i,c,o)}},onSuccess:(n,i,a,o)=>{let{callerContext:s}=X(e,a);r?.onSuccess?.(n,i,s,o),u(o.client,t)},onSettled:(t,n,i,a,o)=>{let{callerContext:s}=X(e,a);r?.onSettled?.(t,n,i,s,o)}}}function Ue(e,t){let n=J(e.address),r=z();return R({...ne(n),...t,onMutate:e.optimistic?async(e,i)=>({snapshot:await Z({queryClient:r,tokenAddress:n.address,amount:e.amount,mode:`subtract`}),callerContext:await t?.onMutate?.(e,i)}):t?.onMutate,onError:(n,i,a,o)=>{let{wrappedContext:s,callerContext:c}=X(e.optimistic,a);try{s&&Q(r,s.snapshot)}finally{t?.onError?.(n,i,c,o)}},onSuccess:(r,i,a,o)=>{let{callerContext:s}=X(e.optimistic,a);t?.onSuccess?.(r,i,s,o),d(o.client,n.address)},onSettled:(n,r,i,a,o)=>{let{callerContext:s}=X(e.optimistic,a);t?.onSettled?.(n,r,i,s,o)}})}function We(e,t){let n=J(e);return R({...te(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),d(a.client,n.address)}})}function Ge(e,t){let n=J(e);return R({...c(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),pe(a.client,n.address)}})}function Ke(e,t){let{address:n,spender:r,holder:i}=e,a=s(U(),n,{holder:i,spender:r});return W({...a,...t,enabled:(a.enabled??!0)&&(t?.enabled??!0)})}function qe(e){let{spender:t,holder:n,address:r}=e;return G(s(U(),r,{holder:n,spender:t}))}function Je(e,t){let n=Y(e.address),r=z();return R({...S(n),...t,...He({optimistic:e.optimistic,tokenAddress:n.address,queryClient:r,options:t})})}function Ye(e,t){let n=Y(e);return R({...P(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function Xe(e,t){let n=Y(e);return R({...N(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),p(a.client,n.address)}})}function Ze(e,t){let n=Y(e);return R({...ue(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),f(a.client,n.address)}})}function Qe(e,t){let n=Y(e);return R({...M(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),f(a.client,n.address)}})}function $e(e,t){let n=Y(e);return R({...j(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),f(a.client,n.address)}})}function et(e,t){let n=Y(e);return R({...y(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),f(a.client,n.address)}})}function tt(e,t){let{address:n,owner:r}=e,i=A(U(),n,{owner:r});return W({...i,...t,enabled:(i.enabled??!0)&&(t?.enabled??!0)})}function nt(e){let{address:t,owner:n}=e;return G(A(U(),t,{owner:n}))}function $(){let e=U(),{data:t}=W({queryKey:L.wrappersRegistry.chainId(),queryFn:()=>e.provider.getChainId(),staleTime:3e4});return t===void 0?void 0:e.registry.getAddress(t)}function rt(e,t){let{tokenAddress:n,erc20Address:r}=e,i=U(),a=$(),o=I(i.registry,{tokenAddress:n,erc20Address:r,registryAddress:a});return W({...o,...t,enabled:(o.enabled??!0)&&(t?.enabled??!0)})}function it(e){let{tokenAddress:t,erc20Address:n}=e,r=U(),i=$();return G(I(r.registry,{tokenAddress:t,erc20Address:n,registryAddress:i}))}function at(e,t){return W({...w(U(),e),...t})}function ot(e){return G(w(U(),e))}function st(e,t){return R({...oe(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:L.delegationStatus.all})}}})}function ct(e,t){return R({...b(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:L.delegationStatus.all})}}})}function lt(e,t){let n=ce(U(),e);return W({...n,...t,enabled:(n.enabled??!0)&&(t?.enabled??!0)})}function ut(e,t){return R({...ae(J(e)),...t})}function dt(e,t){return R({...r(e),...t})}function ft(e,t){let r=Y(e);return R({...n(r),...t,onSuccess:(e,n,i,a)=>{t?.onSuccess?.(e,n,i,a),fe(a.client,r.address)}})}function pt(e,t){return W({...g(U(),e),...t})}function mt(e){return G(g(U(),e))}function ht(e,t){return W({..._(U(),e),...t})}function gt(e){return G(_(U(),e))}function _t(e,t){return W({...k(U(),e),...t})}function vt(e){return G(k(U(),e))}function yt(){return W(D(U(),{registryAddress:$()}))}function bt(){return W(E(U(),{registryAddress:$()}))}function xt({fromIndex:e,toIndex:t}){return W(O(U(),{registryAddress:$(),fromIndex:e,toIndex:t}))}function St({index:e}){return W(T(U(),{registryAddress:$(),index:e}))}function Ct({tokenAddress:e}){return W(ee(U(),{registryAddress:$(),tokenAddress:e}))}function wt({confidentialTokenAddress:e}){return W(C(U(),{registryAddress:$(),confidentialTokenAddress:e}))}function Tt({confidentialTokenAddress:e}){return W(me(U(),{registryAddress:$(),confidentialTokenAddress:e}))}function Et({page:e=1,pageSize:t=100,metadata:n=!1}={}){let r=U(),i=$();return W(he(r.registry,{registryAddress:i,page:e,pageSize:t,metadata:n}))}export{Ee as ZamaProvider,Ie as useAllow,ft as useApproveUnderlying,dt as useBatchDecryptBalancesAs,ze as useClearCredentials,Be as useConfidentialBalance,Ve as useConfidentialBalances,Ke as useConfidentialIsOperator,qe as useConfidentialIsOperatorSuspense,Ge as useConfidentialSetOperator,Ct as useConfidentialTokenAddress,Ue as useConfidentialTransfer,We as useConfidentialTransferFrom,q as useCreateDelegatedUserDecryptEIP712,je as useCreateEIP712,ut as useDecryptBalanceAs,st as useDelegateDecryption,Me as useDelegatedUserDecrypt,lt as useDelegationStatus,De as useEncrypt,Ze as useFinalizeUnwrap,Ae as useGenerateKeypair,Le as useIsAllowed,pt as useIsConfidential,mt as useIsConfidentialSuspense,Tt as useIsConfidentialTokenValid,ht as useIsWrapper,gt as useIsWrapperSuspense,Et as useListPairs,at as useMetadata,ot as useMetadataSuspense,ke as usePublicDecrypt,Pe as usePublicKey,Fe as usePublicParams,Ne as useRequestZKProofVerification,et as useResumeUnshield,ct as useRevokeDelegation,Re as useRevokePermits,Je as useShield,J as useToken,wt as useTokenAddress,St as useTokenPair,bt as useTokenPairsLength,yt as useTokenPairsRegistry,xt as useTokenPairsSlice,_t as useTotalSupply,vt as useTotalSupplySuspense,tt as useUnderlyingAllowance,nt as useUnderlyingAllowanceSuspense,Qe as useUnshield,$e as useUnshieldAll,Ye as useUnwrap,Xe as useUnwrapAll,Oe as useUserDecrypt,Y as useWrappedToken,rt as useWrapperDiscovery,it as useWrapperDiscoverySuspense,$ as useWrappersRegistryAddress,U as useZamaSDK};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useQuery","tanstack_useQuery","useSuspenseQuery","tanstack_useSuspenseQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","typed","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery"],"sources":["../src/provider.tsx","../src/relayer/use-encrypt.ts","../src/utils/query.ts","../src/utils/wallet-account.ts","../src/relayer/use-user-decrypt.ts","../src/relayer/use-public-decrypt.ts","../src/relayer/use-generate-keypair.ts","../src/relayer/use-create-eip712.ts","../src/relayer/use-create-delegated-user-decrypt-eip712.ts","../src/relayer/use-delegated-user-decrypt.ts","../src/relayer/use-request-zk-proof-verification.ts","../src/relayer/use-public-key.ts","../src/relayer/use-public-params.ts","../src/authorization/use-allow.ts","../src/authorization/use-is-allowed.ts","../src/authorization/use-revoke-permits.ts","../src/authorization/use-clear-credentials.ts","../src/token/use-token.ts","../src/token/use-readonly-token.ts","../src/balance/use-confidential-balance.ts","../src/balance/use-confidential-balances.ts","../src/balance/optimistic-balance-update.ts","../src/transfer/use-confidential-transfer.ts","../src/transfer/use-confidential-transfer-from.ts","../src/operator/use-confidential-set-operator.ts","../src/operator/use-confidential-is-operator.ts","../src/shield/use-shield.ts","../src/unwrap/use-unwrap.ts","../src/unwrap/use-unwrap-all.ts","../src/unwrap/use-finalize-unwrap.ts","../src/unshield/use-unshield.ts","../src/unshield/use-unshield-all.ts","../src/unshield/use-resume-unshield.ts","../src/shield/use-underlying-allowance.ts","../src/wrappers-registry/use-wrappers-registry-address.ts","../src/token/use-wrapper-discovery.ts","../src/token/use-metadata.ts","../src/delegation/use-delegate-decryption.ts","../src/delegation/use-revoke-delegation.ts","../src/delegation/use-delegation-status.ts","../src/delegation/use-decrypt-balance-as.ts","../src/delegation/use-batch-decrypt-balances-as.ts","../src/shield/use-approve-underlying.ts","../src/token/use-is-confidential.ts","../src/token/use-total-supply.ts","../src/wrappers-registry/use-token-pairs-registry.ts","../src/wrappers-registry/use-token-pairs-length.ts","../src/wrappers-registry/use-token-pairs-slice.ts","../src/wrappers-registry/use-token-pair.ts","../src/wrappers-registry/use-confidential-token-address.ts","../src/wrappers-registry/use-token-address.ts","../src/wrappers-registry/use-is-confidential-token-valid.ts","../src/wrappers-registry/use-list-pairs.ts"],"sourcesContent":["\"use client\";\n\nimport type { ZamaConfig } from \"@zama-fhe/sdk\";\nimport { ZamaSDK } from \"@zama-fhe/sdk\";\nimport { invalidateWalletLifecycleQueries } from \"@zama-fhe/sdk/query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n createContext,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\n/** Props for {@link ZamaProvider}. */\nexport interface ZamaProviderProps extends PropsWithChildren {\n /** Configuration object created by {@link createConfig}. */\n config: ZamaConfig;\n}\n\nconst ZamaSDKContext = createContext<ZamaSDK | null>(null);\n\n/**\n * Provides a {@link ZamaSDK} instance to all descendant hooks.\n *\n * @example\n * ```tsx\n * <ZamaProvider config={zamaConfig}>\n * <App />\n * </ZamaProvider>\n * ```\n */\nexport function ZamaProvider({ children, config }: ZamaProviderProps) {\n const queryClient = useQueryClient();\n\n // Stabilize onEvent so an inline arrow doesn't recreate the SDK every render.\n const onEventRef = useRef(config.onEvent);\n\n useEffect(() => {\n onEventRef.current = config.onEvent;\n });\n\n const sdk = useMemo(() => new ZamaSDK({ ...config, onEvent: onEventRef.current }), [config]);\n\n // SDK internally does credential/cache cleanup. React layer clears the\n // wallet-lifecycle query state.\n useEffect(\n () =>\n sdk.onWalletAccountChange(({ previous }) => {\n if (previous) {\n invalidateWalletLifecycleQueries(queryClient);\n }\n }),\n [sdk, queryClient],\n );\n\n // Clean up SDK-owned signer subscriptions on unmount without terminating\n // the caller-owned relayer. dispose() is idempotent.\n useEffect(() => () => sdk.dispose(), [sdk]);\n\n return <ZamaSDKContext.Provider value={sdk}>{children}</ZamaSDKContext.Provider>;\n}\n\n/**\n * Access the {@link ZamaSDK} instance from context.\n * Throws if called outside a {@link ZamaProvider}.\n *\n * @example\n * ```tsx\n * const sdk = useZamaSDK();\n * const token = sdk.createToken(\"0x...\", \"0x...\");\n * ```\n */\nexport function useZamaSDK(): ZamaSDK {\n const context = useContext(ZamaSDKContext);\n\n if (!context) {\n throw new Error(\n \"useZamaSDK must be used within a <ZamaProvider>. \" +\n \"Wrap your component tree in <ZamaProvider config={createConfig(...)}>.\",\n );\n }\n return context;\n}\n","\"use client\";\n\nimport type { EncryptParams, EncryptResult } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { encryptMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Encrypt a plaintext value using FHE.\n * Calls the relayer's `encrypt` method via a mutation.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link EncryptionFailedError} — FHE encryption failed\n *\n * @returns A mutation whose `mutate` accepts {@link EncryptParams}.\n *\n * @example\n * ```tsx\n * const encrypt = useEncrypt();\n * encrypt.mutate({ values: [{ value: 1000n, type: \"euint64\" }], contractAddress: \"0x...\", userAddress: \"0x...\" });\n * ```\n */\nexport function useEncrypt() {\n const sdk = useZamaSDK();\n return useMutation<EncryptResult, Error, EncryptParams>(encryptMutationOptions(sdk));\n}\n","import {\n type DefaultError,\n type QueriesOptions,\n type QueriesResults,\n useQueries as tanstack_useQueries,\n useQuery as tanstack_useQuery,\n useSuspenseQuery as tanstack_useSuspenseQuery,\n type UseQueryOptions,\n type UseQueryResult,\n type UseSuspenseQueryOptions,\n type UseSuspenseQueryResult,\n} from \"@tanstack/react-query\";\nimport { hashFn } from \"@zama-fhe/sdk/query\";\n\n/**\n * Thin wrapper around TanStack's useQuery that injects our custom queryKeyHashFn.\n * Mirrors the wagmi pattern — the type safety boundary is at the factory and hook levels.\n *\n * Callers typically specify only `<TData>` (e.g. `useQuery<PublicKeyData>(...)`) while\n * factory options carry specific tuple keys (e.g. `readonly [\"zama.publicKey\"]`).\n * We erase the QueryKey param via `AnyKeyQueryOptions` so callers don't need to\n * spell out the key type — any QueryKey subtype is accepted.\n */\ntype AnyKeyQueryOptions<TData, TError> = UseQueryOptions<\n TData,\n TError,\n TData,\n // oxlint-disable-next-line typescript/no-explicit-any\n any\n>;\ntype AnyKeySuspenseOptions<TData, TError> = UseSuspenseQueryOptions<\n TData,\n TError,\n TData,\n // oxlint-disable-next-line typescript/no-explicit-any\n any\n>;\n\nexport function useQuery<TData = unknown, TError = DefaultError>(\n options: AnyKeyQueryOptions<TData, TError>,\n): UseQueryResult<TData, TError> {\n return tanstack_useQuery({\n ...options,\n queryKeyHashFn: hashFn,\n });\n}\n\nexport function useSuspenseQuery<TData = unknown, TError = DefaultError>(\n options: AnyKeySuspenseOptions<TData, TError>,\n): UseSuspenseQueryResult<TData, TError> {\n return tanstack_useSuspenseQuery({\n ...options,\n queryKeyHashFn: hashFn,\n });\n}\n\n/**\n * Thin wrapper around TanStack's useQueries that injects our custom queryKeyHashFn\n * on every query in the array.\n */\nexport function useQueries<\n // oxlint-disable-next-line typescript/no-explicit-any\n T extends Array<any>,\n TCombinedResult = QueriesResults<T>,\n>({\n queries,\n ...options\n}: {\n queries: readonly [...QueriesOptions<T>];\n combine?: (result: QueriesResults<T>) => TCombinedResult;\n subscribed?: boolean;\n}): TCombinedResult {\n return tanstack_useQueries({\n ...options,\n queries: queries.map((q) => ({\n ...q,\n queryKeyHashFn: hashFn,\n })) as [...QueriesOptions<T>],\n });\n}\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport type { WalletAccount, ZamaSDK } from \"@zama-fhe/sdk\";\n\nexport function useWalletAccount(sdk: ZamaSDK): WalletAccount | undefined {\n return useSyncExternalStore(\n (listener) => sdk.onWalletAccountChange(listener),\n () => sdk.signer?.walletAccount.getSnapshot(),\n () => undefined,\n );\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DecryptResult, UserDecryptQueryConfig } from \"@zama-fhe/sdk/query\";\nimport { userDecryptQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/**\n * React hook for FHE user decryption. Thin wrapper around\n * `userDecryptQueryOptions` with `useQuery` semantics.\n */\nexport function useUserDecrypt(\n config: UserDecryptQueryConfig,\n options?: Omit<UseQueryOptions<DecryptResult>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n const queryOpts = userDecryptQueryOptions(sdk, config, { walletAccount });\n return useQuery<DecryptResult>({\n ...queryOpts,\n ...options,\n enabled: queryOpts.enabled && (options?.enabled ?? false),\n });\n}\n\n/** Return type of {@link useUserDecrypt}. */\nexport type UseUserDecryptResult = ReturnType<typeof useUserDecrypt>;\n","\"use client\";\n\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Handle, PublicDecryptResult } from \"@zama-fhe/sdk\";\nimport { publicDecryptMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Decrypt FHE ciphertext handles using the network public key (no credential needed).\n * On success, results are available via `data.clearValues` and written to the\n * persistent decrypt cache.\n *\n * @returns A mutation whose `mutate` accepts an array of handle strings.\n *\n * @example\n * ```tsx\n * const publicDecrypt = usePublicDecrypt();\n * publicDecrypt.mutate([\"0xHandle1\", \"0xHandle2\"]);\n * // publicDecrypt.data?.clearValues => { \"0xHandle1\": 500n, ... }\n * ```\n */\nexport function usePublicDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<PublicDecryptResult, Error, Handle[]>(publicDecryptMutationOptions(sdk));\n}\n","\"use client\";\n\nimport { useMutation } from \"@tanstack/react-query\";\nimport { generateKeypairMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Generate an FHE keypair via the relayer.\n * Returns a public/private key pair for use in decrypt authorization.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link RelayerRequestFailedError} — relayer keypair generation request failed\n *\n * @returns A mutation whose `mutate` takes no parameters.\n *\n * @example\n * ```tsx\n * const generateKeypair = useGenerateKeypair();\n * generateKeypair.mutate();\n * // generateKeypair.data?.publicKey, generateKeypair.data?.privateKey\n * ```\n */\nexport function useGenerateKeypair() {\n const sdk = useZamaSDK();\n return useMutation(generateKeypairMutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { EIP712TypedData } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { createEIP712MutationOptions } from \"@zama-fhe/sdk/query\";\nimport type { CreateEIP712Params } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Create EIP-712 typed data for signing an FHE decrypt credential.\n * The returned typed data is signed by the wallet to authorize decryption.\n *\n * @returns A mutation whose `mutate` accepts {@link CreateEIP712Params}.\n *\n * @example\n * ```tsx\n * const createEIP712 = useCreateEIP712();\n * createEIP712.mutate({\n * publicKey: keypair.publicKey,\n * contractAddresses: [\"0xToken\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * });\n * ```\n */\nexport function useCreateEIP712() {\n const sdk = useZamaSDK();\n return useMutation<EIP712TypedData, Error, CreateEIP712Params>(createEIP712MutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { KmsDelegatedUserDecryptEIP712Type } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { createDelegatedUserDecryptEIP712MutationOptions } from \"@zama-fhe/sdk/query\";\nimport type { CreateDelegatedUserDecryptEIP712Params } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Create EIP-712 typed data for a delegated user decrypt credential.\n * Used when one wallet authorizes another to decrypt on its behalf.\n *\n * @returns A mutation whose `mutate` accepts {@link CreateDelegatedUserDecryptEIP712Params}.\n *\n * @example\n * ```tsx\n * const createEIP712 = useCreateDelegatedUserDecryptEIP712();\n * createEIP712.mutate({\n * publicKey: keypair.publicKey,\n * contractAddresses: [\"0xToken\"],\n * delegatorAddress: \"0xDelegator\",\n * startTimestamp: Math.floor(Date.now() / 1000),\n * });\n * ```\n */\nexport function useCreateDelegatedUserDecryptEIP712() {\n const sdk = useZamaSDK();\n return useMutation<\n KmsDelegatedUserDecryptEIP712Type,\n Error,\n CreateDelegatedUserDecryptEIP712Params\n >(createDelegatedUserDecryptEIP712MutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { ClearValueType, Handle } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport {\n delegatedUserDecryptMutationOptions,\n type DelegatedUserDecryptMutationParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Decrypt FHE ciphertext handles using delegated user credentials.\n * Returns a map of handle → plaintext bigint.\n *\n * @returns A mutation whose `mutate` accepts {@link DelegatedUserDecryptMutationParams}.\n *\n * @example\n * ```tsx\n * const decrypt = useDelegatedUserDecrypt();\n * decrypt.mutate({ handles: [{ handle: \"0xHandle1\", contractAddress: \"0x...\" }], delegatorAddress: \"0x...\" });\n * // decrypt.data => { \"0xHandle1\": 1000n }\n * ```\n */\nexport function useDelegatedUserDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<Record<Handle, ClearValueType>, Error, DelegatedUserDecryptMutationParams>(\n delegatedUserDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { InputProofBytesType, ZKProofLike } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { requestZKProofVerificationMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Submit a ZK proof for on-chain verification.\n * Returns the input proof bytes for use in contract calls.\n *\n * @returns A mutation whose `mutate` accepts a {@link ZKProofLike}.\n *\n * @example\n * ```tsx\n * const verify = useRequestZKProofVerification();\n * verify.mutate(zkProof);\n * // verify.data => Uint8Array (input proof bytes)\n * ```\n */\nexport function useRequestZKProofVerification() {\n const sdk = useZamaSDK();\n return useMutation<InputProofBytesType, Error, ZKProofLike>(\n requestZKProofVerificationMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { PublicKeyData } from \"@zama-fhe/sdk\";\nimport { useQuery } from \"../utils/query\";\nimport { publicKeyQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Fetch the FHE network public key from the relayer.\n * Cached indefinitely since the key does not change during a session.\n *\n * @returns Query result with `data: PublicKeyData | null`.\n *\n * @example\n * ```tsx\n * const { data: publicKey } = usePublicKey();\n * // publicKey?.publicKeyId, publicKey?.publicKey\n * ```\n */\nexport function usePublicKey() {\n const sdk = useZamaSDK();\n return useQuery<PublicKeyData | null>(publicKeyQueryOptions(sdk));\n}\n","\"use client\";\n\nimport type { PublicParamsData } from \"@zama-fhe/sdk\";\nimport { useQuery } from \"../utils/query\";\nimport { publicParamsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Fetch FHE public parameters for a given bit size from the relayer.\n * Cached indefinitely since parameters do not change during a session.\n *\n * @param bits - The FHE bit size to fetch parameters for (e.g. 2048).\n * @returns Query result with `data: PublicParamsData | null`.\n *\n * @example\n * ```tsx\n * const { data: params } = usePublicParams(2048);\n * // params?.publicParams, params?.publicParamsId\n * ```\n */\nexport function usePublicParams(bits: number) {\n const sdk = useZamaSDK();\n return useQuery<PublicParamsData | null>(publicParamsQueryOptions(sdk, bits));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { allowMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Sign an EIP-712 message authorizing decryption of confidential handles\n * for a list of contract addresses. This is not token-specific — any\n * contract that uses FHE-encrypted values (tokens, DeFi vaults, games, etc.)\n * can be authorized in a single wallet signature. Subsequent decrypt\n * operations on any of these contracts reuse cached credentials.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link KeypairExpiredError} — the re-encryption keypair has expired\n *\n * @example\n * ```tsx\n * const { mutateAsync: allow, isPending } = useAllow();\n *\n * // Authorize decryption for any contracts with encrypted state:\n * // confidential tokens, auction contracts, governance contracts, etc.\n * await allow([tokenAddress, auctionAddress, governanceAddress]);\n * ```\n */\nexport function useAllow(options?: UseMutationOptions<void, Error, Address[]>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[]>({\n ...allowMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"../utils/query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isAllowedQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/** Configuration for {@link useIsAllowed}. */\nexport interface UseIsAllowedConfig {\n /** Contract addresses to check credentials against (at least one required). */\n contractAddresses: [Address, ...Address[]];\n}\n\n/**\n * Check whether stored permits cover the given contract addresses for the\n * connected signer. Returns `true` if decrypt operations can proceed without\n * a wallet prompt.\n *\n * @returns Query result with `data: boolean` — `true` if a stored permit covers\n * every entry in `contractAddresses`. The query auto-disables when no signer is configured\n * (`data` stays `undefined`, `status` stays `\"pending\"`).\n * @throws {@link SignerNotConfiguredError} if the query runs without a signer configured\n * (the `enabled` guard normally prevents this; only reachable if the caller forces `query: { enabled: true }`).\n *\n * @example\n * ```tsx\n * const { data: allowed } = useIsAllowed({ contractAddresses: [\"0xToken\"] });\n * ```\n */\nexport function useIsAllowed(config: UseIsAllowedConfig) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n return useQuery<boolean>(isAllowedQueryOptions(sdk, config, { walletAccount }));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { revokePermitsMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Revoke FHE permits for the current signer.\n *\n * - Called with no arguments: every permit is removed across all chains and\n * delegators. The keypair survives — use {@link useClearCredentials} to also\n * wipe the keypair.\n * - Called with a contract list: only direct-decrypt permits on the current\n * chain whose payload touches a listed address are removed. Delegated\n * permits are not touched in this mode.\n *\n * @example\n * ```tsx\n * const { mutate: revokePermits } = useRevokePermits();\n * revokePermits([tokenAddress]); // direct-decrypt scope, current chain\n * revokePermits(); // every permit, all chains, all delegators\n * ```\n */\nexport function useRevokePermits(options?: UseMutationOptions<void, Error, Address[] | void>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[] | void>({\n ...revokePermitsMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n context.client.removeQueries({ queryKey: zamaQueryKeys.decryption.all });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { clearCredentialsMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Wipe the keypair for the current signer and cascade-delete every permit\n * (across chains and delegators) referencing it. Useful for \"log out\"\n * handlers that should leave no trace.\n *\n * @example\n * ```tsx\n * const { mutate: clearCredentials } = useClearCredentials();\n * clearCredentials();\n * ```\n */\nexport function useClearCredentials(options?: UseMutationOptions<void>) {\n const sdk = useZamaSDK();\n\n return useMutation<void>({\n ...clearCredentialsMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n context.client.removeQueries({ queryKey: zamaQueryKeys.decryption.all });\n },\n });\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { Address, Token } from \"@zama-fhe/sdk\";\nimport { useZamaSDK } from \"../provider\";\n\n/** Base configuration shared by all mutation hooks that need a Token instance. */\nexport interface UseZamaConfig {\n /** Address of the confidential token contract. */\n tokenAddress: Address;\n /** Address of the wrapper contract (required for shield/unshield operations). */\n wrapperAddress?: Address;\n}\n\n/**\n * Get a {@link Token} instance, memoized by address pair.\n *\n * @param config - Token and optional wrapper addresses.\n * @returns A memoized `Token` instance.\n *\n * @example\n * ```tsx\n * const token = useToken({ tokenAddress: \"0xToken\", wrapperAddress: \"0xWrapper\" });\n * ```\n */\nexport function useToken(config: UseZamaConfig): Token {\n const sdk = useZamaSDK();\n\n return useMemo<Token>(\n () => sdk.createToken(config.tokenAddress, config.wrapperAddress),\n [sdk, config.tokenAddress, config.wrapperAddress],\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Get a {@link ReadonlyToken} instance, memoized by address.\n * Supports balance queries, ERC-165 checks, and authorization — no wrapper needed.\n * Reads signer and storage from the nearest {@link ZamaProvider}.\n *\n * @param address - Address of the confidential token contract.\n * @returns A memoized `ReadonlyToken` instance.\n *\n * @example\n * ```tsx\n * const token = useReadonlyToken(\"0xToken\");\n * // token.balanceOf(), token.isConfidential(), etc.\n * ```\n */\nexport function useReadonlyToken(address: Address) {\n const sdk = useZamaSDK();\n\n return useMemo(() => sdk.createReadonlyToken(address), [sdk, address]);\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialBalanceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useReadonlyToken } from \"../token/use-readonly-token\";\nimport { useQuery } from \"../utils/query\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\nexport interface UseConfidentialBalanceConfig {\n /** Address of the confidential token contract. */\n tokenAddress: Address;\n /** Account to fetch balance for. The query is disabled while `undefined`. */\n account: Address | undefined;\n}\n\nexport interface UseConfidentialBalanceOptions extends Omit<\n UseQueryOptions<bigint>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> {\n /** Set this to `false` to disable this query from automatically running. */\n enabled?: boolean;\n}\n\n/**\n * Hook for fetching a confidential token balance. Reads the on-chain handle and\n * decrypts via the SDK; cached values are returned instantly and the relayer is\n * only hit when the handle changes.\n *\n * @example\n * ```tsx\n * const { data: balance } = useConfidentialBalance({\n * tokenAddress: \"0xToken\",\n * account: \"0xAccount\",\n * });\n * ```\n */\nexport function useConfidentialBalance(\n config: UseConfidentialBalanceConfig,\n options?: UseConfidentialBalanceOptions,\n) {\n const { tokenAddress, account } = config;\n const { enabled = true } = options ?? {};\n const token = useReadonlyToken(tokenAddress);\n const walletAccount = useWalletAccount(token.sdk);\n\n const baseOptions = confidentialBalanceQueryOptions(\n token,\n {\n tokenAddress,\n account,\n },\n { walletAccount },\n );\n\n return useQuery<bigint>({\n ...baseOptions,\n ...options,\n enabled: Boolean(baseOptions.enabled) && enabled,\n });\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address, BatchBalancesResult } from \"@zama-fhe/sdk\";\nimport { confidentialBalancesQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\nexport interface UseConfidentialBalancesConfig {\n /** Addresses of the confidential token contracts to batch-query. The query is disabled while empty. */\n tokenAddresses: Address[];\n /** Account to fetch balances for. The query is disabled while `undefined`. */\n account: Address | undefined;\n}\n\nexport interface UseConfidentialBalancesOptions extends Omit<\n UseQueryOptions<BatchBalancesResult>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> {\n /** Set this to `false` to disable this query from automatically running. */\n enabled?: boolean;\n}\n\n/**\n * Hook for fetching multiple confidential token balances in batch. Returns\n * partial results when some tokens fail — successful balances are available\n * alongside per-token error information.\n * @param config - Token addresses configuration.\n * @param options - React Query options forwarded to the balance query.\n * @returns The balance query result.\n *\n * @example\n * ```tsx\n * const { data } = useConfidentialBalances({\n * tokenAddresses: [\"0xTokenA\", \"0xTokenB\"],\n * account: \"0xAccount\",\n * });\n * const balance = data?.results.get(\"0xTokenA\");\n * if (data && data.errors.size > 0) {\n * // some tokens failed — check data.errors\n * }\n * ```\n */\nexport function useConfidentialBalances(\n config: UseConfidentialBalancesConfig,\n options?: UseConfidentialBalancesOptions,\n) {\n const { tokenAddresses, account } = config;\n const { enabled = true } = options ?? {};\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n\n const tokens = useMemo(\n () => tokenAddresses.map((addr) => sdk.createReadonlyToken(addr)),\n [sdk, tokenAddresses],\n );\n\n const baseOptions = confidentialBalancesQueryOptions(\n tokens,\n {\n account,\n },\n { walletAccount },\n );\n\n return useQuery<BatchBalancesResult>({\n ...baseOptions,\n ...options,\n enabled: Boolean(baseOptions.enabled) && enabled,\n });\n}\n","import type { QueryClient, QueryKey, UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport { invalidateAfterShield, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\n\ntype BalanceDeltaMode = \"add\" | \"subtract\";\nexport type OptimisticBalanceSnapshot = [QueryKey, bigint | undefined][];\n\n/** Combined context returned by optimistic `onMutate`. */\nexport interface OptimisticMutateContext {\n snapshot: OptimisticBalanceSnapshot;\n callerContext?: unknown;\n}\n\nexport function unwrapOptimisticCallerContext(\n optimistic: boolean | undefined,\n rawContext: unknown,\n): {\n wrappedContext: OptimisticMutateContext | undefined;\n callerContext: OptimisticMutateContext | undefined;\n} {\n const typed = rawContext as OptimisticMutateContext | undefined;\n const wrappedContext = optimistic ? typed : undefined;\n const callerContext = (optimistic ? wrappedContext?.callerContext : rawContext) as\n | OptimisticMutateContext\n | undefined;\n return { wrappedContext, callerContext };\n}\n\nexport async function applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress,\n amount,\n mode,\n}: {\n queryClient: QueryClient;\n tokenAddress: Address;\n amount: bigint;\n mode: BalanceDeltaMode;\n}): Promise<OptimisticBalanceSnapshot> {\n const balanceKey = zamaQueryKeys.confidentialBalance.token(tokenAddress);\n await queryClient.cancelQueries({ queryKey: balanceKey });\n const previous = queryClient.getQueriesData<bigint>({ queryKey: balanceKey });\n for (const [key, value] of previous) {\n if (value === undefined) {\n continue;\n }\n // Temporary optimistic underflow (`amount > value`) is acceptable because\n // settlement invalidates and rewrites this cache entry.\n queryClient.setQueryData(key, mode === \"add\" ? value + amount : value - amount);\n }\n return previous;\n}\n\nexport function rollbackOptimisticBalanceDelta(\n queryClient: QueryClient,\n snapshot: OptimisticBalanceSnapshot,\n) {\n for (const [key, value] of snapshot) {\n queryClient.setQueryData(key, value);\n }\n}\n\n/**\n * Build optimistic mutation callbacks for shield operations.\n * Wraps the caller's `onMutate`/`onError`/`onSuccess`/`onSettled` with snapshot/rollback logic\n * and returns overrides ready to spread into `useMutation`.\n */\nexport function optimisticBalanceCallbacks<TParams extends { amount: bigint }>({\n optimistic,\n tokenAddress,\n queryClient,\n options,\n}: {\n optimistic: boolean | undefined;\n tokenAddress: Address;\n queryClient: QueryClient;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: UseMutationOptions<TransactionResult, Error, TParams, any> | undefined;\n}): Pick<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UseMutationOptions<TransactionResult, Error, TParams, any>,\n \"onMutate\" | \"onError\" | \"onSuccess\" | \"onSettled\"\n> {\n return {\n onMutate: optimistic\n ? async (variables, mutationContext) => {\n const snapshot = await applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress,\n amount: variables.amount,\n mode: \"add\",\n });\n const callerContext = await options?.onMutate?.(variables, mutationContext);\n return { snapshot, callerContext };\n }\n : options?.onMutate,\n onError: (error, variables, rawContext, context) => {\n const { wrappedContext, callerContext } = unwrapOptimisticCallerContext(\n optimistic,\n rawContext,\n );\n try {\n if (wrappedContext) {\n rollbackOptimisticBalanceDelta(queryClient, wrappedContext.snapshot);\n }\n } finally {\n options?.onError?.(error, variables, callerContext, context);\n }\n },\n onSuccess: (data, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(optimistic, rawContext);\n options?.onSuccess?.(data, variables, callerContext, context);\n invalidateAfterShield(context.client, tokenAddress);\n },\n onSettled: (data, error, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(optimistic, rawContext);\n options?.onSettled?.(data, error, variables, callerContext, context);\n },\n };\n}\n","\"use client\";\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type { TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialTransferMutationOptions,\n invalidateAfterTransfer,\n type ConfidentialTransferParams,\n} from \"@zama-fhe/sdk/query\";\nimport {\n applyOptimisticBalanceDelta,\n rollbackOptimisticBalanceDelta,\n unwrapOptimisticCallerContext,\n} from \"../balance/optimistic-balance-update\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/** Configuration for {@link useConfidentialTransfer}. */\nexport interface UseConfidentialTransferConfig extends UseZamaConfig {\n /**\n * When `true`, optimistically subtracts the transfer amount from cached balance\n * before the transaction confirms. Rolls back on error.\n * @defaultValue false\n */\n optimistic?: boolean;\n}\n\n/**\n * Encrypt and send a confidential transfer. Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * Set `optimistic: true` to subtract the amount from the cached balance immediately.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const transfer = useConfidentialTransfer({\n * tokenAddress: \"0x...\",\n * optimistic: true,\n * });\n * transfer.mutate(\n * { to: \"0xRecipient\", amount: 1000n },\n * {\n * onError: (error) => {\n * if (error instanceof SigningRejectedError) {\n * // user cancelled — no action needed\n * }\n * },\n * },\n * );\n * ```\n */\nexport function useConfidentialTransfer<TContext = unknown>(\n config: UseConfidentialTransferConfig,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferParams, TContext>,\n): UseMutationResult<TransactionResult, Error, ConfidentialTransferParams, TContext> {\n const token = useToken(config);\n const queryClient = useQueryClient();\n\n // Internal mutation uses `any` for TContext because optimistic mode wraps\n // the caller's context in OptimisticMutateContext; the public return type\n // is cast back to the caller's TContext.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return useMutation<TransactionResult, Error, ConfidentialTransferParams, any>({\n ...confidentialTransferMutationOptions(token),\n ...options,\n onMutate: config.optimistic\n ? async (variables, mutationContext) => {\n const snapshot = await applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress: token.address,\n amount: variables.amount,\n mode: \"subtract\",\n });\n const callerContext = await options?.onMutate?.(variables, mutationContext);\n return { snapshot, callerContext };\n }\n : options?.onMutate,\n onError: (error, variables, rawContext, context) => {\n const { wrappedContext, callerContext } = unwrapOptimisticCallerContext(\n config.optimistic,\n rawContext,\n );\n try {\n if (wrappedContext) {\n rollbackOptimisticBalanceDelta(queryClient, wrappedContext.snapshot);\n }\n } finally {\n options?.onError?.(error, variables, callerContext as TContext, context);\n }\n },\n onSuccess: (data, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(config.optimistic, rawContext);\n options?.onSuccess?.(data, variables, callerContext as TContext, context);\n invalidateAfterTransfer(context.client, token.address);\n },\n onSettled: (data, error, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(config.optimistic, rawContext);\n options?.onSettled?.(data, error, variables, callerContext as TContext, context);\n },\n }) as UseMutationResult<TransactionResult, Error, ConfidentialTransferParams, TContext>;\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialTransferFromMutationOptions,\n invalidateAfterTransfer,\n type ConfidentialTransferFromParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Operator transfer on behalf of another address. Caller must be an approved operator.\n * Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption of the transfer amount failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const transferFrom = useConfidentialTransferFrom({ tokenAddress: \"0x...\" });\n * transferFrom.mutate({ from: \"0xOwner\", to: \"0xRecipient\", amount: 500n });\n * ```\n */\nexport function useConfidentialTransferFrom(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferFromParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, ConfidentialTransferFromParams, Address>({\n ...confidentialTransferFromMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterTransfer(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialSetOperatorMutationOptions,\n invalidateAfterSetOperator,\n type ConfidentialSetOperatorParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Set operator approval for a confidential token. Defaults to 1 hour.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const setOperator = useConfidentialSetOperator({ tokenAddress: \"0x...\" });\n * setOperator.mutate({ operator: \"0xOperator\" });\n * ```\n */\nexport function useConfidentialSetOperator(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialSetOperatorParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, ConfidentialSetOperatorParams, Address>({\n ...confidentialSetOperatorMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterSetOperator(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialIsOperatorQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport interface UseConfidentialIsOperatorConfig {\n /** Address of the confidential token contract. The query is disabled while `undefined`. */\n tokenAddress: Address | undefined;\n /** Address to check operator status for. The query is disabled while `undefined`. */\n spender: Address | undefined;\n /** Token holder address. The query is disabled while `undefined`. */\n holder: Address | undefined;\n}\n\nexport interface UseConfidentialIsOperatorSuspenseConfig {\n /** Address of the confidential token contract. */\n tokenAddress: Address;\n /** Address to check operator status for. */\n spender: Address;\n /** Token holder address. */\n holder: Address;\n}\n\n/**\n * Check if a spender is an approved operator for a holder.\n * @param config - Token address, spender, and optional holder to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isOperator } = useConfidentialIsOperator({\n * tokenAddress: \"0xToken\",\n * spender: \"0xSpender\",\n * holder: \"0xHolder\",\n * });\n * ```\n */\nexport function useConfidentialIsOperator(\n config: UseConfidentialIsOperatorConfig,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const { tokenAddress, spender, holder } = config;\n const sdk = useZamaSDK();\n const baseOpts = confidentialIsOperatorQueryOptions(sdk, tokenAddress, {\n holder,\n spender,\n });\n\n return useQuery({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useConfidentialIsOperator}. Suspends rendering\n * until the operator check resolves.\n *\n * @example\n * ```tsx\n * const { data: isOperator } = useConfidentialIsOperatorSuspense({\n * tokenAddress: \"0xToken\",\n * spender: \"0xSpender\",\n * holder: \"0xHolder\",\n * });\n * ```\n */\nexport function useConfidentialIsOperatorSuspense(config: UseConfidentialIsOperatorSuspenseConfig) {\n const { spender, holder, tokenAddress } = config;\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(\n confidentialIsOperatorQueryOptions(sdk, tokenAddress, {\n holder,\n spender,\n }),\n );\n}\n","\"use client\";\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type { TransactionResult } from \"@zama-fhe/sdk\";\nimport { shieldMutationOptions, type ShieldParams } from \"@zama-fhe/sdk/query\";\nimport { optimisticBalanceCallbacks } from \"../balance/optimistic-balance-update\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/** Configuration for {@link useShield}. */\nexport interface UseShieldConfig extends UseZamaConfig {\n /**\n * When `true`, optimistically adds the wrap amount to the cached confidential balance\n * before the transaction confirms. Rolls back on error.\n * @defaultValue false\n */\n optimistic?: boolean;\n}\n\n/**\n * Shield public ERC-20 tokens into confidential tokens.\n * Handles ERC-20 approval automatically. Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link ApprovalFailedError} — ERC-20 approval transaction failed\n * - {@link TransactionRevertedError} — shield transaction reverted\n *\n * @param config - Token and wrapper addresses.\n * Set `optimistic: true` to add the amount to the cached balance immediately.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const shield = useShield({ tokenAddress: \"0x...\", wrapperAddress: \"0x...\", optimistic: true });\n * shield.mutate({ amount: 1000n });\n * ```\n */\nexport function useShield<TContext = unknown>(\n config: UseShieldConfig,\n options?: UseMutationOptions<TransactionResult, Error, ShieldParams, TContext>,\n): UseMutationResult<TransactionResult, Error, ShieldParams, TContext> {\n const token = useToken(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n ...shieldMutationOptions(token),\n ...options,\n ...optimisticBalanceCallbacks({\n optimistic: config.optimistic,\n tokenAddress: token.address,\n queryClient,\n options,\n }),\n }) as UseMutationResult<TransactionResult, Error, ShieldParams, TContext>;\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnwrap,\n type UnwrapParams,\n unwrapMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Request an unwrap for a specific amount. Encrypts the amount first.\n * Call {@link useFinalizeUnwrap} after the request is processed on-chain,\n * or use {@link useUnshield} for a single-call orchestration.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption of the unwrap amount failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unwrap = useUnwrap({ tokenAddress: \"0x...\" });\n * unwrap.mutate({ amount: 500n });\n * ```\n */\nexport function useUnwrap(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, UnwrapParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, UnwrapParams, Address>({\n ...unwrapMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnwrap(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport { invalidateAfterUnwrap, unwrapAllMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Request an unwrap for the entire confidential balance.\n * Uses the on-chain balance handle directly (no encryption needed).\n * Call {@link useFinalizeUnwrap} after processing, or use {@link useUnshieldAll} for single-call orchestration.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unwrapAll = useUnwrapAll({ tokenAddress: \"0x...\" });\n * unwrapAll.mutate();\n * ```\n */\nexport function useUnwrapAll(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, void, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, void, Address>({\n ...unwrapAllMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnwrap(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n finalizeUnwrapMutationOptions,\n invalidateAfterUnshield,\n type FinalizeUnwrapParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Complete an unwrap by providing the public decryption proof.\n * Call this after an unwrap request has been processed on-chain.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link DecryptionFailedError} — public decryption of the burn amount failed\n * - {@link TransactionRevertedError} — on-chain finalize transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const finalize = useFinalizeUnwrap({ tokenAddress: \"0x...\" });\n * const event = findUnwrapRequested(receipt.logs);\n * // Pass unwrapRequestId from upgraded events, or fall back to encryptedAmount for legacy ones.\n * finalize.mutate(\n * event.unwrapRequestId\n * ? { unwrapRequestId: event.unwrapRequestId }\n * : { burnAmountHandle: event.encryptedAmount },\n * );\n * ```\n */\nexport function useFinalizeUnwrap(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, FinalizeUnwrapParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, FinalizeUnwrapParams, Address>({\n ...finalizeUnwrapMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type UnshieldParams,\n unshieldMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Unshield a specific amount and finalize in one call.\n * Orchestrates: unwrap → wait for receipt → parse event → finalize.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption failed during unwrap\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token and wrapper addresses.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unshield = useUnshield({ tokenAddress: \"0x...\", wrapperAddress: \"0x...\" });\n * unshield.mutate({ amount: 500n });\n * ```\n */\nexport function useUnshield(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, UnshieldParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, UnshieldParams, Address>({\n ...unshieldMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type UnshieldAllParams,\n unshieldAllMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Unshield the entire balance and finalize in one call.\n * Orchestrates: unwrapAll → wait for receipt → parse event → finalize.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token and wrapper addresses.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unshieldAll = useUnshieldAll({ tokenAddress: \"0x...\", wrapperAddress: \"0x...\" });\n * unshieldAll.mutate();\n * ```\n */\nexport function useUnshieldAll(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, UnshieldAllParams | void, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, UnshieldAllParams | void, Address>({\n ...unshieldAllMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type ResumeUnshieldParams,\n resumeUnshieldMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Resume an interrupted unshield from an existing unwrap tx hash.\n * Useful when the user submitted the unwrap but the finalize step was\n * interrupted (e.g. page reload, network error).\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token and wrapper addresses.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const resumeUnshield = useResumeUnshield({ tokenAddress: \"0x...\", wrapperAddress: \"0x...\" });\n * resumeUnshield.mutate({ unwrapTxHash: \"0xabc...\" });\n * ```\n */\nexport function useResumeUnshield(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, ResumeUnshieldParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, ResumeUnshieldParams, Address>({\n ...resumeUnshieldMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { underlyingAllowanceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { underlyingAllowanceQueryOptions };\n\nexport interface UseUnderlyingAllowanceConfig {\n /** Address of the confidential token contract used to scope the query cache. */\n tokenAddress: Address;\n /** Address of the wrapper contract whose underlying ERC-20 allowance is checked. */\n wrapperAddress: Address;\n /** Owner to fetch allowance for. The query is disabled while `undefined`. */\n owner: Address | undefined;\n}\n\nexport interface UseUnderlyingAllowanceSuspenseConfig {\n /** Address of the confidential token contract used to scope the query cache. */\n tokenAddress: Address;\n /** Address of the wrapper contract whose underlying ERC-20 allowance is checked. */\n wrapperAddress: Address;\n /** Owner to fetch allowance for. */\n owner: Address;\n}\n\n/**\n * Hook for fetching the underlying ERC-20 allowance granted to the wrapper\n * contract. Useful to check if an approval is needed before shielding.\n *\n * @example\n * ```tsx\n * const { data: allowance } = useUnderlyingAllowance({\n * tokenAddress: \"0xConfidentialToken\",\n * wrapperAddress: \"0xWrapper\",\n * owner: \"0xOwner\",\n * });\n * ```\n */\nexport function useUnderlyingAllowance(\n config: UseUnderlyingAllowanceConfig,\n options?: Omit<UseQueryOptions<bigint>, \"queryKey\" | \"queryFn\">,\n) {\n const { tokenAddress, wrapperAddress, owner } = config;\n const sdk = useZamaSDK();\n\n const baseOpts = underlyingAllowanceQueryOptions(sdk, tokenAddress, {\n owner,\n wrapperAddress,\n });\n\n return useQuery<bigint>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useUnderlyingAllowance}. Suspends rendering until\n * the allowance resolves.\n *\n * @example\n * ```tsx\n * const { data: allowance } = useUnderlyingAllowanceSuspense({\n * tokenAddress: \"0xConfidentialToken\",\n * wrapperAddress: \"0xWrapper\",\n * owner: \"0xOwner\",\n * });\n * ```\n */\nexport function useUnderlyingAllowanceSuspense(config: UseUnderlyingAllowanceSuspenseConfig) {\n const { tokenAddress, wrapperAddress, owner } = config;\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<bigint>(\n underlyingAllowanceQueryOptions(sdk, tokenAddress, {\n owner,\n wrapperAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\n\n/**\n * Resolves the wrappers registry address for the current chain.\n * Uses the registry addresses from `sdk.registry` (built-in defaults from chain configs).\n *\n * Returns `undefined` when the chain ID hasn't been fetched yet\n * or when no registry is configured for the connected chain.\n *\n * The chain ID is cached for 30 seconds (`staleTime`), so chain\n * switches may take up to 30s to reflect.\n */\nexport function useWrappersRegistryAddress(): Address | undefined {\n const sdk = useZamaSDK();\n\n const { data: chainId } = useQuery<number>({\n queryKey: zamaQueryKeys.wrappersRegistry.chainId(),\n queryFn: () => sdk.provider.getChainId(),\n staleTime: 30_000,\n });\n\n return chainId !== undefined ? sdk.registry.getAddress(chainId) : undefined;\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { wrapperDiscoveryQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"../wrappers-registry/use-wrappers-registry-address\";\n\nexport { wrapperDiscoveryQueryOptions };\n\n/** Configuration for {@link useWrapperDiscovery}. */\nexport interface UseWrapperDiscoveryConfig {\n /**\n * Address of any confidential token you control.\n * Used only to derive the signer context and to scope the query cache key —\n * it does not affect which wrapper the registry returns.\n */\n tokenAddress: Address;\n /** ERC-20 address to discover the wrapper for. Pass `undefined` to disable the query. */\n erc20Address: Address | undefined;\n}\n\n/** Configuration for {@link useWrapperDiscoverySuspense}. */\nexport interface UseWrapperDiscoverySuspenseConfig {\n /**\n * Address of any confidential token you control.\n * Used only to derive the signer context and to scope the query cache key —\n * it does not affect which wrapper the registry returns.\n */\n tokenAddress: Address;\n /** ERC-20 address to discover the wrapper for. */\n erc20Address: Address;\n}\n\n/**\n * Discover the confidential wrapper for an ERC-20 token via the on-chain registry.\n * Returns the wrapper address if one exists, or `null` if not.\n * Cached indefinitely since wrapper mappings are immutable.\n *\n * @param config - Token and ERC-20 addresses.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: Address | null`.\n *\n * @example\n * ```tsx\n * const { data: wrapperAddress } = useWrapperDiscovery({\n * tokenAddress: \"0xConfidentialToken\",\n * erc20Address: \"0xUSDC\",\n * });\n * ```\n */\nexport function useWrapperDiscovery(\n config: UseWrapperDiscoveryConfig,\n options?: Omit<UseQueryOptions<Address | null>, \"queryKey\" | \"queryFn\">,\n) {\n const { tokenAddress, erc20Address } = config;\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n const baseOpts = wrapperDiscoveryQueryOptions(sdk.registry, {\n tokenAddress,\n erc20Address,\n registryAddress,\n });\n\n return useQuery<Address | null>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useWrapperDiscovery}.\n * Suspends rendering until the wrapper address is resolved.\n *\n * @param config - Token and ERC-20 addresses.\n * @returns Suspense query result with `data: Address | null`.\n *\n * @example\n * ```tsx\n * const { data: wrapperAddress } = useWrapperDiscoverySuspense({\n * tokenAddress: \"0xConfidentialToken\",\n * erc20Address: \"0xUSDC\",\n * });\n * ```\n */\nexport function useWrapperDiscoverySuspense(config: UseWrapperDiscoverySuspenseConfig) {\n const { tokenAddress, erc20Address } = config;\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useSuspenseQuery<Address | null>(\n wrapperDiscoveryQueryOptions(sdk.registry, {\n tokenAddress,\n erc20Address,\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { tokenMetadataQueryOptions, type TokenMetadata } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\n\n/**\n * Read ERC-20 token metadata (name, symbol, decimals).\n * Fetches all three in parallel. Cached indefinitely since metadata is immutable.\n *\n * @param tokenAddress - Address of the token contract.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: TokenMetadata`.\n *\n * @example\n * ```tsx\n * const { data: metadata } = useMetadata(\"0xToken\");\n * // metadata?.name, metadata?.symbol, metadata?.decimals\n * ```\n */\nexport function useMetadata(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<TokenMetadata>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n return useQuery<TokenMetadata>({\n ...tokenMetadataQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useMetadata}.\n * Suspends rendering until metadata is loaded.\n *\n * @param tokenAddress - Address of the token contract.\n * @returns Suspense query result with `data: TokenMetadata`.\n *\n * @example\n * ```tsx\n * const { data: metadata } = useMetadataSuspense(\"0xToken\");\n * ```\n */\nexport function useMetadataSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n return useSuspenseQuery<TokenMetadata>(tokenMetadataQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n delegateDecryptionMutationOptions,\n zamaQueryKeys,\n type DelegateDecryptionParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Delegate FHE decryption rights for a token to another address via the on-chain ACL.\n *\n * @param config - Token address identifying the confidential token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const delegate = useDelegateDecryption({ tokenAddress: \"0x...\" });\n * delegate.mutate({ delegateAddress: \"0xDelegate\" });\n * ```\n */\nexport function useDelegateDecryption(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, DelegateDecryptionParams>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, DelegateDecryptionParams>({\n ...delegateDecryptionMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n try {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n } finally {\n void context.client.invalidateQueries({ queryKey: zamaQueryKeys.delegationStatus.all });\n }\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n revokeDelegationMutationOptions,\n zamaQueryKeys,\n type RevokeDelegationParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Revoke FHE decryption delegation for a token from a delegate address.\n *\n * @param config - Token address identifying the confidential token.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const revoke = useRevokeDelegation({ tokenAddress: \"0x...\" });\n * revoke.mutate({ delegateAddress: \"0xDelegate\" });\n * ```\n */\nexport function useRevokeDelegation(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, RevokeDelegationParams>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, RevokeDelegationParams>({\n ...revokeDelegationMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n try {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n } finally {\n void context.client.invalidateQueries({ queryKey: zamaQueryKeys.delegationStatus.all });\n }\n },\n });\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { delegationStatusQueryOptions, type DelegationStatusData } from \"@zama-fhe/sdk/query\";\nimport { useQuery } from \"../utils/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport interface UseDelegationStatusConfig {\n /** Address of the confidential token contract. Pass `undefined` to disable the query. */\n tokenAddress: Address | undefined;\n /** The address that granted the delegation. */\n delegatorAddress?: Address;\n /** The address that received delegation rights. */\n delegateAddress?: Address;\n}\n\n/**\n * Query delegation status between a delegator and delegate for a token.\n *\n * @param config - Token address, delegator, and delegate addresses.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns `{ isDelegated, expiryTimestamp, isLoading, error }`.\n *\n * @example\n * ```tsx\n * const { data } = useDelegationStatus({\n * tokenAddress: \"0xToken\",\n * delegatorAddress: \"0xDelegator\",\n * delegateAddress: \"0xDelegate\",\n * });\n * // data?.isDelegated, data?.expiryTimestamp\n * ```\n */\nexport function useDelegationStatus(\n config: UseDelegationStatusConfig,\n options?: Omit<UseQueryOptions<DelegationStatusData>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const baseOpts = delegationStatusQueryOptions(sdk, config);\n\n return useQuery<DelegationStatusData>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { decryptBalanceAsMutationOptions, type DecryptBalanceAsParams } from \"@zama-fhe/sdk/query\";\nimport { useReadonlyToken } from \"../token/use-readonly-token\";\n\n/**\n * Decrypt another user's confidential balance as a delegate.\n *\n * @param tokenAddress - Address of the confidential token contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const decryptAs = useDecryptBalanceAs(\"0xToken\");\n * decryptAs.mutate({ delegatorAddress: \"0xDelegator\" });\n * // decryptAs.data => 1000n\n * ```\n */\nexport function useDecryptBalanceAs(\n tokenAddress: Address,\n options?: UseMutationOptions<bigint, Error, DecryptBalanceAsParams>,\n) {\n const readonlyToken = useReadonlyToken(tokenAddress);\n\n return useMutation<bigint, Error, DecryptBalanceAsParams>({\n ...decryptBalanceAsMutationOptions(readonlyToken),\n ...options,\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, ReadonlyToken } from \"@zama-fhe/sdk\";\nimport {\n batchDecryptBalancesAsMutationOptions,\n type BatchDecryptBalancesAsParams,\n} from \"@zama-fhe/sdk/query\";\n\n/**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n *\n * @param tokens - ReadonlyToken instances to decrypt balances for.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const batchDecryptAs = useBatchDecryptBalancesAs(tokens);\n * batchDecryptAs.mutate({\n * delegatorAddress: \"0xDelegator\",\n * });\n * // batchDecryptAs.data => Map { \"0xTokenA\" => 100n, \"0xTokenB\" => 200n }\n * ```\n */\nexport function useBatchDecryptBalancesAs(\n tokens: ReadonlyToken[],\n options?: UseMutationOptions<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>,\n) {\n return useMutation<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>({\n ...batchDecryptBalancesAsMutationOptions(tokens),\n ...options,\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n approveUnderlyingMutationOptions,\n invalidateAfterApproveUnderlying,\n type ApproveUnderlyingParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken, type UseZamaConfig } from \"../token/use-token\";\n\n/**\n * Approve the wrapper contract to spend the underlying ERC-20.\n * Defaults to max uint256. Resets to zero first if there's an existing\n * non-zero allowance (required by tokens like USDT).\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — approval transaction reverted\n *\n * @param config - Token and wrapper addresses.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const approve = useApproveUnderlying({ tokenAddress: \"0x...\", wrapperAddress: \"0x...\" });\n * approve.mutate({}); // max approval\n * approve.mutate({ amount: 1000n }); // exact amount\n * ```\n */\nexport function useApproveUnderlying(\n config: UseZamaConfig,\n options?: UseMutationOptions<TransactionResult, Error, ApproveUnderlyingParams, Address>,\n) {\n const token = useToken(config);\n\n return useMutation<TransactionResult, Error, ApproveUnderlyingParams, Address>({\n ...approveUnderlyingMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterApproveUnderlying(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isConfidentialQueryOptions, isWrapperQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { isConfidentialQueryOptions, isWrapperQueryOptions };\n\n/**\n * Check if a token supports the ERC-7984 confidential interface via ERC-165.\n * Result is cached indefinitely since interface support does not change.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isConfidential } = useIsConfidential(\"0xToken\");\n * ```\n */\nexport function useIsConfidential(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<boolean>({\n ...isConfidentialQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useIsConfidential}.\n * Suspends rendering until the ERC-165 check resolves.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @returns Suspense query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isConfidential } = useIsConfidentialSuspense(\"0xToken\");\n * ```\n */\nexport function useIsConfidentialSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(isConfidentialQueryOptions(sdk, tokenAddress));\n}\n\n/**\n * Check if a token supports the ERC-7984 wrapper interface via ERC-165.\n * Result is cached indefinitely since interface support does not change.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isWrapper } = useIsWrapper(\"0xToken\");\n * ```\n */\nexport function useIsWrapper(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<boolean>({\n ...isWrapperQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useIsWrapper}.\n * Suspends rendering until the ERC-165 check resolves.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @returns Suspense query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isWrapper } = useIsWrapperSuspense(\"0xToken\");\n * ```\n */\nexport function useIsWrapperSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(isWrapperQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { totalSupplyQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { totalSupplyQueryOptions };\n\n/**\n * Read the total supply of a token.\n * Stale after 30 seconds to balance freshness and RPC cost.\n *\n * @param tokenAddress - Address of the token contract.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: bigint`.\n * Uses ERC-165 to call `inferredTotalSupply()` on upgraded wrappers and\n * legacy `totalSupply()` on pre-upgrade wrappers.\n *\n * @example\n * ```tsx\n * const { data: totalSupply } = useTotalSupply(\"0xToken\");\n * ```\n */\nexport function useTotalSupply(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<bigint>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<bigint>({\n ...totalSupplyQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useTotalSupply}.\n * Suspends rendering until the total supply is loaded.\n *\n * @param tokenAddress - Address of the token contract.\n * @returns Suspense query result with `data: bigint`.\n * Uses ERC-165 to call `inferredTotalSupply()` on upgraded wrappers and\n * legacy `totalSupply()` on pre-upgrade wrappers.\n *\n * @example\n * ```tsx\n * const { data: totalSupply } = useTotalSupplySuspense(\"0xToken\");\n * ```\n */\nexport function useTotalSupplySuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<bigint>(totalSupplyQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches all token wrapper pairs from the ConfidentialTokenWrappersRegistry\n * contract on the current chain.\n */\nexport function useTokenPairsRegistry() {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly TokenWrapperPair[]>(\n tokenPairsQueryOptions(sdk, {\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport { tokenPairsLengthQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Returns the total number of token wrapper pairs in the registry.\n */\nexport function useTokenPairsLength() {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<bigint>(\n tokenPairsLengthQueryOptions(sdk, {\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairsSliceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches a range of token wrapper pairs from the registry (paginated).\n *\n * @param fromIndex - Start index (inclusive). Pass `undefined` to disable.\n * @param toIndex - End index (exclusive). Pass `undefined` to disable.\n */\nexport function useTokenPairsSlice({\n fromIndex,\n toIndex,\n}: {\n fromIndex: bigint | undefined;\n toIndex: bigint | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly TokenWrapperPair[]>(\n tokenPairsSliceQueryOptions(sdk, {\n registryAddress,\n fromIndex,\n toIndex,\n }),\n );\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches a single token wrapper pair by index from the registry.\n *\n * @param index - Zero-based pair index. Pass `undefined` to disable.\n */\nexport function useTokenPair({ index }: { index: bigint | undefined }) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<TokenWrapperPair>(\n tokenPairQueryOptions(sdk, {\n registryAddress,\n index,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialTokenAddressQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Looks up the confidential token address for a given plain token address.\n */\nexport function useConfidentialTokenAddress({\n tokenAddress,\n}: {\n tokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly [boolean, Address]>(\n confidentialTokenAddressQueryOptions(sdk, {\n registryAddress,\n tokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { tokenAddressQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Looks up the plain token address for a given confidential token address.\n */\nexport function useTokenAddress({\n confidentialTokenAddress,\n}: {\n confidentialTokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly [boolean, Address]>(\n tokenAddressQueryOptions(sdk, {\n registryAddress,\n confidentialTokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isConfidentialTokenValidQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Checks whether a confidential token is registered and valid in the\n * on-chain wrappers registry.\n *\n * @param confidentialTokenAddress - The confidential token to check. Pass `undefined` to disable.\n */\nexport function useIsConfidentialTokenValid({\n confidentialTokenAddress,\n}: {\n confidentialTokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<boolean>(\n isConfidentialTokenValidQueryOptions(sdk, {\n registryAddress,\n confidentialTokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type {\n TokenWrapperPair,\n TokenWrapperPairWithMetadata,\n PaginatedResult,\n} from \"@zama-fhe/sdk\";\nimport { listPairsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches paginated token wrapper pairs from the registry.\n *\n * @param options - Query options: `page` (1-indexed, default `1`), `pageSize` (default `100`), `metadata` (fetch on-chain metadata for both tokens, default `false`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useListPairs({ page: 1, pageSize: 20 });\n * if (data) {\n * console.log(`${data.total} pairs, showing page ${data.page}`);\n * }\n * ```\n */\nexport function useListPairs({\n page = 1,\n pageSize = 100,\n metadata = false,\n}: {\n page?: number;\n pageSize?: number;\n metadata?: boolean;\n} = {}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n // Pass sdk.registry (a lazy singleton) so the class-level TTL cache is shared\n // across all queryFn executions — rather than constructing a new instance each time.\n return useQuery<PaginatedResult<TokenWrapperPair | TokenWrapperPairWithMetadata>>(\n listPairsQueryOptions(sdk.registry, {\n registryAddress,\n page,\n pageSize,\n metadata,\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["useQuery","tanstack_useQuery","useSuspenseQuery","tanstack_useSuspenseQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","typed","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useSuspenseQuery","useQuery","useSuspenseQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery"],"sources":["../src/provider.tsx","../src/relayer/use-encrypt.ts","../src/utils/query.ts","../src/utils/wallet-account.ts","../src/relayer/use-user-decrypt.ts","../src/relayer/use-public-decrypt.ts","../src/relayer/use-generate-keypair.ts","../src/relayer/use-create-eip712.ts","../src/relayer/use-create-delegated-user-decrypt-eip712.ts","../src/relayer/use-delegated-user-decrypt.ts","../src/relayer/use-request-zk-proof-verification.ts","../src/relayer/use-public-key.ts","../src/relayer/use-public-params.ts","../src/authorization/use-allow.ts","../src/authorization/use-is-allowed.ts","../src/authorization/use-revoke-permits.ts","../src/authorization/use-clear-credentials.ts","../src/token/use-token.ts","../src/token/use-wrapped-token.ts","../src/balance/use-confidential-balance.ts","../src/balance/use-confidential-balances.ts","../src/balance/optimistic-balance-update.ts","../src/transfer/use-confidential-transfer.ts","../src/transfer/use-confidential-transfer-from.ts","../src/operator/use-confidential-set-operator.ts","../src/operator/use-confidential-is-operator.ts","../src/shield/use-shield.ts","../src/unwrap/use-unwrap.ts","../src/unwrap/use-unwrap-all.ts","../src/unwrap/use-finalize-unwrap.ts","../src/unshield/use-unshield.ts","../src/unshield/use-unshield-all.ts","../src/unshield/use-resume-unshield.ts","../src/shield/use-underlying-allowance.ts","../src/wrappers-registry/use-wrappers-registry-address.ts","../src/token/use-wrapper-discovery.ts","../src/token/use-metadata.ts","../src/delegation/use-delegate-decryption.ts","../src/delegation/use-revoke-delegation.ts","../src/delegation/use-delegation-status.ts","../src/delegation/use-decrypt-balance-as.ts","../src/delegation/use-batch-decrypt-balances-as.ts","../src/shield/use-approve-underlying.ts","../src/token/use-is-confidential.ts","../src/token/use-total-supply.ts","../src/wrappers-registry/use-token-pairs-registry.ts","../src/wrappers-registry/use-token-pairs-length.ts","../src/wrappers-registry/use-token-pairs-slice.ts","../src/wrappers-registry/use-token-pair.ts","../src/wrappers-registry/use-confidential-token-address.ts","../src/wrappers-registry/use-token-address.ts","../src/wrappers-registry/use-is-confidential-token-valid.ts","../src/wrappers-registry/use-list-pairs.ts"],"sourcesContent":["\"use client\";\n\nimport type { ZamaConfig } from \"@zama-fhe/sdk\";\nimport { ZamaSDK } from \"@zama-fhe/sdk\";\nimport { invalidateWalletLifecycleQueries } from \"@zama-fhe/sdk/query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n createContext,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\n/** Props for {@link ZamaProvider}. */\nexport interface ZamaProviderProps extends PropsWithChildren {\n /** Configuration object created by {@link createConfig}. */\n config: ZamaConfig;\n}\n\nconst ZamaSDKContext = createContext<ZamaSDK | null>(null);\n\n/**\n * Provides a {@link ZamaSDK} instance to all descendant hooks.\n *\n * @example\n * ```tsx\n * <ZamaProvider config={zamaConfig}>\n * <App />\n * </ZamaProvider>\n * ```\n */\nexport function ZamaProvider({ children, config }: ZamaProviderProps) {\n const queryClient = useQueryClient();\n\n // Stabilize onEvent so an inline arrow doesn't recreate the SDK every render.\n const onEventRef = useRef(config.onEvent);\n\n useEffect(() => {\n onEventRef.current = config.onEvent;\n });\n\n const sdk = useMemo(() => new ZamaSDK({ ...config, onEvent: onEventRef.current }), [config]);\n\n // SDK internally does credential/cache cleanup. React layer clears the\n // wallet-lifecycle query state.\n useEffect(\n () =>\n sdk.onWalletAccountChange(({ previous }) => {\n if (previous) {\n invalidateWalletLifecycleQueries(queryClient);\n }\n }),\n [sdk, queryClient],\n );\n\n // Clean up SDK-owned signer subscriptions on unmount without terminating\n // the caller-owned relayer. dispose() is idempotent.\n useEffect(() => () => sdk.dispose(), [sdk]);\n\n return <ZamaSDKContext.Provider value={sdk}>{children}</ZamaSDKContext.Provider>;\n}\n\n/**\n * Access the {@link ZamaSDK} instance from context.\n * Throws if called outside a {@link ZamaProvider}.\n *\n * @example\n * ```tsx\n * const sdk = useZamaSDK();\n * const token = sdk.createToken(\"0x...\", \"0x...\");\n * ```\n */\nexport function useZamaSDK(): ZamaSDK {\n const context = useContext(ZamaSDKContext);\n\n if (!context) {\n throw new Error(\n \"useZamaSDK must be used within a <ZamaProvider>. \" +\n \"Wrap your component tree in <ZamaProvider config={createConfig(...)}>.\",\n );\n }\n return context;\n}\n","\"use client\";\n\nimport type { EncryptParams, EncryptResult } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { encryptMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Encrypt a plaintext value using FHE.\n * Calls the relayer's `encrypt` method via a mutation.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link EncryptionFailedError} — FHE encryption failed\n *\n * @returns A mutation whose `mutate` accepts {@link EncryptParams}.\n *\n * @example\n * ```tsx\n * const encrypt = useEncrypt();\n * encrypt.mutate({ values: [{ value: 1000n, type: \"euint64\" }], contractAddress: \"0x...\", userAddress: \"0x...\" });\n * ```\n */\nexport function useEncrypt() {\n const sdk = useZamaSDK();\n return useMutation<EncryptResult, Error, EncryptParams>(encryptMutationOptions(sdk));\n}\n","import {\n type DefaultError,\n type QueriesOptions,\n type QueriesResults,\n useQueries as tanstack_useQueries,\n useQuery as tanstack_useQuery,\n useSuspenseQuery as tanstack_useSuspenseQuery,\n type UseQueryOptions,\n type UseQueryResult,\n type UseSuspenseQueryOptions,\n type UseSuspenseQueryResult,\n} from \"@tanstack/react-query\";\nimport { hashFn } from \"@zama-fhe/sdk/query\";\n\n/**\n * Thin wrapper around TanStack's useQuery that injects our custom queryKeyHashFn.\n * Mirrors the wagmi pattern — the type safety boundary is at the factory and hook levels.\n *\n * Callers typically specify only `<TData>` (e.g. `useQuery<PublicKeyData>(...)`) while\n * factory options carry specific tuple keys (e.g. `readonly [\"zama.publicKey\"]`).\n * We erase the QueryKey param via `AnyKeyQueryOptions` so callers don't need to\n * spell out the key type — any QueryKey subtype is accepted.\n */\ntype AnyKeyQueryOptions<TData, TError> = UseQueryOptions<\n TData,\n TError,\n TData,\n // oxlint-disable-next-line typescript/no-explicit-any\n any\n>;\ntype AnyKeySuspenseOptions<TData, TError> = UseSuspenseQueryOptions<\n TData,\n TError,\n TData,\n // oxlint-disable-next-line typescript/no-explicit-any\n any\n>;\n\nexport function useQuery<TData = unknown, TError = DefaultError>(\n options: AnyKeyQueryOptions<TData, TError>,\n): UseQueryResult<TData, TError> {\n return tanstack_useQuery({\n ...options,\n queryKeyHashFn: hashFn,\n });\n}\n\nexport function useSuspenseQuery<TData = unknown, TError = DefaultError>(\n options: AnyKeySuspenseOptions<TData, TError>,\n): UseSuspenseQueryResult<TData, TError> {\n return tanstack_useSuspenseQuery({\n ...options,\n queryKeyHashFn: hashFn,\n });\n}\n\n/**\n * Thin wrapper around TanStack's useQueries that injects our custom queryKeyHashFn\n * on every query in the array.\n */\nexport function useQueries<\n // oxlint-disable-next-line typescript/no-explicit-any\n T extends Array<any>,\n TCombinedResult = QueriesResults<T>,\n>({\n queries,\n ...options\n}: {\n queries: readonly [...QueriesOptions<T>];\n combine?: (result: QueriesResults<T>) => TCombinedResult;\n subscribed?: boolean;\n}): TCombinedResult {\n return tanstack_useQueries({\n ...options,\n queries: queries.map((q) => ({\n ...q,\n queryKeyHashFn: hashFn,\n })) as [...QueriesOptions<T>],\n });\n}\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport type { WalletAccount, ZamaSDK } from \"@zama-fhe/sdk\";\n\nexport function useWalletAccount(sdk: ZamaSDK): WalletAccount | undefined {\n return useSyncExternalStore(\n (listener) => sdk.onWalletAccountChange(listener),\n () => sdk.signer?.walletAccount.getSnapshot(),\n () => undefined,\n );\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DecryptResult, UserDecryptQueryConfig } from \"@zama-fhe/sdk/query\";\nimport { userDecryptQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/**\n * React hook for FHE user decryption. Thin wrapper around\n * `userDecryptQueryOptions` with `useQuery` semantics.\n */\nexport function useUserDecrypt(\n config: UserDecryptQueryConfig,\n options?: Omit<UseQueryOptions<DecryptResult>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n const queryOpts = userDecryptQueryOptions(sdk, config, { walletAccount });\n return useQuery<DecryptResult>({\n ...queryOpts,\n ...options,\n enabled: queryOpts.enabled && (options?.enabled ?? false),\n });\n}\n\n/** Return type of {@link useUserDecrypt}. */\nexport type UseUserDecryptResult = ReturnType<typeof useUserDecrypt>;\n","\"use client\";\n\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Handle, PublicDecryptResult } from \"@zama-fhe/sdk\";\nimport { publicDecryptMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Decrypt FHE ciphertext handles using the network public key (no credential needed).\n * On success, results are available via `data.clearValues` and written to the\n * persistent decrypt cache.\n *\n * @returns A mutation whose `mutate` accepts an array of handle strings.\n *\n * @example\n * ```tsx\n * const publicDecrypt = usePublicDecrypt();\n * publicDecrypt.mutate([\"0xHandle1\", \"0xHandle2\"]);\n * // publicDecrypt.data?.clearValues => { \"0xHandle1\": 500n, ... }\n * ```\n */\nexport function usePublicDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<PublicDecryptResult, Error, Handle[]>(publicDecryptMutationOptions(sdk));\n}\n","\"use client\";\n\nimport { useMutation } from \"@tanstack/react-query\";\nimport { generateKeypairMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Generate an FHE keypair via the relayer.\n * Returns a public/private key pair for use in decrypt authorization.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link RelayerRequestFailedError} — relayer keypair generation request failed\n *\n * @returns A mutation whose `mutate` takes no parameters.\n *\n * @example\n * ```tsx\n * const generateKeypair = useGenerateKeypair();\n * generateKeypair.mutate();\n * // generateKeypair.data?.publicKey, generateKeypair.data?.privateKey\n * ```\n */\nexport function useGenerateKeypair() {\n const sdk = useZamaSDK();\n return useMutation(generateKeypairMutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { EIP712TypedData } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { createEIP712MutationOptions } from \"@zama-fhe/sdk/query\";\nimport type { CreateEIP712Params } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Create EIP-712 typed data for signing an FHE decrypt credential.\n * The returned typed data is signed by the wallet to authorize decryption.\n *\n * @returns A mutation whose `mutate` accepts {@link CreateEIP712Params}.\n *\n * @example\n * ```tsx\n * const createEIP712 = useCreateEIP712();\n * createEIP712.mutate({\n * publicKey: keypair.publicKey,\n * contractAddresses: [\"0xToken\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * });\n * ```\n */\nexport function useCreateEIP712() {\n const sdk = useZamaSDK();\n return useMutation<EIP712TypedData, Error, CreateEIP712Params>(createEIP712MutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { KmsDelegatedUserDecryptEIP712Type } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { createDelegatedUserDecryptEIP712MutationOptions } from \"@zama-fhe/sdk/query\";\nimport type { CreateDelegatedUserDecryptEIP712Params } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Create EIP-712 typed data for a delegated user decrypt credential.\n * Used when one wallet authorizes another to decrypt on its behalf.\n *\n * @returns A mutation whose `mutate` accepts {@link CreateDelegatedUserDecryptEIP712Params}.\n *\n * @example\n * ```tsx\n * const createEIP712 = useCreateDelegatedUserDecryptEIP712();\n * createEIP712.mutate({\n * publicKey: keypair.publicKey,\n * contractAddresses: [\"0xToken\"],\n * delegatorAddress: \"0xDelegator\",\n * startTimestamp: Math.floor(Date.now() / 1000),\n * });\n * ```\n */\nexport function useCreateDelegatedUserDecryptEIP712() {\n const sdk = useZamaSDK();\n return useMutation<\n KmsDelegatedUserDecryptEIP712Type,\n Error,\n CreateDelegatedUserDecryptEIP712Params\n >(createDelegatedUserDecryptEIP712MutationOptions(sdk));\n}\n","\"use client\";\n\nimport type { ClearValueType, Handle } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport {\n delegatedUserDecryptMutationOptions,\n type DelegatedUserDecryptMutationParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Decrypt FHE ciphertext handles using delegated user credentials.\n * Returns a map of handle → plaintext bigint.\n *\n * @returns A mutation whose `mutate` accepts {@link DelegatedUserDecryptMutationParams}.\n *\n * @example\n * ```tsx\n * const decrypt = useDelegatedUserDecrypt();\n * decrypt.mutate({ handles: [{ handle: \"0xHandle1\", contractAddress: \"0x...\" }], delegatorAddress: \"0x...\" });\n * // decrypt.data => { \"0xHandle1\": 1000n }\n * ```\n */\nexport function useDelegatedUserDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<Record<Handle, ClearValueType>, Error, DelegatedUserDecryptMutationParams>(\n delegatedUserDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { InputProofBytesType, ZKProofLike } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { requestZKProofVerificationMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Submit a ZK proof for on-chain verification.\n * Returns the input proof bytes for use in contract calls.\n *\n * @returns A mutation whose `mutate` accepts a {@link ZKProofLike}.\n *\n * @example\n * ```tsx\n * const verify = useRequestZKProofVerification();\n * verify.mutate(zkProof);\n * // verify.data => Uint8Array (input proof bytes)\n * ```\n */\nexport function useRequestZKProofVerification() {\n const sdk = useZamaSDK();\n return useMutation<InputProofBytesType, Error, ZKProofLike>(\n requestZKProofVerificationMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { PublicKeyData } from \"@zama-fhe/sdk\";\nimport { useQuery } from \"../utils/query\";\nimport { publicKeyQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Fetch the FHE network public key from the relayer.\n * Cached indefinitely since the key does not change during a session.\n *\n * @returns Query result with `data: PublicKeyData | null`.\n *\n * @example\n * ```tsx\n * const { data: publicKey } = usePublicKey();\n * // publicKey?.publicKeyId, publicKey?.publicKey\n * ```\n */\nexport function usePublicKey() {\n const sdk = useZamaSDK();\n return useQuery<PublicKeyData | null>(publicKeyQueryOptions(sdk));\n}\n","\"use client\";\n\nimport type { PublicParamsData } from \"@zama-fhe/sdk\";\nimport { useQuery } from \"../utils/query\";\nimport { publicParamsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Fetch FHE public parameters for a given bit size from the relayer.\n * Cached indefinitely since parameters do not change during a session.\n *\n * @param bits - The FHE bit size to fetch parameters for (e.g. 2048).\n * @returns Query result with `data: PublicParamsData | null`.\n *\n * @example\n * ```tsx\n * const { data: params } = usePublicParams(2048);\n * // params?.publicParams, params?.publicParamsId\n * ```\n */\nexport function usePublicParams(bits: number) {\n const sdk = useZamaSDK();\n return useQuery<PublicParamsData | null>(publicParamsQueryOptions(sdk, bits));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { allowMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Sign an EIP-712 message authorizing decryption of confidential handles\n * for a list of contract addresses. This is not token-specific — any\n * contract that uses FHE-encrypted values (tokens, DeFi vaults, games, etc.)\n * can be authorized in a single wallet signature. Subsequent decrypt\n * operations on any of these contracts reuse cached credentials.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link KeypairExpiredError} — the re-encryption keypair has expired\n *\n * @example\n * ```tsx\n * const { mutateAsync: allow, isPending } = useAllow();\n *\n * // Authorize decryption for any contracts with encrypted state:\n * // confidential tokens, auction contracts, governance contracts, etc.\n * await allow([tokenAddress, auctionAddress, governanceAddress]);\n * ```\n */\nexport function useAllow(options?: UseMutationOptions<void, Error, Address[]>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[]>({\n ...allowMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"../utils/query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isAllowedQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/** Configuration for {@link useIsAllowed}. */\nexport interface UseIsAllowedConfig {\n /** Contract addresses to check credentials against (at least one required). */\n contractAddresses: [Address, ...Address[]];\n}\n\n/**\n * Check whether stored permits cover the given contract addresses for the\n * connected signer. Returns `true` if decrypt operations can proceed without\n * a wallet prompt.\n *\n * @returns Query result with `data: boolean` — `true` if a stored permit covers\n * every entry in `contractAddresses`. The query auto-disables when no signer is configured\n * (`data` stays `undefined`, `status` stays `\"pending\"`).\n * @throws {@link SignerNotConfiguredError} if the query runs without a signer configured\n * (the `enabled` guard normally prevents this; only reachable if the caller forces `query: { enabled: true }`).\n *\n * @example\n * ```tsx\n * const { data: allowed } = useIsAllowed({ contractAddresses: [\"0xToken\"] });\n * ```\n */\nexport function useIsAllowed(config: UseIsAllowedConfig) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n return useQuery<boolean>(isAllowedQueryOptions(sdk, config, { walletAccount }));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { revokePermitsMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Revoke FHE permits for the current signer.\n *\n * - Called with no arguments: every permit is removed across all chains and\n * delegators. The keypair survives — use {@link useClearCredentials} to also\n * wipe the keypair.\n * - Called with a contract list: only direct-decrypt permits on the current\n * chain whose payload touches a listed address are removed. Delegated\n * permits are not touched in this mode.\n *\n * @example\n * ```tsx\n * const { mutate: revokePermits } = useRevokePermits();\n * revokePermits([tokenAddress]); // direct-decrypt scope, current chain\n * revokePermits(); // every permit, all chains, all delegators\n * ```\n */\nexport function useRevokePermits(options?: UseMutationOptions<void, Error, Address[] | void>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[] | void>({\n ...revokePermitsMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n context.client.removeQueries({ queryKey: zamaQueryKeys.decryption.all });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { clearCredentialsMutationOptions, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Wipe the keypair for the current signer and cascade-delete every permit\n * (across chains and delegators) referencing it. Useful for \"log out\"\n * handlers that should leave no trace.\n *\n * @example\n * ```tsx\n * const { mutate: clearCredentials } = useClearCredentials();\n * clearCredentials();\n * ```\n */\nexport function useClearCredentials(options?: UseMutationOptions<void>) {\n const sdk = useZamaSDK();\n\n return useMutation<void>({\n ...clearCredentialsMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.isAllowed.all });\n context.client.removeQueries({ queryKey: zamaQueryKeys.decryption.all });\n },\n });\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { Address, Token } from \"@zama-fhe/sdk\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Get a {@link Token} instance for an ERC-7984 confidential token, memoized by address.\n * Supports balance queries, transfers, and operator approval.\n *\n * For ERC-7984 wrappers (shield/unshield), use {@link useWrappedToken} instead.\n *\n * @param address - The confidential token contract address.\n * @returns A memoized `Token` instance.\n *\n * @example\n * ```tsx\n * const token = useToken(\"0xToken\");\n * // token.balanceOf(), token.confidentialTransfer(), etc.\n * ```\n */\nexport function useToken(address: Address): Token {\n const sdk = useZamaSDK();\n return useMemo<Token>(() => sdk.createToken(address), [sdk, address]);\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { Address, WrappedToken } from \"@zama-fhe/sdk\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Get a {@link WrappedToken} instance for an ERC-7984 ERC-20 wrapper,\n * memoized by address. Adds wrapper-specific operations (shield, unshield,\n * underlying, allowance) on top of the base {@link useToken} API.\n *\n * The address is the wrapper contract address itself — the wrapper IS the\n * confidential token.\n *\n * @param address - The confidential wrapper contract address.\n * @returns A memoized `WrappedToken` instance.\n *\n * @example\n * ```tsx\n * const wrapped = useWrappedToken(\"0xWrapper\");\n * // wrapped.shield(1000n), wrapped.unshield(500n), etc.\n * ```\n */\nexport function useWrappedToken(address: Address): WrappedToken {\n const sdk = useZamaSDK();\n return useMemo<WrappedToken>(() => sdk.createWrappedToken(address), [sdk, address]);\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialBalanceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useToken } from \"../token/use-token\";\nimport { useQuery } from \"../utils/query\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\nexport interface UseConfidentialBalanceConfig {\n /** Address of the confidential token contract. */\n address: Address;\n /** Account to fetch balance for. The query is disabled while `undefined`. */\n account: Address | undefined;\n}\n\nexport interface UseConfidentialBalanceOptions extends Omit<\n UseQueryOptions<bigint>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> {\n /** Set this to `false` to disable this query from automatically running. */\n enabled?: boolean;\n}\n\n/**\n * Hook for fetching a confidential token balance. Reads the on-chain handle and\n * decrypts via the SDK; cached values are returned instantly and the relayer is\n * only hit when the handle changes.\n *\n * @example\n * ```tsx\n * const { data: balance } = useConfidentialBalance({\n * address: \"0xToken\",\n * account: \"0xAccount\",\n * });\n * ```\n */\nexport function useConfidentialBalance(\n config: UseConfidentialBalanceConfig,\n options?: UseConfidentialBalanceOptions,\n) {\n const { address, account } = config;\n const { enabled = true } = options ?? {};\n const token = useToken(address);\n const walletAccount = useWalletAccount(token.sdk);\n\n const baseOptions = confidentialBalanceQueryOptions(\n token,\n {\n tokenAddress: address,\n account,\n },\n { walletAccount },\n );\n\n return useQuery<bigint>({\n ...baseOptions,\n ...options,\n enabled: Boolean(baseOptions.enabled) && enabled,\n });\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address, BatchBalancesResult } from \"@zama-fhe/sdk\";\nimport { confidentialBalancesQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\nexport interface UseConfidentialBalancesConfig {\n /** Addresses of the confidential token contracts to batch-query. The query is disabled while empty. */\n addresses: Address[];\n /** Account to fetch balances for. The query is disabled while `undefined`. */\n account: Address | undefined;\n}\n\nexport interface UseConfidentialBalancesOptions extends Omit<\n UseQueryOptions<BatchBalancesResult>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> {\n /** Set this to `false` to disable this query from automatically running. */\n enabled?: boolean;\n}\n\n/**\n * Hook for fetching multiple confidential token balances in batch. Returns\n * partial results when some tokens fail — successful balances are available\n * alongside per-token error information.\n *\n * @param config - Token addresses configuration.\n * @param options - React Query options forwarded to the balance query.\n * @returns The balance query result.\n *\n * @example\n * ```tsx\n * const { data } = useConfidentialBalances({\n * addresses: [\"0xTokenA\", \"0xTokenB\"],\n * account: \"0xAccount\",\n * });\n * const balance = data?.results.get(\"0xTokenA\");\n * if (data && data.errors.size > 0) {\n * // some tokens failed — check data.errors\n * }\n * ```\n */\nexport function useConfidentialBalances(\n config: UseConfidentialBalancesConfig,\n options?: UseConfidentialBalancesOptions,\n) {\n const { addresses, account } = config;\n const { enabled = true } = options ?? {};\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n\n const tokens = useMemo(() => addresses.map((addr) => sdk.createToken(addr)), [sdk, addresses]);\n\n const baseOptions = confidentialBalancesQueryOptions(\n tokens,\n {\n account,\n },\n { walletAccount },\n );\n\n return useQuery<BatchBalancesResult>({\n ...baseOptions,\n ...options,\n enabled: Boolean(baseOptions.enabled) && enabled,\n });\n}\n","import type { QueryClient, QueryKey, UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport { invalidateAfterShield, zamaQueryKeys } from \"@zama-fhe/sdk/query\";\n\ntype BalanceDeltaMode = \"add\" | \"subtract\";\nexport type OptimisticBalanceSnapshot = [QueryKey, bigint | undefined][];\n\n/** Combined context returned by optimistic `onMutate`. */\nexport interface OptimisticMutateContext {\n snapshot: OptimisticBalanceSnapshot;\n callerContext?: unknown;\n}\n\nexport function unwrapOptimisticCallerContext(\n optimistic: boolean | undefined,\n rawContext: unknown,\n): {\n wrappedContext: OptimisticMutateContext | undefined;\n callerContext: OptimisticMutateContext | undefined;\n} {\n const typed = rawContext as OptimisticMutateContext | undefined;\n const wrappedContext = optimistic ? typed : undefined;\n const callerContext = (optimistic ? wrappedContext?.callerContext : rawContext) as\n | OptimisticMutateContext\n | undefined;\n return { wrappedContext, callerContext };\n}\n\nexport async function applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress,\n amount,\n mode,\n}: {\n queryClient: QueryClient;\n tokenAddress: Address;\n amount: bigint;\n mode: BalanceDeltaMode;\n}): Promise<OptimisticBalanceSnapshot> {\n const balanceKey = zamaQueryKeys.confidentialBalance.token(tokenAddress);\n await queryClient.cancelQueries({ queryKey: balanceKey });\n const previous = queryClient.getQueriesData<bigint>({ queryKey: balanceKey });\n for (const [key, value] of previous) {\n if (value === undefined) {\n continue;\n }\n // Temporary optimistic underflow (`amount > value`) is acceptable because\n // settlement invalidates and rewrites this cache entry.\n queryClient.setQueryData(key, mode === \"add\" ? value + amount : value - amount);\n }\n return previous;\n}\n\nexport function rollbackOptimisticBalanceDelta(\n queryClient: QueryClient,\n snapshot: OptimisticBalanceSnapshot,\n) {\n for (const [key, value] of snapshot) {\n queryClient.setQueryData(key, value);\n }\n}\n\n/**\n * Build optimistic mutation callbacks for shield operations.\n * Wraps the caller's `onMutate`/`onError`/`onSuccess`/`onSettled` with snapshot/rollback logic\n * and returns overrides ready to spread into `useMutation`.\n */\nexport function optimisticBalanceCallbacks<TParams extends { amount: bigint }>({\n optimistic,\n tokenAddress,\n queryClient,\n options,\n}: {\n optimistic: boolean | undefined;\n tokenAddress: Address;\n queryClient: QueryClient;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: UseMutationOptions<TransactionResult, Error, TParams, any> | undefined;\n}): Pick<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UseMutationOptions<TransactionResult, Error, TParams, any>,\n \"onMutate\" | \"onError\" | \"onSuccess\" | \"onSettled\"\n> {\n return {\n onMutate: optimistic\n ? async (variables, mutationContext) => {\n const snapshot = await applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress,\n amount: variables.amount,\n mode: \"add\",\n });\n const callerContext = await options?.onMutate?.(variables, mutationContext);\n return { snapshot, callerContext };\n }\n : options?.onMutate,\n onError: (error, variables, rawContext, context) => {\n const { wrappedContext, callerContext } = unwrapOptimisticCallerContext(\n optimistic,\n rawContext,\n );\n try {\n if (wrappedContext) {\n rollbackOptimisticBalanceDelta(queryClient, wrappedContext.snapshot);\n }\n } finally {\n options?.onError?.(error, variables, callerContext, context);\n }\n },\n onSuccess: (data, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(optimistic, rawContext);\n options?.onSuccess?.(data, variables, callerContext, context);\n invalidateAfterShield(context.client, tokenAddress);\n },\n onSettled: (data, error, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(optimistic, rawContext);\n options?.onSettled?.(data, error, variables, callerContext, context);\n },\n };\n}\n","\"use client\";\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialTransferMutationOptions,\n invalidateAfterTransfer,\n type ConfidentialTransferParams,\n} from \"@zama-fhe/sdk/query\";\nimport {\n applyOptimisticBalanceDelta,\n rollbackOptimisticBalanceDelta,\n unwrapOptimisticCallerContext,\n} from \"../balance/optimistic-balance-update\";\nimport { useToken } from \"../token/use-token\";\n\n/** Configuration for {@link useConfidentialTransfer}. */\nexport interface UseConfidentialTransferConfig {\n /** Address of the confidential token contract. */\n address: Address;\n /**\n * When `true`, optimistically subtracts the transfer amount from cached balance\n * before the transaction confirms. Rolls back on error.\n * @defaultValue false\n */\n optimistic?: boolean;\n}\n\n/**\n * Encrypt and send a confidential transfer. Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param config - Token address (and optional wrapper) identifying the token.\n * Set `optimistic: true` to subtract the amount from the cached balance immediately.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const transfer = useConfidentialTransfer({\n * address: \"0xToken\",\n * optimistic: true,\n * });\n * transfer.mutate(\n * { to: \"0xRecipient\", amount: 1000n },\n * {\n * onError: (error) => {\n * if (error instanceof SigningRejectedError) {\n * // user cancelled — no action needed\n * }\n * },\n * },\n * );\n * ```\n */\nexport function useConfidentialTransfer<TContext = unknown>(\n config: UseConfidentialTransferConfig,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferParams, TContext>,\n): UseMutationResult<TransactionResult, Error, ConfidentialTransferParams, TContext> {\n const token = useToken(config.address);\n const queryClient = useQueryClient();\n\n // Internal mutation uses `any` for TContext because optimistic mode wraps\n // the caller's context in OptimisticMutateContext; the public return type\n // is cast back to the caller's TContext.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return useMutation<TransactionResult, Error, ConfidentialTransferParams, any>({\n ...confidentialTransferMutationOptions(token),\n ...options,\n onMutate: config.optimistic\n ? async (variables, mutationContext) => {\n const snapshot = await applyOptimisticBalanceDelta({\n queryClient,\n tokenAddress: token.address,\n amount: variables.amount,\n mode: \"subtract\",\n });\n const callerContext = await options?.onMutate?.(variables, mutationContext);\n return { snapshot, callerContext };\n }\n : options?.onMutate,\n onError: (error, variables, rawContext, context) => {\n const { wrappedContext, callerContext } = unwrapOptimisticCallerContext(\n config.optimistic,\n rawContext,\n );\n try {\n if (wrappedContext) {\n rollbackOptimisticBalanceDelta(queryClient, wrappedContext.snapshot);\n }\n } finally {\n options?.onError?.(error, variables, callerContext as TContext, context);\n }\n },\n onSuccess: (data, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(config.optimistic, rawContext);\n options?.onSuccess?.(data, variables, callerContext as TContext, context);\n invalidateAfterTransfer(context.client, token.address);\n },\n onSettled: (data, error, variables, rawContext, context) => {\n const { callerContext } = unwrapOptimisticCallerContext(config.optimistic, rawContext);\n options?.onSettled?.(data, error, variables, callerContext as TContext, context);\n },\n }) as UseMutationResult<TransactionResult, Error, ConfidentialTransferParams, TContext>;\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialTransferFromMutationOptions,\n invalidateAfterTransfer,\n type ConfidentialTransferFromParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken } from \"../token/use-token\";\n\n/**\n * Operator transfer on behalf of another address. Caller must be an approved operator.\n * Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption of the transfer amount failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential token contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const transferFrom = useConfidentialTransferFrom(\"0xToken\");\n * transferFrom.mutate({ from: \"0xOwner\", to: \"0xRecipient\", amount: 500n });\n * ```\n */\nexport function useConfidentialTransferFrom(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialTransferFromParams, Address>,\n) {\n const token = useToken(address);\n\n return useMutation<TransactionResult, Error, ConfidentialTransferFromParams, Address>({\n ...confidentialTransferFromMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterTransfer(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n confidentialSetOperatorMutationOptions,\n invalidateAfterSetOperator,\n type ConfidentialSetOperatorParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useToken } from \"../token/use-token\";\n\n/**\n * Set operator approval for a confidential token. Defaults to 1 hour.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential token contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const setOperator = useConfidentialSetOperator(\"0xToken\");\n * setOperator.mutate({ operator: \"0xOperator\" });\n * ```\n */\nexport function useConfidentialSetOperator(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, ConfidentialSetOperatorParams, Address>,\n) {\n const token = useToken(address);\n\n return useMutation<TransactionResult, Error, ConfidentialSetOperatorParams, Address>({\n ...confidentialSetOperatorMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterSetOperator(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialIsOperatorQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport interface UseConfidentialIsOperatorConfig {\n /** Address of the confidential token contract. The query is disabled while `undefined`. */\n address: Address | undefined;\n /** Address to check operator status for. The query is disabled while `undefined`. */\n spender: Address | undefined;\n /** Token holder address. The query is disabled while `undefined`. */\n holder: Address | undefined;\n}\n\nexport interface UseConfidentialIsOperatorSuspenseConfig {\n /** Address of the confidential token contract. */\n address: Address;\n /** Address to check operator status for. */\n spender: Address;\n /** Token holder address. */\n holder: Address;\n}\n\n/**\n * Check if a spender is an approved operator for a holder.\n *\n * @param config - Token address, spender, and holder to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isOperator } = useConfidentialIsOperator({\n * address: \"0xToken\",\n * spender: \"0xSpender\",\n * holder: \"0xHolder\",\n * });\n * ```\n */\nexport function useConfidentialIsOperator(\n config: UseConfidentialIsOperatorConfig,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const { address, spender, holder } = config;\n const sdk = useZamaSDK();\n const baseOpts = confidentialIsOperatorQueryOptions(sdk, address, {\n holder,\n spender,\n });\n\n return useQuery({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useConfidentialIsOperator}. Suspends rendering\n * until the operator check resolves.\n *\n * @example\n * ```tsx\n * const { data: isOperator } = useConfidentialIsOperatorSuspense({\n * address: \"0xToken\",\n * spender: \"0xSpender\",\n * holder: \"0xHolder\",\n * });\n * ```\n */\nexport function useConfidentialIsOperatorSuspense(config: UseConfidentialIsOperatorSuspenseConfig) {\n const { spender, holder, address } = config;\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(\n confidentialIsOperatorQueryOptions(sdk, address, {\n holder,\n spender,\n }),\n );\n}\n","\"use client\";\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport { shieldMutationOptions, type ShieldParams } from \"@zama-fhe/sdk/query\";\nimport { optimisticBalanceCallbacks } from \"../balance/optimistic-balance-update\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/** Configuration for {@link useShield}. */\nexport interface UseShieldConfig {\n /** Address of the confidential wrapper contract. */\n address: Address;\n /**\n * When `true`, optimistically adds the wrap amount to the cached confidential balance\n * before the transaction confirms. Rolls back on error.\n * @defaultValue false\n */\n optimistic?: boolean;\n}\n\n/**\n * Shield public ERC-20 tokens into confidential tokens.\n * Handles ERC-20 approval automatically. Invalidates balance caches on success.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link ApprovalFailedError} — ERC-20 approval transaction failed\n * - {@link TransactionRevertedError} — shield transaction reverted\n *\n * @param config - Wrapper address (and optional `optimistic` flag).\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const shield = useShield({ address: \"0xWrapper\", optimistic: true });\n * shield.mutate({ amount: 1000n });\n * ```\n */\nexport function useShield<TContext = unknown>(\n config: UseShieldConfig,\n options?: UseMutationOptions<TransactionResult, Error, ShieldParams, TContext>,\n): UseMutationResult<TransactionResult, Error, ShieldParams, TContext> {\n const token = useWrappedToken(config.address);\n const queryClient = useQueryClient();\n\n return useMutation({\n ...shieldMutationOptions(token),\n ...options,\n ...optimisticBalanceCallbacks({\n optimistic: config.optimistic,\n tokenAddress: token.address,\n queryClient,\n options,\n }),\n }) as UseMutationResult<TransactionResult, Error, ShieldParams, TContext>;\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnwrap,\n type UnwrapParams,\n unwrapMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Request an unwrap for a specific amount. Encrypts the amount first.\n * Call {@link useFinalizeUnwrap} after the request is processed on-chain,\n * or use {@link useUnshield} for a single-call orchestration.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption of the unwrap amount failed\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unwrap = useUnwrap(\"0xWrapper\");\n * unwrap.mutate({ amount: 500n });\n * ```\n */\nexport function useUnwrap(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, UnwrapParams, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, UnwrapParams, Address>({\n ...unwrapMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnwrap(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport { invalidateAfterUnwrap, unwrapAllMutationOptions } from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Request an unwrap for the entire confidential balance.\n * Uses the on-chain balance handle directly (no encryption needed).\n * Call {@link useFinalizeUnwrap} after processing, or use {@link useUnshieldAll} for single-call orchestration.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unwrapAll = useUnwrapAll(\"0xWrapper\");\n * unwrapAll.mutate();\n * ```\n */\nexport function useUnwrapAll(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, void, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, void, Address>({\n ...unwrapAllMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnwrap(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n finalizeUnwrapMutationOptions,\n invalidateAfterUnshield,\n type FinalizeUnwrapParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Complete an unwrap by providing the public decryption proof.\n * Call this after an unwrap request has been processed on-chain.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link DecryptionFailedError} — public decryption of the burn amount failed\n * - {@link TransactionRevertedError} — on-chain finalize transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const finalize = useFinalizeUnwrap(\"0xWrapper\");\n * const event = findUnwrapRequested(receipt.logs);\n * // Pass unwrapRequestId from upgraded events, or fall back to encryptedAmount for legacy ones.\n * finalize.mutate(\n * event.unwrapRequestId\n * ? { unwrapRequestId: event.unwrapRequestId }\n * : { burnAmountHandle: event.encryptedAmount },\n * );\n * ```\n */\nexport function useFinalizeUnwrap(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, FinalizeUnwrapParams, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, FinalizeUnwrapParams, Address>({\n ...finalizeUnwrapMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type UnshieldParams,\n unshieldMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Unshield a specific amount and finalize in one call.\n * Orchestrates: unwrap → wait for receipt → parse event → finalize.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link EncryptionFailedError} — FHE encryption failed during unwrap\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unshield = useUnshield(\"0xWrapper\");\n * unshield.mutate({ amount: 500n });\n * ```\n */\nexport function useUnshield(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, UnshieldParams, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, UnshieldParams, Address>({\n ...unshieldMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type UnshieldAllParams,\n unshieldAllMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Unshield the entire balance and finalize in one call.\n * Orchestrates: unwrapAll → wait for receipt → parse event → finalize.\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const unshieldAll = useUnshieldAll(\"0xWrapper\");\n * unshieldAll.mutate();\n * ```\n */\nexport function useUnshieldAll(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, UnshieldAllParams | void, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, UnshieldAllParams | void, Address>({\n ...unshieldAllMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n invalidateAfterUnshield,\n type ResumeUnshieldParams,\n resumeUnshieldMutationOptions,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Resume an interrupted unshield from an existing unwrap tx hash.\n * Useful when the user submitted the unwrap but the finalize step was\n * interrupted (e.g. page reload, network error).\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link DecryptionFailedError} — public decryption failed during finalize\n * - {@link TransactionRevertedError} — on-chain transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const resumeUnshield = useResumeUnshield(\"0xWrapper\");\n * resumeUnshield.mutate({ unwrapTxHash: \"0xabc...\" });\n * ```\n */\nexport function useResumeUnshield(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, ResumeUnshieldParams, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, ResumeUnshieldParams, Address>({\n ...resumeUnshieldMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterUnshield(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { underlyingAllowanceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { underlyingAllowanceQueryOptions };\n\nexport interface UseUnderlyingAllowanceConfig {\n /** Address of the confidential wrapper contract. */\n address: Address;\n /** Owner to fetch allowance for. The query is disabled while `undefined`. */\n owner: Address | undefined;\n}\n\nexport interface UseUnderlyingAllowanceSuspenseConfig {\n /** Address of the confidential wrapper contract. */\n address: Address;\n /** Owner to fetch allowance for. */\n owner: Address;\n}\n\n/**\n * Hook for fetching the underlying ERC-20 allowance granted to the wrapper\n * contract. Useful to check if an approval is needed before shielding.\n *\n * @example\n * ```tsx\n * const { data: allowance } = useUnderlyingAllowance({\n * address: \"0xWrapper\",\n * owner: \"0xOwner\",\n * });\n * ```\n */\nexport function useUnderlyingAllowance(\n config: UseUnderlyingAllowanceConfig,\n options?: Omit<UseQueryOptions<bigint>, \"queryKey\" | \"queryFn\">,\n) {\n const { address, owner } = config;\n const sdk = useZamaSDK();\n\n const baseOpts = underlyingAllowanceQueryOptions(sdk, address, { owner });\n\n return useQuery<bigint>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useUnderlyingAllowance}. Suspends rendering until\n * the allowance resolves.\n *\n * @example\n * ```tsx\n * const { data: allowance } = useUnderlyingAllowanceSuspense({\n * address: \"0xWrapper\",\n * owner: \"0xOwner\",\n * });\n * ```\n */\nexport function useUnderlyingAllowanceSuspense(config: UseUnderlyingAllowanceSuspenseConfig) {\n const { address, owner } = config;\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<bigint>(underlyingAllowanceQueryOptions(sdk, address, { owner }));\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { zamaQueryKeys } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\n\n/**\n * Resolves the wrappers registry address for the current chain.\n * Uses the registry addresses from `sdk.registry` (built-in defaults from chain configs).\n *\n * Returns `undefined` when the chain ID hasn't been fetched yet\n * or when no registry is configured for the connected chain.\n *\n * The chain ID is cached for 30 seconds (`staleTime`), so chain\n * switches may take up to 30s to reflect.\n */\nexport function useWrappersRegistryAddress(): Address | undefined {\n const sdk = useZamaSDK();\n\n const { data: chainId } = useQuery<number>({\n queryKey: zamaQueryKeys.wrappersRegistry.chainId(),\n queryFn: () => sdk.provider.getChainId(),\n staleTime: 30_000,\n });\n\n return chainId !== undefined ? sdk.registry.getAddress(chainId) : undefined;\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { wrapperDiscoveryQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"../wrappers-registry/use-wrappers-registry-address\";\n\nexport { wrapperDiscoveryQueryOptions };\n\n/** Configuration for {@link useWrapperDiscovery}. */\nexport interface UseWrapperDiscoveryConfig {\n /**\n * Address of any confidential token you control.\n * Used only to derive the signer context and to scope the query cache key —\n * it does not affect which wrapper the registry returns.\n */\n tokenAddress: Address;\n /** ERC-20 address to discover the wrapper for. Pass `undefined` to disable the query. */\n erc20Address: Address | undefined;\n}\n\n/** Configuration for {@link useWrapperDiscoverySuspense}. */\nexport interface UseWrapperDiscoverySuspenseConfig {\n /**\n * Address of any confidential token you control.\n * Used only to derive the signer context and to scope the query cache key —\n * it does not affect which wrapper the registry returns.\n */\n tokenAddress: Address;\n /** ERC-20 address to discover the wrapper for. */\n erc20Address: Address;\n}\n\n/**\n * Discover the confidential wrapper for an ERC-20 token via the on-chain registry.\n * Returns the wrapper address if one exists, or `null` if not.\n * Cached indefinitely since wrapper mappings are immutable.\n *\n * @param config - Token and ERC-20 addresses.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: Address | null`.\n *\n * @example\n * ```tsx\n * const { data: wrapperAddress } = useWrapperDiscovery({\n * tokenAddress: \"0xConfidentialToken\",\n * erc20Address: \"0xUSDC\",\n * });\n * ```\n */\nexport function useWrapperDiscovery(\n config: UseWrapperDiscoveryConfig,\n options?: Omit<UseQueryOptions<Address | null>, \"queryKey\" | \"queryFn\">,\n) {\n const { tokenAddress, erc20Address } = config;\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n const baseOpts = wrapperDiscoveryQueryOptions(sdk.registry, {\n tokenAddress,\n erc20Address,\n registryAddress,\n });\n\n return useQuery<Address | null>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n\n/**\n * Suspense variant of {@link useWrapperDiscovery}.\n * Suspends rendering until the wrapper address is resolved.\n *\n * @param config - Token and ERC-20 addresses.\n * @returns Suspense query result with `data: Address | null`.\n *\n * @example\n * ```tsx\n * const { data: wrapperAddress } = useWrapperDiscoverySuspense({\n * tokenAddress: \"0xConfidentialToken\",\n * erc20Address: \"0xUSDC\",\n * });\n * ```\n */\nexport function useWrapperDiscoverySuspense(config: UseWrapperDiscoverySuspenseConfig) {\n const { tokenAddress, erc20Address } = config;\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useSuspenseQuery<Address | null>(\n wrapperDiscoveryQueryOptions(sdk.registry, {\n tokenAddress,\n erc20Address,\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { tokenMetadataQueryOptions, type TokenMetadata } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\n\n/**\n * Read ERC-20 token metadata (name, symbol, decimals).\n * Fetches all three in parallel. Cached indefinitely since metadata is immutable.\n *\n * @param tokenAddress - Address of the token contract.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: TokenMetadata`.\n *\n * @example\n * ```tsx\n * const { data: metadata } = useMetadata(\"0xToken\");\n * // metadata?.name, metadata?.symbol, metadata?.decimals\n * ```\n */\nexport function useMetadata(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<TokenMetadata>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n return useQuery<TokenMetadata>({\n ...tokenMetadataQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useMetadata}.\n * Suspends rendering until metadata is loaded.\n *\n * @param tokenAddress - Address of the token contract.\n * @returns Suspense query result with `data: TokenMetadata`.\n *\n * @example\n * ```tsx\n * const { data: metadata } = useMetadataSuspense(\"0xToken\");\n * ```\n */\nexport function useMetadataSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n return useSuspenseQuery<TokenMetadata>(tokenMetadataQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n delegateDecryptionMutationOptions,\n zamaQueryKeys,\n type DelegateDecryptionParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Delegate FHE decryption rights for a confidential contract to another address\n * via the on-chain ACL.\n *\n * @param address - Confidential contract address to delegate on.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const delegate = useDelegateDecryption(\"0xToken\");\n * delegate.mutate({ delegateAddress: \"0xDelegate\" });\n * ```\n */\nexport function useDelegateDecryption(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, DelegateDecryptionParams>,\n) {\n const sdk = useZamaSDK();\n\n return useMutation<TransactionResult, Error, DelegateDecryptionParams>({\n ...delegateDecryptionMutationOptions(sdk, address),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n try {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n } finally {\n void context.client.invalidateQueries({ queryKey: zamaQueryKeys.delegationStatus.all });\n }\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n revokeDelegationMutationOptions,\n zamaQueryKeys,\n type RevokeDelegationParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\n/**\n * Revoke FHE decryption delegation for a confidential contract from a delegate address.\n *\n * @param address - Confidential contract address to revoke delegation on.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const revoke = useRevokeDelegation(\"0xToken\");\n * revoke.mutate({ delegateAddress: \"0xDelegate\" });\n * ```\n */\nexport function useRevokeDelegation(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, RevokeDelegationParams>,\n) {\n const sdk = useZamaSDK();\n\n return useMutation<TransactionResult, Error, RevokeDelegationParams>({\n ...revokeDelegationMutationOptions(sdk, address),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n try {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n } finally {\n void context.client.invalidateQueries({ queryKey: zamaQueryKeys.delegationStatus.all });\n }\n },\n });\n}\n","\"use client\";\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { delegationStatusQueryOptions, type DelegationStatusData } from \"@zama-fhe/sdk/query\";\nimport { useQuery } from \"../utils/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport interface UseDelegationStatusConfig {\n /** Address of the confidential token contract. Pass `undefined` to disable the query. */\n tokenAddress: Address | undefined;\n /** The address that granted the delegation. */\n delegatorAddress?: Address;\n /** The address that received delegation rights. */\n delegateAddress?: Address;\n}\n\n/**\n * Query delegation status between a delegator and delegate for a token.\n *\n * @param config - Token address, delegator, and delegate addresses.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns `{ isDelegated, expiryTimestamp, isLoading, error }`.\n *\n * @example\n * ```tsx\n * const { data } = useDelegationStatus({\n * tokenAddress: \"0xToken\",\n * delegatorAddress: \"0xDelegator\",\n * delegateAddress: \"0xDelegate\",\n * });\n * // data?.isDelegated, data?.expiryTimestamp\n * ```\n */\nexport function useDelegationStatus(\n config: UseDelegationStatusConfig,\n options?: Omit<UseQueryOptions<DelegationStatusData>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const baseOpts = delegationStatusQueryOptions(sdk, config);\n\n return useQuery<DelegationStatusData>({\n ...baseOpts,\n ...options,\n enabled: (baseOpts.enabled ?? true) && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { decryptBalanceAsMutationOptions, type DecryptBalanceAsParams } from \"@zama-fhe/sdk/query\";\nimport { useToken } from \"../token/use-token\";\n\n/**\n * Decrypt another user's confidential balance as a delegate.\n *\n * @param address - Address of the confidential token contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const decryptAs = useDecryptBalanceAs(\"0xToken\");\n * decryptAs.mutate({ delegatorAddress: \"0xDelegator\" });\n * // decryptAs.data => 1000n\n * ```\n */\nexport function useDecryptBalanceAs(\n address: Address,\n options?: UseMutationOptions<bigint, Error, DecryptBalanceAsParams>,\n) {\n const token = useToken(address);\n\n return useMutation<bigint, Error, DecryptBalanceAsParams>({\n ...decryptBalanceAsMutationOptions(token),\n ...options,\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address, Token } from \"@zama-fhe/sdk\";\nimport {\n batchDecryptBalancesAsMutationOptions,\n type BatchDecryptBalancesAsParams,\n} from \"@zama-fhe/sdk/query\";\n\n/**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n *\n * @param tokens - {@link Token} instances to decrypt balances for.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const batchDecryptAs = useBatchDecryptBalancesAs(tokens);\n * batchDecryptAs.mutate({\n * delegatorAddress: \"0xDelegator\",\n * });\n * // batchDecryptAs.data => Map { \"0xTokenA\" => 100n, \"0xTokenB\" => 200n }\n * ```\n */\nexport function useBatchDecryptBalancesAs(\n tokens: Token[],\n options?: UseMutationOptions<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>,\n) {\n return useMutation<Map<Address, bigint>, Error, BatchDecryptBalancesAsParams>({\n ...batchDecryptBalancesAsMutationOptions(tokens),\n ...options,\n });\n}\n","\"use client\";\n\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { Address, TransactionResult } from \"@zama-fhe/sdk\";\nimport {\n approveUnderlyingMutationOptions,\n invalidateAfterApproveUnderlying,\n type ApproveUnderlyingParams,\n} from \"@zama-fhe/sdk/query\";\nimport { useWrappedToken } from \"../token/use-wrapped-token\";\n\n/**\n * Approve the wrapper contract to spend the underlying ERC-20.\n * Defaults to max uint256. Resets to zero first if there's an existing\n * non-zero allowance (required by tokens like USDT).\n *\n * Errors are {@link ZamaError} subclasses — use `instanceof` to handle specific failures:\n * - {@link SigningRejectedError} — user rejected the wallet prompt\n * - {@link TransactionRevertedError} — approval transaction reverted\n *\n * @param address - Address of the confidential wrapper contract.\n * @param options - React Query mutation options.\n *\n * @example\n * ```tsx\n * const approve = useApproveUnderlying(\"0xWrapper\");\n * approve.mutate({}); // max approval\n * approve.mutate({ amount: 1000n }); // exact amount\n * ```\n */\nexport function useApproveUnderlying(\n address: Address,\n options?: UseMutationOptions<TransactionResult, Error, ApproveUnderlyingParams, Address>,\n) {\n const token = useWrappedToken(address);\n\n return useMutation<TransactionResult, Error, ApproveUnderlyingParams, Address>({\n ...approveUnderlyingMutationOptions(token),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n invalidateAfterApproveUnderlying(context.client, token.address);\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isConfidentialQueryOptions, isWrapperQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { isConfidentialQueryOptions, isWrapperQueryOptions };\n\n/**\n * Check if a token supports the ERC-7984 confidential interface via ERC-165.\n * Result is cached indefinitely since interface support does not change.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isConfidential } = useIsConfidential(\"0xToken\");\n * ```\n */\nexport function useIsConfidential(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<boolean>({\n ...isConfidentialQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useIsConfidential}.\n * Suspends rendering until the ERC-165 check resolves.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @returns Suspense query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isConfidential } = useIsConfidentialSuspense(\"0xToken\");\n * ```\n */\nexport function useIsConfidentialSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(isConfidentialQueryOptions(sdk, tokenAddress));\n}\n\n/**\n * Check if a token supports the ERC-7984 wrapper interface via ERC-165.\n * Result is cached indefinitely since interface support does not change.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isWrapper } = useIsWrapper(\"0xToken\");\n * ```\n */\nexport function useIsWrapper(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<boolean>({\n ...isWrapperQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useIsWrapper}.\n * Suspends rendering until the ERC-165 check resolves.\n *\n * @param tokenAddress - Address of the token contract to check.\n * @returns Suspense query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: isWrapper } = useIsWrapperSuspense(\"0xToken\");\n * ```\n */\nexport function useIsWrapperSuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<boolean>(isWrapperQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport { useQuery, useSuspenseQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { totalSupplyQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\n\nexport { totalSupplyQueryOptions };\n\n/**\n * Read the total supply of a token.\n * Stale after 30 seconds to balance freshness and RPC cost.\n *\n * @param tokenAddress - Address of the token contract.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: bigint`.\n * Uses ERC-165 to call `inferredTotalSupply()` on upgraded wrappers and\n * legacy `totalSupply()` on pre-upgrade wrappers.\n *\n * @example\n * ```tsx\n * const { data: totalSupply } = useTotalSupply(\"0xToken\");\n * ```\n */\nexport function useTotalSupply(\n tokenAddress: Address,\n options?: Omit<UseQueryOptions<bigint>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n\n return useQuery<bigint>({\n ...totalSupplyQueryOptions(sdk, tokenAddress),\n ...options,\n });\n}\n\n/**\n * Suspense variant of {@link useTotalSupply}.\n * Suspends rendering until the total supply is loaded.\n *\n * @param tokenAddress - Address of the token contract.\n * @returns Suspense query result with `data: bigint`.\n * Uses ERC-165 to call `inferredTotalSupply()` on upgraded wrappers and\n * legacy `totalSupply()` on pre-upgrade wrappers.\n *\n * @example\n * ```tsx\n * const { data: totalSupply } = useTotalSupplySuspense(\"0xToken\");\n * ```\n */\nexport function useTotalSupplySuspense(tokenAddress: Address) {\n const sdk = useZamaSDK();\n\n return useSuspenseQuery<bigint>(totalSupplyQueryOptions(sdk, tokenAddress));\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches all token wrapper pairs from the ConfidentialTokenWrappersRegistry\n * contract on the current chain.\n */\nexport function useTokenPairsRegistry() {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly TokenWrapperPair[]>(\n tokenPairsQueryOptions(sdk, {\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport { tokenPairsLengthQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Returns the total number of token wrapper pairs in the registry.\n */\nexport function useTokenPairsLength() {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<bigint>(\n tokenPairsLengthQueryOptions(sdk, {\n registryAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairsSliceQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches a range of token wrapper pairs from the registry (paginated).\n *\n * @param fromIndex - Start index (inclusive). Pass `undefined` to disable.\n * @param toIndex - End index (exclusive). Pass `undefined` to disable.\n */\nexport function useTokenPairsSlice({\n fromIndex,\n toIndex,\n}: {\n fromIndex: bigint | undefined;\n toIndex: bigint | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly TokenWrapperPair[]>(\n tokenPairsSliceQueryOptions(sdk, {\n registryAddress,\n fromIndex,\n toIndex,\n }),\n );\n}\n","\"use client\";\n\nimport type { TokenWrapperPair } from \"@zama-fhe/sdk\";\nimport { tokenPairQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches a single token wrapper pair by index from the registry.\n *\n * @param index - Zero-based pair index. Pass `undefined` to disable.\n */\nexport function useTokenPair({ index }: { index: bigint | undefined }) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<TokenWrapperPair>(\n tokenPairQueryOptions(sdk, {\n registryAddress,\n index,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { confidentialTokenAddressQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Looks up the confidential token address for a given plain token address.\n */\nexport function useConfidentialTokenAddress({\n tokenAddress,\n}: {\n tokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly [boolean, Address]>(\n confidentialTokenAddressQueryOptions(sdk, {\n registryAddress,\n tokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { tokenAddressQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Looks up the plain token address for a given confidential token address.\n */\nexport function useTokenAddress({\n confidentialTokenAddress,\n}: {\n confidentialTokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<readonly [boolean, Address]>(\n tokenAddressQueryOptions(sdk, {\n registryAddress,\n confidentialTokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { isConfidentialTokenValidQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Checks whether a confidential token is registered and valid in the\n * on-chain wrappers registry.\n *\n * @param confidentialTokenAddress - The confidential token to check. Pass `undefined` to disable.\n */\nexport function useIsConfidentialTokenValid({\n confidentialTokenAddress,\n}: {\n confidentialTokenAddress: Address | undefined;\n}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n return useQuery<boolean>(\n isConfidentialTokenValidQueryOptions(sdk, {\n registryAddress,\n confidentialTokenAddress,\n }),\n );\n}\n","\"use client\";\n\nimport type {\n TokenWrapperPair,\n TokenWrapperPairWithMetadata,\n PaginatedResult,\n} from \"@zama-fhe/sdk\";\nimport { listPairsQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useQuery } from \"../utils/query\";\nimport { useWrappersRegistryAddress } from \"./use-wrappers-registry-address\";\n\n/**\n * Fetches paginated token wrapper pairs from the registry.\n *\n * @param options - Query options: `page` (1-indexed, default `1`), `pageSize` (default `100`), `metadata` (fetch on-chain metadata for both tokens, default `false`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useListPairs({ page: 1, pageSize: 20 });\n * if (data) {\n * console.log(`${data.total} pairs, showing page ${data.page}`);\n * }\n * ```\n */\nexport function useListPairs({\n page = 1,\n pageSize = 100,\n metadata = false,\n}: {\n page?: number;\n pageSize?: number;\n metadata?: boolean;\n} = {}) {\n const sdk = useZamaSDK();\n const registryAddress = useWrappersRegistryAddress();\n\n // Pass sdk.registry (a lazy singleton) so the class-level TTL cache is shared\n // across all queryFn executions — rather than constructing a new instance each time.\n return useQuery<PaginatedResult<TokenWrapperPair | TokenWrapperPairWithMetadata>>(\n listPairsQueryOptions(sdk.registry, {\n registryAddress,\n page,\n pageSize,\n metadata,\n }),\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zama-fhe/react-sdk",
3
- "version": "3.0.0-alpha.34",
3
+ "version": "3.0.0-alpha.36",
4
4
  "description": "React hooks for Zama SDK",
5
5
  "license": "BSD-3-Clause-Clear",
6
6
  "author": "Zama",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  "peerDependencies": {
66
66
  "@tanstack/react-query": ">=5",
67
- "@zama-fhe/sdk": "^3.0.0-alpha.34",
67
+ "@zama-fhe/sdk": "^3.0.0-alpha.36",
68
68
  "react": ">=18",
69
69
  "viem": "^2.47.0",
70
70
  "wagmi": ">=2"