@zama-fhe/react-sdk 3.1.0-alpha.2 → 3.1.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { Address, BatchBalancesResult, EncryptParams, PaginatedResult, Token, TokenWrapperPair, TokenWrapperPairWithMetadata, TransactionResult, WrappedToken, ZamaConfig, ZamaSDK } from "@zama-fhe/sdk";
3
+ import { Address, BatchBalancesResult, EncryptParams, EncryptResult, PaginatedResult, Token, TokenWrapperPair, TokenWrapperPairWithMetadata, TransactionResult, WrappedToken, ZamaConfig, ZamaSDK } from "@zama-fhe/sdk";
4
4
  import { ApproveUnderlyingParams, BatchDecryptBalancesAsParams, ConfidentialSetOperatorParams, ConfidentialTransferFromParams, ConfidentialTransferParams, DecryptBalanceAsParams, DecryptResult, DelegateDecryptionParams, DelegatedDecryptMutationParams, DelegationStatusData, FinalizeUnwrapParams, ResumeUnshieldParams, RevokeDelegationParams, ShieldParams, TokenMetadata, UnshieldAllParams, UnshieldParams, UnwrapParams } from "@zama-fhe/sdk/query";
5
5
  import { UseMutationOptions, UseMutationResult, UseQueryOptions } from "@tanstack/react-query";
6
6
  import { PropsWithChildren } from "react";
@@ -54,10 +54,7 @@ declare function useZamaSDK(): ZamaSDK;
54
54
  * encrypt.mutate({ values: [{ value: 1000n, type: "euint64" }], contractAddress: "0x...", userAddress: "0x..." });
55
55
  * ```
56
56
  */
57
- declare function useEncrypt(): import("@tanstack/react-query").UseMutationResult<Readonly<{
58
- handles: Uint8Array[];
59
- inputProof: Uint8Array;
60
- }>, Error, EncryptParams, unknown>;
57
+ declare function useEncrypt(): import("@tanstack/react-query").UseMutationResult<EncryptResult, Error, EncryptParams, unknown>;
61
58
  //#endregion
62
59
  //#region src/decrypt/use-user-decrypt.d.ts
63
60
  /**
@@ -131,26 +128,24 @@ declare function useGrantPermit(options?: UseMutationOptions<void, Error, Addres
131
128
  //#region src/permits/use-has-permit.d.ts
132
129
  /** Configuration for {@link useHasPermit}. */
133
130
  interface UseHasPermitConfig {
134
- /** Contract addresses to check credentials against (at least one required). */
135
- contractAddresses: [Address, ...Address[]];
131
+ /** Contract addresses to check credentials against. */
132
+ contractAddresses: Address[];
136
133
  }
137
134
  /**
138
135
  * Check whether stored permits cover the given contract addresses for the
139
- * connected signer. Returns `true` if decrypt operations can proceed without
140
- * a wallet prompt.
136
+ * connected signer.
141
137
  *
142
- * @returns Query result with `data: boolean` `true` if a stored permit covers
143
- * every entry in `contractAddresses`. The query auto-disables when no signer is configured
144
- * (`data` stays `undefined`, `status` stays `"pending"`).
145
- * @throws if the query runs without a signer configured (the `enabled` guard normally
146
- * prevents this; only reachable if the caller forces `query: { enabled: true }`). {@link SignerNotConfiguredError}
138
+ * @param config - Contract addresses to check credentials against. The query is
139
+ * disabled while the list is empty or no signer is configured.
140
+ * @param options - React Query options (forwarded to `useQuery`).
141
+ * @returns Query result with `data: boolean`.
147
142
  *
148
143
  * @example
149
144
  * ```tsx
150
145
  * const { data: hasPermit } = useHasPermit({ contractAddresses: ["0xToken"] });
