UNPKG

web3-provider-engine

Version:

A JavaScript library for composing Ethereum provider objects using middleware modules

77 lines (75 loc) 2.92 kB
"use strict"; /* * Uses @ethereumjs/tx to sign a transaction. * * The two callbacks a user needs to implement are: * - getAccounts() -- array of addresses supported * - getPrivateKey(address) -- return private key for a given address * * Optionally approveTransaction(), approveMessage() can be supplied too. */ var inherits = require('util').inherits; var HookedWalletProvider = require('./hooked-wallet.js'); var _require = require('@ethereumjs/tx'), TransactionFactory = _require.TransactionFactory; var ethUtil = require('@ethereumjs/util'); var sigUtil = require('@metamask/eth-sig-util'); module.exports = HookedWalletEthTxSubprovider; inherits(HookedWalletEthTxSubprovider, HookedWalletProvider); function HookedWalletEthTxSubprovider(opts) { var self = this; HookedWalletEthTxSubprovider.super_.call(self, opts); self.signTransaction = function (txData, cb) { // defaults if (txData.gas !== undefined) txData.gasLimit = txData.gas; txData.value = txData.value || '0x00'; txData.data = ethUtil.addHexPrefix(txData.data); opts.getPrivateKey(txData.from, function (err, privateKey) { if (err) return cb(err); var rawTx = TransactionFactory.fromTxData(txData); var signedTx = rawTx.sign(privateKey); cb(null, '0x' + signedTx.serialize().toString('hex')); }); }; self.signMessage = function (msgParams, cb) { opts.getPrivateKey(msgParams.from, function (err, privateKey) { if (err) return cb(err); var data = typeof msgParams.data === 'string' && !ethUtil.isHexString(msgParams.data) ? Buffer.from(msgParams.data) : msgParams.data; var dataBuff = ethUtil.toBuffer(data); var msgHash = ethUtil.hashPersonalMessage(dataBuff); var sig = ethUtil.ecsign(msgHash, privateKey); var serialized = ethUtil.bufferToHex(concatSig(sig.v, sig.r, sig.s)); cb(null, serialized); }); }; self.signPersonalMessage = function (msgParams, cb) { opts.getPrivateKey(msgParams.from, function (err, privateKey) { if (err) return cb(err); var serialized = sigUtil.personalSign({ privateKey: privateKey, data: msgParams.data }); cb(null, serialized); }); }; self.signTypedMessage = function (msgParams, cb) { opts.getPrivateKey(msgParams.from, function (err, privateKey) { if (err) return cb(err); var serialized = sigUtil.signTypedData({ privateKey: privateKey, version: msgParams.version || 'V1', data: msgParams.data }); cb(null, serialized); }); }; } function concatSig(v, r, s) { r = ethUtil.fromSigned(r); s = ethUtil.fromSigned(s); v = ethUtil.bufferToInt(v); r = ethUtil.toUnsigned(r).toString('hex').padStart(64, 0); s = ethUtil.toUnsigned(s).toString('hex').padStart(64, 0); v = ethUtil.stripHexPrefix(ethUtil.intToHex(v)); return ethUtil.addHexPrefix(r.concat(s, v).toString("hex")); }