Sigil ships first-class on-chain usernames bound to OAS DIDs. A username is a human-readable handle (@alice) that resolves to a DID (did:oas:sigil:agent:alice). Usernames are leased annually, length-priced, and disputable through a 3-of-5 multisig. The username layer is the compatibility and allocation base for the broader Sigil Name System; SNS extends @alice → DID into alice.sigil → resolver record set.

Naming rules

RuleValue
Character setASCII [a-z0-9_]
Length3–32 characters
CaseLowercase before storage
Internationalisation (Punycode, IDNA 2008) is deferred to v1.1 with a confusable-detection layer. The v1 wallet UX includes a confusable-substitution warning for ASCII-only homographs (e.g. 0 vs o, 1 vs l).

Length tiers and pricing

LengthAnnual lease (MINT)Annual lease (BITS canary)
3 chars10,00010,000
4 chars1,0001,000
5 chars100100
6+ chars1010
Leases prepay 1–10 years at registration; expiry is registered_at + years × blocks_per_year. A genesis-pinned usernames.price_multiplier_bps scales all tier prices globally; governance can change it under a 90-day timelock.

Reserved names

A genesis-pinned list reserves names that cannot be registered without explicit governance assignment. Default contents include network identifiers (sigil, evolve, mint, bits), org identifiers (foundation, labs, treasury, admin, support), profanity vectors (separate amendable list), and all 1- and 2-letter ASCII combinations (which go through premium auction).

Transactions

VariantPurpose
RegisterUsernameRegister an available username.
TransferUsernameMove a username between DIDs.
ReleaseUsernameRelease a username early.
SetUsernameMetadataSet the off-chain metadata commitment.
SetReverseUsernameMark a username as the primary for reverse lookup.
RaiseUsernameDisputeFile a dispute.
ResolveUsernameDisputeResolve a dispute (multisig).
SubmitUsernameAuctionBidBid in a premium-name auction.
FinalizeUsernameAuctionSettle a premium-name auction.

Premium auctions

Names with 3 characters not registered in the first 30 days, 4-character names after the same window, and all 1- and 2-character names go through English ascending-bid auctions with a 24-hour anti-snipe extension.
ParameterValue
Opening priceTier price × 10
Bid increment≥5% over current high bid
Anti-snipeEach bid in the last 24 hours extends the deadline by 24 hours
Bid escrowLocked at admission, returned on outbid
Anti-collusionSingle DID limited to 5 bids per auction

Dispute system

Disputes resolve under a 3-of-5 multisig of independent DIDs:
SlotAffiliation
1Sigil Foundation director
2Sigil Foundation director (different individual)
3Community-elected (annual vote)
4IP-law professional from the published shortlist
5Rotating community member (6-month term, lottery)
Outcomes: TransferTo(claimant), RetainCurrent, Forfeit (release + 1-year cooldown), Split (alternate name minted to claimant). A 30-day appeal window allows one appeal to a separate 3-of-5 appellate multisig with no overlap.
FeeAmount (MINT)
Dispute filing fee1,000
Appeal fee5,000

Address derivation and privacy

The wallet address is derived from the DID, not the public key:
address = blake3(did_canonical_form)[..32]
This makes @alice, did:oas:sigil:agent:alice, and the derived address computationally identical. Anyone who knows your @username can compute your address and view your full transaction history. This is the cost of human-readable identity; privacy-seeking users mint a separate did:oas:sigil:agent:<random> for sensitive activity. Every wallet that ships username support must display, before any first-time send:
Public identity: Sending to @alice is the same as sending to did:oas:sigil:agent:alice and the same as sending to address 0xabc…123. All of these are publicly linked. For privacy, use a fresh agent DID for sensitive sends.
This text is non-negotiable. Wallet code review must check for it.

RPC

MethodReturns
sigil_resolveUsernameResolve @name to a record.
sigil_lookupUsernameReverse lookup a DID’s primary.
sigil_listUsernamesAll usernames owned by a DID.
sigil_searchUsernamePrefix search (index-backed; default limit 50, max 200).
sigil_getUsernameAuctionAuction record.
sigil_listOpenAuctionsOpen auctions.
sigil_getUsernameDisputeDispute record.
sigil_listOpenDisputesOpen disputes.

Implementation

  • Types: node/sigil-core/src/username.rs.
  • Executor: node/sigil-node/src/executor_username.rs, executor_username_auction.rs, executor_username_dispute.rs.
  • Durable state: node/sigil-node/src/username_durable.rs.

See also