This commit is contained in:
Ivan Socolsky 2015-01-28 10:52:45 -03:00
parent 635b2d8343
commit 2bf9c4da48
2 changed files with 26 additions and 20 deletions

View File

@ -19,10 +19,12 @@ var TxProposal = require('./model/txproposal');
/**
* Creates an instance of the Copay server.
* @constructor
* @param {Object} opts
* @param {Storage} [opts.storage] - The storage provider.
*/
function CopayServer(opts) {
opts = opts || {};
this.storage = new Storage(opts);
this.storage = opts.storage || new Storage();
};
@ -81,7 +83,7 @@ CopayServer.prototype.createWallet = function (opts, cb) {
};
CopayServer.prototype.runLocked = function (walletId, cb, task) {
CopayServer.prototype._runLocked = function (walletId, cb, task) {
var self = this;
Lock.get(walletId, function (lock) {
@ -105,13 +107,12 @@ CopayServer.prototype.runLocked = function (walletId, cb, task) {
CopayServer.prototype.joinWallet = function (opts, cb) {
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) {
if (err) return cb(err);
if (!wallet) return cb('Wallet not found');
if (_.find(wallet.copayers, { xPubKey: opts.xPubKey })) return cb('Copayer already in wallet');
if (wallet.copayers.length == wallet.n) return cb('Wallet full');
// TODO: validate copayer's extended public key using the public key from this wallet
// Note: use Bitcore.crypto.ecdsa .verify()
@ -149,19 +150,21 @@ CopayServer.prototype._doCreateAddress = function (pkr, index, isChange) {
CopayServer.prototype.createAddress = function (opts, cb) {
var self = this;
self.getWallet({ id: opts.walletId }, function (err, wallet) {
if (err) return cb(err);
if (!wallet) return cb('Wallet not found');
var index = wallet.addressIndex++;
self.storage.storeWallet(wallet, function (err) {
self._runLocked(opts.walletId, cb, function (cb) {
self.getWallet({ id: opts.walletId }, function (err, wallet) {
if (err) return cb(err);
if (!wallet) return cb('Wallet not found');
var address = self._doCreateAddress(wallet.publicKeyRing, index, opts.isChange);
self.storage.storeAddress(opts.walletId, address, function (err) {
var index = wallet.addressIndex++;
self.storage.storeWallet(wallet, function (err) {
if (err) return cb(err);
return cb(null, address);
var address = self._doCreateAddress(wallet.publicKeyRing, index, opts.isChange);
self.storage.storeAddress(opts.walletId, address, function (err) {
if (err) return cb(err);
return cb(null, address);
});
});
});
});

View File

@ -9,23 +9,26 @@ var should = chai.should();
var levelup = require('levelup');
var memdown = require('memdown');
var Storage = require('../lib/storage');
var Wallet = require('../lib/model/wallet');
var Address = require('../lib/model/address');
var Copayer = require('../lib/model/copayer');
var CopayServer = require('../lib/server');
var db;
var db, storage;
var server;
describe('Copay server', function() {
beforeEach(function() {
db = levelup(memdown, { valueEncoding: 'json' });
storage = new Storage({ db: db });
});
describe('#getWallet', function() {
beforeEach(function() {
server = new CopayServer({
db: db,
storage: storage,
});
});
@ -102,7 +105,7 @@ describe('Copay server', function() {
describe('#createWallet', function() {
beforeEach(function() {
server = new CopayServer({
db: db,
storage: storage,
});
});
@ -151,7 +154,7 @@ describe('Copay server', function() {
describe('#joinWallet', function() {
beforeEach(function() {
server = new CopayServer({
db: db,
storage: storage,
});
});
@ -324,7 +327,7 @@ describe('Copay server', function() {
describe('#createAddress', function() {
beforeEach(function() {
server = new CopayServer({
db: db,
storage: storage,
});
});
@ -345,7 +348,7 @@ describe('Copay server', function() {
describe('#createTx', function() {
beforeEach(function(done) {
server = new CopayServer({
db: db,
storage: storage,
});
server._doCreateAddress = sinon.stub().returns(new Address({ address: 'addr1', path: 'path1' }));
helpers.createAndJoinWallet('123', 2, 2, function (err, wallet) {