diff --git a/libs/remix-debug/src/storage/storageResolver.js b/libs/remix-debug/src/storage/storageResolver.js index 0de8fbd161..8186e87368 100644 --- a/libs/remix-debug/src/storage/storageResolver.js +++ b/libs/remix-debug/src/storage/storageResolver.js @@ -39,17 +39,14 @@ class StorageResolver { * @param {Array} corrections - used in case the calculated sha3 has been modifyed before SSTORE (notably used for struct in mapping). * @return {Function} - callback */ - initialPreimagesMappings (tx, stepIndex, address, corrections) { - return new Promise((resolve, reject) => { - if (this.preimagesMappingByAddress[address]) { - return resolve(this.preimagesMappingByAddress[address]) - } - this.storageRange(tx, stepIndex, address).then((storage) => { - const mappings = mappingPreimages.decodeMappingsKeys(this.web3, storage, corrections) - this.preimagesMappingByAddress[address] = mappings - resolve(mappings) - }).catch(reject) - }) + async initialPreimagesMappings (tx, stepIndex, address, corrections) { + if (this.preimagesMappingByAddress[address]) { + return this.preimagesMappingByAddress[address] + } + const storage = await this.storageRange(tx, stepIndex, address) + const mappings = mappingPreimages.decodeMappingsKeys(this.web3, storage, corrections) + this.preimagesMappingByAddress[address] = mappings + return mappings } /** @@ -61,12 +58,9 @@ class StorageResolver { * @param {String} - address - lookup address * @param {Function} - callback - {key, hashedKey, value} - */ - storageSlot (slot, tx, stepIndex, address) { - return new Promise((resolve, reject) => { - this.storageRangeInternal(this, slot, tx, stepIndex, address).then((storage) => { - resolve(storage[slot] !== undefined ? storage[slot] : null) - }).catch(reject) - }) + async storageSlot (slot, tx, stepIndex, address) { + const storage = await this.storageRangeInternal(this, slot, tx, stepIndex, address) + return (storage[slot] !== undefined ? storage[slot] : null) } /** @@ -85,27 +79,21 @@ class StorageResolver { * even if the next 1000 items are not in the cache. * - If @arg slot is not cached, the corresponding value will be resolved and the next 1000 slots. */ - storageRangeInternal (self, slotKey, tx, stepIndex, address) { - return new Promise((resolve, reject) => { - var cached = this.fromCache(self, address) - if (cached && cached.storage[slotKey]) { // we have the current slot in the cache and maybe the next 1000... - return resolve(cached.storage) - } - this.storageRangeWeb3Call(tx, address, slotKey, self.maxSize).then((result) => { - const [storage, nextKey] = result - if (!storage[slotKey] && slotKey !== self.zeroSlot) { // we don't cache the zero slot (could lead to inconsistency) - storage[slotKey] = { - key: slotKey, - value: self.zeroSlot - } - } - self.toCache(self, address, storage) - if (slotKey === self.zeroSlot && !nextKey) { // only working if keys are sorted !! - self.storageByAddress[address].complete = true - } - return resolve(storage) - }).catch(reject) - }) + async storageRangeInternal (self, slotKey, tx, stepIndex, address) { + var cached = this.fromCache(self, address) + if (cached && cached.storage[slotKey]) { // we have the current slot in the cache and maybe the next 1000... + return cached.storage + } + const result = await this.storageRangeWeb3Call(tx, address, slotKey, self.maxSize) + const [storage, nextKey] = result + if (!storage[slotKey] && slotKey !== self.zeroSlot) { // we don't cache the zero slot (could lead to inconsistency) + storage[slotKey] = {key: slotKey, value: self.zeroSlot} + } + self.toCache(self, address, storage) + if (slotKey === self.zeroSlot && !nextKey) { // only working if keys are sorted !! + self.storageByAddress[address].complete = true + } + return storage } /**