From 63d4e75456be7d8b1e6fc758b9f63296b75a4b4a Mon Sep 17 00:00:00 2001
From: Benjamin Bollen <ben@erisindustries.com>
Date: Wed, 29 Jun 2016 19:59:59 +0200
Subject: [PATCH] connect GatewayTendermint into serve

---
 cmd/serve.go              |  4 +++
 core/core.go              | 55 ++++++++++++---------------------------
 definitions/pipe.go       |  2 ++
 manager/eris-mint/pipe.go |  9 +++++--
 4 files changed, 29 insertions(+), 41 deletions(-)

diff --git a/cmd/serve.go b/cmd/serve.go
index 0f560031..b355d884 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -145,6 +145,10 @@ func Serve(cmd *cobra.Command, args []string) {
     log.Fatalf("Failed to start servers: %s.", err)
     os.Exit(1)
   }
+	_, err = newCore.NewGatewayTendermint(serverConfig)
+	if err != nil {
+		log.Fatalf("Failed to start Tendermint gateway")
+	}
   <- serverProcess.StopEventChannel()
 }
 
diff --git a/core/core.go b/core/core.go
index 97d251ea..ca69aadb 100644
--- a/core/core.go
+++ b/core/core.go
@@ -31,9 +31,8 @@ import (
 	manager "github.com/eris-ltd/eris-db/manager"
 	// rpc_v0 is carried over from Eris-DBv0.11 and before on port 1337
 	rpc_v0 "github.com/eris-ltd/eris-db/rpc/v0"
-	rpc_tendermint "github.com/eris-ltd/eris-db/rpc/tendermint/core"
 	// rpc_tendermint is carried over from Eris-DBv0.11 and before on port 46657
-	// rpc_tendermint "github.com/eris-ltd/eris-db/rpc/tendermint"
+	rpc_tendermint "github.com/eris-ltd/eris-db/rpc/tendermint/core"
 	server "github.com/eris-ltd/eris-db/server"
 )
 
@@ -60,11 +59,22 @@ func NewCore(chainId string, consensusConfig *config.ModuleConfig,
 	log.Debug("Loaded pipe with application manager")
 	// pass the consensus engine into the pipe
 	consensus.LoadConsensusEngineInPipe(consensusConfig, pipe)
-
+	tendermintPipe, err := pipe.GetTendermintPipe()
+	if err != nil {
+		log.Warn(fmt.Sprintf("Tendermint gateway not supported by %s",
+			managerConfig.Version))
+		return &Core{
+			chainId:        chainId,
+			evsw:           evsw,
+			pipe:           pipe,
+			tendermintPipe: nil,
+		}, nil
+	}
 	return &Core{
-		chainId: chainId,
-		evsw:    evsw,
-		pipe:    pipe,
+		chainId:        chainId,
+		evsw:           evsw,
+		pipe:           pipe,
+		tendermintPipe: tendermintPipe,
 	}, nil
 }
 
@@ -109,36 +119,3 @@ func (core *Core) NewGatewayTendermint(config *server.ServerConfig) (
 	return rpc_tendermint.NewTendermintWebsocketServer(config,
 		core.tendermintPipe, core.evsw)
 }
-
-// func (core *Core) StartRPC(config server.ServerConfig) ([]net.Listener, error) {
-// 	rpc_tendermint.SetConfig(config)
-//
-// 	rpc_tendermint.SetErisMint(core.pipe.GetApplication())
-// 	rpc_tendermint.SetBlockStore(n.BlockStore())
-// 	rpc_tendermint.SetConsensusState(n.ConsensusState())
-// 	rpc_tendermint.SetConsensusReactor(n.ConsensusReactor())
-// 	rpc_tendermint.SetMempoolReactor(n.MempoolReactor())
-// 	rpc_tendermint.SetSwitch(n.Switch())
-// 	rpc_tendermint.SetPrivValidator(n.PrivValidator())
-// 	// TODO: programming
-// 	//rpc_tendermint.SetGenDoc(LoadGenDoc(config.GetString("genesis_file")))
-//
-// 	// TODO: also programming
-// 	//listenAddrs := strings.Split(config.GetString("rpc_laddr"), ",")
-// 	listenAddrs := strings.Split("127.0.0.1", ",")
-//
-// 	// we may expose the rpc over both a unix and tcp socket
-// 	listeners := make([]net.Listener, len(listenAddrs))
-// 	for i, listenAddr := range listenAddrs {
-// 		mux := http.NewServeMux()
-// 		wm := rpcserver.NewWebsocketManager(rpc_tendermint.Routes, n.EventSwitch())
-// 		mux.HandleFunc("/websocket", wm.WebsocketHandler)
-// 		rpcserver.RegisterRPCFuncs(mux, rpc_tendermint.Routes)
-// 		listener, err := rpcserver.StartHTTPServer(listenAddr, mux)
-// 		if err != nil {
-// 			return nil, err
-// 		}
-// 		listeners[i] = listener
-// 	}
-// 	return listeners, nil
-// }
diff --git a/definitions/pipe.go b/definitions/pipe.go
index 070c3d22..f3c6978d 100644
--- a/definitions/pipe.go
+++ b/definitions/pipe.go
@@ -45,6 +45,8 @@ type Pipe interface {
   // NOTE: [ben] added to Pipe interface on 0.12 refactor
   GetApplication() manager_types.Application
   SetConsensusEngine(consensus ConsensusEngine) error
+	// Support for Tendermint RPC
+	GetTendermintPipe() (TendermintPipe, error)
 }
 
 type Accounts interface {
diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go
index c7b68461..bf322ee7 100644
--- a/manager/eris-mint/pipe.go
+++ b/manager/eris-mint/pipe.go
@@ -62,8 +62,8 @@ type ErisMintPipe struct {
 var _ definitions.Pipe = (*ErisMintPipe)(nil)
 
 // NOTE [ben] Compiler check to ensure ErisMintPipe successfully implements
-// eris-db/definitions.TendermintPipe
-// var _ definitions.TendermintPipe = (*ErisMintPipe)(nil)
+// eris-db/definitions.erisTendermintPipe
+var _ definitions.TendermintPipe = (*ErisMintPipe)(nil)
 
 func NewErisMintPipe(moduleConfig *config.ModuleConfig,
   eventSwitch *tendermint_events.EventSwitch) (*ErisMintPipe, error) {
@@ -208,6 +208,11 @@ func (pipe *ErisMintPipe) SetConsensusEngine(
   return nil
 }
 
+func (pipe *ErisMintPipe) GetTendermintPipe() (definitions.TendermintPipe,
+	error) {
+	return definitions.TendermintPipe(pipe), nil
+}
+
 //------------------------------------------------------------------------------
 // Implement definitions.TendermintPipe for ErisMintPipe
 
-- 
GitLab