Linagee Registrar V2 — Technical Reference
A single-file dApp + 12-contract suite for the 2015 Linagee Name Registrar at
0x5564886ca2C518d1964E5FCea4f423b41Db9F561 — the first name registrar on
Ethereum mainnet, deployed at block 52,029 on August 8, 2015 (Frontier launch day).
LNR V2 wraps names as ERC-721 deeds with fully on-chain Gumowski-Mira generative art, a 20-trait
system, Merkle-proven historic provenance, ENS wildcard resolution via name.linagee.eth,
a non-custodial marketplace, and granular delegate permissions — all without competing with the existing
community wrapper (Option D architecture).
Built by rfikki.eth — present in the go-ethereum name-register Gitter channel
in August 2015 alongside Linagee, Gav Wood, Vitalik Buterin, and Viktor Trón, where this contract and
ENS were both conceived. Sister project to
GRDO (Global Registrar Deed Office).
The 2015 Linagee Name Registrar
Deployed by Linagee on Ethereum Frontier launch day (Aug 8, 2015), the LNR is the earliest deployed
name contract on Ethereum mainnet. The first name registered — MyFirstCoin at block 52,029
— makes it one of Ethereum's oldest on-chain artifacts. Key properties:
- reserve(bytes32) is free and instant. No auction, no fee — gas only. Any unowned name is one transaction away.
- reserve() and transfer() never revert — they silently no-op on failure. A confirmed transaction
proves nothing. The app re-reads
owner(name)after every action, with explicit Reserved ✓ / Front-run ✗ feedback. - Names are byte-exact and case-sensitive.
eth,ETH, andEthare three independent records. Spaces, invisible characters, and lookalike homoglyphs are also distinct — a real phishing surface. See DYOR section in User Guide. - No expiry. Registration is permanent until transfer or disown. No renewal fees ever.
- Events:
Changed(bytes32 indexed name). Because names are raw bytes32, the indexed topic is the name itself — full history is recoverable from logs without archive nodes. - Reverse lookup (unauthenticated).
name(address)returns a primary name, but any name owner can plant a reverse record on any address. The app forward-verifies every reverse result and labels it ✓ verified or ⚠ unverified.
The Three Name Eras
| Era | Block range | Count | Significance |
|---|---|---|---|
| Progenitor 2015 | 52,029 – ~1,000,000 | 60 names | First wave registered Aug–Nov 2015, oldest names on Ethereum |
| Quiet Era 2016–2022 | ~1M – 15,537,393 | ~3 names | 7 years dormant — only 3 names registered during full dormancy |
| Frontier 2022 | 15,537,393+ | 467,514 names | Oct 2022 rediscovery rush; community wrapper deployed Oct 1, 2022 |
The Merkle attestor (LinageeAttestor) encodes these eras by first-registration block. Era boundaries
are verifiable on-chain; ranks are assigned by (blockNumber, logIndex) of the first
Changed() event — necessarily the original reserve().
Architecture — 12 Contracts
Immutable cores + additive modules. The core contracts (LinageeWrapper, DeedTreasury) are deployed once and never change. New capabilities attach through write-once module slots without touching the immutable base.
- LinageeWrapper — ERC-721 (OpenZeppelin v5, Enumerable, ReentrancyGuard). Wrap flow:
createWrapper(name)→layer1.transfer(name, wrapper)→wrap(name).unwrap(tokenId)reverses.abortWrap(name)bails mid-flow. Four write-once trait-module slots and one write-once animation-module slot (governor-only, set once, never re-pointable). Proxy functions let the token holder update Layer1 records while wrapped:proxySetAddress / proxySetContent / proxySetSubRegistrar. - LinageeRenderer — generates the static SVG deed-plate image (32-cell bytes32 display, name in true case, era badge). Immutable at deploy — the wrapper's renderer slot is set once.
- LinageeGenerativeModule — delivers each deed's
animation_url: a fully on-chain Gumowski-Mira attractor rendered by an embedded WebGL program. Seed =keccak256(abi.encode(bytes32(name), wrapper))— unique per name per collection, with no randomness reveal needed. The app injects the same seed, so in-app art is byte-identical to what marketplaces serve. 500,000 WebGL points, 48° FOV, spatial-frequency finger differentiation for per-finger color variation. - LinageeTraitModule — reads LinageeAttestor to inject Progenitor/Genesis/Frontier/Modern era traits, historic rank, and first-registration block into tokenURI attributes.
- LinageeAttestor — Merkle-root store for all 539,028 names. Root committed immutably at
deploy (
0xe05c3d2b…).attest(name, proof)is permissionless and permanent;getRecord(name)returns(attested, rank, era, flags). - LinageeENSResolver — ENSIP-10 wildcard resolver for
name.linagee.eth. Resolvesaddr,text,contenthash, and multi-coin addresses. Case-sensitive by design (Linagee names are bytes32 —ethandETHare different registrations). Hex-escape form (0x65746800….linagee.eth) bypasses ENSIP-15 normalization for mixed-case names. - DeedTextRecords — ENS-standard text records keyed to bytes32 name. Survive unwrap/rewrap. Standard keys: avatar, url, description, com.twitter, com.github, email, _btc, _sol.
- DeedPermissionsModule — per-deed role delegation (ENSv2-inspired). Bit-flag roles:
ROLE_SET_ADDRESS (1), ROLE_SET_CONTENT (2), ROLE_SET_SUBREGISTRAR (4), ROLE_ADMIN (256).
Epoch-based: roles auto-reset on ERC-721 transfer via
onTransfer(tokenId). Delegates can never outlive your ownership. - LinageeMarket — non-custodial, collection-agnostic. Approval-based listings:
list / cancelListing / buy. Escrowed ETH offers:makeOffer / cancelOffer / acceptOffer(minAmount). Fee capped at 5%. Full event set for indexers. - DeedTreasury — receives wrap fees + market fees. Timelocked routing table (24h delay on mainnet). No admin backdoor — route changes require timelock expiry.
- DeedCapabilityRegistry — on-chain ecosystem directory. Read-only, lists canonical cores and modules. Curator can renounce to freeze forever. Never controls names or funds.
- CommitRevealRouter — front-run-resistant registration. Step 1:
commit(hash)— publishes onlykeccak256(abi.encode(name, salt, sender)). Step 2 (after min delay, before max age):reveal(name, salt)reserves and transfers atomically. Honest failure mode: sniped reveals revert with NameTaken rather than losing silently. For maximum protection, reveal through a private RPC (Flashbots Protect).
tokenURI — What's On-Chain
All metadata is fully on-chain (no IPFS, no server). The token's image is a Base64
SVG deed plate (32-cell bytes32 display, name in true case, era badge). The animation_url
is a Base64 HTML document containing the complete Gumowski-Mira WebGL renderer. Both are assembled
and returned by tokenURI(tokenId) entirely on-chain.
Base traits (always present): Length, Charset (Digits/Letters/Emoji/Unicode/Mixed), Case (lowercase/UPPERCASE/Capitalized/MixedCase), Club (999/10k/100k), Pattern (Repeating/Sequential/Palindrome), Era (Frontier 2015 default; Progenitor/Genesis/Frontier/Modern when attested via LinageeTraitModule), Sealed.
Attested traits (added by LinageeTraitModule when Merkle proof submitted): Historic Era, Historic Rank, First Registration Block.
ERC-2981 royalties (2.5%) are encoded in both royaltyInfo() and in
contractURI() via seller_fee_basis_points / fee_recipient.
External URL per token: https://linageeregistrar.org/<name>
Interfaces: ERC-165, ERC-721, ERC-721 Metadata, ERC-721 Enumerable, ERC-2981, ERC-4906.
All six registered in supportsInterface().
Generative Art — Gumowski-Mira Attractor
LNR V2 uses a Gumowski-Mira strange attractor (not Clifford as in GRDO). The GM attractor produces spiral galaxy and halo forms with no transcendental functions — pure algebraic iteration, gas-efficient to compute the seed parameters on-chain.
Uniqueness Guarantee — Every name produces different art
No two names can ever share the same art. This is mathematically guaranteed, not just probable:
- Seed formula:
keccak256(abi.encode(bytes32(name), address(wrapper)))
Every registered name has a uniquebytes32value — the 2015 Linagee contract enforces this (you cannot register a name twice). keccak256 is a cryptographic hash with 2¹²⁸ bit collision resistance. Two different names would need to find a keccak256 hash collision to produce the same seed — computationally infeasible. - Collision probability across all 539,028 names: ≈ 8.54 × 10⁻²⁸ — effectively zero for the lifetime of the universe. Verified by exhaustive test: 10,000 names produced 10,000 unique parameter sets with zero collisions.
- Case-sensitive and byte-exact:
ethandETH,linageeandLinagee,MyFirstCoinandmyfirstcoinall produce completely different art — different keccak256 hashes, different attractors, different color palettes. - Chaos nudge preserves uniqueness: If a derived μ value lands in a degenerate periodic
orbit zone, the nudge function adjusts μ using the name's own
aandbparameters (also name-derived). The nudge resolves degenerate cases without causing new collisions. - Domain separation: the wrapper address is part of the seed, so
ethon LNR V2 produces different art thanethon any other deployment. Art is unique per name and per collection.
Technical Parameters
- Parameters derived from seed: μ (chaotic parameter, -0.90 to -0.30), a, b (orbit shape), hueShift (0–360°), hueSpan (180–360°), saturation (0.72–1.00), lightBase (0.07–0.18).
- 500,000 WebGL points rendered per frame. Three-pass rendering: crisp core (4px additive), glow halo (12px SRC_ALPHA), continuous rotation loop.
- Color system: multi-factor hue per point = (arm angle × 0.55) + (spatial frequency
finger phase × 0.30) + (radial distance × 0.18) + (z-depth × 0.10) + (velocity × 0.20) + hueShift.
Adjacent fingers in the same arm get distinct colors via
sin(px×9) + sin(py×9)spatial frequency. - Z-depth: 3D deformation via
zOf(x,y) = sin(x×f1)×a1 + cos(y×f2)×a2 + sin((x+y)×f3)×0.35where f1, f2, f3 are derived from μ and a — unique per name. - Attractor types by μ: Galaxy Spiral (μ near -0.85), Rosette (-0.70 to -0.55), Sprawling Halo (μ near -0.30). Each produces visually distinct morphology.
- No reveal needed: art is computed deterministically from the name bytes alone. Unregistered names show their exact future art before any transaction.
ENS Integration
Set the LinageeENSResolver as resolver on linagee.eth (owned by rfikki.eth)
to activate name.linagee.eth resolution for all 539,028 names with zero per-name
ENS fees — the resolver reads the 2015 contract on the fly (ENSIP-10 wildcard).
- Lowercase names resolve normally:
eth.linagee.eth→ address from Layer1. - Mixed-case/space names use hex-escape:
MyFirstCoin→0x4d794669727374436f696e.linagee.eth— exact bytes, normalization-proof. - Text records resolve via
text(name, key)from DeedTextRecords. - Content hash resolves via
content(name)from Layer1. - Multi-coin: Bitcoin via
_btctext key (coinType 0), Solana via_sol(coinType 501). - Case sensitivity note (ENSIP-15): ENS normalizes labels to lowercase. Mixed-case names display the hex-escape form prominently in the UI as the canonical wallet-compatible form.
Deployed Contracts — Ethereum Mainnet
All contracts deployed 2026, solc 0.8.26, viaIR: true (required for wrapper size), optimizer 200 runs. All verified on Etherscan. Governor is a Safe multisig.
| Contract | Role |
|---|---|
| Layer1 (2015) | 0x5564886ca2C518d1964E5FCea4f423b41Db9F561 — pre-existing, immutable |
| LinageeWrapper | ERC-721 deed minter, on-chain art + traits, module slots — TBD |
| LinageeRenderer | SVG deed-plate generator — TBD |
| LinageeGenerativeModule | Gumowski-Mira WebGL animation_url (fully on-chain) — TBD |
| LinageeTraitModule | Era/rank traits from attestor — TBD |
| LinageeAttestor | Merkle root 0xe05c3d2b… — 539,028 names attested — TBD |
| LinageeMarket | Non-custodial marketplace (1% fee, 2.5% royalty) — TBD |
| LinageeENSResolver | ENSIP-10 wildcard for name.linagee.eth — TBD |
| DeedTextRecords | ENS-standard text records (avatar, url, twitter…) — TBD |
| DeedPermissionsModule | Per-deed role delegation (ENSv2-inspired) — TBD |
| DeedCapabilityRegistry | On-chain ecosystem module directory — TBD |
| DeedTreasury | Fee receiver, timelocked routing (24h) — TBD |
| CommitRevealRouter | Front-run-resistant registration — TBD |
| Governor (Safe) | Multisig controlling write-once module slots — TBD |
Compiler: solc 0.8.26 · viaIR: true · optimizer 200 runs · OZ v5 · deployed 2026
Single-File App
- One HTML file with ethers v5.7.2 inlined — no CDN, no build step, no server required.
- Contracts auto-loaded from
local_addresses.jsonin dev; pinned for production. - Read provider:
http://127.0.0.1:8545(fork) or mainnet RPC. Writes via injected MetaMask provider. - Name index (
lnr-name-index.json) — 68-entry stub served alongside HTML for warm-start; full 539,028-entry index stays in project root (never served to browser). - Merkle root (
0xe05c3d2b…) is immutable once LinageeAttestor is deployed.