allow delete proposals after 24hrs

This commit is contained in:
Matias Alejo Garcia 2015-06-11 16:39:21 -03:00
parent b311917e65
commit 74c8b34188
2 changed files with 59 additions and 9 deletions

View File

@ -32,6 +32,7 @@ var blockchainExplorerOpts;
var messageBroker;
/**
* Creates an instance of the Bitcore Wallet Service.
* @constructor
@ -865,14 +866,15 @@ 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) {
var actors = txp.getActors();
if (txp.creatorId !== self.copayerId)
return cb(new ClientError('Only creators can remove pending proposals during locktime'));
if (txp.creatorId !== self.copayerId)
return cb(new ClientError('Only creators can remove pending proposals'));
var actors = txp.getActors();
if (actors.length > 1 || (actors.length == 1 && actors[0] !== self.copayerId))
return cb(new ClientError('TXACTIONED', 'Cannot remove a proposal signed/rejected by other copayers'));
if (actors.length > 1 || (actors.length == 1 && actors[0] !== self.copayerId))
return cb(new ClientError('TXACTIONED', 'Cannot remove a proposal signed/rejected by other copayers during locktime'));
}
self._notify('TxProposalRemoved', {}, function() {
self.storage.removeTx(self.walletId, txp.id, cb);
@ -1318,6 +1320,7 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
});
};
WalletService.lockTimeoutHours = 24;
WalletService.scanConfig = {
SCAN_WINDOW: 20,

View File

@ -2656,6 +2656,7 @@ describe('Wallet service', function() {
});
});
});
it('should allow creator to remove an unsigned TX', function(done) {
server.removePendingTx({
@ -2669,7 +2670,7 @@ describe('Wallet service', function() {
});
});
it('should allow creator to remove an signed TX by himself', function(done) {
it('should allow creator to remove a signed TX by himself', function(done) {
var signatures = helpers.clientSign(txp, TestData.copayers[0].xPrivKey);
server.signTx({
txProposalId: txp.id,
@ -2754,7 +2755,7 @@ describe('Wallet service', function() {
});
});
it('should not allow creator copayer to remove an TX signed by other copayer', function(done) {
it('should not allow creator copayer to remove a TX signed by other copayer, in less than 24hrs', function(done) {
helpers.getAuthServer(wallet.copayers[1].id, function(server2) {
var signatures = helpers.clientSign(txp, TestData.copayers[1].xPrivKey);
server2.signTx({
@ -2772,6 +2773,52 @@ describe('Wallet service', function() {
});
});
});
it('should allow creator copayer to remove a TX signed by other copayer, after 24hrs', function(done) {
helpers.getAuthServer(wallet.copayers[1].id, function(server2) {
var signatures = helpers.clientSign(txp, TestData.copayers[1].xPrivKey);
server2.signTx({
txProposalId: txp.id,
signatures: signatures,
}, function(err) {
should.not.exist(err);
var clock = sinon.useFakeTimers(Date.now()+1+24*3600*1000);
server.removePendingTx({
txProposalId: txp.id
}, function(err) {
should.not.exist(err);
clock.restore();
done();
});
});
});
});
it('should allow other copayer to remove a TX signed, after 24hrs', function(done) {
helpers.getAuthServer(wallet.copayers[1].id, function(server2) {
var signatures = helpers.clientSign(txp, TestData.copayers[1].xPrivKey);
server2.signTx({
txProposalId: txp.id,
signatures: signatures,
}, function(err) {
should.not.exist(err);
var clock = sinon.useFakeTimers(Date.now()+1+24*3600*1000);
server2.removePendingTx({
txProposalId: txp.id
}, function(err) {
should.not.exist(err);
clock.restore();
done();
});
});
});
});
});
describe('#getTxHistory', function() {