This commit is contained in:
Ivan Socolsky 2015-01-28 14:21:09 -03:00
parent d03a16d659
commit c64eccb1e2
3 changed files with 31 additions and 50 deletions

View File

@ -2,6 +2,8 @@
var _ = require('lodash');
var Copayer = require('./copayer');
function Wallet(opts) {
opts = opts || {};
@ -13,6 +15,7 @@ function Wallet(opts) {
this.status = 'pending';
this.publicKeyRing = [];
this.addressIndex = 0;
this.copayers = [];
};
Wallet.fromObj = function (obj) {
@ -26,7 +29,24 @@ Wallet.fromObj = function (obj) {
x.status = obj.status;
x.publicKeyRing = obj.publicKeyRing;
x.addressIndex = obj.addressIndex;
x.copayers = _.map(obj.copayers, function (copayer) {
return new Copayer(copayer);
});
return x;
};
Wallet.prototype.addCopayer = function (copayer) {
this.copayers.push(copayer);
if (this.copayers.length < this.n) return;
this.status = 'complete';
this.publicKeyRing = _.pluck(this.copayers, 'xPubKey');
};
Wallet.prototype.getCopayer = function (copayerId) {
return _.find(this.copayers, { id: copayerId });
};
module.exports = Wallet;

View File

@ -62,7 +62,6 @@ CopayServer.prototype.createWallet = function (opts, cb) {
* Retrieves a wallet from storage.
* @param {Object} opts
* @param {string} opts.id - The wallet id.
* @param {truthy} opts.includeCopayers - Fetch wallet along with list of copayers.
* @returns {Object} wallet
*/
CopayServer.prototype.getWallet = function (opts, cb) {
@ -72,15 +71,7 @@ CopayServer.prototype.createWallet = function (opts, cb) {
if (err) return cb(err);
if (!wallet) return cb('Wallet not found');
if (opts.includeCopayers) {
self.storage.fetchCopayers(wallet.id, function (err, copayers) {
if (err) return cb(err);
wallet.copayers = copayers || [];
return cb(null, wallet);
});
} else {
return cb(null, wallet);
}
return cb(null, wallet);
});
};
@ -110,7 +101,7 @@ CopayServer.prototype._runLocked = function (walletId, cb, task) {
var self = this;
self._runLocked(opts.walletId, cb, function (cb) {
self.getWallet({ id: opts.walletId, includeCopayers: true }, function (err, wallet) {
self.getWallet({ id: opts.walletId }, function (err, wallet) {
if (err || !wallet) return cb(err);
if (_.find(wallet.copayers, { xPubKey: opts.xPubKey })) return cb('Copayer already in wallet');
if (wallet.copayers.length == wallet.n) return cb('Wallet full');
@ -124,14 +115,12 @@ CopayServer.prototype._runLocked = function (walletId, cb, task) {
xPubKeySignature: opts.xPubKeySignature,
});
self.storage.storeCopayer(wallet.id, copayer, function (err) {
if (err) return cb(err);
if ((wallet.copayers.length + 1) < wallet.n) return cb();
wallet.addCopayer(copayer);
wallet.status = 'complete';
wallet.publicKeyRing = _.pluck(wallet.copayers, 'xPubKey');
wallet.publicKeyRing.push(copayer.xPubKey);
self.storage.storeWallet(wallet, cb);
self.storage.storeWallet(wallet, function (err) {
if (err) return cb(err);
return cb();
});
});
});
@ -182,8 +171,10 @@ CopayServer.prototype._doCreateAddress = function (pkr, index, isChange) {
CopayServer.prototype.verifyMessageSignature = function (opts, cb) {
var self = this;
self.storage.fetchCopayer(opts.walletId, opts.copayerId, function (err, copayer) {
if (err) return cb(err);
self.getWallet({ id: opts.walletId }, function (err, wallet) {
if (err || !wallet) return cb(err);
var copayer = wallet.getCopayer(opts.copayerId);
if (!copayer) return cb('Copayer not found');
var isValid = self._doVerifyMessageSignature(copayer.xPubKey, opts.message, opts.signature);

View File

@ -27,32 +27,6 @@ Storage.prototype.fetchWallet = function (id, cb) {
});
};
Storage.prototype.fetchCopayer = function (walletId, copayerId, cb) {
this.db.get('wallet-' + walletId + '-copayer-' + copayerId, function (err, data) {
if (err) {
if (err.notFound) return cb();
return cb(err);
}
return cb(null, Copayer.fromObj(data));
});
};
Storage.prototype.fetchCopayers = function (walletId, cb) {
var copayers = [];
var key = 'wallet-' + walletId + '-copayer-';
this.db.createReadStream({ gte: key, lt: key + '~' })
.on('data', function (data) {
copayers.push(Copayer.fromObj(data.value));
})
.on('error', function (err) {
if (err.notFound) return cb();
return cb(err);
})
.on('end', function () {
return cb(null, copayers);
});
};
Storage.prototype.fetchTx = function (walletId, txProposalId, cb) {
this.db.get('wallet-' + walletId + '-tx-' + txProposalId, function (err, data) {
if (err) {
@ -67,10 +41,6 @@ Storage.prototype.storeWallet = function (wallet, cb) {
this.db.put('wallet-' + wallet.id, wallet, cb);
};
Storage.prototype.storeCopayer = function (walletId, copayer, cb) {
this.db.put('wallet-' + walletId + '-copayer-' + copayer.id, copayer, cb);
};
Storage.prototype.storeAddress = function (walletId, address, cb) {
this.db.put('wallet-' + walletId + '-address-' + address.address, address, cb);
};