Zk identity with one ENS — infinite access CryptoNomads bridges socialize, online chat & payments
CryptoNomads converts Discord usernames into verified, on-chain identities (ENS subdomains) with Self Protocol via zk of our nationalid & passport — then enables private country channels and frictionless crypto payments using those names with easily tipping with ens names no more of wallets complexity with addresses dilemma.
CryptoNomads is a Discord-first identity & social layer that ties a social identity (Discord username) to on-chain identity (ENS subdomain) via an on-chain verification (Self Protocol). Once verified, the user automatically receives a minted ENS subdomain (e.g. nithin_3.0xcryptonomads.eth), gets Discord roles (country, gender, age), and can send/receive crypto using easy human-readable names — without asking people to paste wallet addresses using privy server wallets tied up to your discord username, now you each memeber after verification in self have a subdomain minted on l2 celo chain after self verification
It’s privacy-first (verifications prove attributes), and built for social payments (Celo integration for cheap transfers). Perfect for country-gated communities, DAOs, IRL meetups and remote-nomad groups firstly we have country gated communitites then cross countries tied up with verified roles as gender, country , ageabove, also each profile discord username (label) with subdomain of community having 0xcryptonomads.eth.
Wallet addresses are ugly, error-prone, and non-social.
Verification is fragmented — many servers rely on manual checks or centralized verifiers.
Social & financial interactions live in different silos (Discord vs chain).
CryptoNomads fixes this: one trusted verification step becomes a universal, portable identity (ENS subdomain) that powers permissions and payments. Result: safer community policing, lower UX friction for payments, and a single canonical identity users can show across Web3 apps.
User types /verify in Discord.
Bot DMs or replies with secure verification link/modal to Self Protocol flow verification url
User completes verification (proves country/gender/age) — a privacy-preserving proof is produced with aadhar/passport. Note entire project is on ceolo mainnet.
discord username.0xcryptonomads.eth (ENS subdomain) and sets address resolver to the user's wallet.
Bot assigns Discord roles (country, gender, age) and updates channel permissions.
friend_username.0xcryptonomads.eth to address, orchestrates transfer (via non-custodial prompt or custodial flow), and posts a verified transaction link (Blockscout) in chat.
Technical architecture (high-level) Discord (bot/frontend) <--> Backend API (Node/TS) <--> MongoDB | | | +--> Self Protocol verification verifier (on-chain / verifier lib) | +--> ENS Subdomain Registrar (smart contract) / ENS RPC (Ethereum) | +--> Celo SDK (ContractKit) for payments | +--> Privy (wallet mgmt, login & relays)
Stack
Discord.js v14 (TypeScript) — Bot & slash commands
Node + TypeScript backend (Express / Fastify)
ENS on Ethereum — subdomain owner/resolver
Self Protocol — identity verification flow (zk-proofs / on-chain attestation)
Privy — wallet onboarding & custodial options
On-chain components & minting patterns
Two common approaches — pick based on budget & trust model:
A. Dedicated Subdomain Registrar (recommended for automation)
Deploy a SubdomainRegistrar contract that is owner/manager of 0xcryptonomads.eth (or has permission via ENS).
Registrar exposes mintSubdomain(label, owner, resolverData) which: enforces uniqueness, sets resolver addr to owner wallet, stores on-chain minimal metadata (optional).
Backend calls registrar to mint after proof validation. Use a relayer or sponsor gas for gasless UX.
B. Owner (EOA) minting (simpler, less dev ops)
A controlled EOA actually creates subdomains by calling ENS Manager directly (backend triggers it). Admin pays gas. Simpler but centralised wallet management.
Anti-squatting & uniqueness
Normalize usernames (lowercase, remove emojis, trim).
Enforce uniqueness at verification time (atomic check + mint).
Optionally require a small mint fee (or limit free mints per user).
Payments flow choices (how /send works)
Non-custodial (recommended for trustless):
Sender runs /send target 1.5. Bot resolves target ENS to address and returns a link to a signature request (WalletConnect / Privy). Sender signs and broadcasts TX from their wallet. Bot provides helpful UI and the Blockscout link.
Custodial / Instant (tradeoff: trust):
User opts into a Privy-managed custodial wallet. Bot can initiate transfers immediately on behalf of user (server holds keys). Faster UX but adds custody & compliance burden.
Gas & relayer options: Data model (example TypeScript interfaces) interface UserProfile { discordId: string; discordUsername: string; // normalized ensSubdomain?: string; // e.g. nithin_3.0xcryptonomads.eth walletAddress?: string; country?: string; gender?: "male"|"female"|"other"; birthYear?: number; verifiedAt?: string; // ISO proofTxId?: string; // optional on-chain attestation tx flags?: { banned?: boolean; admin?: boolean }; }
Contract Address: 0xa8CBeF9Be56605c524Af840fC525eE076ECf20a3[https://celo.blockscout.com/address/0xa8CBeF9Be56605c524Af840fC525eE076ECf20a3] ENS Registry:
0x22FAbb6A2004CA7E944B3263c9c12E2D1Ea15F2F` and
example of verificaiton immediately with minting subname in l2 is (https://celo.blockscout.com/tx/0x4d1ebcc07c098e97c4228140ac5351d04fb7145557accc0e30535dd09e447543)
User types /verify in Discord.
Bot DMs or replies with secure verification link/modal to Self Protocol flow.
User completes verification (proves country/gender/age) — a privacy-preserving proof is produced.
Backend validates the proof, records a verified mapping: discordId → walletAddress + attributes.
Backend mints (or instructs minting) username.0xcryptonomads.eth (ENS subdomain) and sets address resolver to the user's wallet.
Bot assigns Discord roles (country, gender, age) and updates channel permissions.
User can now /send friend_username 1.5 — bot resolves friend_username.0xcryptonomads.eth to address, orchestrates transfer (via non-custodial prompt or custodial flow), and posts a verified transaction link (Blockscout) in chat.
Technical architecture (high-level) Discord (bot/frontend) <--> Backend API (Node/TS) <--> MongoDB | | | +--> Self Protocol verification verifier (on-chain / verifier lib) | +--> ENS Subdomain Registrar (smart contract) / ENS RPC (Ethereum) | +--> Celo SDK (ContractKit) for payments | +--> Privy (wallet mgmt, login & relays)
Stack
Discord.js v14 (TypeScript) — Bot & slash commands
Node + TypeScript backend (Express / Fastify)
MongoDB — user records & proofs (minimal data)
ENS on Ethereum — subdomain owner/resolver
Self Protocol — identity verification flow (zk-proofs / on-chain attestation)
Celo (ContractKit) — payments & transaction links
Privy — wallet onboarding & custodial options
Optional relayer: Biconomy/Gelato if you sponsor gas (meta-txs)
On-chain components & minting patterns
Two common approaches — pick based on budget & trust model:
A. Dedicated Subdomain Registrar (recommended for automation)
Deploy a SubdomainRegistrar contract that is owner/manager of 0xcryptonomads.eth (or has permission via ENS).
Registrar exposes mintSubdomain(label, owner, resolverData) which: enforces uniqueness, sets resolver addr to owner wallet, stores on-chain minimal metadata (optional).
Backend calls registrar to mint after proof validation. Use a relayer or sponsor gas for gasless UX.
B. Owner (EOA) minting (simpler, less dev ops)
A controlled EOA actually creates subdomains by calling ENS Manager directly (backend triggers it). Admin pays gas. Simpler but centralised wallet management.
Anti-squatting & uniqueness
Normalize usernames (lowercase, remove emojis, trim).
Enforce uniqueness at verification time (atomic check + mint).
Optionally require a small mint fee (or limit free mints per user).
Payments flow choices (how /send works)
Non-custodial (recommended for trustless):
Sender runs /send target 1.5. Bot resolves target ENS to address and returns a link to a signature request (WalletConnect / Privy). Sender signs and broadcasts TX from their wallet. Bot provides helpful UI and the Blockscout link.
Custodial / Instant (tradeoff: trust):
User opts into a Privy-managed custodial wallet. Bot can initiate transfers immediately on behalf of user (server holds keys). Faster UX but adds custody & compliance burden.
Mongo indexes: discordId unique, ensSubdomain unique, walletAddress index. Verify Self Protocol proofs (validate zk proof or on-chain attestation). Ensure username uniqueness and normalization. Interact with ENS registrar contract to mint subdomain (or call an EOA). Assign roles via Discord API and manage channel permissions.