diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index e0ef39cde..dfbb821fe 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -261,7 +261,7 @@ func (app *BaseApp) Query(req abci.RequestQuery) (res abci.ResponseQuery) { queryable, ok := app.cms.(sdk.Queryable) if !ok { msg := "application doesn't support queries" - return sdk.ErrUnknownRequest(msg).Result().ToQuery() + return sdk.ErrUnknownRequest(msg).QueryResult() } return queryable.Query(req) } diff --git a/client/context/viper.go b/client/context/viper.go new file mode 100644 index 000000000..750a37c61 --- /dev/null +++ b/client/context/viper.go @@ -0,0 +1,27 @@ +package context + +import ( + "github.com/spf13/viper" + + rpcclient "github.com/tendermint/tendermint/rpc/client" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/core" +) + +func NewCoreContextFromViper() core.CoreContext { + nodeURI := viper.GetString(client.FlagNode) + var rpc rpcclient.Client + if nodeURI != "" { + rpc = rpcclient.NewHTTP(nodeURI, "/websocket") + } + return core.CoreContext{ + ChainID: viper.GetString(client.FlagChainID), + Height: viper.GetInt64(client.FlagHeight), + TrustNode: viper.GetBool(client.FlagTrustNode), + FromAddressName: viper.GetString(client.FlagName), + NodeURI: nodeURI, + Sequence: viper.GetInt64(client.FlagSequence), + Client: rpc, + } +} diff --git a/client/core/context.go b/client/core/context.go new file mode 100644 index 000000000..3d7f400a8 --- /dev/null +++ b/client/core/context.go @@ -0,0 +1,50 @@ +package core + +import ( + rpcclient "github.com/tendermint/tendermint/rpc/client" +) + +type CoreContext struct { + ChainID string + Height int64 + TrustNode bool + NodeURI string + FromAddressName string + Sequence int64 + Client rpcclient.Client +} + +func (c CoreContext) WithChainID(chainID string) CoreContext { + c.ChainID = chainID + return c +} + +func (c CoreContext) WithHeight(height int64) CoreContext { + c.Height = height + return c +} + +func (c CoreContext) WithTrustNode(trustNode bool) CoreContext { + c.TrustNode = trustNode + return c +} + +func (c CoreContext) WithNodeURI(nodeURI string) CoreContext { + c.NodeURI = nodeURI + return c +} + +func (c CoreContext) WithFromAddressName(fromAddressName string) CoreContext { + c.FromAddressName = fromAddressName + return c +} + +func (c CoreContext) WithSequence(sequence int64) CoreContext { + c.Sequence = sequence + return c +} + +func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { + c.Client = client + return c +} diff --git a/client/builder/builder.go b/client/core/core.go similarity index 66% rename from client/builder/builder.go rename to client/core/core.go index ce8ad0495..a5c7b340c 100644 --- a/client/builder/builder.go +++ b/client/core/core.go @@ -1,10 +1,9 @@ -package builder +package core import ( "fmt" "github.com/pkg/errors" - "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/wire" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -17,9 +16,9 @@ import ( ) // Broadcast the transaction bytes to Tendermint -func BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit, error) { +func (ctx CoreContext) BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit, error) { - node, err := client.GetNode() + node, err := ctx.GetNode() if err != nil { return nil, err } @@ -43,17 +42,17 @@ func BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit, error) { } // Query from Tendermint with the provided key and storename -func Query(key cmn.HexBytes, storeName string) (res []byte, err error) { +func (ctx CoreContext) Query(key cmn.HexBytes, storeName string) (res []byte, err error) { path := fmt.Sprintf("/%s/key", storeName) - node, err := client.GetNode() + node, err := ctx.GetNode() if err != nil { return res, err } opts := rpcclient.ABCIQueryOptions{ - Height: viper.GetInt64(client.FlagHeight), - Trusted: viper.GetBool(client.FlagTrustNode), + Height: ctx.Height, + Trusted: ctx.TrustNode, } result, err := node.ABCIQueryWithOptions(path, key, opts) if err != nil { @@ -67,16 +66,16 @@ func Query(key cmn.HexBytes, storeName string) (res []byte, err error) { } // Get the from address from the name flag -func GetFromAddress() (from sdk.Address, err error) { +func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) { keybase, err := keys.GetKeyBase() if err != nil { return nil, err } - name := viper.GetString(client.FlagName) + name := ctx.FromAddressName if name == "" { - return nil, errors.Errorf("must provide a name using --name") + return nil, errors.Errorf("must provide a from address name") } info, err := keybase.Get(name) @@ -88,11 +87,11 @@ func GetFromAddress() (from sdk.Address, err error) { } // sign and build the transaction from the msg -func SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *wire.Codec) ([]byte, error) { +func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *wire.Codec) ([]byte, error) { // build the Sign Messsage from the Standard Message - chainID := viper.GetString(client.FlagChainID) - sequence := int64(viper.GetInt(client.FlagSequence)) + chainID := ctx.ChainID + sequence := ctx.Sequence signMsg := sdk.StdSignMsg{ ChainID: chainID, Sequences: []int64{sequence}, @@ -114,7 +113,7 @@ func SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *wire.Codec) ([]byte sigs := []sdk.StdSignature{{ PubKey: pubkey, Signature: sig, - Sequence: viper.GetInt64(client.FlagSequence), + Sequence: sequence, }} // marshal bytes @@ -124,23 +123,31 @@ func SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *wire.Codec) ([]byte } // sign and build the transaction from the msg -func SignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Codec) (*ctypes.ResultBroadcastTxCommit, error) { - passphrase, err := GetPassphraseFromStdin(name) +func (ctx CoreContext) SignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Codec) (*ctypes.ResultBroadcastTxCommit, error) { + passphrase, err := ctx.GetPassphraseFromStdin(name) if err != nil { return nil, err } - txBytes, err := SignAndBuild(name, passphrase, msg, cdc) + txBytes, err := ctx.SignAndBuild(name, passphrase, msg, cdc) if err != nil { return nil, err } - return BroadcastTx(txBytes) + return ctx.BroadcastTx(txBytes) } // get passphrase from std input -func GetPassphraseFromStdin(name string) (pass string, err error) { +func (ctx CoreContext) GetPassphraseFromStdin(name string) (pass string, err error) { buf := client.BufferStdin() prompt := fmt.Sprintf("Password to sign with '%s':", name) return client.GetPassword(prompt, buf) } + +// GetNode prepares a simple rpc.Client +func (ctx CoreContext) GetNode() (rpcclient.Client, error) { + if ctx.Client == nil { + return nil, errors.New("Must define node URI") + } + return ctx.Client, nil +} diff --git a/client/helpers.go b/client/helpers.go deleted file mode 100644 index f383b95f7..000000000 --- a/client/helpers.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -import ( - "github.com/pkg/errors" - "github.com/spf13/viper" - - rpcclient "github.com/tendermint/tendermint/rpc/client" -) - -// GetNode prepares a simple rpc.Client from the flags -func GetNode() (rpcclient.Client, error) { - uri := viper.GetString(FlagNode) - if uri == "" { - return nil, errors.New("Must define node using --node") - } - return rpcclient.NewHTTP(uri, "/websocket"), nil -} diff --git a/client/rpc/block.go b/client/rpc/block.go index 7f197051a..f42a15bc2 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -10,6 +10,7 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" ) const ( @@ -31,7 +32,8 @@ func blockCommand() *cobra.Command { func getBlock(height *int64) ([]byte, error) { // get the node - node, err := client.GetNode() + ctx := context.NewCoreContextFromViper() + node, err := ctx.GetNode() if err != nil { return nil, err } @@ -55,7 +57,7 @@ func getBlock(height *int64) ([]byte, error) { } func GetChainHeight() (int64, error) { - node, err := client.GetNode() + node, err := context.NewCoreContextFromViper().GetNode() if err != nil { return -1, err } diff --git a/client/rpc/status.go b/client/rpc/status.go index e5da94869..8ea8a5ad6 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -10,6 +10,7 @@ import ( wire "github.com/tendermint/go-wire" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" ctypes "github.com/tendermint/tendermint/rpc/core/types" ) @@ -25,7 +26,7 @@ func statusCommand() *cobra.Command { func getNodeStatus() (*ctypes.ResultStatus, error) { // get the node - node, err := client.GetNode() + node, err := context.NewCoreContextFromViper().GetNode() if err != nil { return &ctypes.ResultStatus{}, err } diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 15c3230e3..9bf1505db 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -10,6 +10,7 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" ) func validatorCommand() *cobra.Command { @@ -26,7 +27,7 @@ func validatorCommand() *cobra.Command { func GetValidators(height *int64) ([]byte, error) { // get the node - node, err := client.GetNode() + node, err := context.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/client/tx/broadcast.go b/client/tx/broadcast.go index b9367645f..998e2b0f1 100644 --- a/client/tx/broadcast.go +++ b/client/tx/broadcast.go @@ -4,7 +4,7 @@ import ( "encoding/json" "net/http" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" ) type BroadcastTxBody struct { @@ -22,7 +22,7 @@ func BroadcastTxRequestHandler(w http.ResponseWriter, r *http.Request) { return } - res, err := builder.BroadcastTx([]byte(m.TxBytes)) + res, err := context.NewCoreContextFromViper().BroadcastTx([]byte(m.TxBytes)) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) diff --git a/client/tx/query.go b/client/tx/query.go index 7c8c4d124..63ab2ff04 100644 --- a/client/tx/query.go +++ b/client/tx/query.go @@ -15,6 +15,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) @@ -39,7 +40,7 @@ func (c commander) queryTx(hashHexStr string, trustNode bool) ([]byte, error) { } // get the node - node, err := client.GetNode() + node, err := context.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/client/tx/search.go b/client/tx/search.go index 2790750eb..df3be5077 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -12,6 +12,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/wire" ) @@ -43,7 +44,7 @@ func (c commander) searchTx(tags []string) ([]byte, error) { query := strings.Join(tags, " AND ") // get the node - node, err := client.GetNode() + node, err := context.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/examples/democoin/cmd/democoind/main.go b/examples/democoin/cmd/democoind/main.go index d9421954c..a7af708a1 100644 --- a/examples/democoin/cmd/democoind/main.go +++ b/examples/democoin/cmd/democoind/main.go @@ -46,7 +46,10 @@ func defaultOptions(args []string) (json.RawMessage, string, cmn.HexBytes, error "amount": 9007199254740992 } ] - }] + }], + "cool": { + "trend": "ice-cold" + } }`, addr) return json.RawMessage(opts), "", nil, nil } diff --git a/examples/democoin/x/cool/commands/tx.go b/examples/democoin/x/cool/commands/tx.go index ab817309c..8deaac405 100644 --- a/examples/democoin/x/cool/commands/tx.go +++ b/examples/democoin/x/cool/commands/tx.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/examples/democoin/x/cool" @@ -24,8 +24,10 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { return errors.New("You must provide an answer") } + ctx := context.NewCoreContextFromViper() + // get the from address from the name flag - from, err := builder.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -37,7 +39,7 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { name := viper.GetString(client.FlagName) // build and sign the transaction, then broadcast to Tendermint - res, err := builder.SignBuildBroadcast(name, msg, cdc) + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } @@ -58,8 +60,10 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { return errors.New("You must provide an answer") } + ctx := context.NewCoreContextFromViper() + // get the from address from the name flag - from, err := builder.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -71,7 +75,7 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { msg := cool.NewSetTrendMsg(from, args[0]) // build and sign the transaction, then broadcast to Tendermint - res, err := builder.SignBuildBroadcast(name, msg, cdc) + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } diff --git a/server/init.go b/server/init.go index ab4ffcb7a..435895081 100644 --- a/server/init.go +++ b/server/init.go @@ -21,6 +21,7 @@ type testnetInformation struct { Account string `json:"account"` Validator tmtypes.GenesisValidator `json:"validator"` NodeID p2p.ID `json:"node_id"` + ChainID string `json:"chain_id"` } // InitCmd will initialize all files for tendermint, @@ -144,6 +145,7 @@ func (c initCmd) initTendermintFiles(config *cfg.Config, info *testnetInformatio info.Validator = validator } } + info.ChainID = loadedDoc.ChainID return nil } diff --git a/server/start_test.go b/server/start_test.go index 2657c5223..b2716da24 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -1,7 +1,8 @@ package server import ( - // "os" + "io/ioutil" + "os" "testing" "time" @@ -9,34 +10,41 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/mock" + "github.com/tendermint/abci/server" "github.com/tendermint/tmlibs/log" ) func TestStartStandAlone(t *testing.T) { - defer setupViper(t)() + home, err := ioutil.TempDir("", "mock-sdk-cmd") + defer func() { + os.RemoveAll(home) + }() logger := log.NewNopLogger() initCmd := InitCmd(mock.GenInitOptions, logger) - err := initCmd.RunE(nil, nil) + err = initCmd.RunE(nil, nil) require.NoError(t, err) - // set up app and start up - viper.Set(flagWithTendermint, false) - viper.Set(flagAddress, "localhost:11122") - startCmd := StartCmd(mock.NewApp, logger) - startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address - timeout := time.Duration(3) * time.Second + app, err := mock.NewApp(home, logger) + require.Nil(t, err) + svr, err := server.NewServer(FreeTCPAddr(t), "socket", app) + require.Nil(t, err, "Error creating listener") + svr.SetLogger(logger.With("module", "abci-server")) + svr.Start() + + timer := time.NewTimer(time.Duration(5) * time.Second) + select { + case <-timer.C: + svr.Stop() + } - RunOrTimeout(startCmd, timeout, t) } -/* func TestStartWithTendermint(t *testing.T) { defer setupViper(t)() logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)). With("module", "mock-cmd") - // logger := log.NewNopLogger() initCmd := InitCmd(mock.GenInitOptions, logger) err := initCmd.RunE(nil, nil) require.NoError(t, err) @@ -45,11 +53,7 @@ func TestStartWithTendermint(t *testing.T) { viper.Set(flagWithTendermint, true) startCmd := StartCmd(mock.NewApp, logger) startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address - timeout := time.Duration(3) * time.Second + timeout := time.Duration(5) * time.Second - //a, _ := startCmd.Flags().GetString(flagAddress) - //panic(a) - - RunOrTimeout(startCmd, timeout, t) + close(RunOrTimeout(startCmd, timeout, t)) } -*/ diff --git a/store/iavlstore.go b/store/iavlstore.go index 96110c59c..e736fbda2 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -141,7 +141,7 @@ func (st *iavlStore) ReverseIterator(start, end []byte) Iterator { func (st *iavlStore) Query(req abci.RequestQuery) (res abci.ResponseQuery) { if len(req.Data) == 0 { msg := "Query cannot be zero length" - return sdk.ErrTxDecode(msg).Result().ToQuery() + return sdk.ErrTxDecode(msg).QueryResult() } tree := st.tree @@ -175,7 +175,7 @@ func (st *iavlStore) Query(req abci.RequestQuery) (res abci.ResponseQuery) { default: msg := fmt.Sprintf("Unexpected Query path: %v", req.Path) - return sdk.ErrUnknownRequest(msg).Result().ToQuery() + return sdk.ErrUnknownRequest(msg).QueryResult() } return } diff --git a/store/rootmultistore.go b/store/rootmultistore.go index a39c35813..9be28967c 100644 --- a/store/rootmultistore.go +++ b/store/rootmultistore.go @@ -205,18 +205,18 @@ func (rs *rootMultiStore) Query(req abci.RequestQuery) abci.ResponseQuery { path := req.Path storeName, subpath, err := parsePath(path) if err != nil { - return err.Result().ToQuery() + return err.QueryResult() } store := rs.getStoreByName(storeName) if store == nil { msg := fmt.Sprintf("no such store: %s", storeName) - return sdk.ErrUnknownRequest(msg).Result().ToQuery() + return sdk.ErrUnknownRequest(msg).QueryResult() } queryable, ok := store.(Queryable) if !ok { msg := fmt.Sprintf("store %s doesn't support queries", storeName) - return sdk.ErrUnknownRequest(msg).Result().ToQuery() + return sdk.ErrUnknownRequest(msg).QueryResult() } // trim the path and make the query diff --git a/types/errors.go b/types/errors.go index 1115d3937..4874c4362 100644 --- a/types/errors.go +++ b/types/errors.go @@ -3,6 +3,8 @@ package types import ( "fmt" "runtime" + + abci "github.com/tendermint/abci/types" ) // ABCI Response Code @@ -121,6 +123,7 @@ type Error interface { TraceCause(cause error, msg string) Error Cause() error Result() Result + QueryResult() abci.ResponseQuery } func NewError(code CodeType, msg string) Error { @@ -220,3 +223,11 @@ func (err *sdkError) Result() Result { Log: err.ABCILog(), } } + +// QueryResult allows us to return sdk.Error.QueryResult() in query responses +func (err *sdkError) QueryResult() abci.ResponseQuery { + return abci.ResponseQuery{ + Code: uint32(err.ABCICode()), + Log: err.ABCILog(), + } +} diff --git a/types/result.go b/types/result.go index c1afec00c..412a9778d 100644 --- a/types/result.go +++ b/types/result.go @@ -38,11 +38,3 @@ type Result struct { func (res Result) IsOK() bool { return res.Code.IsOK() } - -// ToQuery allows us to return sdk.Error.Result() in query responses -func (res Result) ToQuery() abci.ResponseQuery { - return abci.ResponseQuery{ - Code: uint32(res.Code), - Log: res.Log, - } -} diff --git a/x/auth/commands/account.go b/x/auth/commands/account.go index 02af73f16..b87b95769 100644 --- a/x/auth/commands/account.go +++ b/x/auth/commands/account.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" @@ -64,7 +64,9 @@ func (c commander) getAccountCmd(cmd *cobra.Command, args []string) error { } key := sdk.Address(bz) - res, err := builder.Query(key, c.storeName) + ctx := context.NewCoreContextFromViper() + + res, err := ctx.Query(key, c.storeName) if err != nil { return err } diff --git a/x/auth/rest/query.go b/x/auth/rest/query.go index 22c364ccd..5430a77ff 100644 --- a/x/auth/rest/query.go +++ b/x/auth/rest/query.go @@ -8,7 +8,7 @@ import ( "github.com/gorilla/mux" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) @@ -21,6 +21,7 @@ type commander struct { func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder) func(http.ResponseWriter, *http.Request) { c := commander{storeName, cdc, decoder} + ctx := context.NewCoreContextFromViper() return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) addr := vars["address"] @@ -33,7 +34,7 @@ func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.A } key := sdk.Address(bz) - res, err := builder.Query(key, c.storeName) + res, err := ctx.Query(key, c.storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Could't query account. Error: %s", err.Error()))) diff --git a/x/bank/commands/sendtx.go b/x/bank/commands/sendtx.go index 5619b4d0f..ee4625eac 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank" @@ -38,8 +38,10 @@ type Commander struct { } func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { + ctx := context.NewCoreContextFromViper() + // get the from address - from, err := builder.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -59,14 +61,11 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { } to := sdk.Address(bz) - // get account name - name := viper.GetString(client.FlagName) - // build message msg := BuildMsg(from, to, coins) // build and sign the transaction, then broadcast to Tendermint - res, err := builder.SignBuildBroadcast(name, msg, c.Cdc) + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, c.Cdc) if err != nil { return err } diff --git a/x/bank/rest/sendtx.go b/x/bank/rest/sendtx.go index 85b9dc4d5..b1f8516f3 100644 --- a/x/bank/rest/sendtx.go +++ b/x/bank/rest/sendtx.go @@ -7,11 +7,9 @@ import ( "net/http" "github.com/gorilla/mux" - "github.com/spf13/viper" "github.com/tendermint/go-crypto/keys" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank/commands" @@ -30,6 +28,7 @@ type sendBody struct { // SendRequestHandler - http request handler to send coins to a address func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) { c := commands.Commander{cdc} + ctx := context.NewCoreContextFromViper() return func(w http.ResponseWriter, r *http.Request) { // collect data vars := mux.Vars(r) @@ -73,9 +72,8 @@ func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWrit } // sign - // XXX: OMG - viper.Set(client.FlagSequence, m.Sequence) - txBytes, err := builder.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) + ctx = ctx.WithSequence(m.Sequence) + txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) if err != nil { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte(err.Error())) @@ -83,7 +81,7 @@ func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWrit } // send - res, err := builder.BroadcastTx(txBytes) + res, err := ctx.BroadcastTx(txBytes) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) diff --git a/x/ibc/commands/ibctx.go b/x/ibc/commands/ibctx.go index 4d8476ff1..689a98318 100644 --- a/x/ibc/commands/ibctx.go +++ b/x/ibc/commands/ibctx.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" @@ -39,8 +39,10 @@ type sendCommander struct { } func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error { + ctx := context.NewCoreContextFromViper() + // get the from address - from, err := builder.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -52,9 +54,7 @@ func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error } // get password - name := viper.GetString(client.FlagName) - - res, err := builder.SignBuildBroadcast(name, msg, c.cdc) + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, c.cdc) if err != nil { return err } diff --git a/x/ibc/commands/relay.go b/x/ibc/commands/relay.go index 917024811..d652e306f 100644 --- a/x/ibc/commands/relay.go +++ b/x/ibc/commands/relay.go @@ -9,8 +9,7 @@ import ( "github.com/tendermint/tmlibs/log" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" @@ -74,7 +73,7 @@ func (c relayCommander) runIBCRelay(cmd *cobra.Command, args []string) { fromChainNode := viper.GetString(FlagFromChainNode) toChainID := viper.GetString(FlagToChainID) toChainNode := viper.GetString(FlagToChainNode) - address, err := builder.GetFromAddress() + address, err := context.NewCoreContextFromViper().GetFromAddress() if err != nil { panic(err) } @@ -84,9 +83,9 @@ func (c relayCommander) runIBCRelay(cmd *cobra.Command, args []string) { } func (c relayCommander) loop(fromChainID, fromChainNode, toChainID, toChainNode string) { + ctx := context.NewCoreContextFromViper() // get password - name := viper.GetString(client.FlagName) - passphrase, err := builder.GetPassphraseFromStdin(name) + passphrase, err := ctx.GetPassphraseFromStdin(ctx.FromAddressName) if err != nil { panic(err) } @@ -133,10 +132,8 @@ OUTER: continue OUTER } - viper.Set(client.FlagSequence, seq) + err = c.broadcastTx(seq, toChainNode, c.refine(egressbz, i, passphrase)) seq++ - - err = c.broadcastTx(toChainNode, c.refine(egressbz, i, passphrase)) if err != nil { c.logger.Error("Error broadcasting ingress packet", "err", err) continue OUTER @@ -148,18 +145,11 @@ OUTER: } func query(node string, key []byte, storeName string) (res []byte, err error) { - orig := viper.GetString(client.FlagNode) - viper.Set(client.FlagNode, node) - res, err = builder.Query(key, storeName) - viper.Set(client.FlagNode, orig) - return res, err + return context.NewCoreContextFromViper().WithNodeURI(node).Query(key, storeName) } -func (c relayCommander) broadcastTx(node string, tx []byte) error { - orig := viper.GetString(client.FlagNode) - viper.Set(client.FlagNode, node) - _, err := builder.BroadcastTx(tx) - viper.Set(client.FlagNode, orig) +func (c relayCommander) broadcastTx(seq int64, node string, tx []byte) error { + _, err := context.NewCoreContextFromViper().WithNodeURI(node).WithSequence(seq + 1).BroadcastTx(tx) return err } @@ -177,10 +167,6 @@ func (c relayCommander) getSequence(node string) int64 { return account.GetSequence() } -func setSequence(seq int64) { - viper.Set(client.FlagSequence, seq) -} - func (c relayCommander) refine(bz []byte, sequence int64, passphrase string) []byte { var packet ibc.IBCPacket if err := c.cdc.UnmarshalBinary(bz, &packet); err != nil { @@ -193,8 +179,8 @@ func (c relayCommander) refine(bz []byte, sequence int64, passphrase string) []b Sequence: sequence, } - name := viper.GetString(client.FlagName) - res, err := builder.SignAndBuild(name, passphrase, msg, c.cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignAndBuild(ctx.FromAddressName, passphrase, msg, c.cdc) if err != nil { panic(err) } diff --git a/x/ibc/rest/transfer.go b/x/ibc/rest/transfer.go index f47159160..fceac5567 100644 --- a/x/ibc/rest/transfer.go +++ b/x/ibc/rest/transfer.go @@ -7,11 +7,9 @@ import ( "net/http" "github.com/gorilla/mux" - "github.com/spf13/viper" "github.com/tendermint/go-crypto/keys" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank/commands" @@ -31,6 +29,7 @@ type transferBody struct { // on a different chain via IBC func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) { c := commands.Commander{cdc} + ctx := context.NewCoreContextFromViper() return func(w http.ResponseWriter, r *http.Request) { // collect data vars := mux.Vars(r) @@ -71,9 +70,8 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response msg := ibc.IBCTransferMsg{packet} // sign - // XXX: OMG - viper.Set(client.FlagSequence, m.Sequence) - txBytes, err := builder.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) + ctx = ctx.WithSequence(m.Sequence) + txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) if err != nil { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte(err.Error())) @@ -81,7 +79,7 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response } // send - res, err := builder.BroadcastTx(txBytes) + res, err := ctx.BroadcastTx(txBytes) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) diff --git a/x/simplestake/commands/commands.go b/x/simplestake/commands/commands.go index 19d6cddbf..ce89801d8 100644 --- a/x/simplestake/commands/commands.go +++ b/x/simplestake/commands/commands.go @@ -9,8 +9,7 @@ import ( crypto "github.com/tendermint/go-crypto" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/simplestake" @@ -48,7 +47,9 @@ type commander struct { } func (co commander) bondTxCmd(cmd *cobra.Command, args []string) error { - from, err := builder.GetFromAddress() + ctx := context.NewCoreContextFromViper() + + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -82,7 +83,7 @@ func (co commander) bondTxCmd(cmd *cobra.Command, args []string) error { } func (co commander) unbondTxCmd(cmd *cobra.Command, args []string) error { - from, err := builder.GetFromAddress() + from, err := context.NewCoreContextFromViper().GetFromAddress() if err != nil { return err } @@ -93,8 +94,8 @@ func (co commander) unbondTxCmd(cmd *cobra.Command, args []string) error { } func (co commander) sendMsg(msg sdk.Msg) error { - name := viper.GetString(client.FlagName) - res, err := builder.SignBuildBroadcast(name, msg, co.cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, co.cdc) if err != nil { return err } diff --git a/x/stake/commands/query.go b/x/stake/commands/query.go index ed436305c..7bc6a8aa9 100644 --- a/x/stake/commands/query.go +++ b/x/stake/commands/query.go @@ -11,7 +11,7 @@ import ( crypto "github.com/tendermint/go-crypto" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" // XXX fix "github.com/cosmos/cosmos-sdk/x/stake" @@ -47,7 +47,8 @@ func GetCmdQueryCandidates(cdc *wire.Codec, storeName string) *cobra.Command { key := PrefixedKey(stake.MsgType, stake.CandidatesKey) - res, err := builder.Query(key, storeName) + ctx := context.NewCoreContextFromViper() + res, err := ctx.Query(key, storeName) if err != nil { return err } @@ -87,7 +88,9 @@ func GetCmdQueryCandidate(cdc *wire.Codec, storeName string) *cobra.Command { key := PrefixedKey(stake.MsgType, stake.GetCandidateKey(addr)) - res, err := builder.Query(key, storeName) + ctx := context.NewCoreContextFromViper() + + res, err := ctx.Query(key, storeName) if err != nil { return err } @@ -133,7 +136,9 @@ func GetCmdQueryDelegatorBond(cdc *wire.Codec, storeName string) *cobra.Command key := PrefixedKey(stake.MsgType, stake.GetDelegatorBondKey(delegator, addr, cdc)) - res, err := builder.Query(key, storeName) + ctx := context.NewCoreContextFromViper() + + res, err := ctx.Query(key, storeName) if err != nil { return err } @@ -175,7 +180,9 @@ func GetCmdQueryDelegatorBonds(cdc *wire.Codec, storeName string) *cobra.Command key := PrefixedKey(stake.MsgType, stake.GetDelegatorBondsKey(delegator, cdc)) - res, err := builder.Query(key, storeName) + ctx := context.NewCoreContextFromViper() + + res, err := ctx.Query(key, storeName) if err != nil { return err } diff --git a/x/stake/commands/tx.go b/x/stake/commands/tx.go index 90b289de7..d1dec6dce 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -11,7 +11,7 @@ import ( crypto "github.com/tendermint/go-crypto" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/builder" + "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/stake" @@ -92,8 +92,8 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgDeclareCandidacy(candidateAddr, pk, amount, description) // build and sign the transaction, then broadcast to Tendermint - name := viper.GetString(client.FlagName) - res, err := builder.SignBuildBroadcast(name, msg, cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err } @@ -129,8 +129,8 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgEditCandidacy(candidateAddr, description) // build and sign the transaction, then broadcast to Tendermint - name := viper.GetString(client.FlagName) - res, err := builder.SignBuildBroadcast(name, msg, cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err } @@ -165,8 +165,8 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgDelegate(delegatorAddr, candidateAddr, amount) // build and sign the transaction, then broadcast to Tendermint - name := viper.GetString(client.FlagName) - res, err := builder.SignBuildBroadcast(name, msg, cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err } @@ -212,8 +212,8 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgUnbond(delegatorAddr, candidateAddr, sharesStr) // build and sign the transaction, then broadcast to Tendermint - name := viper.GetString(client.FlagName) - res, err := builder.SignBuildBroadcast(name, msg, cdc) + ctx := context.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err }