Browse Source

txbuilder: refactor branches for readability

hk-custom-address
Daniel Cousens 7 years ago
committed by Daniel Cousens
parent
commit
0157f18510
  1. 54
      src/transaction_builder.js

54
src/transaction_builder.js

@ -14,6 +14,14 @@ var ECPair = require('./ecpair')
var ECSignature = require('./ecsignature')
var Transaction = require('./transaction')
function supportedType (type) {
return SIGNABLE.indexOf(type) !== -1
}
function supportedP2SHType (type) {
return P2SH.indexOf(type) !== -1
}
function extractChunks (type, chunks, script) {
var pubKeys = []
var signatures = []
@ -82,7 +90,7 @@ function expandInput (scriptSig, witnessStack) {
if (scriptSig.length === 0) {
prevOutScript = bscript.witnessScriptHash.output.encode(bcrypto.sha256(witnessScript))
prevOutType = scriptTypes.P2WSH
if (typeof redeemScript !== 'undefined') {
if (redeemScript !== undefined) {
throw new Error('Redeem script given when unnecessary')
}
// bare witness
@ -96,9 +104,10 @@ function expandInput (scriptSig, witnessStack) {
}
}
if (SIGNABLE.indexOf(bscript.classifyOutput(witnessScript)) === -1) {
if (!supportedType(bscript.classifyOutput(witnessScript))) {
throw new Error('unsupported witness script')
}
script = witnessScript
scriptType = witnessScriptType
chunks = witnessStack.slice(0, -1)
@ -124,7 +133,7 @@ function expandInput (scriptSig, witnessStack) {
scriptType = scriptTypes.P2PKH
chunks = witnessStack
} else if (redeemScript) {
if (P2SH.indexOf(redeemScriptType) === -1) {
if (!supportedP2SHType(redeemScriptType)) {
throw new Error('Bad redeemscript!')
}
@ -398,7 +407,8 @@ function buildInput (input, allowIncomplete) {
var scriptType = input.prevOutType
var sig = []
var witness = []
if (SIGNABLE.indexOf(scriptType) !== -1) {
if (supportedType(scriptType)) {
sig = buildStack(scriptType, input.signatures, input.pubKeys, allowIncomplete)
}
@ -406,13 +416,14 @@ function buildInput (input, allowIncomplete) {
if (scriptType === bscript.types.P2SH) {
// We can remove this error later when we have a guarantee prepareInput
// rejects unsignable scripts - it MUST be signable at this point.
if (P2SH.indexOf(input.redeemScriptType) === -1 && !allowIncomplete) {
if (!allowIncomplete && !supportedP2SHType(input.redeemScriptType)) {
throw new Error('Impossible to sign this type')
}
if (SIGNABLE.indexOf(input.redeemScriptType) !== -1) {
if (supportedType(input.redeemScriptType)) {
sig = buildStack(input.redeemScriptType, input.signatures, input.pubKeys, allowIncomplete)
}
// If it wasn't SIGNABLE, it's witness, defer to that
if (input.redeemScriptType) {
p2sh = true
@ -420,18 +431,25 @@ function buildInput (input, allowIncomplete) {
}
}
if (scriptType === bscript.types.P2WPKH) {
switch (scriptType) {
// P2WPKH is a special case of P2PKH
witness = buildStack(bscript.types.P2PKH, input.signatures, input.pubKeys, allowIncomplete)
} else if (scriptType === bscript.types.P2WSH) {
// We can remove this check later
if (SIGNABLE.indexOf(input.witnessScriptType) === -1 && !allowIncomplete) {
throw new Error('Impossible to sign this type')
} else if (SIGNABLE.indexOf(input.witnessScriptType) !== -1) {
witness = buildStack(input.witnessScriptType, input.signatures, input.pubKeys, allowIncomplete)
witness.push(input.witnessScript)
scriptType = input.witnessScriptType
}
case bscript.types.P2WPKH:
witness = buildStack(bscript.types.P2PKH, input.signatures, input.pubKeys, allowIncomplete)
break
case bscript.types.P2WSH:
// We can remove this check later
if (!allowIncomplete && !supportedType(input.witnessScriptType)) {
throw new Error('Impossible to sign this type')
}
if (supportedType(input.witnessScriptType)) {
witness = buildStack(input.witnessScriptType, input.signatures, input.pubKeys, allowIncomplete)
witness.push(input.witnessScript)
scriptType = input.witnessScriptType
}
break
}
// append redeemScript if necessary
@ -616,7 +634,7 @@ TransactionBuilder.prototype.__build = function (allowIncomplete) {
// skip if no result
if (!allowIncomplete) {
if (SIGNABLE.indexOf(result.type) === -1 && result.type !== bscript.types.P2WPKH) {
if (!supportedType(result.type) && result.type !== bscript.types.P2WPKH) {
throw new Error(result.type + ' not supported')
}
}

Loading…
Cancel
Save