Search projects, hackathons, sponsors and tech

    ← All projects

    Demo

    About

    The problem it solves In 2025, OFAC fined ShapeShift $750,000 - not for laundering money, but for failing to prove compliance without exposing their users. Tornado Cash, BitMEX, ShapeShift - all fined, none had a way to satisfy regulators without handing over raw user data. That's the impossible choice DeFi faces today: expose your users to prove you're compliant, or protect privacy and get fined. The GENIUS Act now mandates that stablecoin issuers and DeFi protocols prove solvency - but says nothing about how. Provium eliminates that choice. It's an autonomous AI compliance agent that generates zero-knowledge proofs of protocol solvency every hour - proving every position maintains 150%+ collateral ratio without revealing a single user's balance, address, or position size. Three AI agents (Watcher, Analyst, Reporter) powered by Groq's LLaMA 3.3 monitor a live DeFi lending protocol on Base Sepolia, assess risk in real time, and generate Noir ZK proofs bound to a Poseidon2 Merkle tree committed on-chain. Every proof is verified by a real UltraHonk verifier deployed on Base -not a mock. Proof submissions are signed through BitGo's 2-of-3 multisig custody, so no single compromised key can forge a compliance report. After each proof lands on-chain, Fileverse packages a full compliance dossier - proof metadata, agent reasoning, protocol snapshot, transaction links - into a permanent document regulators can access with a single URL. The regulator story ties it together: any regulator can call RegulatorPortal.requestComplianceProof() specifying a jurisdiction and target block. The agent detects the request, generates a fresh ZK proof, and fulfills it on-chain within 30 minutes - with both a cryptographic proof and a plain-English AI explanation of why the protocol is or isn't compliant. The agent's identity is verified via ENSIP-25 -its ENS name is cryptographically bound to its ComplianceRegistry entry using ERC-7930 cross-chain addressing. Anyone can verify the agent is legitimate with a single ENS lookup. No phone calls. No subpoenas. No quarterly audits that arrive months too late. Verifiable compliance on demand - without exposing a single user.

    How it's made

    Challenges we ran into **ZK Circuit Constraints** - Noir requires fixed-size arrays at compile time, so the circuit is hardcoded to 16 positions with zero-padded slots. Poseidon hashing was the real challenge -the circuit uses `std::hash::poseidon2_permutation` over BN254, and the Python Merkle tree builder must produce byte-identical hashes or witness generation fails silently. Matching the Python `poseidon-hash` library to Noir's internal implementation took multiple rounds of debugging field arithmetic edge cases. - **LLM Reliability** - The first architecture used Agno's team delegation, where a coordinator LLM passed data between agents. The coordinator summarized the positions JSON instead of forwarding it verbatim, corrupting Merkle tree inputs downstream. The fix: a deterministic Python orchestrator where LLMs handle reasoning and decision-making, but Python handles all data wiring. No LLM touches raw position data. - **BitGo Testnet** - No Python SDK existed. We built a minimal REST client against BitGo API v2 from scratch - Bearer auth, wallet passphrase handling, and 2-of-3 multisig transaction construction. The challenge was sending zero-value contract calls (pure calldata for proof submission), not token transfers, which is an uncommon BitGo use case. - **On-Chain Gas for Reasoning Strings** - Each compliance report stores the full LLM reasoning in contract storage permanently. We accepted the cost as a feature — an immutable, human-readable audit trail is the entire point. A regulator shouldn't need to decode ZK circuits to understand why a protocol passed or failed. - **ENSIP-25 with Cross-Chain Addressing** - ERC-7930 encoding for Base Sepolia (chain ID 84532 = 3-byte big-endian) had no reference implementation. We built the encoder from the raw spec in both Python and TypeScript, then verified they produce identical output.