diff --git a/src/transaction_builder.js b/src/transaction_builder.js index e284d63..6611bca 100644 --- a/src/transaction_builder.js +++ b/src/transaction_builder.js @@ -118,6 +118,7 @@ TransactionBuilder.prototype.build = function(allowIncomplete) { if (!allowIncomplete) { assert(this.tx.ins.length > 0, 'Transaction has no inputs') assert(this.tx.outs.length > 0, 'Transaction has no outputs') + assert(this.signatures.length > 0, 'Transaction has no signatures') assert.equal(this.signatures.length, this.tx.ins.length, 'Transaction is missing signatures') } diff --git a/test/fixtures/transaction_builder.json b/test/fixtures/transaction_builder.json index 69c1fea..8946805 100644 --- a/test/fixtures/transaction_builder.json +++ b/test/fixtures/transaction_builder.json @@ -42,72 +42,62 @@ "build": [ { "exception": "Transaction has no inputs", - "hex": "", + "inputs": [], "outputs": [ { - "script": "", + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", "value": 1000 } ] }, { "exception": "Transaction has no outputs", - "hex": "", "inputs": [ { - "hash": "", - "index": 0 + "index": 0, + "prevTx": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "privKeys": [] } - ] + ], + "outputs": [] }, { "exception": "Transaction has no signatures", - "hex": "", "inputs": [ { - "hash": "", - "index": 0 + "index": 0, + "prevTx": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "privKeys": [] } ], "outputs": [ { - "script": "", + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", "value": 1000 } ] }, { "exception": "Transaction is missing signatures", - "hex": "", "inputs": [ { - "hash": "", - "index": 0 + "index": 0, + "prevTx": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "privKeys": ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn"] }, { - "hash": "", - "index": 1 + "index": 1, + "prevTx": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "privKeys": [] } ], "outputs": [ { - "script": "", + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", "value": 1000 } - ], - "signatures": [ - { - "wif": "", - "index": 0 - } ] } - ], - "fromTransaction": [ - { - "exception": "Transaction contains unsupported script types", - "hex": "" - } ] } } diff --git a/test/transaction_builder.js b/test/transaction_builder.js index 4a7f0ea..36ad20c 100644 --- a/test/transaction_builder.js +++ b/test/transaction_builder.js @@ -189,40 +189,43 @@ describe('TransactionBuilder', function() { }) }) - it('throws if Transaction has no inputs', function() { - txb.addOutput(privScript, value) + fixtures.invalid.build.forEach(function(f) { + it('throws on ' + f.exception, function() { + f.inputs.forEach(function(input) { + var prevTx + if (input.prevTx.length === 64) { + prevTx = input.prevTx + } else { + prevTx = Transaction.fromHex(input.prevTx) + } - assert.throws(function() { - txb.build() - }, /Transaction has no inputs/) - }) + txb.addInput(prevTx, input.index) + }) - it('throws if Transaction has no outputs', function() { - txb.addInput(prevTxHash, 0) + f.outputs.forEach(function(output) { + var script = Script.fromASM(output.script) - assert.throws(function() { - txb.build() - }, /Transaction has no outputs/) - }) + txb.addOutput(script, output.value) + }) - it('throws if Transaction has no signatures', function() { - txb.addInput(prevTxHash, 0) - txb.addOutput(privScript, value) + f.inputs.forEach(function(input, index) { + var redeemScript - assert.throws(function() { - txb.build() - }, /Transaction is missing signatures/) - }) + if (input.redeemScript) { + redeemScript = Script.fromASM(input.redeemScript) + } - it('throws if Transaction has not enough signatures', function() { - txb.addInput(prevTxHash, 0) - txb.addInput(prevTxHash, 1) - txb.addOutput(privScript, value) - txb.sign(0, privKey) + input.privKeys.forEach(function(wif) { + var privKey = ECKey.fromWIF(wif) - assert.throws(function() { - txb.build() - }, /Transaction is missing signatures/) + txb.sign(index, privKey, redeemScript) + }) + }) + + assert.throws(function() { + txb.build() + }, new RegExp(f.exception)) + }) }) }) })