embark-area-51/lib/contracts.js

120 lines
3.4 KiB
JavaScript
Raw Normal View History

2016-08-14 12:04:34 +00:00
var Compiler = require('./compiler.js');
2016-09-27 04:55:35 +00:00
var toposort = require('toposort');
2016-08-14 12:04:34 +00:00
2016-08-22 03:40:05 +00:00
var ContractsManager = function(options) {
this.contractFiles = options.contractFiles;
this.contractsConfig = options.contractsConfig;
2016-08-14 12:04:34 +00:00
this.contracts = {};
this.logger = options.logger;
2016-09-27 04:55:35 +00:00
this.contractDependencies = {};
2016-08-14 12:04:34 +00:00
};
ContractsManager.prototype.init = function() {
this.compiledContracts = this.compileContracts();
};
ContractsManager.prototype.compileContracts = function() {
var compiler = new Compiler();
return compiler.compile_solidity(this.contractFiles);
};
ContractsManager.prototype.build = function() {
2016-09-27 04:55:35 +00:00
// determine dependencies
for (var className in this.compiledContracts) {
var contract = this.compiledContracts[className];
var contractConfig = this.contractsConfig.contracts[className];
if (this.contractsConfig.args === null || this.contractsConfig.args === []) continue;
var ref = contractConfig.args; //get arguments
for (var j = 0; j < ref.length; j++) {
var arg = ref[j];
if (arg[0] === "$") {
if (this.contractDependencies[className] === void 0) {
this.contractDependencies[className] = [];
}
this.contractDependencies[className].push(arg.substr(1));
}
}
}
2016-08-14 12:04:34 +00:00
for(var className in this.compiledContracts) {
var contract = this.compiledContracts[className];
2016-09-23 09:59:08 +00:00
var contractConfig = this.contractsConfig.contracts[className];
2016-08-14 12:04:34 +00:00
if (this.contractsConfig.gas === 'auto') {
var maxGas = Math.max(contract.gasEstimates.creation[0], contract.gasEstimates.creation[1], 500000);
var adjustedGas = Math.round(maxGas * 1.01);
contract.gas = adjustedGas;
} else {
contract.gas = this.contractsConfig.gas;
}
2016-08-14 12:04:34 +00:00
contract.gasPrice = this.contractsConfig.gasPrice;
if (contractConfig === undefined) {
contract.args = [];
} else {
contract.args = contractConfig.args || [];
}
contract.className = className;
this.contracts[className] = contract;
}
};
2016-09-27 04:55:35 +00:00
ContractsManager.prototype.getContract = function(className) {
return this.compiledContracts[className];
};
ContractsManager.prototype.sortContracts = function(contractList) {
var converted_dependencies = [], i;
for(var contract in this.contractDependencies) {
var dependencies = this.contractDependencies[contract];
for(var i=0; i < dependencies.length; i++) {
converted_dependencies.push([contract, dependencies[i]]);
}
}
var orderedDependencies = toposort(converted_dependencies).reverse();
var newList = contractList.sort(function(a,b) {
var order_a = orderedDependencies.indexOf(a.className);
var order_b = orderedDependencies.indexOf(b.className);
return order_a - order_b;
});
return newList;
};
// TODO: should be built contracts
2016-08-14 12:04:34 +00:00
ContractsManager.prototype.listContracts = function() {
var contracts = [];
for(var className in this.compiledContracts) {
var contract = this.compiledContracts[className];
contracts.push(contract);
}
2016-09-27 04:55:35 +00:00
return this.sortContracts(contracts);
2016-08-14 12:04:34 +00:00
};
ContractsManager.prototype.contractsState = function() {
var data = [];
for(var className in this.contracts) {
var contract = this.contracts[className];
data.push([
className.green,
2016-09-25 02:41:55 +00:00
(contract.deployedAddress || '...').green,
((contract.deployedAddress !== undefined) ? "\t\tDeployed".green : "\t\tPending".magenta)
]);
}
return data;
};
2016-08-14 12:04:34 +00:00
module.exports = ContractsManager;