diff --git a/src/solidity/decodeInfo.js b/src/solidity/decodeInfo.js index 2550d2639c..e85611e008 100644 --- a/src/solidity/decodeInfo.js +++ b/src/solidity/decodeInfo.js @@ -254,12 +254,13 @@ function getStructMembers (type, stateDefinitions, contractName, location) { * @return {String} returns the token type (used to instanciate the right decoder) (uint[2] storage ref[2] will return 'array', uint256 will return uintX) */ function typeClass (fullType) { + fullType = util.removeLocation(fullType) + if (fullType.lastIndexOf(']') === fullType.length - 1) { + return 'array' + } if (fullType.indexOf('mapping') === 0) { return 'mapping' } - if (fullType.indexOf(']') !== -1) { - return 'array' - } if (fullType.indexOf(' ') !== -1) { fullType = fullType.split(' ')[0] } diff --git a/src/solidity/localDecoder.js b/src/solidity/localDecoder.js index c9841fa169..28f3a8de41 100644 --- a/src/solidity/localDecoder.js +++ b/src/solidity/localDecoder.js @@ -8,10 +8,16 @@ function solidityLocals (vmtraceIndex, internalTreeCall, stack, memory, storage, } var locals = {} memory = formatMemory(memory) + var anonymousIncr = 1 for (var local in scope.locals) { let variable = scope.locals[local] if (variable.stackDepth < stack.length && variable.sourceLocation.start <= currentSourceLocation.start) { - locals[variable.name] = variable.type.decodeFromStack(variable.stackDepth, stack, memory, storage) + var name = variable.name + if (name === '') { + name = '<' + anonymousIncr + '>' + anonymousIncr++ + } + locals[name] = variable.type.decodeFromStack(variable.stackDepth, stack, memory, storage) } } return locals diff --git a/src/solidity/types/util.js b/src/solidity/types/util.js index 64324c293c..6ae7ed489a 100644 --- a/src/solidity/types/util.js +++ b/src/solidity/types/util.js @@ -11,7 +11,8 @@ module.exports = { sha3: sha3, toBN: toBN, add: add, - extractLocation: extractLocation + extractLocation: extractLocation, + removeLocation: removeLocation } function decodeInt (location, storageContent, byteLength, signed) { @@ -93,6 +94,10 @@ function add (value1, value2) { return toBN(value1).add(toBN(value2)) } +function removeLocation (type) { + return type.replace(/( storage ref| storage pointer| memory| calldata)/g, '') +} + function extractLocation (type) { var match = type.match(/( storage ref| storage pointer| memory| calldata)?$/) if (match[1] !== '') {