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:
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user