diff --git a/lib/modules/fuzzer/index.js b/lib/modules/fuzzer/index.js index 23d799f1..76ddd1f5 100644 --- a/lib/modules/fuzzer/index.js +++ b/lib/modules/fuzzer/index.js @@ -5,53 +5,107 @@ const _ = require('underscore'); // generates random inputs based on the inputs of an ABI class ContractFuzzer { - constructor(abi) { - this.abi = abi; - } + constructor(embark) { + //this.abi = abi; + this.embark = embark; + this.logger = embark.logger; + this.events = embark.events; - generateFuzz() { - this.abi.forEach((abiMethod) => { - let inputTypes = abiMethod.inputs.map(input => input.type); - let fuzzedInputType = _.reduce(inputTypes, decipherType, 0); - }) - } + this.registerConsoleCommand(); + } - getTypeFuzz(type) { - switch() { - case 'uintN' || 'intN': - - case 'bytesN': - return generateRandomStaticBytes(size); - case 'string' || 'bytes': - return generateRandomDynamicType() - case 'address': - return generateRandomAddress(); - default: - } - } + generateFuzz(iterations, contract) { + let fuzz = []; + for (let i = 0; i < iterations; i++) + contract.abiDefinition.forEach((abiMethod) => { + let inputTypes = abiMethod.inputs.map(input => input.type); + console.log("INPUT TYPES:", inputTypes); + let fuzzedInputs = _.map(inputTypes, this.getTypeFuzz.bind(this)); + console.log("FUZZED INPUTS:", fuzzedInputs); + //fuzz.push(ethAbi.encodeFunctionCall(abiMethod, fuzzedInputs)); + console.log("FUZZ SO FAR:", fuzz); + }); + console.log("FUZZ:", fuzz); + return fuzz; + } - generateArrayOfType(length, type) { - var arr = []; - for (var i = 0; i < length; i++) { - arr.push(getTypeFuzz(type)); - } - return arr; - } + getTypeFuzz(typeString) { + const self = this; + console.log("TYPE:", typeString); + // Group 0: uint256[3] + // Group 1: uint256 + // Group 2: uint + // Group 3: 256 + // Group 4: [3] + // Group 5: 3 + let regexObj = typeString.match(/((bool|int|uint|bytes|string|address)([0-9]*)?)(\[([0-9]*)\])*$/); + console.log("ARRAY OBJ:", regexObj); + let type = regexObj[1]; + let size = regexObj[3]; + switch(true) { + case (regexObj[2] !== undefined): + let length = regexObj[5] === undefined ? self.generateRandomInt(256) : regexObj[5]; + return self.generateArrayOfType(length, type) + case (/bool/).test(type): + return self.generateRandomBool(); + case (/(int|uint)([0-9]*)?/).test(type): + return self.generateRandomInt(size); + case (/^bytes([0-9]{1,})/).test(type): + return self.generateRandomStaticBytes(size); + case (/(string|bytes)/).test(type): + return self.generateRandomDynamicType() + case (/address/).test(type): + return self.generateRandomAddress(); + default: + throw new Error("Couldn't find proper ethereum abi type"); + } + } - generateRandomDynamicType() { - return Math.random().toString(36).slice(2); - } + generateRandomBool() { + return _.sample([true, false]); + } - generateRandomStaticBytes(size) { - return utils.randomHex(size); - } + generateArrayOfType(length, type) { + var arr = []; + for (var i = 0; i < length; i++) { + arr.push(this.getTypeFuzz(type)); + } + return arr; + } - generateRandomInt(size) { - return utils.hexToNumber(utils.randomHex(size)); - } + generateRandomDynamicType() { + return Math.random().toString(36).slice(2); + } - generateRandomAddress() { - return utils.randomHex(20); - } + generateRandomStaticBytes(size) { + return utils.randomHex(size); + } -} \ No newline at end of file + generateRandomInt(size) { + return utils.hexToNumber(utils.randomHex(size / 8)); + } + + generateRandomAddress() { + return utils.randomHex(20); + } + + registerConsoleCommand() { + const self = this; + self.embark.registerConsoleCommand((cmd, _options) => { + let splitCmd = cmd.split(' '); + let cmdName = splitCmd[0]; + let contractName = splitCmd[1]; + let iterations = splitCmd[2] === undefined ? 1 : splitCmd[2]; + if (cmdName === 'fuzz') { + self.events.request('contracts:contract', contractName, (contract) => { + self.logger.info("-- fuzzed vals for " + contractName); + this.generateFuzz(1, contract); + }); + return ""; + } + return false; + }); + } +} + +module.exports = ContractFuzzer; diff --git a/lib/modules/profiler/index.js b/lib/modules/profiler/index.js index f5fe8654..d5f40fa7 100644 --- a/lib/modules/profiler/index.js +++ b/lib/modules/profiler/index.js @@ -37,7 +37,7 @@ class Profiler { return paramString; } - generateGasEstimation(method) { + /*generateGasEstimation(method) { } @@ -46,7 +46,7 @@ class Profiler { case "uint256": case "uint" } - } + }*/ registerConsoleCommand() { const self = this;