2018-07-20 08:28:14 +02:00
|
|
|
const bitcoin = require('../../')
|
|
|
|
|
2018-07-23 09:45:01 +02:00
|
|
|
const { describe, it } = require('mocha')
|
2018-07-20 08:28:14 +02:00
|
|
|
const regtestUtils = require('./_regtest')
|
|
|
|
const NETWORK = regtestUtils.network
|
|
|
|
const keyPairs = [
|
|
|
|
bitcoin.ECPair.makeRandom({ network: NETWORK }),
|
|
|
|
bitcoin.ECPair.makeRandom({ network: NETWORK })
|
|
|
|
]
|
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
async function buildAndSign (depends, prevOutput, redeemScript, witnessScript) {
|
|
|
|
const unspent = await regtestUtils.faucetComplex(prevOutput, 5e4)
|
2018-07-20 08:28:14 +02:00
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
const txb = new bitcoin.TransactionBuilder(NETWORK)
|
|
|
|
txb.addInput(unspent.txId, unspent.vout, null, prevOutput)
|
|
|
|
txb.addOutput(regtestUtils.RANDOM_ADDRESS, 2e4)
|
2018-07-20 08:28:14 +02:00
|
|
|
|
2019-06-13 06:07:00 +02:00
|
|
|
const posType = depends.prevOutScriptType
|
|
|
|
const needsValue = !!witnessScript || posType.slice(-6) === 'p2wpkh'
|
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
if (depends.signatures) {
|
2019-04-09 08:09:50 +02:00
|
|
|
keyPairs.forEach(keyPair => {
|
2019-06-13 06:07:00 +02:00
|
|
|
txb.sign({
|
|
|
|
prevOutScriptType: posType,
|
|
|
|
vin: 0,
|
|
|
|
keyPair,
|
|
|
|
redeemScript,
|
|
|
|
witnessValue: needsValue ? unspent.value : undefined,
|
|
|
|
witnessScript,
|
|
|
|
})
|
2019-04-07 15:27:16 +02:00
|
|
|
})
|
|
|
|
} else if (depends.signature) {
|
2019-06-13 06:07:00 +02:00
|
|
|
txb.sign({
|
|
|
|
prevOutScriptType: posType,
|
|
|
|
vin: 0,
|
|
|
|
keyPair: keyPairs[0],
|
|
|
|
redeemScript,
|
|
|
|
witnessValue: needsValue ? unspent.value : undefined,
|
|
|
|
witnessScript,
|
|
|
|
})
|
2019-04-07 15:27:16 +02:00
|
|
|
}
|
2018-07-20 08:28:14 +02:00
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
return regtestUtils.broadcast(txb.build().toHex())
|
2018-07-20 08:28:14 +02:00
|
|
|
}
|
|
|
|
|
2019-04-09 08:09:50 +02:00
|
|
|
;['p2ms', 'p2pk', 'p2pkh', 'p2wpkh'].forEach(k => {
|
2018-07-20 08:28:14 +02:00
|
|
|
const fixtures = require('../fixtures/' + k)
|
|
|
|
const { depends } = fixtures.dynamic
|
|
|
|
const fn = bitcoin.payments[k]
|
|
|
|
|
|
|
|
const base = {}
|
|
|
|
if (depends.pubkey) base.pubkey = keyPairs[0].publicKey
|
|
|
|
if (depends.pubkeys) base.pubkeys = keyPairs.map(x => x.publicKey)
|
|
|
|
if (depends.m) base.m = base.pubkeys.length
|
|
|
|
|
|
|
|
const { output } = fn(base)
|
|
|
|
if (!output) throw new TypeError('Missing output')
|
|
|
|
|
2019-04-09 08:09:50 +02:00
|
|
|
describe('bitcoinjs-lib (payments - ' + k + ')', () => {
|
2019-04-07 15:27:16 +02:00
|
|
|
it('can broadcast as an output, and be spent as an input', async () => {
|
2019-06-13 06:07:00 +02:00
|
|
|
Object.assign(depends, { prevOutScriptType: k })
|
|
|
|
await buildAndSign(depends, output, undefined, undefined)
|
2018-07-20 08:28:14 +02:00
|
|
|
})
|
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
it('can (as P2SH(' + k + ')) broadcast as an output, and be spent as an input', async () => {
|
2018-07-20 08:28:14 +02:00
|
|
|
const p2sh = bitcoin.payments.p2sh({ redeem: { output }, network: NETWORK })
|
2019-06-13 06:07:00 +02:00
|
|
|
Object.assign(depends, { prevOutScriptType: 'p2sh-' + k })
|
|
|
|
await buildAndSign(depends, p2sh.output, p2sh.redeem.output, undefined)
|
2018-07-20 08:28:14 +02:00
|
|
|
})
|
|
|
|
|
2018-07-23 02:37:31 +02:00
|
|
|
// NOTE: P2WPKH cannot be wrapped in P2WSH, consensus fail
|
|
|
|
if (k === 'p2wpkh') return
|
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
it('can (as P2WSH(' + k + ')) broadcast as an output, and be spent as an input', async () => {
|
2018-07-20 08:28:14 +02:00
|
|
|
const p2wsh = bitcoin.payments.p2wsh({ redeem: { output }, network: NETWORK })
|
2019-06-13 06:07:00 +02:00
|
|
|
Object.assign(depends, { prevOutScriptType: 'p2wsh-' + k })
|
|
|
|
await buildAndSign(depends, p2wsh.output, undefined, p2wsh.redeem.output)
|
2018-07-20 08:28:14 +02:00
|
|
|
})
|
|
|
|
|
2019-04-07 15:27:16 +02:00
|
|
|
it('can (as P2SH(P2WSH(' + k + '))) broadcast as an output, and be spent as an input', async () => {
|
2018-07-20 08:28:14 +02:00
|
|
|
const p2wsh = bitcoin.payments.p2wsh({ redeem: { output }, network: NETWORK })
|
|
|
|
const p2sh = bitcoin.payments.p2sh({ redeem: { output: p2wsh.output }, network: NETWORK })
|
|
|
|
|
2019-06-13 06:07:00 +02:00
|
|
|
Object.assign(depends, { prevOutScriptType: 'p2sh-p2wsh-' + k })
|
2019-04-07 15:27:16 +02:00
|
|
|
await buildAndSign(depends, p2sh.output, p2sh.redeem.output, p2wsh.redeem.output)
|
2018-07-20 08:28:14 +02:00
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|