Unverified Commit fdc08a5a authored by Aniket's avatar Aniket Committed by GitHub

Merge branch 'master' into solcUpdate

parents 59451b26 09dc7a4a
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -19,9 +19,8 @@
"main": "./index.js",
"dependencies": {
"commander": "^2.19.0",
"ethereumjs-util": "^6.1.0",
"ethereumjs-vm": "3.0.0",
"fast-async": "^6.1.2",
"ethereumjs-util": "^6.2.0",
"ethereumjs-vm": "4.1.1",
"remix-lib": "0.4.15",
"web3": "0.20.6"
},
......
'use strict'
var utileth = require('ethereumjs-util')
var Tx = require('ethereumjs-tx')
var Tx = require('ethereumjs-tx').Transaction
var Block = require('ethereumjs-block')
var BN = require('ethereumjs-util').BN
var remixLib = require('remix-lib')
......@@ -34,8 +34,7 @@ function sendTx (vm, from, to, value, data, cb) {
Init VM / Send Transaction
*/
function initVM (st, privateKey) {
var utileth = require('ethereumjs-util')
var VM = require('ethereumjs-vm')
var VM = require('ethereumjs-vm').default
var Web3Providers = remixLib.vm.Web3Providers
var address = utileth.privateToAddress(privateKey)
var vm = new VM({
......
'use strict'
var utileth = require('ethereumjs-util')
var Tx = require('ethereumjs-tx')
var Tx = require('ethereumjs-tx').Transaction
var Block = require('ethereumjs-block')
var BN = require('ethereumjs-util').BN
var remixLib = require('remix-lib')
......@@ -34,8 +34,7 @@ function sendTx (vm, from, to, value, data, cb) {
Init VM / Send Transaction
*/
function initVM (st, privateKey) {
var utileth = require('ethereumjs-util')
var VM = require('ethereumjs-vm')
var VM = require('ethereumjs-vm').default
var Web3Providers = remixLib.vm.Web3Providers
var address = utileth.privateToAddress(privateKey)
var vm = new VM({
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -15,13 +15,12 @@
"main": "./index.js",
"dependencies": {
"async": "^2.1.2",
"ethereumjs-block": "^1.6.0",
"ethereumjs-tx": "^1.3.3",
"ethereumjs-util": "^6.1.0",
"ethereumjs-vm": "3.0.0",
"ethereumjs-block": "^2.2.1",
"ethereumjs-tx": "^2.1.1",
"ethereumjs-util": "^6.2.0",
"ethereumjs-vm": "4.1.1",
"ethers": "^4.0.27",
"events": "^3.0.0",
"fast-async": "^6.1.2",
"solc": "^0.5.13",
"web3": "0.20.6"
},
......
......@@ -2,6 +2,8 @@
var codes = {
// 0x0 range - arithmetic ops
// name, baseCost, off stack, on stack, dynamic, async
// @todo can be improved on basis of this: https://github.com/ethereumjs/ethereumjs-vm/blob/master/lib/evm/opcodes.ts
0x00: ['STOP', 0, 0, 0, false],
0x01: ['ADD', 3, 2, 1, false],
0x02: ['MUL', 5, 2, 1, false],
......@@ -36,7 +38,7 @@ var codes = {
// 0x30 range - closure state
0x30: ['ADDRESS', 2, 0, 1, true],
0x31: ['BALANCE', 400, 1, 1, true, true],
0x31: ['BALANCE', 700, 1, 1, true, true],
0x32: ['ORIGIN', 2, 0, 1, true],
0x33: ['CALLER', 2, 0, 1, true],
0x34: ['CALLVALUE', 2, 0, 1, true],
......@@ -50,6 +52,7 @@ var codes = {
0x3c: ['EXTCODECOPY', 700, 4, 0, true, true],
0x3d: ['RETURNDATASIZE', 2, 0, 1, true],
0x3e: ['RETURNDATACOPY', 3, 3, 0, true],
0x3f: ['EXTCODEHASH', 400, 3, 0, true],
// '0x40' range - block operations
0x40: ['BLOCKHASH', 20, 1, 1, true, true],
......@@ -58,13 +61,15 @@ var codes = {
0x43: ['NUMBER', 2, 0, 1, true],
0x44: ['DIFFICULTY', 2, 0, 1, true],
0x45: ['GASLIMIT', 2, 0, 1, true],
0x46: ['CHAINID', 2, 0, 1, false],
0x47: ['SELFBALANCE', 5, 0, 1, false],
// 0x50 range - 'storage' and execution
0x50: ['POP', 2, 1, 0, false],
0x51: ['MLOAD', 3, 1, 1, false],
0x52: ['MSTORE', 3, 2, 0, false],
0x53: ['MSTORE8', 3, 2, 0, false],
0x54: ['SLOAD', 200, 1, 1, true, true],
0x54: ['SLOAD', 800, 1, 1, true, true],
0x55: ['SSTORE', 0, 2, 0, true, true],
0x56: ['JUMP', 8, 1, 0, false],
0x57: ['JUMPI', 10, 2, 0, false],
......
/* global ethereum */
'use strict'
var Web3 = require('web3')
var EventManager = require('../eventManager')
var EthJSVM = require('ethereumjs-vm')
var ethUtil = require('ethereumjs-util')
var StateManager = require('ethereumjs-vm/dist/stateManager')
var Web3VMProvider = require('../web3Provider/web3VmProvider')
const Web3 = require('web3')
const EventManager = require('../eventManager')
const EthJSVM = require('ethereumjs-vm').default
const ethUtil = require('ethereumjs-util')
const StateManager = require('ethereumjs-vm/dist/state/stateManager').default
const Web3VMProvider = require('../web3Provider/web3VmProvider')
var LogsManager = require('./logsManager.js')
const LogsManager = require('./logsManager.js')
var rlp = ethUtil.rlp
const rlp = ethUtil.rlp
var injectedProvider
var web3
if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
injectedProvider = window.web3.currentProvider
web3 = new Web3(injectedProvider)
var injectedProvider = window.web3.currentProvider
var web3 = new Web3(injectedProvider)
} else {
web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
}
var blankWeb3 = new Web3()
const blankWeb3 = new Web3()
const currentFork = 'istanbul'
/*
extend vm state manager and instanciate VM
*/
......@@ -95,7 +92,9 @@ function createVm (hardfork) {
var vms = {
byzantium: createVm('byzantium'),
constantinople: createVm('constantinople')
constantinople: createVm('constantinople'),
petersburg: createVm('petersburg'),
istanbul: createVm('istanbul')
}
var mainNetGenesisHash = '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3'
......@@ -141,7 +140,7 @@ function ExecutionContext () {
}
this.web3 = function () {
return this.isVM() ? vms.constantinople.web3vm : web3
return this.isVM() ? vms[currentFork].web3vm : web3
}
this.detectNetwork = function (callback) {
......@@ -196,7 +195,7 @@ function ExecutionContext () {
}
this.vm = function () {
return vms.constantinople.vm
return vms[currentFork].vm
}
this.setContext = function (context, endPointUrl, confirmCb, infoCb) {
......@@ -209,8 +208,8 @@ function ExecutionContext () {
if (context === 'vm') {
executionContext = context
vms.constantinople.stateManager.revert(() => {
vms.constantinople.stateManager.checkpoint(() => {})
vms[currentFork].stateManager.revert(() => {
vms[currentFork].stateManager.checkpoint(() => {})
})
self.event.trigger('contextChanged', ['vm'])
return cb()
......
......@@ -64,16 +64,20 @@ module.exports = {
INVALID_JUMP: 'invalid JUMP',
INVALID_OPCODE: 'invalid opcode',
REVERT: 'revert',
STATIC_STATE_CHANGE: 'static state change'
STATIC_STATE_CHANGE: 'static state change',
INTERNAL_ERROR: 'internal error',
CREATE_COLLISION: 'create collision',
STOP: 'stop',
REFUND_EXHAUSTED: 'refund exhausted'
}
var ret = {
error: false,
message: ''
}
if (!txResult.result.vm.exceptionError) {
if (!txResult.result.execResult.exceptionError) {
return ret
}
var exceptionError = txResult.result.vm.exceptionError.error || ''
var exceptionError = txResult.result.execResult.exceptionError.error || ''
var error = `VM error: ${exceptionError}.\n`
var msg
if (exceptionError === errorCode.INVALID_OPCODE) {
......@@ -83,7 +87,7 @@ module.exports = {
msg = `\tThe transaction ran out of gas. Please increase the Gas Limit.\n`
ret.error = true
} else if (exceptionError === errorCode.REVERT) {
var returnData = txResult.result.vm.return
var returnData = txResult.result.execResult.returnValue
// It is the hash of Error(string)
if (returnData && (returnData.slice(0, 4).toString('hex') === '08c379a0')) {
var abiCoder = new ethers.utils.AbiCoder()
......
......@@ -40,14 +40,13 @@ class TxListener {
// in web3 mode && listen remix txs only
if (!this._isListening) return // we don't listen
if (this._loopId && executionContext.getProvider() !== 'vm') return // we seems to already listen on a "web3" network
var call = {
from: from,
to: to,
input: data,
hash: txResult.transactionHash ? txResult.transactionHash : 'call' + (from || '') + to + data,
isCall: true,
returnValue: executionContext.isVM() ? txResult.result.vm.return : ethJSUtil.toBuffer(txResult.result),
returnValue: executionContext.isVM() ? txResult.result.execResult.returnValue : ethJSUtil.toBuffer(txResult.result),
envMode: executionContext.getProvider()
}
......@@ -80,9 +79,9 @@ class TxListener {
function addExecutionCosts (txResult, tx) {
if (txResult && txResult.result) {
if (txResult.result.vm) {
tx.returnValue = txResult.result.vm.return
if (txResult.result.vm.gasUsed) tx.executionCost = txResult.result.vm.gasUsed.toString(10)
if (txResult.result.execResult) {
tx.returnValue = txResult.result.execResult.returnValue
if (txResult.result.execResult.gasUsed) tx.executionCost = txResult.result.execResult.gasUsed.toString(10)
}
if (txResult.result.gasUsed) tx.transactionCost = txResult.result.gasUsed.toString(10)
}
......
'use strict'
var EthJSTX = require('ethereumjs-tx')
var EthJSTX = require('ethereumjs-tx').Transaction
var EthJSBlock = require('ethereumjs-block')
var ethJSUtil = require('ethereumjs-util')
var BN = ethJSUtil.BN
......@@ -115,7 +115,6 @@ class TxRunner {
data: Buffer.from(data.slice(2), 'hex')
})
tx.sign(account.privateKey)
const coinbases = ['0x0e9281e9c6a0808672eaba6bd1220e144c9bb07a', '0x8945a1288dc78a6d8952a92c77aee6730b414778', '0x94d76e24f818426ae84aa404140e8d5f60e10e7e']
const difficulties = [new BN('69762765929000', 10), new BN('70762765929000', 10), new BN('71762765929000', 10)]
var block = new EthJSBlock({
......@@ -146,24 +145,20 @@ class TxRunner {
}
runBlockInVm (tx, block, callback) {
executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function (err, results) {
err = err ? err.message : err
if (err) {
return callback(err)
}
executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }).then(function (results) {
let result = results.results[0]
if (result) {
result.status = '0x' + result.vm.exception.toString(16)
const status = result.execResult.exceptionError ? 0 : 1
result.status = `0x${status}`
}
executionContext.addBlock(block)
executionContext.trackTx('0x' + tx.hash().toString('hex'), block)
callback(err, {
callback(null, {
result: result,
transactionHash: ethJSUtil.bufferToHex(Buffer.from(tx.hash()))
})
}).catch(function (err) {
callback(err)
})
}
......
......@@ -21,14 +21,14 @@ function convertToPrefixedHex (input) {
*/
function resultToRemixTx (txResult) {
const { result, transactionHash } = txResult
const { status, vm, gasUsed, createdAddress, contractAddress } = result
const { status, execResult, gasUsed, createdAddress, contractAddress } = result
let returnValue, errorMessage
if (isHexString(result)) {
returnValue = result
} else if (vm !== undefined) {
returnValue = vm.return
errorMessage = vm.exceptionError
} else if (execResult !== undefined) {
returnValue = execResult.returnValue
errorMessage = execResult.exceptionError
}
return {
......
......@@ -107,8 +107,8 @@ web3VmProvider.prototype.txProcessed = function (self, data) {
self.vmTraces[self.processingHash].gas = '0x' + data.gasUsed.toString(16)
var logs = []
for (var l in data.vm.logs) {
var log = data.vm.logs[l]
for (var l in data.execResult.logs) {
var log = data.execResult.logs[l]
var topics = []
if (log[1].length > 0) {
for (var k in log[1]) {
......@@ -126,14 +126,15 @@ web3VmProvider.prototype.txProcessed = function (self, data) {
}
self.txsReceipt[self.processingHash].logs = logs
self.txsReceipt[self.processingHash].transactionHash = self.processingHash
self.txsReceipt[self.processingHash].status = '0x' + data.vm.exception.toString(16)
const status = data.execResult.exceptionError ? 0 : 1
self.txsReceipt[self.processingHash].status = `0x${status}`
if (data.createdAddress) {
var address = util.hexConvert(data.createdAddress)
self.vmTraces[self.processingHash].return = address
self.txsReceipt[self.processingHash].contractAddress = address
} else if (data.vm.return) {
self.vmTraces[self.processingHash].return = util.hexConvert(data.vm.return)
} else if (data.execResult.returnValue) {
self.vmTraces[self.processingHash].return = util.hexConvert(data.execResult.returnValue)
} else {
self.vmTraces[self.processingHash].return = '0x'
}
......
......@@ -46,12 +46,11 @@ const VM_RESULT = {
gasRefund: new BN(0),
gasUsed: new BN(GAS_USED_INT),
status: STATUS_OK,
vm: {
exception: 1,
execResult: {
exceptionError: null,
gasRefund: new BN(0),
gasUsed: new BN(GAS_USED_INT),
return: RETURN_VALUE_BUFFER
returnValue: RETURN_VALUE_BUFFER
}
},
transactionHash: TRANSACTION_HASH
......@@ -103,8 +102,7 @@ tape('converts VM result to RemixTx', function (t) {
t.equal(remixTx.return, RETURN_VALUE_HEX)
t.equal(remixTx.error, null)
txResult.result.vm.exception = 0
txResult.result.vm.exceptionError = 'this is an error'
txResult.result.execResult.exceptionError = 'this is an error'
remixTx = resultToRemixTx(txResult)
t.equal(remixTx.error, 'this is an error')
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -21,10 +21,9 @@
"commander": "^2.19.0",
"cors": "^2.8.5",
"ethereumjs-util": "^6.1.0",
"ethereumjs-vm": "3.0.0",
"ethereumjs-block": "^2.2.1",
"express": "^4.16.3",
"express-ws": "^4.0.0",
"fast-async": "^6.3.7",
"merge": "^1.2.0",
"remix-lib": "0.4.15",
"standard": "^10.0.3",
......
......@@ -17,7 +17,7 @@ function generateBlock () {
uncleHeaders: []
})
executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function () {
executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }).then(function () {
executionContext.addBlock(block)
})
}
......
......@@ -8,11 +8,8 @@ function runCall (payload, from, to, data, value, gasLimit, txRunner, callbacks,
if (err) {
return callback(err)
}
let toReturn = '0x' + result.result.vm.return.toString('hex')
if (toReturn === '0x') {
toReturn = '0x0'
}
const returnValue = result.result.execResult.returnValue.toString('hex')
const toReturn = `0x${returnValue || '0'}`
return callback(null, toReturn)
}
......
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