diff options
author | Dan Finlay <dan@danfinlay.com> | 2016-10-28 07:50:01 +0800 |
---|---|---|
committer | Dan Finlay <dan@danfinlay.com> | 2016-10-28 07:59:46 +0800 |
commit | f02e02bef845fb4b55dfa315c29da1e0afe9e68c (patch) | |
tree | 9f6455cd79c19873933f1a59e86f67a6b2c4abfa | |
parent | ed3814bff8cf42218fe5a9f068b0474cac73807d (diff) | |
download | tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar.gz tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar.bz2 tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar.lz tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar.xz tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.tar.zst tangerine-wallet-browser-f02e02bef845fb4b55dfa315c29da1e0afe9e68c.zip |
Add hd wallet keyring
-rw-r--r-- | app/scripts/keyrings/hd.js | 78 | ||||
-rw-r--r-- | package.json | 1 |
2 files changed, 79 insertions, 0 deletions
diff --git a/app/scripts/keyrings/hd.js b/app/scripts/keyrings/hd.js new file mode 100644 index 000000000..a852c9d29 --- /dev/null +++ b/app/scripts/keyrings/hd.js @@ -0,0 +1,78 @@ +const EventEmitter = require('events').EventEmitter +const hdkey = require('ethereumjs-wallet/hdkey') +const bip39 = require('bip39') +const ethUtil = require('ethereumjs-util') +const type = 'HD Key Tree' +const sigUtil = require('../lib/sig-util') + +module.exports = class SimpleKeyring extends EventEmitter { + + static type() { + return type + } + + constructor(opts) { + super() + this.type = type + this.opts = opts || {} + this.wallets = [] + this.mnemonic = null + } + + deserialize({ mnemonic, n }) { + this.initFromMnemonic(mnemonic || bip39.generateMnemonic()) + this.addAccounts(n) + } + + initFromMnemonic(mnemonic) { + const seed = bip39.mnemonicToSeed(mnemonic) + this.mnemonic = mnemonic + this.hdWallet = hdkey.fromMasterSeed(seed) + this.seed = bip39.mnemonicToSeedHex(seed) + } + + serialize() { + return { + mnemonic: this.mnemonic, + n: this.wallets.length, + } + } + + addAccounts(n = 1) { + const newWallets = [] + for (let i = 0; i < n; i++) { + const wallet = this.hdWallet.getWallet() + newWallets.push(wallet) + this.wallets.push(wallet) + } + return newWallets.map(w => w.getAddress().toString('hex')) + } + + getAccounts() { + return 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 tx + } + + // For eth_sign, we need to sign transactions: + signMessage(withAccount, data) { + const wallet = this.getWalletForAccount(withAccount) + const message = ethUtil.removeHexPrefix(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 rawMsgSig + } + + getWalletForAccount(account) { + return this.wallets.find(w => w.getAddress().toString('hex') === account) + } + +} + diff --git a/package.json b/package.json index 7309e8b81..ab8dae526 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "async": "^1.5.2", + "bip39": "^2.2.0", "browserify-derequire": "^0.9.4", "clone": "^1.0.2", "copy-to-clipboard": "^2.0.0", |