Nesopie e77247f372 Feat/kyc (#1623)
* feat: selfrica circuit and tests

* chore: remove unused code

* feat: test for ofac,date and olderthan

* fix: public signal constant

* feat: add contract tests

* feat: helper function to gen TEE input

* feat: gen circuit inputs with signature

* feat: seralized base64

* fix: DateIsLessFullYear componenet

* feat: register circuit for selfrica

* feat: selfrica disclose circuit and test

* fix: common module error

* feat: add more test and fix constant

* fix: commitment calculation

* feat: selfrica contracts

* test: selfrica register using unified circuit

* feat: register persona and selfrica circuit

* feat: selfrica circuit and tests

* chore: remove unused code

* feat: test for ofac,date and olderthan

* fix: public signal constant

* feat: add contract tests

* feat: helper function to gen TEE input

* feat: gen circuit inputs with signature

* feat: seralized base64

* fix: DateIsLessFullYear componenet

* feat: register circuit for selfrica

* feat: selfrica disclose circuit and test

* fix: common module error

* feat: add more test and fix constant

* fix: commitment calculation

* feat: selfrica contracts

* test: selfrica register using unified circuit

* feat: register persona and selfrica circuit

* refactor: contract size reduction for IdentityVerificationHubImplV2

export function logic to external libs, reduce compiler runs to 200, update deploy scripts to link new libs

* feat: disclose circuit for persona

* feat: update  persona ofac trees

* feat; register circuit for selfper

* feat: disclose test for selfper

* chore: refactor

* chore : remove unused circuits

* chore: rename selfper to kyc

* chore: update comments

* feat: constrain s to be 251 bit

* feat: add range check on majority ASCII and comments

* feat: range check on neg_r_inv

* chore: remove is pk zero constrain

* merge dev

* feat: add registerPubkey function to Selfrica with GCPJWT Verification

* test: add testing for GCPJWT verification on Selfrica

* fix: script that calls register_selfrica circuits (ptau:14 -> ptau:15)

* fix: get remaining Selfrica tests working with proper import paths

* refactor: store pubkeys as string

also add some comment code for registerPubkey function

* refactor: remove registerPubkeyCommitment function

some tests now skipped as awaiting changes to how pubkeys are stored (string instead of uint256)

* feat: use hex decoding for the pubkey commitment

* test: adjust tests for pubkey being string again

* fix: remove old references to registerPubkey

* docs: add full natspec for IdentityRegistrySelfricaImplV1

* docs: update files in rest of the repo for Selfrica attestation type

* test: fix broken tests

* fix: builds and move to kyc from selfrica

* fix: constrain r_inv, Rx, s, T

* feat: eddsa

* feat: add onlyTEE check to registerPubkeyCommitment

onlyOwner is able to change onlyTEE

* refactor: update gcpRootCAPubkeyHash to be changeable by owner

* feat: add events for update functions

* style: move functions to be near other similar functions

* fix: kyc happy flow

* fix: all contract tests passing

| fix: timestamp conversion with Date(), migrate to V2 for endToEnd test, scope formatting, fix register aadhaar issue by using block.timestamp instead of Date.now(), fix changed getter function name, enable MockGCPJWTVerifier with updated file paths, add missing LeanIMT import, fix user identifier format

* audit: bind key offset-value offset and ensure image_digest only occurs once in the payload

* fix: constrain bracket

* chore: update comment

* audit: hardcode attestation id

* audit: make sure R and pubkey are on the curve

* audit: ensure pubkey is within bounds

* fix: all contract tests passing

* feat: change max length to 99 from 74

* audit: don't check sha256 padding

* audit: check the last window as well

* audit: single occurance for eat_nonce and image_digest

* audit: check if the certs are expired

* audit: add the timestamp check to the contract

* audit: make sure the person is less than 255 years of age

* audit fixes

* chore: yarn.lock

* fix: build fixes

* fix: aadhaar timestamp

* lint

* fix: types

* format

---------

Co-authored-by: vishal <vishalkoolkarni0045@gmail.com>
Co-authored-by: Evi Nova <tranquil_flow@protonmail.com>
2026-01-19 15:54:37 +05:30
2026-01-12 14:20:26 -08:00
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30
2025-08-12 16:39:15 -07:00
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30
2025-11-11 10:37:05 -08:00
2025-09-09 00:55:23 -07:00
2025-09-07 19:48:46 -07:00
2025-04-21 22:10:56 +02:00
2025-11-13 01:13:48 +05:30
2025-06-23 21:47:53 -07:00
2026-01-19 15:54:37 +05:30
2026-01-19 15:54:37 +05:30

Self Developers horizontal

Monorepo for Self.

Self is an identity wallet that lets users generate privacy-preserving proofs from government-issued IDs such as passports, ID cards, and Aadhaar cards. By scanning the NFC chip in their ID document, users can prove their validity while only revealing specific attributes such as age, nationality or simply humanity. Under the hood, Self uses zk-SNARKs to make sure personal data is redacted, but the document is verified.

Use cases unlocked include:

  • Airdrop protection: Protect a token distribution from bots
  • Social media: Add humanity checks to user's profiles
  • Quadratic funding: Prevent farmers from skewing rewards
  • Wallet recovery: Safeguard assets using IDs as recovery sources
  • Compliance: Check a user is not part of a sanctioned entity list

Currently, Self supports electronic passports, biometric ID cards following the ICAO standards, and Aadhaar cards. Support for new identity documents is on the way!

Checkout the docs to add Self to your project.

FAQ

Is my document supported?

Passports: Biometric passports have the biometric passport logo on their front cover.

Aadhaar: Indian Aadhaar cards are supported for privacy-preserving identity verification. Use the mAadhaar app to generate a QR code and import it into Self.

Coverage: Checkout our coverage map here to see supported documents and countries.

What can I request/prove with Self?

When a country issues a passport or a compliant ID document, they sign datagroups that include at least:

  • First and last name
  • Nationality
  • Date of birth
  • Gender
  • Expiration date
  • Passport number
  • Photo

Applications are able to request each of those data points.

What is the signature algorithm ?

Countries use different signature algorithms to sign ID documents. Check out our coverage map to see which.

Where can I find the countries' public keys ?

The main list of public keys can be downloaded from the ICAO website. We use multiple lists published by different ICAO members.

What's the ICAO ?

The International Civil Aviation Organization (ICAO) is a specialized agency of the United Nations. Among other things, they establish the specifications for passports, that have to be followed by all countries. The full passport specs are available here.

Project Ideas

  • Combine Self with other identification mechanisms as in Vitalik's pluralistic identity regime.
  • Help adding support for other identity documents to Self, such as Japan's my number cards or Taiwan DID.
  • Build a social network/anonymous message board for people from one specific country.
  • Create a sybil-resistance tool to protect social networks against spambots.
  • Build an airdrop farming protection tool.
  • Allow DeFi protocols to check if the nationality of a user is included in a set of forbidden states.
  • Gate an adult content website to a specific age.
  • Create a petition system or a survey portal.
  • Passport Wallet: use active authentication to build a wallet, a multisig or a recovery module using passport signatures

We provide bounties for new and interesting applications using Self.

Development Setup

This project requires Node.js 22.x. Use the included .nvmrc to match the version.

Run yarn install to bootstrap dependencies and husky hooks. Gitleaks will scan staged changes on each commit via yarn gitleaks.

Development Documentation

Note: We do not accept text-only pull request changes. While we appreciate the feedback, we will not merge external pull requests that only modify markdown files or code comments (e.g., typo fixes in documentation or comments). Pull requests must include functional code changes.

For detailed development patterns and conventions, see:

  • Development Patterns - React Native architecture, navigation, state management, and code organization
  • Testing Guide - Jest configuration, mock patterns, testing strategies, and E2E testing

These guides provide comprehensive context for AI-assisted development with ChatGPT Codex, Cursor, and CodeRabbit AI.

Contributing

We are actively looking for contributors. Please check the open issues if you don't know where to start! We offer bounties for significant contributions.

Important: Please read and follow the guidelines in contribute.md when opening your pull request.

Contact us

Thanks Rémi, Florent, Ayman, Justin, Seshanth, Nico and all other contributors for building Self.

Thanks Aayush, Vivek, Andy and Vitalik for contributing ideas and inspiring us to build this technology, and PSE for supporting the initial work through grants!

Description
No description provided
Readme 669 MiB
Languages
Circom 70.1%
C 14.1%
JavaScript 7.5%
TypeScript 6.8%
Kotlin 0.6%
Other 0.7%