diff --git a/lib/core/config.js b/lib/core/config.js index 43ffcd369..90e49899c 100644 --- a/lib/core/config.js +++ b/lib/core/config.js @@ -269,7 +269,10 @@ Config.prototype.loadNameSystemConfigFile = function() { "default": { "available_providers": ["ens"], "provider": "ens", - "enabled": true + "enabled": true, + "register": { + "rootDomain": "embark" + } } }; diff --git a/lib/modules/ens/contracts/FIFSRegistrar.sol b/lib/modules/ens/contracts/FIFSRegistrar.sol new file mode 100644 index 000000000..62b7f270b --- /dev/null +++ b/lib/modules/ens/contracts/FIFSRegistrar.sol @@ -0,0 +1,36 @@ +pragma solidity ^0.4.18; + +import './ENS.sol'; + +/** + * A registrar that allocates subdomains to the first person to claim them. + */ +contract FIFSRegistrar { + ENS ens; + bytes32 rootNode; + + modifier only_owner(bytes32 subnode) { + address currentOwner = ens.owner(keccak256(rootNode, subnode)); + require(currentOwner == 0 || currentOwner == msg.sender); + _; + } + + /** + * Constructor. + * @param ensAddr The address of the ENS registry. + * @param node The node that this registrar administers. + */ + function FIFSRegistrar(ENS ensAddr, bytes32 node) public { + ens = ensAddr; + rootNode = node; + } + + /** + * Register a name, or change the owner of an existing registration. + * @param subnode The hash of the label to register. + * @param owner The address of the new owner. + */ + function register(bytes32 subnode, address owner) public only_owner(subnode) { + ens.setSubnodeOwner(rootNode, subnode, owner); + } +} diff --git a/lib/modules/ens/index.js b/lib/modules/ens/index.js index 585c34bb1..5051570c9 100644 --- a/lib/modules/ens/index.js +++ b/lib/modules/ens/index.js @@ -1,5 +1,6 @@ const fs = require('../../core/fs.js'); const utils = require('../../utils/utils.js'); +const namehash = require('eth-ens-namehash'); class ENS { constructor(embark, _options) { @@ -7,12 +8,13 @@ class ENS { this.logger = embark.logger; this.events = embark.events; this.namesConfig = embark.config.namesystemConfig; + this.registration = this.namesConfig.register; this.embark = embark; - this.ensRegistry = null; - this.ensResolver = null; this.addENSToEmbarkJS(); this.configureENSRegistry(); + this.configureRootRegistrar(); + self.embark.registerActionForEvent("contracts:deploy:afterAll", (cb) => { self.events.request('contracts:contract', "ENSRegistry", (contract) => { let config = { @@ -55,36 +57,64 @@ class ENS { configureENSRegistry() { const self = this; + self.embark.registerContractConfiguration({ "default": { "gas": "auto", - "ENSRegistry": { - "deploy": true, - "args": [] + "contracts": { + "ENSRegistry": { + "deploy": true, + "args": [] + } } }, "ropsten": { - "ENSRegistry": { - "address": "0x112234455c3a32fd11230c42e7bccd4a84e02010", - "args": [] + "contracts": { + "ENSRegistry": { + "address": "0x112234455c3a32fd11230c42e7bccd4a84e02010" + } } }, "rinkeby": { - "ENSRegistry": { - "address": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A", - "args": [] + "contracts": { + "ENSRegistry": { + "address": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A" + } } }, "livenet": { - "ENSRegistry": { - "address": "0x314159265dd8dbb310642f98f50c066173c1259b", - "args": [] + "contracts": { + "ENSRegistry": { + "address": "0x314159265dd8dbb310642f98f50c066173c1259b" + } } } }); + self.embark.events.request("config:contractsFiles:add", self.embark.pathToFile('./contracts/ENSRegistry.sol')); } + configureRootRegistrar() { + const self = this; + let rootNode = namehash.hash(self.registration.rootDomain); + self.embark.registerContractConfiguration({ + "default": { + "gas": "auto", + "contracts": { + "FIFSRegistrar": { + "deploy": true, + "args": ["$ENSRegistry", rootNode], + "onDeploy": ["ENSRegistry.methods.setOwner(0, FIFSRegistrar.options.address).send()"] + } + } + }, + "ropsten": {}, + "rinkeby": {}, + "livenet": {} + }); + self.embark.events.request("config:contractsFiles:add", self.embark.pathToFile('./contracts/FIFSRegistrar.sol')); + } + addSetProvider(config) { let code = "\nEmbarkJS.Names.setProvider('ens'," + JSON.stringify(config) + ");"; diff --git a/test_apps/test_app/config/namesystem.json b/test_apps/test_app/config/namesystem.json new file mode 100644 index 000000000..3995055a3 --- /dev/null +++ b/test_apps/test_app/config/namesystem.json @@ -0,0 +1,10 @@ +{ + "default": { + "enabled": true, + "available_providers": ["ens"], + "provider": "ens", + "register": { + "rootDomain": "embark" + } + } +} \ No newline at end of file