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.
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.
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.
- · 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.
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
~15–25s
Deposit tx + ASP root update + first proof. Per funding event, not per payment.
Each payment
~7–15s
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.
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.
Add USDC to the private pool
# 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.Stored locally in this browser
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.
# /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 }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.
{
"paymentDetails": {
"scheme": "exact",
"networkId": "eip155:84532",
"payTo": "0xDbAA23601A95a01ee9B90160F6aA784CBE4E0f21",
"maxAmountRequired": "500000"
}
}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"}}'