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.
Roles · RBACuseMutation

useFactoryRevokeRole

Revoke one factory role from one holder.

Import
@tokenops/sdk/fhe-airdrop/advanced/react
Return
{ mutate, mutateAsync, isPending, error, data }
Lifecycle
Roles · RBAC

Description

Revoke one factory role from one holder.

Requires DEFAULT_ADMIN_ROLE, which administers all five factory roles.

`DEFAULT_ADMIN_ROLE` is floored at one live member. Revoking the last holder reverts LastAdmin, so role administration can never be frozen. Granting the role to the zero address reverts ZeroAdminGrant, so the floor cannot be satisfied with a member nobody controls either.

On Sepolia all five roles sit on the deployer account; on mainnet DEFAULT_ADMIN_ROLE is separate (see FACTORY_ROLE_CONCENTRATION_NOTE). Either way a DEFAULT_ADMIN_ROLE handover is two steps: grant the successor, then revoke. Show useFactoryRoleMembers's count next to the button and disable it at 1n.

Invalidates: this factory's useFactoryHasRole entry for exactly (role, holder) and its useFactoryRoleMembers entry for role. Keyed off variables.holder, never the sending account.

Signature

@tokenops/sdk/fhe-airdrop/advanced/react
ts
function useFactoryRevokeRole(options?: AirdropClientOptions): UseMutationResult<Hex, Error, FactoryRevokeRoleArgs>;

Parameters

Shape of the object you pass to .mutate(args) is the SDK type FactoryRevokeRoleArgs. 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 useFactoryRevokeRole; pick another from the dropdown if you'd rather start there.

Example

@tokenops/sdk/fhe-airdrop/advanced/react · @example
tsx
const revoke = useFactoryRevokeRole();
await revoke.mutateAsync({ role: roles.IMPL_MANAGER_ROLE, holder: formerOpsAddress });

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 factoryRevokeRole = useFactoryRevokeRole(/* options */);

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

See also

Other Roles · RBAC hooks in airdrop v2: