target and cap: the co-signer can only push
the exact payment you set up, never steal or redirect. Your sole on-chain action
is a normal, readable USDC transfer to fund the account.
Full payer privacy is not delivered today. The funding transfer (your wallet to
the ephemeral account) is a normal transfer on a transparent chain, so an observer
can still trace you to the ephemeral address through it. Hiding that link and the
amounts requires Arc Privacy Sector confidential transfers, which are on the
roadmap and not live yet. What is delivered now: the account surface reveals
nothing about you.
The flow
1
The Machine checks first
Pre-flight the firewall on the intended merchant, before anything is created. A
veto here means nothing is deployed and no funds ever move.
precheck runs before the address is even derived, because the derivation commits
to the policy: a box’s address is a hash of the owner, the salt and every policy
field. There is nothing to predict until the target is settled, and nothing worth
predicting for a target The Machine will refuse.2
Create the disposable address
ownerHash, your salt and a hash of every policy field, so the address
is bound to the policy rather than to your address or to msg.sender: it can be
funded before it exists, nobody can front-run its slot, and a different target or
cap is simply a different address. Anyone may submit createEphemeral, so an
integrator can deploy through a relayer to keep you off the deployment transaction
entirely.3
Fund it
Move USDC into the disposable address. In production this leg is confidential
(Arc Privacy Sector); today it is a plain transfer.
fundEphemeral re-reads the deployed policy and compares every field before it
transfers, then throws rather than paying into a box that does not match. Use it
instead of a bare ERC-20 transfer: a transfer to an address that already exists
always succeeds, so the direct path skips the check silently.On Arc a USDC ERC-20 transfer moves native balance, so the account and vault
implement receive(). The deployed contracts handle that.4
Pay
Read the account’s on-chain policy, ask the co-signer to authorize the spend, then
submit its signature alone. You sign nothing here. The funds can only reach the
locked The merchant receives USDC from a zero-history address. The account itself reveals
nothing about you.
target, so anyone may submit the transaction.One call
For a straightforward push payment you can skip the manual steps withsettlePrivatePayment, 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. Both sweeps requiremsg.sender == vault and that the address match the account’s
stored vaultHash. No signature is involved, and the vault stays hidden until it
sweeps. Because the vault has to send the transaction, bind the box to an address
you can transact from: above, that is the payer’s own wallet.
- Enclave down / abandoned: after
expiry, the vault callssweepExpired(vault)and the balance comes home. No co-signer needed. - Refund: the merchant refunds to the disposable address; a sweep takes it home.
- Cancel early: call
sweepToVault(vault)any time.
Next
- Run the guard server-side: The co-signer.
- Understand the model: Payer-side shield.