made wallet#sign synchronous

This commit is contained in:
Ivan Socolsky 2014-11-06 14:53:09 -03:00
commit 0db8c1008b
4 changed files with 64 additions and 68 deletions

View file

@ -445,20 +445,23 @@ angular.module('copayApp.controllers').controller('SendController',
$scope.sign = function(ntxid) { $scope.sign = function(ntxid) {
$scope.loading = true; $scope.loading = true;
w.sign(ntxid, function(ret) {
if (!ret) { try {
w.sign(ntxid);
} catch (e) {
$scope.error = 'There was an error signing the transaction'; $scope.error = 'There was an error signing the transaction';
$scope.loadTxs(); $scope.loadTxs();
} else { return;
}
var p = w.txProposals.getTxProposal(ntxid); var p = w.txProposals.getTxProposal(ntxid);
if (p.builder.isFullySigned()) { if (p.builder.isFullySigned()) {
$scope.send(ntxid, function() { $scope.send(ntxid, function() {
$scope.loadTxs(); $scope.loadTxs();
}); });
} else } else {
$scope.loadTxs(); $scope.loadTxs();
} }
});
}; };
$scope.reject = function(ntxid) { $scope.reject = function(ntxid) {

View file

@ -1311,49 +1311,40 @@ Wallet.prototype.reject = function(ntxid) {
this.emitAndKeepAlive('txProposalsUpdated'); this.emitAndKeepAlive('txProposalsUpdated');
}; };
/**
* @callback signCallback
* @param {boolean} ret - true if it was successfully signed
*/
/** /**
* @desc Sign a proposal * @desc Sign a proposal
* @param {string} ntxid the id of the transaction proposal to sign * @param {string} ntxid the id of the transaction proposal to sign
* @param {signCallback} cb - a callback to be called on successful signing
* @emits txProposalsUpdated * @emits txProposalsUpdated
* @throws {Error} Could not sign proposal
* @throws {Error} Bad payment request
* @return {boolean} true if signing actually incremented the number of signatures
*/ */
Wallet.prototype.sign = function(ntxid, cb) { Wallet.prototype.sign = function(ntxid) {
preconditions.checkState(!_.isUndefined(this.getMyCopayerId())); preconditions.checkState(!_.isUndefined(this.getMyCopayerId()));
var self = this;
setTimeout(function() { var myId = this.getMyCopayerId();
var myId = self.getMyCopayerId(); var txp = this.txProposals.get(ntxid);
var txp = self.txProposals.get(ntxid);
// if (!txp || txp.rejectedBy[myId] || txp.signedBy[myId]) {
// if (cb) cb(false);
// }
//
// If this is a payment protocol request, // If this is a payment protocol request,
// ensure it hasn't been tampered with. // ensure it hasn't been tampered with.
if (!self.verifyPaymentRequest(ntxid)) { if (!this.verifyPaymentRequest(ntxid)) {
if (cb) cb(false); throw new Error('Bad payment request');
return;
} }
var keys = self.privateKey.getForPaths(txp.inputChainPaths);
var b = txp.builder;
var before = txp.countSignatures(); var before = txp.countSignatures();
b.sign(keys);
var ret = false; var keys = this.privateKey.getForPaths(txp.inputChainPaths);
if (txp.countSignatures() > before) { txp.builder.sign(keys);
txp.signedBy[myId] = Date.now();
self.sendTxProposal(ntxid); if (txp.countSignatures() <= before) {
self.emitAndKeepAlive('txProposalsUpdated'); return false;
ret = true;
} }
if (cb) return cb(ret);
}, 10); txp.signedBy[myId] = Date.now();
this.sendTxProposal(ntxid);
this.emitAndKeepAlive('txProposalsUpdated');
return true;
}; };
/** /**

View file

@ -800,9 +800,7 @@ describe('Wallet model', function() {
done(); done();
}); });
w.privateKey = k2; w.privateKey = k2;
w.sign(ntxid, function(success) { w.sign(ntxid).should.equal.true;
success.should.equal(true);
});
}); });
}); });
it('should fail to reject a signed transaction', function() { it('should fail to reject a signed transaction', function() {

View file

@ -1,4 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
'use strict'; 'use strict';
@ -155,7 +156,7 @@ firstWallet.updateIndexes(function() {
if (amount && amount >= balance) if (amount && amount >= balance)
throw ('Not enought balance fund to fullfill ' + amount + ' satoshis'); throw ('Not enought balance fund to fullfill ' + amount + ' satoshis');
rl.question("\n\tShould I swipe the wallet (destination address is:" + destAddr + " Amount: "+ amount + "Satoshis )?\n\t(`yes` to continue)\n\t", function(answer) { rl.question("\n\tShould I swipe the wallet (destination address is:" + destAddr + " Amount: " + (amount || balance) + " satoshis)?\n\t(`yes` to continue)\n\t", function(answer) {
if (answer !== 'yes') if (answer !== 'yes')
process.exit(1); process.exit(1);
@ -187,14 +188,17 @@ firstWallet.updateIndexes(function() {
async.eachSeries(signers, function(dummy, cb) { async.eachSeries(signers, function(dummy, cb) {
console.log('\t Signing with copayer', i + 1); console.log('\t Signing with copayer', i + 1);
w[i].txProposals = firstWallet.txProposals; w[i].txProposals = firstWallet.txProposals;
w[i].sign(ntxid, function(signed) {
if (!signed) return cb('Could not sign'); try {
w[i].sign(ntxid);
} catch (e) {
return cb('Could not sign');
}
console.log('\t Signed!'); console.log('\t Signed!');
firstWallet.txProposals = firstWallet.txProposals; firstWallet.txProposals = firstWallet.txProposals;
i++; i++;
return cb(null); return cb(null);
})
}, },
function(err) { function(err) {
if (err) if (err)