diff --git a/bin/embark b/bin/embark index 1a73026d6..045a0823a 100644 --- a/bin/embark +++ b/bin/embark @@ -15,12 +15,19 @@ var run = function(cmd) { } var deploy = function(env, embarkConfig) { - contractFiles = grunt.file.expand(embarkConfig.contracts); - destFile = embarkConfig.output - Embark.init() - Embark.blockchainConfig.loadConfigFile(embarkConfig.blockchainConfig) - Embark.contractsConfig.loadConfigFile(embarkConfig.contractsConfig) - abi = Embark.deployContracts(env, contractFiles, destFile) + var contractFiles = grunt.file.expand(embarkConfig.contracts); + var destFile = embarkConfig.output; + var chainFile = embarkConfig.chains; + + Embark.init(); + Embark.blockchainConfig.loadConfigFile(embarkConfig.blockchainConfig); + Embark.contractsConfig.loadConfigFile(embarkConfig.contractsConfig); + + if (chainFile === undefined) { + chainFile = './chains.json'; + } + + abi = Embark.deployContracts(env, contractFiles, destFile, chainFile); grunt.file.write(destFile, abi); } diff --git a/lib/chain_manager.js b/lib/chain_manager.js index 517a22d5d..157d6423a 100644 --- a/lib/chain_manager.js +++ b/lib/chain_manager.js @@ -4,11 +4,13 @@ var sha3_256 = require('js-sha3').sha3_256; ChainManager = function() { this.currentChain = {}; + this.file = ""; } ChainManager.prototype.loadConfigFile = function(filename) { try { var obj = JSON.parse(fs.readFileSync(filename)); + this.file = filename; this.chainManagerConfig = obj; } catch (e) { throw new Error("error reading " + filename); @@ -21,9 +23,7 @@ ChainManager.prototype.loadConfig = function(config) { return this; }; -ChainManager.prototype.init = function(env, blockchainConfig) { - var config = blockchainConfig.config(env); - +ChainManager.prototype.init = function(env, config) { web3.setProvider(new web3.providers.HttpProvider("http://" + config.rpcHost + ":" + config.rpcPort)); var chainId = web3.eth.getBlock(0).hash; @@ -46,5 +46,9 @@ ChainManager.prototype.getContract = function(code) { return this.currentChain.contracts[sha3_256(code)]; } +ChainManager.prototype.save = function() { + fs.writeFileSync(this.file, JSON.stringify(this.chainManagerConfig)); +} + module.exports = ChainManager; diff --git a/lib/deploy.js b/lib/deploy.js index 9378dbabc..53ddb644b 100644 --- a/lib/deploy.js +++ b/lib/deploy.js @@ -10,9 +10,11 @@ sleep = function sleep(ms) { while (new Date().getTime() < start + ms); } -Deploy = function(env, contractFiles, blockchainConfig, contractsConfig) { +Deploy = function(env, contractFiles, blockchainConfig, contractsConfig, chainManager) { //this.blockchainConfig = (new Config.Blockchain()).loadConfigFile('config/blockchain.yml').config(env); this.blockchainConfig = blockchainConfig; + this.chainManager = chainManager; + this.chainManager.init(env, this.blockchainConfig); //this.contractsManager = (new Config.Contracts(contractFiles, blockchainConfig)).loadConfigFile('config/contracts.yml'); this.contractsManager = contractsConfig; diff --git a/lib/index.js b/lib/index.js index 25b56b619..b6ce5cc13 100644 --- a/lib/index.js +++ b/lib/index.js @@ -22,6 +22,7 @@ Embark = { this.blockchainConfig = (new Config.Blockchain()); this.compiler = (new Compiler(this.blockchainConfig)); this.contractsConfig = (new Config.Contracts(this.blockchainConfig, this.compiler)); + this.chainManager = (new ChainManager()); }, tests: function(contractFiles) { @@ -33,9 +34,11 @@ Embark = { chain.startChain(use_tmp); }, - deployContracts: function(env, contractFiles, destFile) { + deployContracts: function(env, contractFiles, destFile, chainFile) { this.contractsConfig.init(contractFiles, env); - var deploy = new Deploy(env, contractFiles, this.blockchainConfig.config(env), this.contractsConfig); + + this.chainManager.loadConfigFile(chainFile) + var deploy = new Deploy(env, contractFiles, this.blockchainConfig.config(env), this.contractsConfig, this.chainManager); deploy.deploy_contracts(env); return deploy.generate_abi_file(destFile); }, diff --git a/test/chain_manager.js b/test/chain_manager.js index 83a63d8d3..26dcd13dd 100644 --- a/test/chain_manager.js +++ b/test/chain_manager.js @@ -2,10 +2,14 @@ var ChainManager = require('../lib/chain_manager.js'); var Config = require('../lib/config/config.js'); var Blockchain = require('../lib/blockchain.js'); var assert = require('assert'); +var fs = require('fs'); describe('embark.chain_manager', function() { - var chainManager = (new ChainManager()).loadConfigFile('./test/support/chain_manager.json'); - var blockchainConfig = (new Config.Blockchain()).loadConfigFile('test/support/blockchain.yml'); + var chainFile = './test/support/chain_manager.json'; + fs.writeFileSync(chainFile, '{}'); + + var chainManager = (new ChainManager()).loadConfigFile(chainFile); + var blockchainConfig = (new Config.Blockchain()).loadConfigFile('test/support/blockchain.yml').config('development'); describe('#init', function() { chainManager.init('development', blockchainConfig); @@ -41,4 +45,16 @@ describe('embark.chain_manager', function() { }); + describe('#save', function() { + + it('should save changes in the chain', function() { + chainManager.save(); + + var chainFile = './test/support/chain_manager.json'; + var content = fs.readFileSync(chainFile).toString(); + assert.equal(content, '{"0x629e768beb87dc8c54a475d310a7196e86c97d0006e5a6d34a8217726c90223f":{"contracts":{"d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573e":{"name":"Foo","address":"0x123"}}}}'); + }); + + }); + }); diff --git a/test/deploy.js b/test/deploy.js index c52ddfe35..c5df8511e 100644 --- a/test/deploy.js +++ b/test/deploy.js @@ -9,10 +9,11 @@ setDeployConfig = function(config) { var blockchainConfig = _blockchainConfig.config("development"); var compiler = new Compiler(_blockchainConfig); var contractsConfig = new Config.Contracts(blockchainConfig, compiler); + var chainManager = (new ChainManager()).loadConfigFile('./test/support/chain_manager.json'); contractsConfig.loadConfigFile(config.contracts); contractsConfig.init(config.files, 'development'); compiler.init('development'); - return new Deploy('development', config.files, blockchainConfig, contractsConfig); + return new Deploy('development', config.files, blockchainConfig, contractsConfig, chainManager); } describe('embark.deploy', function() { diff --git a/test/support/chain_manager.json b/test/support/chain_manager.json index 0967ef424..ccb1943fb 100644 --- a/test/support/chain_manager.json +++ b/test/support/chain_manager.json @@ -1 +1 @@ -{} +{"0x629e768beb87dc8c54a475d310a7196e86c97d0006e5a6d34a8217726c90223f":{"contracts":{"d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573e":{"name":"Foo","address":"0x123"}}}} \ No newline at end of file