This commit is contained in:
parent
d03a16d659
commit
c64eccb1e2
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
|
|
||||||
|
var Copayer = require('./copayer');
|
||||||
|
|
||||||
function Wallet(opts) {
|
function Wallet(opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
|
@ -13,6 +15,7 @@ function Wallet(opts) {
|
||||||
this.status = 'pending';
|
this.status = 'pending';
|
||||||
this.publicKeyRing = [];
|
this.publicKeyRing = [];
|
||||||
this.addressIndex = 0;
|
this.addressIndex = 0;
|
||||||
|
this.copayers = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
Wallet.fromObj = function (obj) {
|
Wallet.fromObj = function (obj) {
|
||||||
|
@ -26,7 +29,24 @@ Wallet.fromObj = function (obj) {
|
||||||
x.status = obj.status;
|
x.status = obj.status;
|
||||||
x.publicKeyRing = obj.publicKeyRing;
|
x.publicKeyRing = obj.publicKeyRing;
|
||||||
x.addressIndex = obj.addressIndex;
|
x.addressIndex = obj.addressIndex;
|
||||||
|
x.copayers = _.map(obj.copayers, function (copayer) {
|
||||||
|
return new Copayer(copayer);
|
||||||
|
});
|
||||||
|
|
||||||
return x;
|
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;
|
module.exports = Wallet;
|
||||||
|
|
|
@ -62,7 +62,6 @@ CopayServer.prototype.createWallet = function (opts, cb) {
|
||||||
* Retrieves a wallet from storage.
|
* Retrieves a wallet from storage.
|
||||||
* @param {Object} opts
|
* @param {Object} opts
|
||||||
* @param {string} opts.id - The wallet id.
|
* @param {string} opts.id - The wallet id.
|
||||||
* @param {truthy} opts.includeCopayers - Fetch wallet along with list of copayers.
|
|
||||||
* @returns {Object} wallet
|
* @returns {Object} wallet
|
||||||
*/
|
*/
|
||||||
CopayServer.prototype.getWallet = function (opts, cb) {
|
CopayServer.prototype.getWallet = function (opts, cb) {
|
||||||
|
@ -72,15 +71,7 @@ CopayServer.prototype.createWallet = function (opts, cb) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
if (!wallet) return cb('Wallet not found');
|
if (!wallet) return cb('Wallet not found');
|
||||||
|
|
||||||
if (opts.includeCopayers) {
|
return cb(null, wallet);
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -110,7 +101,7 @@ CopayServer.prototype._runLocked = function (walletId, cb, task) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self._runLocked(opts.walletId, cb, function (cb) {
|
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 (err || !wallet) return cb(err);
|
||||||
if (_.find(wallet.copayers, { xPubKey: opts.xPubKey })) return cb('Copayer already in wallet');
|
if (_.find(wallet.copayers, { xPubKey: opts.xPubKey })) return cb('Copayer already in wallet');
|
||||||
if (wallet.copayers.length == wallet.n) return cb('Wallet full');
|
if (wallet.copayers.length == wallet.n) return cb('Wallet full');
|
||||||
|
@ -124,14 +115,12 @@ CopayServer.prototype._runLocked = function (walletId, cb, task) {
|
||||||
xPubKeySignature: opts.xPubKeySignature,
|
xPubKeySignature: opts.xPubKeySignature,
|
||||||
});
|
});
|
||||||
|
|
||||||
self.storage.storeCopayer(wallet.id, copayer, function (err) {
|
wallet.addCopayer(copayer);
|
||||||
if (err) return cb(err);
|
|
||||||
if ((wallet.copayers.length + 1) < wallet.n) return cb();
|
|
||||||
|
|
||||||
wallet.status = 'complete';
|
self.storage.storeWallet(wallet, function (err) {
|
||||||
wallet.publicKeyRing = _.pluck(wallet.copayers, 'xPubKey');
|
if (err) return cb(err);
|
||||||
wallet.publicKeyRing.push(copayer.xPubKey);
|
|
||||||
self.storage.storeWallet(wallet, cb);
|
return cb();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -182,8 +171,10 @@ CopayServer.prototype._doCreateAddress = function (pkr, index, isChange) {
|
||||||
CopayServer.prototype.verifyMessageSignature = function (opts, cb) {
|
CopayServer.prototype.verifyMessageSignature = function (opts, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self.storage.fetchCopayer(opts.walletId, opts.copayerId, function (err, copayer) {
|
self.getWallet({ id: opts.walletId }, function (err, wallet) {
|
||||||
if (err) return cb(err);
|
if (err || !wallet) return cb(err);
|
||||||
|
|
||||||
|
var copayer = wallet.getCopayer(opts.copayerId);
|
||||||
if (!copayer) return cb('Copayer not found');
|
if (!copayer) return cb('Copayer not found');
|
||||||
|
|
||||||
var isValid = self._doVerifyMessageSignature(copayer.xPubKey, opts.message, opts.signature);
|
var isValid = self._doVerifyMessageSignature(copayer.xPubKey, opts.message, opts.signature);
|
||||||
|
|
|
@ -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) {
|
Storage.prototype.fetchTx = function (walletId, txProposalId, cb) {
|
||||||
this.db.get('wallet-' + walletId + '-tx-' + txProposalId, function (err, data) {
|
this.db.get('wallet-' + walletId + '-tx-' + txProposalId, function (err, data) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -67,10 +41,6 @@ Storage.prototype.storeWallet = function (wallet, cb) {
|
||||||
this.db.put('wallet-' + wallet.id, 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) {
|
Storage.prototype.storeAddress = function (walletId, address, cb) {
|
||||||
this.db.put('wallet-' + walletId + '-address-' + address.address, address, cb);
|
this.db.put('wallet-' + walletId + '-address-' + address.address, address, cb);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue