2015-06-28 02:20:07 +00:00
|
|
|
var web3 = require('web3');
|
|
|
|
var fs = require('fs');
|
|
|
|
var grunt = require('grunt');
|
|
|
|
var readYaml = require('read-yaml');
|
2015-06-28 13:51:58 +00:00
|
|
|
var Config = require('./config/config.js');
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
Deploy = function(env, contractFiles, blockchainConfig, contractsConfig) {
|
|
|
|
//this.blockchainConfig = (new Config.Blockchain()).loadConfigFile('config/blockchain.yml').config(env);
|
|
|
|
this.blockchainConfig = blockchainConfig;
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
//this.contractsManager = (new Config.Contracts(contractFiles, blockchainConfig)).loadConfigFile('config/contracts.yml');
|
|
|
|
this.contractsManager = contractsConfig;
|
|
|
|
this.contractsConfig = this.contractsManager.config(env);
|
|
|
|
this.deployedContracts = {};
|
2015-06-28 02:20:07 +00:00
|
|
|
|
|
|
|
try {
|
2015-07-03 08:59:33 +00:00
|
|
|
web3.setProvider(new web3.providers.HttpProvider("http://" + this.blockchainConfig.rpcHost + ":" + this.blockchainConfig.rpcPort));
|
2015-06-28 02:20:07 +00:00
|
|
|
primaryAddress = web3.eth.coinbase;
|
|
|
|
web3.eth.defaultAccount = primaryAddress;
|
2015-07-04 02:41:39 +00:00
|
|
|
} catch (e) {
|
|
|
|
throw new Error("==== can't connect to " + this.blockchainConfig.rpcHost + ":" + this.blockchainConfig.rpcPort + " check if an ethereum node is running");
|
2015-06-28 02:20:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
console.log("address is : " + primaryAddress);
|
2015-07-04 02:41:39 +00:00
|
|
|
};
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
Deploy.prototype.deploy_contracts = function(env) {
|
|
|
|
this.contractsManager.compileContracts(env);
|
|
|
|
all_contracts = this.contractsManager.all_contracts;
|
|
|
|
this.contractDB = this.contractsManager.contractDB;
|
|
|
|
contractDependencies = this.contractsManager.contractDependencies;
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
this.deployedContracts = {};
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
for (k = 0; k < all_contracts.length; k++) {
|
2015-06-28 02:20:07 +00:00
|
|
|
className = all_contracts[k];
|
2015-07-03 08:59:33 +00:00
|
|
|
contract = this.contractDB[className];
|
|
|
|
|
|
|
|
contractGasLimit = (this.contractsConfig != null ? (ref1 = this.contractsConfig[className]) != null ? ref1.gasLimit : void 0 : void 0) || this.blockchainConfig.gasLimit;
|
|
|
|
contractGasPrice = (this.contractsConfig != null ? (ref2 = this.contractsConfig[className]) != null ? ref2.gasPrice : void 0 : void 0) || this.blockchainConfig.gasPrice;
|
|
|
|
|
|
|
|
args = (this.contractsConfig != null ? (ref3 = this.contractsConfig[className]) != null ? ref3.args : void 0 : void 0) || [];
|
|
|
|
|
2015-06-28 02:20:07 +00:00
|
|
|
contractObject = web3.eth.contract(contract.info.abiDefinition);
|
2015-07-03 08:59:33 +00:00
|
|
|
|
2015-06-28 02:20:07 +00:00
|
|
|
realArgs = [];
|
|
|
|
for (l = 0, len3 = args.length; l < len3; l++) {
|
|
|
|
arg = args[l];
|
|
|
|
if (arg[0] === "$") {
|
2015-07-03 08:59:33 +00:00
|
|
|
realArgs.push(this.deployedContracts[arg.substr(1)]);
|
2015-06-28 02:20:07 +00:00
|
|
|
} else {
|
|
|
|
realArgs.push(arg);
|
|
|
|
}
|
|
|
|
}
|
2015-07-03 08:59:33 +00:00
|
|
|
|
2015-06-28 02:20:07 +00:00
|
|
|
contractParams = realArgs;
|
|
|
|
contractParams.push({
|
|
|
|
from: primaryAddress,
|
|
|
|
data: contract.code,
|
|
|
|
gas: contractGasLimit,
|
|
|
|
gasPrice: contractGasPrice
|
|
|
|
});
|
2015-07-03 08:59:33 +00:00
|
|
|
|
2015-06-28 02:20:07 +00:00
|
|
|
contractAddress = contractObject["new"].apply(contractObject, contractParams).address;
|
2015-07-03 08:59:33 +00:00
|
|
|
this.deployedContracts[className] = contractAddress;
|
|
|
|
|
2015-06-28 02:20:07 +00:00
|
|
|
console.log("address is " + contractAddress);
|
|
|
|
console.log("deployed " + className + " at " + contractAddress);
|
2015-07-03 08:59:33 +00:00
|
|
|
}
|
|
|
|
|
2015-07-04 02:41:39 +00:00
|
|
|
};
|
2015-07-03 08:59:33 +00:00
|
|
|
|
|
|
|
Deploy.prototype.generate_abi_file = function() {
|
|
|
|
var result;
|
|
|
|
|
|
|
|
result = "web3.setProvider(new web3.providers.HttpProvider('http://" + this.blockchainConfig.rpcHost + ":" + this.blockchainConfig.rpcPort + "'));";
|
|
|
|
result += "web3.eth.defaultAccount = web3.eth.accounts[0];";
|
|
|
|
|
|
|
|
for(className in this.deployedContracts) {
|
|
|
|
var deployedContract = this.deployedContracts[className];
|
|
|
|
var contract = this.contractDB[className];
|
|
|
|
|
|
|
|
var abi = JSON.stringify(contract.info.abiDefinition);
|
|
|
|
var contractAddress = deployedContract;
|
2015-06-28 02:20:07 +00:00
|
|
|
result += "var " + className + "Abi = " + abi + ";";
|
|
|
|
result += "var " + className + "Contract = web3.eth.contract(" + className + "Abi);";
|
|
|
|
result += "var " + className + " = " + className + "Contract.at('" + contractAddress + "');";
|
|
|
|
}
|
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
return result;
|
2015-07-04 02:41:39 +00:00
|
|
|
};
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-03 08:59:33 +00:00
|
|
|
Deploy.prototype.generate_and_write_abi_file = function(destFile) {
|
|
|
|
var result = this.generate_abi_file();
|
|
|
|
grunt.file.write(destFile, result);
|
2015-07-04 02:41:39 +00:00
|
|
|
};
|
2015-06-28 02:20:07 +00:00
|
|
|
|
2015-07-04 02:41:39 +00:00
|
|
|
module.exports = Deploy;
|
2015-06-28 02:20:07 +00:00
|
|
|
|