This is an automated email from the ASF dual-hosted git repository.

cmorris pushed a commit to branch splitroles-blockchain
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git

commit b9f63d36990400fbb4d40b1d3c413af3d1f71d08
Author: Christopher Morris <[email protected]>
AuthorDate: Thu Sep 5 20:37:16 2019 +0100

    Split Order to Async, Add websockets
---
 cmd/service/main.go               |  41 ++++++++++
 go.mod                            |   7 +-
 go.sum                            |  40 ++++++++++
 pkg/api/proto.go                  |  16 ++++
 pkg/defaultservice/fulfill.go     |  36 ++++++---
 pkg/defaultservice/order.go       | 158 ++++++++++++++++++++++++++++++++++++++
 pkg/endpoints/endpoints.go        |  57 ++++++++++++++
 pkg/service/service.go            |   6 +-
 pkg/tendermint/json.go            |  35 +++++++++
 pkg/tendermint/tendermint.go      | 144 ++++++++++++++++++++++++++++++++++
 pkg/tendermint/tendermint_test.go |  61 +++++++++++++++
 11 files changed, 587 insertions(+), 14 deletions(-)

diff --git a/cmd/service/main.go b/cmd/service/main.go
index 4a289f5..e177b38 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -21,6 +21,7 @@ Package main - handles config, initialisation and starts the 
service daemon
 package main
 
 import (
+       "context"
        "crypto/rand"
        "fmt"
        "net/http"
@@ -42,6 +43,11 @@ import (
        "github.com/pkg/errors"
        stdprometheus "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/promhttp"
+
+       log2 "github.com/tendermint/tendermint/libs/log"
+       tmclient "github.com/tendermint/tendermint/rpc/client"
+       tmtypes "github.com/tendermint/tendermint/types"
+       "github.com/tendermint/tmlibs/log"
 )
 
 func initConfig(args []string) error {
@@ -278,6 +284,7 @@ func initDataStore(ds string) (*datastore.Store, error) {
 
 func main() {
        var err error
+       go listenTendermint()
        cmd, args := parseCommand()
        switch cmd {
        default:
@@ -293,3 +300,37 @@ func main() {
                os.Exit(1)
        }
 }
+
+func connectTendermintWS() {
+
+       logger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
+
+       client := tmclient.NewHTTP("tcp://localhost:26657", "/websocket")
+       client.SetLogger(logger)
+       err := client.Start()
+       if err != nil {
+               logger.Error("Failed to start a client", "err", err)
+               os.Exit(1)
+       }
+       defer client.Stop()
+
+       query := "tm.event = 'Tx'"
+       out, err := client.Subscribe(context.Background(), "test", query, 1000)
+       if err != nil {
+               logger.Error("Failed to subscribe to query", "err", err, 
"query", query)
+               os.Exit(1)
+       }
+
+       quit := make(chan os.Signal, 1)
+       signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
+
+       for {
+               select {
+               case result := <-out:
+                       logger.Info("got tx",
+                               "index", 
result.Data.(tmtypes.EventDataTx).Index)
+               case <-quit:
+                       os.Exit(0)
+               }
+       }
+}
diff --git a/go.mod b/go.mod
index c7b5ff0..b0e50bd 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,6 @@
 module github.com/apache/incubator-milagro-dta
 
 require (
-       github.com/VividCortex/gohistogram v1.0.0 // indirect
        github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17
        github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
        github.com/coreos/go-oidc v2.0.0+incompatible
@@ -11,7 +10,7 @@ require (
        github.com/go-test/deep v1.0.2
        github.com/go-yaml/yaml v2.1.0+incompatible
        github.com/gogo/protobuf v1.2.1
-       github.com/golang/protobuf v1.3.1
+       github.com/golang/protobuf v1.3.2
        github.com/google/uuid v1.1.1
        github.com/gorilla/mux v1.7.3
        github.com/ipfs/go-datastore v0.0.5
@@ -30,9 +29,11 @@ require (
        github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // 
indirect
        github.com/prometheus/client_golang v0.9.3
        github.com/stretchr/testify v1.3.0
+       github.com/tendermint/tendermint v0.32.3
+       github.com/tendermint/tmlibs v0.9.0
        github.com/tyler-smith/go-bip39 v1.0.0
        go.etcd.io/bbolt v1.3.3
-       google.golang.org/appengine v1.4.0 // indirect
+       golang.org/x/xerrors v0.0.0-20190528162220-0421b64034aa
        gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
        gopkg.in/go-playground/validator.v9 v9.29.1
        gopkg.in/square/go-jose.v2 v2.3.1 // indirect
diff --git a/go.sum b/go.sum
index 95517ec..dccddba 100644
--- a/go.sum
+++ b/go.sum
@@ -25,10 +25,12 @@ github.com/bifurcation/mint 
v0.0.0-20181105073638-824af6541065/go.mod h1:zVt7zX3
 github.com/blang/semver v3.5.1+incompatible/go.mod 
h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d 
h1:QgeLLoPD3kRVmeu/1al9iIpIANMi9O1zXFm8BnYGCJg=
 github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d/go.mod 
h1:Jbj8eKecMNwf0KFI75skSUZqMB4UCRcndUScVBTWyUI=
+github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod 
h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0=
 github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod 
h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
 github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17 
h1:m0N5Vg5nP3zEz8TREZpwX3gt4Biw3/8fbIf4A3hO96g=
 github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17/go.mod 
h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod 
h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod 
h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
 github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod 
h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
 github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d 
h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
 github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod 
h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
@@ -67,14 +69,17 @@ github.com/dgryski/go-farm 
v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod 
h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dustin/go-humanize v1.0.0/go.mod 
h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod 
h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE=
+github.com/etcd-io/bbolt v1.3.3/go.mod 
h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod 
h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
 github.com/fatih/color v1.6.0/go.mod 
h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.7.0/go.mod 
h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fd/go-nat v1.0.0/go.mod 
h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E=
+github.com/fortytw2/leaktest v1.2.0/go.mod 
h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod 
h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
 github.com/go-critic/go-critic v0.0.0-20181204210945-c3db6069acc5/go.mod 
h1:Jc75BZJv2dNy7opKH6bF29VveDQHfGZ6Asn/3phBesg=
 github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead/go.mod 
h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
+github.com/go-kit/kit v0.6.0/go.mod 
h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
 github.com/go-kit/kit v0.8.0/go.mod 
h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-lintpack/lintpack v0.5.2/go.mod 
h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
@@ -111,8 +116,12 @@ github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.0/go.mod 
h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 github.com/golang/protobuf v1.3.1 
h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 github.com/golang/protobuf v1.3.1/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2 
h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
+github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db 
h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod 
h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod 
h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod 
h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
 github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod 
h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
 github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6/go.mod 
h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
@@ -131,12 +140,14 @@ github.com/golangci/prealloc 
v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bz
 github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod 
h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
 github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod 
h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
 github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/gofuzz v1.0.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.0.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 github.com/google/uuid v1.1.1/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod 
h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
 github.com/gorilla/mux v1.7.3/go.mod 
h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v1.2.0/go.mod 
h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.0 
h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
 github.com/gorilla/websocket v1.4.0/go.mod 
h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gxed/go-shellwords v1.0.3/go.mod 
h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ=
@@ -280,6 +291,7 @@ github.com/jbenet/goprocess 
v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
 github.com/jbenet/goprocess v0.1.3 
h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10=
 github.com/jbenet/goprocess v0.1.3/go.mod 
h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
 github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod 
h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jmhodges/levigo v1.0.0/go.mod 
h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
 github.com/jonboulle/clockwork v0.1.0/go.mod 
h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/jrick/logrotate v1.0.0/go.mod 
h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod 
h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -546,6 +558,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod 
h1:/TN21ttK/J9q6uSwhBd54HahCDf
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod 
h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 
h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod 
h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod 
h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod 
h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0 
h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
@@ -556,7 +569,10 @@ github.com/prometheus/procfs 
v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z
 github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d 
h1:Z5QMcUKnQw7ouB1wDuyZM6TL/rm+brJcNk6Ai8ut3zM=
 github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d/go.mod 
h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/tsdb v0.7.1/go.mod 
h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 
h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod 
h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rogpeppe/go-internal v1.1.0/go.mod 
h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
 github.com/rs/cors v1.6.0/go.mod 
h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/russross/blackfriday v1.5.2/go.mod 
h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod 
h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
@@ -568,6 +584,7 @@ github.com/sirupsen/logrus v1.0.5/go.mod 
h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM
 github.com/sirupsen/logrus v1.2.0/go.mod 
h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod 
h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod 
h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
+github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod 
h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4=
 github.com/sourcegraph/go-diff v0.5.1/go.mod 
h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
 github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a 
h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek=
 github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod 
h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
@@ -580,12 +597,14 @@ github.com/spf13/afero v1.1.0/go.mod 
h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 github.com/spf13/afero v1.1.2/go.mod 
h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.2.0/go.mod 
h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
 github.com/spf13/cast v1.3.0/go.mod 
h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.1/go.mod 
h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.2/go.mod 
h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod 
h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod 
h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod 
h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.1/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.0.0/go.mod 
h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
 github.com/spf13/viper v1.0.2/go.mod 
h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
 github.com/spf13/viper v1.3.2/go.mod 
h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -595,6 +614,16 @@ github.com/stretchr/testify v1.3.0 
h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/syndtr/goleveldb v1.0.0 
h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 github.com/syndtr/goleveldb v1.0.0/go.mod 
h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 
h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod 
h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
+github.com/tendermint/go-amino v0.14.1 
h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk=
+github.com/tendermint/go-amino v0.14.1/go.mod 
h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
+github.com/tendermint/tendermint v0.32.3 
h1:GEnWpGQ795h5oTFNbfBLsY0LW/CW2j6p6HtiYNfxsgg=
+github.com/tendermint/tendermint v0.32.3/go.mod 
h1:ZK2c29jl1QRYznIRyRWRDsmm1yvtPzBRT00x4t1JToY=
+github.com/tendermint/tm-db v0.1.1 
h1:G3Xezy3sOk9+ekhjZ/kjArYIs1SmwV+1OUgNkj7RgV0=
+github.com/tendermint/tm-db v0.1.1/go.mod 
h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw=
+github.com/tendermint/tmlibs v0.9.0 
h1:3aU/D2v3aecqpODOuBXCfi950bHTefD5Pps5X3XuJDc=
+github.com/tendermint/tmlibs v0.9.0/go.mod 
h1:4L0tAKpLTioy14VnmbXYTLIJN0pCMiehxDMdN6zZfM8=
 github.com/texttheater/golang-levenshtein 
v0.0.0-20180516184445-d188e65d659e/go.mod 
h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
 github.com/tyler-smith/go-bip39 v1.0.0 
h1:FOHg9gaQLeBBRbHE/QrTLfEiBHy5pQ/yXzf9JG5pYFM=
 github.com/tyler-smith/go-bip39 v1.0.0/go.mod 
h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
@@ -665,6 +694,7 @@ golang.org/x/crypto 
v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -683,6 +713,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190522135303-fa69b94a3b58/go.mod 
h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859 
h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7 
h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be 
h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -725,16 +757,23 @@ golang.org/x/tools 
v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190420000508-685fecacd0a0/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522 
h1:bhOzK9QyoD0ogCnFro1m2mz41+Ib0oOhfJnBp5MR4K4=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190528162220-0421b64034aa 
h1:e+qzrOCx1B2Zjbv6p2uI91VZhrmjZD0Ck57LUzO5L8k=
+golang.org/x/xerrors v0.0.0-20190528162220-0421b64034aa/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0 
h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 
h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
+google.golang.org/grpc v1.22.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod 
h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod 
h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -755,6 +794,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod 
h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gotest.tools v2.1.0+incompatible/go.mod 
h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 gotest.tools/gotestsum v0.3.4/go.mod 
h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod 
h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod 
h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34/go.mod 
h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index 866911d..6232d21 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -27,6 +27,22 @@ import (
        "time"
 )
 
+const (
+       //OrderIn Types for the Blockchain
+       TXOrderRequest    = "v1/order1"
+       TXFulfillRequest  = "v1/fulfill/order"
+       TXFulfillResponse = "v1/order2"
+       TXOrderResponse   = "NONE"
+)
+
+//BlockChainTX - struct for on chain req/resp
+type BlockChainTX struct {
+       Processor   string
+       SenderID    string
+       RecipientID string
+       Payload     []byte
+}
+
 //CreateIdentityRequest -
 type CreateIdentityRequest struct {
        Name      string            `json:"name,omitempty" 
validate:"required,alphanum"`
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index a45eacb..e3b54d6 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -18,58 +18,74 @@
 package defaultservice
 
 import (
+       "encoding/json"
+
        "github.com/apache/incubator-milagro-dta/libs/cryptowallet"
        "github.com/apache/incubator-milagro-dta/pkg/api"
        "github.com/apache/incubator-milagro-dta/pkg/common"
+       "github.com/apache/incubator-milagro-dta/pkg/tendermint"
 )
 
 // FulfillOrder -
-func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) 
(*api.FulfillOrderResponse, error) {
+func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
        orderPart1CID := req.OrderPart1CID
        nodeID := s.NodeID()
        remoteIDDocCID := req.DocumentCID
        _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, remoteIDDocCID)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        //Retrieve the order from IPFS
        order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart1CID, 
sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        //Generate the secret and store for later redemption
        seed, err := common.MakeRandomSeedAndStore(s.Store, s.Rng, 
order.Reference)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        //Generate the Public Key (Commitment) from the Seed/Secret
        commitmentPublicKey, err := cryptowallet.RedeemPublicKey(seed)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
        //Create an order response in IPFS
        orderPart2CID, err := common.CreateAndStoreOrderPart2(s.Ipfs, s.Store, 
order, orderPart1CID, commitmentPublicKey, nodeID, recipientList)
        if err != nil {
-               return nil, err
+               return "", err
        }
 
-       return &api.FulfillOrderResponse{
+       response := &api.FulfillOrderResponse{
                OrderPart2CID: orderPart2CID,
-       }, nil
+       }
+
+       marshaledRequest, _ := json.Marshal(response)
+
+       //Write the requests to the chain
+       chainTX := &api.BlockChainTX{
+               Processor:   api.TXFulfillResponse,
+               SenderID:    nodeID,
+               RecipientID: s.MasterFiduciaryNodeID(),
+               Payload:     marshaledRequest,
+       }
+       //curl --data-binary 
'{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": 
{"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' 
http://localhost:26657
+       return tendermint.PostToChain(chainTX, "FulfillOrder")
+
 }
 
 // FulfillOrderSecret -
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 4326ba0..46dfb16 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -25,6 +25,7 @@ import (
        "github.com/apache/incubator-milagro-dta/libs/documents"
        "github.com/apache/incubator-milagro-dta/pkg/api"
        "github.com/apache/incubator-milagro-dta/pkg/common"
+       "github.com/apache/incubator-milagro-dta/pkg/tendermint"
        "github.com/pkg/errors"
 )
 
@@ -149,6 +150,7 @@ func (s *Service) Order(req *api.OrderRequest) 
(*api.OrderResponse, error) {
                OrderPart1CID: orderPart1CID,
                Extension:     fulfillExtension,
        }
+
        response, err := s.MasterFiduciaryServer.FulfillOrder(request)
        if err != nil {
                return nil, errors.Wrap(err, "Contacting Fiduciary")
@@ -279,3 +281,159 @@ func (s *Service) OrderSecret(req 
*api.OrderSecretRequest) (*api.OrderSecretResp
                Extension:      ext,
        }, nil
 }
+
+// Order -
+func (s *Service) Order1(req *api.OrderRequest) (string, error) {
+       if err := s.Plugin.ValidateOrderRequest(req); err != nil {
+               return "", err
+       }
+
+       //Initialise values from Request object
+       beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
+       iDDocID := s.NodeID()
+       recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, 
s.MasterFiduciaryNodeID())
+       if err != nil {
+               return "", err
+       }
+
+       // remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, 
s.MasterFiduciaryNodeID())
+       // if err != nil {
+       //      return "", err
+       // }
+
+       //Create Order
+       order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, 
iDDocID)
+       if err != nil {
+               return "", err
+       }
+
+       fulfillExtension, err := s.Plugin.PrepareOrderPart1(order, 
req.Extension)
+       if err != nil {
+               return "", err
+       }
+
+       //Write Order to IPFS
+       orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, 
iDDocID, order, recipientList)
+       if err != nil {
+               return "", err
+       }
+
+       //Fullfill the order on the remote Server
+       request := &api.FulfillOrderRequest{
+               DocumentCID:   iDDocID,
+               OrderPart1CID: orderPart1CID,
+               Extension:     fulfillExtension,
+       }
+
+       marshaledRequest, _ := json.Marshal(request)
+
+       //Write the requests to the chain
+       chainTX := &api.BlockChainTX{
+               Processor:   api.TXFulfillRequest,
+               SenderID:    iDDocID,
+               RecipientID: s.MasterFiduciaryNodeID(),
+               Payload:     marshaledRequest,
+       }
+       //curl --data-binary 
'{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": 
{"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' 
http://localhost:26657
+
+       return tendermint.PostToChain(chainTX, "Order1")
+
+}
+
+// Order -
+func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
+       // if err := s.Plugin.ValidateOrderRequest(req); err != nil {
+       //      return "", err
+       // }
+
+       // //Initialise values from Request object
+       // beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
+       iDDocID := s.NodeID()
+       // recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, 
s.MasterFiduciaryNodeID())
+       // if err != nil {
+       //      return "", err
+       // }
+
+       remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, 
s.MasterFiduciaryNodeID())
+       if err != nil {
+               return "", err
+       }
+
+       // //Create Order
+       // order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, 
iDDocID)
+       // if err != nil {
+       //      return "", err
+       // }
+
+       // fulfillExtension, err := s.Plugin.PrepareOrderPart1(order, 
req.Extension)
+       // if err != nil {
+       //      return "", err
+       // }
+
+       // //Write Order to IPFS
+       // orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, 
s.Store, iDDocID, order, recipientList)
+       // if err != nil {
+       //      return "", err
+       // }
+
+       // //Fullfill the order on the remote Server
+       // request := &api.FulfillOrderRequest{
+       //      DocumentCID:   iDDocID,
+       //      OrderPart1CID: orderPart1CID,
+       //      Extension:     fulfillExtension,
+       // }
+
+       // marshaledRequest, _ := json.Marshal(request)
+
+       // //Write the requests to the chain
+       // chainTX := &api.BlockChainTX{
+       //      Type:        api.TXFullfullRequest,
+       //      SenderID:    iDDocID,
+       //      RecipientID: s.MasterFiduciaryNodeID(),
+       //      Payload:     marshaledRequest,
+       // }
+       // //curl --data-binary 
'{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": 
{"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' 
http://localhost:26657
+
+       // tendermint.PostToChain(chainTX)
+
+       //  response, err := s.MasterFiduciaryServer.FulfillOrder(request)
+       //  if err != nil {
+       //      return "", errors.Wrap(err, "Contacting Fiduciary")
+       //  }
+
+       //Get the updated order out of IPFS
+       _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, iDDocID)
+       if err != nil {
+               return "", err
+       }
+       updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, 
req.OrderPart2CID, sikeSK, iDDocID, remoteIDDoc.BLSPublicKey)
+       if err != nil {
+               return "", errors.Wrap(err, "Fail to retrieve Order from IPFS")
+       }
+
+       commitment, extension, err := 
s.Plugin.PrepareOrderResponse(updatedOrder, req.Extension, req.Extension)
+       if err != nil {
+               return "", errors.Wrap(err, "Generating Final Public Key")
+       }
+
+       response := &api.OrderResponse{
+               OrderReference: updatedOrder.Reference,
+               Commitment:     commitment,
+               CreatedAt:      time.Now().Unix(),
+               Extension:      extension,
+       }
+
+       marshaledRequest, _ := json.Marshal(response)
+
+       //Write the requests to the chain
+       chainTX := &api.BlockChainTX{
+               Processor:   api.TXOrderResponse,
+               SenderID:    iDDocID,
+               RecipientID: s.MasterFiduciaryNodeID(),
+               Payload:     marshaledRequest,
+       }
+       //curl --data-binary 
'{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": 
{"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' 
http://localhost:26657
+
+       return tendermint.PostToChain(chainTX, "Order2")
+
+}
diff --git a/pkg/endpoints/endpoints.go b/pkg/endpoints/endpoints.go
index ae66d68..f42e01c 100644
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@ -107,6 +107,35 @@ func Endpoints(svc service.Service, corsAllow string, 
authorizer transport.Autho
                        //      ErrCreatingOrderDoc: 
http.StatusInternalServerError,
                        // },
                },
