You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.3 KiB
80 lines
2.3 KiB
'use strict'
|
|
var DropdownPanel = require('./DropdownPanel')
|
|
var remixSolidity = require('remix-solidity')
|
|
var localDecoder = remixSolidity.localDecoder
|
|
var solidityTypeFormatter = require('./SolidityTypeFormatter')
|
|
var remixCore = require('remix-core')
|
|
var StorageViewer = remixCore.storage.StorageViewer
|
|
var yo = require('yo-yo')
|
|
|
|
class SolidityLocals {
|
|
|
|
constructor (_parent, _traceManager, _internalTreeCall) {
|
|
this.parent = _parent
|
|
this.internalTreeCall = _internalTreeCall
|
|
this.storageResolver = null
|
|
this.traceManager = _traceManager
|
|
this.basicPanel = new DropdownPanel('Solidity Locals', {
|
|
json: true,
|
|
formatSelf: solidityTypeFormatter.formatSelf,
|
|
extractData: solidityTypeFormatter.extractData
|
|
})
|
|
this.init()
|
|
this.view
|
|
}
|
|
|
|
render () {
|
|
this.view = yo`<div id='soliditylocals' >
|
|
${this.basicPanel.render()}
|
|
</div>`
|
|
return this.view
|
|
}
|
|
|
|
init () {
|
|
var decodeTimeout = null
|
|
this.parent.event.register('sourceLocationChanged', this, (sourceLocation) => {
|
|
if (!this.storageResolver) {
|
|
this.basicPanel.setMessage('storage not ready')
|
|
return
|
|
}
|
|
if (decodeTimeout) {
|
|
window.clearTimeout(decodeTimeout)
|
|
}
|
|
this.basicPanel.setUpdating()
|
|
decodeTimeout = setTimeout(() => {
|
|
decode(this, sourceLocation)
|
|
}, 500)
|
|
})
|
|
}
|
|
}
|
|
|
|
function decode (self, sourceLocation) {
|
|
self.traceManager.waterfall([
|
|
self.traceManager.getStackAt,
|
|
self.traceManager.getMemoryAt,
|
|
self.traceManager.getCurrentCalledAddressAt],
|
|
self.parent.currentStepIndex,
|
|
(error, result) => {
|
|
if (!error) {
|
|
var stack = result[0].value
|
|
var memory = result[1].value
|
|
try {
|
|
var storageViewer = new StorageViewer({
|
|
stepIndex: self.parent.currentStepIndex,
|
|
tx: self.parent.tx,
|
|
address: result[2].value
|
|
}, self.storageResolver, self.traceManager)
|
|
localDecoder.solidityLocals(self.parent.currentStepIndex, self.internalTreeCall, stack, memory, storageViewer, sourceLocation).then((locals) => {
|
|
if (!locals.error) {
|
|
self.basicPanel.update(locals)
|
|
}
|
|
})
|
|
} catch (e) {
|
|
self.basicPanel.setMessage(e.message)
|
|
}
|
|
} else {
|
|
console.log(error)
|
|
}
|
|
})
|
|
}
|
|
module.exports = SolidityLocals
|
|
|