04

V0.5 Testnet · Once per chain

Registration

Registration gives your Open-mode wallet a Noid identity: one transaction per chain, from your real address, storing your userCommitment and your encryption public key. In the wallet you switch to Noid, pick the funded chains, and tap Register.

Sent by

Your wallet

Proof

None

Gas

Paid by you

Stores

userCommitment + encPub

Your wallet

signs menoid_Wallet

no gas

signature

Wallet generator

sk · spendPk

encPriv · encPub

uc + encPub

Your address

sends register()

one transaction

transaction

NoidPool

stores it

once, for good

In the wallet

on your device

  1. 1Signs menoid_Wallet — a signature, not a transaction.
  2. 2Derives the two key pairs and your userCommitment.
  3. 3Sends register(userCommitment, encryptionPublicKey) from your real address.

Inside NoidPool

  1. 4Requires a non-zero userCommitment, and an encryption key of 65 bytes starting with 0x04 (on EVM).
  2. 5Requires the address isn’t registered yet — registering is one-time and permanent; nobody, you included, can re-point an address later.
  3. 6Stores registered[you] = userCommitment and encryptionKeys[you] = encPub, and emits WalletRegistered.

The relayer registers too, when the pool is deployed: its commitment is stored as the immutable relayerCommitment, and every circuit is bound to it.

Why the encryption key goes on-chain too

A sender needs two things: your userCommitment, to lock the note to you, and your encryption key, to seal it so only you can read it. The commitment is a hash — the key can’t be recovered from it. When only the commitment was on-chain, the key lived in a server’s database, and a missed lookup made a registered wallet look unregistered, so the sender fell back to a public withdraw. A privacy wallet must never send in the clear by accident — so both now come from one on-chain read:

ChainRead
EVMregistrationOf(address) → (bytes32, bytes)
Aptospool::registration_of(pool, addr) → (bool, u256, vector<u8>)
Suipool::registration_of(state, addr) → (bool, u256, vector<u8>)
Solanathe Registration PDA, which holds both

An address that never registered answers (false, 0, empty) instead of reverting, so “not registered” is never confused with “the node didn’t answer”.

On-chain, anyone can see

  • That this address enabled Noid mode
  • Its userCommitment and encryption public key

Stays private

  • Your spending and encryption private keys
  • Your balance and activity