Quickstart
Get your first private x402 payment running in under 10 minutes.
Prerequisites
- Node.js 20+
- Stellar CLI
- Freighter browser extension (for dashboard)
- Stellar testnet account with USDC (Circle faucet )
1. Clone and install
git clone https://github.com/DavidZapataOh/lateo-protocol.git
cd lateo-protocol/lateo
pnpm install2. Configure
cp proxy/.env.example proxy/.envEdit proxy/.env with your testnet keys:
POOL_SECRET=S... # Pool operator secret key
POOL_CONTRACT_ID=C... # Deployed pool contract
ASP_MEMBERSHIP_CONTRACT_ID=C...
ASP_NON_MEMBERSHIP_CONTRACT_ID=C...
VERIFIER_CONTRACT_ID=C...3. Start services
# Terminal 1: Privacy proxy
cd proxy && npm run dev
# Terminal 2: zkSearch (x402 service)
cd zksearch && npm start
# Terminal 3: Dashboard
cd dashboard && npm run dev4. Make your first private payment
- Open
http://localhost:5173in your browser - Connect Freighter (switch to testnet)
- Click Deposit — enter an amount (e.g., 1 USDC)
- Freighter will ask you to sign the
transact()call — this is the atomic ZK deposit - Once confirmed, your balance appears in the dashboard
- Use the MCP server or API to make x402 payments through the pool
5. Verify on-chain
Open Stellar Expert and search for the pool contract address. You’ll see transact() calls with Groth16 proofs verified on-chain — but no individual agent information.
What just happened?
- Deposit: Freighter signed a
transact()call. The pool contract verified a Groth16 ZK proof, transferred your USDC, and inserted a commitment into the Merkle tree — all atomic. - Payment: When you pay for an x402 service, the pool wallet sends the payment. On-chain, only “Pool → Service” is visible.
- Privacy: An observer cannot link your deposit to any specific payment. The ZK proof ensures your balance is valid without revealing which deposit is yours.
Last updated on