diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..bbe2ce7447f8b2f804f25fca972de027366a78ff --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +.PHONY: contract + +contract: + $(MAKE) -C contract diff --git a/contract/Makefile b/contract/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..2e393dba1813b6f3f69f496f38a66629432ddf06 --- /dev/null +++ b/contract/Makefile @@ -0,0 +1,3 @@ +SOLC ?= solc +registrar.out.json: registrar.sol build.json + $(SOLC) --allow-paths $(realpath .) --standard-json < build.json > registrar.out.json diff --git a/contract/build.json b/contract/build.json new file mode 100644 index 0000000000000000000000000000000000000000..5abf50e9b88a2862c28625c389f022b990cbf43b --- /dev/null +++ b/contract/build.json @@ -0,0 +1,14 @@ +{ + "language": "Solidity", + "sources": { + "registrar": { + "urls":["registrar.sol"] + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 500 + } + } +} \ No newline at end of file diff --git a/registrar.sol b/contract/registrar.sol similarity index 99% rename from registrar.sol rename to contract/registrar.sol index 6ac70aa316e75b81a9514ba3fa0e214babfd9e83..ed9a25f49fa6df1b427aa47098348bb1d9167c71 100644 --- a/registrar.sol +++ b/contract/registrar.sol @@ -1,3 +1,4 @@ +pragma solidity ^0.4.0; /* * Copyright (c) 2014 Gav Wood <g@ethdev.com> * Copyright (c) 2016 Savoir-faire Linux Inc. diff --git a/index.js b/index.js index 830fffdb485c012902a445d6507e47f8bc9eea81..e5fd98d1504381d65c3e4f6a37430894fcc175ed 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Savoir-faire Linux Inc. + * Copyright (c) 2016-2017 Savoir-faire Linux Inc. * * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> * @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * along with this program. If not, see <https://www.gnu.org/licenses/>. */ 'use strict'; @@ -49,13 +49,13 @@ console.log(coinbase); var balance = web3.eth.getBalance(coinbase); console.log(balance.toString(10)); -var REG_ADDR_FILE = "contractAddress.txt"; -var REG_ABI_FILE = "contractABI.json"; -var REG_ADDR = "0xe53cb2ace8707526a5050bec7bcf979c57f8b44f"; -var REG_ABI = [{"constant":true,"inputs":[{"name":"_a","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"}],"name":"reserve","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_owner","type":"address"},{"name":"_a","type":"address"}],"name":"reserveFor","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"Registrar","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"owner","type":"address"}],"name":"PrimaryChanged","type":"event"}]; +var REG_FILE = __dirname + "/contract/registrar.out.json"; +var REG_ADDR_FILE = __dirname + "/contractAddress.txt"; var NAME_VALIDATOR = new RegExp('^[a-z0-9-_]{3,32}$'); var account; +var regAddress = "0xe53cb2ace8707526a5050bec7bcf979c57f8b44f"; +var regABI; var regContract; var reg; @@ -92,26 +92,26 @@ function loadContract() { if (err) { console.log("Can't read contract address: " + err); } else { - REG_ADDR = String(content); + regAddress = String(content); } - fs.readFile(REG_ABI_FILE, function(err, abi_str){ + fs.readFile(REG_FILE, function(err, data){ if (err) console.log("Can't read contract ABI: " + err); - else - REG_ABI = JSON.parse(abi_str); - console.log("Loading name contract from blockchain at " + REG_ADDR); - web3.eth.getCode(REG_ADDR, function(error, result) { + else { + var REG = JSON.parse(data); + regABI = JSON.parse(REG.contracts.registrar.GlobalRegistrar.abi); + } + console.log("Loading name contract from blockchain at " + regAddress); + web3.eth.getCode(regAddress, function(error, result) { if (error) console.log("Error getting contract code: " + error); - /*else - console.log("Contract code at " + REG_ADDR + ": " + result);*/ if (!result || result == "0x") { - console.log("Contract not found at " + REG_ADDR); + console.log("Contract not found at " + regAddress); initContract(); } else { - regContract = web3.eth.contract(REG_ABI); - regContract.at(REG_ADDR, function(err, result) { - console.log("Contract found and loaded from " + REG_ADDR); + regContract = web3.eth.contract(regABI); + regContract.at(regAddress, function(err, result) { + console.log("Contract found and loaded from " + regAddress); if(!err) { reg = result; startServer(); @@ -127,34 +127,30 @@ function loadContract() { } function initContract() { - fs.readFile( __dirname + '/registrar.sol', function(err, data) { + fs.readFile(REG_FILE, function(err, data) { if (err) throw err; - web3.eth.compile.solidity(String(data), function(err, compiled) { - if (err) { - console.log("Can't compile contract :" + err); - throw err; - } - console.log("Contract compiled, instantiating on blockchain..."); - REG_ABI = compiled.GlobalRegistrar.info.abiDefinition; - fs.writeFile(REG_ABI_FILE, JSON.stringify(REG_ABI)); - regContract = web3.eth.contract(REG_ABI); - waitForGaz(3000000, function(){ - regContract.new({from: coinbase, data: compiled.GlobalRegistrar.code, gas: 3000000}, function(e, contract){ - if(!e) { - if(!contract.address) { - console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); - } else { - console.log("Contract mined! Address: " + contract.address); - REG_ADDR = contract.address; - fs.writeFile(REG_ADDR_FILE, REG_ADDR); - reg = contract; - startServer(); - } + var REG = JSON.parse(data); + regABI = JSON.parse(REG.contracts.registrar.GlobalRegistrar.abi); + console.log(regABI); + regContract = web3.eth.contract(regABI); + waitForGaz(3000000, function(){ + regContract.new({ from: coinbase, + data: '0x'+REG.contracts.registrar.GlobalRegistrar.evm.bytecode.object, + gas: 3000000 }, function(e, contract) { + if(!e) { + if(!contract.address) { + console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { - console.log(e); - } - }); + console.log("Contract mined! Address: " + contract.address); + regAddress = contract.address; + fs.writeFile(REG_ADDR_FILE, regAddress); + reg = contract; + startServer(); + } + } else { + console.log(e); + } }); }); });