Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
1 contributor

Users who have contributed to this file

293 lines (218 sloc) 9.99 KB
;;; ---------------------------------------------------------------------------
;;; @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)))
)
You can’t perform that action at this time.