Back to Home

ENS

0x314159265dd8...066173c1259b
Spurious DragonSource Verified
Deployed March 10, 2017 (9 years ago)Block 3,327,417

The original Ethereum Name Service (ENS) registry — a decentralized naming system.

Key Facts

Deployment Block
3,327,417
Deployment Date
Mar 10, 2017, 05:05 PM
Code Size
538.0 B
Transactions by YearPartial (capped)
201724,506
201813,336
201912,158

Spurious Dragon Era

Continued DoS protection. State trie clearing.

Block span: 2,675,0004,369,999
November 22, 2016October 16, 2017

Bytecode Overview

Opcodes538
Unique Opcodes86
Jump Instructions63
Storage Operations15

Verified Source Available

This contract has verified source code on Etherscan.

View Source Code
Show source code (Solidity)
;;; --------------------------------------------------------------------------- 
;;; @title The Ethereum Name Service registry. 
;;; @author Daniel Ellison <daniel@syrinx.net> 
 
(seq 
 
  ;; -------------------------------------------------------------------------- 
  ;; Constant definitions. 
 
  ;; Memory layout. 
  (def 'node-bytes  0x00) 
  (def 'label-bytes 0x20) 
  (def 'call-result 0x40) 
 
  ;; Struct: Record 
  (def 'resolver 0x00) ; address 
  (def 'owner    0x20) ; address 
  (def 'ttl      0x40) ; uint64 
 
  ;; Precomputed function IDs. 
  (def 'get-node-owner    0x02571be3) ; owner(bytes32) 
  (def 'get-node-resolver 0x0178b8bf) ; resolver(bytes32) 
  (def 'get-node-ttl      0x16a25cbd) ; ttl(bytes32) 
  (def 'set-node-owner    0x5b0fc9c3) ; setOwner(bytes32,address) 
  (def 'set-subnode-owner 0x06ab5923) ; setSubnodeOwner(bytes32,bytes32,address) 
  (def 'set-node-resolver 0x1896f70a) ; setResolver(bytes32,address) 
  (def 'set-node-ttl      0x14ab9038) ; setTTL(bytes32,uint64) 
 
  ;; Jumping here causes an EVM error. 
  (def 'invalid-location 0x02) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Shifts the leftmost 4 bytes of a 32-byte number right by 28 bytes. 
  ;; @param input A 32-byte number. 
 
  (def 'shift-right (input) 
    (div input (exp 2 224))) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Determines whether the supplied function ID matches a known 
  ;;         function hash and executes <code-body> if so. 
  ;; @dev The function ID is in the leftmost four bytes of the call data. 
  ;; @param function-hash The four-byte hash of a known function signature. 
  ;; @param code-body The code to run in the case of a match. 
 
  (def 'function (function-hash code-body) 
    (when (= (shift-right (calldataload 0x00)) function-hash) 
      code-body)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Calculates record location for the node and label passed in. 
  ;; @param node The parent node. 
  ;; @param label The hash of the subnode label. 
 
  (def 'get-record (node label) 
    (seq 
      (mstore node-bytes node) 
      (mstore label-bytes label) 
      (sha3 node-bytes 64))) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Retrieves owner from node record. 
  ;; @param node Get owner of this node. 
 
  (def 'get-owner (node) 
    (sload (+ node owner))) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Stores new owner in node record. 
  ;; @param node Set owner of this node. 
  ;; @param new-owner New owner of this node. 
 
  (def 'set-owner (node new-owner) 
    (sstore (+ node owner) new-owner)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Stores new subnode owner in node record. 
  ;; @param node Set owner of this node. 
  ;; @param label The hash of the label specifying the subnode. 
  ;; @param new-owner New owner of the subnode. 
 
  (def 'set-subowner (node label new-owner) 
    (sstore (+ (get-record node label) owner) new-owner)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Retrieves resolver from node record. 
  ;; @param node Get resolver of this node. 
 
  (def 'get-resolver (node) 
    (sload node)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Stores new resolver in node record. 
  ;; @param node Set resolver of this node. 
  ;; @param new-resolver New resolver for this node. 
 
  (def 'set-resolver (node new-resolver) 
    (sstore node new-resolver)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Retrieves TTL From node record. 
  ;; @param node Get TTL of this node. 
 
  (def 'get-ttl (node) 
    (sload (+ node ttl))) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Stores new TTL in node record. 
  ;; @param node Set TTL of this node. 
  ;; @param new-resolver New TTL for this node. 
 
  (def 'set-ttl (node new-ttl) 
    (sstore (+ node ttl) new-ttl)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; @notice Checks that the caller is the node owner. 
  ;; @param node Check owner of this node. 
 
  (def 'only-node-owner (node) 
    (when (!= (caller) (get-owner node)) 
      (jump invalid-location))) 
 
  ;; -------------------------------------------------------------------------- 
  ;; INIT 
 
  ;; Set the owner of the root node (0x00) to the deploying account. 
  (set-owner 0x00 (caller)) 
 
  ;; -------------------------------------------------------------------------- 
  ;; CODE 
 
  (returnlll 
    (seq 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Returns the address of the resolver for the specified node. 
      ;; @dev Signature: resolver(bytes32) 
      ;; @param node Return this node's resolver. 
      ;; @return The associated resolver. 
 
      (def 'node (calldataload 0x04)) 
 
      (function get-node-resolver 
        (seq 
 
          ;; Get the node's resolver and save it. 
          (mstore call-result (get-resolver node)) 
 
          ;; Return result. 
          (return call-result 32))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Returns the address that owns the specified node. 
      ;; @dev Signature: owner(bytes32) 
      ;; @param node Return this node's owner. 
      ;; @return The associated address. 
 
      (def 'node (calldataload 0x04)) 
 
      (function get-node-owner 
        (seq 
 
          ;; Get the node's owner and save it. 
          (mstore call-result (get-owner node)) 
 
          ;; Return result. 
          (return call-result 32))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Returns the TTL of a node and any records associated with it. 
      ;; @dev Signature: ttl(bytes32) 
      ;; @param node Return this node's TTL. 
      ;; @return The node's TTL. 
 
      (def 'node (calldataload 0x04)) 
 
      (function get-node-ttl 
        (seq 
 
          ;; Get the node's TTL and save it. 
          (mstore call-result (get-ttl node)) 
 
          ;; Return result. 
          (return call-result 32))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Transfers ownership of a node to a new address. May only be 
      ;;         called by the current owner of the node. 
      ;; @dev Signature: setOwner(bytes32,address) 
      ;; @param node The node to transfer ownership of. 
      ;; @param new-owner The address of the new owner. 
 
      (def 'node (calldataload 0x04)) 
      (def 'new-owner (calldataload 0x24)) 
 
      (function set-node-owner 
        (seq (only-node-owner node) 
 
          ;; Transfer ownership by storing passed-in address. 
          (set-owner node new-owner) 
 
          ;; Emit an event about the transfer. 
          ;; Transfer(bytes32 indexed node, address owner); 
          (mstore call-result new-owner) 
          (log2 call-result 32 
              (sha3 0x00 (lit 0x00 "Transfer(bytes32,address)")) node) 
 
          ;; Nothing to return. 
          (stop))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Transfers ownership of a subnode to a new address. May only be 
      ;;         called by the owner of the parent node. 
      ;; @dev Signature: setSubnodeOwner(bytes32,bytes32,address) 
      ;; @param node The parent node. 
      ;; @param label The hash of the label specifying the subnode. 
      ;; @param new-owner The address of the new owner. 
 
      (def 'node (calldataload 0x04)) 
      (def 'label (calldataload 0x24)) 
      (def 'new-owner (calldataload 0x44)) 
 
      (function set-subnode-owner 
        (seq (only-node-owner node) 
 
          ;; Transfer ownership by storing passed-in address. 
          (set-subowner node label new-owner) 
 
          ;; Emit an event about the transfer. 
          ;; NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); 
          (mstore call-result new-owner) 
          (log3 call-result 32 
              (sha3 0x00 (lit 0x00 "NewOwner(bytes32,bytes32,address)")) 
              node label) 
 
          ;; Nothing to return. 
          (stop))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Sets the resolver address for the specified node. 
      ;; @dev Signature: setResolver(bytes32,address) 
      ;; @param node The node to update. 
      ;; @param new-resolver The address of the resolver. 
 
      (def 'node (calldataload 0x04)) 
      (def 'new-resolver (calldataload 0x24)) 
 
      (function set-node-resolver 
        (seq (only-node-owner node) 
 
          ;; Transfer ownership by storing passed-in address. 
          (set-resolver node new-resolver) 
 
          ;; Emit an event about the change of resolver. 
          ;; NewResolver(bytes32 indexed node, address resolver); 
          (mstore call-result new-resolver) 
          (log2 call-result 32 
              (sha3 0x00 (lit 0x00 "NewResolver(bytes32,address)")) node) 
 
          ;; Nothing to return. 
          (stop))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Sets the TTL for the specified node. 
      ;; @dev Signature: setTTL(bytes32,uint64) 
      ;; @param node The node to update. 
      ;; @param ttl The TTL in seconds. 
 
      (def 'node (calldataload 0x04)) 
      (def 'new-ttl (calldataload 0x24)) 
 
      (function set-node-ttl 
        (seq (only-node-owner node) 
 
          ;; Set new TTL by storing passed-in time. 
          (set-ttl node new-ttl) 
 
          ;; Emit an event about the change of TTL. 
          ;; NewTTL(bytes32 indexed node, uint64 ttl); 
          (mstore call-result new-ttl) 
          (log2 call-result 32 
              (sha3 0x00 (lit 0x00 "NewTTL(bytes32,uint64)")) node) 
 
          ;; Nothing to return. 
          (stop))) 
 
      ;; ---------------------------------------------------------------------- 
      ;; @notice Fallback: No functions matched the function ID provided. 
 
      (jump invalid-location))) 
 
)

External Links