Registration Modes
Self Agent ID supports six registration modes. All produce the same on-chain result — a soulbound NFT with ZK proof-of-human — but they differ in key type, wallet requirements, and user experience. Two modes (privy and smartwallet) are UI wrappers that use the same underlying contract flows.
Networks
| Network | Chain ID | Default? | Passport Type | Use Case |
|---|---|---|---|---|
| Celo Mainnet | 42220 | Yes | Real passports via Self app | Production deployments |
| Celo Sepolia | 11142220 | No | Mock documents via Self app | Testing and development |
Quick Decision Guide
┌─────────────────────┐
│ What key type does │
│ your agent use? │
└────────┬────────────┘
│
┌────────────┴────────────┐
│ │
Ed25519 ECDSA
│ │
┌────────┴────────┐ ┌────────┴─────────────┐
│ Need human │ │ How should the │
│ wallet binding? │ │ human authenticate? │
└───┬─────────┬───┘ └──┬──────┬──────┬─────┘
│ │ │ │ │
No Yes Wallet Social Passkey
│ │ │ login
▼ ▼ │ │ │
ed25519 ed25519- ┌───┴───┐ ▼ ▼
linked │ │ privy smartwallet
Yes No
│ │
▼ ▼
linked wallet-free
Mode Comparison
| Mode | Wallet Required? | NFT Owner | Agent Key Type | Best For |
|---|---|---|---|---|
| linked | Yes (registration only) | Human’s wallet | Independent ECDSA keypair | Autonomous agents with human oversight |
| wallet-free | No | Agent’s address | Independent ECDSA keypair | Non-crypto users, embedded agents |
| ed25519 | No | Derived from pubkey | Ed25519 keypair | OpenClaw/Eliza/IronClaw agents |
| ed25519-linked | Yes (registration only) | Human’s wallet | Ed25519 keypair | Ed25519 agents with human wallet binding |
| privy | No (social login) | Human’s wallet | Independent ECDSA keypair | OAuth users (Google, Twitter, etc.) |
| smartwallet | No (passkey) | Agent’s address | Independent ECDSA keypair | Passkey UX, gasless management |
Linked
The agent generates its own dedicated ECDSA keypair. The human’s wallet is used only during registration to establish ownership.
Flow:
- Connect browser wallet
- A fresh agent keypair is generated in the browser
- Agent signs a challenge proving key ownership (ECDSA)
- Scan passport with Self app — contract verifies both ZK proof and agent signature in one step
- Human’s wallet key is never exposed to agent software
Use when: You’re building autonomous agents that need their own identity, or you want key rotation without re-registering the human.
Wallet-Free
No crypto wallet required. The agent generates an ECDSA keypair and owns its own NFT.
Flow:
- Agent keypair generated in browser
- Agent signs a challenge proving key ownership
- Scan passport with Self app — NFT is minted to the agent’s own address
- Deregister anytime by scanning passport again (ZK proof links to your unique identity)
Use when: The user has no crypto wallet and just needs a quick registration with their passport, or you’re embedding agent identity into a service where wallet management is undesirable.
Ed25519
For agents that use Ed25519 keys natively (common in AI agent frameworks). No wallet required — the NFT owner is derived from the Ed25519 public key.
Flow:
- Agent provides its Ed25519 public key
- Agent signs a challenge with its Ed25519 private key
- Scan passport with Self app — NFT is minted to an address derived from the Ed25519 pubkey
- Deregister anytime by scanning passport again
Use when: Your agent framework uses Ed25519 keys (OpenClaw, Eliza, IronClaw) and you don’t need a separate human wallet binding.
Ed25519-Linked
Combines Ed25519 agent keys with a human wallet for ownership. The human’s wallet holds the NFT while the agent operates with Ed25519 keys.
Flow:
- Connect browser wallet
- Agent provides its Ed25519 public key
- Agent signs a challenge with its Ed25519 private key
- Scan passport with Self app — NFT is minted to the human’s wallet, linked to the Ed25519 agent key
- Human retains custody of the NFT while the agent operates independently
Use when: Your agent uses Ed25519 keys but you want the NFT ownership tied to a human wallet for oversight and management.
Privy
A UI wrapper over the linked/wallet-free flow that uses Privy for social login authentication. Users sign in with OAuth providers instead of connecting a wallet.
Flow:
- User authenticates via social login (Google, Twitter, email, etc.)
- Privy creates an embedded wallet behind the scenes
- Agent keypair is generated
- Agent signs challenge; registration proceeds as linked mode
- Scan passport with Self app
Use when: Your users prefer social login over wallet connections, or you want a familiar OAuth-style onboarding experience.
Smart Wallet
A UI wrapper that uses a passkey (Face ID / fingerprint) to create a smart account. No MetaMask, no seed phrase.
Flow:
- Create passkey via biometrics (creates a ZeroDev Kernel smart account)
- Agent keypair is generated
- Agent signs challenge; smart wallet is set as guardian
- Scan passport with Self app
- Revoke agent anytime with biometrics (gaslessly on Celo mainnet)
Use when: You want the simplest user experience with no seed phrases, no browser extensions, and gasless management via Pimlico.
Verification Configs
All modes support 6 verification configurations, combining age thresholds with OFAC sanctions screening:
| Config Index | Age Requirement | OFAC Screening |
|---|---|---|
| 0 | None | Off |
| 1 | 18+ | Off |
| 2 | 21+ | Off |
| 3 | None | On |
| 4 | 18+ | On |
| 5 | 21+ | On |
The config is selected via the second character of userDefinedData during registration.
ZK-Attested Credentials
During registration, users can optionally disclose verified claims that are stored on-chain as ZK-attested credentials:
- Nationality (ISO 3166 country code)
- Full name
- Date of birth
- Gender
- Issuing state
- OFAC sanctions clearance
- Age verification (18+ or 21+)
All disclosures are optional. Raw passport data never leaves the user’s device.