v1.2.0 — ZK batch proofs + standalone facilitator binary
The final two roadmap items. Roadmap is now 100% shipped.
ZK batch settlement proofs (zk/)
Real Groth16 SNARK over a Poseidon Merkle tree of settlement leaves.
- Circuit compiled: 3468 constraints, 2 public inputs (
root,numLeaves), 32 private - Proven + verified:
snarkjs groth16 verify→ OK - Solidity verifier generated (
verifier.sol) — deployable on-chain - Negative test: corrupted root rejected at witness generation
- Design: positional (index-ordered) Merkle removes the entire comparator/bit-decomposition surface — no 252-bit overflow class, half the constraints
cd zk
snarkjs groth16 verify build/verification_key.json proof/public.json proof/proof.json
# → [INFO] snarkJS: OK!Honest scope note: local beacon ceremony (demo/development grade). Production ZK should use the public Perpetual Powers of Tau + multi-party ceremony and an audit. The Merkle root from POST /api/proofs is the ZK public input — integration path is documented in zk/README.md.
Standalone facilitator binary (facilitator/)
Minimal HTTP-402 settlement server — the "just the settlement piece" packaged separately from the web app.
cd facilitator && npm install && npm run build && npm start
# → listening on :3399- Zero dependencies on the Verge web app or Postgres
- Endpoints:
/health,/facilitator/supported,/facilitator/challenge,/facilitator/verify,/facilitator/settle - In-memory TTL challenges (10 min, 50k cap); core store interfaces are the scaling extension point
- Dockerfile: node:22-alpine, non-root, healthcheck
- Wire-compatible with the hosted facilitator — swap the base URL and all SDKs work unchanged
All endpoints live-tested: health, supported (7 rails), challenge issuance, read-only verify semantics, 404 hardening, body cap.
Full roadmap status — 25/25
Every roadmap item is now shipped. See the README roadmap section for the complete checked list.