diff --git a/client/core/context.go b/client/core/context.go new file mode 100644 index 0000000000..5a35ea533d --- /dev/null +++ b/client/core/context.go @@ -0,0 +1,30 @@ +package core + +import ( + // "fmt" + + // "github.com/pkg/errors" + "github.com/spf13/viper" + + "github.com/cosmos/cosmos-sdk/client" +) + +type CoreContext struct { + ChainID string + Height int64 + TrustNode bool + NodeURI string + FromAddressName string + Sequence int64 +} + +func NewCoreContextFromViper() CoreContext { + return CoreContext{ + ChainID: viper.GetString(client.FlagChainID), + Height: viper.GetInt64(client.FlagHeight), + TrustNode: viper.GetBool(client.FlagTrustNode), + NodeURI: viper.GetString(client.FlagNode), + FromAddressName: viper.GetString(client.FlagName), + Sequence: viper.GetInt64(client.FlagSequence), + } +} diff --git a/client/core/core.go b/client/core/core.go index 0295ae5abd..e8b8c19fb0 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -4,7 +4,6 @@ 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.NodeURI == "" { + return nil, errors.New("Must define node URI") + } + return rpcclient.NewHTTP(ctx.NodeURI, "/websocket"), nil +} diff --git a/client/helpers.go b/client/helpers.go deleted file mode 100644 index f383b95f7d..0000000000 --- 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 7f197051a9..cb39113d33 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/core" ) const ( @@ -31,7 +32,8 @@ func blockCommand() *cobra.Command { func getBlock(height *int64) ([]byte, error) { // get the node - node, err := client.GetNode() + ctx := core.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 := core.NewCoreContextFromViper().GetNode() if err != nil { return -1, err } diff --git a/client/rpc/status.go b/client/rpc/status.go index e5da948692..0c79d0763d 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/core" 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 := core.NewCoreContextFromViper().GetNode() if err != nil { return &ctypes.ResultStatus{}, err } diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 15c3230e3e..5fbc044b22 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/core" ) 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 := core.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/client/tx/broadcast.go b/client/tx/broadcast.go index 709364173a..44fb12544e 100644 --- a/client/tx/broadcast.go +++ b/client/tx/broadcast.go @@ -22,7 +22,7 @@ func BroadcastTxRequestHandler(w http.ResponseWriter, r *http.Request) { return } - res, err := core.BroadcastTx([]byte(m.TxBytes)) + res, err := core.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 7c8c4d124f..f64fba8017 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/core" 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 := core.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/client/tx/search.go b/client/tx/search.go index 2790750ebe..d5cc642f14 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/core" "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 := core.NewCoreContextFromViper().GetNode() if err != nil { return nil, err } diff --git a/examples/democoin/x/cool/commands/tx.go b/examples/democoin/x/cool/commands/tx.go index d195071dbd..710a225586 100644 --- a/examples/democoin/x/cool/commands/tx.go +++ b/examples/democoin/x/cool/commands/tx.go @@ -24,8 +24,10 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { return errors.New("You must provide an answer") } + ctx := core.NewCoreContextFromViper() + // get the from address from the name flag - from, err := core.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 := core.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 := core.NewCoreContextFromViper() + // get the from address from the name flag - from, err := core.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 := core.SignBuildBroadcast(name, msg, cdc) + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } diff --git a/x/auth/commands/account.go b/x/auth/commands/account.go index 49d6ec2ab6..470aa0eeac 100644 --- a/x/auth/commands/account.go +++ b/x/auth/commands/account.go @@ -64,7 +64,9 @@ func (c commander) getAccountCmd(cmd *cobra.Command, args []string) error { } key := sdk.Address(bz) - res, err := core.Query(key, c.storeName) + ctx := core.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 0e73ea02d3..d30af45071 100644 --- a/x/auth/rest/query.go +++ b/x/auth/rest/query.go @@ -33,7 +33,7 @@ func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.A } key := sdk.Address(bz) - res, err := core.Query(key, c.storeName) + res, err := core.NewCoreContextFromViper().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 9dc2daa7df..67b600787a 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -38,8 +38,10 @@ type Commander struct { } func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { + ctx := core.NewCoreContextFromViper() + // get the from address - from, err := core.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -66,7 +68,7 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { msg := BuildMsg(from, to, coins) // build and sign the transaction, then broadcast to Tendermint - res, err := core.SignBuildBroadcast(name, msg, c.Cdc) + res, err := ctx.SignBuildBroadcast(name, msg, c.Cdc) if err != nil { return err } diff --git a/x/bank/rest/sendtx.go b/x/bank/rest/sendtx.go index c496fc818a..faa82f0186 100644 --- a/x/bank/rest/sendtx.go +++ b/x/bank/rest/sendtx.go @@ -75,7 +75,8 @@ func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWrit // sign // XXX: OMG viper.Set(client.FlagSequence, m.Sequence) - txBytes, err := core.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) + ctx := core.NewCoreContextFromViper() + 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 +84,7 @@ func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWrit } // send - res, err := core.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 e063b82b2d..bff7515451 100644 --- a/x/ibc/commands/ibctx.go +++ b/x/ibc/commands/ibctx.go @@ -39,8 +39,10 @@ type sendCommander struct { } func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error { + ctx := core.NewCoreContextFromViper() + // get the from address - from, err := core.GetFromAddress() + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -54,7 +56,7 @@ func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error // get password name := viper.GetString(client.FlagName) - res, err := core.SignBuildBroadcast(name, msg, c.cdc) + res, err := ctx.SignBuildBroadcast(name, msg, c.cdc) if err != nil { return err } diff --git a/x/ibc/commands/relay.go b/x/ibc/commands/relay.go index 305b09d877..c3000df8d8 100644 --- a/x/ibc/commands/relay.go +++ b/x/ibc/commands/relay.go @@ -74,7 +74,7 @@ func (c relayCommander) runIBCRelay(cmd *cobra.Command, args []string) { fromChainNode := viper.GetString(FlagFromChainNode) toChainID := viper.GetString(FlagToChainID) toChainNode := viper.GetString(FlagToChainNode) - address, err := core.GetFromAddress() + address, err := core.NewCoreContextFromViper().GetFromAddress() if err != nil { panic(err) } @@ -84,9 +84,10 @@ func (c relayCommander) runIBCRelay(cmd *cobra.Command, args []string) { } func (c relayCommander) loop(fromChainID, fromChainNode, toChainID, toChainNode string) { + ctx := core.NewCoreContextFromViper() // get password name := viper.GetString(client.FlagName) - passphrase, err := core.GetPassphraseFromStdin(name) + passphrase, err := ctx.GetPassphraseFromStdin(name) if err != nil { panic(err) } @@ -150,16 +151,13 @@ 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 = core.Query(key, storeName) + res, err = core.NewCoreContextFromViper().Query(key, storeName) viper.Set(client.FlagNode, orig) return res, err } func (c relayCommander) broadcastTx(node string, tx []byte) error { - viper.Set(client.FlagNode, node) - seq := c.getSequence(node) + 1 - viper.Set(client.FlagSequence, seq) - _, err := core.BroadcastTx(tx) + _, err := core.NewCoreContextFromViper().WithSequence(c.getSequence(node) + 1).WithNodeURI(node).BroadcastTx(tx) return err } @@ -194,7 +192,7 @@ func (c relayCommander) refine(bz []byte, sequence int64, passphrase string) []b } name := viper.GetString(client.FlagName) - res, err := core.SignAndBuild(name, passphrase, msg, c.cdc) + res, err := core.NewCoreContextFromViper().SignAndBuild(name, passphrase, msg, c.cdc) if err != nil { panic(err) } diff --git a/x/ibc/rest/transfer.go b/x/ibc/rest/transfer.go index 974b6edd90..308e7c0a6c 100644 --- a/x/ibc/rest/transfer.go +++ b/x/ibc/rest/transfer.go @@ -73,7 +73,8 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response // sign // XXX: OMG viper.Set(client.FlagSequence, m.Sequence) - txBytes, err := core.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) + ctx := core.NewCoreContextFromViper() + 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 +82,7 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response } // send - res, err := core.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 bf35f545a1..b1ef72aa81 100644 --- a/x/simplestake/commands/commands.go +++ b/x/simplestake/commands/commands.go @@ -48,7 +48,9 @@ type commander struct { } func (co commander) bondTxCmd(cmd *cobra.Command, args []string) error { - from, err := core.GetFromAddress() + ctx := core.NewCoreContextFromViper() + + from, err := ctx.GetFromAddress() if err != nil { return err } @@ -82,7 +84,7 @@ func (co commander) bondTxCmd(cmd *cobra.Command, args []string) error { } func (co commander) unbondTxCmd(cmd *cobra.Command, args []string) error { - from, err := core.GetFromAddress() + from, err := core.NewCoreContextFromViper().GetFromAddress() if err != nil { return err } @@ -94,7 +96,7 @@ 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 := core.SignBuildBroadcast(name, msg, co.cdc) + res, err := core.NewCoreContextFromViper().SignBuildBroadcast(name, msg, co.cdc) if err != nil { return err } diff --git a/x/stake/commands/query.go b/x/stake/commands/query.go index 474f5438ba..2fedcfc4ad 100644 --- a/x/stake/commands/query.go +++ b/x/stake/commands/query.go @@ -47,7 +47,8 @@ func GetCmdQueryCandidates(cdc *wire.Codec, storeName string) *cobra.Command { key := PrefixedKey(stake.MsgType, stake.CandidatesKey) - res, err := core.Query(key, storeName) + ctx := core.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 := core.Query(key, storeName) + ctx := core.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 := core.Query(key, storeName) + ctx := core.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 := core.Query(key, storeName) + ctx := core.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 732743dda7..f7df5ef7c0 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -93,7 +93,8 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { // build and sign the transaction, then broadcast to Tendermint name := viper.GetString(client.FlagName) - res, err := core.SignBuildBroadcast(name, msg, cdc) + ctx := core.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } @@ -130,7 +131,8 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { // build and sign the transaction, then broadcast to Tendermint name := viper.GetString(client.FlagName) - res, err := core.SignBuildBroadcast(name, msg, cdc) + ctx := core.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } @@ -166,7 +168,8 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { // build and sign the transaction, then broadcast to Tendermint name := viper.GetString(client.FlagName) - res, err := core.SignBuildBroadcast(name, msg, cdc) + ctx := core.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err } @@ -213,7 +216,8 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { // build and sign the transaction, then broadcast to Tendermint name := viper.GetString(client.FlagName) - res, err := core.SignBuildBroadcast(name, msg, cdc) + ctx := core.NewCoreContextFromViper() + res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { return err }