Back to Home

NameRegistry

Token
0xa1a111bc074c...d51c91b8af00
FrontierContract #29Exact Bytecode MatchEdit this contract
Deployed August 8, 2015 (10 years ago)Block 52,426

Fixed-fee name registry from Day 9 of Ethereum (Aug 8, 2015). Reserve names for 69 ETH, resolve addresses. A precursor to ENS.

Key Facts

Deployment Block
52,426
Deployment Date
Aug 8, 2015, 08:08 AM
Code Size
698.0 B
Gas at Deploy
202,247
Transactions by Year
201533
201615
201712
20195
20208
202210
20232
20255
20261

Description

An early fixed-fee name registry deployed on August 8, 2015 (block 52,426), just 9 days after Ethereum's mainnet launch. This contract implements a straightforward name reservation system: anyone can reserve an unclaimed name by sending at least 69 ETH, then associate an Ethereum address with that name for on-chain resolution.

The contract features six functions: reserve (claim a name for 69 ETH), disown (release a name and refund the fee to a specified address), transfer (change name ownership), setAddr (set the address a name resolves to), plus read-only addr and owner lookups. All mutations emit a Changed event.

This is a simplified precursor to the FixedFeeRegistrar later published by Gavin Wood in ethereum/dapp-bin. The dapp-bin version evolved to use string parameters instead of bytes32, a 4-field struct (adding subRegistrar and content fields), contract inheritance, and a minimum name length check. This on-chain version uses a leaner 2-field struct (just addr and owner) with bytes32 name parameters.

The contract currently holds over 314 ETH from name reservations, making it one of the highest-balance unverified frontier contracts. Multiple developers were independently deploying registry contracts in Ethereum's first days, exploring what decentralized naming should look like before ENS was proposed in early 2016.

Source Verified

Exact bytecode match(698 bytes)

Exact byte-for-byte match on both creation (698 bytes) and runtime (679 bytes) bytecode. Compiled with soljson v0.1.1+commit.6ff4cd6, optimizer ON. Key compiler archaeology findings: function declaration order affects optimizer output (correct order: reserve, disown, owner, transfer, addr, setAddr), and operand order in conditions matters (0 == owner, not owner == 0).

Heuristic Analysis

The following characteristics were detected through bytecode analysis and may not be accurate.

Detected Type: Token

Frontier Era

The initial release of Ethereum. A bare-bones implementation for technical users.

Block span: 01,149,999
July 30, 2015March 14, 2016

Bytecode Overview

Opcodes698
Unique Opcodes100
Jump Instructions41
Storage Operations21

Verified Source Available

Source verified through compiler archaeology and exact bytecode matching.

View Verification Proof
Show source code (Solidity)
contract NameRegistry {
    struct Record {
        address addr;
        address owner;
    }

    modifier onlyrecordowner(bytes32 _name) { if (m_toRecord[_name].owner == msg.sender) _ }

    event Changed(bytes32 indexed name);

    function reserve(bytes32 _name) {
        if (0 == m_toRecord[_name].owner && msg.value >= c_fee) {
            m_toRecord[_name].owner = msg.sender;
            Changed(_name);
        }
    }

    function disown(bytes32 _name, address _refund) onlyrecordowner(_name) {
        delete m_toRecord[_name];
        _refund.send(c_fee);
        Changed(_name);
    }

    function owner(bytes32 _name) constant returns (address) { return m_toRecord[_name].owner; }

    function transfer(bytes32 _name, address _newOwner) onlyrecordowner(_name) {
        m_toRecord[_name].owner = _newOwner;
        Changed(_name);
    }

    function addr(bytes32 _name) constant returns (address) { return m_toRecord[_name].addr; }

    function setAddr(bytes32 _name, address _a) onlyrecordowner(_name) {
        m_toRecord[_name].addr = _a;
        Changed(_name);
    }

    mapping (bytes32 => Record) m_toRecord;
    uint constant c_fee = 69 ether;
}

External Links