From bac455cdd2326897b3e56539081cdd19212504e9 Mon Sep 17 00:00:00 2001
From: "Owain G. Ainsworth" <oga@conformal.com>
Date: Thu, 20 Jun 2013 00:30:34 +0100
Subject: [PATCH] Fix reversed test bug with the max operations handling

We were counting the number of push ops instead of the number of non
push ops.  Add tests that found this (checking tha the max operations
check fires).
---
 opcode.go         |   2 +-
 opcode_test.go    | 419 ++++++++++++++++++++++++++++++++++++++++++++++
 test_coverage.txt |  68 ++++----
 3 files changed, 454 insertions(+), 35 deletions(-)

diff --git a/opcode.go b/opcode.go
index 613b8361..613fd74f 100644
--- a/opcode.go
+++ b/opcode.go
@@ -654,7 +654,7 @@ func (pop *parsedOpcode) exec(s *Script) error {
 	// *sigh* bitcoind pretty much mandates that we violate layering here.
 	// Any opcode that isn't just adding data to the stack counts here
 	// as an operation.
-	if pop.opcode.value < OP_16 {
+	if pop.opcode.value > OP_16 {
 		s.numOps++
 		if s.numOps > MaxOpsPerScript {
 			return StackErrTooManyOperations
diff --git a/opcode_test.go b/opcode_test.go
index 3970b10d..dbbecd30 100644
--- a/opcode_test.go
+++ b/opcode_test.go
@@ -2400,6 +2400,425 @@ var detailedTests = []detailedTest{
 		expectedReturn: btcscript.StackErrVerifyFailed,
 		disassembly:    "OP_1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 OP_1 OP_1 OP_1 OP_CHECKMULTISIGVERIFY",
 	},
+	{
+		// 201 operations + one push, should just fit limits
+		name: "max operations",
+		script: []byte{btcscript.OP_1,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+		},
+		after:	[][]byte{{1}, {1}},
+		disassembly:      "OP_1 OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP",
+	},
+	{
+		// 202 operations + one push
+		name: "too many operations",
+		script: []byte{btcscript.OP_1,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+				btcscript.OP_DUP,
+				btcscript.OP_DROP,
+		},
+		expectedReturn: btcscript.StackErrTooManyOperations,
+		disassembly:      "OP_1 OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP",
+	},
 	{
 		name:           "OP_CAT disabled",
 		script:         []byte{btcscript.OP_CAT},
diff --git a/test_coverage.txt b/test_coverage.txt
index 83ce72b9..cd1b94d6 100644
--- a/test_coverage.txt
+++ b/test_coverage.txt
@@ -2,55 +2,56 @@
 github.com/conformal/btcscript/stack.go		 asInt				 100.00% (18/18)
 github.com/conformal/btcscript/stack.go		 fromInt			 100.00% (14/14)
 github.com/conformal/btcscript/opcode.go	 opcodeWithin			 100.00% (13/13)
+github.com/conformal/btcscript/opcode.go	 parsedOpcode.bytes		 100.00% (12/12)
 github.com/conformal/btcscript/stack.go		 Stack.nipN			 100.00% (12/12)
 github.com/conformal/btcscript/opcode.go	 parsedOpcode.print		 100.00% (12/12)
-github.com/conformal/btcscript/opcode.go	 parsedOpcode.bytes		 100.00% (12/12)
-github.com/conformal/btcscript/opcode.go	 opcodeNotIf			 100.00% (11/11)
 github.com/conformal/btcscript/opcode.go	 opcodeIf			 100.00% (11/11)
+github.com/conformal/btcscript/opcode.go	 opcodeNotIf			 100.00% (11/11)
+github.com/conformal/btcscript/opcode.go	 opcodeLessThanOrEqual		 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeGreaterThan		 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeLessThan			 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeNumNotEqual		 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeBoolOr			 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeBoolAnd			 100.00% (10/10)
-github.com/conformal/btcscript/opcode.go	 opcodeMin			 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeNumEqual			 100.00% (10/10)
-github.com/conformal/btcscript/stack.go		 Stack.Tuck			 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeMax			 100.00% (10/10)
+github.com/conformal/btcscript/stack.go		 Stack.Tuck			 100.00% (10/10)
+github.com/conformal/btcscript/opcode.go	 opcodeMin			 100.00% (10/10)
 github.com/conformal/btcscript/opcode.go	 opcodeGreaterThanOrEqual	 100.00% (10/10)
-github.com/conformal/btcscript/opcode.go	 opcodeLessThanOrEqual		 100.00% (10/10)
-github.com/conformal/btcscript/stack.go		 Stack.OverN			 100.00% (9/9)
-github.com/conformal/btcscript/script.go	 DisasmString			 100.00% (9/9)
 github.com/conformal/btcscript/stack.go		 Stack.RotN			 100.00% (9/9)
+github.com/conformal/btcscript/script.go	 DisasmString			 100.00% (9/9)
 github.com/conformal/btcscript/stack.go		 Stack.SwapN			 100.00% (9/9)
+github.com/conformal/btcscript/stack.go		 Stack.OverN			 100.00% (9/9)
 github.com/conformal/btcscript/opcode.go	 opcodeEqual			 100.00% (8/8)
+github.com/conformal/btcscript/opcode.go	 opcodeAdd			 100.00% (8/8)
 github.com/conformal/btcscript/opcode.go	 opcodeSub			 100.00% (8/8)
 github.com/conformal/btcscript/stack.go		 Stack.DupN			 100.00% (8/8)
-github.com/conformal/btcscript/opcode.go	 opcodeAdd			 100.00% (8/8)
 github.com/conformal/btcscript/opcode.go	 opcodePick			 100.00% (7/7)
-github.com/conformal/btcscript/opcode.go	 opcodeRoll			 100.00% (7/7)
-github.com/conformal/btcscript/stack.go		 Stack.DropN			 100.00% (7/7)
 github.com/conformal/btcscript/opcode.go	 opcodeNot			 100.00% (7/7)
+github.com/conformal/btcscript/stack.go		 Stack.DropN			 100.00% (7/7)
 github.com/conformal/btcscript/opcode.go	 opcode0NotEqual		 100.00% (7/7)
-github.com/conformal/btcscript/opcode.go	 parsedOpcode.conditional	 100.00% (6/6)
-github.com/conformal/btcscript/opcode.go	 opcodeIfDup			 100.00% (6/6)
-github.com/conformal/btcscript/opcode.go	 opcodeVerify			 100.00% (6/6)
+github.com/conformal/btcscript/opcode.go	 opcodeRoll			 100.00% (7/7)
 github.com/conformal/btcscript/opcode.go	 opcodeElse			 100.00% (6/6)
-github.com/conformal/btcscript/opcode.go	 opcodeHash160			 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 opcodeIfDup			 100.00% (6/6)
+github.com/conformal/btcscript/opcode.go	 parsedOpcode.conditional	 100.00% (6/6)
+github.com/conformal/btcscript/opcode.go	 opcodeVerify			 100.00% (6/6)
+github.com/conformal/btcscript/opcode.go	 opcodeHash256			 100.00% (5/5)
 github.com/conformal/btcscript/script.go	 removeOpcode			 100.00% (5/5)
 github.com/conformal/btcscript/script.go	 removeOpcodeByData		 100.00% (5/5)
 github.com/conformal/btcscript/stack.go		 Stack.PickN			 100.00% (5/5)
-github.com/conformal/btcscript/opcode.go	 opcodeAbs			 100.00% (5/5)
-github.com/conformal/btcscript/opcode.go	 opcodeHash256			 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 parsedOpcode.exec		 100.00% (5/5)
+github.com/conformal/btcscript/stack.go		 Stack.RollN			 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcodeToAltStack		 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcodeFromAltStack		 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 opcodeSha256			 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcodeRipemd160		 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcodeNegate			 100.00% (5/5)
-github.com/conformal/btcscript/opcode.go	 opcodeSha256			 100.00% (5/5)
-github.com/conformal/btcscript/opcode.go	 opcodeSize			 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 opcodeHash160			 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 opcodeAbs			 100.00% (5/5)
 github.com/conformal/btcscript/script.go	 Script.validPC			 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcode1Add			 100.00% (5/5)
 github.com/conformal/btcscript/opcode.go	 opcode1Sub			 100.00% (5/5)
-github.com/conformal/btcscript/stack.go		 Stack.RollN			 100.00% (5/5)
+github.com/conformal/btcscript/opcode.go	 opcodeSize			 100.00% (5/5)
 github.com/conformal/btcscript/stack.go		 Stack.PeekBool			 100.00% (4/4)
 github.com/conformal/btcscript/opcode.go	 opcodeEndif			 100.00% (4/4)
 github.com/conformal/btcscript/opcode.go	 opcodeEqualVerify		 100.00% (4/4)
@@ -65,38 +66,35 @@ github.com/conformal/btcscript/script.go	 unparseScript			 100.00% (4/4)
 github.com/conformal/btcscript/script.go	 Script.curPC			 100.00% (4/4)
 github.com/conformal/btcscript/script.go	 Script.DisasmPC		 100.00% (4/4)
 github.com/conformal/btcscript/script.go	 getStack			 100.00% (4/4)
-github.com/conformal/btcscript/address.go	 ScriptType.String		 100.00% (3/3)
 github.com/conformal/btcscript/stack.go		 fromBool			 100.00% (3/3)
-github.com/conformal/btcscript/script.go	 scriptUInt32			 100.00% (3/3)
-github.com/conformal/btcscript/script.go	 scriptUInt8			 100.00% (3/3)
-github.com/conformal/btcscript/script.go	 setStack			 100.00% (3/3)
+github.com/conformal/btcscript/address.go	 ScriptType.String		 100.00% (3/3)
 github.com/conformal/btcscript/script.go	 scriptUInt16			 100.00% (3/3)
+github.com/conformal/btcscript/script.go	 setStack			 100.00% (3/3)
+github.com/conformal/btcscript/script.go	 scriptUInt8			 100.00% (3/3)
+github.com/conformal/btcscript/script.go	 scriptUInt32			 100.00% (3/3)
 github.com/conformal/btcscript/stack.go		 Stack.NipN			 100.00% (2/2)
 github.com/conformal/btcscript/stack.go		 Stack.Depth			 100.00% (2/2)
 github.com/conformal/btcscript/opcode.go	 calcHash			 100.00% (2/2)
-github.com/conformal/btcscript/opcode.go	 opcodeFalse			 100.00% (2/2)
 github.com/conformal/btcscript/opcode.go	 opcodeDepth			 100.00% (2/2)
-github.com/conformal/btcscript/opcode.go	 opcode1Negate			 100.00% (2/2)
 github.com/conformal/btcscript/opcode.go	 opcodeN			 100.00% (2/2)
 github.com/conformal/btcscript/opcode.go	 opcodeCodeSeparator		 100.00% (2/2)
+github.com/conformal/btcscript/opcode.go	 opcode1Negate			 100.00% (2/2)
+github.com/conformal/btcscript/opcode.go	 opcodeFalse			 100.00% (2/2)
 github.com/conformal/btcscript/opcode.go	 opcodePushData			 100.00% (2/2)
-github.com/conformal/btcscript/opcode.go	 opcode2Rot			 100.00% (1/1)
+github.com/conformal/btcscript/opcode.go	 opcodeNop			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcode3Dup			 100.00% (1/1)
-github.com/conformal/btcscript/opcode.go	 opcode2Dup			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 calcHash160			 100.00% (1/1)
+github.com/conformal/btcscript/opcode.go	 opcode2Dup			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcode2Drop			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeReturn			 100.00% (1/1)
-github.com/conformal/btcscript/opcode.go	 opcodeNop			 100.00% (1/1)
 github.com/conformal/btcscript/stack.go		 Stack.PushByteArray		 100.00% (1/1)
 github.com/conformal/btcscript/stack.go		 Stack.PushInt			 100.00% (1/1)
+github.com/conformal/btcscript/opcode.go	 opcode2Over			 100.00% (1/1)
 github.com/conformal/btcscript/stack.go		 Stack.PopByteArray		 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeInvalid			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeReserved			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeDisabled			 100.00% (1/1)
-github.com/conformal/btcscript/script.go	 isPubkey			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 init				 100.00% (1/1)
-github.com/conformal/btcscript/script.go	 Script.subScript		 100.00% (1/1)
-github.com/conformal/btcscript/log.go		 UseLogger			 100.00% (1/1)
 github.com/conformal/btcscript/script.go	 Script.SetStack		 100.00% (1/1)
 github.com/conformal/btcscript/script.go	 isPubkeyHash			 100.00% (1/1)
 github.com/conformal/btcscript/script.go	 isScriptHash			 100.00% (1/1)
@@ -113,10 +111,13 @@ github.com/conformal/btcscript/opcode.go	 opcodeNip			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeDup			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeDrop			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcode2Swap			 100.00% (1/1)
+github.com/conformal/btcscript/opcode.go	 opcode2Rot			 100.00% (1/1)
 github.com/conformal/btcscript/script.go	 Script.GetStack		 100.00% (1/1)
 github.com/conformal/btcscript/log.go		 newLogClosure			 100.00% (1/1)
-github.com/conformal/btcscript/opcode.go	 opcode2Over			 100.00% (1/1)
+github.com/conformal/btcscript/script.go	 isPubkey			 100.00% (1/1)
 github.com/conformal/btcscript/stack.go		 Stack.PushBool			 100.00% (1/1)
+github.com/conformal/btcscript/script.go	 Script.subScript		 100.00% (1/1)
+github.com/conformal/btcscript/log.go		 UseLogger			 100.00% (1/1)
 github.com/conformal/btcscript/opcode.go	 opcodeCheckMultiSig		 96.43% (54/56)
 github.com/conformal/btcscript/opcode.go	 opcodeCheckSig			 96.15% (25/26)
 github.com/conformal/btcscript/script.go	 NewScript			 95.24% (20/21)
@@ -125,7 +126,6 @@ github.com/conformal/btcscript/script.go	 parseScript			 93.75% (30/32)
 github.com/conformal/btcscript/script.go	 Script.Step			 91.89% (34/37)
 github.com/conformal/btcscript/script.go	 typeOfScript			 83.33% (5/6)
 github.com/conformal/btcscript/script.go	 Script.DisasmScript		 80.00% (4/5)
-github.com/conformal/btcscript/opcode.go	 parsedOpcode.exec		 80.00% (4/5)
 github.com/conformal/btcscript/script.go	 isPushOnly			 75.00% (3/4)
 github.com/conformal/btcscript/opcode.go	 opcodeCheckSigVerify		 75.00% (3/4)
 github.com/conformal/btcscript/script.go	 Script.calcScriptHash		 71.43% (25/35)
@@ -135,5 +135,5 @@ github.com/conformal/btcscript/opcode.go	 opcodeSha1			 60.00% (3/5)
 github.com/conformal/btcscript/script.go	 Script.Execute			 44.44% (8/18)
 github.com/conformal/btcscript/log.go		 SetLogWriter			 0.00% (0/7)
 github.com/conformal/btcscript/log.go		 logClosure.String		 0.00% (0/1)
-github.com/conformal/btcscript			 --------------------------	 93.76% (841/897)
+github.com/conformal/btcscript			 --------------------------	 93.87% (842/897)