truffle-analyze
Version:
Add vulnerability and weakness analysis via the MythX
72 lines (63 loc) • 6.64 kB
JavaScript
// FIXME: Does not work
const armlet = require('armlet');
function getFormatter(style) {
const formatterName = style || 'stylish';
try {
return require(`eslint/lib/formatters/${formatterName}`);
} catch (ex) {
ex.message = `\nThere was a problem loading formatter option: ${style} \nError: ${
ex.message
}`;
throw ex;
}
}
let armletOptions = {
// ethAddress: process.env.MYTHX_ETH_ADDRESS,
password: process.env.MYTHX_PASSWORD,
platforms: ['truffle'] // client chargeback
};
if (process.env.MYTHX_PASSWORD === undefined) {
console.log('You need to set environment variable '
+ 'MYTHX_PASSWORD to run analyze.');
return;
}
if (process.env.MYTHX_ETH_ADDRESS) {
armletOptions.ethAddress = process.env.MYTHX_ETH_ADDRESS;
} else if (process.env.MYTHX_EMAIL) {
armletOptions.email = process.env.MYTHX_EMAIL;
} else {
console.log('You need to set either environment variable '
+ 'MYTHX_ETH_ADDRESS or MYTHX_EMAIL to run analyze.');
}
var client = new armlet.Client(armletOptions);
var buildObj = {
'contractName': 'SimpleDAO',
'analysisMode': 'full',
'abi': [
{'constant':true,
'inputs':[{'name':'',
'type':'address'}]}],
'bytecode':'0x608060405234801561001057600080fd5b50610320806100206000396000f300608060405260043610610061576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062362a95146100665780632e1a7d4d1461009c57806359f1286d146100c9578063d5d44d8014610120575b600080fd5b61009a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610177565b005b3480156100a857600080fd5b506100c7600480360381019080803590602001909291905050506101c6565b005b3480156100d557600080fd5b5061010a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610294565b6040518082815260200191505060405180910390f35b34801561012c57600080fd5b50610161600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506102dc565b6040518082815260200191505060405180910390f35b346000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555050565b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515610291573373ffffffffffffffffffffffffffffffffffffffff168160405160006040518083038185875af192505050151561024457600080fd5b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600060205280600052604060002060009150905054815600a165627a7a72305820682f37da4d79d535733d236127bfb99bc8e8214b575c4ef2521accae7e6b4e330029',
'deployedBytecode':'0x608060405260043610610061576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062362a95146100665780632e1a7d4d1461009c57806359f1286d146100c9578063d5d44d8014610120575b600080fd5b61009a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610177565b005b3480156100a857600080fd5b506100c7600480360381019080803590602001909291905050506101c6565b005b3480156100d557600080fd5b5061010a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610294565b6040518082815260200191505060405180910390f35b34801561012c57600080fd5b50610161600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506102dc565b6040518082815260200191505060405180910390f35b346000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555050565b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515610291573373ffffffffffffffffffffffffffffffffffffffff168160405160006040518083038185875af192505050151561024457600080fd5b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600060205280600052604060002060009150905054815600a165627a7a72305820682f37da4d79d535733d236127bfb99bc8e8214b575c4ef2521accae7e6b4e330029',
'sourceMap': '195:408:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;195:408:1;;;;;;;',
'deployedSourceMap': '195:408:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;262:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;342:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;342:169:1;;;;;;;;;;;;;;;;;;;;;;;;;;515:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;515:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;218:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;218:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;262:76;324:9;310:6;:10;317:2;310:10;;;;;;;;;;;;;;;;:23;;;;;;;;;;;262:76;:::o;342:169::-;410:6;389;:18;396:10;389:18;;;;;;;;;;;;;;;;:27;;385:122;;;434:10;:15;;456:6;434:31;;;;;;;;;;;;;;;;;426:40;;;;;;;;494:6;474;:18;481:10;474:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;385:122;342:169;:::o;515:86::-;568:4;586:6;:10;593:2;586:10;;;;;;;;;;;;;;;;579:17;;515:86;;;:::o;218:39::-;;;;;;;;;;;;;;;;;:::o',
'sourceList': ['SimpleDAO'],
'sources': {
'SimpleDAO':['/*\n * @source: http://blockchain.unica.it/projects/ethereum-survey/attacks.html#simpledao\n * @author: Atzei N., Bartoletti M., Cimoli T\n * Modified by Josselin Feist\n */\npragma solidity 0.4.25;\n\ncontract SimpleDAO {\n mapping (address => uint) public credit;\n\n function donate(address to) payable public{\n credit[to] += msg.value;\n }\n\n function withdraw(uint amount) public{\n if (credit[msg.sender]>= amount) {\n require(msg.sender.call.value(amount)());\n credit[msg.sender]-=amount;\n }\n }\n\n function queryCredit(address to) view public returns(uint){\n return credit[to];\n }\n}\n']
}
};
const options = {
debug: true,
data: buildObj
};
const solidityFile = 'SimpleDAO.sol';
client.analyze(options)
.then(issues => {
const formatter = getFormatter('stylish');
let esIssues = mythx.issues2Eslint(issues, buildObj, options);
// console.log(esIssues); // debug
// esReporter.printReport(esIssues, solidityFile, formatter, console.log);
}).catch(err => {
console.log(err);
});