Created
August 1, 2018 13:15
-
-
Save Masa331/2e039a7d782da03d930a208b38b28f96 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.4.24+commit.e67f0147.js&optimize=false&gist=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
interface ENS { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer(bytes32 indexed node, address owner); | |
// Logged when the resolver for a node changes. | |
event NewResolver(bytes32 indexed node, address resolver); | |
// Logged when the TTL of a node changes | |
event NewTTL(bytes32 indexed node, uint64 ttl); | |
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public; | |
function setResolver(bytes32 node, address resolver) public; | |
function setOwner(bytes32 node, address owner) public; | |
function setTTL(bytes32 node, uint64 ttl) public; | |
function owner(bytes32 node) public view returns (address); | |
function resolver(bytes32 node) public view returns (address); | |
function ttl(bytes32 node) public view returns (uint64); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
import './ENS.sol'; | |
/** | |
* The ENS registry contract. | |
*/ | |
contract ENSRegistry is ENS { | |
struct Record { | |
address owner; | |
address resolver; | |
uint64 ttl; | |
} | |
mapping (bytes32 => Record) records; | |
// Permits modifications only by the owner of the specified node. | |
modifier only_owner(bytes32 node) { | |
require(records[node].owner == msg.sender); | |
_; | |
} | |
/** | |
* @dev Constructs a new ENS registrar. | |
*/ | |
function ENSRegistry() public { | |
records[0x0].owner = msg.sender; | |
} | |
/** | |
* @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node. | |
* @param node The node to transfer ownership of. | |
* @param owner The address of the new owner. | |
*/ | |
function setOwner(bytes32 node, address owner) public only_owner(node) { | |
Transfer(node, owner); | |
records[node].owner = owner; | |
} | |
/** | |
* @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node. | |
* @param node The parent node. | |
* @param label The hash of the label specifying the subnode. | |
* @param owner The address of the new owner. | |
*/ | |
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public only_owner(node) { | |
var subnode = keccak256(node, label); | |
NewOwner(node, label, owner); | |
records[subnode].owner = owner; | |
} | |
/** | |
* @dev Sets the resolver address for the specified node. | |
* @param node The node to update. | |
* @param resolver The address of the resolver. | |
*/ | |
function setResolver(bytes32 node, address resolver) public only_owner(node) { | |
NewResolver(node, resolver); | |
records[node].resolver = resolver; | |
} | |
/** | |
* @dev Sets the TTL for the specified node. | |
* @param node The node to update. | |
* @param ttl The TTL in seconds. | |
*/ | |
function setTTL(bytes32 node, uint64 ttl) public only_owner(node) { | |
NewTTL(node, ttl); | |
records[node].ttl = ttl; | |
} | |
/** | |
* @dev Returns the address that owns the specified node. | |
* @param node The specified node. | |
* @return address of the owner. | |
*/ | |
function owner(bytes32 node) public view returns (address) { | |
return records[node].owner; | |
} | |
/** | |
* @dev Returns the address of the resolver for the specified node. | |
* @param node The specified node. | |
* @return address of the resolver. | |
*/ | |
function resolver(bytes32 node) public view returns (address) { | |
return records[node].resolver; | |
} | |
/** | |
* @dev Returns the TTL of a node, and any records associated with it. | |
* @param node The specified node. | |
* @return ttl of the node. | |
*/ | |
function ttl(bytes32 node) public view returns (uint64) { | |
return records[node].ttl; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
/** | |
* @title Ownable | |
* @dev The Ownable contract has an owner address, and provides basic authorization control | |
* functions, this simplifies the implementation of "user permissions". | |
*/ | |
contract Ownable { | |
address public owner; | |
event OwnershipRenounced(address indexed previousOwner); | |
event OwnershipTransferred( | |
address indexed previousOwner, | |
address indexed newOwner | |
); | |
/** | |
* @dev The Ownable constructor sets the original `owner` of the contract to the sender | |
* account. | |
*/ | |
constructor() public { | |
owner = msg.sender; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(msg.sender == owner); | |
_; | |
} | |
/** | |
* @dev Allows the current owner to relinquish control of the contract. | |
* @notice Renouncing to ownership will leave the contract without an owner. | |
* It will not be possible to call the functions with the `onlyOwner` | |
* modifier anymore. | |
*/ | |
function renounceOwnership() public onlyOwner { | |
emit OwnershipRenounced(owner); | |
owner = address(0); | |
} | |
/** | |
* @dev Allows the current owner to transfer control of the contract to a newOwner. | |
* @param _newOwner The address to transfer ownership to. | |
*/ | |
function transferOwnership(address _newOwner) public onlyOwner { | |
_transferOwnership(_newOwner); | |
} | |
/** | |
* @dev Transfers control of the contract to a newOwner. | |
* @param _newOwner The address to transfer ownership to. | |
*/ | |
function _transferOwnership(address _newOwner) internal { | |
require(_newOwner != address(0)); | |
emit OwnershipTransferred(owner, _newOwner); | |
owner = _newOwner; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
import './ENS.sol'; | |
/** | |
* A simple resolver anyone can use; only allows the owner of a node to set its | |
* address. | |
*/ | |
contract PublicResolver { | |
bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; | |
bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de; | |
bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5; | |
bytes4 constant NAME_INTERFACE_ID = 0x691f3431; | |
bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; | |
bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; | |
bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; | |
bytes4 constant MULTIHASH_INTERFACE_ID = 0xe89401a1; | |
event AddrChanged(bytes32 indexed node, address a); | |
event ContentChanged(bytes32 indexed node, bytes32 hash); | |
event NameChanged(bytes32 indexed node, string name); | |
event ABIChanged(bytes32 indexed node, uint256 indexed contentType); | |
event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); | |
event TextChanged(bytes32 indexed node, string indexedKey, string key); | |
event MultihashChanged(bytes32 indexed node, bytes hash); | |
struct PublicKey { | |
bytes32 x; | |
bytes32 y; | |
} | |
struct Record { | |
address addr; | |
bytes32 content; | |
string name; | |
PublicKey pubkey; | |
mapping(string=>string) text; | |
mapping(uint256=>bytes) abis; | |
bytes multihash; | |
} | |
ENS ens; | |
mapping (bytes32 => Record) records; | |
modifier only_owner(bytes32 node) { | |
require(ens.owner(node) == msg.sender); | |
_; | |
} | |
/** | |
* Constructor. | |
* @param ensAddr The ENS registrar contract. | |
*/ | |
function PublicResolver(ENS ensAddr) public { | |
ens = ensAddr; | |
} | |
/** | |
* Sets the address associated with an ENS node. | |
* May only be called by the owner of that node in the ENS registry. | |
* @param node The node to update. | |
* @param addr The address to set. | |
*/ | |
function setAddr(bytes32 node, address addr) public only_owner(node) { | |
records[node].addr = addr; | |
AddrChanged(node, addr); | |
} | |
/** | |
* Sets the content hash associated with an ENS node. | |
* May only be called by the owner of that node in the ENS registry. | |
* Note that this resource type is not standardized, and will likely change | |
* in future to a resource type based on multihash. | |
* @param node The node to update. | |
* @param hash The content hash to set | |
*/ | |
function setContent(bytes32 node, bytes32 hash) public only_owner(node) { | |
records[node].content = hash; | |
ContentChanged(node, hash); | |
} | |
/** | |
* Sets the multihash associated with an ENS node. | |
* May only be called by the owner of that node in the ENS registry. | |
* @param node The node to update. | |
* @param hash The multihash to set | |
*/ | |
function setMultihash(bytes32 node, bytes hash) public only_owner(node) { | |
records[node].multihash = hash; | |
MultihashChanged(node, hash); | |
} | |
/** | |
* Sets the name associated with an ENS node, for reverse records. | |
* May only be called by the owner of that node in the ENS registry. | |
* @param node The node to update. | |
* @param name The name to set. | |
*/ | |
function setName(bytes32 node, string name) public only_owner(node) { | |
records[node].name = name; | |
NameChanged(node, name); | |
} | |
/** | |
* Sets the ABI associated with an ENS node. | |
* Nodes may have one ABI of each content type. To remove an ABI, set it to | |
* the empty string. | |
* @param node The node to update. | |
* @param contentType The content type of the ABI | |
* @param data The ABI data. | |
*/ | |
function setABI(bytes32 node, uint256 contentType, bytes data) public only_owner(node) { | |
// Content types must be powers of 2 | |
require(((contentType - 1) & contentType) == 0); | |
records[node].abis[contentType] = data; | |
ABIChanged(node, contentType); | |
} | |
/** | |
* Sets the SECP256k1 public key associated with an ENS node. | |
* @param node The ENS node to query | |
* @param x the X coordinate of the curve point for the public key. | |
* @param y the Y coordinate of the curve point for the public key. | |
*/ | |
function setPubkey(bytes32 node, bytes32 x, bytes32 y) public only_owner(node) { | |
records[node].pubkey = PublicKey(x, y); | |
PubkeyChanged(node, x, y); | |
} | |
/** | |
* Sets the text data associated with an ENS node and key. | |
* May only be called by the owner of that node in the ENS registry. | |
* @param node The node to update. | |
* @param key The key to set. | |
* @param value The text data value to set. | |
*/ | |
function setText(bytes32 node, string key, string value) public only_owner(node) { | |
records[node].text[key] = value; | |
TextChanged(node, key, key); | |
} | |
/** | |
* Returns the text data associated with an ENS node and key. | |
* @param node The ENS node to query. | |
* @param key The text data key to query. | |
* @return The associated text data. | |
*/ | |
function text(bytes32 node, string key) public view returns (string) { | |
return records[node].text[key]; | |
} | |
/** | |
* Returns the SECP256k1 public key associated with an ENS node. | |
* Defined in EIP 619. | |
* @param node The ENS node to query | |
* @return x, y the X and Y coordinates of the curve point for the public key. | |
*/ | |
function pubkey(bytes32 node) public view returns (bytes32 x, bytes32 y) { | |
return (records[node].pubkey.x, records[node].pubkey.y); | |
} | |
/** | |
* Returns the ABI associated with an ENS node. | |
* Defined in EIP205. | |
* @param node The ENS node to query | |
* @param contentTypes A bitwise OR of the ABI formats accepted by the caller. | |
* @return contentType The content type of the return value | |
* @return data The ABI data | |
*/ | |
function ABI(bytes32 node, uint256 contentTypes) public view returns (uint256 contentType, bytes data) { | |
Record storage record = records[node]; | |
for (contentType = 1; contentType <= contentTypes; contentType <<= 1) { | |
if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { | |
data = record.abis[contentType]; | |
return; | |
} | |
} | |
contentType = 0; | |
} | |
/** | |
* Returns the name associated with an ENS node, for reverse records. | |
* Defined in EIP181. | |
* @param node The ENS node to query. | |
* @return The associated name. | |
*/ | |
function name(bytes32 node) public view returns (string) { | |
return records[node].name; | |
} | |
/** | |
* Returns the content hash associated with an ENS node. | |
* Note that this resource type is not standardized, and will likely change | |
* in future to a resource type based on multihash. | |
* @param node The ENS node to query. | |
* @return The associated content hash. | |
*/ | |
function content(bytes32 node) public view returns (bytes32) { | |
return records[node].content; | |
} | |
/** | |
* Returns the multihash associated with an ENS node. | |
* @param node The ENS node to query. | |
* @return The associated multihash. | |
*/ | |
function multihash(bytes32 node) public view returns (bytes) { | |
return records[node].multihash; | |
} | |
/** | |
* Returns the address associated with an ENS node. | |
* @param node The ENS node to query. | |
* @return The associated address. | |
*/ | |
function addr(bytes32 node) public view returns (address) { | |
return records[node].addr; | |
} | |
/** | |
* Returns true if the resolver implements the interface specified by the provided hash. | |
* @param interfaceID The ID of the interface to check for. | |
* @return True if the contract implements the requested interface. | |
*/ | |
function supportsInterface(bytes4 interfaceID) public pure returns (bool) { | |
return interfaceID == ADDR_INTERFACE_ID || | |
interfaceID == CONTENT_INTERFACE_ID || | |
interfaceID == NAME_INTERFACE_ID || | |
interfaceID == ABI_INTERFACE_ID || | |
interfaceID == PUBKEY_INTERFACE_ID || | |
interfaceID == TEXT_INTERFACE_ID || | |
interfaceID == MULTIHASH_INTERFACE_ID || | |
interfaceID == INTERFACE_META_ID; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.22; | |
import "./Ownable.sol"; | |
import "./ENSRegistry.sol"; | |
import "./PublicResolver.sol"; | |
contract TopmonksRegistrar is Ownable { | |
bytes32 public rootNode; | |
ENSRegistry public ens; | |
PublicResolver public resolver; | |
address public resolverAddr; | |
modifier onlyDomainOwner(bytes32 subnode) { | |
address currentOwner = ens.owner(keccak256(abi.encodePacked(rootNode, subnode))); | |
require(currentOwner == 0 || currentOwner == msg.sender, "Only owner"); | |
_; | |
} | |
constructor(bytes32 _node, address _ensAddr, address _resolverAddr) public { | |
rootNode = _node; | |
ens = ENSRegistry(_ensAddr); | |
resolverAddr = _resolverAddr; | |
resolver = PublicResolver(_resolverAddr); | |
} | |
function setRootNode(bytes32 _node) public onlyOwner { | |
rootNode = _node; | |
} | |
function setResolver(address _resolverAddr) public onlyOwner { | |
resolver = PublicResolver(_resolverAddr); | |
} | |
function setNodeOwner(address _newOwner) public onlyOwner { | |
ens.setOwner(rootNode, _newOwner); | |
} | |
function setSubnodeOwner(bytes32 _subnode, address _addr) public onlyOwner { | |
ens.setSubnodeOwner(rootNode, _subnode, _addr); | |
} | |
function register(bytes32 _subnode, address _addr) public onlyDomainOwner(_subnode) { | |
ens.setSubnodeOwner(rootNode, _subnode, this); | |
bytes32 node = keccak256(abi.encodePacked(rootNode, _subnode)); | |
ens.setResolver(node, resolverAddr); | |
resolver.setAddr(node, _addr); | |
ens.setSubnodeOwner(rootNode, _subnode, _addr); | |
} | |
function neco() public view returns (string) { | |
return 'ahoj'; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment