|
|
@ -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, |
|
|
|