Statuschecking
ChainBase Sepoliablock
Anon set
Wallet not connected
Testing surface · v1

Test zBase with your own wallet.

Deposit, withdraw, and route x402 payments through the privacy pool against a wallet you control. Real Sepolia USDC (no real-value) — grab some from Circle's faucet in Step 2 if you need it.

Step 1

Connect a wallet

Any Base Sepolia wallet. You'll need ~0.001 ETH for gas and ~5 Sepolia USDC to run a few deposit/withdraw cycles.

Step 2

Get Sepolia USDC

Circle runs the canonical Base Sepolia USDC faucet — 10 USDC per claim, once every 12h per address. One-time Coinbase sign-in required; no payment info.

Your Sepolia USDC balance
USDC
Open Circle faucet
  • · Circle's faucet sends 10 Sepolia USDC per claim; you can claim every 12 hours per address.
  • · Requires a Coinbase sign-in (one-time). Free, no payment info needed.
  • · 1 USDC is the pool's minimum deposit, so ~5 USDC gives you several deposit/withdraw cycles to test with.
Before you deposit

What to expect on per-payment latency

Your first deposit takes longer because it includes setup. Each subsequent payment is just a proof + relay tx — much faster.

Why one big deposit, not many small ones

Deposit once. Pay many times.

Each deposit funds a shielded balance you can spend across many private payments — to x402 providers, to agents, to fresh addresses. The setup transaction is one-time per funding event. After that, every payment is just a Groth16 proof plus a relay tx — the postman wallet sends USDC to the recipient and your wallet never appears in the settle transaction.

Setup · one-time

~1525s

Deposit tx + ASP root update + first proof. Per funding event, not per payment.

Each payment

~715s

Proof + relay tx on Base Sepolia after the initial deposit. This is what your agent feels in production.

Recommended fund

~10USDC

Covers many x402 payments at the pool's 1 USDC minimum without re-funding mid-session.

Production agents deposit once at funding time, then make many fast payments. The number that matters for ongoing UX is the per-payment row, not the full first-time flow you see in the demo.

Numbers measured against the live Base Sepolia stack on 2026-06-02. Mainnet figures will land tighter once we ship past testnet. Sepolia confirmation latency varies — see the demo at /app#try for a live end-to-end measurement.

Step 3

Deposit & withdraw privately

The same flow your agents will run. Each form action mirrors as a copy-paste curl + TS + Python snippet with your actual addresses substituted.

Deposit

Add USDC to the private pool

min 1.00 USDC
Deposit equivalent
# Approve once (USDC is ERC20)
cast send 0x036CbD53842c5426634e7929541eC2318f3dCF7e \
  'approve(address,uint256)' \
  0x598ffaac79ae29b1aae571fd91899d4492183688 \
  $(cast max-uint) \
  --private-key $YOUR_PRIVATE_KEY \
  --rpc-url https://sepolia.base.org

# Then deposit
cast send 0x598ffaac79ae29b1aae571fd91899d4492183688 \
  'deposit(address,uint256,uint256)' \
  0x036CbD53842c5426634e7929541eC2318f3dCF7e \
  1000000 \
  <precommitment_uint256> \
  --gas-limit 1000000 \
  --private-key $YOUR_PRIVATE_KEY \
  --rpc-url https://sepolia.base.org

# Precommitment = Poseidon(2)([nullifier, secret])
# Use @zbase-protocol/core's computePrecommitment() — see TS tab.
Your deposits (0)

Stored locally in this browser

No deposits yet. Make one above to enable withdrawals.
Withdraw

Settle to any address — privately

The pool pays the recipient. Your wallet is not in the relay tx. Pick a deposit above, set the recipient, sign nothing — the postman relays for you.

Withdraw equivalent
# /api/withdraw runs the proof + relay server-side. Body:
curl -X POST https://zbase.app/api/withdraw \
  -H 'content-type: application/json' \
  -d '{
    "nullifier": "<from your stored deposit>",
    "secret": "<from your stored deposit>",
    "value": "<from on-chain Deposited event>",
    "label": "<from on-chain Deposited event>",
    "commitment": "<from on-chain Deposited event>",
    "recipient": "0x…"
  }'

# Response: { "success": true, "txHash": "0x…", "proofValid": true }
Step 4

x402 facilitator playground

Construct a zBase paymentDetails + zbaseDeposit body and hit /api/facilitator/verify live. The zbaseDeposit field is the zBase-specific extension that links the payment to your pool deposit — not in stock x402 SDKs.

See /supported →
Live request preview
{
  "paymentDetails": {
    "scheme": "exact",
    "networkId": "eip155:84532",
    "payTo": "0xDbAA23601A95a01ee9B90160F6aA784CBE4E0f21",
    "maxAmountRequired": "500000"
  }
}
Verify equivalent
curl -X POST https://zbase.app/api/facilitator/verify \
  -H 'content-type: application/json' \
  -d '{"paymentDetails":{"scheme":"exact","networkId":"eip155:84532","payTo":"0xDbAA23601A95a01ee9B90160F6aA784CBE4E0f21","maxAmountRequired":"500000"}}'