+               "Order1": {
+                       Path:        "/" + apiVersion + "/order1",
+                       Method:      http.MethodPost,
+                       Endpoint:    MakeOrder1Endpoint(svc),
+                       NewRequest:  func() interface{} { return 
&api.OrderRequest{} },
+                       NewResponse: func() interface{} { return 
&api.OrderResponse{} },
+                       Options: transport.ServerOptions(
+                               transport.SetCors(corsAllow),
+                               transport.AuthorizeOIDC(authorizer, false),
+                       ),
+                       ErrStatus: transport.ErrorStatus{
+                               transport.ErrInvalidRequest: 
http.StatusUnprocessableEntity,
+                       },
+               },
+               "Order2": {
+                       Path:        "/" + apiVersion + "/order2",
+                       Method:      http.MethodPost,
+                       Endpoint:    MakeOrder2Endpoint(svc),
+                       NewRequest:  func() interface{} { return 
&api.FulfillOrderResponse{} },
+                       NewResponse: func() interface{} { return 
&api.OrderResponse{} },
+                       Options: transport.ServerOptions(
+                               transport.SetCors(corsAllow),
+                               transport.AuthorizeOIDC(authorizer, false),
+                       ),
+                       ErrStatus: transport.ErrorStatus{
+                               transport.ErrInvalidRequest: 
http.StatusUnprocessableEntity,
+                       },
+               },
+
                "GetOrder": {
                        Path:        "/" + apiVersion + 
"/order/{OrderReference}",
                        Method:      http.MethodGet,
@@ -309,6 +338,34 @@ func MakeOrderEndpoint(m service.Service) 
endpoint.Endpoint {
        }
 }
 
+//MakeOrderEndpoint -
+func MakeOrder1Endpoint(m service.Service) endpoint.Endpoint {
+       return func(ctx context.Context, request interface{}) (response 
interface{}, err error) {
+               req, ok := request.(*api.OrderRequest)
+               if !ok {
+                       return nil, transport.ErrInvalidRequest
+               }
+               if err := validateRequest(req); err != nil {
+                       return "", err
+               }
+               return m.Order1(req)
+       }
+}
+
+//MakeOrderEndpoint -
+func MakeOrder2Endpoint(m service.Service) endpoint.Endpoint {
+       return func(ctx context.Context, request interface{}) (response 
interface{}, err error) {
+               req, ok := request.(*api.FulfillOrderResponse)
+               if !ok {
+                       return nil, transport.ErrInvalidRequest
+               }
+               if err := validateRequest(req); err != nil {
+                       return "", err
+               }
+               return m.Order2(req)
+       }
+}
+
 //MakeOrderSecretEndpoint -
 func MakeOrderSecretEndpoint(m service.Service) endpoint.Endpoint {
        return func(ctx context.Context, request interface{}) (response 
interface{}, err error) {
diff --git a/pkg/service/service.go b/pkg/service/service.go
index 9ec4093..d53e5f2 100644
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@ -37,8 +37,12 @@ type Service interface {
        OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResponse, 
error)
        Order(req *api.OrderRequest) (*api.OrderResponse, error)
 
+       Order1(req *api.OrderRequest) (string, error)
+       Order2(req *api.FulfillOrderResponse) (string, error)
+
        //Fullfill processing
-       FulfillOrder(req *api.FulfillOrderRequest) (*api.FulfillOrderResponse, 
error)
+       FulfillOrder(req *api.FulfillOrderRequest) (string, error)
+
        FulfillOrderSecret(req *api.FulfillOrderSecretRequest) 
(*api.FulfillOrderSecretResponse, error)
 
        NodeID() string
diff --git a/pkg/tendermint/json.go b/pkg/tendermint/json.go
new file mode 100644
index 0000000..8270db5
--- /dev/null
+++ b/pkg/tendermint/json.go
@@ -0,0 +1,35 @@
+// This file was generated from JSON Schema using quicktype, do not modify it 
directly.
+// To parse and unparse this JSON data, add this code to your project and do:
+//
+//    fetchTxResponse, err := UnmarshalFetchTxResponse(bytes)
+//    bytes, err = fetchTxResponse.Marshal()
+
+package tendermint
+
+import "encoding/json"
+
+func UnmarshalChainQuery(data []byte) (ChainQuery, error) {
+       var r ChainQuery
+       err := json.Unmarshal(data, &r)
+       return r, err
+}
+
+func (r *ChainQuery) Marshal() ([]byte, error) {
+       return json.Marshal(r)
+}
+
+type ChainQuery struct {
+       Jsonrpc string `json:"jsonrpc"`
+       ID      string `json:"id"`
+       Result  Result `json:"result"`
+}
+
+type Result struct {
+       Response Response `json:"response"`
+}
+
+type Response struct {
+       Log   string `json:"log"`
+       Key   string `json:"key"`
+       Value string `json:"value"`
+}
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
new file mode 100644
index 0000000..286f1da
--- /dev/null
+++ b/pkg/tendermint/tendermint.go
@@ -0,0 +1,144 @@
+package tendermint
+
+import (
+       "bufio"
+       "crypto/sha256"
+       "encoding/base64"
+       "encoding/hex"
+       "encoding/json"
+       "fmt"
+       "net/http"
+       "os"
+       "strings"
+
+       "github.com/apache/incubator-milagro-dta/pkg/api"
+)
+
+//QueryChain the blockchain for an index
+func QueryChain(index string) (string, string) {
+       url := "http://localhost:26657/abci_query?data=\""; + index + "\""
+       resp, err := http.Get(url)
+       if err != nil {
+               // handle err
+       }
+       defer resp.Body.Close()
+       scanner := bufio.NewScanner(resp.Body)
+       scanner.Split(bufio.ScanBytes)
+       t := ""
+       for scanner.Scan() {
+               t += scanner.Text()
+               ///fmt.Print(scanner.Text())
+       }
+
+       res, _ := UnmarshalChainQuery([]byte(t))
+
+       val := res.Result.Response.Value
+       decodeVal, _ := base64.StdEncoding.DecodeString(val)
+       return string(decodeVal), val
+}
+
+//PostToChain - send TX data to the Blockchain
+func PostToChain(payload *api.BlockChainTX, method string) (string, error) {
+       serializedTX, _ := json.Marshal(payload)
+       TXID := sha256.Sum256(serializedTX)
+       TXIDhex := hex.EncodeToString(TXID[:])
+       fullTx := fmt.Sprintf("%s=%s", TXIDhex, string(serializedTX))
+
+       fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
+       base64EncodedTX := base64.StdEncoding.EncodeToString([]byte(fullTx))
+       body := 
strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\":
 {\"tx\": \"" + base64EncodedTX + "\"}}")
+       req, err := http.NewRequest("POST", "http://localhost:26657";, body)
+       if err != nil {
+               print("Error posting to Blockchain")
+               return "", err
+       }
+       req.Header.Set("Content-Type", "text/plain;")
+
+       resp, err := http.DefaultClient.Do(req)
+       if err != nil {
+               print("Error posting to Blockchain")
+               return "", err
+       }
+       defer resp.Body.Close()
+       return TXIDhex, nil
+}
+
+//HandleChainTX -
+func HandleChainTX(myID string, tx string) error {
+       blockChainTX, err := decodeChainTX(tx)
+       if err != nil {
+               return err
+       }
+
+       if blockChainTX.Processor == "NONE" {
+               print("Process Complete")
+               print(string(blockChainTX.Payload))
+               return nil
+       }
+       err = callNextTX(blockChainTX)
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+//DecodeChainTX - Decode the On Chain TX into a BlockChainTX object
+func decodeChainTX(payload string) (*api.BlockChainTX, error) {
+       base64DecodedTX, _ := base64.StdEncoding.DecodeString(payload)
+       tx := &api.BlockChainTX{}
+
+       err := json.Unmarshal(base64DecodedTX, tx)
+       if err != nil {
+               return &api.BlockChainTX{}, err
+       }
+       return tx, nil
+}
+
+func callNextTX(tx *api.BlockChainTX) error {
+       // recipient := tx.RecipientID
+       // sender := tx.SenderID
+       //payloadJSON := tx.Payload
+       payloadString := string(tx.Payload)
+
+       desintationURL := fmt.Sprintf("http://localhost:5556/%s";, tx.Processor)
+
+       body := strings.NewReader(payloadString)
+       req, err := http.NewRequest("POST", os.ExpandEnv(desintationURL), body)
+       if err != nil {
+               return err
+       }
+       req.Header.Set("Accept", "*/*")
+       req.Header.Set("Content-Type", "application/json")
+
+       resp, err := http.DefaultClient.Do(req)
+       if err != nil {
+               return err
+       }
+       defer resp.Body.Close()
+       scanner := bufio.NewScanner(resp.Body)
+       scanner.Split(bufio.ScanBytes)
+       t := ""
+       for scanner.Scan() {
+               t += scanner.Text()
+               ///fmt.Print(scanner.Text())
+       }
+       print(t)
+
+       return nil
+}
+
+func DumpTXID(txid string) {
+       value, raw := QueryChain(txid)
+       println(value)
+       bc, _ := decodeChainTX(raw)
+       println(string(bc.Payload))
+       println()
+}
+
+func ProcessTransactionID(txid string) {
+       _, payload := QueryChain((txid))
+       err := HandleChainTX("", payload)
+       if err != nil {
+               panic(err)
+       }
+}
diff --git a/pkg/tendermint/tendermint_test.go 
b/pkg/tendermint/tendermint_test.go
new file mode 100644
index 0000000..43dec6b
--- /dev/null
+++ b/pkg/tendermint/tendermint_test.go
@@ -0,0 +1,61 @@
+package tendermint
+
+import "testing"
+
+var (
+       nodeID = "QmT4y4MtV5mvPHkFjfUQYQ7h1WvAagMy2GTJCn2bF8DQb7"
+)
+
+func Test_Order1(t *testing.T) {
+       a := 
"eyJQcm9jZXNzb3IiOiJ2MS9mdWxmaWxsL29yZGVyIiwiU2VuZGVySUQiOiJRbVQ0eTRNdFY1bXZQSGtGamZVUVlRN2gxV3ZBYWdNeTJHVEpDbjJiRjhEUWI3IiwiUmVjaXBpZW50SUQiOiJRbVQ0eTRNdFY1bXZQSGtGamZVUVlRN2gxV3ZBYWdNeTJHVEpDbjJiRjhEUWI3IiwiUGF5bG9hZCI6ImV5SnZjbVJsY2xCaGNuUXhRMGxFSWpvaVVXMVpVRU5xVEVGME1tbzVVbWhxU0U1TVkwRnVObEF5WTJseVJHWjZTRlpFWTBwMFkzbGtUVFZ5VWxoM1V5SXNJbVJ2WTNWdFpXNTBRMGxFSWpvaVVXMVVOSGswVFhSV05XMTJVRWhyUm1wbVZWRlpVVGRvTVZkMlFXRm5UWGt5UjFSS1EyNHlZa1k0UkZGaU55SjkifQ=="
+       err := HandleChainTX(nodeID, a)
+       if err != nil {
+               panic(err)
+       }
+}
+
+func Test_FullFill(t *testing.T) {
+       a := 
"eyJQcm9jZXNzb3IiOiJPUkRFUl9SRVNQT05TRSIsIlNlbmRlcklEIjoiUW1UNHk0TXRWNW12UEhrRmpmVVFZUTdoMVd2QWFnTXkyR1RKQ24yYkY4RFFiNyIsIlJlY2lwaWVudElEIjoiUW1UNHk0TXRWNW12UEhrRmpmVVFZUTdoMVd2QWFnTXkyR1RKQ24yYkY4RFFiNyIsIlBheWxvYWQiOiJleUp2Y21SbGNsQmhjblF5UTBsRUlqb2lVVzFVZUZka1ltZEdhRGxHYWpGMlJIbFhlazVCWkROVmFuRjNlVEYyTkRsRlFtVjJhRzUyTVVWdk5HVllSaUo5In0="
+       err := HandleChainTX(nodeID, a)
+       if err != nil {
+               panic(err)
+       }
+
+}
+
+func Test_DumpTXID(t *testing.T) {
+       a := "5fe5823c0d8b6d49f2ac99c90575566962ac3a14a6b2f1e7fe7ea1099b7b3bbd"
+       value, raw := QueryChain(a)
+       println(value)
+       bc, _ := decodeChainTX(raw)
+       print(string(bc.Payload))
+}
+
+//Use this to generate Order1
+//curl -s -X POST "http://localhost:5556/v1/order1"; -H "accept: */*" -H 
"Content-Type: application/json" -d 
"{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"
+
+func Test_All(t *testing.T) {
+       
DumpTXID("473407b069ff917b110f38c36d5b9e5246b5ace5d82df38c5a188d5ac868cfec")
+       
DumpTXID("586bc14b15a31999571c8188241beef046d3b78a9481ecee984e7c76a1d95112")
+
+}
+
+func Test_1(t *testing.T) {
+       txid := 
"473407b069ff917b110f38c36d5b9e5246b5ace5d82df38c5a188d5ac868cfec"
+       DumpTXID(txid)
+       ProcessTransactionID(txid)
+}
+
+func Test_2(t *testing.T) {
+       txid := 
"586bc14b15a31999571c8188241beef046d3b78a9481ecee984e7c76a1d95112"
+       DumpTXID(txid)
+       ProcessTransactionID(txid)
+}
+
+func Test_3(t *testing.T) {
+       txid := 
"5a48129fd272f2a8c57fdd96716a78c3be55a3cf811b179e82e54221d95ccbc4"
+       DumpTXID(txid)
+       ProcessTransactionID(txid)
+}
+
+//curl -s -X POST "http://localhost:5556/v1/order1"; -H "accept: */*" -H 
"Content-Type: application/json" -d 
"{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"

Reply via email to