Issue
Establish your eligibility.
Prove control of your wallet to the issuer with a message signature. The issuer checks your Robinhood Chain balance at a specific block and issues a credential valid for 10 minutes.
The issuer knows your wallet.
Zero-knowledge eligibility without sharing your balance with the verifier.
Issuer verifies eligibility. Apps receive a proof.
↓01 / How it works
Access should depend on whether you qualify.
It shouldn’t require your entire financial story.
Prove control of your wallet to the issuer with a message signature. The issuer checks your Robinhood Chain balance at a specific block and issues a credential valid for 10 minutes.
The issuer knows your wallet.Your browser generates a zero-knowledge proof that an active credential meets the balance requirement. Your exact balance, wallet address, and credential stay out of the verifier request.
Groth16 proof generation runs in your browser.The application verifies a proof bound to its challenge and your session. A valid proof opens a protected endpoint; expired, revoked, or reused proofs are rejected.
A one-time challenge protects each access session.Privacy has a boundary. The issuer still knows the wallet, and the blockchain remains public. PonsPass is designed to reduce what an application needs to see.
02 / The protocol
A ZK protocol for proving a balance requirement without sending the balance to the verifier.
Understand the trust modelRobinhood Chain · single-operator setup
The protocol uses a Circom circuit, Poseidon credential commitments, and Groth16 proofs. A browser prover, issuer API, session verifier, and credential revocation are implemented. The exported Solidity verifier is tested on a local Ethereum node.
Single-operator phase-2 setup. No independent contribution or security audit. Parameter security depends on the coordinator’s setup process.
03 / For developers
An eligibility result your application can use. A portfolio it doesn’t need to collect.
The source includes the circuit, issuer and verifier HTTP endpoints, browser proving worker, exported Solidity verifier, and end-to-end tests. The current policy checks at least 0.0001 native ETH on Robinhood Chain mainnet.
The hosted app uses a mainnet balance snapshot and message signatures. It requests no asset transfer or token approval. A local development mode is also available in the repository; no public SDK is offered.
Read the design notes04 / Documentation
Design notes, current boundaries,
and the work still ahead.
A credential commits to a holder secret, snapshot balance, expiry, policy, block number, and a unique issuance nonce. The issuer adds its commitment to an active Merkle tree. The circuit proves membership and eligibility without exposing those private fields. Credentials last 10 minutes and do not prove a real-time balance.
The issuer knows your wallet and snapshot balance. Your browser keeps the holder secret and proof witness; the verifier receives a proof and public policy/session signals. This local build runs issuer and verifier in one service, so shared cookies, timing, and network metadata can correlate activity. Small credential sets also weaken privacy. It is not anonymous.
The circuit checks that credential expiry exceeds the access deadline. Revocation removes the credential from the accepted Merkle root. The verifier checks the latest root and a two-minute session challenge, then consumes that challenge once. Changes to the active credential set invalidate existing access sessions, which must prove again.
Open the app and connect an eligible wallet on Robinhood Chain mainnet (4663). Sign an issuance message, generate a proof in your browser, and verify it to unlock the protected response. This release uses a single-operator setup and is unaudited.
The current mainnet release relies on one operator for phase-2 parameter setup and has no security audit. Independent contributions, security review, issuer/verifier separation and stronger metadata privacy remain future work. Issuer records persist; access sessions reset when the service restarts.