In-browser signing support (#3231)

* Signer RAW confirmations

* Returning address book as eth_accounts

* UI support for in-browser signing

* Post review fixes

* Adding new methods to jsonrpc

* Fixing eth_accounts

* Deterministic accounts ordering
This commit is contained in:
Tomasz Drwięga
2016-11-10 11:27:05 +01:00
committed by Gav Wood
parent 90ff810e36
commit 2f98169539
21 changed files with 447 additions and 43 deletions

View File

@@ -16,6 +16,9 @@
import * as actions from './signerActions';
import { inHex } from '../../api/format/input';
import { Wallet } from '../../util/wallet';
export default class SignerMiddleware {
constructor (api) {
this._api = api;
@@ -49,23 +52,58 @@ export default class SignerMiddleware {
}
onConfirmStart = (store, action) => {
const { id, password } = action.payload;
const { id, password, wallet, payload } = action.payload;
this._api.signer
.confirmRequest(id, {}, password)
.then((txHash) => {
console.log('confirmRequest', id, txHash);
if (!txHash) {
store.dispatch(actions.errorConfirmRequest({ id, err: 'Unable to confirm.' }));
return;
const handlePromise = promise => {
promise
.then((txHash) => {
console.log('confirmRequest', id, txHash);
if (!txHash) {
store.dispatch(actions.errorConfirmRequest({ id, err: 'Unable to confirm.' }));
return;
}
store.dispatch(actions.successConfirmRequest({ id, txHash }));
})
.catch((error) => {
console.error('confirmRequest', id, error);
store.dispatch(actions.errorConfirmRequest({ id, err: error.message }));
});
};
// Sign request in-browser
if (wallet && payload.transaction) {
const { transaction } = payload;
(transaction.nonce.isZero()
? this._api.parity.nextNonce(transaction.from)
: Promise.resolve(transaction.nonce)
).then(nonce => {
let txData = {
to: inHex(transaction.to),
nonce: inHex(transaction.nonce.isZero() ? nonce : transaction.nonce),
gasPrice: inHex(transaction.gasPrice),
gasLimit: inHex(transaction.gas),
value: inHex(transaction.value),
data: inHex(transaction.data)
};
try {
// NOTE: Derving the key takes significant amount of time,
// make sure to display some kind of "in-progress" state.
const signer = Wallet.fromJson(wallet, password);
const rawTx = signer.signTransaction(txData);
handlePromise(this._api.signer.confirmRequestRaw(id, rawTx));
} catch (error) {
console.error(error);
store.dispatch(actions.errorConfirmRequest({ id, err: error.message }));
}
store.dispatch(actions.successConfirmRequest({ id, txHash }));
})
.catch((error) => {
console.error('confirmRequest', id, error);
store.dispatch(actions.errorConfirmRequest({ id, err: error.message }));
});
return;
}
handlePromise(this._api.signer.confirmRequest(id, {}, password));
}
onRejectStart = (store, action) => {