From e43fb8f708e35a75b78c0d01867e68374454889c Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 25 May 2021 13:10:06 +0200 Subject: [PATCH 01/17] updated the dialog text --- apps/remix-ide/src/app/files/remixd-handle.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide/src/app/files/remixd-handle.js b/apps/remix-ide/src/app/files/remixd-handle.js index a2d94eb3ea..679a27ce9a 100644 --- a/apps/remix-ide/src/app/files/remixd-handle.js +++ b/apps/remix-ide/src/app/files/remixd-handle.js @@ -4,6 +4,7 @@ import * as packageJson from '../../../../../package.json' var yo = require('yo-yo') var modalDialog = require('../ui/modaldialog') var modalDialogCustom = require('../ui/modal-dialog-custom') +var copyToClipboard = require('../ui/copy-to-clipboard') var csjs = require('csjs-inject') @@ -130,22 +131,27 @@ export class RemixdHandle extends WebsocketPlugin { } function remixdDialog () { + const commandText = 'remixd -s absolute-path-to-the-shared-folder --remix-ide your-remix-ide-URL-instance' return yo`
-
Interact with your file system from Remix.
See the Remixd tutorial for more info. +
+ Access your file system from Remix IDE. Remixd the NPM module needs to be running in the background to use the Remixd plugin. For more info please check the Remixd tutorial. +
+
If you are just looking for the remixd command here it is: +

remixd -s absolute-path-to-the-shared-folder --remix-ide your-remix-ide-URL-instance + ${copyToClipboard(() => commandText)}
-
If you have looked at the Remixd docs and just need remixd command,
here it is: -
remixd -s absolute-path-to-the-shared-folder --remix-ide your-remix-ide-URL-instance +
A connection will start a session between ${window.location.origin} and your local file system ws://127.0.0.1:65520 +
To see that a connection has been made, check that there is a localhost section in the Files Explorer
-
Connection will start a session between ${window.location.origin} and your local file system ws://127.0.0.1:65520 - so please make sure your system is secured enough (port 65520 neither opened nor forwarded). +
Please make sure your system is secured enough (port 65520 should not be opened nor forwarded). + This feature is still in Alpha, so we recommend you to keep a copy of the shared folder.
Before using, make sure you have the latest remixd version.
Read here how to update it
-
This feature is still in Alpha, so we recommend you to keep a copy of the shared folder.
` } From 4ce7228874fdd466b1b0e3284bd4c7a5857f0037 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 19 May 2021 18:06:20 +0530 Subject: [PATCH 02/17] hardhat provider plugin --- apps/remix-ide/src/app.js | 5 ++- .../src/app/tabs/hardhat-provider.js | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 apps/remix-ide/src/app/tabs/hardhat-provider.js diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 93dd6753b5..aafc1e8ede 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -29,6 +29,7 @@ const { OffsetToLineColumnConverter } = require('./lib/offsetToLineColumnConvert const QueryParams = require('./lib/query-params') const Storage = remixLib.Storage const RemixDProvider = require('./app/files/remixDProvider') +const HardhatProvider = require('./app/tabs/hardhat-provider') const Config = require('./config') const modalDialogCustom = require('./app/ui/modal-dialog-custom') const modalDialog = require('./app/ui/modaldialog') @@ -296,6 +297,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org makeUdapp(blockchain, compilersArtefacts, (domEl) => terminal.logHtml(domEl)) const contextualListener = new ContextualListener({ editor }) + const hardhatProvider = new HardhatProvider() engine.register([ contentImport, @@ -309,7 +311,8 @@ Please make a backup of your contracts and start using http://remix.ethereum.org contextualListener, terminal, web3Provider, - fetchAndCompile + fetchAndCompile, + hardhatProvider ]) // LAYOUT & SYSTEM VIEWS diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js new file mode 100644 index 0000000000..8ebc5e31b8 --- /dev/null +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -0,0 +1,34 @@ +import * as packageJson from '../../../../../package.json' +import { Plugin } from '@remixproject/engine' +import Web3 from 'web3' + +const profile = { + name: 'hardhat-provider', + displayName: 'Hardhat Provider', + kind: 'provider', + description: 'Hardhat provider', + methods: ['sendAsync'], + version: packageJson.version +} + +export default class HardhatProvider extends Plugin { + constructor () { + super(profile) + this.provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545') + } + + sendAsync (data) { + return new Promise((resolve, reject) => { + if (this.provider) { + this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) return reject(error) + resolve(message) + }) + } else { + resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) + } + }) + } +} + +module.exports = HardhatProvider \ No newline at end of file From db1556874bb94491e87786e6107054d14f10ddee Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 20 May 2021 18:42:17 +0530 Subject: [PATCH 03/17] test commit --- .../src/app/tabs/hardhat-provider.js | 45 ++++++++++++++----- .../src/app/ui/modal-dialog-custom.js | 2 + 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 8ebc5e31b8..4bce9e4d2f 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -1,5 +1,6 @@ import * as packageJson from '../../../../../package.json' import { Plugin } from '@remixproject/engine' +const modalDialogCustom = require('../ui/modal-dialog-custom') import Web3 from 'web3' const profile = { @@ -17,17 +18,41 @@ export default class HardhatProvider extends Plugin { this.provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545') } + web3ProviderDialogBody () { + const thePath = '' + + return yo` +
+ Note: To use Geth & https://remix.ethereum.org, configure it to allow requests from Remix:(see Geth Docs on rpc server) +
geth --http --http.corsdomain https://remix.ethereum.org
+
+ To run Remix & a local Geth test node, use this command: (see Geth Docs on Dev mode) +
geth --http --http.corsdomain="${window.origin}" --http.api web3,eth,debug,personal,net --vmdebug --datadir ${thePath} --dev console
+
+
+ WARNING: It is not safe to use the --http.corsdomain flag with a wildcard: --http.corsdomain * +
+
For more info: Remix Docs on Web3 Provider +
+
+ Hardhat Provider Endpoint +
+ ` + } + sendAsync (data) { - return new Promise((resolve, reject) => { - if (this.provider) { - this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - if (error) return reject(error) - resolve(message) - }) - } else { - resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) - } - }) + console.log('Inside sendAsync - modalDialogCustom', modalDialogCustom) + modalDialogCustom.prompt('Hardhat node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545') + // return new Promise((resolve, reject) => { + // if (this.provider) { + // this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + // if (error) return reject(error) + // resolve(message) + // }) + // } else { + // resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) + // } + // }) } } diff --git a/apps/remix-ide/src/app/ui/modal-dialog-custom.js b/apps/remix-ide/src/app/ui/modal-dialog-custom.js index d2b1daba44..19907698a2 100644 --- a/apps/remix-ide/src/app/ui/modal-dialog-custom.js +++ b/apps/remix-ide/src/app/ui/modal-dialog-custom.js @@ -8,6 +8,7 @@ module.exports = { return modal('Alert', yo`
${title}
`, null, { label: null }) }, prompt: function (title, text, inputValue, ok, cancel, focus) { + console.log('inside prompt -> 1', title) return prompt(title, text, false, inputValue, ok, cancel, focus) }, promptPassphrase: function (title, text, inputValue, ok, cancel) { @@ -88,6 +89,7 @@ const validateInput = (e) => { } function prompt (title, text, hidden, inputValue, ok, cancel, focus) { + console.log('inside prompt -> 2', title) if (!inputValue) inputValue = '' var type = hidden ? 'password' : 'text' var input = yo` From e28981701db78e0bcce22b9702b74103a4680006 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 20 May 2021 19:48:53 +0530 Subject: [PATCH 04/17] modal --- .../src/app/tabs/hardhat-provider.js | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 4bce9e4d2f..e42812c7a7 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -1,5 +1,6 @@ import * as packageJson from '../../../../../package.json' import { Plugin } from '@remixproject/engine' +const yo = require('yo-yo') const modalDialogCustom = require('../ui/modal-dialog-custom') import Web3 from 'web3' @@ -15,26 +16,12 @@ const profile = { export default class HardhatProvider extends Plugin { constructor () { super(profile) - this.provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545') + this.provider = null } - web3ProviderDialogBody () { - const thePath = '' - + hardhatProviderDialogBody () { return yo`
- Note: To use Geth & https://remix.ethereum.org, configure it to allow requests from Remix:(see Geth Docs on rpc server) -
geth --http --http.corsdomain https://remix.ethereum.org
-
- To run Remix & a local Geth test node, use this command: (see Geth Docs on Dev mode) -
geth --http --http.corsdomain="${window.origin}" --http.api web3,eth,debug,personal,net --vmdebug --datadir ${thePath} --dev console
-
-
- WARNING: It is not safe to use the --http.corsdomain flag with a wildcard: --http.corsdomain * -
-
For more info: Remix Docs on Web3 Provider -
-
Hardhat Provider Endpoint
` @@ -42,17 +29,22 @@ export default class HardhatProvider extends Plugin { sendAsync (data) { console.log('Inside sendAsync - modalDialogCustom', modalDialogCustom) - modalDialogCustom.prompt('Hardhat node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545') - // return new Promise((resolve, reject) => { - // if (this.provider) { - // this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - // if (error) return reject(error) - // resolve(message) - // }) - // } else { - // resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) - // } - // }) + modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + console.log('target--->', target) + this.provider = new Web3.providers.HttpProvider(target) + return new Promise((resolve, reject) => { + console.log('inside sendAsync promise') + if (this.provider) { + this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) return reject(error) + resolve(message) + }) + } else { + resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) + } + }) + }) + } } From 231895c00983cce5079c9ff5c18a16008060eb63 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Fri, 21 May 2021 17:04:12 +0530 Subject: [PATCH 05/17] set execution context for hardhat provider --- .../src/app/tabs/hardhat-provider.js | 48 ++++++------------- .../remix-ide/src/app/tabs/runTab/settings.js | 39 +++++++++++---- .../src/blockchain/execution-context.js | 2 +- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index e42812c7a7..5bc35ee57e 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -1,8 +1,5 @@ import * as packageJson from '../../../../../package.json' import { Plugin } from '@remixproject/engine' -const yo = require('yo-yo') -const modalDialogCustom = require('../ui/modal-dialog-custom') -import Web3 from 'web3' const profile = { name: 'hardhat-provider', @@ -14,38 +11,23 @@ const profile = { } export default class HardhatProvider extends Plugin { - constructor () { - super(profile) - this.provider = null - } + constructor () { + super(profile) + this.provider = null + } - hardhatProviderDialogBody () { - return yo` -
- Hardhat Provider Endpoint -
- ` - } - - sendAsync (data) { - console.log('Inside sendAsync - modalDialogCustom', modalDialogCustom) - modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - console.log('target--->', target) - this.provider = new Web3.providers.HttpProvider(target) - return new Promise((resolve, reject) => { - console.log('inside sendAsync promise') - if (this.provider) { - this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - if (error) return reject(error) - resolve(message) - }) - } else { - resolve({"jsonrpc": "2.0", "result": [], "id": data.id}) - } + sendAsync (data) { + return new Promise((resolve, reject) => { + if (this.provider) { + this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) return reject(error) + resolve(message) }) - }) - + } else { + resolve({ jsonrpc: '2.0', result: [], id: data.id }) } + }) + } } -module.exports = HardhatProvider \ No newline at end of file +module.exports = HardhatProvider diff --git a/apps/remix-ide/src/app/tabs/runTab/settings.js b/apps/remix-ide/src/app/tabs/runTab/settings.js index dd726c09be..b3e3aaedc2 100644 --- a/apps/remix-ide/src/app/tabs/runTab/settings.js +++ b/apps/remix-ide/src/app/tabs/runTab/settings.js @@ -244,16 +244,29 @@ class SettingsUI { } setExecutionContext (context) { - this.blockchain.changeExecutionContext(context, () => { - modalDialogCustom.prompt('External node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { - if (alertMsg) addTooltip(alertMsg) - this.setFinalContext() - }) + if (context === 'Hardhat Provider') { + this.blockchain.changeExecutionContext(context, () => { + modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { + if (alertMsg) addTooltip(alertMsg) + this.setFinalContext() + }) + }, this.setFinalContext.bind(this)) + }, (alertMsg) => { + addTooltip(alertMsg) + }, this.setFinalContext.bind(this)) + } else { + this.blockchain.changeExecutionContext(context, () => { + modalDialogCustom.prompt('External node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { + if (alertMsg) addTooltip(alertMsg) + this.setFinalContext() + }) + }, this.setFinalContext.bind(this)) + }, (alertMsg) => { + addTooltip(alertMsg) }, this.setFinalContext.bind(this)) - }, (alertMsg) => { - addTooltip(alertMsg) - }, this.setFinalContext.bind(this)) + } } web3ProviderDialogBody () { @@ -278,6 +291,14 @@ class SettingsUI { ` } + hardhatProviderDialogBody () { + return yo` +
+ Hardhat Provider Endpoint +
+ ` + } + setFinalContext () { // set the final context. Cause it is possible that this is not the one we've originaly selected this.selectExEnv.value = this.blockchain.getProvider() diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index 41588e3708..f71f670a41 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -142,7 +142,7 @@ export class ExecutionContext { } } - if (context === 'web3') { + if (context === 'web3' || context === 'Hardhat Provider') { confirmCb(cb) } From 8f90b540fb8f6ae003e763e581701da87cd5cd5f Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Fri, 21 May 2021 17:31:41 +0530 Subject: [PATCH 06/17] removed consoles --- apps/remix-ide/src/app/ui/modal-dialog-custom.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/remix-ide/src/app/ui/modal-dialog-custom.js b/apps/remix-ide/src/app/ui/modal-dialog-custom.js index 19907698a2..d2b1daba44 100644 --- a/apps/remix-ide/src/app/ui/modal-dialog-custom.js +++ b/apps/remix-ide/src/app/ui/modal-dialog-custom.js @@ -8,7 +8,6 @@ module.exports = { return modal('Alert', yo`
${title}
`, null, { label: null }) }, prompt: function (title, text, inputValue, ok, cancel, focus) { - console.log('inside prompt -> 1', title) return prompt(title, text, false, inputValue, ok, cancel, focus) }, promptPassphrase: function (title, text, inputValue, ok, cancel) { @@ -89,7 +88,6 @@ const validateInput = (e) => { } function prompt (title, text, hidden, inputValue, ok, cancel, focus) { - console.log('inside prompt -> 2', title) if (!inputValue) inputValue = '' var type = hidden ? 'password' : 'text' var input = yo` From bbd645decb035cac01de761f02a9c400690cd80c Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 24 May 2021 14:03:37 +0530 Subject: [PATCH 07/17] update provider on cancel --- apps/remix-ide/src/app.js | 2 +- apps/remix-ide/src/app/tabs/hardhat-provider.js | 9 +++++---- apps/remix-ide/src/app/tabs/runTab/settings.js | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index aafc1e8ede..798b9fae22 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -275,6 +275,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org const networkModule = new NetworkModule(blockchain) // ----------------- represent the current selected web3 provider ---- const web3Provider = new Web3ProviderModule(blockchain) + const hardhatProvider = new HardhatProvider(blockchain) // ----------------- convert offset to line/column service ----------- const offsetToLineColumnConverter = new OffsetToLineColumnConverter() registry.put({ api: offsetToLineColumnConverter, name: 'offsettolinecolumnconverter' }) @@ -297,7 +298,6 @@ Please make a backup of your contracts and start using http://remix.ethereum.org makeUdapp(blockchain, compilersArtefacts, (domEl) => terminal.logHtml(domEl)) const contextualListener = new ContextualListener({ editor }) - const hardhatProvider = new HardhatProvider() engine.register([ contentImport, diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 5bc35ee57e..bff2b9cb3a 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -11,15 +11,16 @@ const profile = { } export default class HardhatProvider extends Plugin { - constructor () { + constructor (blockchain) { super(profile) - this.provider = null + this.blockchain = blockchain } sendAsync (data) { return new Promise((resolve, reject) => { - if (this.provider) { - this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + const provider = this.blockchain.web3().currentProvider + if (provider) { + provider[provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { if (error) return reject(error) resolve(message) }) diff --git a/apps/remix-ide/src/app/tabs/runTab/settings.js b/apps/remix-ide/src/app/tabs/runTab/settings.js index b3e3aaedc2..070efa1ded 100644 --- a/apps/remix-ide/src/app/tabs/runTab/settings.js +++ b/apps/remix-ide/src/app/tabs/runTab/settings.js @@ -294,7 +294,7 @@ class SettingsUI { hardhatProviderDialogBody () { return yo`
- Hardhat Provider Endpoint + Hardhat JSON-RPC Endpoint
` } From c7799a1854eee81422c11661514c9a54028a52e5 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Tue, 25 May 2021 13:58:15 +0530 Subject: [PATCH 08/17] plugin code segregation --- .../src/app/tabs/hardhat-provider.js | 37 ++++++++++++++----- .../remix-ide/src/app/tabs/runTab/settings.js | 19 +--------- .../src/blockchain/execution-context.js | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index bff2b9cb3a..0df52d74ea 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -1,5 +1,8 @@ import * as packageJson from '../../../../../package.json' import { Plugin } from '@remixproject/engine' +import Web3 from 'web3' +const yo = require('yo-yo') +const modalDialogCustom = require('../ui/modal-dialog-custom') const profile = { name: 'hardhat-provider', @@ -13,20 +16,34 @@ const profile = { export default class HardhatProvider extends Plugin { constructor (blockchain) { super(profile) + this.provider = null this.blockchain = blockchain } + hardhatProviderDialogBody () { + return yo` +
+ Hardhat JSON-RPC Endpoint +
+ ` + } + sendAsync (data) { - return new Promise((resolve, reject) => { - const provider = this.blockchain.web3().currentProvider - if (provider) { - provider[provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - if (error) return reject(error) - resolve(message) - }) - } else { - resolve({ jsonrpc: '2.0', result: [], id: data.id }) - } + modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.blockchain.setProviderFromEndpoint(target, 'Hardhat Provider', (alertMsg) => { + console.log('target-->', target) + this.provider = new Web3.providers.HttpProvider(target) + return new Promise((resolve, reject) => { + if (this.provider) { + this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) return reject(error) + resolve(message) + }) + } else { + resolve({ jsonrpc: '2.0', result: [], id: data.id }) + } + }) + }) }) } } diff --git a/apps/remix-ide/src/app/tabs/runTab/settings.js b/apps/remix-ide/src/app/tabs/runTab/settings.js index 070efa1ded..7885c6cc72 100644 --- a/apps/remix-ide/src/app/tabs/runTab/settings.js +++ b/apps/remix-ide/src/app/tabs/runTab/settings.js @@ -245,16 +245,7 @@ class SettingsUI { setExecutionContext (context) { if (context === 'Hardhat Provider') { - this.blockchain.changeExecutionContext(context, () => { - modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { - if (alertMsg) addTooltip(alertMsg) - this.setFinalContext() - }) - }, this.setFinalContext.bind(this)) - }, (alertMsg) => { - addTooltip(alertMsg) - }, this.setFinalContext.bind(this)) + this.blockchain.changeExecutionContext(context) } else { this.blockchain.changeExecutionContext(context, () => { modalDialogCustom.prompt('External node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { @@ -291,14 +282,6 @@ class SettingsUI { ` } - hardhatProviderDialogBody () { - return yo` -
- Hardhat JSON-RPC Endpoint -
- ` - } - setFinalContext () { // set the final context. Cause it is possible that this is not the one we've originaly selected this.selectExEnv.value = this.blockchain.getProvider() diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index f71f670a41..41588e3708 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -142,7 +142,7 @@ export class ExecutionContext { } } - if (context === 'web3' || context === 'Hardhat Provider') { + if (context === 'web3') { confirmCb(cb) } From 294e130c16ffe5f70936acc35448d0f7cb121696 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Tue, 25 May 2021 17:22:55 +0530 Subject: [PATCH 09/17] more segregation --- .../src/app/tabs/hardhat-provider.js | 44 ++++++++++++------- .../remix-ide/src/app/tabs/runTab/settings.js | 22 ++++------ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 0df52d74ea..fe1923474f 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -20,6 +20,10 @@ export default class HardhatProvider extends Plugin { this.blockchain = blockchain } + onDeactivation () { + this.provider = null + } + hardhatProviderDialogBody () { return yo`
@@ -29,22 +33,32 @@ export default class HardhatProvider extends Plugin { } sendAsync (data) { - modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - this.blockchain.setProviderFromEndpoint(target, 'Hardhat Provider', (alertMsg) => { - console.log('target-->', target) - this.provider = new Web3.providers.HttpProvider(target) - return new Promise((resolve, reject) => { - if (this.provider) { - this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - if (error) return reject(error) - resolve(message) - }) - } else { - resolve({ jsonrpc: '2.0', result: [], id: data.id }) - } - }) - }) + return new Promise((resolve, reject) => { + if (!this.provider) { + modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.provider = new Web3.providers.HttpProvider(target) + sendAsyncInternal(this.provider, data, resolve, reject) + }, () => { + console.log('cancel clicked', this.provider) + console.log('inside if--->', this.blockchain.getProvider()) + console.log('inside if-2-->', this.blockchain.getCurrentProvider()) + this.call('udapp', 'setEnvironmentMode', this.blockchain.getProvider()) + }) + } else { + sendAsyncInternal(this.provider, data, resolve, reject) + } + }) + } +} + +const sendAsyncInternal = (provider, data, resolve, reject) => { + if (provider) { + provider[provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) return reject(error) + resolve(message) }) + } else { + resolve({ jsonrpc: '2.0', result: [], id: data.id }) } } diff --git a/apps/remix-ide/src/app/tabs/runTab/settings.js b/apps/remix-ide/src/app/tabs/runTab/settings.js index 7885c6cc72..dd726c09be 100644 --- a/apps/remix-ide/src/app/tabs/runTab/settings.js +++ b/apps/remix-ide/src/app/tabs/runTab/settings.js @@ -244,20 +244,16 @@ class SettingsUI { } setExecutionContext (context) { - if (context === 'Hardhat Provider') { - this.blockchain.changeExecutionContext(context) - } else { - this.blockchain.changeExecutionContext(context, () => { - modalDialogCustom.prompt('External node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { - if (alertMsg) addTooltip(alertMsg) - this.setFinalContext() - }) - }, this.setFinalContext.bind(this)) - }, (alertMsg) => { - addTooltip(alertMsg) + this.blockchain.changeExecutionContext(context, () => { + modalDialogCustom.prompt('External node request', this.web3ProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.blockchain.setProviderFromEndpoint(target, context, (alertMsg) => { + if (alertMsg) addTooltip(alertMsg) + this.setFinalContext() + }) }, this.setFinalContext.bind(this)) - } + }, (alertMsg) => { + addTooltip(alertMsg) + }, this.setFinalContext.bind(this)) } web3ProviderDialogBody () { From 8f773cb5a8c46bf53893f15196b009ed889236a0 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 26 May 2021 12:42:40 +0530 Subject: [PATCH 10/17] cancel click handled --- apps/remix-ide/src/app/tabs/hardhat-provider.js | 12 +++++------- apps/remix-ide/src/blockchain/execution-context.js | 7 ++++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index fe1923474f..0816ea2600 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -35,14 +35,11 @@ export default class HardhatProvider extends Plugin { sendAsync (data) { return new Promise((resolve, reject) => { if (!this.provider) { - modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { - this.provider = new Web3.providers.HttpProvider(target) + modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { + this.provider = new Web3.providers.HttpProvider(target) sendAsyncInternal(this.provider, data, resolve, reject) }, () => { - console.log('cancel clicked', this.provider) - console.log('inside if--->', this.blockchain.getProvider()) - console.log('inside if-2-->', this.blockchain.getCurrentProvider()) - this.call('udapp', 'setEnvironmentMode', this.blockchain.getProvider()) + sendAsyncInternal(this.provider, data, resolve, reject) }) } else { sendAsyncInternal(this.provider, data, resolve, reject) @@ -58,7 +55,8 @@ const sendAsyncInternal = (provider, data, resolve, reject) => { resolve(message) }) } else { - resolve({ jsonrpc: '2.0', result: [], id: data.id }) + const result = data.method === 'net_listening' ? 'canceled' : [] + resolve({ jsonrpc: '2.0', result: result, id: data.id }) } } diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index 41588e3708..dbefacda87 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -145,7 +145,6 @@ export class ExecutionContext { if (context === 'web3') { confirmCb(cb) } - if (this.customNetWorks[context]) { var network = this.customNetWorks[context] this.setProviderFromEndpoint(network.provider, network.name, (error) => { @@ -189,14 +188,16 @@ export class ExecutionContext { const oldProvider = web3.currentProvider web3.setProvider(endpoint) - web3.eth.net.isListening((err, isConnected) => { - if (!err && isConnected) { + if (!err && isConnected === true) { this.executionContext = context this._updateBlockGasLimit() this.event.trigger('contextChanged', [context]) this.event.trigger('web3EndpointChanged') cb() + } else if (isConnected === 'canceled') { + web3.setProvider(oldProvider) + cb() } else { web3.setProvider(oldProvider) cb('Not possible to connect to the Web3 provider. Make sure the provider is running, a connection is open (via IPC or RPC) or that the provider plugin is properly configured.') From 56f8c0a30fa7d9363c5c04a44928bcd7a4476740 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 26 May 2021 13:15:55 +0530 Subject: [PATCH 11/17] added info in modal --- apps/remix-ide/src/app/tabs/hardhat-provider.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 0816ea2600..3a8c9fa3eb 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -26,7 +26,12 @@ export default class HardhatProvider extends Plugin { hardhatProviderDialogBody () { return yo` -
+
+ Note: To run Hardhat network node on your system, go to hardhat project folder and run command: +
npx hardhat node
+
+ For more info, visit: Hardhat Documentation +

Hardhat JSON-RPC Endpoint
` From 9db9476d8540114a6a1ca28dd0b9236aefbbde7f Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 26 May 2021 14:01:00 +0530 Subject: [PATCH 12/17] reset provider on error --- .../src/app/tabs/hardhat-provider.js | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/hardhat-provider.js b/apps/remix-ide/src/app/tabs/hardhat-provider.js index 3a8c9fa3eb..037117fa85 100644 --- a/apps/remix-ide/src/app/tabs/hardhat-provider.js +++ b/apps/remix-ide/src/app/tabs/hardhat-provider.js @@ -42,26 +42,29 @@ export default class HardhatProvider extends Plugin { if (!this.provider) { modalDialogCustom.prompt('Hardhat node request', this.hardhatProviderDialogBody(), 'http://127.0.0.1:8545', (target) => { this.provider = new Web3.providers.HttpProvider(target) - sendAsyncInternal(this.provider, data, resolve, reject) + this.sendAsyncInternal(data, resolve, reject) }, () => { - sendAsyncInternal(this.provider, data, resolve, reject) + this.sendAsyncInternal(data, resolve, reject) }) } else { - sendAsyncInternal(this.provider, data, resolve, reject) + this.sendAsyncInternal(data, resolve, reject) } }) } -} -const sendAsyncInternal = (provider, data, resolve, reject) => { - if (provider) { - provider[provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { - if (error) return reject(error) - resolve(message) - }) - } else { - const result = data.method === 'net_listening' ? 'canceled' : [] - resolve({ jsonrpc: '2.0', result: result, id: data.id }) + sendAsyncInternal (data, resolve, reject) { + if (this.provider) { + this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](data, (error, message) => { + if (error) { + this.provider = null + return reject(error) + } + resolve(message) + }) + } else { + const result = data.method === 'net_listening' ? 'canceled' : [] + resolve({ jsonrpc: '2.0', result: result, id: data.id }) + } } } From 71d9d6e9b2efb7cdbc178fc85be9f212081f52cf Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Wed, 26 May 2021 03:29:27 +0100 Subject: [PATCH 13/17] Allow multiple pasting of files and folders with non-clashing names. --- apps/remix-ide/src/app/files/fileManager.js | 8 +++++--- apps/remix-ide/src/lib/helper.js | 14 ++++++++++++++ .../file-explorer/src/lib/file-explorer.tsx | 4 ---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/apps/remix-ide/src/app/files/fileManager.js b/apps/remix-ide/src/app/files/fileManager.js index 79664f5799..7bd7b04066 100644 --- a/apps/remix-ide/src/app/files/fileManager.js +++ b/apps/remix-ide/src/app/files/fileManager.js @@ -222,9 +222,10 @@ class FileManager extends Plugin { await this._handleExists(dest, `Cannot paste content into ${dest}. Path does not exist.`) await this._handleIsDir(dest, `Cannot paste content into ${dest}. Path is not directory.`) const content = await this.readFile(src) - const copiedFileName = customName ? '/' + customName : '/' + `Copy_${helper.extractNameFromKey(src)}` + let copiedFilePath = dest + (customName ? '/' + customName : '/' + `Copy_${helper.extractNameFromKey(src)}`) + copiedFilePath = await helper.createNonClashingNameAsync(copiedFilePath, this) - await this.writeFile(dest + copiedFileName, content) + await this.writeFile(copiedFilePath, content) } catch (e) { throw new Error(e) } @@ -252,7 +253,8 @@ class FileManager extends Plugin { async inDepthCopy (src, dest, count = 0) { const content = await this.readdir(src) - const copiedFolderPath = count === 0 ? dest + '/' + `Copy_${helper.extractNameFromKey(src)}` : dest + '/' + helper.extractNameFromKey(src) + let copiedFolderPath = count === 0 ? dest + '/' + `Copy_${helper.extractNameFromKey(src)}` : dest + '/' + helper.extractNameFromKey(src) + copiedFolderPath = await helper.createNonClashingDirNameAsync(copiedFolderPath, this) await this.mkdir(copiedFolderPath) diff --git a/apps/remix-ide/src/lib/helper.js b/apps/remix-ide/src/lib/helper.js index b910dccfb3..0486c557d0 100644 --- a/apps/remix-ide/src/lib/helper.js +++ b/apps/remix-ide/src/lib/helper.js @@ -71,6 +71,20 @@ module.exports = { return name + counter + prefix + '.' + ext }, + async createNonClashingDirNameAsync (name, fileManager) { + if (!name) name = 'Undefined' + let counter = '' + let exist = true + + do { + const isDuplicate = await fileManager.exists(name + counter) + + if (isDuplicate) counter = (counter | 0) + 1 + else exist = false + } while (exist) + + return name + counter + }, checkSpecialChars (name) { return name.match(/[:*?"<>\\'|]/) != null }, diff --git a/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx b/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx index a176909b94..a17f2c3faa 100644 --- a/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx +++ b/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx @@ -763,10 +763,6 @@ export const FileExplorer = (props: FileExplorerProps) => { state.copyElement.map(({ key, type }) => { type === 'file' ? copyFile(key, dest) : copyFolder(key, dest) }) - setState(prevState => { - return { ...prevState, copyElement: [] } - }) - setCanPaste(false) } const label = (file: File) => { From 02b141c28a487c2b84feb842ae2e092e47322d84 Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Wed, 26 May 2021 10:29:54 +0100 Subject: [PATCH 14/17] Fixed failing test --- apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts b/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts index ec4af936d0..26a49d9beb 100644 --- a/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts +++ b/apps/remix-ide-e2e/src/tests/fileManager_api.spec.ts @@ -147,8 +147,8 @@ const executeReadFile = ` const executeCopyFile = ` const run = async () => { - await remix.call('fileManager', 'copyFile', 'contracts/3_Ballot.sol', '/', 'new_contract.sol') - const result = await remix.call('fileManager', 'readFile', 'new_contract.sol') + await remix.call('fileManager', 'copyFile', 'contracts/3_Ballot.sol', '/', 'copy_contract.sol') + const result = await remix.call('fileManager', 'readFile', 'copy_contract.sol') console.log(result) } From 02dd885b027118d3b5baa2c8eb427b9ef04deef0 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 6 May 2021 19:41:34 +0200 Subject: [PATCH 15/17] "confirm tx on main net" restyled --- apps/remix-ide/src/app/ui/confirmDialog.js | 58 +++++++++++++++------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/apps/remix-ide/src/app/ui/confirmDialog.js b/apps/remix-ide/src/app/ui/confirmDialog.js index 596b84d423..225f35b320 100644 --- a/apps/remix-ide/src/app/ui/confirmDialog.js +++ b/apps/remix-ide/src/app/ui/confirmDialog.js @@ -25,24 +25,48 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP } var el = yo` -
-
You are creating a transaction on the main network. Click confirm if you are sure to continue.
-
-
From: ${tx.from}
-
To: ${tx.to ? tx.to : '(Contract Creation)'}
-
Amount: ${amount} Ether
-
Gas estimation: ${gasEstimation}
-
Gas limit: ${tx.gas}
-
Gas price: Gwei (visit ethgasstation.info to get more info about gas price)
-
Max transaction fee:
-
Data:
-
${tx.data && tx.data.length > 50 ? tx.data.substring(0, 49) + '...' : tx.data} ${copyToClipboard(() => { return tx.data })}
+
+
You are about to create a transaction on the main network. Confirm details to send to your provider.
+
+
+ From: + ${tx.from} +
+
+ To: + ${tx.to ? tx.to : '(Contract Creation)'} +
+
+ Amount: + ${amount} Ether +
+
+ Gas estimation: + ${gasEstimation} +
+
+ Gas limit: + ${tx.gas} +
+
+ Max transaction fee: + +
+
+ Gas price: + + Gwei (visit ethgasstation.info to get more info about gas price) +
+
+ Data: +
${tx.data && tx.data.length > 50 ? tx.data.substring(0, 49) + '...' : tx.data} ${copyToClipboard(() => { return tx.data })}
+
+
+
+ + +
-
- - Do not ask for confirmation again. (the setting will not be persisted for the next page reload) -
-
` initialParamsCb((txFeeText, gasPriceValue, gasPriceStatus) => { From 73e69f9f9f8d94bb3a083271c9038b92db79c2bf Mon Sep 17 00:00:00 2001 From: lianahus Date: Mon, 17 May 2021 09:47:45 +0200 Subject: [PATCH 16/17] some corrections to the text --- apps/remix-ide/src/app/ui/confirmDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/ui/confirmDialog.js b/apps/remix-ide/src/app/ui/confirmDialog.js index 225f35b320..e435d8c24a 100644 --- a/apps/remix-ide/src/app/ui/confirmDialog.js +++ b/apps/remix-ide/src/app/ui/confirmDialog.js @@ -26,7 +26,7 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP var el = yo`
-
You are about to create a transaction on the main network. Confirm details to send to your provider.
+
You are about to create a transaction on the main network. Confirm the details to send to your provider.
From: @@ -55,7 +55,7 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP
Gas price: - Gwei (visit ethgasstation.info to get more info about gas price) + Gwei (visit ethgasstation.info for current gas price info.)
Data: From f1a4225a9282e9377f413d4412a5cfd6560eadb2 Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 25 May 2021 09:40:59 +0200 Subject: [PATCH 17/17] tex updated --- apps/remix-ide/src/app/ui/confirmDialog.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/ui/confirmDialog.js b/apps/remix-ide/src/app/ui/confirmDialog.js index e435d8c24a..a3246dcf6a 100644 --- a/apps/remix-ide/src/app/ui/confirmDialog.js +++ b/apps/remix-ide/src/app/ui/confirmDialog.js @@ -26,7 +26,8 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP var el = yo`
-
You are about to create a transaction on the main network. Confirm the details to send to your provider.
+
You are about to create a transaction on the Main Network. Confirm the details to send the info to your provider. +
The provider for many users is MetaMask. The provider will ask you to sign the transaction before it is sent to the Main Network.
From: