From 700c898508ee3e5293b91d3459f6ffb1c7c9fe0c Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Mon, 9 May 2016 11:10:56 -0300 Subject: [PATCH] allow 1 <= n <= 15 && 1 <= m <= n --- lib/model/wallet.js | 26 +++----------- test/integration/server.js | 69 ++++++++++++++++++++++++++++---------- test/model/wallet.js | 28 +++++++++++----- 3 files changed, 76 insertions(+), 47 deletions(-) diff --git a/lib/model/wallet.js b/lib/model/wallet.js index fa95ffd..99d5667 100644 --- a/lib/model/wallet.js +++ b/lib/model/wallet.js @@ -18,8 +18,8 @@ Wallet.create = function(opts) { var x = new Wallet(); - $.checkArgument(_.isNumber(opts.m), '"m" is expected to be a number'); - $.checkArgument(_.isNumber(opts.n), '"n" is expected to be a number'); + $.shouldBeNumber(opts.m); + $.shouldBeNumber(opts.n); x.version = '1.0.0'; x.createdOn = Math.floor(Date.now() / 1000); @@ -47,8 +47,8 @@ Wallet.create = function(opts) { Wallet.fromObj = function(obj) { var x = new Wallet(); - $.checkArgument(_.isNumber(obj.m), '"m" is expected to be a number'); - $.checkArgument(_.isNumber(obj.n), '"n" is expected to be a number'); + $.shouldBeNumber(obj.m); + $.shouldBeNumber(obj.n); x.version = obj.version; x.createdOn = obj.createdOn; @@ -77,22 +77,6 @@ Wallet.prototype.toObject = function() { return x; }; -/* For compressed keys, m*73 + n*34 <= 496 */ -Wallet.COPAYER_PAIR_LIMITS = { - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 4, - 6: 4, - 7: 3, - 8: 3, - 9: 2, - 10: 2, - 11: 1, - 12: 1, -}; - /** * Get the maximum allowed number of required copayers. * This is a limit imposed by the maximum allowed size of the scriptSig. @@ -104,7 +88,7 @@ Wallet.getMaxRequiredCopayers = function(totalCopayers) { }; Wallet.verifyCopayerLimits = function(m, n) { - return (n >= 1 && n <= 12) && (m >= 1 && m <= Wallet.COPAYER_PAIR_LIMITS[n]); + return (n >= 1 && n <= 15) && (m >= 1 && m <= n); }; Wallet.prototype.isShared = function() { diff --git a/test/integration/server.js b/test/integration/server.js index c6a051d..2e12885 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -168,7 +168,6 @@ describe('Wallet service', function() { }); }); - it('should fail to create wallet with no name', function(done) { var opts = { name: '', @@ -184,37 +183,71 @@ describe('Wallet service', function() { }); }); - it('should fail to create wallet with invalid copayer pairs', function(done) { - var invalidPairs = [{ + it('should check m-n combination', function(done) { + var pairs = [{ m: 0, - n: 0 - }, { - m: 0, - n: 2 - }, { - m: 2, - n: 1 - }, { - m: 0, - n: 10 + n: 0, + valid: false, }, { m: 1, - n: 20 + n: 1, + valid: true, + }, { + m: 2, + n: 3, + valid: true, + }, { + m: 0, + n: 2, + valid: false, + }, { + m: 2, + n: 1, + valid: false, + }, { + m: 0, + n: 10, + valid: false, + }, { + m: 1, + n: 20, + valid: false, }, { m: 10, - n: 10 + n: 10, + valid: true, + }, { + m: 15, + n: 15, + valid: true, + }, { + m: 16, + n: 16, + valid: false, + }, { + m: 1, + n: 15, + valid: true, + }, { + m: -2, + n: -2, + valid: false, }, ]; var opts = { id: '123', name: 'my wallet', pubKey: TestData.keyPair.pub, }; - async.each(invalidPairs, function(pair, cb) { + async.each(pairs, function(pair, cb) { opts.m = pair.m; opts.n = pair.n; server.createWallet(opts, function(err) { - should.exist(err); - err.message.should.equal('Invalid combination of required copayers / total copayers'); + if (!pair.valid) { + should.exist(err); + err.message.should.equal('Invalid combination of required copayers / total copayers'); + } else { + should.not.exist(err); + } return cb(); }); }, function(err) { diff --git a/test/model/wallet.js b/test/model/wallet.js index b8661bd..0e4de35 100644 --- a/test/model/wallet.js +++ b/test/model/wallet.js @@ -12,22 +12,34 @@ describe('Wallet', function() { describe('#create', function() { it('will throw with an invalid string argument for "m" or "n"', function() { (function() { - Wallet.create({m: '2', n: 2}); - }).should.throw('"m" is expected to be a number'); + Wallet.create({ + m: '2', + n: 2 + }); + }).should.throw('Variable should be a Number.'); (function() { - Wallet.create({m: 2, n: '2'}); - }).should.throw('"n" is expected to be a number'); + Wallet.create({ + m: 2, + n: '2' + }); + }).should.throw('Variable should be a Number.'); }); }); describe('#fromObj', function() { it('will throw with an invalid string argument for "m" or "n"', function() { (function() { - Wallet.fromObj({m: '2', n: 2}); - }).should.throw('"m" is expected to be a number'); + Wallet.fromObj({ + m: '2', + n: 2 + }); + }).should.throw('Variable should be a Number.'); (function() { - Wallet.fromObj({m: 2, n: '2'}); - }).should.throw('"n" is expected to be a number'); + Wallet.fromObj({ + m: 2, + n: '2' + }); + }).should.throw('Variable should be a Number.'); }); it('read a wallet', function() { var w = Wallet.fromObj(testWallet);