useWithdrawTokenFee
Fee-collector: withdraw accumulated encrypted token fees.
@tokenops/sdk/fhe-disperse/react{ mutate, mutateAsync, isPending, error, data }Description
Fee-collector: withdraw accumulated encrypted token fees. Pass either a
plaintext amount (SDK encrypts) or a pre-encrypted encryptedInput —
never both. The contract caps the withdrawal at the available reserve via
FHE.min.
Returns { hash, transferredHandle } parsed from the TokenFeeWithdrawn
event. The handle is decryptable by the caller via Zama's userDecrypt
and reveals the actual transferred amount, which may be less than the
requested amount when the reserve was lower.
Encryptor resolution (plaintext path only). Pass encryptor per-call,
or supply it at hook construction via DisperseHookOptions.encryptor.
If neither is present, the SDK throws Missing encryptor — pass encryptor…
verbatim.
Requires FEE_COLLECTOR_ROLE.
Signature
function useWithdrawTokenFee(options?: DisperseHookOptions): UseMutationResult<WithdrawTokenFeeResult, Error, UseWithdrawTokenFeeArgs>;Parameters
Shape of the object you pass to .mutate(args) is the SDK type UseWithdrawTokenFeeArgs. Inspect the type for the full shape (discriminated unions collapse to a tagged variant at call time).
Examples
function Component() {
const zamaSDK = useZamaSDK();
const withdraw = useWithdrawTokenFee({ encryptor: () => zamaSDK.relayer });
withdraw.mutate({ token, to: collector, amount: 1_000_000n });
}// Pre-encrypted path — no encryptor needed at call time.
withdraw.mutate({ token, to: collector, encryptedInput });Pulled directly from the hook's TSDoc blocks — the same snippet your IDE shows on hover.
Errors
This mutation can reject with SDK-level, product-level, or viem-passthrough errors. Product classes carry the offending value as fields — render them inline instead of a generic "transaction failed." See Disperse › Errors for the per-class recovery table.
Invalidation recipe
After this mutation succeeds, invalidate the queries it affects so consumer UI re-fetches fresh state. The SDK never auto-invalidates — that's a consumer decision (different apps cache different shapes).
import { useQueryClient } from "@tanstack/react-query";
const queryClient = useQueryClient();
const withdrawTokenFee = useWithdrawTokenFee(/* options */);
withdrawTokenFee.mutate(args, {
onSuccess() {
// Coarse invalidation: refresh every cached read on this product surface.
queryClient.invalidateQueries({
queryKey: ["tokenops-sdk", "fhe-disperse"],
});
},
});See also
Other Recovery · pause / withdraw hooks in disperse:
useIsPausedRead the singleton's paused flag.useRecoverFromWalletsRecover residual confidential ERC-7984 tokens from the caller's registered wallets to to.useRecoverERC20FromWalletsRecover ERC-20 tokens accidentally sent to the caller's registered wallets.usePauseAdmin: pause all disperse operations on the singleton.