151
146
  * ```
152
147
  */
153
- declare function useHasPermit(config: UseHasPermitConfig): import("@tanstack/react-query").UseQueryResult<boolean, Error>;
148
+ declare function useHasPermit(config: UseHasPermitConfig, options?: Omit<UseQueryOptions<boolean>, "queryKey" | "queryFn">): import("@tanstack/react-query").UseQueryResult<boolean, Error>;
154
149
  //#endregion
155
150
  //#region src/permits/use-revoke-permits.d.ts
156
151
  /**
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use client";import{ZamaSDK as e}from"@zama-fhe/sdk";import{approveUnderlyingMutationOptions as t,batchDecryptBalancesAsMutationOptions as n,clearCredentialsMutationOptions as r,confidentialBalanceQueryOptions as i,confidentialBalancesQueryOptions as a,confidentialIsOperatorQueryOptions as o,confidentialSetOperatorMutationOptions as s,confidentialTokenAddressQueryOptions as c,confidentialTransferFromMutationOptions as l,confidentialTransferMutationOptions as ee,decryptBalanceAsMutationOptions as te,delegateDecryptionMutationOptions as ne,delegatedDecryptMutationOptions as re,delegationStatusQueryOptions as ie,encryptMutationOptions as ae,finalizeUnwrapMutationOptions as u,grantPermitMutationOptions as d,hasPermitQueryOptions as f,hashFn as p,invalidateAfterApproveUnderlying as m,invalidateAfterSetOperator as h,invalidateAfterShield as oe,invalidateAfterTransfer as g,invalidateAfterUnshield as _,invalidateAfterUnwrap as v,invalidateWalletLifecycleQueries as se,isConfidentialQueryOptions as y,isConfidentialTokenValidQueryOptions as ce,isWrapperQueryOptions as b,listPairsQueryOptions as le,publicDecryptMutationOptions as ue,resumeUnshieldMutationOptions as de,revokeDelegationMutationOptions as fe,revokePermitsMutationOptions as pe,shieldMutationOptions as me,tokenAddressQueryOptions as he,tokenMetadataQueryOptions as x,tokenPairQueryOptions as S,tokenPairsLengthQueryOptions as C,tokenPairsQueryOptions as w,tokenPairsSliceQueryOptions as T,totalSupplyQueryOptions as E,underlyingAllowanceQueryOptions as D,unshieldAllMutationOptions as O,unshieldMutationOptions as k,unwrapAllMutationOptions as A,unwrapMutationOptions as j,userDecryptQueryOptions as M,wrapperDiscoveryQueryOptions as N,zamaQueryKeys as P}from"@zama-fhe/sdk/query";import{useMutation as F,useQuery as I,useQueryClient as L,useSuspenseQuery as R}from"@tanstack/react-query";import{createContext as ge,useContext as _e,useEffect as z,useMemo as B,useRef as ve,useSyncExternalStore as ye}from"react";import{jsx as be}from"react/jsx-runtime";const V=ge(null);function H(e){e.permits.warmKeypair().catch(e=>{console.warn(`[zama-sdk] warm keypair failed:`,e)})}function xe({children:t,config:n}){let r=L(),i=ve(n.onEvent);z(()=>{i.current=n.onEvent});let a=B(()=>new e({...n,onEvent:i.current}),[n]);return z(()=>(H(a),a.onWalletAccountChange(({previous:e})=>{e&&se(r),H(a)})),[a,r]),z(()=>()=>a.dispose(),[a]),be(V.Provider,{value:a,children:t})}function U(){let e=_e(V);if(!e)throw Error(`useZamaSDK must be used within a <ZamaProvider>. Wrap your component tree in <ZamaProvider config={createConfig(...)}>.`);return e}function Se(){return F(ae(U()))}function W(e){return I({...e,queryKeyHashFn:p})}function G(e){return R({...e,queryKeyHashFn:p})}function K(e){return ye(t=>e.onWalletAccountChange(t),()=>e.signer?.walletAccount.getSnapshot(),()=>void 0)}function Ce(e,t){let n=U(),r=M(n,e,{walletAccount:K(n)});return W({...r,...t,enabled:r.enabled&&(t?.enabled??!1)})}function we(){return F(ue(U()))}function Te(){return F(re(U()))}function Ee(e){return F({...d(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all})}})}function De(e){let t=U();return W(f(t,e,{walletAccount:K(t)}))}function Oe(e){return F({...pe(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all}),i.client.removeQueries({queryKey:P.decryption.all})}})}function ke(e){return F({...r(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all}),i.client.removeQueries({queryKey:P.decryption.all})}})}function q(e){let t=U();return B(()=>t.createToken(e),[t,e])}function J(e){let t=U();return B(()=>t.createWrappedToken(e),[t,e])}function Ae(e,t){let{address:n,account:r}=e,{enabled:a=!0}=t??{},o=q(n),s=K(o.sdk),c=i(o,{tokenAddress:n,account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&a})}function je(e,t){let{addresses:n,account:r}=e,{enabled:i=!0}=t??{},o=U(),s=K(o),c=a(B(()=>n.map(e=>o.createToken(e)),[o,n]),{account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function Y(e,t){let n=e?t:void 0;return{wrappedContext:n,callerContext:e?n?.callerContext:t}}async function X({queryClient:e,tokenAddress:t,amount:n,mode:r}){let i=P.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 Z(e,t){for(let[n,r]of t)e.setQueryData(n,r)}function Me({optimistic:e,tokenAddress:t,queryClient:n,options:r}){return{onMutate:e?async(e,i)=>({snapshot:await X({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}=Y(e,a);try{s&&Z(n,s.snapshot)}finally{r?.onError?.(t,i,c,o)}},onSuccess:(n,i,a,o)=>{let{callerContext:s}=Y(e,a);r?.onSuccess?.(n,i,s,o),oe(o.client,t)},onSettled:(t,n,i,a,o)=>{let{callerContext:s}=Y(e,a);r?.onSettled?.(t,n,i,s,o)}}}function Ne(e,t){let n=q(e.address),r=L();return F({...ee(n),...t,onMutate:e.optimistic?async(e,i)=>({snapshot:await X({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}=Y(e.optimistic,a);try{s&&Z(r,s.snapshot)}finally{t?.onError?.(n,i,c,o)}},onSuccess:(r,i,a,o)=>{let{callerContext:s}=Y(e.optimistic,a);t?.onSuccess?.(r,i,s,o),g(o.client,n.address)},onSettled:(n,r,i,a,o)=>{let{callerContext:s}=Y(e.optimistic,a);t?.onSettled?.(n,r,i,s,o)}})}function Pe(e,t){let n=q(e);return F({...l(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),g(a.client,n.address)}})}function Fe(e,t){let n=q(e);return F({...s(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),h(a.client,n.address)}})}function Ie(e,t){let{address:n,spender:r,holder:i}=e,a=o(U(),n,{holder:i,spender:r});return W({...a,...t,enabled:(a.enabled??!0)&&(t?.enabled??!0)})}function Le(e){let{spender:t,holder:n,address:r}=e;return G(o(U(),r,{holder:n,spender:t}))}function Re(e,t){let n=J(e.address),r=L();return F({...me(n),...t,...Me({optimistic:e.optimistic,tokenAddress:n.address,queryClient:r,options:t})})}function ze(e,t){let n=J(e);return F({...j(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),v(a.client,n.address)}})}function Be(e,t){let n=J(e);return F({...A(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),v(a.client,n.address)}})}function Ve(e,t){let n=J(e);return F({...u(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function He(e,t){let n=J(e);return F({...k(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function Ue(e,t){let n=J(e);return F({...O(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function We(e,t){let n=J(e);return F({...de(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function Ge(e,t){let{address:n,owner:r}=e,i=D(U(),n,{owner:r});return W({...i,...t,enabled:(i.enabled??!0)&&(t?.enabled??!0)})}function Ke(e){let{address:t,owner:n}=e;return G(D(U(),t,{owner:n}))}function Q(){let e=U(),{data:t}=W({queryKey:P.wrappersRegistry.chainId(),queryFn:()=>e.provider.getChainId(),staleTime:3e4});return t===void 0?void 0:e.registry.getAddress(t)}function qe(e,t){let{tokenAddress:n,erc20Address:r}=e,i=U(),a=Q(),o=N(i.registry,{tokenAddress:n,erc20Address:r,registryAddress:a});return W({...o,...t,enabled:(o.enabled??!0)&&(t?.enabled??!0)})}function Je(e){let{tokenAddress:t,erc20Address:n}=e,r=U(),i=Q();return G(N(r.registry,{tokenAddress:t,erc20Address:n,registryAddress:i}))}function Ye(e,t){return W({...x(U(),e),...t})}function Xe(e){return G(x(U(),e))}function Ze(e,t){return F({...ne(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:P.delegationStatus.all})}}})}function Qe(e,t){return F({...fe(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:P.delegationStatus.all})}}})}function $e(e,t){let n=ie(U(),e);return W({...n,...t,enabled:(n.enabled??!0)&&(t?.enabled??!0)})}function et(e,t){return F({...te(q(e)),...t})}function tt(e,t){return F({...n(e),...t})}function $(e,n){let r=J(e);return F({...t(r),...n,onSuccess:(e,t,i,a)=>{n?.onSuccess?.(e,t,i,a),m(a.client,r.address)}})}function nt(e,t){return W({...y(U(),e),...t})}function rt(e){return G(y(U(),e))}function it(e,t){return W({...b(U(),e),...t})}function at(e){return G(b(U(),e))}function ot(e,t){return W({...E(U(),e),...t})}function st(e){return G(E(U(),e))}function ct(){return W(w(U(),{registryAddress:Q()}))}function lt(){return W(C(U(),{registryAddress:Q()}))}function ut({fromIndex:e,toIndex:t}){return W(T(U(),{registryAddress:Q(),fromIndex:e,toIndex:t}))}function dt({index:e}){return W(S(U(),{registryAddress:Q(),index:e}))}function ft({tokenAddress:e}){return W(c(U(),{registryAddress:Q(),tokenAddress:e}))}function pt({confidentialTokenAddress:e}){return W(he(U(),{registryAddress:Q(),confidentialTokenAddress:e}))}function mt({confidentialTokenAddress:e}){return W(ce(U(),{registryAddress:Q(),confidentialTokenAddress:e}))}function ht({page:e=1,pageSize:t=100,metadata:n=!1}={}){let r=U(),i=Q();return W(le(r.registry,{registryAddress:i,page:e,pageSize:t,metadata:n}))}export{xe as ZamaProvider,$ as useApproveUnderlying,tt as useBatchDecryptBalancesAs,ke as useClearCredentials,Ae as useConfidentialBalance,je as useConfidentialBalances,Ie as useConfidentialIsOperator,Le as useConfidentialIsOperatorSuspense,Fe as useConfidentialSetOperator,ft as useConfidentialTokenAddress,Ne as useConfidentialTransfer,Pe as useConfidentialTransferFrom,et as useDecryptBalanceAs,Ze as useDelegateDecryption,Te as useDelegatedDecrypt,$e as useDelegationStatus,Se as useEncrypt,Ve as useFinalizeUnwrap,Ee as useGrantPermit,De as useHasPermit,nt as useIsConfidential,rt as useIsConfidentialSuspense,mt as useIsConfidentialTokenValid,it as useIsWrapper,at as useIsWrapperSuspense,ht as useListPairs,Ye as useMetadata,Xe as useMetadataSuspense,we as usePublicDecrypt,We as useResumeUnshield,Qe as useRevokeDelegation,Oe as useRevokePermits,Re as useShield,q as useToken,pt as useTokenAddress,dt as useTokenPair,lt as useTokenPairsLength,ct as useTokenPairsRegistry,ut as useTokenPairsSlice,ot as useTotalSupply,st as useTotalSupplySuspense,Ge as useUnderlyingAllowance,Ke as useUnderlyingAllowanceSuspense,He as useUnshield,Ue as useUnshieldAll,ze as useUnwrap,Be as useUnwrapAll,Ce as useUserDecrypt,J as useWrappedToken,qe as useWrapperDiscovery,Je as useWrapperDiscoverySuspense,Q as useWrappersRegistryAddress,U as useZamaSDK};
1
+ "use client";import{ZamaSDK as e}from"@zama-fhe/sdk";import{approveUnderlyingMutationOptions as t,batchDecryptBalancesAsMutationOptions as n,clearCredentialsMutationOptions as r,confidentialBalanceQueryOptions as i,confidentialBalancesQueryOptions as a,confidentialIsOperatorQueryOptions as o,confidentialSetOperatorMutationOptions as s,confidentialTokenAddressQueryOptions as c,confidentialTransferFromMutationOptions as l,confidentialTransferMutationOptions as ee,decryptBalanceAsMutationOptions as te,delegateDecryptionMutationOptions as ne,delegatedDecryptMutationOptions as re,delegationStatusQueryOptions as ie,encryptMutationOptions as ae,finalizeUnwrapMutationOptions as u,grantPermitMutationOptions as d,hasPermitQueryOptions as f,hashFn as p,invalidateAfterApproveUnderlying as m,invalidateAfterSetOperator as h,invalidateAfterShield as oe,invalidateAfterTransfer as g,invalidateAfterUnshield as _,invalidateAfterUnwrap as v,invalidateWalletLifecycleQueries as se,isConfidentialQueryOptions as y,isConfidentialTokenValidQueryOptions as ce,isWrapperQueryOptions as b,listPairsQueryOptions as le,publicDecryptMutationOptions as ue,resumeUnshieldMutationOptions as de,revokeDelegationMutationOptions as fe,revokePermitsMutationOptions as pe,shieldMutationOptions as me,tokenAddressQueryOptions as he,tokenMetadataQueryOptions as x,tokenPairQueryOptions as S,tokenPairsLengthQueryOptions as C,tokenPairsQueryOptions as w,tokenPairsSliceQueryOptions as T,totalSupplyQueryOptions as E,underlyingAllowanceQueryOptions as D,unshieldAllMutationOptions as O,unshieldMutationOptions as k,unwrapAllMutationOptions as A,unwrapMutationOptions as j,userDecryptQueryOptions as M,wrapperDiscoveryQueryOptions as N,zamaQueryKeys as P}from"@zama-fhe/sdk/query";import{useMutation as F,useQuery as I,useQueryClient as L,useSuspenseQuery as R}from"@tanstack/react-query";import{createContext as ge,useContext as _e,useEffect as z,useMemo as B,useRef as ve,useSyncExternalStore as ye}from"react";import{jsx as be}from"react/jsx-runtime";const V=ge(null);function H(e){e.permits.warmKeypair().catch(e=>{console.warn(`[zama-sdk] warm keypair failed:`,e)})}function xe({children:t,config:n}){let r=L(),i=ve(n.onEvent);z(()=>{i.current=n.onEvent});let a=B(()=>new e({...n,onEvent:i.current}),[n]);return z(()=>(H(a),a.onWalletAccountChange(({previous:e})=>{e&&se(r),H(a)})),[a,r]),z(()=>()=>a.dispose(),[a]),be(V.Provider,{value:a,children:t})}function U(){let e=_e(V);if(!e)throw Error(`useZamaSDK must be used within a <ZamaProvider>. Wrap your component tree in <ZamaProvider config={createConfig(...)}>.`);return e}function Se(){return F(ae(U()))}function W(e){return I({...e,queryKeyHashFn:p})}function G(e){return R({...e,queryKeyHashFn:p})}function K(e){return ye(t=>e.onWalletAccountChange(t),()=>e.signer?.walletAccount.getSnapshot(),()=>void 0)}function Ce(e,t){let n=U(),r=M(n,e,{walletAccount:K(n)});return W({...r,...t,enabled:r.enabled&&(t?.enabled??!1)})}function we(){return F(ue(U()))}function Te(){return F(re(U()))}function Ee(e){return F({...d(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all})}})}function De(e,t){let n=U(),r=f(n,e,{walletAccount:K(n)});return W({...r,...t,enabled:(r.enabled??!0)&&(t?.enabled??!0)})}function Oe(e){return F({...pe(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all}),i.client.removeQueries({queryKey:P.decryption.all})}})}function ke(e){return F({...r(U()),...e,onSuccess:(t,n,r,i)=>{e?.onSuccess?.(t,n,r,i),i.client.removeQueries({queryKey:P.hasPermit.all}),i.client.removeQueries({queryKey:P.decryption.all})}})}function q(e){let t=U();return B(()=>t.createToken(e),[t,e])}function J(e){let t=U();return B(()=>t.createWrappedToken(e),[t,e])}function Ae(e,t){let{address:n,account:r}=e,{enabled:a=!0}=t??{},o=q(n),s=K(o.sdk),c=i(o,{tokenAddress:n,account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&a})}function je(e,t){let{addresses:n,account:r}=e,{enabled:i=!0}=t??{},o=U(),s=K(o),c=a(B(()=>n.map(e=>o.createToken(e)),[o,n]),{account:r},{walletAccount:s});return W({...c,...t,enabled:!!c.enabled&&i})}function Y(e,t){let n=e?t:void 0;return{wrappedContext:n,callerContext:e?n?.callerContext:t}}async function X({queryClient:e,tokenAddress:t,amount:n,mode:r}){let i=P.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 Z(e,t){for(let[n,r]of t)e.setQueryData(n,r)}function Me({optimistic:e,tokenAddress:t,queryClient:n,options:r}){return{onMutate:e?async(e,i)=>({snapshot:await X({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}=Y(e,a);try{s&&Z(n,s.snapshot)}finally{r?.onError?.(t,i,c,o)}},onSuccess:(n,i,a,o)=>{let{callerContext:s}=Y(e,a);r?.onSuccess?.(n,i,s,o),oe(o.client,t)},onSettled:(t,n,i,a,o)=>{let{callerContext:s}=Y(e,a);r?.onSettled?.(t,n,i,s,o)}}}function Ne(e,t){let n=q(e.address),r=L();return F({...ee(n),...t,onMutate:e.optimistic?async(e,i)=>({snapshot:await X({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}=Y(e.optimistic,a);try{s&&Z(r,s.snapshot)}finally{t?.onError?.(n,i,c,o)}},onSuccess:(r,i,a,o)=>{let{callerContext:s}=Y(e.optimistic,a);t?.onSuccess?.(r,i,s,o),g(o.client,n.address)},onSettled:(n,r,i,a,o)=>{let{callerContext:s}=Y(e.optimistic,a);t?.onSettled?.(n,r,i,s,o)}})}function Pe(e,t){let n=q(e);return F({...l(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),g(a.client,n.address)}})}function Fe(e,t){let n=q(e);return F({...s(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),h(a.client,n.address)}})}function Ie(e,t){let{address:n,spender:r,holder:i}=e,a=o(U(),n,{holder:i,spender:r});return W({...a,...t,enabled:(a.enabled??!0)&&(t?.enabled??!0)})}function Le(e){let{spender:t,holder:n,address:r}=e;return G(o(U(),r,{holder:n,spender:t}))}function Re(e,t){let n=J(e.address),r=L();return F({...me(n),...t,...Me({optimistic:e.optimistic,tokenAddress:n.address,queryClient:r,options:t})})}function ze(e,t){let n=J(e);return F({...j(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),v(a.client,n.address)}})}function Be(e,t){let n=J(e);return F({...A(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),v(a.client,n.address)}})}function Ve(e,t){let n=J(e);return F({...u(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function He(e,t){let n=J(e);return F({...k(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function Ue(e,t){let n=J(e);return F({...O(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function We(e,t){let n=J(e);return F({...de(n),...t,onSuccess:(e,r,i,a)=>{t?.onSuccess?.(e,r,i,a),_(a.client,n.address)}})}function Ge(e,t){let{address:n,owner:r}=e,i=D(U(),n,{owner:r});return W({...i,...t,enabled:(i.enabled??!0)&&(t?.enabled??!0)})}function Ke(e){let{address:t,owner:n}=e;return G(D(U(),t,{owner:n}))}function Q(){let e=U(),{data:t}=W({queryKey:P.wrappersRegistry.chainId(),queryFn:()=>e.provider.getChainId(),staleTime:3e4});return t===void 0?void 0:e.registry.getAddress(t)}function qe(e,t){let{tokenAddress:n,erc20Address:r}=e,i=U(),a=Q(),o=N(i.registry,{tokenAddress:n,erc20Address:r,registryAddress:a});return W({...o,...t,enabled:(o.enabled??!0)&&(t?.enabled??!0)})}function Je(e){let{tokenAddress:t,erc20Address:n}=e,r=U(),i=Q();return G(N(r.registry,{tokenAddress:t,erc20Address:n,registryAddress:i}))}function Ye(e,t){return W({...x(U(),e),...t})}function Xe(e){return G(x(U(),e))}function Ze(e,t){return F({...ne(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:P.delegationStatus.all})}}})}function Qe(e,t){return F({...fe(U(),e),...t,onSuccess:(e,n,r,i)=>{try{t?.onSuccess?.(e,n,r,i)}finally{i.client.invalidateQueries({queryKey:P.delegationStatus.all})}}})}function $e(e,t){let n=ie(U(),e);return W({...n,...t,enabled:(n.enabled??!0)&&(t?.enabled??!0)})}function et(e,t){return F({...te(q(e)),...t})}function tt(e,t){return F({...n(e),...t})}function $(e,n){let r=J(e);return F({...t(r),...n,onSuccess:(e,t,i,a)=>{n?.onSuccess?.(e,t,i,a),m(a.client,r.address)}})}function nt(e,t){return W({...y(U(),e),...t})}function rt(e){return G(y(U(),e))}function it(e,t){return W({...b(U(),e),...t})}function at(e){return G(b(U(),e))}function ot(e,t){return W({...E(U(),e),...t})}function st(e){return G(E(U(),e))}function ct(){return W(w(U(),{registryAddress:Q()}))}function lt(){return W(C(U(),{registryAddress:Q()}))}function ut({fromIndex:e,toIndex:t}){return W(T(U(),{registryAddress:Q(),fromIndex:e,toIndex:t}))}function dt({index:e}){return W(S(U(),{registryAddress:Q(),index:e}))}function ft({tokenAddress:e}){return W(c(U(),{registryAddress:Q(),tokenAddress:e}))}function pt({confidentialTokenAddress:e}){return W(he(U(),{registryAddress:Q(),confidentialTokenAddress:e}))}function mt({confidentialTokenAddress:e}){return W(ce(U(),{registryAddress:Q(),confidentialTokenAddress:e}))}function ht({page:e=1,pageSize:t=100,metadata:n=!1}={}){let r=U(),i=Q();return W(le(r.registry,{registryAddress:i,page:e,pageSize:t,metadata:n}))}export{xe as ZamaProvider,$ as useApproveUnderlying,tt as useBatchDecryptBalancesAs,ke as useClearCredentials,Ae as useConfidentialBalance,je as useConfidentialBalances,Ie as useConfidentialIsOperator,Le as useConfidentialIsOperatorSuspense,Fe as useConfidentialSetOperator,ft as useConfidentialTokenAddress,Ne as useConfidentialTransfer,Pe as useConfidentialTransferFrom,et as useDecryptBalanceAs,Ze as useDelegateDecryption,Te as useDelegatedDecrypt,$e as useDelegationStatus,Se as useEncrypt,Ve as useFinalizeUnwrap,Ee as useGrantPermit,De as useHasPermit,nt as useIsConfidential,rt as useIsConfidentialSuspense,mt as useIsConfidentialTokenValid,it as useIsWrapper,at as useIsWrapperSuspense,ht as useListPairs,Ye as useMetadata,Xe as useMetadataSuspense,we as usePublicDecrypt,We as useResumeUnshield,Qe as useRevokeDelegation,Oe as useRevokePermits,Re as useShield,q as useToken,pt as useTokenAddress,dt as useTokenPair,lt as useTokenPairsLength,ct as useTokenPairsRegistry,ut as useTokenPairsSlice,ot as useTotalSupply,st as useTotalSupplySuspense,Ge as useUnderlyingAllowance,Ke as useUnderlyingAllowanceSuspense,He as useUnshield,Ue as useUnshieldAll,ze as useUnwrap,Be as useUnwrapAll,Ce as useUserDecrypt,J as useWrappedToken,qe as useWrapperDiscovery,Je as useWrapperDiscoverySuspense,Q 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","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/decrypt/use-user-decrypt.ts","../src/decrypt/use-public-decrypt.ts","../src/decrypt/use-delegated-decrypt.ts","../src/permits/use-grant-permit.ts","../src/permits/use-has-permit.ts","../src/permits/use-revoke-permits.ts","../src/permits/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/delegations/use-delegate-decryption.ts","../src/delegations/use-revoke-delegation.ts","../src/delegations/use-delegation-status.ts","../src/delegations/use-decrypt-balance-as.ts","../src/delegations/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 { ZamaSDK, type ZamaConfig } 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\nfunction warmKeypair(sdk: ZamaSDK): void {\n void sdk.permits.warmKeypair().catch((error: unknown) => {\n // Warmup is a latency optimization — the first real permit/decrypt call\n // will lazily retry keypair generation and surface actionable errors.\n // We still log so persistent failures (storage corruption, relayer 4xx\n // during keypair generation) leave a breadcrumb during debugging.\n // oxlint-disable-next-line no-console\n console.warn(\"[zama-sdk] warm keypair failed:\", error);\n });\n}\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 // Keypair warming may touch `new Worker(...)` (web() relayer), which is\n // undefined during SSR. Driving warmup from a client-only useEffect rather\n // than the SDK constructor keeps server-rendered trees free of browser-only\n // infrastructure. Non-React framework adapters need to mirror this contract:\n // call `sdk.permits.warmKeypair()` on mount and on every\n // `onWalletAccountChange` — the SDK no longer warms itself.\n useEffect(() => {\n warmKeypair(sdk);\n return sdk.onWalletAccountChange(({ previous }) => {\n if (previous) {\n invalidateWalletLifecycleQueries(queryClient);\n }\n warmKeypair(sdk);\n });\n }, [sdk, queryClient]);\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...\");\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 } from \"@zama-fhe/sdk/query\";\nimport { userDecryptQueryOptions } from \"@zama-fhe/sdk/query\";\nimport type { EncryptedInput } from \"@zama-fhe/sdk/query/user-decrypt\";\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 encryptedInputs: EncryptedInput[],\n options?: Omit<UseQueryOptions<DecryptResult>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n const queryOpts = userDecryptQueryOptions(sdk, encryptedInputs, {\n walletAccount,\n });\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 { EncryptedValue, 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, EncryptedValue[]>(\n publicDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { ClearValue, EncryptedValue } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport {\n delegatedDecryptMutationOptions,\n type DelegatedDecryptMutationParams,\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 DelegatedDecryptMutationParams}.\n *\n * @example\n * ```tsx\n * const decrypt = useDelegatedDecrypt();\n * decrypt.mutate({ encryptedInputs: [{ encryptedValue: \"0xHandle1\", contractAddress: \"0x...\" }], delegatorAddress: \"0x...\" });\n * // decrypt.data => { \"0xHandle1\": 1000n }\n * ```\n */\nexport function useDelegatedDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<Record<EncryptedValue, ClearValue>, Error, DelegatedDecryptMutationParams>(\n delegatedDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { grantPermitMutationOptions, 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: grantPermit, isPending } = useGrantPermit();\n *\n * // Authorize decryption for any contracts with encrypted state:\n * // confidential tokens, auction contracts, governance contracts, etc.\n * await grantPermit([tokenAddress, auctionAddress, governanceAddress]);\n * ```\n */\nexport function useGrantPermit(options?: UseMutationOptions<void, Error, Address[]>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[]>({\n ...grantPermitMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.hasPermit.all });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"../utils/query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { hasPermitQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/** Configuration for {@link useHasPermit}. */\nexport interface UseHasPermitConfig {\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 if the query runs without a signer configured (the `enabled` guard normally\n * prevents this; only reachable if the caller forces `query: { enabled: true }`). {@link SignerNotConfiguredError}\n *\n * @example\n * ```tsx\n * const { data: hasPermit } = useHasPermit({ contractAddresses: [\"0xToken\"] });\n * ```\n */\nexport function useHasPermit(config: UseHasPermitConfig) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n return useQuery<boolean>(hasPermitQueryOptions(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.hasPermit.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.hasPermit.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 encrypted\n * value and decrypts via the SDK; cached clear values are returned instantly\n * and the relayer is only hit when the encrypted value 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 TransactionRevertedError} — approval or 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 * if (!event?.unwrapRequestId) throw new Error(\"UnwrapRequested event missing\");\n * finalize.mutate({ unwrapRequestId: event.unwrapRequestId });\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 contract. Pass `undefined` to disable the query. */\n contractAddress: 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 `{ isActive, expiryTimestamp, isLoading, error }`.\n *\n * @example\n * ```tsx\n * const { data } = useDelegationStatus({\n * contractAddress: \"0xToken\",\n * delegatorAddress: \"0xDelegator\",\n * delegateAddress: \"0xDelegate\",\n * });\n * // data?.isActive, 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 *\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 *\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","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/decrypt/use-user-decrypt.ts","../src/decrypt/use-public-decrypt.ts","../src/decrypt/use-delegated-decrypt.ts","../src/permits/use-grant-permit.ts","../src/permits/use-has-permit.ts","../src/permits/use-revoke-permits.ts","../src/permits/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/delegations/use-delegate-decryption.ts","../src/delegations/use-revoke-delegation.ts","../src/delegations/use-delegation-status.ts","../src/delegations/use-decrypt-balance-as.ts","../src/delegations/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 { ZamaSDK, type ZamaConfig } 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\nfunction warmKeypair(sdk: ZamaSDK): void {\n void sdk.permits.warmKeypair().catch((error: unknown) => {\n // Warmup is a latency optimization — the first real permit/decrypt call\n // will lazily retry keypair generation and surface actionable errors.\n // We still log so persistent failures (storage corruption, relayer 4xx\n // during keypair generation) leave a breadcrumb during debugging.\n // oxlint-disable-next-line no-console\n console.warn(\"[zama-sdk] warm keypair failed:\", error);\n });\n}\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 // Keypair warming may touch `new Worker(...)` (web() relayer), which is\n // undefined during SSR. Driving warmup from a client-only useEffect rather\n // than the SDK constructor keeps server-rendered trees free of browser-only\n // infrastructure. Non-React framework adapters need to mirror this contract:\n // call `sdk.permits.warmKeypair()` on mount and on every\n // `onWalletAccountChange` — the SDK no longer warms itself.\n useEffect(() => {\n warmKeypair(sdk);\n return sdk.onWalletAccountChange(({ previous }) => {\n if (previous) {\n invalidateWalletLifecycleQueries(queryClient);\n }\n warmKeypair(sdk);\n });\n }, [sdk, queryClient]);\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...\");\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 } from \"@zama-fhe/sdk/query\";\nimport { userDecryptQueryOptions } from \"@zama-fhe/sdk/query\";\nimport type { EncryptedInput } from \"@zama-fhe/sdk/query/user-decrypt\";\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 encryptedInputs: EncryptedInput[],\n options?: Omit<UseQueryOptions<DecryptResult>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n const queryOpts = userDecryptQueryOptions(sdk, encryptedInputs, {\n walletAccount,\n });\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 { EncryptedValue, 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, EncryptedValue[]>(\n publicDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport type { ClearValue, EncryptedValue } from \"@zama-fhe/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport {\n delegatedDecryptMutationOptions,\n type DelegatedDecryptMutationParams,\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 DelegatedDecryptMutationParams}.\n *\n * @example\n * ```tsx\n * const decrypt = useDelegatedDecrypt();\n * decrypt.mutate({ encryptedInputs: [{ encryptedValue: \"0xHandle1\", contractAddress: \"0x...\" }], delegatorAddress: \"0x...\" });\n * // decrypt.data => { \"0xHandle1\": 1000n }\n * ```\n */\nexport function useDelegatedDecrypt() {\n const sdk = useZamaSDK();\n return useMutation<Record<EncryptedValue, ClearValue>, Error, DelegatedDecryptMutationParams>(\n delegatedDecryptMutationOptions(sdk),\n );\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { grantPermitMutationOptions, 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: grantPermit, isPending } = useGrantPermit();\n *\n * // Authorize decryption for any contracts with encrypted state:\n * // confidential tokens, auction contracts, governance contracts, etc.\n * await grantPermit([tokenAddress, auctionAddress, governanceAddress]);\n * ```\n */\nexport function useGrantPermit(options?: UseMutationOptions<void, Error, Address[]>) {\n const sdk = useZamaSDK();\n\n return useMutation<void, Error, Address[]>({\n ...grantPermitMutationOptions(sdk),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n options?.onSuccess?.(data, variables, onMutateResult, context);\n context.client.removeQueries({ queryKey: zamaQueryKeys.hasPermit.all });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"../utils/query\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Address } from \"@zama-fhe/sdk\";\nimport { hasPermitQueryOptions } from \"@zama-fhe/sdk/query\";\nimport { useZamaSDK } from \"../provider\";\nimport { useWalletAccount } from \"../utils/wallet-account\";\n\n/** Configuration for {@link useHasPermit}. */\nexport interface UseHasPermitConfig {\n /** Contract addresses to check credentials against. */\n contractAddresses: Address[];\n}\n\n/**\n * Check whether stored permits cover the given contract addresses for the\n * connected signer.\n *\n * @param config - Contract addresses to check credentials against. The query is\n * disabled while the list is empty or no signer is configured.\n * @param options - React Query options (forwarded to `useQuery`).\n * @returns Query result with `data: boolean`.\n *\n * @example\n * ```tsx\n * const { data: hasPermit } = useHasPermit({ contractAddresses: [\"0xToken\"] });\n * ```\n */\nexport function useHasPermit(\n config: UseHasPermitConfig,\n options?: Omit<UseQueryOptions<boolean>, \"queryKey\" | \"queryFn\">,\n) {\n const sdk = useZamaSDK();\n const walletAccount = useWalletAccount(sdk);\n const baseOpts = hasPermitQueryOptions(sdk, config, { walletAccount });\n\n return useQuery<boolean>({\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 { 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.hasPermit.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.hasPermit.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 encrypted\n * value and decrypts via the SDK; cached clear values are returned instantly\n * and the relayer is only hit when the encrypted value 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 TransactionRevertedError} — approval or 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 * if (!event?.unwrapRequestId) throw new Error(\"UnwrapRequested event missing\");\n * finalize.mutate({ unwrapRequestId: event.unwrapRequestId });\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 contract. Pass `undefined` to disable the query. */\n contractAddress: 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 `{ isActive, expiryTimestamp, isLoading, error }`.\n *\n * @example\n * ```tsx\n * const { data } = useDelegationStatus({\n * contractAddress: \"0xToken\",\n * delegatorAddress: \"0xDelegator\",\n * delegateAddress: \"0xDelegate\",\n * });\n * // data?.isActive, 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 *\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 *\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.1.0-alpha.2",
3
+ "version": "3.1.0-alpha.4",
4
4
  "description": "React hooks for Zama SDK",
5
5
  "license": "BSD-3-Clause-Clear",
6
6
  "author": "Zama",
@@ -62,7 +62,7 @@
62
62
  },
63
63
  "peerDependencies": {
64
64
  "@tanstack/react-query": ">=5",
65
- "@zama-fhe/sdk": "^3.1.0-alpha.2",
65
+ "@zama-fhe/sdk": "^3.1.0-alpha.4",
66
66
  "react": ">=18",
67
67
  "viem": ">=2",
68
68
  "wagmi": ">=2"