Private Pay pays a merchant from a disposable address created for that one payment, so the merchant never sees your main wallet, balance or history. Every spend is gated by a 2-of-2: your signature and an enclave co-signer (“The Machine”) that vetoes a drainer, a lookalike, or an over-policy spend. A veto is not a warning; it withholds the second signature, so the payment is impossible.

The flow

1

The Machine checks first

Ask the co-signer to authorize the spend on the predicted address, before anything is created. A veto here means nothing is deployed and no funds ever move.
2

Create the disposable address

The account is a minimal-proxy clone at a deterministic address bound to owner, so it can be funded before it exists and no one can front-run its slot.
3

Fund it

Move USDC into the disposable address. In production this leg is confidential (Arc Privacy Sector); today it is a plain transfer.
On Arc a USDC ERC-20 transfer moves native balance, so the account and vault implement receive(). This is handled by the deployed contracts.
4

Pay

You sign the same struct hash the co-signer signed (nonce 0), then submit both signatures. The funds can only reach the locked target, so anyone may submit.
The merchant receives USDC from a zero-history address. Your vault stays private.

One call

For a straightforward push payment you can skip the manual steps with settlePrivatePayment, which reads the account, runs the co-signer, signs and submits:

Recovery and refunds

The disposable address is a one-way valve: funds can only go to the locked merchant or back to your vault.
  • Enclave down / abandoned: after expiry, anyone may call sweepExpired to return the balance to the vault. No co-signer needed.
  • Refund: the merchant refunds to the disposable address; sweepExpired sweeps it home.
  • Cancel early: the owner can sweepToVault(account) any time.

Next