Skip to main content
Confidential Payroll lets a paying entity disburse to many recipients, across many chains, as a single batch of intents. Each recipient receives funds at a fresh stealth address on the chain they prefer. Amounts, recipient identities, and the relationship between payer and payee stay confidential. Live on testnet.
Live on testnet. Mainnet coming soon.

Where it fits

  • Contributor payouts, pay 50 contributors across 6 chains in one signed batch
  • Vesting unlocks, recurring releases without exposing per-recipient amounts
  • Token grants, grant programs where individual recipient amounts must stay private

How it works (integrator view)

The payer constructs a batch of intents, one per recipient. The batch is signed once and submitted. Tachyon picks each intent up independently; solvers fulfill them in parallel. Each intent settles at its own destination chain to the recipient’s stealth address.

What’s confidential

  • Per-recipient amounts, even other recipients in the same batch cannot see what anyone else received
  • The identity of recipients
  • The destination chain of each delivery
  • The link between the payer and any specific recipient
What’s necessarily public: the fact that the payer ran a payroll batch (their on-chain action is visible on the source chain), and that some addresses received funds on destination chains. The link between those facts is not revealed.

Integration shape

const batch = await Promise.all(
  contributors.map((c) =>
    tachyon.intent.build({
      sourceChain: "arbitrum",
      destChain: c.preferredChain,
      tokenIn: USDC_ARB,
      tokenOut: c.preferredAsset,
      amountIn: c.amountUsdc,
      minAmountOut: applySlippage(c.amountUsdc, 0.01),
      deadline: now() + 3600,
      recipient: c.address,
      metadata: { payrollPeriod: "2026-04" }, // off-chain only
    })
  )
);

const signed = await wallet.signBatch(batch);
const { intentIds } = await tachyon.intent.submitBatch(signed);
Today, the payroll product loops createIntent calls for each contributor. An atomic batched-intent contract path is planned so the whole batch can land in a single on-chain transaction.

Recurring payouts

For monthly or biweekly payroll, schedule the batch from your own backend on a cron. Each cycle is an independent batch, there is no on-chain “stream” object, which keeps confidentiality maximal: the on-chain footprint of cycle N reveals nothing about cycle N+1.
If you want recipients to confirm receipt, send each one a settlement reference (intent ID + destination tx hash) over your own channel, email, Slack, or in-app notification. Recipients can verify receipt with their viewing key.

Compliance and selective disclosure

The payer can grant their finance team or auditor scoped viewing access to the entire batch, or to a single intent within it, without making any data public. See compliance and selective disclosure and the viewing-permissions guide.

Try it

Payroll integration guide

Step-by-step batch payout integration on testnet.