Process History
diff --git a/cmd/servicetester/e2e_test.sh b/cmd/servicetester/e2e_test.sh
index cbd53ef..3568441 100755
--- a/cmd/servicetester/e2e_test.sh
+++ b/cmd/servicetester/e2e_test.sh
@@ -119,7 +119,7 @@
 
   ( sleep 2; curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"plainText\":\"$inputString\"}}" > ref ) &
   output1=$(fishhook $configdir $host "self" 2)
- 
+
   ref=$(cat ref | jq .orderReference)
   cipherText=$(echo $output1 | jq .OrderPart2.Extension.CipherText)
 
@@ -150,17 +150,17 @@
   output1=$(fishhook $configdir $host "self" 1)
   ref=$(cat ref | jq .orderReference)
   commitment1=$(echo $output1 | jq .OrderPart2.CommitmentPublicKey)
-  #echo "Committment1 $commitment1"
+  echo "Committment1 $commitment1"
 
   ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":$identity}" > /dev/null) &
   output2=$(fishhook $configdir $host "self" 3)
   commitment2=$(echo $output2 | jq .OrderPart4.Extension.FinalPublicKey)
   orderIndex=0
-  #echo "Committment1 $commitment1"
-  #echo "Committment2 $commitment2"
+  echo "Committment1 $commitment1"
+  echo "Committment2 $commitment2"
 
   if [ -z $commitment2 ]; then
-      eprintfcho "  ${RED}FAIL${NC}  Commitment is empty\n"
+      printf "  ${RED}FAIL${NC}  Commitment is empty\n"
       exit 1
   fi
 
diff --git a/cmd/servicetester/e2e_test_multi.sh b/cmd/servicetester/e2e_test_multi.sh
new file mode 100755
index 0000000..f788d1d
--- /dev/null
+++ b/cmd/servicetester/e2e_test_multi.sh
@@ -0,0 +1,226 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#End to End Test of Services using curl/bash
+
+principalID="FvhP9PyS1LNNizM1kns65PUA9imPya2zzTbZZ9BYaVLo"
+beneficiaryID="5m4iJRCRzcMySHFXgAPB1gyfBvHgomwEpWDpZRHayPyP"
+beneficiaryConfigdir=~/.milagro3
+apiVersion="v1"
+defaultURL="http://localhost:5556"
+apiURL="${1:-$defaultURL}"
+configdir=~/.milagro1
+host="34.246.173.153:26657"
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+ORANGE='\033[0;33m'
+BLUE='\033[1;34m'
+NC='\033[0m' # No Color
+
+
+
+status () {
+  #Determine if an extension is running
+  statusOutput=$(curl -s -X GET "$apiURL/$apiVersion/status" -H "accept: */*" -H "Content-Type: application/json")
+
+  #printf "$apiURL/$apiVersion/status\n"
+
+  identity=$(echo $statusOutput | jq .nodeCID)
+  extensionVendor=$(echo $statusOutput | jq -r .extensionVendor)
+  plugin=$(echo $statusOutput | jq -r .plugin)
+  printf "Plugin ${BLUE}$plugin ${NC}\n"
+
+  if [ -z "${extensionVendor}" ]; then
+       printf "${RED} Server Not Running{NC}\n"
+      exit 1
+  fi
+}
+
+###############################################################################################################################
+
+execute_bitcoin () {
+  # #Run 4 Tests against the Bitcoin Extension
+  echo "  Bitcoin Plugin Tests [2 Tests]"
+
+
+ ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json"  -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}" > ref ) &
+  output1=$(fishhook $configdir $host "self" 2)
+  ref=$(cat ref | jq .orderReference)
+  commitment1=$(echo $output1 | jq .OrderPart2.CommitmentPublicKey)
+  address1=$(echo $output1 | jq .OrderPart2.Extension.address)
+  (sleep 1; curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":$identity}" > /dev/null ) &
+
+  output2=$(fishhook $configdir $host "self" 2)
+  address2=$(echo $output2 | jq .OrderPart4.Extension.address)
+  commitment2=$(echo $output2 | jq .OrderPart4.Extension.FinalPublicKey)
+  #echo "Committment1 $commitment1 $address1"
+  #echo "Committment2 $commitment2 $address2"
+  if [ -z $commitment2 ]; then
+      printf "  ${RED}FAIL${NC} Commitment is empty\n"
+      exit 1
+  fi
+  if [ $commitment1 != $commitment2 ]; then
+    printf "  ${RED}FAIL${NC}\n "
+    exit 1
+  fi
+  if [ $address2 != $address2 ]; then
+    printf "  ${RED}FAIL${NC}\n "
+    exit 1
+  fi
+  printf "  ${GREEN}Pass${NC} - Id, Order & OrderSecret(Beneficiary)\n"
+
+
+  ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json"  -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"coin\":\"0\"}}" > ref ) &
+  output1=$(fishhook $configdir $host "self" 2)
+  ref=$(cat ref | jq .orderReference)
+  commitment1=$(echo $output1 | jq .OrderPart2.CommitmentPublicKey)
+  address1=$(echo $output1 | jq .OrderPart2.Extension.address)
+  (sleep 1; curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref}" > /dev/null ) &
+  output2=$(fishhook $configdir $host "self" 2)
+  address2=$(echo $output2 | jq .OrderPart4.Extension.address)
+  commitment2=$(echo $output2 | jq .OrderPart4.Extension.FinalPublicKey)
+  #echo "Committment1 $commitment1 $address1"
+  #echo "Committment2 $commitment2 $address2"
+  if [ -z $commitment2 ]; then
+      printf "  ${RED}FAIL${NC}  Commitment is empty\n"
+      exit 1
+  fi
+  if [ $commitment1 != $commitment2 ]; then
+    printf "  ${RED}FAIL${NC}\n "
+    exit 1
+  fi
+  if [ $address2 != $address2 ]; then
+    printf "  ${RED}FAIL${NC}\n"
+    exit 1
+  fi
+ printf "  ${GREEN}Pass${NC} - Id, Order(Beneficiary) & OrderSecret\n"
+}
+
+
+###############################################################################################################################
+
+execute_safeguardsecret () {
+
+  inputString="This is some random test text 1234567890!"
+  printf "  Encrypt a String [1 Test]\n"
+
+  ( sleep 2; curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"plainText\":\"$inputString\"}}" > ref ) &
+  output1=$(fishhook $configdir $host "self" 2)
+
+  ref=$(cat ref | jq .orderReference)
+  cipherText=$(echo $output1 | jq .OrderPart2.Extension.CipherText)
+
+  ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"cipherText\":$cipherText}}" > /dev/null) &
+  output2=$(fishhook $configdir $host "self" 2)
+  plaintext=$(echo $output2 | jq -r .OrderPart4.Extension.PlainText)
+
+  if [ -z "$plaintext" ]; then
+      printf "  ${RED}FAIL${NC}  Commitment is empty\n"
+      exit 1
+  fi
+
+  if [ "$inputString" == "$plaintext" ]; then
+    printf "  ${GREEN}Pass ${NC}Order Create/Retrieve\n"
+  else
+    printf "  ${RED}FAIL ${NC}Order Create/Retrieve\n"
+    exit 1
+  fi
+
+}
+
+# #############################################################################
+
+
+execute_milagro () {
+  echo "  Milagro Tests [1 Test]"
+  ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\"}" > ref ) &
+
+  output1=$(fishhook $configdir $host "self" 1)
+  ref=$(cat ref | jq .orderReference)
+  commitment1=$(echo $output1 | jq .OrderPart2.CommitmentPublicKey)
+  echo "Committment1 $commitment1"
+
+
+
+  ( sleep 1; curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":\"$beneficiaryID\"}" > /dev/null) &
+
+
+  output2=$(fishhook $beneficiaryConfigdir $host "self" 1)
+  commitment2=$(echo $output2 | jq .OrderPart4.Extension.FinalPublicKey)
+  orderIndex=0
+
+  
+  if [ -z $commitment2 ]; then
+      printf "  ${RED}FAIL${NC}  Commitment is empty\n"
+      exit 1
+  fi
+
+  if [ $commitment1 == $commitment2 ]; then
+    printf "  ${GREEN}Pass${NC} Order Create/Retrieve\n"
+  else
+    printf "  ${RED}FAIL${NC} Order Create/Retrieve\n"
+    exit 1
+  fi
+}
+
+
+
+
+
+
+# #############################################################################
+
+execute_orderlist () {
+  printf "Milagro Tests [1 Test]\n"
+  commitment2=$(echo $output2 | jq .commitment)
+  outputList=$(curl -s -X GET "$apiURL/$apiVersion/order?page=0&perPage=2&sortBy=dateCreatedDsc" -H "accept: */*")
+  orderReference=$(echo $outputList | jq -r ".orderReference | .[$orderIndex]")
+  outputOrder=$(curl -s -X GET "$apiURL/$apiVersion/order/$orderReference" -H "accept: */*")
+
+  #A simple smoke test to ensure some sort of order is returned
+  hasSecret=`echo $outputOrder | grep "Secret"`
+
+  if [ -z $hasSecret ]; then
+      printf "  ${RED}FAIL${NC} Order has erro\n"
+      exit 1
+  else
+     printf "  ${GREEN}Pass${NC} orderList & get\n"
+  fi
+}
+
+# #############################################################################
+
+status
+
+if [ $plugin == "bitcoinwallet" ]; then
+   execute_bitcoin
+fi
+
+
+if [ $plugin == "milagro"  ]; then
+   execute_milagro
+fi
+
+
+if [ $plugin == "safeguardsecret" ]; then
+    execute_safeguardsecret
+fi
+
+#execute_orderlist
+
diff --git a/cmd/servicetester/orders b/cmd/servicetester/orders
new file mode 100755
index 0000000..c627f9c
--- /dev/null
+++ b/cmd/servicetester/orders
@@ -0,0 +1,13 @@
+#!/bin/bash
+rm refs
+x=1
+while [ $x -le $1 ]
+do
+    (curl -s -X POST http://localhost:5556/v1/order -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\"}" | jq .orderReference >> refs ) &
+  x=$(( $x + 1 ))
+done
+
+
+
+
+
diff --git a/cmd/servicetester/orders4 b/cmd/servicetester/orders4
new file mode 100755
index 0000000..5a8bf34
--- /dev/null
+++ b/cmd/servicetester/orders4
@@ -0,0 +1,13 @@
+#!/bin/bash
+rm refs
+x=1
+while [ $x -le $1 ]
+do
+  curl -s -X POST http://localhost:8556/v1/order -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\"}" | jq .orderReference >> refs4 
+  x=$(( $x + 1 ))
+done
+
+
+
+
+
diff --git a/cmd/servicetester/refs b/cmd/servicetester/refs
new file mode 100644
index 0000000..942602f
--- /dev/null
+++ b/cmd/servicetester/refs
@@ -0,0 +1 @@
+"G6c5SAXkDanPvsQVqbdeyRXQ3nUtfF8YUtmqVGoKN7Dn"
diff --git a/cmd/servicetester/refs4 b/cmd/servicetester/refs4
new file mode 100644
index 0000000..0190582
--- /dev/null
+++ b/cmd/servicetester/refs4
@@ -0,0 +1,193 @@
+"EL3e7rfCmYRsrtCBGcZwPKJoDcr6DAAuDjUsJXfY5Pm2"
+"9VjvbiBdpezT5MJSxZdYtxQSuWUVkRnfHTCptd37YcVm"
+"F46mnFDoQHEGitY6LuvUUcvkpCFaMRgthTqWAwVi6u4Y"
+"5urdsUM3dTRmhvzu6AkiBwYGnziwVYGfRYEQ15vKnzTe"
+"A75Xo1kf8JMVcD989Kyj6igM8tiTynEbuJ7QKrjJ2NZe"
+"9yc5U5tEH5qcTxdwKRDbTaGH7AriLH4UFow3h3CQu1pP"
+"HkYAE5koRcek5sNK5mNcs2hQ8NdFMbcQ8Cyh4R1nMGVq"
+"3DVMjTcUL9PpjXW8U6wb5ZUEtTCHxVBLFNCPM418WNEU"
+"9zG6bCCDP4xGZVE3ySkpCThtjZaf3EeH5LX8BvaCSkC2"
+"ErRX7EUen9RT1KYfhVbhGWpPmdAX8RpFPejedxD2h922"
+"EWX8Q9QZPxXXKXhbi7dEbNCgpQ2xEofcopK8Dp5vsxvM"
+"AufU3nRsShZejXdt9XeC5i6cXUyZhH5X14TUdTrSGCTf"
+"89aqoF3rZcvPhTNMLMJgTRFoJAvtWXoRyFCaz6LotLoV"
+"3VPkSfCsEJSEygWWVRNFqGmAfeUqso2MpB27ZUeo2vEs"
+"3am1DjAPSKkoZrQyHkxjJqHFmFJ4zdjNqGtvaZRttvVU"
+"HnRSdFqojwZUh1hiFjMP87KZBAHFK4KRLEh1qSzhmhni"
+"Fgipj8gETxrCmNAtx2Cu96RHPj8rdzPfWmQ7N6fkfGMj"
+"Bz1Z4opxsJdjgoUarYqaymk7jMj886W7NyaxZxypYiNR"
+"HAHisc3bxeCHSpsN29awvhE8Bc326R2jQG6WTkxS8bVo"
+"2HrR57Yz8v5wBog3bAAyfhhoY31U8mZTWT1PikarmLPs"
+"2TDd4MUZGBZ8ZkbM66EZNSHDxM3DjXtQKXCGhiSwur1Y"
+"DJToC2dptgjC5bgmhVKs7L6wimsiy2rqjkwDPybhrTyh"
+"26VpRR6LYnR1fxkt58h48uYHvkj2HY9wAvnjesBqy3Qx"
+"7gHP5pNuZPsEjdb6BLhG2DnbrzMrcgH9smXsR67oNH5Y"
+"Fgpd5mVpsu1MasDdAgn1TStURKTBjjTUBwY3n1mXkvmq"
+"D6KrzR76tQ2eURg47cAEVb2r22NEBpRBib2ewrApxHvG"
+"98NbwHpTXH6cNmS81rkao7opaQcc39nkay2wLeBc9YKV"
+"2vVhayxcbxP7SFtrar613rycA5bLkgVXXAtKwykZhLcQ"
+"6DBGZ5iizWriQGwgG2gR2SPrn6yeVLfisJNj91Pf2Rdx"
+"Fp6oF7efgpgCpzycsSq7ux4M2rNPPp9LyjHrk7aUvWhP"
+"9b6T1fmyGfdanEDj74ccPrxdfFGe65Ui5KgJek1tHmAn"
+"AMv3rKSGRtALogskeRtkssgv3st8tSGH5YzKRur83w1X"
+"Gg41gX36SAczx11o7tGEFs4TvghQx3eZBVBpptc2oh9U"
+"AecNfbQ9p7Ce51MxaeKSTPS6GJwnCftaQEYN8GcYr5YY"
+"EvnasbWpNrzzRxSCfWBPmiabvM8zgxdKHP6rMxMqpRV8"
+"65bJ3X2DGMGxCrPWTdhCAz4DeWQJc8yQHSefxeEB6Nxo"
+"HkrnUeZEbBEr44xz8qLk6CMeWzH6tJSgkPs6uCdQaf8e"
+"aCyy3boV5tiNVv6EfNaW3tQi3viR3igDREevYz6ZB8T"
+"A2DuvQ7u9pCyFtRfTUgbabhrvitMxjNN7u6hZHyAfNqV"
+"H8hV1CZen2sBssAEYkE3iSkaYZaHS86z6fiTNVU9hgov"
+"6R8ES9BSAGDny9cSD5TMF3YkDE3zZJtQjAFdEZibef7T"
+"4gU4UWSZQwZAKQvSGw2jkMoWqpdN99UYX9p86RA11LEs"
+"6pxCaEpieYdrgToQQrqJz2DuHBjakv4gRhZ2kb9VuE5C"
+"296rKKjpu11qGTr5bNPwHxyW4LAHHYF8V44VmwaoJU5W"
+"AeJ2v4astM5yd9Gpr7xsX3QLcQHYCvAAPuwBsJ6pNdUW"
+"7Lxc3sxVBqEHz4GTXA45em1qZYtx5JrHGEjBFYAxpzWy"
+"Fgyt5ehUyjMgpUcti29GxmpTMSxDhUXMCR14wznUFbzg"
+"26TKapdLEenuo1BZYTdQDGGTH9QVi74fkmby2c95ksGh"
+"4K6kwK4wvxy89e3jNt5KxPYbrMqGhNUbmEhBKut1rTUM"
+"65MfB7gsJip3EHRhEkGwiR8tU5mk5Xtq4yYjVuohuWY4"
+"H29ZmRZ9S5wMKwbWVS1q15XdJUHt3yuvhEuk47mF1MPr"
+"GFpywDnK86w6WXZV9Vby3yY3iArvftfhSZNVDyPtyHUx"
+"EMfmJiHESXBrWHcQEdAsjJEZLBaSHFrxbPQ1rvp6kyAL"
+"DRb45jCL6ugV9BPboC9QtYbvMhgtciYsvT9ASq9Qgz1Z"
+"mTbsWAYmhqQc8WR2Tu9k1mCyUrg9JynDSGNrtccveaZ"
+"3uS1qBitUqRfbptztYwQFh7PaTCQeGnB4ieuDuwS2A5g"
+"647y1ymdq5wQkKp9Ue7bbJSW3kSVmLK5NYmtXwQgDqHn"
+"BeSw4wtiCMgX7s8QbUpQexJBYS9AcTTw57aEVEB1dc1u"
+"3XnNLS7vGFAtZFRuEChu7HpNa9edW4xZWaR1iTg2WWVz"
+"Dg12VpjNhX8yi4arjsYXcNPwSjad256W2Qb9JjWuhXqG"
+"Cdrwhhkh1e17NMvHsyczd3QEoRT66tTDfL2fqSfcqf8B"
+"BS3RqbDYYQHSaoTqndE4qeZ7B9ikYzQx6RNZfRsspNPa"
+"2TeLW5FMXPZM2wpQ4jj7chDfoogAed47bmXUhwfRknch"
+"3MGB3LvkvX1iEDNeadCgZPZKvWDNpQVzhit6HWhpwUhE"
+"AGgHDAjmoNVWxmUxWJ1At51hyhZkbUANwg4Ww2aYaGKd"
+"ESHviwtzS6HquafqosQBxrwY9d6yPjHX236BPp4YMWsH"
+"59gVPRTcoHtCGi8L9iBRqmrPSuLiFmavBjKG4e7cj5JB"
+"6FhR3PjufuCZMTDNCB61QqTYwLscqqhBHJA3awEFddcp"
+"uAEjobkjvrd69r3sa24VZqZC6XyFLCcRzo37aMeguXN"
+"EPAMzwMriyX6cgyuTfAey3tUddv8hWjTiR892V3RQw9P"
+"9zm6eePCbiT2zftRSwPp8AtVNAibdS5KTcXnCpBgh9dj"
+"CbywFktqe6bbTG95Bo6fRFcVWbvwsGcv8t4pVw1inkvx"
+"A93rU9v9LQM3weY3DHc5sbWkDWxX9gHR2evzqTWuNnAQ"
+"Cfqmh9PEnrwNejgmVjm1pYpG5XJo7ja3dKxrsYugr4YZ"
+"AGaxa5S9EsSrYzAzNY5D6FgE6T2pgRRUaWWTu3vakdH2"
+"Fya41zwPkELFSfL1eQtjHxt2Nmfm35htRwAE5UUtqAkw"
+"BKnYnjpJdegA7VsjEtmizFc28HqUrtwFRxYnui6xQf8g"
+"8RTbXgeK3w3N6zdF216diAPtTfuEEppGaAssZmH52WxG"
+"9MkHcrELBii9FcB4CoAh8SnzCFDyHV4HyNqLcoVVx5NE"
+"8g4AWZNEsq2MT7X9FaKqxFCVg2sEiiDA3Dj5JFHvN8GZ"
+"4D4Q4LY7jv3mtdf8EJFgjxWBpVSL9MRtM5RfEyL1TucT"
+"H2YMzY3XYK61mUoGXz8ZX7TMjo7NDUybg71cXtTttnFT"
+"CVCNqS57yQRUuEpcXCinPwNZxGrZkmF4SceVxWvT1CjN"
+"99g6i2931bXYfwfrZTB84KTo4LpCvU3LVnJrUoRep5qv"
+"34mC3tuP1ChUZAAhgSucY9mczP6yYbauLsfwjE7LFVSG"
+"7G1Yr9Y6rFnVWfYF8S8aLFakmH2fxkEVz8LUYgirz3y1"
+"9VrLZwMiC89noBeoWo9e2hDVWzrw2JeghKMxEjaZR26g"
+"J6BqTeum6vZxyDWqNysXGnS9aqV6chEubUg48XqAkERV"
+"FSZg4sNQCKEM4bmEoGrG2BdkCnjNjZCfRwPFC2YrB2s"
+"EKGWMuZNFYLvp8ayvJKLM4a5xbjkFhaXCnkL25gY3f5g"
+"FWh4vYQU3XZ7AYiXGP1mKsvV6kzJUhnqCfUJq5JuJsbQ"
+"Cz2b83m7YGTfvdWU5fnV9McBVuQjnQWENzfFPK4wg1CJ"
+"3rQ7RBHjBbrEuj5CrCktkbydPmr2zkmj7HfnFAmS7upg"
+"BZj5RrmzXGcafoQ2mYbaUGDm9MpBaVjAZxKMoCeEoErT"
+"8STyS1Egw2PoXZmRsV9umhYJgpiqevAXgYq8uL8TxPwf"
+"DLL1ZyyheZyVzs8PAV2uPCaPnjeY2hBPDVUrqX2KmwaN"
+"7HXtUSgK1ZFQKdWhpE24PyMhJWtFeeqvapUgpZ4djU1a"
+"CNEf8BXmEoiks9sdANQ5CVZ2SFmo4PNp7Tx3smbypkwB"
+"7b6eJ18bgdWscaxW2rLjNBYwdmDhmsN2az5DtatjoA1V"
+"6Uh4S99bmFpefn55RQy9nVK2PLERbKFcss5JQpbdV2sE"
+"5v18n2aWcx61vimETAEramRJ6hW5rBsiSYMUB51LcR8u"
+"9oB5FsWS8rrSBC7XFDSdcVKDwD3SNADMx4YjNf6XJcuM"
+"DbLsvrgUq1ySc9KsanJebmpdzDKXrttUS3tK2bKfLZS4"
+"43aaev4qUajoQorF3cXxgLzjSpH1i2jfV1bbsjxPD4e5"
+"2muZL3vSh24gycGdyzHW5otGEY74c3oPH8bsmYkMeF6T"
+"8oG11wLAW2PwuzQ6LcZ1xTbQ4KecaJfomDgfbxKsRwgE"
+"DrtJZ5V3JyoT2Hj9zqGvqkHPFMMxB5rUsuMwN6Bj3k9q"
+"EbwC1fEnfPjtPth8ZtEGDW8ZrndrTBYomdtwFiTJPU8j"
+"2qkY8pMruaKYSnEBA6RsFEga8uhdQNSQzfWxhLqfnsGJ"
+"ANWe93q4BpisAbSckE1LEq9owoQidpzMffGTUPtD6zuP"
+"Gtx22daAGeacVaLSLiQ1DZowVLAGe2yW6J9xyEiPGapL"
+"6HHUJkZN4YTwPjso32sXp6C8fo7PcPp8bCz5xMFzzpXC"
+"824wUz4TsYCURNW1PPjdcaY9o9J5VKLG1DtGQeDh1JiN"
+"CF39RYkcPXSfikT89NcqK85aJKhQwk4yPMvL8znSuysD"
+"6dmBhijdA54fiaJnSXa8V64NXtFP1cd95w2Yk8k7Bq8x"
+"Cg9hYSMEb3okq7HHdW86xsJeuvk1kGDbsiHhZ6gpcdqi"
+"7AA64iggMMesd8WcUQtfufv8vYqHdGiGJnzpnb9pdhjg"
+"HU3BeSuEH7PmYHXXn6VwgVCggArrZJMritM6ZhxoVv2d"
+"4UdDc8CvXn79tS2UZs5uSrdQZQPn5ccHK7eFZzbLJB1A"
+"8k1WnXRJoMPBZaNpLZcFjTAqDRYH6Mb1Jd7AgZAYnoQS"
+"ESuBqwsgCQ65mL5oKXpThqbTgeT5FUMtj3CRtixrg3eW"
+"CGHUcnunUwTLqfoYUKDKhJh6LAiGww2uyVFcofNRbuq6"
+"BFLkV6hC3ELrfgy55apmuhHupwC6SPECWmSjPGrdjPRH"
+"A63sr93zWE6t3y6GtVBPsqStS3EkoyPo72RSTr2b5QNV"
+"2VM32wLrHJHAWDn9mnzo8VpJ1USJYBS9JUmbvMhLAz5H"
+"29bWiigLg8xCRynzkCcmPHrkew6yiL1KabSkraseQpL9"
+"EpGedZY4iiKzABjHjBUv9k5s5oLYECKsYjWRyxpvmZvg"
+"AYcifHm9CwuLokh4aBhNmbdGRwS2kYwrsRYzX8YA7N23"
+"2XxnQQBE7RcnW5bkKpRrGNcr8ED3UL15fSySztRVcZGz"
+"AFEZJpeTDVSqqzJyRBFy7djgYzJP77j34dGNMyELDivv"
+"RQ9pm9H52xArHyjw7X1sjPSkFEYHWnGPLqEC4U1wa1t"
+"5ycD6Ec79yTnHUpmq89GcTxTLhf6FbyBC4ZZicuiPLTN"
+"FdRn3T4xHiu9z2T8uG6sVpETTajKnpTEjfDEckZwxE8L"
+"8TvuS7UJGo9V5nbqvWBcRvKEyPJUQ2au7d3dWeVTsXSz"
+"AcaheBFxqe3pTw5dsmb3W4ijRs92iqndakgR4Rosb4rh"
+"8VaZLjcL7xRiDsthjWCiBSDAoEdyxHgSHMxZsaTcryta"
+"EKqCMTwTHh8VghLMJsnWu1XgvzYceWKDWNYaPShPLveC"
+"837ZejSjEmarp3hLGGGtEPaacALjdNxyjfww9nPioxcG"
+"BBBnshFnxwJSxcDkePDkWsRyXyNYpfTWJaNTNuouiFp4"
+"8zXtGVmHKyRp6qedTHBgBesp7gP63DapF14ecWVzWyCB"
+"DqU4Cez9Ax7AvKHCmztWsGUV6MpHt1XAPUnPXLduPxfE"
+"D6FMVdtT6A5fSF53FNaq9dAgZVxh1SWq9MpLf9Gbrdh7"
+"BKrj91uwqc2kJ9ANGeXdeVqWqFABT9rkHC2oYu9jJphu"
+"3UioXcQ4EbwZcofm4Jfbn8zHT3eenvUkFM5Lz2skc7LF"
+"2YVwXg3xjvV3QrXf4oyrh4m7T72icMuMTpoo646BvBdY"
+"AcyFeNHF5afTF6J1HHsV9376Ceyv5xh3rwsJGqW7fWnb"
+"2LECcq5tqPyM86XrtQzgaBXLEoHy3SadvPPXLiZ8oKsR"
+"7CN3egUo7QCBf8Rc473Df2vLK9uRtbE7YLw6eZMvWyrv"
+"DCp6sfcUEdHkaqp4jhBPfnFLpTQd8pMJ9smahkUn9VPp"
+"EUb4YV5qL31RnrZ2DhfM72uJzqLtdJJjyxvboLbowvwR"
+"H2726Q5SA49mJhJW6GYXZxb6Zdm3EY32ZK4qLEdUsmR2"
+"HjrMf5YNfmoiqqea9YK5k7n74zb8kcTUopf9M6b5DXXM"
+"4qwE9UMfPYgR7JbMcWRaH2oYdsJdA7Dh5JeFR8zRkWCN"
+"pyTrxaJCKPSH4y97KUJTYF8JUcLGGBkSzoxLGnM3tWQ"
+"FNibCepGQ3Ua4bAJ9C9gPNVWYCRU6zTXXYisdqgrGrJD"
+"8qFxzdkq2KVqJyEvhREkb6aZarRGSk278VYUHkf91o51"
+"2927FbPNMahJDf9UhncA1y4wGyMLXMfxHyQrpHfRAqcX"
+"58AhvAevaHaiieU25AzuNte6fA36JUv6JmbESGLnCvNG"
+"35sFLtscL6KTtdNVfYecowVmShJrvoj9JTyVqsWBvoGy"
+"6ZPrvvMX7rbgPmDN2So73Zur6jEG2uQgmsHnPzj9Ci4J"
+"zYayVMDPXJq1FcqF6n7e9Kg7yvBKtjx8DdcovqJ9qir"
+"E16D2Kz31DHFg5CKGk5AMkdb3RiUKquQwN5Xeg3azGZk"
+"GFFwfGWB9vMbrhYacKVHmQMzhbWQ4dCQszMs4eX95jJF"
+"6kuLTStMZn631Nyp2DaLK6cSqJ5ti9HvqbGsWVLSRubW"
+"5qnG4HVGYyynJHNx1BUceLny7epY2RahU4ddx36WjLed"
+"GnjQF1HB8JaCwV6wZf7HxzVHgtLf6NoXtnBBBJyWhWKi"
+"ERghbpGX7UkVcey35PmA1cgSkQNZPen3Q5Q8Yd1TQsWZ"
+"89aRsFaRwwXF87fG5eEXoFWxz9FZVetMEpFeb9dWuqVM"
+"5KkNqeGRtpwZPwsmGTrzve3G53jEDeBWL36Pg2LYeZX8"
+"BcgC9y4grVNtWL1wveaJkvSKTkGpXynTogTVWfLSd7tB"
+"AqrygxSRX6wdrvRsEgA1QkqWb1VzqariqYJV67QBhBkt"
+"9c32ZhDD2zDZAbdNETT5zagJ7tpmH1qj4Qh2YQNyQmX3"
+"FU1kaAHnQ3tPPRMZXfaqPiYjAe46aqqddurGjCsdADwd"
+"Fb4LweGZT7faSGRka7XUKLqZzyGzSxS9c7Yj1ndEtPuP"
+"68rmB4bXYgEn77o9VfGaDrv5rsJ3oKJ3Vp41LHMHVok1"
+"FtitZtSgbQxVr2dnru8wNm7bmCmDwfCretCEsWEvRXm4"
+"9aez8kptrg3Ab2WMx7G1hVCvL7VMmx3eZqQiZ7wsJ8vU"
+"BXi7B6eF957aEZzvC7yuVwoskNxPz5guNhG73HF2jAKg"
+"9HCjETxLm6QzKi14pcVW4nQj8VUYcbb8NU2sEhSKnXwM"
+"6E5L2VWdarNw6ghmUJUdJTBVGC3TdnpjUdMhYtEvxaY3"
+"4Pxb97q1XwW2uUSBoWcsvDe8w4L9qWx3e1baqTQqysac"
+"67ocwkNgnzFEHvTaP4cdniPqwv1GBJEo7Qg3v519vPYJ"
+"CF7qGBFxms9MVH1hfNaJcC3LGgdXdHo9Nt1PSbXvBpuJ"
+"CYS6PXhwfm9m2QJQxGCbcRQC2e2i5mgPzWtHrmC9geBd"
+"BdcFhYGsE8HuwitoBixkdYhLitM3VzB2m6dPnJK7jhGX"
+"5yrCsj3twcknVXncnPPFZ76beCnQ5GP9B69dGWSr4rFk"
+"E81XYAhxnMBjAZAfdVr8sd6UvAYe2Kq65fXtJwLdh67D"
+"cyG4bDnutfJh9gChCgn3LEiXinYnqrTxjUxmFHL781t"
+"DwDvSwhpg2CB7wjEBvFBTsAxCR666LHMrcg5PYsCN8E3"
+"7eYNwjdXQheb6VGxryvmz3NuhUPkPJ4cJHqtPghRzsQM"
+"33CSWd6bru3BzuQv5Cs5EGjrhBzX8gS6kq94ErpAZvdd"
+"6E9kWUpFdhr56es5ryeXnPszmR9uYUhoiEBUBrhnnKzU"
+"5FNNz2rufCWAx58Qog1LYZghXLXky3dCoVVVm94yJWS8"
diff --git a/cmd/servicetester/secret b/cmd/servicetester/secret
new file mode 100755
index 0000000..0bb82cd
--- /dev/null
+++ b/cmd/servicetester/secret
@@ -0,0 +1,10 @@
+#!/bin/bash
+beneficiaryID="GisugaBj3LrtJ5eF1aRB13uxBt6SfGk4wErzLFaKKfZL"
+
+while IFS= read -r line; do
+    (curl -s -X POST http://localhost:5556/v1/order/secret -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$line,\"beneficiaryIDDocumentCID\":\"$beneficiaryID\"}") &
+done < "refs"
+
+
+
+
diff --git a/cmd/servicetester/secret4 b/cmd/servicetester/secret4
new file mode 100755
index 0000000..a16dfff
--- /dev/null
+++ b/cmd/servicetester/secret4
@@ -0,0 +1,10 @@
+#!/bin/bash
+beneficiaryID="5m4iJRCRzcMySHFXgAPB1gyfBvHgomwEpWDpZRHayPyP"
+
+while IFS= read -r line; do
+curl -s -X POST http://localhost:8556/v1/order/secret -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$line,\"beneficiaryIDDocumentCID\":\"$beneficiaryID\"}"
+done < "refs4"
+
+
+
+
diff --git a/libs/documents/docs.go b/libs/documents/docs.go
index 1949af5..9ef77a1 100644
--- a/libs/documents/docs.go
+++ b/libs/documents/docs.go
@@ -21,6 +21,8 @@
 package documents
 
 import (
+	"sync"
+
 	"github.com/gogo/protobuf/proto"
 	"github.com/pkg/errors"
 )
@@ -31,6 +33,7 @@
 var (
 	//EnvelopeVersion the versioning of the entire Envelope, (not individual documents/contents)
 	EnvelopeVersion float32 = 1.0
+	mutex                   = &sync.Mutex{}
 )
 
 //IDDoc wrapper to encapsulate Header & IDDocument into one object
@@ -166,6 +169,7 @@
 		}
 
 		decryptedCipherText, err := aesDecrypt(envelope.EncryptedBody, header.EncryptedBodyIV, aesKey)
+
 		if err != nil {
 			return &Header{}, errors.Wrap(err, "Failed to AES Decrypt Envelope cipherText")
 		}
diff --git a/pkg/tendermint/connector.go b/pkg/tendermint/connector.go
index 5bba07b..d17a0d2 100644
--- a/pkg/tendermint/connector.go
+++ b/pkg/tendermint/connector.go
@@ -172,7 +172,6 @@
 	}
 
 	nc.loadMissingHistory(currentBlockHeight, processedTo, processFn)
-	// TODO: load historicTX
 
 	// Process events
 	return nc.processTXQueue(ctx, txQueue, processFn)
@@ -212,15 +211,20 @@
 	}
 
 	currentPage := 1
-	query := fmt.Sprintf("tag.recipient='%v' AND tag.sender='%v' AND tx.height>=%d AND tx.height<=%d", nc.nodeID, nc.nodeID, processedToHeight, currentBlockHeight)
+	query := fmt.Sprintf("tag.recipient='%v' AND tx.height>=%v AND tx.height<=%v", nc.nodeID, processedToHeight, currentBlockHeight)
 	numPerPage := 5
-
+	processedCount := 1
 	for {
 		result, err := tmHistoryClient.TxSearch(query, true, currentPage, numPerPage)
 		if err != nil {
 			return errors.Wrapf(err, "Failed to subscribe to query %s", query)
 		}
 
+		//skip over any previously processed
+
+		totalCount := result.TotalCount
+		totalToProcess := totalCount - int(processedToIndex)
+
 		for _, chainTx := range result.Txs {
 
 			tx := chainTx.Tx
@@ -235,33 +239,51 @@
 			payload.Height = chainTx.Height
 
 			//processedTo check
-			if payload.Height < processedToHeight {
+
+			if processedToHeight == payload.Height && processedToIndex >= payload.Index {
+				//We have already processed this before
+				msg := fmt.Sprintf("[%v/%v] HISTORY %s Block:%v Index:%v", processedCount, totalCount, color.BlueString("ALREADY PROCESSED"), chainTx.Height, chainTx.Index)
+				nc.log.Info(msg)
+				processedCount++
 				continue
+
 			}
-			if payload.Height == processedToHeight && payload.Index <= processedToIndex {
-				continue
-			}
+			// if processedToHeight == payload.Height && payload.Index == 0 {
+			// 	totalCount = totalCount - int(processedToIndex)
+			// }
+
+			// if processedToHeight > payload.Height {
+			// 	continue
+			// }
+
+			// if processedToHeight == payload.Height && processedToIndex > payload.Index {
+			// 	continue
+			// }
 
 			//Dont queue just process directly
 
 			if err := processFn(payload); err != nil {
-				msg := fmt.Sprintf("HISTORY %s Block:%v Index:%v Error:%v", color.RedString("FAILURE"), chainTx.Height, chainTx.Index, err)
+				msg := fmt.Sprintf("[%v/%v] HISTORY %s Block:%v Index:%v Error:%v", processedCount, totalCount, color.RedString("FAILURE"), chainTx.Height, chainTx.Index, err)
 				nc.log.Info(msg)
 			} else {
-				msg := fmt.Sprintf("HISTORY %s Block:%v Index:%v", color.GreenString("PROCESSED"), chainTx.Height, chainTx.Index)
+				msg := fmt.Sprintf("[%v/%v] HISTORY %s Block:%v Index:%v", processedCount, totalCount, color.GreenString("PROCESSED"), chainTx.Height, chainTx.Index)
 				nc.log.Info(msg)
 			}
+			processedCount++
 
 			if err := nc.updateProcessedUpToHeight(chainTx.Height, chainTx.Index); err != nil {
 				return err
 			}
+			processedToHeight = chainTx.Height
+			processedToIndex = chainTx.Index
 
 		}
-		if currentPage*numPerPage > result.TotalCount {
+		if processedCount == totalToProcess {
 			break
 		}
 		currentPage++
 	}
+	nc.log.Info("Process history complete")
 	return nil
 }
 
@@ -312,17 +334,21 @@
 	for {
 		select {
 		case chainTx := <-txQueue:
-
-			if err := processFn(chainTx); err != nil {
-				msg := fmt.Sprintf("TX %s Block:%v Index:%v Error:%v", color.RedString("FAILURE"), chainTx.Height, chainTx.Index, err)
-				nc.log.Info(msg)
-			} else {
-				msg := fmt.Sprintf("TX %s Block:%v Index:%v Type:%v", color.GreenString("PROCESSED"), chainTx.Height, chainTx.Index, chainTx.Processor)
-				nc.log.Info(msg)
-			}
-			if err := nc.updateProcessedUpToHeight(chainTx.Height, chainTx.Index); err != nil {
-				return err
-			}
+			//nc.log.Info(("incoming tx"))
+			go func() error {
+				if err := processFn(chainTx); err != nil {
+					msg := fmt.Sprintf("TX %s Block:%v Index:%v Error:%v", color.RedString("FAILURE"), chainTx.Height, chainTx.Index, err)
+					nc.log.Info(msg)
+				} else {
+					orderRef := chainTx.Tags["reference"]
+					msg := fmt.Sprintf("TX %s Block:%v Index:%v Type:%v Ref:%v", color.GreenString("PROCESSED"), chainTx.Height, chainTx.Index, chainTx.Processor, orderRef)
+					nc.log.Info(msg)
+				}
+				if err := nc.updateProcessedUpToHeight(chainTx.Height, chainTx.Index); err != nil {
+					return err
+				}
+				return nil
+			}()
 
 			// TODO: store the last block height
 		case <-ctx.Done():
diff --git a/r4 b/r4
new file mode 100755
index 0000000..6470df2
--- /dev/null
+++ b/r4
@@ -0,0 +1,5 @@
+GO111MODULE=on go build -o target/milagro github.com/apache/incubator-milagro-dta/cmd/service
+export MILAGRO_HOME=~/.milagro4
+target/milagro daemon
+
+