Merge pull request #507 from bitcoinjs/locktime
txbuilder: add setLockTime
This commit is contained in:
commit
4ee194e840
4 changed files with 54 additions and 8 deletions
|
@ -4,6 +4,8 @@ var bscript = require('./script')
|
||||||
var bufferEquals = require('buffer-equals')
|
var bufferEquals = require('buffer-equals')
|
||||||
var networks = require('./networks')
|
var networks = require('./networks')
|
||||||
var ops = require('./opcodes')
|
var ops = require('./opcodes')
|
||||||
|
var typeforce = require('typeforce')
|
||||||
|
var types = require('./types')
|
||||||
|
|
||||||
var ECPair = require('./ecpair')
|
var ECPair = require('./ecpair')
|
||||||
var ECSignature = require('./ecsignature')
|
var ECSignature = require('./ecsignature')
|
||||||
|
@ -135,6 +137,21 @@ function TransactionBuilder (network) {
|
||||||
this.tx = new Transaction()
|
this.tx = new Transaction()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TransactionBuilder.prototype.setLockTime = function (locktime) {
|
||||||
|
typeforce(types.UInt32, locktime)
|
||||||
|
|
||||||
|
// if any signatures exist, throw
|
||||||
|
if (this.inputs.some(function (input) {
|
||||||
|
if (!input.signatures) return false
|
||||||
|
|
||||||
|
return input.signatures.some(function (s) { return s })
|
||||||
|
})) {
|
||||||
|
throw new Error('No, this would invalidate signatures')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tx.locktime = locktime
|
||||||
|
}
|
||||||
|
|
||||||
TransactionBuilder.fromTransaction = function (transaction, network) {
|
TransactionBuilder.fromTransaction = function (transaction, network) {
|
||||||
var txb = new TransactionBuilder(network)
|
var txb = new TransactionBuilder(network)
|
||||||
|
|
||||||
|
|
22
test/fixtures/transaction_builder.json
vendored
22
test/fixtures/transaction_builder.json
vendored
|
@ -263,6 +263,28 @@
|
||||||
"value": 10000
|
"value": 10000
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Transaction w/ nLockTime, pubKeyHash -> pubKeyHash",
|
||||||
|
"txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006b483045022100a3b254e1c10b5d039f36c05f323995d6e5a367d98dd78a13d5bbc3991b35720e022022fccea3897d594de0689601fbd486588d5bfa6915be2386db0397ee9a6e80b601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588acffff0000",
|
||||||
|
"locktime": 65535,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
||||||
|
"vout": 0,
|
||||||
|
"signs": [
|
||||||
|
{
|
||||||
|
"keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
|
"value": 10000
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"fromTransaction": [
|
"fromTransaction": [
|
||||||
|
|
|
@ -95,13 +95,11 @@ describe('bitcoinjs-lib (advanced)', function () {
|
||||||
this.timeout(30000)
|
this.timeout(30000)
|
||||||
|
|
||||||
var tx2 = new bitcoin.TransactionBuilder(network)
|
var tx2 = new bitcoin.TransactionBuilder(network)
|
||||||
// tx2.setLockTime(threeHoursAgo) // TODO
|
tx2.setLockTime(threeHoursAgo)
|
||||||
tx2.addInput(txId, 0, 0xfffffffe)
|
tx2.addInput(txId, 0, 0xfffffffe)
|
||||||
tx2.addOutput(alice.getAddress(), 1000)
|
tx2.addOutput(alice.getAddress(), 1000)
|
||||||
|
|
||||||
var tx2Raw = tx2.buildIncomplete()
|
var tx2Raw = tx2.buildIncomplete()
|
||||||
tx2Raw.locktime = threeHoursAgo // TODO
|
|
||||||
|
|
||||||
var hashType = bitcoin.Transaction.SIGHASH_ALL
|
var hashType = bitcoin.Transaction.SIGHASH_ALL
|
||||||
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
|
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
|
||||||
var signature = alice.sign(signatureHash)
|
var signature = alice.sign(signatureHash)
|
||||||
|
@ -120,13 +118,11 @@ describe('bitcoinjs-lib (advanced)', function () {
|
||||||
this.timeout(30000)
|
this.timeout(30000)
|
||||||
|
|
||||||
var tx2 = new bitcoin.TransactionBuilder(network)
|
var tx2 = new bitcoin.TransactionBuilder(network)
|
||||||
// tx2.setLockTime(threeHoursAgo) // TODO
|
tx2.setLockTime(threeHoursAgo)
|
||||||
tx2.addInput(txId, 0, 0xfffffffe)
|
tx2.addInput(txId, 0, 0xfffffffe)
|
||||||
tx2.addOutput(alice.getAddress(), 1000)
|
tx2.addOutput(alice.getAddress(), 1000)
|
||||||
|
|
||||||
var tx2Raw = tx2.buildIncomplete()
|
var tx2Raw = tx2.buildIncomplete()
|
||||||
tx2Raw.locktime = threeHoursAgo // TODO
|
|
||||||
|
|
||||||
var hashType = bitcoin.Transaction.SIGHASH_ALL
|
var hashType = bitcoin.Transaction.SIGHASH_ALL
|
||||||
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
|
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
|
||||||
var signatureA = alice.sign(signatureHash)
|
var signatureA = alice.sign(signatureHash)
|
||||||
|
|
|
@ -17,13 +17,13 @@ function construct (f, sign) {
|
||||||
var network = NETWORKS[f.network]
|
var network = NETWORKS[f.network]
|
||||||
var txb = new TransactionBuilder(network)
|
var txb = new TransactionBuilder(network)
|
||||||
|
|
||||||
// FIXME: add support for locktime/version in TransactionBuilder API
|
// FIXME: add support for version in TransactionBuilder API
|
||||||
if (f.version !== undefined) {
|
if (f.version !== undefined) {
|
||||||
txb.tx.version = f.version
|
txb.tx.version = f.version
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f.locktime !== undefined) {
|
if (f.locktime !== undefined) {
|
||||||
txb.tx.locktime = f.locktime
|
txb.setLockTime(f.locktime)
|
||||||
}
|
}
|
||||||
|
|
||||||
f.inputs.forEach(function (input) {
|
f.inputs.forEach(function (input) {
|
||||||
|
@ -241,6 +241,17 @@ describe('TransactionBuilder', function () {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('setLockTime', function () {
|
||||||
|
it('throws if if there exist any scriptSigs', function () {
|
||||||
|
txb.addInput(txHash, 0)
|
||||||
|
txb.sign(0, keyPair)
|
||||||
|
|
||||||
|
assert.throws(function () {
|
||||||
|
txb.setLockTime(65535)
|
||||||
|
}, /No, this would invalidate signatures/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('sign', function () {
|
describe('sign', function () {
|
||||||
fixtures.invalid.sign.forEach(function (f) {
|
fixtures.invalid.sign.forEach(function (f) {
|
||||||
it('throws on ' + f.exception + (f.description ? ' (' + f.description + ')' : ''), function () {
|
it('throws on ' + f.exception + (f.description ? ' (' + f.description + ')' : ''), function () {
|
||||||
|
|
Loading…
Reference in a new issue