From 139deac770e620e8e6d3cd40186a7c4b2fa615db Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Thu, 11 Jun 2015 18:38:42 -0300 Subject: [PATCH] adds .deleteLockTime to getTxproposals --- lib/server.js | 37 +++++++++++++++++++++++++++++-------- test/integration/server.js | 28 ++++++++++++++++++---------- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/lib/server.js b/lib/server.js index b4bfc46..c1277ee 100644 --- a/lib/server.js +++ b/lib/server.js @@ -843,6 +843,26 @@ WalletService.prototype.removeWallet = function(opts, cb) { }); }; +WalletService.prototype.getRemainingDeleteLockTime = function(txp) { + var now = Math.floor(Date.now() / 1000); + + var lockTimeRemaining = txp.createdOn + WalletService.deleteLockTime - now; + if (lockTimeRemaining < 0) + return 0; + + // not the creator? need to wait + if (txp.creatorId !== this.copayerId) + return lockTimeRemaining; + + // has other approvers? need to wait + var approvers = txp.getApprovers(); + if (approvers.length > 1 || (approvers.length == 1 && approvers[0] !== this.copayerId)) + return lockTimeRemaining; + + return 0; +}; + + /** * removePendingTx * @@ -866,14 +886,10 @@ WalletService.prototype.removePendingTx = function(opts, cb) { if (!txp.isPending()) return cb(new ClientError('TXNOTPENDING', 'Transaction proposal not pending')); - var now = Math.floor(Date.now() / 1000); - if (now - txp.createdOn < WalletService.lockTimeoutHours * 3600) { - if (txp.creatorId !== self.copayerId) - return cb(new ClientError('Only creators can remove pending proposals during locktime')); - var approvers = txp.getApprovers(); - if (approvers.length > 1 || (approvers.length == 1 && approvers[0] !== self.copayerId)) - return cb(new ClientError('TXACTIONED', 'Cannot remove a proposal signed/rejected by other copayers during locktime')); + var deleteLockTime = self.getRemainingDeleteLockTime(txp); + if (deleteLockTime > 0) { + return cb(new ClientError('TXCANNOTREMOVE', 'Cannot remove this tx proposal during locktime. Time remaining:' + deleteLockTime)); } self._notify('TxProposalRemoved', {}, function() { @@ -1104,6 +1120,10 @@ WalletService.prototype.getPendingTxs = function(opts, cb) { self.storage.fetchPendingTxs(self.walletId, function(err, txps) { if (err) return cb(err); + _.each(txps,function(txp){ + txp.deleteLockTime = self.getRemainingDeleteLockTime(txp); + }); + return cb(null, txps); }); }; @@ -1320,7 +1340,8 @@ WalletService.prototype.getTxHistory = function(opts, cb) { }); }; -WalletService.lockTimeoutHours = 24; +// in seconds +WalletService.deleteLockTime = 24 * 3600; WalletService.scanConfig = { SCAN_WINDOW: 20, diff --git a/test/integration/server.js b/test/integration/server.js index 558907d..1da0b45 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -1269,6 +1269,8 @@ describe('Wallet service', function() { server.getPendingTxs({}, function(err, txs) { should.not.exist(err); txs.length.should.equal(1); + // creator + txs[0].deleteLockTime.should.equal(0); server.getBalance({}, function(err, balance) { should.not.exist(err); balance.totalAmount.should.equal(helpers.toSatoshi(300)); @@ -2656,7 +2658,7 @@ describe('Wallet service', function() { }); }); }); - + it('should allow creator to remove an unsigned TX', function(done) { server.removePendingTx({ @@ -2746,6 +2748,7 @@ describe('Wallet service', function() { server2.removePendingTx({ txProposalId: txp.id }, function(err) { + should.exist(err); err.message.should.contain('creators'); server2.getPendingTxs({}, function(err, txs) { txs.length.should.equal(1); @@ -2766,8 +2769,8 @@ describe('Wallet service', function() { server.removePendingTx({ txProposalId: txp.id }, function(err) { - err.code.should.equal('TXACTIONED'); - err.message.should.contain('other copayers'); + err.code.should.equal('TXCANNOTREMOVE'); + err.message.should.contain('Cannot remove'); done(); }); }); @@ -2803,13 +2806,18 @@ describe('Wallet service', function() { }, function(err) { should.not.exist(err); - var clock = sinon.useFakeTimers(Date.now()+1+24*3600*1000); - server.removePendingTx({ - txProposalId: txp.id - }, function(err) { + server.getPendingTxs({}, function(err, txs) { should.not.exist(err); - clock.restore(); - done(); + txs[0].deleteLockTime.should.be.above(WalletService.deleteLockTime-10); + + var clock = sinon.useFakeTimers(Date.now() + 1 + 24 * 3600 * 1000); + server.removePendingTx({ + txProposalId: txp.id + }, function(err) { + should.not.exist(err); + clock.restore(); + done(); + }); }); }); }); @@ -2825,7 +2833,7 @@ describe('Wallet service', function() { }, function(err) { should.not.exist(err); - var clock = sinon.useFakeTimers(Date.now()+1+24*3600*1000); + var clock = sinon.useFakeTimers(Date.now() + 1 + 24 * 3600 * 1000); server2.removePendingTx({ txProposalId: txp.id }, function(err) {