aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Finlay <dan@danfinlay.com>2016-03-26 03:41:18 +0800
committerDan Finlay <dan@danfinlay.com>2016-03-26 03:41:18 +0800
commit37fd45e5b70a66ff976cab0d1815374063e29d10 (patch)
tree563e18f391806e1c7ef956eabcdef101cc211ec4
parentda31f4daed76a3457df12f94bbf2974621b70a0c (diff)
downloadtangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar.gz
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar.bz2
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar.lz
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar.xz
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.tar.zst
tangerine-wallet-browser-37fd45e5b70a66ff976cab0d1815374063e29d10.zip
Convert to bip44 hdTrees
Added initial test just to verify we can recover the accounts we generate in this way. Still need to add compliance test to make sure this interoperates with testrpc's new mnemonic flag.
-rw-r--r--app/scripts/lib/idStore.js30
-rw-r--r--package.json7
-rw-r--r--test/index.js57
3 files changed, 70 insertions, 24 deletions
diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js
index c4547b07f..1a3e7e06f 100644
--- a/app/scripts/lib/idStore.js
+++ b/app/scripts/lib/idStore.js
@@ -1,6 +1,7 @@
const EventEmitter = require('events').EventEmitter
const inherits = require('util').inherits
const Transaction = require('ethereumjs-tx')
+const Lightwallet = require('eth-lightwallet')
const LightwalletKeyStore = require('eth-lightwallet').keystore
const LightwalletSigner = require('eth-lightwallet').signing
const async = require('async')
@@ -14,23 +15,24 @@ module.exports = IdentityStore
inherits(IdentityStore, EventEmitter)
function IdentityStore(ethStore) {
- const self = this
- EventEmitter.call(self)
+ EventEmitter.call(this)
// we just use the ethStore to auto-add accounts
- self._ethStore = ethStore
+ this._ethStore = ethStore
// lightwallet key store
- self._keyStore = null
+ this._keyStore = null
// lightwallet wrapper
- self._idmgmt = null
+ this._idmgmt = null
+
+ this.hdPathString = "m/44'/60'/0'/0"
- self._currentState = {
+ this._currentState = {
selectedAddress: null,
identities: {},
unconfTxs: {},
}
// not part of serilized metamask state - only kept in memory
- self._unconfTxCbs = {}
+ this._unconfTxCbs = {}
}
//
@@ -122,7 +124,6 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){
status: 'unconfirmed',
}
self._currentState.unconfTxs[txId] = txData
- console.log('addUnconfirmedTransaction:', txData)
// keep the cb around for after approval (requires user interaction)
self._unconfTxCbs[txId] = cb
@@ -201,7 +202,7 @@ IdentityStore.prototype._loadIdentities = function(){
const self = this
if (!self._isUnlocked()) throw new Error('not unlocked')
// get addresses and normalize address hexString
- var addresses = self._keyStore.getAddresses().map(function(address){ return '0x'+address })
+ var addresses = self._keyStore.getAddresses(this.hdPathString).map(function(address){ return '0x'+address })
addresses.forEach(function(address){
// // add to ethStore
self._ethStore.addAccount(address)
@@ -257,7 +258,7 @@ IdentityStore.prototype._createIdmgmt = function(password, seed, entropy, cb){
IdentityStore.prototype._restoreFromSeed = function(keyStore, seed, derivedKey) {
keyStore = new LightwalletKeyStore(seed, derivedKey)
- keyStore.generateNewAddress(derivedKey, 3)
+ keyStore.generateNewAddress(derivedKey, 3, hdPathString)
window.localStorage['lightwallet'] = keyStore.serialize()
console.log('restored from seed. saved to keystore localStorage')
}
@@ -268,19 +269,20 @@ IdentityStore.prototype._loadFromLocalStorage = function(serializedKeystore, der
IdentityStore.prototype._createFirstWallet = function(entropy, derivedKey) {
var secretSeed = LightwalletKeyStore.generateRandomSeed(entropy)
- var keyStore = new LightwalletKeyStore(secretSeed, derivedKey)
- keyStore.generateNewAddress(derivedKey, 3)
+ var keyStore = new LightwalletKeyStore(secretSeed, derivedKey, this.hdPathString)
+ keyStore.generateNewAddress(derivedKey, 3, this.hdPathString)
window.localStorage['lightwallet'] = keyStore.serialize()
console.log('saved to keystore localStorage')
return keyStore
}
-function IdManagement( opts = { keyStore: null, derivedKey: null } ) {
+function IdManagement( opts = { keyStore: null, derivedKey: null, hdPathString: null } ) {
this.keyStore = opts.keyStore
this.derivedKey = opts.derivedKey
+ this.hdPathString = opts.hdPathString
this.getAddresses = function(){
- return keyStore.getAddresses().map(function(address){ return '0x'+address })
+ return keyStore.getAddresses(this.hdPathString).map(function(address){ return '0x'+address })
}
this.signTx = function(txParams){
diff --git a/package.json b/package.json
index fec837640..da7686c0a 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
"private": true,
"scripts": {
"start": "gulp dev",
- "test": "mocha --compilers js:babel-register"
+ "test": "mocha --compilers js:babel-register",
+ "watch": "mocha watch --compilers js:babel-register"
},
"dependencies": {
"async": "^1.5.2",
- "bip39": "^2.2.0",
"clone": "^1.0.2",
"dnode": "^1.2.2",
"end-of-stream": "^1.1.0",
@@ -39,8 +39,11 @@
"gulp-sourcemaps": "^1.6.0",
"gulp-util": "^3.0.7",
"gulp-watch": "^4.3.5",
+ "jsdom": "^8.1.0",
"jshint-stylish": "~0.1.5",
"lodash.assign": "^4.0.6",
+ "mocha": "^2.4.5",
+ "mocha-jsdom": "^1.1.0",
"tape": "^4.5.1",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0",
diff --git a/test/index.js b/test/index.js
index 1ff7b673a..5a8df78b8 100644
--- a/test/index.js
+++ b/test/index.js
@@ -1,11 +1,52 @@
-var assert = require('assert');
-var idStore = require('../app/scripts/lib/idStore')
+var assert = require('assert')
+var IdentityStore = require('../app/scripts/lib/idStore')
+var jsdom = require('mocha-jsdom')
+jsdom()
describe('IdentityStore', function() {
- describe('#_createFirstWallet', function () {
- it('should return the expected keystore', function () {
- assert.equal(1,1)
- });
- });
-});
+ describe('#createNewVault', function () {
+ let idStore
+ let password = 'password123'
+ let entropy = 'entripppppyy duuude'
+ let seedWords
+ let accounts = []
+ let originalKeystore
+
+ before(function(done) {
+ window.localStorage = {} // Hacking localStorage support into JSDom
+
+ idStore = new IdentityStore({
+ addAccount(acct) { accounts.push(acct) },
+ })
+
+ idStore.createNewVault(password, entropy, (err, seeds) => {
+ seedWords = seeds
+ originalKeystore = idStore._idmgmt.keyStore
+ done()
+ })
+ })
+
+ describe('#recoverFromSeed', function() {
+
+ before(function() {
+ window.localStorage = {} // Hacking localStorage support into JSDom
+ accounts = []
+
+ idStore = new IdentityStore({
+ addAccount(acct) { accounts.push(acct) },
+ })
+ })
+
+ it('should return the expected keystore', function () {
+
+ idStore.recoverFromSeed(password, seedWords, (err) => {
+ assert.ifError(err)
+
+ let newKeystore = idStore._idmgmt.keyStore
+ assert.equal(newKeystore, originalKeystore)
+ })
+ })
+ })
+ })
+})