|
1 | | -// {signature} {pubKey} |
| 1 | +// <scriptSig> {serialized scriptPubKey script} |
2 | 2 |
|
3 | | -var p2sh = require('../scripthash/input') |
| 3 | +var bscript = require('../../script') |
| 4 | +var types = require('../../types') |
| 5 | +var typeforce = require('typeforce') |
| 6 | + |
| 7 | +var p2ms = require('../multisig/') |
| 8 | +var p2pk = require('../pubkey/') |
| 9 | +var p2pkh = require('../pubkeyhash/') |
| 10 | + |
| 11 | +function check (chunks, allowIncomplete) { |
| 12 | + typeforce(types.Array, chunks) |
| 13 | + if (chunks.length < 1) return false |
| 14 | + |
| 15 | + var witnessScript = chunks[chunks.length - 1] |
| 16 | + if (!Buffer.isBuffer(witnessScript)) return false |
| 17 | + |
| 18 | + var witnessScriptChunks = bscript.decompile(witnessScript) |
| 19 | + |
| 20 | + // is witnessScript a valid script? |
| 21 | + if (witnessScriptChunks.length === 0) return false |
| 22 | + |
| 23 | + var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1)) |
| 24 | + |
| 25 | + // match types |
| 26 | + if (p2pkh.input.check(witnessRawScriptSig) && |
| 27 | + p2pkh.output.check(witnessScriptChunks)) return true |
| 28 | + |
| 29 | + if (p2ms.input.check(witnessRawScriptSig, allowIncomplete) && |
| 30 | + p2ms.output.check(witnessScriptChunks)) return true |
| 31 | + |
| 32 | + if (p2pk.input.check(witnessRawScriptSig) && |
| 33 | + p2pk.output.check(witnessScriptChunks)) return true |
| 34 | + |
| 35 | + return false |
| 36 | +} |
| 37 | +check.toJSON = function () { return 'witnessScriptHash input' } |
| 38 | + |
| 39 | +function encodeStack (witnessData, witnessScript) { |
| 40 | + typeforce({ |
| 41 | + witnessData: [types.Buffer], |
| 42 | + witnessScript: types.Buffer |
| 43 | + }, { |
| 44 | + witnessData: witnessData, |
| 45 | + witnessScript: witnessScript |
| 46 | + }) |
| 47 | + |
| 48 | + return [].concat(witnessData, witnessScript) |
| 49 | +} |
| 50 | + |
| 51 | +function decodeStack (chunks) { |
| 52 | + typeforce(check, chunks) |
| 53 | + return { |
| 54 | + witnessData: chunks.slice(0, -1), |
| 55 | + witnessScript: chunks[chunks.length - 1] |
| 56 | + } |
| 57 | +} |
4 | 58 |
|
5 | 59 | module.exports = { |
6 | | - check: p2sh.check, |
7 | | - decodeStack: p2sh.decodeStack, |
8 | | - encodeStack: p2sh.encodeStack |
| 60 | + check: check, |
| 61 | + decodeStack: decodeStack, |
| 62 | + encodeStack: encodeStack |
9 | 63 | } |
0 commit comments