From 0db8c1008b679e2b0194ef64ea0703ff2a99857c Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Thu, 6 Nov 2014 14:53:09 -0300 Subject: [PATCH] made wallet#sign synchronous --- js/controllers/send.js | 29 +++++++++++---------- js/models/Wallet.js | 57 ++++++++++++++++++------------------------ test/Wallet.js | 4 +-- util/swipeWallet.js | 38 +++++++++++++++------------- 4 files changed, 62 insertions(+), 66 deletions(-) diff --git a/js/controllers/send.js b/js/controllers/send.js index 6955635f4..cba594c7b 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -445,20 +445,23 @@ angular.module('copayApp.controllers').controller('SendController', $scope.sign = function(ntxid) { $scope.loading = true; - w.sign(ntxid, function(ret) { - if (!ret) { - $scope.error = 'There was an error signing the transaction'; + + try { + w.sign(ntxid); + } catch (e) { + $scope.error = 'There was an error signing the transaction'; + $scope.loadTxs(); + return; + } + + var p = w.txProposals.getTxProposal(ntxid); + if (p.builder.isFullySigned()) { + $scope.send(ntxid, function() { $scope.loadTxs(); - } else { - var p = w.txProposals.getTxProposal(ntxid); - if (p.builder.isFullySigned()) { - $scope.send(ntxid, function() { - $scope.loadTxs(); - }); - } else - $scope.loadTxs(); - } - }); + }); + } else { + $scope.loadTxs(); + } }; $scope.reject = function(ntxid) { diff --git a/js/models/Wallet.js b/js/models/Wallet.js index dcdf76a7e..c1d4b876e 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -1311,49 +1311,40 @@ Wallet.prototype.reject = function(ntxid) { this.emitAndKeepAlive('txProposalsUpdated'); }; -/** - * @callback signCallback - * @param {boolean} ret - true if it was successfully signed - */ /** * @desc Sign a proposal * @param {string} ntxid the id of the transaction proposal to sign - * @param {signCallback} cb - a callback to be called on successful signing * @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())); - var self = this; - setTimeout(function() { - var myId = self.getMyCopayerId(); - 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, - // ensure it hasn't been tampered with. - if (!self.verifyPaymentRequest(ntxid)) { - if (cb) cb(false); - return; - } + var myId = this.getMyCopayerId(); + var txp = this.txProposals.get(ntxid); - var keys = self.privateKey.getForPaths(txp.inputChainPaths); + // If this is a payment protocol request, + // ensure it hasn't been tampered with. + if (!this.verifyPaymentRequest(ntxid)) { + throw new Error('Bad payment request'); + } - var b = txp.builder; - var before = txp.countSignatures(); - b.sign(keys); + var before = txp.countSignatures(); - var ret = false; - if (txp.countSignatures() > before) { - txp.signedBy[myId] = Date.now(); - self.sendTxProposal(ntxid); - self.emitAndKeepAlive('txProposalsUpdated'); - ret = true; - } - if (cb) return cb(ret); - }, 10); + var keys = this.privateKey.getForPaths(txp.inputChainPaths); + txp.builder.sign(keys); + + if (txp.countSignatures() <= before) { + return false; + } + + txp.signedBy[myId] = Date.now(); + this.sendTxProposal(ntxid); + this.emitAndKeepAlive('txProposalsUpdated'); + + return true; }; /** diff --git a/test/Wallet.js b/test/Wallet.js index cdfa81822..4c760977e 100644 --- a/test/Wallet.js +++ b/test/Wallet.js @@ -800,9 +800,7 @@ describe('Wallet model', function() { done(); }); w.privateKey = k2; - w.sign(ntxid, function(success) { - success.should.equal(true); - }); + w.sign(ntxid).should.equal.true; }); }); it('should fail to reject a signed transaction', function() { diff --git a/util/swipeWallet.js b/util/swipeWallet.js index 94186193f..195242257 100755 --- a/util/swipeWallet.js +++ b/util/swipeWallet.js @@ -1,4 +1,5 @@ #!/usr/bin/env node + 'use strict'; @@ -43,13 +44,13 @@ if (amount && program.fee) { process.exit(1); } -if (!requiredCopayers || !extPrivKeys || !extPrivKeys.length || !destAddr){ +if (!requiredCopayers || !extPrivKeys || !extPrivKeys.length || !destAddr) { program.outputHelp(); process.exit(1); } // Fee to asign to the tx. Please put a bigger number if you get 'unsufficient unspent' -var fee = program.fee || 0.0001; +var fee = program.fee || 0.0001; var totalCopayers = extPrivKeys.length; @@ -63,9 +64,9 @@ if (!addr.isValid()) { var networkName = addr.network().name; -console.log('\tNetwork: %s\n\tDestination Address:%s\n\tRequired copayers: %d\n\tTotal copayers: %d\n\tFee: %d\n\tKeys:', - networkName, destAddr, requiredCopayers, - totalCopayers, fee, extPrivKeys); //TODO +console.log('\tNetwork: %s\n\tDestination Address:%s\n\tRequired copayers: %d\n\tTotal copayers: %d\n\tFee: %d\n\tKeys:', + networkName, destAddr, requiredCopayers, + totalCopayers, fee, extPrivKeys); //TODO console.log('\n ----------------------------'); if (requiredCopayers > totalCopayers) @@ -152,19 +153,19 @@ firstWallet.updateIndexes(function() { } - if (amount && amount >= balance) + if (amount && amount >= balance) 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) { - if (answer !== 'yes') - process.exit(1); + 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') + process.exit(1); amount = amount || balance - fee * bitcore.util.COIN; firstWallet.createTx(destAddr, amount, '', {}, function(err, ntxid) { if (err || !ntxid) { if (err && err.toString().match('BIG')) { - throw new Error('Could not create tx' + err ); + throw new Error('Could not create tx' + err); } else { throw new Error('Could not create tx' + err + '. Try a bigger fee (--fee).'); } @@ -187,14 +188,17 @@ firstWallet.updateIndexes(function() { async.eachSeries(signers, function(dummy, cb) { console.log('\t Signing with copayer', i + 1); w[i].txProposals = firstWallet.txProposals; - w[i].sign(ntxid, function(signed) { - if (!signed) return cb('Could not sign'); - console.log('\t Signed!'); - firstWallet.txProposals = firstWallet.txProposals; - i++; - return cb(null); - }) + try { + w[i].sign(ntxid); + } catch (e) { + return cb('Could not sign'); + } + + console.log('\t Signed!'); + firstWallet.txProposals = firstWallet.txProposals; + i++; + return cb(null); }, function(err) { if (err)