From 00d4a4b9791708dad0bc58c0785542844eb35ad9 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 14 Apr 2014 18:30:08 -0300 Subject: [PATCH] adding wallet factory --- js/models/core/PublicKeyRing.js | 8 --- js/models/core/Wallet.js | 98 +++++++++++++++++++++++++-------- js/models/core/WalletFactory.js | 47 ++++++++++++++++ js/services/storage.js | 58 ++++--------------- test/test.wallet.js | 50 ++++++++++++----- 5 files changed, 168 insertions(+), 93 deletions(-) create mode 100644 js/models/core/WalletFactory.js diff --git a/js/models/core/PublicKeyRing.js b/js/models/core/PublicKeyRing.js index 4341634f0..56b0ec6cb 100644 --- a/js/models/core/PublicKeyRing.js +++ b/js/models/core/PublicKeyRing.js @@ -9,7 +9,6 @@ var Address = bitcore.Address; var Script = bitcore.Script; var coinUtil = bitcore.util; var Transaction = bitcore.Transaction; -var buffertools = bitcore.buffertools; var Storage = imports.Storage || require('../storage/Base.js'); var storage = Storage.default(); @@ -24,8 +23,6 @@ function PublicKeyRing(opts) { this.requiredCopayers = opts.requiredCopayers || 3; this.totalCopayers = opts.totalCopayers || 5; - this.id = opts.id || PublicKeyRing.getRandomId(); - this.copayersBIP32 = []; this.changeAddressIndex=0; @@ -49,11 +46,6 @@ PublicKeyRing.ChangeBranch = function (index) { return 'm/1/'+index; }; -PublicKeyRing.getRandomId = function () { - var r = buffertools.toHex(coinUtil.generateNonce()); - return r; -}; - PublicKeyRing.decrypt = function (passphrase, encPayload) { console.log('[wallet.js.35] TODO READ: passphrase IGNORED'); return encPayload; diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 3bffa5d99..cc5c09021 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -1,13 +1,15 @@ 'use strict'; -var imports = require('soop').imports(); +var imports = require('soop').imports(); -var bitcore = require('bitcore'); -var http = require('http'); +var bitcore = require('bitcore'); +var coinUtil = bitcore.util; +var buffertools = bitcore.buffertools; +var http = require('http'); -var Storage = imports.Storage; -var Network = imports.Network; -var Blockchain = imports.Blockchain; +var Storage = imports.Storage; +var Network = imports.Network; +var Blockchain = imports.Blockchain; var copay = copay || require('../../../copay'); @@ -18,31 +20,33 @@ function Wallet(config) { Wallet.prototype._startInterface = function(config) { - this.storage = new Storage(config.storage); - this.network = new Network(config.network); + this.storage = new Storage(config.storage); + this.network = new Network(config.network); this.blockchain = new Blockchain(config.blockchain); }; - + Wallet.prototype._createNew = function(config, opts) { - console.log('### CREATING NEW WALLET.' - + (opts.walletId ? ' USING ID: ' +opts.walletId : ' NEW ID') ); + this.id = opts.id || Wallet.getRandomId(); + console.log('### CREATING NEW WALLET.' + (opts.id ? ' USING ID: ' + opts.id : ' NEW ID')); - this.privateKey = new copay.PrivateKey({networkName: config.networkName}); + this.privateKey = new copay.PrivateKey({ + networkName: config.networkName + }); console.log('\t### PrivateKey Initialized'); this.publicKeyRing = opts.publicKeyRing || new copay.PublicKeyRing({ - id: opts.walletId, + id: this.id, requiredCopayers: opts.requiredCopayers || config.wallet.requiredCopayers, - totalCopayers: opts.totalCopayers || config.wallet.totalCopayers, + totalCopayers: opts.totalCopayers || config.wallet.totalCopayers, networkName: config.networkName, }); this.publicKeyRing.addCopayer(this.privateKey.getBIP32().extendedPublicKeyString()); - console.log('\t### PublicKeyRing Initialized WalletID: ' + this.publicKeyRing.id); + console.log('\t### PublicKeyRing Initialized WalletID: ' + this.publicKeyRing.id); this.txProposals = opts.txProposals || new copay.TxProposals({ - walletId: this.publicKeyRing.id, + walletId: this.id, publicKeyRing: this.publicKeyRing, networkName: config.networkName, }); @@ -51,14 +55,14 @@ Wallet.prototype._createNew = function(config, opts) { Wallet.prototype._load = function(config, walletId) { - this.id = walletId; - this.publicKeyRing = new copay.PublicKeyRing.fromObj( + this.id = walletId; + this.publicKeyRing = new copay.PublicKeyRing.fromObj( this.storage.get(this.id, 'publicKeyRing') ); - this.txProposals = new copay.TxProposals.fromObj( + this.txProposals = new copay.TxProposals.fromObj( this.storage.get(this.id, 'txProposals') ); - this.privateKey = new copay.PrivateKey.fromObj( + this.privateKey = new copay.PrivateKey.fromObj( this.storage.get(this.id, 'privateKey') ); //TODO secure @@ -76,7 +80,7 @@ Wallet.prototype._load = function(config, walletId) { // CONSTRUCTORS Wallet.read = function(config, walletId) { var w = new Wallet(config); - w.load(walletId); + w._load(walletId); return w; }; @@ -87,8 +91,56 @@ Wallet.create = function(config, opts) { return w; }; - +Wallet.getRandomId = function() { + var r = buffertools.toHex(coinUtil.generateNonce()); + return r; +}; + +Wallet.prototype.store = function() { + // TODO store each variable +}; + +var WalletFactory = function() { + this.storage = Storage. + default (); +}; + +WalletFactory.prototype.create = function(config, opts) { + var w = new Wallet.create(config, opts); + w.store(); + this._addWalletId(w.id); + return w; +}; + +WalletFactory.prototype.get = function(config, walletId) { + return Wallet.read(config, walletId); +}; + +WalletFactory.prototype.remove = function(walletId) { + // TODO remove wallet contents, not only the id (Wallet.remove?) + this._delWalletId(walletId); +}; + +WalletFactory.prototype._addWalletId = function(walletId) { + var ids = this._getWalletIds(); + if (ids.indexOf(walletId) == -1) return; + storage.set('walletIds', (ids ? ids + ',' : '') + walletId); +}; + +WalletFactory.prototype._delWalletId = function(walletId) { + var ids = this._getWalletIds(); + var index = ids.indexOf(walletId); + if (index == -1) return; + ids.splice(index, 1); // removes walletId + this.storage.set('walletIds', ids.join(',')); +}; + +WalletFactory.prototype._getWalletIds = function() { + var ids = this.storage.get('walletIds'); + return ids ? ids.split(',') : []; +}; + +Wallet.factory = new WalletFactory(); module.exports = require('soop')(Wallet); - diff --git a/js/models/core/WalletFactory.js b/js/models/core/WalletFactory.js new file mode 100644 index 000000000..7aace1ca8 --- /dev/null +++ b/js/models/core/WalletFactory.js @@ -0,0 +1,47 @@ +'use strict'; + +var imports = require('soop').imports(); + +function Wallet(opts) { + opts = opts || {}; + this.host = 'localhost'; + this.port = '3001'; +} + +WalletFactory = function() { + this.storage = copay.Storage.default(); +}; + +WalletFactory.prototype.create = function(config, opts) { + var w = new Wallet(config, opts); + w.store(); + this._addWalletId(w.id); +}; + +WalletFactory.prototype.get = function(walletId) { + return Wallet.read(walletId); +}; + +WalletFactory.prototype.remove = function(walletId) { + // TODO remove wallet contents, not only the id (Wallet.remove?) + this._delWalletId(walletId); +}; + +WalletFactory.prototype._addWalletId = function(walletId) { + var ids = this._getWalletIds(); + if (ids.indexOf(walletId) == -1) return; + localStorage.setItem('walletIds', (ids ? ids + ',' : '') + walletId); +}; + +WalletFactory.prototype._delWalletId = function(walletId) { + var ids = this._getWalletIds(); + var index = ids.indexOf(walletId); + if (index == -1) return; + ids.splice(index, 1); // removes walletId + this.storage.set('walletIds', ids.join(',')); +}; + +WalletFactory.prototype._getWalletIds = function() { + var ids = this.storage.get('walletIds'); + return ids ? ids.split(',') : []; +}; diff --git a/js/services/storage.js b/js/services/storage.js index a80d74a2d..489710a5d 100644 --- a/js/services/storage.js +++ b/js/services/storage.js @@ -3,69 +3,31 @@ angular.module('copay.storage') .factory('Storage', function($rootScope) { - - var _key = function(walletId, key) { - return walletId + '::' + key; - }; - - var _pushKey = function(walletId, key) { - var keys = localStorage.getItem(walletId); - localStorage.setItem(walletId, (keys?keys+',':'') +key); - }; - - return { - getGlobal: function( key) { - return JSON.parse(localStorage.getItem(key)); + return { + getGlobal: function(key) { + return JSON.parse(localStorage.getItem(key)); }, - setGlobal: function( key, data) { - localStorage.setItem(key, JSON.stringify(data)); + setGlobal: function(key, data) { + localStorage.setItem(key, JSON.stringify(data)); }, get: function(walletId, key) { if (!walletId) return; - return JSON.parse(localStorage.getItem(_key(walletId,key))); + return JSON.parse(localStorage.getItem(_key(walletId, key))); }, set: function(walletId, key, data) { if (!walletId) return; - var k = _key(walletId,key); + var k = _key(walletId, key); localStorage.setItem(k, JSON.stringify(data)); _pushKey(walletId, k); }, remove: function(walletId, key) { - localStorage.removeItem(_key(walletId,key)); + localStorage.removeItem(_key(walletId, key)); }, - clearAll: function(walletId){ + clearAll: function(walletId) { var keys = localStorage.getItem(walletId); - keys.split(',').forEach(function(k){ + keys.split(',').forEach(function(k) { localStorage.removeItem(key); }); }, - addWalletId: function(walletId) { - var ids = localStorage.getItem('walletIds'); - if (ids) { - var list = ids.split(','); - var l = list.length; - for(var i=0; i