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.
WriteuseMutationencrypts input

useEncryptCampaignAmounts

Encrypt a plaintext roster into per-recipient handles, without building a tree.

Import
@tokenops/sdk/fhe-airdrop/react
Return
{ mutate, mutateAsync, isPending, error, data }
Lifecycle
Write

Description

Encrypt a plaintext roster into per-recipient handles, without building a tree. Use it to persist the ciphertexts before committing to a root; if you just want a campaign, useBuildMerkleCampaign does both stages.

A mutation rather than a query on purpose: encryption is randomised, so the same roster yields different handles every call and there is no legitimate cache identity to key. Persist what resolves — nothing here is recoverable or reproducible.

One relayer request per 32 recipients, issued concurrently; every leaf is submittable by any address. Split the roster yourself if your relayer rate-limits.

Invalidates: nothing. Pure off-chain relayer work — no contract state moves, so no cached read goes stale.

Signature

@tokenops/sdk/fhe-airdrop/react
ts
function useEncryptCampaignAmounts(options?: UseEncryptCampaignAmountsOptions): UseMutationResult<readonly EncryptedCampaignLeaf[], Error, EncryptCampaignAmountsVariables>;

Parameters

Shape of the object you pass to .mutate(args).

PropertyTypeDescription
encryptorEncryptorSourceEager or lazy encryptor. Wire it lazily so the live React context is read at submit time rather than captured at mount: const sdk = useZamaSDK() once, then encryptor: () => sdk.
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 useEncryptCampaignAmounts; pick another from the dropdown if you'd rather start there.

Example

@tokenops/sdk/fhe-airdrop/react · @example
tsx
const encrypt = useEncryptCampaignAmounts({ encryptor: () => sdk });
const leaves = await encrypt.mutateAsync({ instance: airdrop, recipients });

Pulled directly from the hook's TSDoc block — 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 Airdrop v2 › 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 encryptCampaignAmounts = useEncryptCampaignAmounts(/* options */);

encryptCampaignAmounts.mutate(args, {
  onSuccess() {
    // Coarse invalidation: refresh every cached read on this product surface.
    queryClient.invalidateQueries({
      queryKey: ["tokenops-sdk", "fhe-airdrop"],
    });
  },
});

See also

Other Write hooks in airdrop v2: