diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go index d1071584bc4a10a1bb901c46c4fcb0349f93c5c4..7bbcd833b740016348218b4bbb8f10149110472b 100644 --- a/manager/eris-mint/pipe.go +++ b/manager/eris-mint/pipe.go @@ -24,6 +24,7 @@ import ( tendermint_common "github.com/tendermint/go-common" tendermint_events "github.com/tendermint/go-events" tendermint_types "github.com/tendermint/tendermint/types" + tmsp_types "github.com/tendermint/tmsp/types" wire "github.com/tendermint/go-wire" log "github.com/eris-ltd/eris-logger" @@ -370,7 +371,41 @@ func (pipe *ErisMintPipe) BroadcastTxAsync(tx transaction.Tx) ( return &rpc_tendermint_types.ResultBroadcastTx{}, nil } -func (pipe *ErisMintPipe) BroadcastTxSync(transaction transaction.Tx) (*rpc_tendermint_types.ResultBroadcastTx, +func (pipe *ErisMintPipe) BroadcastTxSync(tx transaction.Tx) (*rpc_tendermint_types.ResultBroadcastTx, error) { - return nil, fmt.Errorf("Unimplemented.") + responseChannel := make(chan *tmsp_types.Response, 1) + err := pipe.consensusEngine.BroadcastTransaction(transaction.EncodeTx(tx), + func(res *tmsp_types.Response) { responseChannel <- res }) + if err != nil { + return nil, fmt.Errorf("Error broadcasting transaction: %v", err) + } + // NOTE: [ben] This Response is set in /tmsp/client/local_remote_client.go + // a call to Application, here implemented by ErisMint, over local callback, + // or TMSP RPC call. Hence the result is determined by ErisMint/erismint.go + // CheckTx() Result (Result converted to ReqRes into Response returned here) + // NOTE: [ben] BroadcastTx wraps around CheckTx for Tendermint + response := <-responseChannel + responseCheckTx := response.GetCheckTx() + if responseCheckTx == nil { + return nil, fmt.Errorf("Error, application did not return CheckTx response.") + } + resultBroadCastTx := &rpc_tendermint_types.ResultBroadcastTx { + Code: responseCheckTx.Code, + Data: responseCheckTx.Data, + Log: responseCheckTx.Log, + } + switch responseCheckTx.Code { + case tmsp_types.CodeType_OK: + return resultBroadCastTx, nil + case tmsp_types.CodeType_EncodingError: + return resultBroadCastTx, fmt.Errorf(resultBroadCastTx.Log) + case tmsp_types.CodeType_InternalError: + return resultBroadCastTx, fmt.Errorf(resultBroadCastTx.Log) + default: + log.WithFields(log.Fields{ + "application": GetErisMintVersion().GetVersionString(), + "TMSP_code_type": responseCheckTx.Code, + }).Warn("Unknown error returned from Tendermint CheckTx on BroadcastTxSync") + return resultBroadCastTx, fmt.Errorf("Unknown error returned: " + responseCheckTx.Log) + } } diff --git a/rpc/tendermint/core/mempool.go b/rpc/tendermint/core/mempool.go deleted file mode 100644 index 5e59667080aa411ca6f847a77d068f2a5708421f..0000000000000000000000000000000000000000 --- a/rpc/tendermint/core/mempool.go +++ /dev/null @@ -1,66 +0,0 @@ -package core - -import ( - "fmt" - - ctypes "github.com/eris-ltd/eris-db/rpc/tendermint/core/types" - txs "github.com/eris-ltd/eris-db/txs" - // "github.com/tendermint/tendermint/types" - tmsp "github.com/tendermint/tmsp/types" -) - -//----------------------------------------------------------------------------- - -// // NOTE: tx must be signed -// func BroadcastTxAsync(tx types.Tx) (*ctypes.ResultBroadcastTx, error) { -// err := mempoolReactor.BroadcastTx(tx, nil) -// if err != nil { -// return nil, fmt.Errorf("Error broadcasting transaction: %v", err) -// } -// return &ctypes.ResultBroadcastTx{}, nil -// } - -// Note: tx must be signed -func BroadcastTxSync(tx txs.Tx) (*ctypes.ResultBroadcastTx, error) { - resCh := make(chan *tmsp.Response, 1) - err := mempoolReactor.BroadcastTx(txs.EncodeTx(tx), func(res *tmsp.Response) { - resCh <- res - }) - if err != nil { - return nil, fmt.Errorf("Error broadcasting transaction: %v", err) - } - res := <-resCh - switch r:= res.Value.(type) { - case *tmsp.Response_AppendTx: - return &ctypes.ResultBroadcastTx{ - Code: r.AppendTx.Code, - Data: r.AppendTx.Data, - Log: r.AppendTx.Log, - }, nil - case *tmsp.Response_CheckTx: - return &ctypes.ResultBroadcastTx{ - Code: r.CheckTx.Code, - Data: r.CheckTx.Data, - Log: r.CheckTx.Log, - }, nil - case *tmsp.Response_Commit: - return &ctypes.ResultBroadcastTx{ - Code: r.Commit.Code, - Data: r.Commit.Data, - Log: r.Commit.Log, - }, nil - case *tmsp.Response_Query: - return &ctypes.ResultBroadcastTx{ - Code: r.Query.Code, - Data: r.Query.Data, - Log: r.Query.Log, - }, nil - default: - return &ctypes.ResultBroadcastTx{ - Code: tmsp.CodeType_OK, - Data: []byte{}, - Log: "", - }, nil - - } -}