project screenshot 1
project screenshot 2
project screenshot 3
project screenshot 4
project screenshot 5
project screenshot 6

ZKAge Proof Mobile

ZK Age Proof Mobile: Verify your age, without revealing any personal information.

ZKAge Proof Mobile

Created At

ETHGlobal Cannes

Project Description

ZKAge Proof Mobile is a privacy-preserving age verification app built with Flutter, leveraging Mopro and Circom to generate zero-knowledge proofs directly on your mobile device.

Users can prove they meet a minimum age requirement, for example 18+, to buy alcohol, access certain websites, or use age-restricted services, without revealing their exact age or any personal data.

Imagine visiting a site where you don’t want your information leaked or resold: with ZKAge, your proof is cryptographic and reveals nothing beyond the fact that you qualify.

Proofs are verified on-chain via a Groth16 Solidity contract deployed on Arbitrum Sepolia.

The app features QR code sharing, is designed for future integration with Self Protocol and NFC, and keeps all sensitive information secure on the device, so nothing is ever stored or transmitted.

Built for EthGlobal Cannes 2025, ZKAge Verify Mobile demonstrates how zero-knowledge can be adapted to a wide variety of privacy-first use cases.

How it's Made

This project is built with a modern privacy stack combining Flutter for mobile, Mopro for local ZK proof generation, Circom for circuit design, and Solidity smart contracts deployed using Hardhat 3.0 on Arbitrum Sepolia.

The Mopro Flutter plugin was incredibly helpful, as it allowed me to generate and test zero-knowledge proofs directly on the device, without ever sending sensitive information to a backend.

I used Circom to create a custom age verification circuit enforcing the constraint userAge >= minAge. The circuit exposes [minAge, userAge] as public signals, but only the minimum age requirement is made public to verifiers. The proof itself is verified on-chain by a Groth16 Solidity verifier contract.

A big part of the challenge was learning Circom, snarkjs, and ZK concepts from scratch. Initially, I faced a tricky issue where the public signals from Mopro were always [0, 0], which turned out to be a mapping problem between the Circom circuit, the .zkey, and the Solidity verifier contract. After troubleshooting and aligning the inputs and outputs, I was able to generate valid proofs locally with Mopro.

However, I was not able to fully resolve my on-chain verification bugs in time for the submission, mainly due to alignment issues between the circuit, the trusted setup (.zkey), and the Solidity verifier. This is a known issue in the ZK ecosystem, and I have documented it for future debugging and improvements.

Although I didn’t have time to fully complete on-chain verification with the latest .zkey, the stack I built is modular and ready for integration. I plan to add Self Protocol and NFC support for richer attestations and document verification. All code is open source, and the architecture is adaptable for any use case needing privacy-preserving age or eligibility checks.

Partner technologies like Mopro saved me countless hours and made ZK approachable for mobile. This was my first real experience with ZK, Circom, and snarkjs, and I learned a ton during this hackathon.

The solution could also easily be integrated into a World app mini-app, for example using Worldcoin’s ecosystem or other identity protocols, making even more privacy-first use cases possible.

background image mobile

Join the mailing list

Get the latest news and updates