-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
TransactionSigner.js
84 lines (74 loc) · 2.59 KB
/
TransactionSigner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
This file is part of web3.js.
web3.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
web3.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file TransactionSigner.js
* @author Samuel Furter <samuel@ethereum.org>
* @date 2019
*/
import EthereumTx from 'ethereumjs-tx';
export default class TransactionSigner {
/**
* @param {Utils} utils // TODO: Remove utils dependency and use a Hex VO
* @param {Object} formatters // TODO: Remove formatters dependency and use a Transaction VO
*
* @constructor
*/
constructor(utils, formatters) {
this.utils = utils;
this.formatters = formatters;
}
/**
* Add to be production build save
*
* @property Type
*
* @returns {String}
*/
get type() {
return 'TransactionSigner';
}
/**
* Signs the transaction
*
* @param {Object} transaction
* @param {String} privateKey
*
* @returns {Promise<{messageHash, v, r, s, rawTransaction}>}
*/
async sign(transaction, privateKey) {
if (!privateKey) {
throw new Error('No privateKey given to the TransactionSigner.');
}
if (privateKey.startsWith('0x')) {
privateKey = privateKey.substring(2);
}
const ethTx = new EthereumTx(transaction);
ethTx.sign(Buffer.from(privateKey, 'hex'));
const validationResult = ethTx.validate(true);
if (validationResult !== '') {
throw new Error(`TransactionSigner Error: ${validationResult}`);
}
const rlpEncoded = ethTx.serialize().toString('hex');
const rawTransaction = '0x' + rlpEncoded;
const transactionHash = this.utils.keccak256(rawTransaction);
return {
messageHash: Buffer.from(ethTx.hash(false)).toString('hex'),
v: '0x' + Buffer.from(ethTx.v).toString('hex'),
r: '0x' + Buffer.from(ethTx.r).toString('hex'),
s: '0x' + Buffer.from(ethTx.s).toString('hex'),
rawTransaction,
transactionHash
};
}
}