mirror of
https://github.com/embarklabs/embark.git
synced 2025-01-12 23:05:07 +00:00
7a34b9d675
In case the contract don't exist or the profile command don't have argument, embark don't crash and return an error
73 lines
2.5 KiB
JavaScript
73 lines
2.5 KiB
JavaScript
const asciiTable = require('ascii-table');
|
|
const GasEstimator = require('./gasEstimator.js');
|
|
|
|
class Profiler {
|
|
constructor(embark) {
|
|
this.embark = embark;
|
|
this.logger = embark.logger;
|
|
this.events = embark.events;
|
|
this.gasEstimator = new GasEstimator(embark);
|
|
|
|
this.registerConsoleCommand();
|
|
}
|
|
|
|
profile(contractName, contract) {
|
|
const self = this;
|
|
let table = new asciiTable(contractName);
|
|
table.setHeading('Function', 'Payable', 'Mutability', 'Inputs', 'Outputs', 'Gas Estimates');
|
|
self.gasEstimator.estimateGas(contractName, function(err, gastimates, name) {
|
|
if (err) {
|
|
self.logger.error('error found in method: ', name);
|
|
self.logger.error(JSON.stringify(err));
|
|
return;
|
|
}
|
|
contract.abiDefinition.forEach((abiMethod) => {
|
|
switch(abiMethod.type) {
|
|
case "constructor":
|
|
table.addRow("constructor", abiMethod.payable, abiMethod.stateMutability, self.formatParams(abiMethod.inputs), self.formatParams(abiMethod.outputs), gastimates['constructor']);
|
|
break;
|
|
case "fallback":
|
|
table.addRow("fallback", abiMethod.payable, abiMethod.stateMutability, self.formatParams(abiMethod.inputs), self.formatParams(abiMethod.outputs), gastimates['fallback']);
|
|
break;
|
|
default:
|
|
table.addRow(abiMethod.name, abiMethod.payable, abiMethod.stateMutability, self.formatParams(abiMethod.inputs), self.formatParams(abiMethod.outputs), gastimates[abiMethod.name]);
|
|
}
|
|
});
|
|
self.logger.info(table.toString());
|
|
});
|
|
}
|
|
|
|
formatParams(params) {
|
|
if (!params || !params.length) {
|
|
return "()";
|
|
}
|
|
let paramString = "(";
|
|
let mappedParams = params.map(param => param.type);
|
|
paramString += mappedParams.join(',');
|
|
paramString += ")";
|
|
return paramString;
|
|
}
|
|
|
|
registerConsoleCommand() {
|
|
const self = this;
|
|
self.embark.registerConsoleCommand((cmd, _options) => {
|
|
let cmdName = cmd.split(' ')[0];
|
|
let contractName = cmd.split(' ')[1];
|
|
if (cmdName === 'profile') {
|
|
self.events.request('contracts:contract', contractName, (contract) => {
|
|
if (!contract || !contract.deployedAddress) {
|
|
self.logger.info("-- couldn't profile " + contractName + " - it's not deployed or could be an interface");
|
|
return "";
|
|
}
|
|
self.logger.info("-- profile for " + contractName);
|
|
this.profile(contractName, contract);
|
|
});
|
|
return "";
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = Profiler;
|