diff --git a/src/solidity/types/ArrayType.js b/src/solidity/types/ArrayType.js index 480b915171..ea924f4cfb 100644 --- a/src/solidity/types/ArrayType.js +++ b/src/solidity/types/ArrayType.js @@ -24,9 +24,6 @@ ArrayType.prototype.decodeFromStorage = function (location, storageContent) { var ret = [] var size = null var slotValue = util.extractHexValue(location, storageContent, this.storageBytes) - if (!slotValue) { - return [] - } var currentLocation = { offset: 0, slot: location.slot @@ -34,28 +31,22 @@ ArrayType.prototype.decodeFromStorage = function (location, storageContent) { if (this.arraySize === 'dynamic') { size = util.toBN('0x' + slotValue) currentLocation.slot = util.sha3(location.slot) - if (!storageContent[currentLocation.slot]) { - return [] - } } else { size = new BN(this.arraySize) } var k = util.toBN(0) - var one = util.toBN(1) - var max = new BN(300) - while (k.lt(size) && k.lt(max)) { - if (currentLocation.offset + this.underlyingType.storageBytes > 32) { - currentLocation.offset = 0 - currentLocation.slot = '0x' + util.add(currentLocation.slot, one).toString(16) - } + for (; k.lt(size) && k.ltn(300); k.iaddn(1)) { ret.push(this.underlyingType.decodeFromStorage(currentLocation, storageContent)) if (this.underlyingType.storageSlots === 1 && location.offset + this.underlyingType.storageBytes <= 32) { currentLocation.offset += this.underlyingType.storageBytes + if (currentLocation.offset + this.underlyingType.storageBytes > 32) { + currentLocation.offset = 0 + currentLocation.slot = '0x' + util.add(currentLocation.slot, 1).toString(16) + } } else { currentLocation.slot = '0x' + util.add(currentLocation.slot, this.underlyingType.storageSlots).toString(16) currentLocation.offset = 0 } - k = k.add(one) } return { value: ret,