From e85fd4ce7f5d9663500da145cfbb6d484c5e4bc0 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 28 Nov 2016 14:43:00 +0100 Subject: [PATCH] fix rebasing from decodeComplexType --- src/solidity/types/ArrayType.js | 6 +-- src/solidity/types/util.js | 65 ++++++++++----------------------- test/solidity/storageDecoder.js | 53 +++------------------------ 3 files changed, 28 insertions(+), 96 deletions(-) diff --git a/src/solidity/types/ArrayType.js b/src/solidity/types/ArrayType.js index 3e3557f6fe..2358d5d0a8 100644 --- a/src/solidity/types/ArrayType.js +++ b/src/solidity/types/ArrayType.js @@ -23,7 +23,7 @@ function ArrayType (underlyingType, arraySize) { ArrayType.prototype.decodeFromStorage = function (location, storageContent) { var ret = [] var size = null - var slotValue = util.extractValue(location, storageContent, this.storageBytes) + var slotValue = util.extractHexValue(location, storageContent, this.storageBytes) if (!slotValue) { return [] } @@ -32,8 +32,8 @@ ArrayType.prototype.decodeFromStorage = function (location, storageContent) { slot: location.slot } if (this.arraySize === 'dynamic') { - size = util.toBN(slotValue) - currentLocation.slot = util.dynamicTypePointer(location.slot) + size = util.toBN('0x' + slotValue) + currentLocation.slot = util.sha3(location.slot) if (!storageContent[currentLocation.slot]) { return [] } diff --git a/src/solidity/types/util.js b/src/solidity/types/util.js index c9405339e2..518e75c7da 100644 --- a/src/solidity/types/util.js +++ b/src/solidity/types/util.js @@ -6,7 +6,9 @@ module.exports = { readFromStorage: readFromStorage, decodeInt: decodeInt, extractHexValue: extractHexValue, - sha3: sha3 + sha3: sha3, + toBN: toBN, + add: add } function decodeInt (location, storageContent, byteLength, signed) { @@ -31,36 +33,6 @@ function readFromStorage (slot, storageContent) { } else { ret = '000000000000000000000000000000000000000000000000000000000000000' } - return extractSlotValue(storageContent[slot], storageBytes, location) - }, - - dynamicTypePointer: function (slot) { - var remoteSlot = toLongHex(slot) - var key = ethutil.sha3(remoteSlot) - return ethutil.bufferToHex(key) - }, - - toLongHex: toLongHex, - toBN: toBN, - add: add -} - -function toLongHex (slot) { - if (slot instanceof BN) { - slot = '0x' + slot.toString(16) - } - return ethutil.bufferToHex(ethutil.setLengthLeft(slot, 32)) -} - -function extractSlotValue (slotValue, storageBytes, location) { - slotValue = slotValue.replace('0x', '') - var offset = slotValue.length - 2 * location.offset - 2 * storageBytes - if (offset >= 0) { - return '0x' + slotValue.substr(offset, 2 * storageBytes) - } else if (offset + 2 * storageBytes > 0) { - return '0x' + slotValue.substr(0, 2 * storageBytes + offset) - } else { - return '0x0' } if (ret.length < 64) { ret = (new Array(64 - ret.length + 1).join('0')) + ret @@ -80,21 +52,6 @@ function extractHexByteSlice (slotValue, byteLength, offsetFromLSB) { return slotValue.substr(offset, 2 * byteLength) } -function toBN (value) { - if (value instanceof BN) { - return value - } else if (value.indexOf && value.indexOf('0x') === 0) { - value = ethutil.unpad(value.replace('Ox', '')) - value = new BN(value === '' ? '0' : value, 16) - } else if (!isNaN(value)) { - value = new BN(value) - } - return value -} - -function add (value1, value2) { - return toBN(value1).add(toBN(value2)) -} /** * @returns a hex encoded storage content at the given @arg location. it does not have Ox prefix but always has the full length. * @@ -112,3 +69,19 @@ function sha3 (slot) { var key = ethutil.sha3(remoteSlot) return ethutil.bufferToHex(key) } + +function toBN (value) { + if (value instanceof BN) { + return value + } else if (value.indexOf && value.indexOf('0x') === 0) { + value = ethutil.unpad(value.replace('Ox', '')) + value = new BN(value === '' ? '0' : value, 16) + } else if (!isNaN(value)) { + value = new BN(value) + } + return value +} + +function add (value1, value2) { + return toBN(value1).add(toBN(value2)) +} diff --git a/test/solidity/storageDecoder.js b/test/solidity/storageDecoder.js index 1c4b594391..8eb55e4f1a 100644 --- a/test/solidity/storageDecoder.js +++ b/test/solidity/storageDecoder.js @@ -55,47 +55,6 @@ function testIntStorage (st) { function testByteStorage (st) { var byteStorage = require('./contracts/byteStorage') var output = compiler.compile(byteStorage.contract, 0) - var decoded = stateDecoder.solidityState(byteStorage.storage, output.sources, 'byteStorage') - st.equal(decoded['b1'], false) - st.equal(decoded['a1'], '0xfe350f199f244ac9a79038d254400b632a633225') - st.equal(decoded['b2'], true) - st.equal(decoded['dynb1'], '0x64796e616d69636279746573') - st.equal(decoded['stab'], '0x1') - st.equal(decoded['stab1'], '0x12') - st.equal(decoded['stab2'], '0x1579') - st.equal(decoded['stab3'], '0x359356') - st.equal(decoded['stab4'], '0x2375') - st.equal(decoded['stab5'], '0x2357645') - st.equal(decoded['stab6'], '0x324435') - st.equal(decoded['stab7'], '0x324324') - st.equal(decoded['stab8'], '0x324554645765') - st.equal(decoded['stab9'], '0x3434543') - st.equal(decoded['stab10'], '0x4543543654657') - st.equal(decoded['stab11'], '0x54354654') - st.equal(decoded['stab12'], '0x3') - st.equal(decoded['stab13'], '0x3243242345435') - st.equal(decoded['stab14'], '0x32454354354353') - st.equal(decoded['stab15'], '0x32454434435') - st.equal(decoded['stab16'], '0x3245435444') - st.equal(decoded['stab17'], '0x32454343243243245') - st.equal(decoded['stab18'], '0x324534325435435') - st.equal(decoded['stab19'], '0x324543435435435') - st.equal(decoded['stab20'], '0x32454543543AB35') - st.equal(decoded['stab21'], '0x32454432423435') - st.equal(decoded['stab22'], '0x324543AEF5') - st.equal(decoded['stab23'], '0x3245435FFF') - st.equal(decoded['stab24'], '0x3245435F') - st.equal(decoded['stab25'], '0x3245435F') - st.equal(decoded['stab26'], '0x3245435F') - st.equal(decoded['stab27'], '0x3245FFFFFFF') - st.equal(decoded['stab28'], '0x3241235') - st.equal(decoded['stab29'], '0x325213213') - st.equal(decoded['stab30'], '0x3245435232423') - st.equal(decoded['stab31'], '0x3245435123') - st.equal(decoded['stab32'], '0x324324423432543543AB') - st.equal(decoded['enumDec'], 'd') - st.equal(decoded['str1'], 'short') - st.equal(decoded['str2'], 'long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long__long') for (var storage of [byteStorage.storage, shrinkStorage(byteStorage.storage)]) { var decoded = stateDecoder.solidityState(storage, output.sources, 'byteStorage') st.equal(decoded['b1'], false) @@ -270,15 +229,15 @@ function testStructArrayStorage (st) { st.equal(decoded['dyn2'][1][3][1], '-23') st.equal(decoded['dyn2'][1][3][2], '-28') st.equal(decoded['arrayStruct'][0][0].i8, '34') - st.equal(decoded['arrayStruct'][0][0].str, 'test_str_short') + st.equal(decoded['arrayStruct'][0][0].str.value, 'test_str_short') st.equal(decoded['arrayStruct'][0][1].i8, '-123') - st.equal(decoded['arrayStruct'][0][1].str, 'test_str_long test_str_lo ngtest_str_longtest_str_ longtest_str_longtest_ str_longtest_str_l ongtest_str_long') + st.equal(decoded['arrayStruct'][0][1].str.value, 'test_str_long test_str_lo ngtest_str_longtest_str_ longtest_str_longtest_ str_longtest_str_l ongtest_str_long') st.equal(decoded['arrayStruct'][1][0].i8, '50') - st.equal(decoded['arrayStruct'][1][0].str, 'test_str_short') + st.equal(decoded['arrayStruct'][1][0].str.value, 'test_str_short') st.equal(decoded['arrayStruct'][2][0].i8, '60') - st.equal(decoded['arrayStruct'][2][0].str, 'test_str_short') + st.equal(decoded['arrayStruct'][2][0].str.value, 'test_str_short') st.equal(decoded['arrayStruct'][2][1].i8, '84') - st.equal(decoded['arrayStruct'][2][1].str, 'test_str_long test_str_lo ngtest_str_longtest_str_ longtest_str_longtest_ str_longtest_str_l ongtest_str_long') + st.equal(decoded['arrayStruct'][2][1].str.value, 'test_str_long test_str_lo ngtest_str_longtest_str_ longtest_str_longtest_ str_longtest_str_l ongtest_str_long') st.equal(decoded['arrayStruct'][2][2].i8, '-34') - st.equal(decoded['arrayStruct'][2][2].str, 'test_str_short') + st.equal(decoded['arrayStruct'][2][2].str.value, 'test_str_short') }