One-tx confidential payouts
A singleton contract per chain holds your two ERC-1167 subwallets. Pay N recipients in one tx — each amount batch-encrypted, each recipient ACL-granted. Investor B can't infer investor A's payout, even sharing the same batch.
Where to start
Aria pays three investors under NDA on Sepolia. Register subwallets, approve tokens, send the batch — every recipient ACL-granted in the same tx.
Register, approve the wallet pair, disperse to N recipients, recover + fees. Each flow lists the hooks that ship it.
Every method on the singleton client ships as a React hook. Register, fund, preflight, disperse, disclose, recover, admin.
The shape of confidential disperse
One singleton, per-user subwallets
Every chain has exactly one DisperseConfidential singleton. Registration is per-user and happens once: register() deploys two ERC-1167 clones owned by you and approves them for the token you pass. The same wallet pair serves every token afterward; approve new tokens with approveTokenOnWallets.
Batch encrypts the shape
One disperse(recipients[], handles[]) call grants ACL to N recipients in one atomic step. Each recipient sees only their own handle. Investor B cannot infer investor A's payout from the tx — the batched amounts are individually encrypted.
Preflight before you send
usePreflightDisperse runs the SDK's bounded check: registration state, subwallet operator approvals, fee + batch limits, per-recipient validation, paused state. Catches the common revert paths before you submit.
Recovery without unwinding
useRecoverFromWallets returns funds from a subwallet back to your EOA when a sender mistakenly pays a stale address. ACL is append-only — there's no rewinding — but balances reclaim cleanly.
Reference
The lookup layer. Every exported type, error class, role, event, and ABI lives in a dedicated table — copy-paste-ready, no MDX prose between you and the import.
Vanilla TS clients for non-React consumers (Node, workers, tests).
Branded ids, encrypted shapes, args, fee discriminants.
Typed error classes you can catch by reference.
On-chain events the indexer + UI should listen for.
Role constants, what each gates, how to grant.
Raw ABI exports — drop into wagmi useContractRead.