Commit f9c1c94a authored by yann300's avatar yann300 Committed by GitHub

Merge pull request #63 from yann300/fea1

JS VM integration
parents 09fa8163 bd910580
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
<script type="text/javascript"> <script type="text/javascript">
function loadDebugger() { function loadDebugger() {
var container = document.getElementById('app') var container = document.getElementById('app')
container.vmdebugger = new window.remix.Debugger() container.vmdebugger = new window.remix.ui.Debugger()
container.vmdebugger.addProvider('INTERNAL')
container.vmdebugger.switchProvider('INTERNAL')
container.appendChild(container.vmdebugger.render()) container.appendChild(container.vmdebugger.render())
} }
</script> </script>
......
{ {
"name": "ethereum-remix", "name": "ethereum-remix",
"version": "0.0.2-alpha.0.0.4", "version": "0.0.2-alpha.0.0.7",
"description": "Ethereum IDE and tools for the web", "description": "Ethereum IDE and tools for the web",
"contributors": [ "contributors": [
{ {
...@@ -13,17 +13,16 @@ ...@@ -13,17 +13,16 @@
} }
], ],
"main": "./src/index.js", "main": "./src/index.js",
"dependencies": {
"browserify": "^13.0.1",
"web3": "^0.15.3",
"yo-yo": "^1.2.1"
},
"devDependencies": { "devDependencies": {
"browserify": "^13.0.1",
"ethereumjs-util": "^4.5.0",
"http-server": "^0.9.0", "http-server": "^0.9.0",
"nightwatch": "^0.9.5", "nightwatch": "^0.9.5",
"standard": "^7.0.1", "standard": "^7.0.1",
"standard-reporter": "^1.0.5", "standard-reporter": "^1.0.5",
"tape": "^4.6.0", "tape": "^4.6.0",
"web3": "^0.15.3",
"yo-yo": "^1.2.1",
"yo-yoify": "^3.1.0" "yo-yoify": "^3.1.0"
}, },
"scripts": { "scripts": {
......
...@@ -13,13 +13,11 @@ var EventManager = require('../lib/eventManager') ...@@ -13,13 +13,11 @@ var EventManager = require('../lib/eventManager')
- resolvingStep: when CodeManager resolves code/selected instruction of a new step - resolvingStep: when CodeManager resolves code/selected instruction of a new step
*/ */
function CodeManager (_web3, _traceManager) { function CodeManager (_traceManager) {
util.extend(this, new EventManager()) util.extend(this, new EventManager())
this.web3 = _web3
this.isLoading = false this.isLoading = false
this.traceManager = _traceManager this.traceManager = _traceManager
this.currentAddress = '' this.currentAddress = ''
codeResolver.setWeb3(_web3)
this.codeResolver = codeResolver this.codeResolver = codeResolver
} }
......
'use strict' 'use strict'
var codeUtils = require('./codeUtils') var codeUtils = require('./codeUtils')
var util = require('../helpers/global')
module.exports = { module.exports = {
web3: null,
codes: {}, // assembly items instructions list by contract addesses codes: {}, // assembly items instructions list by contract addesses
instructionsIndexByBytesOffset: {}, // mapping between bytes offset and instructions index. instructionsIndexByBytesOffset: {}, // mapping between bytes offset and instructions index.
setWeb3: function (web3) {
this.web3 = web3
},
resolveCode: function (address, vmTraceIndex, transaction, callBack) { resolveCode: function (address, vmTraceIndex, transaction, callBack) {
var cache = this.getExecutingCodeFromCache(address) var cache = this.getExecutingCodeFromCache(address)
if (cache) { if (cache) {
...@@ -26,7 +21,7 @@ module.exports = { ...@@ -26,7 +21,7 @@ module.exports = {
loadCode: function (address, callback) { loadCode: function (address, callback) {
console.log('loading new code from web3 ' + address) console.log('loading new code from web3 ' + address)
this.web3.eth.getCode(address, function (error, result) { util.web3.eth.getCode(address, function (error, result) {
if (error) { if (error) {
console.log(error) console.log(error)
} else { } else {
......
...@@ -4,5 +4,6 @@ module.exports = { ...@@ -4,5 +4,6 @@ module.exports = {
for (var property in source) { for (var property in source) {
destination[property] = source[property] destination[property] = source[property]
} }
} },
web3: null
} }
'use strict'
module.exports = {
/*
ints: IntArray
*/
hexConvert: function (ints) {
var ret = '0x'
for (var i = 0; i < ints.length; i++) {
var h = ints[i]
if (h) {
h = h.toString(16)
ret += ('0x' + h) < 0x10 ? '0' + h : h
} else {
ret += '00'
}
}
return ret
},
/*
ints: list of IntArrays
*/
hexListConvert: function (intsList) {
var ret = []
for (var k in intsList) {
ret.push(this.hexConvert(intsList[k]))
}
return ret
},
/*
ints: ints: IntArray
*/
formatMemory: function (mem) {
var hexMem = this.hexConvert(mem).substr(2)
var ret = []
for (var k = 0; k < hexMem.length; k += 32) {
var row = hexMem.substr(k, 32)
ret.push(row)
}
return ret
}
}
'use strict' 'use strict'
var Debugger = require('./Ethdebugger') var VMDebugger = require('./ui/VmDebugger')
var Debugger = require('./ui/Ethdebugger')
var BasicPanel = require('./ui/BasicPanel')
var TraceManager = require('./trace/traceManager')
var CodeManager = require('./code/codeManager')
if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') { if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') {
module.exports = { module.exports = modules()
Debugger: Debugger
}
} }
if (window) { if (window) {
window.remix = { window.remix = modules()
Debugger: Debugger }
function modules () {
return {
code: {
codeManager: CodeManager
},
trace: {
traceManager: TraceManager
},
ui: {
Debugger: Debugger,
VMdebugger: VMDebugger,
BasicPanel: BasicPanel
}
} }
} }
...@@ -40,7 +40,6 @@ TraceAnalyser.prototype.buildReturnValues = function (index, step) { ...@@ -40,7 +40,6 @@ TraceAnalyser.prototype.buildReturnValues = function (index, step) {
var offset = 2 * parseInt(step.stack[step.stack.length - 1], 16) var offset = 2 * parseInt(step.stack[step.stack.length - 1], 16)
var size = 2 * parseInt(step.stack[step.stack.length - 2], 16) var size = 2 * parseInt(step.stack[step.stack.length - 2], 16)
var memory = this.trace[this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1]].memory var memory = this.trace[this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1]].memory
console.log('push returnValue ' + index)
this.traceCache.pushReturnValue(index, '0x' + memory.join('').substr(offset, size)) this.traceCache.pushReturnValue(index, '0x' + memory.join('').substr(offset, size))
} }
} }
......
...@@ -4,14 +4,14 @@ var TraceRetriever = require('./traceRetriever') ...@@ -4,14 +4,14 @@ var TraceRetriever = require('./traceRetriever')
var TraceCache = require('./traceCache') var TraceCache = require('./traceCache')
var TraceStepManager = require('./traceStepManager') var TraceStepManager = require('./traceStepManager')
var traceHelper = require('../helpers/traceHelper') var traceHelper = require('../helpers/traceHelper')
var util = require('../helpers/global')
function TraceManager (_web3) { function TraceManager () {
this.web3 = _web3
this.isLoading = false this.isLoading = false
this.trace = null this.trace = null
this.traceCache = new TraceCache() this.traceCache = new TraceCache()
this.traceAnalyser = new TraceAnalyser(this.traceCache) this.traceAnalyser = new TraceAnalyser(this.traceCache)
this.traceRetriever = new TraceRetriever(_web3) this.traceRetriever = new TraceRetriever()
this.traceStepManager = new TraceStepManager(this.traceAnalyser) this.traceStepManager = new TraceStepManager(this.traceAnalyser)
this.tx this.tx
} }
...@@ -20,7 +20,7 @@ function TraceManager (_web3) { ...@@ -20,7 +20,7 @@ function TraceManager (_web3) {
TraceManager.prototype.resolveTrace = function (tx, callback) { TraceManager.prototype.resolveTrace = function (tx, callback) {
this.tx = tx this.tx = tx
this.init() this.init()
if (!this.web3) callback('web3 not loaded', false) if (!util.web3) callback('web3 not loaded', false)
this.isLoading = true this.isLoading = true
var self = this var self = this
this.traceRetriever.getTrace(tx.hash, function (error, result) { this.traceRetriever.getTrace(tx.hash, function (error, result) {
......
'use strict' 'use strict'
var traceHelper = require('../helpers/traceHelper') var traceHelper = require('../helpers/traceHelper')
var util = require('../helpers/global')
function TraceRetriever (_web3) { function TraceRetriever () {
this.web3 = _web3
this.storages = {} // contains all intial storage (by addresses) this.storages = {} // contains all intial storage (by addresses)
} }
...@@ -13,7 +13,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) { ...@@ -13,7 +13,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) {
disableStack: false, disableStack: false,
fullStorage: false fullStorage: false
} }
this.web3.debug.traceTransaction(txHash, options, function (error, result) { util.web3.debug.traceTransaction(txHash, options, function (error, result) {
callback(error, result) callback(error, result)
}) })
} }
...@@ -28,7 +28,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) { ...@@ -28,7 +28,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) {
callback(null, {}) callback(null, {})
/* /*
var self = this var self = this
this.web3.debug.storageAt(tx.blockNumber.toString(), tx.transactionIndex, address, function (error, result) { util.web3.debug.storageAt(tx.blockNumber.toString(), tx.transactionIndex, address, function (error, result) {
self.storages[address] = result self.storages[address] = result
callback(error, result) callback(error, result)
}) })
...@@ -37,7 +37,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) { ...@@ -37,7 +37,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) {
} }
TraceRetriever.prototype.debugStorageAtAvailable = function () { TraceRetriever.prototype.debugStorageAtAvailable = function () {
return false // this.web3.version.node.toLowerCase().indexOf('geth') === -1 // storageAt not available if using geth return false // util.web3.version.node.toLowerCase().indexOf('geth') === -1 // storageAt not available if using geth
} }
module.exports = TraceRetriever module.exports = TraceRetriever
'use strict' 'use strict'
var style = require('./styles/basicStyles') var style = require('./styles/basicStyles')
var yo = require('yo-yo') var yo = require('yo-yo')
var CodeManager = require('./code/codeManager') var CodeManager = require('../code/codeManager')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
function ASMCode (_parent, _traceManager, _web3) { function ASMCode (_parent, _traceManager) {
this.parent = _parent this.parent = _parent
this.codeManager = new CodeManager(_web3, _traceManager) this.codeManager = new CodeManager(_traceManager)
this.code this.code
this.address this.address
this.codeView this.codeView
......
'use strict' 'use strict'
var style = require('./styles/basicStyles') var style = require('./styles/basicStyles')
var yo = require('yo-yo') var yo = require('yo-yo')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
function BasicPanel (_name, _width, _height) { function BasicPanel (_name, _width, _height) {
this.data this.data
......
'use strict' 'use strict'
var util = require('./helpers/global') var util = require('../helpers/global')
var EventManager = require('./lib/eventManager') var EventManager = require('../lib/eventManager')
var yo = require('yo-yo') var yo = require('yo-yo')
function ButtonNavigator (_traceManager) { function ButtonNavigator (_traceManager) {
......
'use strict' 'use strict'
var TxBrowser = require('./TxBrowser') var TxBrowser = require('./TxBrowser')
var StepManager = require('./StepManager') var StepManager = require('./StepManager')
var TraceManager = require('./trace/traceManager') var TraceManager = require('../trace/traceManager')
var VmDebugger = require('./VmDebugger') var VmDebugger = require('./VmDebugger')
var Sticker = require('./Sticker') var Sticker = require('./Sticker')
var style = require('./styles/basicStyles') var style = require('./styles/basicStyles')
var util = require('./helpers/global') var util = require('../helpers/global')
var EventManager = require('./lib/eventManager') var EventManager = require('../lib/eventManager')
var yo = require('yo-yo') var yo = require('yo-yo')
var init = require('./helpers/init') var ui = require('../helpers/ui')
var ui = require('./helpers/ui') var Web3Providers = require('../web3Provider/web3Providers')
var DummyProvider = require('../web3Provider/dummyProvider')
function Ethdebugger (_web3) { function Ethdebugger () {
util.extend(this, new EventManager()) util.extend(this, new EventManager())
this.currentStepIndex = -1 this.currentStepIndex = -1
this.tx this.tx
this.statusMessage = '' this.statusMessage = ''
this.view this.view
this.displayConnectionSetting = true this.web3Providers = new Web3Providers()
if (_web3) { this.addProvider('DUMMYWEB3', new DummyProvider())
this.web3 = _web3 this.switchProvider('DUMMYWEB3')
init.extendWeb3(this.web3) this.traceManager = new TraceManager()
this.displayConnectionSetting = false
} else {
this.web3 = init.loadWeb3()
}
this.traceManager = new TraceManager(this.web3)
var self = this var self = this
this.txBrowser = new TxBrowser(this.web3, this.displayConnectionSetting) this.txBrowser = new TxBrowser(this)
this.txBrowser.register('newTxLoading', this, function () { this.txBrowser.register('newTxLoading', this, function () {
self.unLoad() self.unLoad()
}) })
...@@ -44,8 +40,29 @@ function Ethdebugger (_web3) { ...@@ -44,8 +40,29 @@ function Ethdebugger (_web3) {
this.stepManager.register('stepChanged', this, function (stepIndex) { this.stepManager.register('stepChanged', this, function (stepIndex) {
self.stepChanged(stepIndex) self.stepChanged(stepIndex)
}) })
this.vmDebugger = new VmDebugger(this, this.traceManager, this.web3) this.vmDebugger = new VmDebugger(this, this.traceManager)
this.sticker = new Sticker(this, this.traceManager, this.web3) this.sticker = new Sticker(this, this.traceManager)
}
Ethdebugger.prototype.web3 = function () {
return util.web3
}
Ethdebugger.prototype.addProvider = function (type, obj) {
this.web3Providers.addProvider(type, obj)
this.trigger('providerAdded', [type])
}
Ethdebugger.prototype.switchProvider = function (type) {
var self = this
this.web3Providers.get(type, function (error, obj) {
if (error) {
console.log('provider ' + type + ' not defined')
} else {
util.web3 = obj
self.trigger('providerChanged', [type])
}
})
} }
Ethdebugger.prototype.debug = function (tx) { Ethdebugger.prototype.debug = function (tx) {
......
'use strict' 'use strict'
var BasicPanel = require('./BasicPanel') var BasicPanel = require('./BasicPanel')
var util = require('./helpers/ui') var util = require('../helpers/ui')
var yo = require('yo-yo') var yo = require('yo-yo')
function MemoryPanel (_parent, _traceManager) { function MemoryPanel (_parent, _traceManager) {
......
'use strict' 'use strict'
var style = require('./styles/sliderStyles') var style = require('./styles/sliderStyles')
var util = require('./helpers/global') var util = require('../helpers/global')
var EventManager = require('./lib/eventManager') var EventManager = require('../lib/eventManager')
var yo = require('yo-yo') var yo = require('yo-yo')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
function Slider (_traceManager) { function Slider (_traceManager) {
util.extend(this, new EventManager()) util.extend(this, new EventManager())
......
'use strict' 'use strict'
var BasicPanel = require('./BasicPanel') var BasicPanel = require('./BasicPanel')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
var yo = require('yo-yo') var yo = require('yo-yo')
function StackPanel (_parent, _traceManager) { function StackPanel (_parent, _traceManager) {
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
var ButtonNavigator = require('./ButtonNavigator') var ButtonNavigator = require('./ButtonNavigator')
var Slider = require('./Slider') var Slider = require('./Slider')
var style = require('./styles/basicStyles') var style = require('./styles/basicStyles')
var util = require('./helpers/global') var util = require('../helpers/global')
var EventManager = require('./lib/eventManager') var EventManager = require('../lib/eventManager')
var yo = require('yo-yo') var yo = require('yo-yo')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
function StepManager (_parent, _traceManager) { function StepManager (_parent, _traceManager) {
util.extend(this, new EventManager()) util.extend(this, new EventManager())
......
var style = require('./styles/basicStyles') var style = require('./styles/basicStyles')
var util = require('./helpers/global') var util = require('../helpers/global')
var EventManager = require('./lib/eventManager') var EventManager = require('../lib/eventManager')
var traceHelper = require('./helpers/traceHelper') var traceHelper = require('../helpers/traceHelper')
var yo = require('yo-yo') var yo = require('yo-yo')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
var init = require('./helpers/init') var init = require('../helpers/init')
function TxBrowser (_web3, _displayConnectionSetting) { function TxBrowser (_parent) {
util.extend(this, new EventManager()) util.extend(this, new EventManager())
this.web3 = _web3
this.blockNumber this.blockNumber
this.txNumber this.txNumber
...@@ -17,11 +16,14 @@ function TxBrowser (_web3, _displayConnectionSetting) { ...@@ -17,11 +16,14 @@ function TxBrowser (_web3, _displayConnectionSetting) {
this.to this.to
this.view this.view
this.displayConnectionSetting = true this.displayConnectionSetting = true
if (_displayConnectionSetting !== undefined) { var self = this
this.displayConnectionSetting = _displayConnectionSetting _parent.register('providerChanged', this, function (provider) {
self.displayConnectionSetting = provider === 'INTERNAL'
self.setDefaultValues()
if (self.view) {
yo.update(self.view, self.render())
} }
})
this.setDefaultValues()
} }
// creation 0xa9619e1d0a35b2c1d686f5b661b3abd87f998d2844e8e9cc905edb57fc9ce349 // creation 0xa9619e1d0a35b2c1d686f5b661b3abd87f998d2844e8e9cc905edb57fc9ce349
...@@ -35,9 +37,9 @@ TxBrowser.prototype.setDefaultValues = function () { ...@@ -35,9 +37,9 @@ TxBrowser.prototype.setDefaultValues = function () {
this.to = ' - ' this.to = ' - '
this.hash = ' - ' this.hash = ' - '
this.blockNumber = null this.blockNumber = null
this.txNumber = '0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51' this.txNumber = ''
this.connectInfo = '' this.connectInfo = ''
this.updateWeb3Url(this.web3.currentProvider.host) this.updateWeb3Url(util.web3.currentProvider.host)
} }
TxBrowser.prototype.submit = function () { TxBrowser.prototype.submit = function () {
...@@ -48,9 +50,9 @@ TxBrowser.prototype.submit = function () { ...@@ -48,9 +50,9 @@ TxBrowser.prototype.submit = function () {
var tx var tx
try { try {
if (this.txNumber.indexOf('0x') !== -1) { if (this.txNumber.indexOf('0x') !== -1) {
tx = this.web3.eth.getTransaction(this.txNumber) tx = util.web3.eth.getTransaction(this.txNumber)
} else { } else {
tx = this.web3.eth.getTransactionFromBlock(this.blockNumber, this.txNumber) tx = util.web3.eth.getTransactionFromBlock(this.blockNumber, this.txNumber)
} }
} catch (e) { } catch (e) {
console.log(e) console.log(e)
...@@ -75,13 +77,13 @@ TxBrowser.prototype.submit = function () { ...@@ -75,13 +77,13 @@ TxBrowser.prototype.submit = function () {
} }
TxBrowser.prototype.updateWeb3Url = function (newhost) { TxBrowser.prototype.updateWeb3Url = function (newhost) {
init.setProvider(this.web3, newhost) init.setProvider(util.web3, newhost)
var self = this var self = this
this.checkWeb3(function (error, block) { this.checkWeb3(function (error, block) {
if (!error) { if (!error) {
self.connectInfo = 'Connected to ' + self.web3.currentProvider.host + '. Current block number: ' + block self.connectInfo = 'Connected to ' + util.web3.currentProvider.host + '. Current block number: ' + block
} else { } else {
self.connectInfo = 'Unable to connect to ' + self.web3.currentProvider.host + '. ' + error.message self.connectInfo = 'Unable to connect to ' + util.web3.currentProvider.host + '. ' + error.message
} }
yo.update(self.view, self.render()) yo.update(self.view, self.render())
}) })
...@@ -89,7 +91,7 @@ TxBrowser.prototype.updateWeb3Url = function (newhost) { ...@@ -89,7 +91,7 @@ TxBrowser.prototype.updateWeb3Url = function (newhost) {
TxBrowser.prototype.checkWeb3 = function (callback) { TxBrowser.prototype.checkWeb3 = function (callback) {
try { try {
this.web3.eth.getBlockNumber(function (error, block) { util.web3.eth.getBlockNumber(function (error, block) {
callback(error, block) callback(error, block)
}) })
} catch (e) { } catch (e) {
...@@ -120,7 +122,7 @@ TxBrowser.prototype.init = function (ev) { ...@@ -120,7 +122,7 @@ TxBrowser.prototype.init = function (ev) {
TxBrowser.prototype.connectionSetting = function () { TxBrowser.prototype.connectionSetting = function () {
if (this.displayConnectionSetting) { if (this.displayConnectionSetting) {
var self = this var self = this
return yo`<div style=${ui.formatCss(style.vmargin)}><span>Node URL: </span><input onkeyup=${function () { self.updateWeb3Url(arguments[0].target.value) }} value=${this.web3.currentProvider ? this.web3.currentProvider.host : ' - none - '} type='text' /> return yo`<div style=${ui.formatCss(style.vmargin)}><span>Node URL: </span><input onkeyup=${function () { self.updateWeb3Url(arguments[0].target.value) }} value=${util.web3.currentProvider ? util.web3.currentProvider.host : ' - none - '} type='text' />
<span>${this.connectInfo}</span></div>` <span>${this.connectInfo}</span></div>`
} else { } else {
return '' return ''
......
...@@ -9,10 +9,10 @@ var StoragePanel = require('./StoragePanel') ...@@ -9,10 +9,10 @@ var StoragePanel = require('./StoragePanel')
var BasicPanel = require('./BasicPanel') var BasicPanel = require('./BasicPanel')
var FullStoragesChangesPanel = require('./FullStoragesChanges') var FullStoragesChangesPanel = require('./FullStoragesChanges')
var yo = require('yo-yo') var yo = require('yo-yo')
var ui = require('./helpers/ui') var ui = require('../helpers/ui')
function VmDebugger (_parent, _traceManager, _web3) { function VmDebugger (_parent, _traceManager) {
this.asmCode = new ASMCode(_parent, _traceManager, _web3) this.asmCode = new ASMCode(_parent, _traceManager)
this.stackPanel = new StackPanel(_parent, _traceManager) this.stackPanel = new StackPanel(_parent, _traceManager)
this.storagePanel = new StoragePanel(_parent, _traceManager) this.storagePanel = new StoragePanel(_parent, _traceManager)
this.memoryPanel = new MemoryPanel(_parent, _traceManager) this.memoryPanel = new MemoryPanel(_parent, _traceManager)
......
'use strict' 'use strict'
module.exports = { module.exports = {
extend: function (web3) { extend: function (web3) {
// ADMIN
web3._extend({
property: 'admin',
methods: [
new web3._extend.Method({
name: 'addPeer',
call: 'admin_addPeer',
params: 1,
inputFormatter: [web3._extend.utils.fromDecimal],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'exportChain',
call: 'admin_exportChain',
params: 1,
inputFormatter: [null],
outputFormatter: function (obj) { return obj }
}),
new web3._extend.Method({
name: 'importChain',
call: 'admin_importChain',
params: 1,
inputFormatter: [null],
outputFormatter: function (obj) { return obj }
}),
new web3._extend.Method({
name: 'verbosity',
call: 'admin_verbosity',
params: 1,
inputFormatter: [web3._extend.utils.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'setSolc',
call: 'admin_setSolc',
params: 1,
inputFormatter: [null],
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Method({
name: 'startRPC',
call: 'admin_startRPC',
params: 4,
inputFormatter: [null, web3._extend.utils.formatInputInteger, null, null],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'stopRPC',
call: 'admin_stopRPC',
params: 0,
inputFormatter: [],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'vmTrace',
call: 'admin_eth_vmTrace',
inputFormatter: [null, null, null],
params: 3
})
],
properties: [
new web3._extend.Property({
name: 'nodeInfo',
getter: 'admin_nodeInfo',
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Property({
name: 'peers',
getter: 'admin_peers',
outputFormatter: function (obj) { return obj }
}),
new web3._extend.Property({
name: 'datadir',
getter: 'admin_datadir',
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Property({
name: 'chainSyncStatus',
getter: 'admin_chainSyncStatus',
outputFormatter: function (obj) { return obj }
})
]
})
// DEBUG // DEBUG
web3._extend({ var methods = []
property: 'debug', if (!(web3.debug && web3.debug.traceTransaction)) {
methods: [ methods.push(new web3._extend.Method({
new web3._extend.Method({
name: 'storageAt',
call: 'debug_storageAt',
inputFormatter: [null, null, null],
params: 3
}),
new web3._extend.Method({
name: 'traceTransaction', name: 'traceTransaction',
call: 'debug_traceTransaction', call: 'debug_traceTransaction',
inputFormatter: [null, null], inputFormatter: [null, null],
params: 2 params: 2
}), }))
new web3._extend.Method({ }
name: 'printBlock',
call: 'debug_printBlock',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Method({
name: 'getBlockRlp',
call: 'debug_getBlockRlp',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Method({
name: 'setHead',
call: 'debug_setHead',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'processBlock',
call: 'debug_processBlock',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: function (obj) { return obj }
}),
new web3._extend.Method({
name: 'seedHash',
call: 'debug_seedHash',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputString
}),
new web3._extend.Method({
name: 'dumpBlock',
call: 'debug_dumpBlock',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: function (obj) { return obj }
})
],
properties: []
})
// MINER
web3._extend({
property: 'miner',
methods: [
new web3._extend.Method({
name: 'start',
call: 'miner_start',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'stop',
call: 'miner_stop',
params: 1,
inputFormatter: [web3._extend.formatters.formatInputInt],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'setExtra',
call: 'miner_setExtra',
params: 1,
inputFormatter: [web3._extend.utils.formatInputString],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'setGasPrice',
call: 'miner_setGasPrice',
params: 1,
inputFormatter: [web3._extend.utils.formatInputString],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'startAutoDAG',
call: 'miner_startAutoDAG',
params: 0,
inputFormatter: [],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'stopAutoDAG',
call: 'miner_stopAutoDAG',
params: 0,
inputFormatter: [],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'makeDAG',
call: 'miner_makeDAG',
params: 1,
inputFormatter: [web3._extend.formatters.inputDefaultBlockNumberFormatter],
outputFormatter: web3._extend.formatters.formatOutputBool
})
],
properties: [
new web3._extend.Property({
name: 'hashrate',
getter: 'miner_hashrate',
outputFormatter: web3._extend.utils.toDecimal
})
]
})
// NETWORK
web3._extend({
property: 'network',
methods: [
new web3._extend.Method({
name: 'addPeer',
call: 'net_addPeer',
params: 1,
inputFormatter: [web3._extend.utils.formatInputString],
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Method({
name: 'getPeerCount',
call: 'net_peerCount',
params: 0,
inputFormatter: [],
outputFormatter: web3._extend.formatters.formatOutputString
})
],
properties: [
new web3._extend.Property({
name: 'listening',
getter: 'net_listening',
outputFormatter: web3._extend.formatters.formatOutputBool
}),
new web3._extend.Property({
name: 'peerCount',
getter: 'net_peerCount',
outputFormatter: web3._extend.utils.toDecimal
}),
new web3._extend.Property({
name: 'peers',
getter: 'net_peers',
outputFormatter: function (obj) { return obj }
}),
new web3._extend.Property({
name: 'version',
getter: 'net_version',
outputFormatter: web3._extend.formatters.formatOutputString
})
]
})
// TX POOL if (!(web3.debug && web3.debug.storageAt)) {
methods.push(new web3._extend.Method({
name: 'storageAt',
call: 'debug_storageAt',
inputFormatter: [null, null, null],
params: 3
}))
}
if (methods.length > 0) {
web3._extend({ web3._extend({
property: 'txpool', property: 'debug',
methods: [], methods: methods,
properties: [ properties: []
new web3._extend.Property({
name: 'status',
getter: 'txpool_status',
outputFormatter: function (obj) { return obj }
})
]
}) })
} }
}
} }
function dummyProvider () {
var self = this
this.eth = {}
this.debug = {}
this.eth.getCode = function (address, cb) { return self.getCode(address, cb) }
this.eth.getTransaction = function (hash, cb) { return self.getTransaction(hash, cb) }
this.eth.getTransactionFromBlock = function (blockNumber, txIndex, cb) { return self.getTransactionFromBlock(blockNumber, txIndex, cb) }
this.eth.getBlockNumber = function (cb) { return self.getBlockNumber(cb) }
this.debug.traceTransaction = function (hash, options, cb) { return self.traceTransaction(hash, options, cb) }
this.debug.storageAt = function (blockNumber, txIndex, address, cb) { return self.storageAt(blockNumber, txIndex, address, cb) }
this.providers = { 'HttpProvider': function (url) {} }
this.currentProvider = {'host': ''}
}
dummyProvider.prototype.getCode = function (address, cb) {
cb(null, '')
}
dummyProvider.prototype.setProvider = function (provider) {}
dummyProvider.prototype.traceTransaction = function (txHash, options, cb) {
if (cb) {
cb(null, {})
}
return {}
}
dummyProvider.prototype.storageAt = function (blockNumber, txIndex, address, cb) { cb(null, {}) }
dummyProvider.prototype.getBlockNumber = function (cb) { cb(null, '') }
dummyProvider.prototype.getTransaction = function (txHash, cb) {
if (cb) {
cb(null, {})
}
return {}
}
dummyProvider.prototype.getTransactionFromBlock = function (blockNumber, txIndex, cb) {
if (cb) {
cb(null, {})
}
return {}
}
module.exports = dummyProvider
var Web3VMProvider = require('./web3VmProvider')
var init = require('../helpers/init')
function Web3Providers () {
this.modes = {}
}
Web3Providers.prototype.addProvider = function (type, obj) {
if (type === 'INTERNAL') {
var web3 = init.loadWeb3()
this.addWeb3(type, web3)
} else if (type === 'EXTERNAL') {
init.extendWeb3(obj)
this.addWeb3(type, obj)
} else if (type === 'VM') {
this.addVM(obj)
} else {
this.addWeb3(type, obj)
}
}
Web3Providers.prototype.get = function (type, cb) {
if (this.modes[type]) {
this.currentMode = type
cb(null, this.modes[type])
} else {
cb('error: this provider has not been setup (' + type + ')', null)
}
}
Web3Providers.prototype.addWeb3 = function (type, web3) {
this.modes[type] = web3
}
Web3Providers.prototype.addVM = function (vm) {
var vmProvider = new Web3VMProvider()
vmProvider.setVM(vm)
this.modes['VM'] = vmProvider
}
module.exports = Web3Providers
var ethJSUtil = require('ethereumjs-util')
var util = require('../helpers/util')
function web3VmProvider () {
var self = this
this.vm
this.vmTraces = {}
this.txs = {}
this.processingHash
this.incr = 0
this.eth = {}
this.debug = {}
this.eth.getCode = function (address, cb) { return self.getCode(address, cb) }
this.eth.getTransaction = function (hash, cb) { return self.getTransaction(hash, cb) }
this.eth.getTransactionFromBlock = function (blockNumber, txIndex, cb) { return self.getTransactionFromBlock(blockNumber, txIndex, cb) }
this.eth.getBlockNumber = function (cb) { return self.getBlockNumber(cb) }
this.debug.traceTransaction = function (hash, options, cb) { return self.traceTransaction(hash, options, cb) }
this.debug.storageAt = function (blockNumber, txIndex, address, cb) { return self.storageAt(blockNumber, txIndex, address, cb) }
this.providers = { 'HttpProvider': function (url) {} }
this.currentProvider = {'host': 'vm provider'}
}
web3VmProvider.prototype.setVM = function (vm) {
var self = this
this.vm = vm
this.vm.on('step', function (data) {
self.pushTrace(self, data)
})
this.vm.on('afterTx', function (data) {
self.txProcessed(self, data)
})
this.vm.on('beforeTx', function (data) {
self.txWillProcess(self, data)
})
}
web3VmProvider.prototype.releaseCurrentHash = function () {
var ret = this.processingHash
this.processingHash = undefined
return ret
}
web3VmProvider.prototype.txWillProcess = function (self, data) {
self.incr++
self.processingHash = '0x' + ethJSUtil.sha3([data.r, data.s, data.v, self.incr]).join('')
self.vmTraces[self.processingHash] = {
gas: '0x0',
return: '0x0',
structLogs: []
}
var tx = {}
tx.hash = self.processingHash
tx.from = util.hexConvert(data.getSenderAddress())
if (data.to && data.to.length) {
tx.to = util.hexConvert(data.to)
}
tx.data = util.hexConvert(data.data)
tx.input = util.hexConvert(data.input)
tx.gas = util.hexConvert(data.gas)
if (data.value) {
tx.value = util.hexConvert(data.value)
}
self.txs[self.processingHash] = tx
}
web3VmProvider.prototype.txProcessed = function (self, data) {
self.vmTraces[self.processingHash].gas = '0x' + data.gasUsed.toString(16)
if (data.createdAddress) {
self.vmTraces[self.processingHash].return = util.hexConvert(data.createdAddress)
} else {
self.vmTraces[self.processingHash].return = util.hexConvert(data.vm.return)
}
}
web3VmProvider.prototype.pushTrace = function (self, data) {
if (!self.processingHash) {
console.log('no tx processing')
return
}
var step = {
stack: util.hexListConvert(data.stack),
memory: util.formatMemory(data.memory),
storage: data.storage,
op: data.opcode.name,
pc: data.pc,
gasCost: data.opcode.fee.toString(),
gas: data.gasLeft.toString()
}
self.vmTraces[self.processingHash].structLogs.push(step)
}
web3VmProvider.prototype.getCode = function (address, cb) {
this.vm.stateManager.getContractCode(address, function (error, result) {
cb(error, util.hexConvert(result))
})
}
web3VmProvider.prototype.setProvider = function (provider) {}
web3VmProvider.prototype.traceTransaction = function (txHash, options, cb) {
if (this.vmTraces[txHash]) {
if (cb) {
cb(null, this.vmTraces[txHash])
}
return this.vmTraces[txHash]
} else {
if (cb) {
cb('unable to retrieve traces ' + txHash, null)
}
}
}
web3VmProvider.prototype.storageAt = function (blockNumber, txIndex, address, cb) { cb(null, {}) }
web3VmProvider.prototype.getBlockNumber = function (cb) { cb(null, 'vm provider') }
web3VmProvider.prototype.getTransaction = function (txHash, cb) {
if (this.txs[txHash]) {
if (cb) {
cb(null, this.txs[txHash])
}
return this.txs[txHash]
} else {
if (cb) {
cb('unable to retrieve tx ' + txHash, null)
}
}
}
web3VmProvider.prototype.getTransactionFromBlock = function (blockNumber, txIndex, cb) {
var mes = 'not supposed to be needed by remix in vmmode'
console.log(mes)
if (cb) {
cb(mes, null)
}
}
module.exports = web3VmProvider
...@@ -15,7 +15,10 @@ function injectScript (file, browser, callback) { ...@@ -15,7 +15,10 @@ function injectScript (file, browser, callback) {
browser.execute(function (data) { browser.execute(function (data) {
var vmdebugger = document.getElementById('app').vmdebugger var vmdebugger = document.getElementById('app').vmdebugger
data = JSON.parse(data) data = JSON.parse(data)
vmdebugger.web3.eth.getCode = function (address, callback) { var uiTestweb3 = {}
uiTestweb3.eth = {}
uiTestweb3.debug = {}
uiTestweb3.eth.getCode = function (address, callback) {
if (callback) { if (callback) {
callback(null, data.testCodes[address]) callback(null, data.testCodes[address])
} else { } else {
...@@ -23,15 +26,15 @@ function injectScript (file, browser, callback) { ...@@ -23,15 +26,15 @@ function injectScript (file, browser, callback) {
} }
} }
vmdebugger.web3.debug.traceTransaction = function (txHash, options, callback) { uiTestweb3.debug.traceTransaction = function (txHash, options, callback) {
callback(null, data.testTraces[txHash]) callback(null, data.testTraces[txHash])
} }
vmdebugger.web3.debug.storageAt = function (blockNumber, txIndex, address, callback) { uiTestweb3.debug.storageAt = function (blockNumber, txIndex, address, callback) {
callback(null, {}) callback(null, {})
} }
vmdebugger.web3.eth.getTransaction = function (txHash, callback) { uiTestweb3.eth.getTransaction = function (txHash, callback) {
if (callback) { if (callback) {
callback(null, data.testTxs[txHash]) callback(null, data.testTxs[txHash])
} else { } else {
...@@ -39,7 +42,7 @@ function injectScript (file, browser, callback) { ...@@ -39,7 +42,7 @@ function injectScript (file, browser, callback) {
} }
} }
vmdebugger.web3.eth.getTransactionFromBlock = function (blockNumber, txIndex, callback) { uiTestweb3.eth.getTransactionFromBlock = function (blockNumber, txIndex, callback) {
if (callback) { if (callback) {
callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex]) callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex])
} else { } else {
...@@ -47,9 +50,16 @@ function injectScript (file, browser, callback) { ...@@ -47,9 +50,16 @@ function injectScript (file, browser, callback) {
} }
} }
vmdebugger.web3.eth.getBlockNumber = function (callback) { callback(null, 'web3 modified for testing purposes :)') } uiTestweb3.eth.getBlockNumber = function (callback) { callback(null, 'web3 modified for testing purposes :)') }
vmdebugger.web3.currentProvider = {host: 'web3 modified for testing purposes :)'} uiTestweb3.eth.providers = { 'HttpProvider': function (url) {} }
uiTestweb3.eth.setProvider = function (provider) {}
uiTestweb3.currentProvider = {host: 'web3 modified for testing purposes :)'}
vmdebugger.addProvider('TEST', uiTestweb3)
vmdebugger.switchProvider('TEST')
}, [result], function () { }, [result], function () {
callback() callback()
}) })
......
'use strict' 'use strict'
var tape = require('tape') var tape = require('tape')
var init = require('../src/helpers/init') var Web3Providers = require('../src/web3Provider/web3Providers')
var TraceManager = require('../src/trace/traceManager') var TraceManager = require('../src/trace/traceManager')
var CodeManager = require('../src/code/codeManager') var CodeManager = require('../src/code/codeManager')
var web3Test = require('./resources/testWeb3') var web3Test = require('./resources/testWeb3')
var initWeb3 = require('./init') var util = require('../src/helpers/global')
tape('CodeManager', function (t) { tape('CodeManager', function (t) {
var codeManager var codeManager
var web3 = init.loadWeb3() var web3Providers = new Web3Providers()
initWeb3.overrideWeb3(web3, web3Test) web3Providers.addProvider('TEST', web3Test)
var traceManager = new TraceManager(web3) web3Providers.get('TEST', function (error, obj) {
codeManager = new CodeManager(web3, traceManager) if (error) {
var contractCode = web3.eth.getCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5') var mes = 'provider TEST not defined'
console.log(mes)
t.fail(mes)
} else {
util.web3 = obj
var traceManager = new TraceManager()
codeManager = new CodeManager(traceManager)
var contractCode = util.web3.eth.getCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5')
codeManager.codeResolver.cacheExecutingCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', contractCode) // so a call to web3 is not necessary codeManager.codeResolver.cacheExecutingCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', contractCode) // so a call to web3 is not necessary
var tx = web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51') var tx = util.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
traceManager.resolveTrace(tx, function (error, result) { traceManager.resolveTrace(tx, function (error, result) {
if (error) { if (error) {
t.fail(' - traceManager.resolveTrace - failed ' + result) t.fail(' - traceManager.resolveTrace - failed ' + result)
...@@ -22,6 +29,8 @@ tape('CodeManager', function (t) { ...@@ -22,6 +29,8 @@ tape('CodeManager', function (t) {
continueTesting(t, codeManager) continueTesting(t, codeManager)
} }
}) })
}
})
}) })
function continueTesting (t, codeManager) { function continueTesting (t, codeManager) {
...@@ -54,7 +63,7 @@ function continueTesting (t, codeManager) { ...@@ -54,7 +63,7 @@ function continueTesting (t, codeManager) {
} }
} }
}) })
var tx = codeManager.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51') var tx = util.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
codeManager.resolveStep(0, tx) codeManager.resolveStep(0, tx)
codeManager.resolveStep(70, tx) codeManager.resolveStep(70, tx)
}) })
......
'use strict' 'use strict'
var init = require('../init') var init = require('../init')
var web3Override = {} var web3Override = {}
web3Override.eth = {}
web3Override.debug = {}
var data = init.readFile(require('path').resolve(__dirname, 'testWeb3.json')) var data = init.readFile(require('path').resolve(__dirname, 'testWeb3.json'))
var data = JSON.parse(data) var data = JSON.parse(data)
web3Override.getCode = function (address, callback) { web3Override.eth.getCode = function (address, callback) {
if (callback) { if (callback) {
callback(null, data.testCodes[address]) callback(null, data.testCodes[address])
} else { } else {
...@@ -12,15 +14,15 @@ web3Override.getCode = function (address, callback) { ...@@ -12,15 +14,15 @@ web3Override.getCode = function (address, callback) {
} }
} }
web3Override.traceTransaction = function (txHash, options, callback) { web3Override.debug.traceTransaction = function (txHash, options, callback) {
callback(null, data.testTraces[txHash]) callback(null, data.testTraces[txHash])
} }
web3Override.storageAt = function (blockNumber, txIndex, address, callback) { web3Override.debug.storageAt = function (blockNumber, txIndex, address, callback) {
callback(null, {}) callback(null, {})
} }
web3Override.getTransaction = function (txHash, callback) { web3Override.eth.getTransaction = function (txHash, callback) {
if (callback) { if (callback) {
callback(null, data.testTxs[txHash]) callback(null, data.testTxs[txHash])
} else { } else {
...@@ -28,7 +30,7 @@ web3Override.getTransaction = function (txHash, callback) { ...@@ -28,7 +30,7 @@ web3Override.getTransaction = function (txHash, callback) {
} }
} }
web3Override.getTransactionFromBlock = function (blockNumber, txIndex, callback) { web3Override.eth.getTransactionFromBlock = function (blockNumber, txIndex, callback) {
if (callback) { if (callback) {
callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex]) callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex])
} else { } else {
...@@ -36,7 +38,13 @@ web3Override.getTransactionFromBlock = function (blockNumber, txIndex, callback) ...@@ -36,7 +38,13 @@ web3Override.getTransactionFromBlock = function (blockNumber, txIndex, callback)
} }
} }
web3Override.getBlockNumber = function (callback) { callback('web3 modified testing purposes :)') } web3Override.eth.getBlockNumber = function (callback) { callback('web3 modified testing purposes :)') }
web3Override.eth.setProvider = function (provider) {}
web3Override.eth.providers = { 'HttpProvider': function (url) {} }
web3Override.eth.currentProvider = {'host': 'test provider'}
if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') { if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') {
module.exports = web3Override module.exports = web3Override
......
'use strict' 'use strict'
var TraceManager = require('../src/trace/traceManager') var TraceManager = require('../src/trace/traceManager')
var tape = require('tape') var tape = require('tape')
var init = require('../src/helpers/init') var Web3Providers = require('../src/web3Provider/web3Providers')
var util = require('../src/helpers/global')
var web3Test = require('./resources/testWeb3') var web3Test = require('./resources/testWeb3')
var initWeb3 = require('./init')
tape('TraceManager', function (t) { tape('TraceManager', function (t) {
var traceManager var traceManager
t.test('TraceManager.init', function (st) { t.test('TraceManager.init', function (st) {
var web3 = init.loadWeb3() var web3Providers = new Web3Providers()
initWeb3.overrideWeb3(web3, web3Test) web3Providers.addProvider('TEST', web3Test)
traceManager = new TraceManager(web3) web3Providers.get('TEST', function (error, obj) {
if (error) {
var mes = 'provider TEST not defined'
console.log(mes)
st.fail(mes)
} else {
util.web3 = obj
traceManager = new TraceManager()
st.end() st.end()
}
})
}) })
t.test('TraceManager.resolveTrace', function (st) { t.test('TraceManager.resolveTrace', function (st) {
var tx = traceManager.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51') var tx = util.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
traceManager.resolveTrace(tx, function (error, result) { traceManager.resolveTrace(tx, function (error, result) {
if (error) { if (error) {
st.fail(' - traceManager.resolveTrace - failed ' + result) st.fail(' - traceManager.resolveTrace - failed ' + result)
...@@ -45,7 +54,7 @@ tape('TraceManager', function (t) { ...@@ -45,7 +54,7 @@ tape('TraceManager', function (t) {
}) })
t.test('TraceManager.getStorageAt', function (st) { t.test('TraceManager.getStorageAt', function (st) {
var tx = traceManager.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51') var tx = util.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
traceManager.getStorageAt(110, tx, function (error, result) { traceManager.getStorageAt(110, tx, function (error, result) {
if (error) { if (error) {
st.fail(error) st.fail(error)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment