// OP_0 [signatures ...] var bscript = require('../../script') var typeforce = require('typeforce') var OPS = require('bitcoin-ops') function partialSignature (value) { return value === OPS.OP_0 || bscript.isCanonicalSignature(value) } function check (script, allowIncomplete) { var chunks = bscript.decompile(script) if (chunks.length < 2) return false if (chunks[0] !== OPS.OP_0) return false if (allowIncomplete) { return chunks.slice(1).every(partialSignature) } return chunks.slice(1).every(bscript.isCanonicalSignature) } check.toJSON = function () { return 'multisig input' } function encodeStack (signatures, scriptPubKey) { typeforce([partialSignature], signatures) if (scriptPubKey) { var scriptData = bscript.multisig.output.decode(scriptPubKey) if (signatures.length < scriptData.m) { throw new TypeError('Not enough signatures provided') } if (signatures.length > scriptData.pubKeys.length) { throw new TypeError('Too many signatures provided') } } return [].concat(OPS.OP_0, signatures) } function encode (signatures, scriptPubKey) { return bscript.compile(encodeStack(signatures, scriptPubKey)) } function decodeStack (stack, allowIncomplete) { typeforce(check, stack, allowIncomplete) return stack.slice(1) } function decode (buffer, allowIncomplete) { var stack = bscript.decompile(buffer) return decodeStack(stack, allowIncomplete) } module.exports = { check: check, decode: decode, decodeStack: decodeStack, encode: encode, encodeStack: encodeStack }