const namehash = require('eth-ens-namehash'); const Web3 = require('web3'); /*global web3*/ let __embarkENS = {}; // registry interface for later var registryInterface = [ { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" } ], "name": "resolver", "outputs": [ { "name": "", "type": "address" } ], "type": "function" }, { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" } ], "name": "owner", "outputs": [ { "name": "", "type": "address" } ], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "resolver", "type": "address" } ], "name": "setResolver", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "label", "type": "bytes32" }, { "name": "owner", "type": "address" } ], "name": "setSubnodeOwner", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "owner", "type": "address" } ], "name": "setOwner", "outputs": [], "type": "function" } ]; var resolverInterface = [ { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" } ], "name": "addr", "outputs": [ { "name": "", "type": "address" } ], "type": "function" }, { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" } ], "name": "content", "outputs": [ { "name": "", "type": "bytes32" } ], "type": "function" }, { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" } ], "name": "name", "outputs": [ { "name": "", "type": "string" } ], "type": "function" }, { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "kind", "type": "bytes32" } ], "name": "has", "outputs": [ { "name": "", "type": "bool" } ], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "addr", "type": "address" } ], "name": "setAddr", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "hash", "type": "bytes32" } ], "name": "setContent", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "name", "type": "string" } ], "name": "setName", "outputs": [], "type": "function" }, { "constant": true, "inputs": [ { "name": "node", "type": "bytes32" }, { "name": "contentType", "type": "uint256" } ], "name": "ABI", "outputs": [ { "name": "", "type": "uint256" }, { "name": "", "type": "bytes" } ], "payable": false, "type": "function" } ]; var registryAddresses = { // Mainnet "1": "0x314159265dd8dbb310642f98f50c066173c1259b", // Ropsten "3": "0x112234455c3a32fd11230c42e7bccd4a84e02010", // Rinkeby "4": "0xe7410170f87102DF0055eB195163A03B7F2Bff4A" }; __embarkENS.setProvider = function (options) { const self = this; let provider; if (options === undefined) { provider = "localhost:8546"; } else { provider = options.server + ':' + options.port; } // TODO: take into account type let web3 = new Web3(new Web3.providers.WebsocketProvider("ws://" + provider)); self.web3 = web3; // get network id and then assign ENS contract based on that self.ens = web3.eth.net.getId().then(id => { if (registryAddresses[id] !== undefined) { return new web3.eth.Contract(registryInterface, registryAddresses[id]); } // todo: deploy at this point return undefined; }); }; __embarkENS.resolve = function(name) { const self = this; const web3 = this.web3; if (this.ens === undefined) return undefined; let node = namehash(name) this.ens.methods.resolver(node).call().then((resolverAddress) => { let resolverContract = new web3.eth.Contract(resolverInterface, resolverAddress); return resolverContract.methods.addr(node).call() }).then((addr) => { return addr }).catch(err => err); };