From 5137d193aba94cd9351126236027e6143d0ba8ae Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Wed, 6 Jan 2016 11:42:14 -0600 Subject: [PATCH] adding stack operations --- .../script/stack/StackOperations.scala | 142 ++++++++++++++++++ .../control/ControlOperationsTest.scala | 1 + .../script/stack/StackOperationsTest.scala | 86 +++++++++++ 3 files changed, 229 insertions(+) create mode 100644 src/main/scala/org/scalacoin/script/stack/StackOperations.scala create mode 100644 src/test/scala/org/scalacoin/script/stack/StackOperationsTest.scala diff --git a/src/main/scala/org/scalacoin/script/stack/StackOperations.scala b/src/main/scala/org/scalacoin/script/stack/StackOperations.scala new file mode 100644 index 0000000000..619b17687c --- /dev/null +++ b/src/main/scala/org/scalacoin/script/stack/StackOperations.scala @@ -0,0 +1,142 @@ +package org.scalacoin.script.stack + +import org.scalacoin.script.ScriptOperation + +/** + * Created by chris on 1/6/16. + */ +sealed trait StackOperation extends ScriptOperation + +/** + * Puts the input onto the top of the alt stack. Removes it from the main stack. + */ +case object OP_TOALTSTACK extends StackOperation { + override def opCode = 107 +} + +/** + * Puts the input onto the top of the main stack. Removes it from the alt stack. + */ +case object OP_FROMALTSTACK extends StackOperation { + override def opCode = 108 +} + +/** + * If the top stack value is not 0, duplicate it. + */ +case object OP_IFDUP extends StackOperation { + override def opCode = 115 +} + +/** + * Puts the number of stack items onto the stack. + */ +case object OP_DEPTH extends StackOperation { + override def opCode = 116 +} + +/** + * Removes the top stack item + */ +case object OP_DROP extends StackOperation { + override def opCode = 117 +} + +/** + * Duplicates the top stack item. + */ +case object OP_DUP extends StackOperation { + override def opCode = 118 +} + +/** + * Removes the second-to-top stack item. + */ +case object OP_NIP extends StackOperation { + override def opCode = 119 +} + +/** + * Copies the second-to-top stack item to the top. + */ +case object OP_OVER extends StackOperation { + override def opCode = 120 +} + +/** + * The item n back in the stack is copied to the top. + */ +case object OP_PICK extends StackOperation { + override def opCode = 121 +} + +/** + * The item n back in the stack is moved to the top. + */ +case object OP_ROLL extends StackOperation { + override def opCode = 122 +} + +/** + * The top three items on the stack are rotated to the left. + */ +case object OP_ROT extends StackOperation { + override def opCode = 123 +} + +/** + * The top two items on the stack are swapped. + */ +case object OP_SWAP extends StackOperation { + override def opCode = 124 +} + +/** + * The item at the top of the stack is copied and inserted before the second-to-top item. + */ +case object OP_TUCK extends StackOperation { + override def opCode = 125 +} + +/** + * Removes the top two stack items. + */ +case object OP_2DROP extends StackOperation { + override def opCode = 109 +} + +/** + * Duplicates the top two stack items + */ +case object OP_2DUP extends StackOperation { + override def opCode = 110 +} + +/** + * Duplicates the top 3 stack items + */ +case object OP_3DUP extends StackOperation { + override def opCode = 111 +} + +/** + * Copies the pair of items two spaces back in the stack to the front. + */ +case object OP_2OVER extends StackOperation { + override def opCode = 112 +} + +/** + * The fifth and sixth items back are moved to the top of the stack. + */ +case object OP_2ROT extends StackOperation { + override def opCode = 113 +} + +/** + * Swaps the top two pairs of items. + */ +case object OP_2SWAP extends StackOperation { + override def opCode = 114 +} + diff --git a/src/test/scala/org/scalacoin/script/control/ControlOperationsTest.scala b/src/test/scala/org/scalacoin/script/control/ControlOperationsTest.scala index 8d549985ef..d6628965fe 100644 --- a/src/test/scala/org/scalacoin/script/control/ControlOperationsTest.scala +++ b/src/test/scala/org/scalacoin/script/control/ControlOperationsTest.scala @@ -30,4 +30,5 @@ class ControlOperationsTest extends FlatSpec with MustMatchers { it must "define an OP_RETURN" in { OP_RETURN.opCode must be (106) } + } diff --git a/src/test/scala/org/scalacoin/script/stack/StackOperationsTest.scala b/src/test/scala/org/scalacoin/script/stack/StackOperationsTest.scala new file mode 100644 index 0000000000..fbb8fa1e2e --- /dev/null +++ b/src/test/scala/org/scalacoin/script/stack/StackOperationsTest.scala @@ -0,0 +1,86 @@ +package org.scalacoin.script.stack + +import org.scalatest.{MustMatchers, FlatSpec} + +/** + * Created by chris on 1/6/16. + */ +class StackOperationsTest extends FlatSpec with MustMatchers { + + "StackOperations" must "define OP_TOALTSTACK" in { + OP_TOALTSTACK.opCode must be (107) + } + + it must "define OP_FROMALTSTACK" in { + OP_FROMALTSTACK.opCode must be (108) + } + + it must "define OP_IFDUP" in { + OP_IFDUP.opCode must be (115) + } + + it must "define OP_DEPTH" in { + OP_DEPTH.opCode must be (116) + } + + it must "define OP_DROP" in { + OP_DROP.opCode must be (117) + } + it must "define OP_DUP" in { + OP_DUP.opCode must be (118) + } + + it must "define OP_NIP" in { + OP_NIP.opCode must be (119) + } + + it must "define OP_OVER" in { + OP_OVER.opCode must be (120) + } + + it must "define OP_PICK" in { + OP_PICK.opCode must be (121) + } + + it must "define OP_ROLL" in { + OP_ROLL.opCode must be (122) + } + + it must "define OP_ROT" in { + OP_ROT.opCode must be (123) + } + + it must "define OP_SWAP" in { + OP_SWAP.opCode must be (124) + } + + it must "define OP_TUCK" in { + OP_TUCK.opCode must be (125) + } + + it must "define OP_2DROP" in { + OP_2DROP.opCode must be (109) + } + + it must "define OP_2DUP" in { + OP_2DUP.opCode must be (110) + } + + it must "define OP_3DUP" in { + OP_3DUP.opCode must be (111) + } + + it must "define OP_2OVER" in { + OP_2OVER.opCode must be (112) + } + + it must "define OP_2ROT" in { + OP_2ROT.opCode must be (113) + } + + it must "define OP_2SWAP" in { + OP_2SWAP.opCode must be (114) + } + + +}