Skip to content

Canonical Usernames & Display Handles #411

@salmad3

Description

@salmad3

Context:

Canonical usernames with case-preserving handles so the product can retire raw wallet addresses.

Memo Actions

  • dither.Register(handle): registers a new handle or updates display casing if already owned by signer
  • dither.Transfer(handle, address): initiates transfer, locks handle until resolved
  • dither.Accept(handle): confirms transfer before expiry; ownership updates and lock clears
  • ADR-36 session wallet/AuthZ signs the memos; no new on-chain module needed

Acceptance Criteria

  • Add username (normalized, unique, ≤30 chars) and display_handle columns; backfill current users with NULL
  • Return both fields on all user payloads (/profile, /feed, /followers, /following, /search, wallet lookup)
  • Endpoints issue handle memos via reader; enforce ≤2 successful claims per rolling 7-day window
  • Reject reserved names or malformed input with structured errors surfaced in the wizard
  • Log every register/update/transfer (actor, previous value, new value, timestamp)
  • Reader consumes Register, Transfer, Accept memos with normalization, reserved-word, uniqueness, and expiry checks
  • Reader publishes handle state (owner, display handle, pending transfer metadata) via API/WebSocket; backend job hydrates existing users once data is live
  • Wizard copy shows “Handle appears available” with pending state; surface success/failure when confirmation arrives (poll or WebSocket)
  • Render @display_handle across profile header, feed bylines, mentions, notifications with address fallback
  • Tests cover normalization collisions, reserved names, transfers (accept + expiry), rate limits, wizard flow; telemetry emits counters and alerts

Sub-issues

Metadata

Metadata

Projects

Status

Building

Relationships

None yet

Development

No branches or pull requests

Issue actions