diff --git a/src/main/scala/org/scalacoin/script/parsing/ScriptParser.scala b/src/main/scala/org/scalacoin/script/parsing/ScriptParser.scala index a6b150d3a2..309bfdcf96 100644 --- a/src/main/scala/org/scalacoin/script/parsing/ScriptParser.scala +++ b/src/main/scala/org/scalacoin/script/parsing/ScriptParser.scala @@ -7,30 +7,20 @@ import scala.annotation.tailrec /** * Created by chris on 1/7/16. */ -trait ScriptParser extends { - - - /** - * Parses a script inside of a transaction - * @param str - * @tparam T - * @return - */ - def parseInputScript(str : String) : List[ScriptToken] = ??? - +trait ScriptParser { /** * Parses an output script of a transaction * @param str * @return */ - def parseOutputScript(str : String) : List[ScriptToken] = { + def parse(str : String) : List[ScriptToken] = { @tailrec def loop(operations : List[String], accum : List[ScriptToken]) : List[ScriptToken] = { operations match { + case h :: t if (h == "0") => loop(t, OP_0 :: accum) case h :: t if (ScriptOperationFactory.fromString(h).isDefined) => loop(t,ScriptOperationFactory.fromString(h).get :: accum) case h :: t => loop(t, ScriptConstantImpl(h) :: accum) - case h :: t if (h == "0") => loop(t, OP_0 :: accum) case Nil => accum } } diff --git a/src/test/scala/org/scalacoin/script/parsing/ScriptParserTest.scala b/src/test/scala/org/scalacoin/script/parsing/ScriptParserTest.scala index 25144c5ac1..1ae999e55f 100644 --- a/src/test/scala/org/scalacoin/script/parsing/ScriptParserTest.scala +++ b/src/test/scala/org/scalacoin/script/parsing/ScriptParserTest.scala @@ -10,22 +10,23 @@ class ScriptParserTest extends FlatSpec with MustMatchers with ScriptParser { "ScriptParser" must "parse an input script" in { -/* val parsedInput = parseInputScript(TestUtil.p2pkhInputScriptNotParsedAsm) - parsedInput must be (TestUtil.p2pkhInputScriptAsm)*/ + val parsedInput = parse(TestUtil.p2pkhInputScriptNotParsedAsm) + parsedInput must be (TestUtil.p2pkhInputScriptAsm) } it must "parse a pay-to-pubkey-hash output script" in { - val parsedOutput = parseOutputScript(TestUtil.p2pkhOutputScriptNotParsedAsm) + val parsedOutput = parse(TestUtil.p2pkhOutputScriptNotParsedAsm) parsedOutput must be (TestUtil.p2pkhOutputScriptAsm) } it must "parse a pay-to-script-hash output script" in { - val parsedOutput = parseOutputScript(TestUtil.p2shOutputScriptNotParsedAsm) + val parsedOutput = parse(TestUtil.p2shOutputScriptNotParsedAsm) parsedOutput must be (TestUtil.p2shOutputScriptAsm) } -/* it must "parse a pay-to-script-hash input script" in { - val parsedInput = parseInput - }*/ + it must "parse a pay-to-script-hash input script" in { + val parsedInput = parse(TestUtil.p2shInputScriptNotParsedAsm) + parsedInput must be (TestUtil.p2shInputScriptAsm) + } } diff --git a/src/test/scala/org/scalacoin/util/TestUtil.scala b/src/test/scala/org/scalacoin/util/TestUtil.scala index 964456eac3..ae0565e225 100644 --- a/src/test/scala/org/scalacoin/util/TestUtil.scala +++ b/src/test/scala/org/scalacoin/util/TestUtil.scala @@ -1,7 +1,7 @@ package org.scalacoin.util import org.scalacoin.protocol.{AssetAddress, BitcoinAddress} -import org.scalacoin.script.ScriptConstantImpl +import org.scalacoin.script.{OP_0, ScriptConstantImpl} import org.scalacoin.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY} import org.scalacoin.script.crypto.{OP_CHECKSIG, OP_HASH160} import org.scalacoin.script.stack.OP_DUP @@ -20,21 +20,21 @@ object TestUtil { val p2pkhInputScriptNotParsedAsm = "3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01" + " 02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652" - val p2pkhInputScriptAsm = List("3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01", - "02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652") + val p2pkhInputScriptAsm = List( + ScriptConstantImpl("3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01"), + ScriptConstantImpl("02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652")) val p2pkhOutputScriptNotParsedAsm = "OP_DUP OP_HASH160 e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b OP_EQUALVERIFY OP_CHECKSIG" val p2pkhOutputScriptAsm = List(OP_DUP,OP_HASH160,ScriptConstantImpl("e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b"),OP_EQUALVERIFY, OP_CHECKSIG) val p2shInputScriptNotParsedAsm = - """0 - |3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101 - |3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01 - |522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae - |""".stripMargin - - val p2shInputScript = List( + """0 3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101 3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01 522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae""" + val p2shInputScriptAsm = List( + OP_0, + ScriptConstantImpl("3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101"), + ScriptConstantImpl("3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01"), + ScriptConstantImpl("522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae") ) val p2shOutputScriptNotParsedAsm = "OP_HASH160 8ce5408cfeaddb7ccb2545ded41ef47810945484 OP_EQUAL" val p2shOutputScriptAsm = List(OP_HASH160, ScriptConstantImpl("8ce5408cfeaddb7ccb2545ded41ef47810945484"), OP_EQUAL)