aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/keyrings/hd.js
diff options
context:
space:
mode:
authorDan Finlay <dan@danfinlay.com>2017-02-22 06:25:47 +0800
committerDan Finlay <dan@danfinlay.com>2017-02-22 06:25:47 +0800
commit0584988688a471698e9b3ad05cb0597f0270ea9e (patch)
treebdcbb009636dcdea67abcc28238023dd8bf7e882 /app/scripts/keyrings/hd.js
parent29f07238f443007a03c968349af4d3fca7e10522 (diff)
downloadtangerine-wallet-browser-0584988688a471698e9b3ad05cb0597f0270ea9e.tar.gz
tangerine-wallet-browser-0584988688a471698e9b3ad05cb0597f0270ea9e.tar.zst
tangerine-wallet-browser-0584988688a471698e9b3ad05cb0597f0270ea9e.zip
Move sigUtil and keyrings to external modules
These external modules now have their own test coverage and build enforcement. This allowed me to somewhat more easily add good tests around our personalSign strategy (held now in [eth-sig-util](https://github.com/flyswatter/eth-sig-util), and allow each of the keyrings to import that, etc.
Diffstat (limited to 'app/scripts/keyrings/hd.js')
-rw-r--r--app/scripts/keyrings/hd.js125
1 files changed, 0 insertions, 125 deletions
diff --git a/app/scripts/keyrings/hd.js b/app/scripts/keyrings/hd.js
deleted file mode 100644
index 3a66f7868..000000000
--- a/app/scripts/keyrings/hd.js
+++ /dev/null
@@ -1,125 +0,0 @@
-const EventEmitter = require('events').EventEmitter
-const hdkey = require('ethereumjs-wallet/hdkey')
-const bip39 = require('bip39')
-const ethUtil = require('ethereumjs-util')
-
-// *Internal Deps
-const sigUtil = require('../lib/sig-util')
-
-// Options:
-const hdPathString = `m/44'/60'/0'/0`
-const type = 'HD Key Tree'
-
-class HdKeyring extends EventEmitter {
-
- /* PUBLIC METHODS */
-
- constructor (opts = {}) {
- super()
- this.type = type
- this.deserialize(opts)
- }
-
- serialize () {
- return Promise.resolve({
- mnemonic: this.mnemonic,
- numberOfAccounts: this.wallets.length,
- })
- }
-
- deserialize (opts = {}) {
- this.opts = opts || {}
- this.wallets = []
- this.mnemonic = null
- this.root = null
-
- if (opts.mnemonic) {
- this._initFromMnemonic(opts.mnemonic)
- }
-
- if (opts.numberOfAccounts) {
- return this.addAccounts(opts.numberOfAccounts)
- }
-
- return Promise.resolve([])
- }
-
- addAccounts (numberOfAccounts = 1) {
- if (!this.root) {
- this._initFromMnemonic(bip39.generateMnemonic())
- }
-
- const oldLen = this.wallets.length
- const newWallets = []
- for (let i = oldLen; i < numberOfAccounts + oldLen; i++) {
- const child = this.root.deriveChild(i)
- const wallet = child.getWallet()
- newWallets.push(wallet)
- this.wallets.push(wallet)
- }
- const hexWallets = newWallets.map(w => w.getAddress().toString('hex'))
- return Promise.resolve(hexWallets)
- }
-
- getAccounts () {
- return Promise.resolve(this.wallets.map(w => w.getAddress().toString('hex')))
- }
-
- // tx is an instance of the ethereumjs-transaction class.
- signTransaction (address, tx) {
- const wallet = this._getWalletForAccount(address)
- var privKey = wallet.getPrivateKey()
- tx.sign(privKey)
- return Promise.resolve(tx)
- }
-
- // For eth_sign, we need to sign transactions:
- // hd
- signMessage (withAccount, data) {
- const wallet = this._getWalletForAccount(withAccount)
- const message = ethUtil.stripHexPrefix(data)
- var privKey = wallet.getPrivateKey()
- var msgSig = ethUtil.ecsign(new Buffer(message, 'hex'), privKey)
- var rawMsgSig = ethUtil.bufferToHex(sigUtil.concatSig(msgSig.v, msgSig.r, msgSig.s))
- return Promise.resolve(rawMsgSig)
- }
-
- // For eth_sign, we need to sign transactions:
- newGethSignMessage (withAccount, msgHex) {
- const wallet = this._getWalletForAccount(withAccount)
- const privKey = wallet.getPrivateKey()
- const msgBuffer = ethUtil.toBuffer(msgHex)
- const msgHash = ethUtil.hashPersonalMessage(msgBuffer)
- const msgSig = ethUtil.ecsign(msgHash, privKey)
- const rawMsgSig = ethUtil.bufferToHex(sigUtil.concatSig(msgSig.v, msgSig.r, msgSig.s))
- return Promise.resolve(rawMsgSig)
- }
-
- exportAccount (address) {
- const wallet = this._getWalletForAccount(address)
- return Promise.resolve(wallet.getPrivateKey().toString('hex'))
- }
-
-
- /* PRIVATE METHODS */
-
- _initFromMnemonic (mnemonic) {
- this.mnemonic = mnemonic
- const seed = bip39.mnemonicToSeed(mnemonic)
- this.hdWallet = hdkey.fromMasterSeed(seed)
- this.root = this.hdWallet.derivePath(hdPathString)
- }
-
-
- _getWalletForAccount (account) {
- const targetAddress = sigUtil.normalize(account)
- return this.wallets.find((w) => {
- const address = w.getAddress().toString('hex')
- return ((address === targetAddress) ||
- (sigUtil.normalize(address) === targetAddress))
- })
- }
-}
-
-HdKeyring.type = type
-module.exports = HdKeyring