diff --git a/apps/remix-ide/src/blockchain/providers/vm.js b/apps/remix-ide/src/blockchain/providers/vm.js index f12d44c7b9..be007d97da 100644 --- a/apps/remix-ide/src/blockchain/providers/vm.js +++ b/apps/remix-ide/src/blockchain/providers/vm.js @@ -7,6 +7,7 @@ class VMProvider { this.executionContext = executionContext this.worker = null this.provider = null + this.newAccountCallback = {} } getAccounts (cb) { @@ -49,23 +50,30 @@ class VMProvider { } else { reject(new Error(msg.data.error)) } + } else if (msg.data.cmd === 'newAccountResult') { + if (this.newAccountCallback[msg.data.stamp]) { + this.newAccountCallback[msg.data.stamp](msg.data.error, msg.data.result) + delete this.newAccountCallback[msg.data.stamp] } - }) + } + }) this.worker.postMessage({ cmd: 'init', fork: this.executionContext.getCurrentFork(), nodeUrl: provider?.options['nodeUrl'], blockNumber: provider?.options['blockNumber']}) - }) + }) } // TODO: is still here because of the plugin API // can be removed later when we update the API createVMAccount (newAccount) { const { privateKey, balance } = newAccount - this.RemixSimulatorProvider.Accounts._addAccount(privateKey, balance) + this.worker.postMessage({ cmd: 'addAccount', privateKey: privateKey, balance }) const privKey = Buffer.from(privateKey, 'hex') return '0x' + privateToAddress(privKey).toString('hex') } newAccount (_passwordPromptCb, cb) { - this.RemixSimulatorProvider.Accounts.newAccount(cb) + const stamp = Date.now() + this.newAccountCallback[stamp] = cb + this.worker.postMessage({ cmd: 'newAccount', stamp }) } async getBalanceInEther (address) { diff --git a/apps/remix-ide/src/blockchain/providers/worker-vm.ts b/apps/remix-ide/src/blockchain/providers/worker-vm.ts index 7473e6ce37..b261cda864 100644 --- a/apps/remix-ide/src/blockchain/providers/worker-vm.ts +++ b/apps/remix-ide/src/blockchain/providers/worker-vm.ts @@ -42,6 +42,36 @@ self.onmessage = (e: MessageEvent) => { } break - } + } + case 'addAccount': + { + if (provider) { + provider.Accounts._addAccount(data.privateKey, data.balance) + } + + break + } + case 'newAccount': + { + if (provider) { + provider.Accounts.newAccount((error, address: string) => { + if (error) { + self.postMessage({ + cmd: 'newAccountResult', + error, + stamp: data.stamp + }) + } else { + self.postMessage({ + cmd: 'newAccountResult', + result: address, + stamp: data.stamp + }) + } + }) + } + + break + } } } diff --git a/libs/remix-ui/run-tab/src/lib/components/account.tsx b/libs/remix-ui/run-tab/src/lib/components/account.tsx index 9445176983..dfcdf4f9d1 100644 --- a/libs/remix-ui/run-tab/src/lib/components/account.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/account.tsx @@ -37,6 +37,20 @@ export function AccountUI (props: AccountProps) { }) break + case 'vm-london': + setPlusOpt({ + classList: '', + title: 'Create a new account' + }) + break + + case 'vm-berlin': + setPlusOpt({ + classList: '', + title: 'Create a new account' + }) + break + case 'web3': if (!props.personalMode) { setPlusOpt({