2.0 RC docsView 1.x docs
v2.0.0-rc.1 release candidate
The API is frozen and later candidates carry fixes only, except the receipt-free and Safe create surface of /fhe-airdrop, which is @beta. Published on the next dist-tag; latest stays on 1.6.0 until 2.0.0.
Recovery · pause / withdrawuseMutationencrypts input

useWithdrawTokenFee

Fee-collector: withdraw accumulated encrypted token fees.

Import
@tokenops/sdk/fhe-disperse/react
Return
{ mutate, mutateAsync, isPending, error, data }
Lifecycle
Recovery · pause / withdraw

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.

Amount units: TokenOps confidential (ERC-7984) tokens use a 6-decimals convention (1 token = 1_000_000 base units), not the 18 decimals typical of ERC-20. Amount parameters are base units of the token's actual decimals: for the CTTT test token (6 decimals) 1_000_000n = 1 CTTT, while the transparent TTT test token uses 18 decimals.

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 MissingEncryptorError (code: "TOKENOPS_MISSING_ENCRYPTOR").

Requires FEE_COLLECTOR_ROLE.

Signature

@tokenops/sdk/fhe-disperse/react
ts
function useWithdrawTokenFee(options?: DisperseHookOptions): UseMutationResult<WithdrawTokenFeeResult | PendingWithdrawTokenFeeResult, 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).

Want to run a similar shape interactively? The Playground ships 12 ready presets across vesting / airdrop / disperse / faucet — deploy a manager, create a vesting, claim, and run the product equivalents. The deep-link above auto-selects the closest preset to useWithdrawTokenFee; pick another from the dropdown if you'd rather start there.

Examples

@tokenops/sdk/fhe-disperse/react · @example
tsx
function Component() {
  const zamaSDK = useZamaSDK();
  const withdraw = useWithdrawTokenFee({ encryptor: () => zamaSDK });
  withdraw.mutate({ token, to: collector, amount: 1_000_000n });
}
@tokenops/sdk/fhe-disperse/react · @example
tsx
// 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 generic-fallback errors. Product classes carry the offending value as fields — render them inline instead of a generic "transaction failed." See Disperse 2.0 › 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).

patterns/invalidation.ts
ts
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 2.0: