diff --git a/remix-lib/src/execution/execution-context.js b/remix-lib/src/execution/execution-context.js index e6ff2138ad..ce6beeb89d 100644 --- a/remix-lib/src/execution/execution-context.js +++ b/remix-lib/src/execution/execution-context.js @@ -238,20 +238,6 @@ function ExecutionContext () { } } - this.checkpointAndCommit = function (cb, checkpointCount) { - // due to issue https://github.com/ethereumjs/ethereumjs-vm/issues/567 - if (this.vm().stateManager._checkpointCount > (checkpointCount || 0)) { - return this.vm().stateManager.commit(() => { - cb() - }) - } - this.vm().stateManager.checkpoint(() => { - this.vm().stateManager.commit(() => { - cb() - }) - }) - } - this.currentblockGasLimit = function () { return this.blockGasLimit } diff --git a/remix-lib/src/universalDapp.js b/remix-lib/src/universalDapp.js index db8c6d00df..03960f430c 100644 --- a/remix-lib/src/universalDapp.js +++ b/remix-lib/src/universalDapp.js @@ -1,5 +1,5 @@ const async = require('async') -const { BN, privateToAddress, isValidPrivate, stripHexPrefix } = require('ethereumjs-util') +const { BN, privateToAddress, isValidPrivate, stripHexPrefix, toChecksumAddress } = require('ethereumjs-util') const crypto = require('crypto') const { EventEmitter } = require('events') @@ -121,7 +121,7 @@ module.exports = class UniversalDApp { }) }) - this.accounts['0x' + address.toString('hex')] = { privateKey, nonce: 0 } + this.accounts[toChecksumAddress('0x' + address.toString('hex'))] = { privateKey, nonce: 0 } } } diff --git a/remix-simulator/package.json b/remix-simulator/package.json index ba6bd0257b..6d4ea324e0 100644 --- a/remix-simulator/package.json +++ b/remix-simulator/package.json @@ -18,6 +18,7 @@ "body-parser": "^1.18.2", "color-support": "^1.1.3", "commander": "^2.19.0", + "cors": "^2.8.5", "ethereumjs-util": "^5.1.2", "ethereumjs-vm": "3.0.0", "express": "^4.16.3", diff --git a/remix-simulator/src/genesis.js b/remix-simulator/src/genesis.js index 295cb935f4..2d4d7e74ee 100644 --- a/remix-simulator/src/genesis.js +++ b/remix-simulator/src/genesis.js @@ -17,10 +17,8 @@ function generateBlock () { uncleHeaders: [] }) - executionContext.checkpointAndCommit(() => { - executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function () { - executionContext.addBlock(block) - }) + executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function () { + executionContext.addBlock(block) }) } diff --git a/remix-simulator/src/methods/accounts.js b/remix-simulator/src/methods/accounts.js index a32ab96f53..176cd129c4 100644 --- a/remix-simulator/src/methods/accounts.js +++ b/remix-simulator/src/methods/accounts.js @@ -12,19 +12,28 @@ var Accounts = function () { this.accountsKeys = {} executionContext.init({get: () => { return true }}) +} - for (let _account of this.accountsList) { - this.accountsKeys[_account.address.toLowerCase()] = _account.privateKey - this.accounts[_account.address.toLowerCase()] = { privateKey: Buffer.from(_account.privateKey.replace('0x', ''), 'hex'), nonce: 0 } +Accounts.prototype.init = async function () { + let setBalance = (account) => { + return new Promise((resolve, reject) => { + this.accountsKeys[ethJSUtil.toChecksumAddress(account.address)] = account.privateKey + this.accounts[ethJSUtil.toChecksumAddress(account.address)] = { privateKey: Buffer.from(account.privateKey.replace('0x', ''), 'hex'), nonce: 0 } - executionContext.vm().stateManager.getAccount(Buffer.from(_account.address.toLowerCase().replace('0x', ''), 'hex'), (err, account) => { - if (err) { - throw new Error(err) - } - var balance = '0x56BC75E2D63100000' - account.balance = balance || '0xf00000000000000001' + executionContext.vm().stateManager.getAccount(Buffer.from(account.address.toLowerCase().replace('0x', ''), 'hex'), (err, account) => { + if (err) { + throw new Error(err) + } + var balance = '0x56BC75E2D63100000' + account.balance = balance || '0xf00000000000000001' + resolve() + }) }) } + + for (let _account of this.accountsList) { + await setBalance(_account) + } } Accounts.prototype.methods = function () { @@ -36,7 +45,7 @@ Accounts.prototype.methods = function () { } Accounts.prototype.eth_accounts = function (payload, cb) { - return cb(null, this.accountsList.map((x) => x.address)) + return cb(null, this.accountsList.map((x) => ethJSUtil.toChecksumAddress(x.address))) } Accounts.prototype.eth_getBalance = function (payload, cb) { diff --git a/remix-simulator/src/methods/transactions.js b/remix-simulator/src/methods/transactions.js index 754b191604..b861fc4b3d 100644 --- a/remix-simulator/src/methods/transactions.js +++ b/remix-simulator/src/methods/transactions.js @@ -5,7 +5,9 @@ var ethJSUtil = require('ethereumjs-util') var processTx = require('./txProcess.js') var BN = ethJSUtil.BN -var Transactions = function (accounts) { +var Transactions = function () {} + +Transactions.prototype.init = function (accounts) { this.accounts = accounts } @@ -24,6 +26,10 @@ Transactions.prototype.methods = function () { } Transactions.prototype.eth_sendTransaction = function (payload, cb) { + // from might be lowercased address (web3) + if (payload.params && payload.params.length > 0 && payload.params[0].from) { + payload.params[0].from = ethJSUtil.toChecksumAddress(payload.params[0].from) + } processTx(this.accounts, payload, false, cb) } @@ -68,6 +74,10 @@ Transactions.prototype.eth_getCode = function (payload, cb) { } Transactions.prototype.eth_call = function (payload, cb) { + // from might be lowercased address (web3) + if (payload.params && payload.params.length > 0 && payload.params[0].from) { + payload.params[0].from = ethJSUtil.toChecksumAddress(payload.params[0].from) + } processTx(this.accounts, payload, true, cb) } diff --git a/remix-simulator/src/provider.js b/remix-simulator/src/provider.js index 3778b58876..4c1f9e706a 100644 --- a/remix-simulator/src/provider.js +++ b/remix-simulator/src/provider.js @@ -12,18 +12,24 @@ const generateBlock = require('./genesis.js') var Provider = function (options) { this.Accounts = new Accounts() + this.Transactions = new Transactions() this.methods = {} this.methods = merge(this.methods, this.Accounts.methods()) this.methods = merge(this.methods, (new Blocks(options)).methods()) this.methods = merge(this.methods, (new Misc()).methods()) this.methods = merge(this.methods, (new Net()).methods()) - this.methods = merge(this.methods, (new Transactions(this.Accounts.accounts)).methods()) + this.methods = merge(this.methods, (this.Transactions.methods())) this.methods = merge(this.methods, (new Whisper()).methods()) generateBlock() } +Provider.prototype.init = async function () { + await this.Accounts.init() + this.Transactions.init(this.Accounts.accounts) +} + Provider.prototype.sendAsync = function (payload, callback) { log.info('payload method is ', payload.method) diff --git a/remix-simulator/src/server.js b/remix-simulator/src/server.js index a8d33023c8..92bb43aad9 100644 --- a/remix-simulator/src/server.js +++ b/remix-simulator/src/server.js @@ -1,4 +1,5 @@ const express = require('express') +const cors = require('cors') const bodyParser = require('body-parser') const app = express() const expressWs = require('express-ws') @@ -8,11 +9,17 @@ const log = require('./utils/logs.js') class Server { constructor (options) { this.provider = new Provider(options) + this.provider.init().then(() => { + log('Provider initiated') + }).catch((error) => { + log(error) + }) } start (host, port) { expressWs(app) + app.use(cors()) app.use(bodyParser.urlencoded({extended: true})) app.use(bodyParser.json()) diff --git a/remix-tests/src/runTestSources.ts b/remix-tests/src/runTestSources.ts index 4e765434fd..eefa1be9ba 100644 --- a/remix-tests/src/runTestSources.ts +++ b/remix-tests/src/runTestSources.ts @@ -10,15 +10,17 @@ import Web3 = require('web3') import { Provider } from 'remix-simulator' import { FinalResult } from './types' -const createWeb3Provider = function () { +const createWeb3Provider = async function () { let web3 = new Web3() - web3.setProvider(new Provider()) + let provider = new Provider() + await provider.init() + web3.setProvider(provider) return web3 } -export function runTestSources(contractSources, testCallback, resultCallback, finalCallback, importFileCb, opts) { +export async function runTestSources(contractSources, testCallback, resultCallback, finalCallback, importFileCb, opts) { opts = opts || {} - let web3 = opts.web3 || createWeb3Provider() + let web3 = opts.web3 || await createWeb3Provider() let accounts = opts.accounts || null async.waterfall([ function getAccountList (next) { diff --git a/remix-tests/tests/testRunner.ts b/remix-tests/tests/testRunner.ts index 62ce1b2e34..bbef66e3c1 100644 --- a/remix-tests/tests/testRunner.ts +++ b/remix-tests/tests/testRunner.ts @@ -11,8 +11,9 @@ import { ResultsInterface, TestCbInterface, ResultCbInterface } from '../dist/in var provider = new Provider() -function compileAndDeploy(filename: string, callback: Function) { +async function compileAndDeploy(filename: string, callback: Function) { let web3: Web3 = new Web3() + await provider.init() web3.setProvider(provider) let compilationData: object let accounts: string[]