From cf2e13fc62ec2e2e1758245e0b2a5501151c51e3 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Fri, 12 Dec 2014 17:06:30 -0300 Subject: [PATCH] fix signature for nreq>2 --- js/models/TxProposal.js | 19 +++++++++++++------ js/models/Wallet.js | 3 ++- test/TxProposal.js | 11 +++++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/js/models/TxProposal.js b/js/models/TxProposal.js index 8f4fe53c7..973924454 100644 --- a/js/models/TxProposal.js +++ b/js/models/TxProposal.js @@ -233,6 +233,7 @@ TxProposal.prototype._addSignatureAndVerify = function(signatures) { var ret = []; var tx = self.builder.build(); + var inputsFullySigned = 0; var newScriptSigs = []; _.each(tx.ins, function(input, index) { var scriptSig = new Script(input.s); @@ -268,14 +269,16 @@ TxProposal.prototype._addSignatureAndVerify = function(signatures) { }); var insertAt = 0; - while ( !_.isUndefined(currentPrios[insertAt]) && prio > currentPrios[insertAt] ) + while (!_.isUndefined(currentPrios[insertAt]) && prio > currentPrios[insertAt]) insertAt++; // Insert it! (1 is OP_0!) scriptSig.chunks.splice(1 + insertAt, 0, sig); scriptSig.updateBuffer(); - + if (info.nreq == currentKeys.length + 1) { + inputsFullySigned++; + } newScriptSigs.push(scriptSig.buffer); }); preconditions.checkState(newScriptSigs.length === tx.ins.length); @@ -284,9 +287,11 @@ TxProposal.prototype._addSignatureAndVerify = function(signatures) { _.each(tx.ins, function(input, index) { input.s = newScriptSigs[index]; - // TODO just to keep TransactionBuilder - self.builder.inputsSigned++; + // just to keep TransactionBuilder updated + if (tx.ins.length == inputsFullySigned) + self.builder.inputsSigned++; }); + this.resetCache(); }; @@ -312,9 +317,9 @@ TxProposal.prototype.addSignature = function(copayerId, signatures) { preconditions.checkArgument(signatures.length === tx.ins.length, 'Wrong number of signatures given'); this._addSignatureAndVerify(signatures); - this._setSigned(copayerId); - return false; + this._setSigned(copayerId); + return true; }; /** @@ -508,11 +513,13 @@ TxProposal.infoFromRedeemScript = function(s) { if (!redeemScript) throw new Error('Bad scriptSig (no redeemscript)'); + var nreq = nreq = redeemScript.chunks[0] - 80; //see OP_2-OP_16 var pubkeys = redeemScript.capture(); if (!pubkeys || !pubkeys.length) throw new Error('Bad scriptSig (no pubkeys)'); return { + nreq: nreq, keys: pubkeys, script: redeemScript, }; diff --git a/js/models/Wallet.js b/js/models/Wallet.js index 2180b7895..e9b073f5d 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -499,7 +499,8 @@ Wallet.prototype._processIncomingNewTxProposal = function(txp, cb) { self._processTxProposalPayPro(txp, function(err) { if (err) return cb(err); - self._setTxProposalSeen(txp); + // Disabled, not been shown on the UX now. + //self._setTxProposalSeen(txp); var tx = txp.builder.build(); if (tx.isComplete() && !txp.getSent()) diff --git a/test/TxProposal.js b/test/TxProposal.js index af81b4d79..e79348375 100644 --- a/test/TxProposal.js +++ b/test/TxProposal.js @@ -80,6 +80,7 @@ describe('TxProposal', function() { amountSatStr: '123', }]), }; + builder.inputsSigned =0; return builder; }; @@ -338,6 +339,7 @@ describe('TxProposal', function() { sigs[0][1].should.equal(SIG1); }); }); + describe('#addSignature', function() { it('should add signatures maintaing pubkeys order', function() { var txp = dummyProposal({ @@ -353,8 +355,13 @@ describe('TxProposal', function() { keysSorted.should.deep.equal(keys); }); - - + it('should add signatures to incomplete txs ', function() { + var txp = dummyProposal({ + nsig:1 + }); + txp.addSignature('pepe', [SIG1]); + txp.builder.inputsSigned.should.be.equal(0); + }); it('should fail with invalid signatures', function() { var txp = dummyProposal({