From 365c0a698b703dc704c293c87402346f637f2dd4 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Sun, 2 Apr 2017 10:13:42 -0500 Subject: [PATCH] Adding property to make sure timeout works in CSVEscrowTimeoutScriptPubKey --- .../protocol/script/ScriptSignature.scala | 19 +++++++++++-------- .../TransactionSignatureCreatorSpec.scala | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/scala/org/bitcoins/core/protocol/script/ScriptSignature.scala b/src/main/scala/org/bitcoins/core/protocol/script/ScriptSignature.scala index 0576d0009d..f2e1f288c1 100644 --- a/src/main/scala/org/bitcoins/core/protocol/script/ScriptSignature.scala +++ b/src/main/scala/org/bitcoins/core/protocol/script/ScriptSignature.scala @@ -528,13 +528,14 @@ object CSVEscrowTimeoutScriptSignature extends Factory[CSVEscrowTimeoutScriptSig def fromAsm(asm: Seq[ScriptToken]): CSVEscrowTimeoutScriptSignature = { require(asm.nonEmpty) - val nestedScriptSig = if (BitcoinScriptUtil.castToBool(asm.head)) { - require(MultiSignatureScriptSignature.isMultiSignatureScriptSignature(asm.tail), "Need multisigScriptSig, got: " + asm.tail) - MultiSignatureScriptSignature.fromAsm(asm.tail) + val nested = asm.take(asm.length - 1) + val nestedScriptSig = if (BitcoinScriptUtil.castToBool(asm.last)) { + require(MultiSignatureScriptSignature.isMultiSignatureScriptSignature(nested), "Need multisigScriptSig, got: " + nested) + MultiSignatureScriptSignature.fromAsm(nested) } else { - CSVScriptSignature(ScriptSignature.fromAsm(asm.tail)) + CSVScriptSignature(ScriptSignature.fromAsm(nested)) } - val bytes = asm.head.bytes ++ nestedScriptSig.asmBytes + val bytes = nestedScriptSig.asmBytes ++ asm.last.bytes val c = CompactSizeUInt.calculateCompactSizeUInt(bytes) val fullBytes = c.bytes ++ bytes fromBytes(fullBytes) @@ -542,11 +543,13 @@ object CSVEscrowTimeoutScriptSignature extends Factory[CSVEscrowTimeoutScriptSig def isValidCSVEscrowTimeoutScriptSig(asm: Seq[ScriptToken], scriptPubKey: CSVEscrowTimeoutScriptPubKey): Boolean = { - if (MultiSignatureScriptSignature.isMultiSignatureScriptSignature(asm.tail)) { - true + val nested = asm.take(asm.length - 1) + val isMultiSig = BitcoinScriptUtil.castToBool(asm.last) + if (isMultiSig) { + MultiSignatureScriptSignature.isMultiSignatureScriptSignature(nested) } else { val locktimeScript = scriptPubKey.timeout.scriptPubKeyAfterCSV - Try(ScriptSignature(asm,locktimeScript)).isSuccess + Try(ScriptSignature(nested,locktimeScript)).isSuccess } } diff --git a/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorSpec.scala b/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorSpec.scala index 3363505551..8293e214ea 100644 --- a/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorSpec.scala +++ b/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorSpec.scala @@ -138,11 +138,11 @@ class TransactionSignatureCreatorSpec extends Properties("TransactionSignatureCr if (result != ScriptOk) logger.warn("Result: " + result) Seq(ScriptErrorPushSize, ScriptOk).contains(result) } - property("generate a valid signature for a csv escrow timeout transaction") = - Prop.forAll(TransactionGenerators.spendableCSVMultiSigEscrowTimeoutTransaction) { txSigComponent: TransactionSignatureComponent => + Prop.forAll(TransactionGenerators.spendableCSVEscrowTimeoutTransaction) { txSigComponent: TransactionSignatureComponent => val program = ScriptProgram(txSigComponent) val result = ScriptInterpreter.run(program) result == ScriptOk } + }