diff --git a/index.html b/index.html
index 052c51ed95..26cf0b6c91 100644
--- a/index.html
+++ b/index.html
@@ -6,7 +6,9 @@
diff --git a/package.json b/package.json
index 968c78a54c..afaf2cfcae 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ethereum-remix",
- "version": "0.0.2-alpha.0.0.4",
+ "version": "0.0.2-alpha.0.0.5",
"description": "Ethereum IDE and tools for the web",
"contributors": [
{
@@ -13,17 +13,16 @@
}
],
"main": "./src/index.js",
- "dependencies": {
- "browserify": "^13.0.1",
- "web3": "^0.15.3",
- "yo-yo": "^1.2.1"
- },
"devDependencies": {
+ "browserify": "^13.0.1",
+ "ethereumjs-util": "^4.5.0",
"http-server": "^0.9.0",
"nightwatch": "^0.9.5",
"standard": "^7.0.1",
"standard-reporter": "^1.0.5",
"tape": "^4.6.0",
+ "web3": "^0.15.3",
+ "yo-yo": "^1.2.1",
"yo-yoify": "^3.1.0"
},
"scripts": {
diff --git a/src/code/codeManager.js b/src/code/codeManager.js
index 029e225ea5..cbd45a5a8a 100644
--- a/src/code/codeManager.js
+++ b/src/code/codeManager.js
@@ -13,13 +13,11 @@ var EventManager = require('../lib/eventManager')
- resolvingStep: when CodeManager resolves code/selected instruction of a new step
*/
-function CodeManager (_web3, _traceManager) {
+function CodeManager (_traceManager) {
util.extend(this, new EventManager())
- this.web3 = _web3
this.isLoading = false
this.traceManager = _traceManager
this.currentAddress = ''
- codeResolver.setWeb3(_web3)
this.codeResolver = codeResolver
}
diff --git a/src/code/codeResolver.js b/src/code/codeResolver.js
index a206e7b93d..0d2a858b85 100644
--- a/src/code/codeResolver.js
+++ b/src/code/codeResolver.js
@@ -1,16 +1,11 @@
'use strict'
var codeUtils = require('./codeUtils')
+var util = require('../helpers/global')
module.exports = {
- web3: null,
-
codes: {}, // assembly items instructions list by contract addesses
instructionsIndexByBytesOffset: {}, // mapping between bytes offset and instructions index.
- setWeb3: function (web3) {
- this.web3 = web3
- },
-
resolveCode: function (address, vmTraceIndex, transaction, callBack) {
var cache = this.getExecutingCodeFromCache(address)
if (cache) {
@@ -26,7 +21,7 @@ module.exports = {
loadCode: function (address, callback) {
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) {
console.log(error)
} else {
diff --git a/src/helpers/global.js b/src/helpers/global.js
index 8665889c16..e652127824 100644
--- a/src/helpers/global.js
+++ b/src/helpers/global.js
@@ -4,5 +4,6 @@ module.exports = {
for (var property in source) {
destination[property] = source[property]
}
- }
+ },
+ web3: null
}
diff --git a/src/trace/traceAnalyser.js b/src/trace/traceAnalyser.js
index 6532fc8629..fbeafabb4e 100644
--- a/src/trace/traceAnalyser.js
+++ b/src/trace/traceAnalyser.js
@@ -40,7 +40,6 @@ TraceAnalyser.prototype.buildReturnValues = function (index, step) {
var offset = 2 * parseInt(step.stack[step.stack.length - 1], 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
- console.log('push returnValue ' + index)
this.traceCache.pushReturnValue(index, '0x' + memory.join('').substr(offset, size))
}
}
diff --git a/src/trace/traceManager.js b/src/trace/traceManager.js
index f3762f02b3..8d9215fd77 100644
--- a/src/trace/traceManager.js
+++ b/src/trace/traceManager.js
@@ -4,14 +4,14 @@ var TraceRetriever = require('./traceRetriever')
var TraceCache = require('./traceCache')
var TraceStepManager = require('./traceStepManager')
var traceHelper = require('../helpers/traceHelper')
+var util = require('../helpers/global')
-function TraceManager (_web3) {
- this.web3 = _web3
+function TraceManager () {
this.isLoading = false
this.trace = null
this.traceCache = new TraceCache()
this.traceAnalyser = new TraceAnalyser(this.traceCache)
- this.traceRetriever = new TraceRetriever(_web3)
+ this.traceRetriever = new TraceRetriever()
this.traceStepManager = new TraceStepManager(this.traceAnalyser)
this.tx
}
@@ -20,7 +20,7 @@ function TraceManager (_web3) {
TraceManager.prototype.resolveTrace = function (tx, callback) {
this.tx = tx
this.init()
- if (!this.web3) callback('web3 not loaded', false)
+ if (!util.web3) callback('web3 not loaded', false)
this.isLoading = true
var self = this
this.traceRetriever.getTrace(tx.hash, function (error, result) {
diff --git a/src/trace/traceRetriever.js b/src/trace/traceRetriever.js
index 1ea39133d7..4face2e815 100644
--- a/src/trace/traceRetriever.js
+++ b/src/trace/traceRetriever.js
@@ -1,8 +1,8 @@
'use strict'
var traceHelper = require('../helpers/traceHelper')
+var util = require('../helpers/global')
-function TraceRetriever (_web3) {
- this.web3 = _web3
+function TraceRetriever () {
this.storages = {} // contains all intial storage (by addresses)
}
@@ -13,7 +13,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) {
disableStack: false,
fullStorage: false
}
- this.web3.debug.traceTransaction(txHash, options, function (error, result) {
+ util.web3.debug.traceTransaction(txHash, options, function (error, result) {
callback(error, result)
})
}
@@ -28,7 +28,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) {
callback(null, {})
/*
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
callback(error, result)
})
@@ -37,7 +37,7 @@ TraceRetriever.prototype.getStorage = function (tx, address, callback) {
}
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
diff --git a/src/ui/ASMCode.js b/src/ui/ASMCode.js
index 025c17ed59..54c2f8b8ff 100644
--- a/src/ui/ASMCode.js
+++ b/src/ui/ASMCode.js
@@ -4,9 +4,9 @@ var yo = require('yo-yo')
var CodeManager = require('../code/codeManager')
var ui = require('../helpers/ui')
-function ASMCode (_parent, _traceManager, _web3) {
+function ASMCode (_parent, _traceManager) {
this.parent = _parent
- this.codeManager = new CodeManager(_web3, _traceManager)
+ this.codeManager = new CodeManager(_traceManager)
this.code
this.address
this.codeView
diff --git a/src/ui/Ethdebugger.js b/src/ui/Ethdebugger.js
index aefe926ed3..fdc0eb9a50 100644
--- a/src/ui/Ethdebugger.js
+++ b/src/ui/Ethdebugger.js
@@ -8,30 +8,25 @@ var style = require('./styles/basicStyles')
var util = require('../helpers/global')
var EventManager = require('../lib/eventManager')
var yo = require('yo-yo')
-var init = require('../helpers/init')
var ui = require('../helpers/ui')
-var Web3Provider = require('../web3Provider/web3Provider')
+var Web3Providers = require('../web3Provider/web3Providers')
+var init = require('../helpers/init')
-function Ethdebugger (_web) {
+function Ethdebugger () {
util.extend(this, new EventManager())
+
this.currentStepIndex = -1
this.tx
this.statusMessage = ''
this.view
- this.displayConnectionSetting = true
-
- this.web3 = new Web3Provider()
- if (_web) {
- this.setProvider('EXTERNAL', _web)
- } else {
- this.setProvider('EXTERNAL', init.loadWeb3())
- }
-
- this.traceManager = new TraceManager(this.web3)
+ this.web3Providers = new Web3Providers()
+ this.addProvider('INTERNAL', init.loadWeb3())
+ this.switchProvider('INTERNAL')
+ this.traceManager = new TraceManager()
var self = this
- this.txBrowser = new TxBrowser(this.web3, this.displayConnectionSetting)
+ this.txBrowser = new TxBrowser(this)
this.txBrowser.register('newTxLoading', this, function () {
self.unLoad()
})
@@ -45,29 +40,27 @@ function Ethdebugger (_web) {
this.stepManager.register('stepChanged', this, function (stepIndex) {
self.stepChanged(stepIndex)
})
- this.vmDebugger = new VmDebugger(this, this.traceManager, this.web3)
- this.sticker = new Sticker(this, this.traceManager, this.web3)
+ this.vmDebugger = new VmDebugger(this, this.traceManager)
+ this.sticker = new Sticker(this, this.traceManager)
}
-Ethdebugger.prototype.setProvider = function (type, obj) {
- if (type === 'EXTERNAL') {
- init.extendWeb3(obj)
- this.web3.initWeb3(obj)
- this.displayConnectionSetting = true
- } else if (type === 'VM') {
- this.web3.initVM(obj)
- this.displayConnectionSetting = false
- }
+Ethdebugger.prototype.web3 = function () {
+ return util.web3
}
-Ethdebugger.prototype.getWeb3Provider = function () {
- return this.web3
+Ethdebugger.prototype.addProvider = function (type, obj) {
+ this.web3Providers.addProvider(type, obj)
+ this.trigger('providerAdded', [type])
}
-Ethdebugger.prototype.changeProvider = function (type) {
- this.web3.switchTo(type, function (error, result) {
+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])
}
})
}
diff --git a/src/ui/TxBrowser.js b/src/ui/TxBrowser.js
index c549bafb0c..a4d18413f9 100644
--- a/src/ui/TxBrowser.js
+++ b/src/ui/TxBrowser.js
@@ -6,9 +6,8 @@ var yo = require('yo-yo')
var ui = require('../helpers/ui')
var init = require('../helpers/init')
-function TxBrowser (_web3, _displayConnectionSetting) {
+function TxBrowser (_parent) {
util.extend(this, new EventManager())
- this.web3 = _web3
this.blockNumber
this.txNumber
@@ -17,12 +16,14 @@ function TxBrowser (_web3, _displayConnectionSetting) {
this.to
this.view
this.displayConnectionSetting = true
- if (_displayConnectionSetting !== undefined) {
- this.displayConnectionSetting = _displayConnectionSetting
- }
- if (this.displayConnectionSetting) {
- this.setDefaultValues()
- }
+ var self = this
+ _parent.register('providerChanged', this, function (provider) {
+ self.displayConnectionSetting = provider === 'INTERNAL'
+ self.setDefaultValues()
+ if (self.view) {
+ yo.update(self.view, self.render())
+ }
+ })
}
// creation 0xa9619e1d0a35b2c1d686f5b661b3abd87f998d2844e8e9cc905edb57fc9ce349
@@ -36,9 +37,9 @@ TxBrowser.prototype.setDefaultValues = function () {
this.to = ' - '
this.hash = ' - '
this.blockNumber = null
- this.txNumber = '0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51'
+ this.txNumber = ''
this.connectInfo = ''
- this.updateWeb3Url(this.web3.currentProvider.host)
+ this.updateWeb3Url(util.web3.currentProvider.host)
}
TxBrowser.prototype.submit = function () {
@@ -49,9 +50,9 @@ TxBrowser.prototype.submit = function () {
var tx
try {
if (this.txNumber.indexOf('0x') !== -1) {
- tx = this.web3.eth.getTransaction(this.txNumber)
+ tx = util.web3.eth.getTransaction(this.txNumber)
} else {
- tx = this.web3.eth.getTransactionFromBlock(this.blockNumber, this.txNumber)
+ tx = util.web3.eth.getTransactionFromBlock(this.blockNumber, this.txNumber)
}
} catch (e) {
console.log(e)
@@ -76,13 +77,13 @@ TxBrowser.prototype.submit = function () {
}
TxBrowser.prototype.updateWeb3Url = function (newhost) {
- init.setProvider(this.web3, newhost)
+ init.setProvider(util.web3, newhost)
var self = this
this.checkWeb3(function (error, block) {
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 {
- 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())
})
@@ -90,7 +91,7 @@ TxBrowser.prototype.updateWeb3Url = function (newhost) {
TxBrowser.prototype.checkWeb3 = function (callback) {
try {
- this.web3.eth.getBlockNumber(function (error, block) {
+ util.web3.eth.getBlockNumber(function (error, block) {
callback(error, block)
})
} catch (e) {
@@ -121,7 +122,7 @@ TxBrowser.prototype.init = function (ev) {
TxBrowser.prototype.connectionSetting = function () {
if (this.displayConnectionSetting) {
var self = this
- return yo`
Node URL:
+ return yo`
Node URL:
${this.connectInfo}
`
} else {
return ''
diff --git a/src/ui/VmDebugger.js b/src/ui/VmDebugger.js
index 1a67ac8731..d319d02d2c 100644
--- a/src/ui/VmDebugger.js
+++ b/src/ui/VmDebugger.js
@@ -11,8 +11,8 @@ var FullStoragesChangesPanel = require('./FullStoragesChanges')
var yo = require('yo-yo')
var ui = require('../helpers/ui')
-function VmDebugger (_parent, _traceManager, _web3) {
- this.asmCode = new ASMCode(_parent, _traceManager, _web3)
+function VmDebugger (_parent, _traceManager) {
+ this.asmCode = new ASMCode(_parent, _traceManager)
this.stackPanel = new StackPanel(_parent, _traceManager)
this.storagePanel = new StoragePanel(_parent, _traceManager)
this.memoryPanel = new MemoryPanel(_parent, _traceManager)
diff --git a/src/web3Provider/web3Provider.js b/src/web3Provider/web3Provider.js
deleted file mode 100644
index 45285c84ce..0000000000
--- a/src/web3Provider/web3Provider.js
+++ /dev/null
@@ -1,70 +0,0 @@
-var Web3VMProvider = require('./web3VmProvider')
-
-function Web3Provider () {
- var self = this
- this.currentMode
- this.actions = {}
- this.modes = {}
- this.currentProvider = {'host': 'browser-solidity proxy provider'}
- this.providers = { 'HttpProvider': function (url) {} }
- this.eth = {}
- this.debug = {}
- this.eth.getCode = function (address, cb) { if (self.check(cb)) { return self.actions[self.currentMode]['eth.getCode'].apply(self.executingMode(), arguments) } }
- this.setProvider = function (provider) { if (self.check()) { return self.actions[self.currentMode]['setProvider'].apply(self.executingMode(), [provider]) } }
- this.debug.traceTransaction = function (txHash, options, cb) { if (self.check()) { return self.actions[self.currentMode]['debug.traceTransaction'].apply(self.executingMode(), arguments) } }
- this.debug.storageAt = function (blockNumber, txIndex, address, cb) { if (self.check()) { return self.actions[self.currentMode]['debug.storageAt'].apply(self.executingMode(), arguments) } }
- this.eth.getTransaction = function (txHash) { if (self.check()) { return self.actions[self.currentMode]['eth.getTransaction'].apply(self.executingMode(), arguments) } }
- this.eth.getTransactionFromBlock = function (blockNumber, txIndex) { if (self.check()) { return self.actions[self.currentMode]['eth.getTransactionFromBlock'].apply(self.executingMode(), arguments) } }
- this.eth.getBlockNumber = function (cb) { if (self.check()) { return self.actions[self.currentMode]['eth.getBlockNumber'].apply(self.executingMode(), arguments) } }
-}
-
-Web3Provider.prototype.check = function (cb) {
- if (!this.currentMode) {
- if (cb) {
- cb('error: no provider has been setup ', null)
- }
- return false
- }
- return true
-}
-
-Web3Provider.prototype.switchTo = function (type, cb) {
- if (this.actions[type]) {
- this.currentMode = type
- cb(null, 'ok')
- } else {
- cb('error: this provider has not been setup (' + type + ')', null)
- }
-}
-
-Web3Provider.prototype.executingMode = function () {
- return this.modes[this.currentMode]
-}
-
-Web3Provider.prototype.initWeb3 = function (web3) {
- this.actions['EXTERNAL'] = {}
- this.actions['EXTERNAL']['eth.getCode'] = web3.eth.getCode
- this.actions['EXTERNAL']['setProvider'] = web3.setProvider
- this.actions['EXTERNAL']['debug.traceTransaction'] = web3.debug.traceTransaction
- this.actions['EXTERNAL']['debug.storageAt'] = web3.debug.storageAt
- this.actions['EXTERNAL']['eth.getTransaction'] = web3.eth.getTransaction
- this.actions['EXTERNAL']['eth.getTransactionFromBlock'] = web3.eth.getTransactionFromBlock
- this.actions['EXTERNAL']['eth.getBlockNumber'] = web3.eth.getBlockNumber
- this.modes['EXTERNAL'] = web3
-}
-
-Web3Provider.prototype.initVM = function (vm) {
- var vmProvider = new Web3VMProvider()
- vmProvider.setVM(vm)
- this.actions['VM'] = {}
- this.actions['VM']['eth.getCode'] = vmProvider.getCode
- this.actions['VM']['setProvider'] = vmProvider.setProvider
- this.actions['VM']['debug.traceTransaction'] = vmProvider.traceTransaction
- this.actions['VM']['debug.storageAt'] = vmProvider.storageAt
- this.actions['VM']['eth.getTransaction'] = vmProvider.getTransaction
- this.actions['VM']['eth.getTransactionFromBlock'] = vmProvider.getTransactionFromBlock
- this.actions['VM']['eth.getBlockNumber'] = vmProvider.getBlockNumber
- this.modes['VM'] = vmProvider
-}
-
-module.exports = Web3Provider
diff --git a/src/web3Provider/web3Providers.js b/src/web3Provider/web3Providers.js
new file mode 100644
index 0000000000..4fbe0b673c
--- /dev/null
+++ b/src/web3Provider/web3Providers.js
@@ -0,0 +1,41 @@
+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
diff --git a/src/web3Provider/web3VmProvider.js b/src/web3Provider/web3VmProvider.js
index 069b0c2f75..4f1cb75d89 100644
--- a/src/web3Provider/web3VmProvider.js
+++ b/src/web3Provider/web3VmProvider.js
@@ -1,49 +1,22 @@
var ethJSUtil = require('ethereumjs-util')
-var BN = ethJSUtil.BN
function web3VmProvider () {
+ var self = this
this.vm
this.vmTraces = {}
this.txs = {}
this.processingHash
this.incr = 0
-}
-
-var hexConvert = function (ints) {
- var ret = '0x'
- for (var i = 0; i < ints.length; i++) {
- try {
- var h = ints[i]
- if (h) {
- h = h.toString(16)
- ret += ('0x' + h) < 0x10 ? '0' + h : h
- } else {
- ret += '00'
- }
- } catch (e) {
- console.log('hexconvert ' + i + ' ' + ints.length)
- console.log(e)
- }
- }
- return ret
-}
-
-var hexListConvert = function (intsList) {
- var ret = []
- for (var k in intsList) {
- ret.push(hexConvert(intsList[k]))
- }
- return ret
-}
-
-var formatMemory = function (mem) {
- var hexMem = 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
+ 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) {
@@ -109,9 +82,8 @@ web3VmProvider.prototype.pushTrace = function (self, data) {
storage: data.storage,
op: data.opcode.name,
pc: data.pc,
- gas: data.opcode.fee.toString(),
- gasLeft: data.gasLeft.toString(),
- gasCost: self.vmTraces[self.processingHash].structLogs.length > 0 ? ((new BN(self.vmTraces[self.processingHash].structLogs[0].gasLeft)) - data.gasLeft).toString() : data.opcode.fee.toString()
+ gasCost: data.opcode.fee.toString(),
+ gas: data.gasLeft.toString()
}
self.vmTraces[self.processingHash].structLogs.push(step)
}
@@ -141,6 +113,8 @@ web3VmProvider.prototype.traceTransaction = function (txHash, options, cb) {
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) {
@@ -157,7 +131,7 @@ web3VmProvider.prototype.getTransaction = function (txHash, cb) {
}
web3VmProvider.prototype.getTransactionFromBlock = function (blockNumber, txIndex, cb) {
- var mes = 'not supposed to be needed by remix'
+ var mes = 'not supposed to be needed by remix in vmmode'
console.log(mes)
if (cb) {
cb(mes, null)
@@ -165,4 +139,36 @@ web3VmProvider.prototype.getTransactionFromBlock = function (blockNumber, txInde
throw mes
}
+var 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
+}
+
+var hexListConvert = function (intsList) {
+ var ret = []
+ for (var k in intsList) {
+ ret.push(hexConvert(intsList[k]))
+ }
+ return ret
+}
+
+var formatMemory = function (mem) {
+ var hexMem = 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
+}
+
module.exports = web3VmProvider
diff --git a/test-browser/init.js b/test-browser/init.js
index 9b853a72e1..11a014f8a2 100644
--- a/test-browser/init.js
+++ b/test-browser/init.js
@@ -15,7 +15,10 @@ function injectScript (file, browser, callback) {
browser.execute(function (data) {
var vmdebugger = document.getElementById('app').vmdebugger
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) {
callback(null, data.testCodes[address])
} else {
@@ -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])
}
- vmdebugger.web3.debug.storageAt = function (blockNumber, txIndex, address, callback) {
+ uiTestweb3.debug.storageAt = function (blockNumber, txIndex, address, callback) {
callback(null, {})
}
- vmdebugger.web3.eth.getTransaction = function (txHash, callback) {
+ uiTestweb3.eth.getTransaction = function (txHash, callback) {
if (callback) {
callback(null, data.testTxs[txHash])
} else {
@@ -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) {
callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex])
} else {
@@ -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 () {
callback()
})
diff --git a/test/codeManager.js b/test/codeManager.js
index bcb7653496..2d9ceb9da3 100644
--- a/test/codeManager.js
+++ b/test/codeManager.js
@@ -1,25 +1,34 @@
'use strict'
var tape = require('tape')
-var init = require('../src/helpers/init')
+var Web3Providers = require('../src/web3Provider/web3Providers')
var TraceManager = require('../src/trace/traceManager')
var CodeManager = require('../src/code/codeManager')
var web3Test = require('./resources/testWeb3')
-var initWeb3 = require('./init')
+var util = require('../src/helpers/global')
tape('CodeManager', function (t) {
var codeManager
- var web3 = init.loadWeb3()
- initWeb3.overrideWeb3(web3, web3Test)
- var traceManager = new TraceManager(web3)
- codeManager = new CodeManager(web3, traceManager)
- var contractCode = web3.eth.getCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5')
- codeManager.codeResolver.cacheExecutingCode('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', contractCode) // so a call to web3 is not necessary
- var tx = web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
- traceManager.resolveTrace(tx, function (error, result) {
+ var web3Providers = new Web3Providers()
+ web3Providers.addProvider('TEST', web3Test)
+ web3Providers.get('TEST', function (error, obj) {
if (error) {
- t.fail(' - traceManager.resolveTrace - failed ' + result)
+ var mes = 'provider TEST not defined'
+ console.log(mes)
+ t.fail(mes)
} else {
- continueTesting(t, codeManager)
+ 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
+ var tx = util.web3.eth.getTransaction('0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51')
+ traceManager.resolveTrace(tx, function (error, result) {
+ if (error) {
+ t.fail(' - traceManager.resolveTrace - failed ' + result)
+ } else {
+ 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(70, tx)
})
diff --git a/test/resources/testWeb3.js b/test/resources/testWeb3.js
index f2e6467966..f5d8bbb4e7 100644
--- a/test/resources/testWeb3.js
+++ b/test/resources/testWeb3.js
@@ -1,10 +1,12 @@
'use strict'
var init = require('../init')
var web3Override = {}
+web3Override.eth = {}
+web3Override.debug = {}
var data = init.readFile(require('path').resolve(__dirname, 'testWeb3.json'))
var data = JSON.parse(data)
-web3Override.getCode = function (address, callback) {
+web3Override.eth.getCode = function (address, callback) {
if (callback) {
callback(null, data.testCodes[address])
} else {
@@ -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])
}
-web3Override.storageAt = function (blockNumber, txIndex, address, callback) {
+web3Override.debug.storageAt = function (blockNumber, txIndex, address, callback) {
callback(null, {})
}
-web3Override.getTransaction = function (txHash, callback) {
+web3Override.eth.getTransaction = function (txHash, callback) {
if (callback) {
callback(null, data.testTxs[txHash])
} else {
@@ -28,7 +30,7 @@ web3Override.getTransaction = function (txHash, callback) {
}
}
-web3Override.getTransactionFromBlock = function (blockNumber, txIndex, callback) {
+web3Override.eth.getTransactionFromBlock = function (blockNumber, txIndex, callback) {
if (callback) {
callback(null, data.testTxsByBlock[blockNumber + '-' + txIndex])
} else {
@@ -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') {
module.exports = web3Override
diff --git a/test/traceManager.js b/test/traceManager.js
index 7bc7d9ae4d..facb586eca 100644
--- a/test/traceManager.js
+++ b/test/traceManager.js
@@ -1,22 +1,31 @@
'use strict'
var TraceManager = require('../src/trace/traceManager')
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 initWeb3 = require('./init')
tape('TraceManager', function (t) {
var traceManager
t.test('TraceManager.init', function (st) {
- var web3 = init.loadWeb3()
- initWeb3.overrideWeb3(web3, web3Test)
- traceManager = new TraceManager(web3)
- st.end()
+ var web3Providers = new Web3Providers()
+ web3Providers.addProvider('TEST', web3Test)
+ 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()
+ }
+ })
})
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) {
if (error) {
st.fail(' - traceManager.resolveTrace - failed ' + result)
@@ -45,7 +54,7 @@ tape('TraceManager', function (t) {
})
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) {
if (error) {
st.fail(error)