2016-11-02 12:30:37 +11:00
|
|
|
// <scriptSig> {serialized scriptPubKey script}
|
|
|
|
|
|
|
|
var bscript = require('../../script')
|
|
|
|
var typeforce = require('typeforce')
|
|
|
|
|
|
|
|
function check (script, allowIncomplete) {
|
|
|
|
var chunks = bscript.decompile(script)
|
|
|
|
if (chunks.length < 2) return false
|
|
|
|
|
|
|
|
var lastChunk = chunks[chunks.length - 1]
|
|
|
|
if (!Buffer.isBuffer(lastChunk)) return false
|
|
|
|
|
|
|
|
var scriptSigChunks = chunks.slice(0, -1)
|
|
|
|
var redeemScriptChunks = bscript.decompile(lastChunk)
|
|
|
|
|
|
|
|
// is redeemScript a valid script?
|
|
|
|
if (redeemScriptChunks.length === 0) return false
|
|
|
|
|
|
|
|
var inputType = bscript.classifyInput(scriptSigChunks, allowIncomplete)
|
|
|
|
var outputType = bscript.classifyOutput(redeemScriptChunks)
|
|
|
|
return inputType === outputType
|
|
|
|
}
|
2016-11-02 14:33:46 +11:00
|
|
|
check.toJSON = function () { return 'scriptHash input' }
|
2016-11-02 12:30:37 +11:00
|
|
|
|
2016-11-02 14:53:09 +11:00
|
|
|
function encode (redeemScriptSig, redeemScript) {
|
2016-11-14 16:17:32 +11:00
|
|
|
var scriptSigChunks = bscript.decompilePushOnly(redeemScriptSig)
|
2016-11-02 14:53:09 +11:00
|
|
|
var serializedScriptPubKey = bscript.compile(redeemScript)
|
2016-11-02 12:30:37 +11:00
|
|
|
|
|
|
|
return bscript.compile([].concat(
|
|
|
|
scriptSigChunks,
|
|
|
|
serializedScriptPubKey
|
|
|
|
))
|
|
|
|
}
|
|
|
|
|
|
|
|
function decode (buffer) {
|
|
|
|
var chunks = bscript.decompile(buffer)
|
|
|
|
typeforce(check, chunks)
|
|
|
|
|
|
|
|
return {
|
2016-11-14 16:17:32 +11:00
|
|
|
redeemScriptSig: bscript.compilePushOnly(chunks.slice(0, -1)),
|
2016-11-02 14:53:09 +11:00
|
|
|
redeemScript: chunks[chunks.length - 1]
|
2016-11-02 12:30:37 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
check: check,
|
|
|
|
decode: decode,
|
|
|
|
encode: encode
|
|
|
|
}
|