From a58c5b4f5b38a91458e8b06e73b8bcc9b38eb5ee Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 26 Sep 2018 14:47:14 +1000 Subject: [PATCH] txb/tests: add solo SIGHASH_ALL fixes --- src/transaction_builder.js | 8 ++++++-- test/fixtures/transaction_builder.json | 22 ++++++++++++++++++++-- test/transaction_builder.js | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/transaction_builder.js b/src/transaction_builder.js index 232c9a2..af238da 100644 --- a/src/transaction_builder.js +++ b/src/transaction_builder.js @@ -633,9 +633,9 @@ TransactionBuilder.prototype.sign = function (vin, keyPair, redeemScript, hashTy // TODO: remove keyPair.network matching in 4.0.0 if (keyPair.network && keyPair.network !== this.network) throw new TypeError('Inconsistent network') if (!this.__inputs[vin]) throw new Error('No input at index: ' + vin) - if (this.__needsOutputs()) throw new Error('Transaction needs outputs') hashType = hashType || Transaction.SIGHASH_ALL + if (this.__needsOutputs(hashType)) throw new Error('Transaction needs outputs') const input = this.__inputs[vin] @@ -709,7 +709,11 @@ TransactionBuilder.prototype.__canModifyInputs = function () { }) } -TransactionBuilder.prototype.__needsOutputs = function () { +TransactionBuilder.prototype.__needsOutputs = function (signingHashType) { + if (signingHashType === Transaction.SIGHASH_ALL) { + return this.__tx.outs.length === 0 + } + // if inputs are being signed with SIGHASH_NONE, we don't strictly need outputs // .build() will fail, but .buildIncomplete() is OK return (this.__tx.outs.length === 0) && this.__inputs.some((input) => { diff --git a/test/fixtures/transaction_builder.json b/test/fixtures/transaction_builder.json index 607e16a..133fc2d 100644 --- a/test/fixtures/transaction_builder.json +++ b/test/fixtures/transaction_builder.json @@ -2359,7 +2359,7 @@ ] }, { - "description": "Transaction w/ no outputs (but 1 SIGHASH_ALL)", + "description": "Transaction w/ no outputs (but 1 SIGHASH_NONE)", "exception": "Transaction needs outputs", "inputs": [ { @@ -2367,7 +2367,8 @@ "vout": 0, "signs": [ { - "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "hashType": 2 } ] }, @@ -2383,6 +2384,23 @@ } ], "outputs": [] + }, + { + "description": "Transaction w/ no outputs", + "exception": "Transaction needs outputs", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "throws": true + } + ] + } + ], + "outputs": [] } ], "fromTransaction": [ diff --git a/test/transaction_builder.js b/test/transaction_builder.js index bd0a3ab..85adcff 100644 --- a/test/transaction_builder.js +++ b/test/transaction_builder.js @@ -231,6 +231,7 @@ describe('TransactionBuilder', function () { it('throws if SIGHASH_ALL has been used to sign any existing scriptSigs', function () { txb.addInput(txHash, 0) + txb.addOutput(scripts[0], 1000) txb.sign(0, keyPair) assert.throws(function () {