Solvador

Confidential Settlement

Hide which merchant received a payment, plus revenue and balances, behind encrypted state on Base. Zero changes for payers.

Every x402 payment is normally public: anyone can read which address got paid, how much, and add it up into a live revenue feed for your business. Confidential settlement removes that surface. Payments settle into Solvador’s privacy contract on Base instead of your address, and your credit happens inside encrypted state powered by Inco Lightning. On-chain observers see a payer paying the Solvador contract. They cannot see which merchant was paid, what any merchant has earned, or what any balance holds.

The payer side is completely unchanged. Payers sign the same plain USDC authorization as any exact payment on Base, with any unmodified x402 client. Only the payTo differs.

The whole flow in one picture: the x402 handshake is standard exact, settlement is a plain USDC pull into the contract, and your credit is applied later as an encrypted batch write.

Confidential settlement runs on Base only, settles USDC via the exact scheme, and works exclusively through the Solvador facilitator. A third-party facilitator executing the same offer would transfer funds without crediting you.

What stays private, what doesn’t

Hidden on-chain: the receiving merchant of each payment, per-merchant revenue and payment counts, and merchant balances. Merchants are grouped into encrypted anonymity sets; a credit is an oblivious write that reveals nothing about which member it touched.

Still visible: the payer’s address, each payment’s amount and timing (the USDC pull into the contract is a normal transfer), and your withdrawals (plain USDC from the contract to your withdrawal address). Withdrawing round amounts on your own schedule keeps withdrawals hard to correlate with your revenue.

Enabling it

Open the Confidential tab in the dashboard and connect your withdrawal wallet on Base. Enabling assigns you an encrypted slot on-chain and takes a few seconds.

The withdrawal address is permanent. The contract rejects any attempt to reassign it, and no Solvador key can override that. It must be a wallet you hold the keys to: withdrawals are signed by this exact wallet, so exchange deposit addresses will not work. Losing the wallet means losing access to future withdrawals.

Offer modes

After enabling, pick how your 402 responses advertise the option:

  • Default: the plain offer only, straight to your address.
  • Confidential: the private variant only.
  • Both: two entries in one 402, confidential listed first. Clients pick the first entry they support, so confidential-aware clients go private and everything else keeps working.

Your resource server can follow the dashboard selection live, with no redeploys, by asking the facilitator before building each 402:

GET /confidential/status
X-API-Key: <your key>
{
  "available": true,
  "network": "eip155:8453",
  "contractAddress": "0xd40a3e9ef28e3a711b079ea4ba1fb0c7b031f7b2",
  "configured": true,
  "mode": "both",
  "enabled": true,
  "merchantAddress": "0xYourWithdrawalAddress"
}

Branch on mode. A confidential offer sets payTo to the contract and marks itself in extra:

{
  "scheme": "exact",
  "network": "eip155:8453",
  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "amount": "10000",
  "payTo": "0xd40a3e9ef28e3a711b079ea4ba1fb0c7b031f7b2",
  "extra": {
    "confidential": true,
    "merchant": "0xYourWithdrawalAddress",
    "assetTransferMethod": "eip3009"
  }
}

extra.merchant tells the facilitator whose encrypted slot to credit. It is read off-chain only and never written to the chain in plaintext. Settlement is rejected unless the merchant belongs to the API key that submits it, so another key cannot route payments into your slot, and you cannot route payments into someone else’s.

Receipts

Every confidential settlement returns a signed receipt in the settle response: the payment nonce, your merchant address, the amount, and a facilitator signature over them. Receipts are your proof of payment (the chain deliberately cannot provide one) and they are directly redeemable on-chain. If a credit were ever missing, the receipt alone claims the funds from the contract without Solvador’s cooperation. Keep them; the dashboard also stores and lists every receipt for you.

Credits and withdrawals

Credits are applied in a daily batch at 00:00 UTC. Batching is part of the privacy design: each merchant gets at most one encrypted write per day regardless of how many payments arrived, so payment patterns don’t leak through credit timing. Until the daily flush, a payment shows as pending in the dashboard; after it, the amount is available.

Withdrawals spend available balance only and are non-custodial end to end:

  1. Your wallet signs the withdrawal request. The debit is applied obliviously, so an insufficient balance reveals nothing on-chain.
  2. Your wallet decrypts the confirmation attestation in the browser. Only your wallet can.
  3. Solvador submits the finalization and pays its gas. USDC arrives at your withdrawal address.

If finalization ever stalls for 24 hours, the debit can be reversed on-chain with cancelWithdraw from your wallet. No Solvador key can pause, block, or seize withdrawals; the contract enforces that only your wallet moves your funds.

Contract

The settlement contract is deployed on Base mainnet at 0xd40a3e9ef28e3a711b079ea4ba1fb0c7b031f7b2, with source verified on Blockscout and Sourcify. Any confidential-tier fee is shown in the dashboard before you enable; the payer never pays more than the advertised price.