diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index c94e8ea9963..5aa0ec5853a 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -13,6 +13,8 @@ var helper = require('../../lib/helper.js') var executionContext = require('../../execution-context') var modalDialogCustom = require('../ui/modal-dialog-custom') var copyToClipboard = require('../ui/copy-to-clipboard') +const Buffer = require('safe-buffer').Buffer +var Personal = require('web3-eth-personal') var Card = require('../ui/card') var Recorder = require('../../recorder') var addTooltip = require('../ui/tooltip') @@ -527,6 +529,7 @@ function settings (container, self) {
${copyToClipboard(() => document.querySelector('#runTabView #txorigin').value)} +
` @@ -625,6 +628,67 @@ function settings (container, self) { } }) } + function signMessage (event) { + self._deps.udapp.getAccounts((err, accounts) => { + if (err) { addTooltip(`Cannot get account list: ${err}`) } + var signMessageDialog = { 'title': 'Sign a message', 'text': 'Enter a message to sign', 'inputvalue': 'Message to sign' } + var $txOrigin = container.querySelector('#txorigin') + var account = $txOrigin.selectedOptions[0].value + var isVM = executionContext.isVM() + var isInjected = executionContext.getProvider() === 'injected' + function alertSignedData (error, hash, signedData) { + if (error && error.message !== '') { + console.log(error) + addTooltip(error.message) + } else { + modalDialogCustom.alert(yo`
hash:${hash}
signature:${signedData}
`) + } + } + if (isVM) { + modalDialogCustom.promptMulti(signMessageDialog, (message) => { + const personalMsg = ethJSUtil.hashPersonalMessage(Buffer.from(message)) + var privKey = self._deps.udapp.accounts[account].privateKey + try { + var rsv = ethJSUtil.ecsign(personalMsg, privKey) + var signedData = ethJSUtil.toRpcSig(rsv.v, rsv.r, rsv.s) + alertSignedData(null, '0x' + personalMsg.toString('hex'), signedData) + } catch (e) { + addTooltip(e.message) + return + } + }, false) + } else if (isInjected) { + modalDialogCustom.promptMulti(signMessageDialog, (message) => { + const hashedMsg = executionContext.web3().sha3(message) + try { + executionContext.web3().eth.sign(account, hashedMsg, (error, signedData) => { + alertSignedData(error, hashedMsg, signedData) + }) + } catch (e) { + addTooltip(e.message) + console.log(e) + return + } + }) + } else { + modalDialogCustom.promptPassphrase('Passphrase to sign a message', 'Enter your passphrase for this account to sign the message', '', (passphrase) => { + modalDialogCustom.promptMulti(signMessageDialog, (message) => { + const hashedMsg = executionContext.web3().sha3(message) + try { + var personal = new Personal(executionContext.web3().currentProvider) + personal.sign(hashedMsg, account, passphrase, (error, signedData) => { + alertSignedData(error, hashedMsg, signedData) + }) + } catch (e) { + addTooltip(e.message) + console.log(e) + return + } + }) + }, false) + } + }) + } return el }