diff --git a/lib/modules/ens/embarkjs.js b/lib/modules/ens/embarkjs.js index b764b0af..39f04043 100644 --- a/lib/modules/ens/embarkjs.js +++ b/lib/modules/ens/embarkjs.js @@ -153,6 +153,8 @@ __embarkENS.setProvider = function (config) { self.registration = config.registration; self.env = config.env; EmbarkJS.onReady(() => { + self.registration = config.registration; + web3.eth.net.getId() .then((id) => { const registryAddress = self.registryAddresses[id] || config.registryAddress; @@ -252,11 +254,7 @@ __embarkENS.registerSubDomain = function (name, address, callback) { // Register function generated by the index registerSubDomain(this.ens, this.registrar, this.resolver, web3.eth.defaultAccount, name, this.registration.rootDomain, -<<<<<<< HEAD - web3.utils.soliditySha3(address.toLowerCase().substr(2) + reverseAddrSuffix), address, console, EmbarkJS.Utils.secureSend, callback); -======= - web3.utils.soliditySha3(address.toLowerCase().substr(2) + '.addr.reverse'), address, console, callback); ->>>>>>> pre-dploy using the same function as register + web3.utils.soliditySha3(address.toLowerCase().substr(2) + reverseAddrSuffix), address, console, callback); }; __embarkENS.isAvailable = function () { diff --git a/lib/modules/ens/index.js b/lib/modules/ens/index.js index 9bbdedf4..fabbe8d8 100644 --- a/lib/modules/ens/index.js +++ b/lib/modules/ens/index.js @@ -2,29 +2,17 @@ const fs = require('../../core/fs.js'); const utils = require('../../utils/utils.js'); const namehash = require('eth-ens-namehash'); const async = require('async'); -const embarkJsUtils = require('embarkjs').Utils; + const reverseAddrSuffix = '.addr.reverse'; class ENS { constructor(embark, _options) { - this.env = embark.env; - this.isDev = embark.config.blockchainConfig.isDev; this.logger = embark.logger; this.events = embark.events; this.namesConfig = embark.config.namesystemConfig; this.registration = this.namesConfig.register || {}; this.embark = embark; -<<<<<<< HEAD - if (this.namesConfig === {} || - this.namesConfig.enabled !== true || - this.namesConfig.available_providers.indexOf('ens') < 0) { - return; - } - this.doSetENSProvider = this.namesConfig.provider === 'ens'; - -======= ->>>>>>> if no register config, dont register anything this.addENSToEmbarkJS(); this.configureContracts(); this.registerEvents(); @@ -75,131 +63,25 @@ class ENS { if (self.doSetENSProvider) { self.addSetProvider(config); - } -<<<<<<< HEAD - if ((!self.isDev && self.env !== 'privatenet') || !self.registration || !self.registration.subdomains || !Object.keys(self.registration.subdomains).length) { - return cb(); - } - self.registerConfigDomains(config, cb); -======= if (!self.registration || !self.registration.subdomains || !Object.keys(self.registration.subdomains).length) { return cb(); } self.registerConfigDomains(config, cb); }); ->>>>>>> if no register config, dont register anything }); } - associateStorageToEns(options, cb) { - const self = this; - // Code inspired by https://github.com/monkybrain/ipfs-to-ens - const {name, storageHash} = options; - - if (!utils.isValidEthDomain(name)) { - return cb('Invalid domain name ' + name); - } - - let hashedName = namehash.hash(name); - let contentHash; - try { - contentHash = utils.hashTo32ByteHexString(storageHash); - } catch (e) { - return cb('Invalid IPFS hash'); - } - - // Set content - async.waterfall([ - function getRegistryABI(next) { - self.events.request('contracts:contract', "ENSRegistry", (contract) => { - next(null, contract); - }); - }, - function createRegistryContract(contract, next) { - self.events.request("blockchain:contract:create", - {abi: contract.abiDefinition, address: contract.deployedAddress}, - (resolver) => { - next(null, resolver); - }); - }, - function getResolverForName(registry, next) { - registry.methods.resolver(hashedName).call((err, resolverAddress) => { - if (err) { - return cb(err); - } - if (resolverAddress === '0x0000000000000000000000000000000000000000') { - return cb('Name not yet registered'); - } - next(null, resolverAddress); - }); - }, - function getResolverABI(resolverAddress, next) { - self.events.request('contracts:contract', "Resolver", (contract) => { - next(null, resolverAddress, contract); - }); - }, - function createResolverContract(resolverAddress, contract, next) { - self.events.request("blockchain:contract:create", - {abi: contract.abiDefinition, address: resolverAddress}, - (resolver) => { - next(null, resolver); - }); - }, - function getDefaultAccount(resolver, next) { - self.events.request("blockchain:defaultAccount:get", (defaultAccount) => { - next(null, resolver, defaultAccount); - }); - }, - function setContent(resolver, defaultAccount, next) { - resolver.methods.setContent(hashedName, contentHash).send({from: defaultAccount}).then((transaction) => { - if (transaction.status !== "0x1" && transaction.status !== "0x01" && transaction.status !== true) { - return next('Association failed. Status: ' + transaction.status); - } - next(); - }).catch(next); - } - ], cb); - } - registerConfigDomains(config, cb) { const self = this; const register = require('./register'); -<<<<<<< HEAD - const secureSend = embarkJsUtils.secureSend; self.events.request("blockchain:defaultAccount:get", (defaultAccount) => { -<<<<<<< HEAD -======= - self.events.request("blockchain:defaultAccount:get", (defaultAccount) => { ->>>>>>> pre-dploy using the same function as register async.parallel([ function createRegistryContract(paraCb) { self.events.request("blockchain:contract:create", {abi: config.registryAbi, address: config.registryAddress}, (registry) => { paraCb(null, registry); -<<<<<<< HEAD -======= - self.events.request("blockchain:contract:create", - {abi: config.registrarAbi, address: config.registrarAddress}, - (registrar) => { - async.each(Object.keys(self.registration.subdomains), (subDomainName, eachCb) => { - const toSend = registrar.methods.register(utils.soliditySha3(subDomainName), defaultAccount); - - toSend.estimateGas().then(gasEstimated => { - return toSend.send({gas: gasEstimated + 1000, from: defaultAccount}).then(transaction => { - if (transaction.status !== "0x1" && transaction.status !== "0x01" && transaction.status !== true) { - return eachCb('Failed to register. Check gas cost.'); - } - eachCb(null, transaction); - }).catch(err => { - eachCb('Failed to register with error: ' + (err.message || err)); - }); - }).catch(err => { - eachCb("Register would error. Is it already registered? Do you have token balance? Is Allowance set? " + (err.message || err)); ->>>>>>> if no register config, dont register anything -======= ->>>>>>> pre-dploy using the same function as register }); }, function createRegistrarContract(paraCb) { @@ -216,11 +98,7 @@ class ENS { paraCb(null, resolver); }); } -<<<<<<< HEAD - ], function(err, contracts) { -======= ], function (err, contracts) { ->>>>>>> pre-dploy using the same function as register if (err) { return cb(err); } @@ -228,15 +106,9 @@ class ENS { async.each(Object.keys(self.registration.subdomains), (subDomainName, eachCb) => { const address = self.registration.subdomains[subDomainName]; -<<<<<<< HEAD const reverseNode = utils.soliditySha3(address.toLowerCase().substr(2) + reverseAddrSuffix); - register(ens, registrar, resolver, defaultAccount, subDomainName, self.registration.rootDomain, - reverseNode, address, self.logger, secureSend, eachCb); -======= - const reverseNode = utils.soliditySha3(address.toLowerCase().substr(2) + '.addr.reverse'); register(ens, registrar, resolver, defaultAccount, subDomainName, self.registration.rootDomain, reverseNode, address, self.logger, eachCb); ->>>>>>> pre-dploy using the same function as register }, cb); }); @@ -245,12 +117,20 @@ class ENS { addENSToEmbarkJS() { const self = this; + // TODO: make this a shouldAdd condition + if (this.namesConfig === {}) { + return; + } + + if ((this.namesConfig.available_providers.indexOf('ens') < 0) && (this.namesConfig.provider !== 'ens' || this.namesConfig.enabled !== true)) { + return; + } // get namehash, import it into file - self.events.request("version:get:eth-ens-namehash", function(EnsNamehashVersion) { + self.events.request("version:get:eth-ens-namehash", function (EnsNamehashVersion) { let currentEnsNamehashVersion = require('../../../package.json').dependencies["eth-ens-namehash"]; if (EnsNamehashVersion !== currentEnsNamehashVersion) { - self.events.request("version:getPackageLocation", "eth-ens-namehash", EnsNamehashVersion, function(err, location) { + self.events.request("version:getPackageLocation", "eth-ens-namehash", EnsNamehashVersion, function (err, location) { self.embark.registerImportFile("eth-ens-namehash", fs.dappPath(location)); }); } @@ -276,12 +156,10 @@ class ENS { }, "ENSRegistry": { "deploy": true, - "silent": true, "args": [] }, "Resolver": { "deploy": true, - "silent": true, "args": ["$ENSRegistry"] }, "FIFSRegistrar": { @@ -292,11 +170,7 @@ class ENS { "ropsten": { "contracts": { "ENSRegistry": { - "address": "0x112234455c3a32fd11230c42e7bccd4a84e02010", - "silent": true - }, - "Resolver": { - "deploy": false + "address": "0x112234455c3a32fd11230c42e7bccd4a84e02010" }, "Resolver": { "deploy": false @@ -309,11 +183,7 @@ class ENS { "rinkeby": { "contracts": { "ENSRegistry": { - "address": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A", - "silent": true - }, - "Resolver": { - "deploy": false + "address": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A" }, "Resolver": { "deploy": false @@ -326,11 +196,7 @@ class ENS { "livenet": { "contracts": { "ENSRegistry": { - "address": "0x314159265dd8dbb310642f98f50c066173c1259b", - "silent": true - }, - "Resolver": { - "deploy": false + "address": "0x314159265dd8dbb310642f98f50c066173c1259b" }, "Resolver": { "deploy": false @@ -341,9 +207,6 @@ class ENS { } } }; -<<<<<<< HEAD - config.testnet = config.ropsten; -======= if (this.registration && this.registration.rootDomain) { // Register root domain if it is defined @@ -354,7 +217,7 @@ class ENS { "onDeploy": [ `ENSRegistry.methods.setOwner('${rootNode}', web3.eth.defaultAccount).send().then(() => { ENSRegistry.methods.setResolver('${rootNode}', "$Resolver").send(); - var reverseNode = web3.utils.soliditySha3(web3.eth.defaultAccount.toLowerCase().substr(2) + '.addr.reverse'); + var reverseNode = web3.utils.soliditySha3(web3.eth.defaultAccount.toLowerCase().substr(2) + '${reverseAddrSuffix}'); ENSRegistry.methods.setResolver(reverseNode, "$Resolver").send(); Resolver.methods.setAddr('${rootNode}', web3.eth.defaultAccount).send(); Resolver.methods.setName(reverseNode, '${this.registration.rootDomain}').send(); @@ -364,34 +227,10 @@ class ENS { } this.embark.registerContractConfiguration(config); ->>>>>>> if no register config, dont register anything - if (this.registration && this.registration.rootDomain) { - // Register root domain if it is defined - const rootNode = namehash.hash(this.registration.rootDomain); - config.default.contracts['FIFSRegistrar'] = { - "deploy": true, - "silent": true, - "args": ["$ENSRegistry", rootNode], - "onDeploy": [ - `ENSRegistry.methods.setOwner('${rootNode}', web3.eth.defaultAccount).send({from: web3.eth.defaultAccount}).then(() => { - ENSRegistry.methods.setResolver('${rootNode}', "$Resolver").send({from: web3.eth.defaultAccount}); - var reverseNode = web3.utils.soliditySha3(web3.eth.defaultAccount.toLowerCase().substr(2) + '${reverseAddrSuffix}'); - ENSRegistry.methods.setResolver(reverseNode, "$Resolver").send({from: web3.eth.defaultAccount}); - Resolver.methods.setAddr('${rootNode}', web3.eth.defaultAccount).send({from: web3.eth.defaultAccount}); - Resolver.methods.setName(reverseNode, '${this.registration.rootDomain}').send({from: web3.eth.defaultAccount}); - })` - ] - }; - } - config.privatenet = config.development; - this.embark.registerContractConfiguration(config); - - //if (this.isDev || this.env === 'privatenet') { - this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/ENSRegistry.sol')); - this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/FIFSRegistrar.sol')); - this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/Resolver.sol')); - //} + this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/ENSRegistry.sol')); + this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/FIFSRegistrar.sol')); + this.embark.events.request("config:contractsFiles:add", this.embark.pathToFile('./contracts/Resolver.sol')); } addSetProvider(config) { diff --git a/test_apps/test_app/test/ens_spec.js b/test_apps/test_app/test/ens_spec.js new file mode 100644 index 00000000..200f2634 --- /dev/null +++ b/test_apps/test_app/test/ens_spec.js @@ -0,0 +1,42 @@ +/*global contract, config, it, assert, before*/ +const Resolver = require('Embark/contracts/Resolver'); + +const namehash = require('eth-ens-namehash'); +const address = '0x38ac14a9B6a7c8F9C46e4804074186c9F201D0A0'; +const rootNode = namehash.hash('embark.eth'); + +config({ + contracts: { + "ENSRegistry": { + "args": [] + }, + "Resolver": { + "args": ["$ENSRegistry"] + }, + "FIFSRegistrar": { + "args": ["$ENSRegistry", rootNode], + "onDeploy": [ + `ENSRegistry.methods.setOwner('${rootNode}', web3.eth.defaultAccount).send().then(() => { + ENSRegistry.methods.setResolver('${rootNode}', "$Resolver").send(); + Resolver.methods.setAddr('${rootNode}', '${address}').send(); + })` + ] + } + } +}); + +contract("ENS", function () { + this.timeout(0); + + before(function (done) { + // Wait for onDeploy to finish + setTimeout(function () { + done(); + }, 500); + }); + + it("should have registered embark.eth", async function () { + const domainAddress = await Resolver.methods.addr(rootNode).call(); + assert.strictEqual(domainAddress, address); + }); +});