From 3e806adacba3b79217f40fd402ea9021dd81de33 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 18 Sep 2020 10:06:42 +0200 Subject: [PATCH 1/5] remove uneeded instanciation --- libs/remix-lib/src/execution/execution-context.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/remix-lib/src/execution/execution-context.js b/libs/remix-lib/src/execution/execution-context.js index 4d6829069c..ff99e04772 100644 --- a/libs/remix-lib/src/execution/execution-context.js +++ b/libs/remix-lib/src/execution/execution-context.js @@ -91,10 +91,12 @@ function createVm (hardfork) { } const vms = { + /* byzantium: createVm('byzantium'), constantinople: createVm('constantinople'), petersburg: createVm('petersburg'), istanbul: createVm('istanbul'), + */ muirGlacier: createVm('muirGlacier') } From a5d88055eb2d344ac9dacdb8474316057c3dfb7c Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 18 Sep 2020 10:07:07 +0200 Subject: [PATCH 2/5] use the remix-simulator provider --- apps/remix-ide/src/blockchain/blockchain.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/remix-ide/src/blockchain/blockchain.js b/apps/remix-ide/src/blockchain/blockchain.js index cf57531072..87468ba048 100644 --- a/apps/remix-ide/src/blockchain/blockchain.js +++ b/apps/remix-ide/src/blockchain/blockchain.js @@ -228,6 +228,11 @@ class Blockchain { } web3 () { + // @todo(https://github.com/ethereum/remix-project/issues/431) + const isVM = this.getProvider() === 'vm' + if (isVM) { + return this.providers.vm.web3 + } return this.executionContext.web3() } From 6d4a8d62fe6ab16a77a5580b229a7f72b7389577 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 21 Sep 2020 14:27:04 +0200 Subject: [PATCH 3/5] add debug endpoint to remix-simulator --- .../src/web3Provider/web3VmProvider.js | 10 +++--- libs/remix-simulator/src/methods/debug.js | 33 +++++++++++++++++++ .../src/methods/transactions.js | 3 +- libs/remix-simulator/src/provider.js | 2 ++ 4 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 libs/remix-simulator/src/methods/debug.js diff --git a/libs/remix-lib/src/web3Provider/web3VmProvider.js b/libs/remix-lib/src/web3Provider/web3VmProvider.js index e1cc274068..5d9292d236 100644 --- a/libs/remix-lib/src/web3Provider/web3VmProvider.js +++ b/libs/remix-lib/src/web3Provider/web3VmProvider.js @@ -72,9 +72,9 @@ web3VmProvider.prototype.txWillProcess = function (self, data) { } let tx = {} tx.hash = self.processingHash - tx.from = util.hexConvert(data.getSenderAddress()) + tx.from = ethutil.toChecksumAddress(util.hexConvert(data.getSenderAddress())) if (data.to && data.to.length) { - tx.to = util.hexConvert(data.to) + tx.to = ethutil.toChecksumAddress(util.hexConvert(data.to)) } this.processingAddress = tx.to tx.data = util.hexConvert(data.data) @@ -128,8 +128,8 @@ web3VmProvider.prototype.txProcessed = function (self, data) { if (data.createdAddress) { const address = util.hexConvert(data.createdAddress) - self.vmTraces[self.processingHash].return = address - self.txsReceipt[self.processingHash].contractAddress = address + self.vmTraces[self.processingHash].return = ethutil.toChecksumAddress(address) + self.txsReceipt[self.processingHash].contractAddress = ethutil.toChecksumAddress(address) } else if (data.execResult.returnValue) { self.vmTraces[self.processingHash].return = util.hexConvert(data.execResult.returnValue) } else { @@ -196,6 +196,7 @@ web3VmProvider.prototype.pushTrace = function (self, data) { } web3VmProvider.prototype.getCode = function (address, cb) { + address = ethutil.toChecksumAddress(address) const account = ethutil.toBuffer(address) this.vm.stateManager.getContractCode(account, (error, result) => { cb(error, util.hexConvert(result)) @@ -219,6 +220,7 @@ web3VmProvider.prototype.traceTransaction = function (txHash, options, cb) { web3VmProvider.prototype.storageRangeAt = function (blockNumber, txIndex, address, start, maxLength, cb) { // txIndex is the hash in the case of the VM // we don't use the range params here + address = ethutil.toChecksumAddress(address) if (txIndex === 'latest') { txIndex = this.lastProcessedStorageTxHash[address] diff --git a/libs/remix-simulator/src/methods/debug.js b/libs/remix-simulator/src/methods/debug.js new file mode 100644 index 0000000000..77946fea77 --- /dev/null +++ b/libs/remix-simulator/src/methods/debug.js @@ -0,0 +1,33 @@ +class Debug { + constructor (executionContext) { + this.executionContext = executionContext + } + + methods () { + return { + debug_traceTransaction: this.debug_traceTransaction.bind(this), + debug_preimage: this.debug_preimage.bind(this), + debug_storageRangeAt: this.debug_storageRangeAt.bind(this), + } + } + + debug_traceTransaction (payload, cb) { + this.executionContext.web3().debug.traceTransaction(payload.params[0], {}, cb) + } + + debug_preimage (payload, cb) { + this.executionContext.web3().debug.preimage(payload.params[0], cb) + } + + debug_storageRangeAt (payload, cb) { + this.executionContext.web3().debug.storageRangeAt( + payload.params[0], + payload.params[1], + payload.params[2], + payload.params[3], + payload.params[4], + cb) + } +} + +module.exports = Debug diff --git a/libs/remix-simulator/src/methods/transactions.js b/libs/remix-simulator/src/methods/transactions.js index 6cefa2e372..7d0f5e46d4 100644 --- a/libs/remix-simulator/src/methods/transactions.js +++ b/libs/remix-simulator/src/methods/transactions.js @@ -52,7 +52,8 @@ class Transactions{ 'cumulativeGasUsed': Web3.utils.toHex(receipt.gas), 'contractAddress': receipt.contractAddress, 'logs': receipt.logs, - 'status': receipt.status + 'status': receipt.status, + 'to': receipt.to } if (r.blockNumber === '0x') { diff --git a/libs/remix-simulator/src/provider.js b/libs/remix-simulator/src/provider.js index 424f3f9da5..58c3c6fa9b 100644 --- a/libs/remix-simulator/src/provider.js +++ b/libs/remix-simulator/src/provider.js @@ -10,6 +10,7 @@ const Filters = require('./methods/filters.js') const Misc = require('./methods/misc.js') const Net = require('./methods/net.js') const Transactions = require('./methods/transactions.js') +const Debug = require('./methods/debug.js') const generateBlock = require('./genesis.js') @@ -28,6 +29,7 @@ class Provider { this.methods = merge(this.methods, (new Filters(this.executionContext)).methods()) this.methods = merge(this.methods, (new Net()).methods()) this.methods = merge(this.methods, this.Transactions.methods()) + this.methods = merge(this.methods, (new Debug(this.executionContext)).methods()) generateBlock(this.executionContext) this.init() From c5e0a6c0779bc24361bfe7311c0002d2e0f39229 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 21 Sep 2020 14:46:07 +0200 Subject: [PATCH 4/5] fix e2e tests --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 4 +- apps/remix-ide-e2e/src/tests/runAndDeploy.ts | 4 +- .../src/tests/transactionExecution.test.ts | 43 ++++++++++--------- .../src/tests/txListener.test.ts | 4 +- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index cfc18f2f47..692eb1bf4d 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -30,7 +30,7 @@ module.exports = { .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } }) @@ -62,7 +62,7 @@ module.exports = { .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', { - status: '0x0 Transaction mined but execution failed', + status: 'false Transaction mined but execution failed', 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } }) diff --git a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts b/apps/remix-ide-e2e/src/tests/runAndDeploy.ts index cb1937314e..ce3d664b99 100644 --- a/apps/remix-ide-e2e/src/tests/runAndDeploy.ts +++ b/apps/remix-ide-e2e/src/tests/runAndDeploy.ts @@ -48,7 +48,7 @@ module.exports = { .click('*[data-id="Deploy - transact (not payable)"]') .pause(5000) .testFunction('0xc39ee005c1e1368c84f02e458de4b41dbb966631a8714d15ef8362dada249ede', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xc39ee005c1e1368c84f02e458de4b41dbb966631a8714d15ef8362dada249ede' }) }, @@ -61,7 +61,7 @@ module.exports = { .click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') .pause(5000) .testFunction('0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xfe718871ee0b4d03cdcac0e12e5b164efaf7e23ba952c07db76e62692867019b' }) }, diff --git a/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts index a2ecbd99d5..3fc21b266d 100644 --- a/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts +++ b/apps/remix-ide-e2e/src/tests/transactionExecution.test.ts @@ -23,7 +23,7 @@ module.exports = { .clickFunction('f - transact (not payable)') .testFunction('0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0x38bb944fa4709ed9e163d6c670259f97284b4defd916d512a2fcc3f35bb53e03', 'decoded output': { '0': 'uint256: 8' } }) @@ -32,7 +32,7 @@ module.exports = { .clickFunction('g - transact (not payable)') .testFunction('0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xab4f794ca0b531f27fc6eace623666b440facbf20e77615a057d728c67b500f0', 'decoded output': { '0': 'uint256: 345', @@ -53,7 +53,7 @@ module.exports = { .clickFunction('retunValues1 - transact (not payable)') .testFunction('0x09c6716a67f0f8c7a0ca2b3ddf59c25982da856a95aefd640b767f9b9feee39d', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0x09c6716a67f0f8c7a0ca2b3ddf59c25982da856a95aefd640b767f9b9feee39d', 'decoded output': { '0': 'bool: _b true', @@ -65,7 +65,7 @@ module.exports = { .clickFunction('retunValues2 - transact (not payable)') .testFunction('0xe884953e0695399d60914af3e1ea2dad59fe41f3c0c20665c130fa40dd0fb6bf', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xe884953e0695399d60914af3e1ea2dad59fe41f3c0c20665c130fa40dd0fb6bf', 'decoded output': { '0': 'bytes1: _b 0x12', @@ -83,7 +83,7 @@ module.exports = { .clickFunction('retunValues3 - transact (not payable)') .testFunction('0xb4108649d5e65a4a0776d6ac98c2c356540a7e99d641705a82352a845d467eb5', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xb4108649d5e65a4a0776d6ac98c2c356540a7e99d641705a82352a845d467eb5', 'decoded output': { '0': 'uint8: _en 2', @@ -101,7 +101,7 @@ module.exports = { .clickFunction('inputValue1 - transact (not payable)', {types: 'uint256 _u, int256 _i, string _str', values: '"2343242", "-4324324", "string _ string _ string _ string _ string _ string _ string _ string _ string _ string _"'}) .testFunction('0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0xe9678b5486674a0425301a1d7e925c22cfb9f7f7ec6242697d742009f7ef5b97', 'decoded output': { '0': 'uint256: _uret 2343242', @@ -112,26 +112,29 @@ module.exports = { .pause(500) .clickFunction('inputValue2 - transact (not payable)', {types: 'uint256[3] _n, bytes8[4] _b8', values: '[1,2,3], ["0x1234000000000000", "0x1234000000000000","0x1234000000000000","0x1234000000000000"]'}) .testFunction('0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0x21724b08c3699bda8375803f8dc842194aea370f2aac284e55144b452dca321f', 'decoded output': { '0': 'uint256[3]: _nret 1,2,3', '1': 'bytes8[4]: _b8ret 0x1234000000000000,0x1234000000000000,0x1234000000000000,0x1234000000000000' }, logs: [ - {"from":"0x8c1ed7e19abaa9f23c476da86dc1577f1ef401f5", - "topic":"0xd30981760edbf605bda8689e945f622877f230c9a77cbfbd448aa4b7d8ac6e7f", - "event":"event1", - "args":{ - "0":"-123", - "1":"123", - "2":{ - "_isIndexed":true, - "hash":"0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" - }, - "3":"0x12340000", - "4":"test _ test _ test _ test test _ test test _ test test _ test test _ test test _ test test _ test "} - }] + { + 'from': '0x8c1eD7e19abAa9f23c476dA86Dc1577F1Ef401f5', + 'topic': '0xd30981760edbf605bda8689e945f622877f230c9a77cbfbd448aa4b7d8ac6e7f', + 'event': 'event1', + 'args': { + '0': '-123', + '1': '123', + '2': { + "_isIndexed":true, + 'hash': '0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658' + }, + '3': '0x12340000', + '4': 'test _ test _ test _ test test _ test test _ test test _ test test _ test test _ test test _ test ' + } + } + ] }) .click('*[data-id="deployAndRunClearInstances"]') }, diff --git a/apps/remix-ide-e2e/src/tests/txListener.test.ts b/apps/remix-ide-e2e/src/tests/txListener.test.ts index be4056778f..9e2e10a4b5 100644 --- a/apps/remix-ide-e2e/src/tests/txListener.test.ts +++ b/apps/remix-ide-e2e/src/tests/txListener.test.ts @@ -31,7 +31,7 @@ module.exports = { .clickFunction('delegate - transact (not payable)', {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}) .testFunction('0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', { - status: '0x1 Transaction mined and execution succeed', + status: 'true Transaction mined and execution succeed', 'transaction hash': '0x41fab8ea5b1d9fba5e0a6545ca1a2d62fff518578802c033c2b9a031a01c31b3', 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } }) @@ -42,7 +42,7 @@ module.exports = { .pause(5000) .testFunction('0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', { - status: '0x0 Transaction mined but execution failed', + status: 'false Transaction mined but execution failed', 'transaction hash': '0xca58080c8099429caeeffe43b8104df919c2c543dceb9edf9242fa55f045c803', 'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } }) From e0cee847e9f7e22658c3b8f8eff2b607f8cc780b Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 1 Oct 2020 10:52:02 +0200 Subject: [PATCH 5/5] add e2e tests --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 0ea1427111..e1eb64b3f0 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -59,7 +59,13 @@ module.exports = { .pause(5000) .executeScript(`remix.execute('browser/asyncAwaitWithFileManagerAccess.js')`) .pause(6000) - .journalLastChildIncludes('contract Ballot {') + .journalLastChildIncludes('contract Ballot {') + }, + + 'Call web3.eth.getAccounts() using JavaScript VM': function (browser: NightwatchBrowser) { + browser + .executeScript(`web3.eth.getAccounts()`) + .journalLastChildIncludes(`[ "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2", "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db", "0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB", "0x617F2E2fD72FD9D5503197092aC168c91465E7f2", "0x17F6AD8Ef982297579C203069C1DbfFE4348c372", "0x5c6B0f7Bf3E7ce046039Bd8FABdfD3f9F5021678", "0x03C6FcED478cBbC9a4FAB34eF9f40767739D1Ff7", "0x1aE0EA34a72D944a8C7603FfB3eC30a6669E454C", "0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC", "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C", "0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB", "0x583031D1113aD414F02576BD6afaBfb302140225", "0xdD870fA1b7C4700F2BD7f44238821C26f7392148" ]`) .end() },