Product · Disperse

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

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.