bitcoinjs-lib/src/templates/multisig/input.js

55 lines
1.3 KiB
JavaScript
Raw Normal View History

// OP_0 [signatures ...]
var bscript = require('../../script')
var typeforce = require('typeforce')
var OPS = require('../../opcodes.json')
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)
}
function encode (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 bscript.compile([].concat(OPS.OP_0, signatures))
}
function decode (buffer, allowIncomplete) {
var chunks = bscript.decompile(buffer)
typeforce(check, chunks, allowIncomplete)
return {
signatures: chunks.slice(1)
}
}
module.exports = {
check: check,
decode: decode,
encode: encode
}