diff --git a/cmd/gaia/cmd/cli_test.go b/cmd/gaia/cmd/cli_test.go index 8011d7a69..b1af5f7b7 100644 --- a/cmd/gaia/cmd/cli_test.go +++ b/cmd/gaia/cmd/cli_test.go @@ -23,7 +23,7 @@ import ( func TestGaiaCLISend(t *testing.T) { - tests.ExecuteT(t, "gaiad unsafe_reset_all") + tests.ExecuteT(t, "gaiad unsafe_reset_all", 1) pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) executeWrite(t, "gaiacli keys delete bar", pass) @@ -57,7 +57,7 @@ func TestGaiaCLISend(t *testing.T) { func TestGaiaCLIDeclareCandidacy(t *testing.T) { - tests.ExecuteT(t, "gaiad unsafe_reset_all") + tests.ExecuteT(t, "gaiad unsafe_reset_all", 1) pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) masterKey, chainID := executeInit(t, "gaiad init") @@ -76,18 +76,6 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { assert.Equal(t, int64(100000), fooAcc.GetCoins().AmountOf("fermion")) // declare candidacy - //--address-candidate string hex address of the validator/candidate - //--amount string Amount of coins to bond (default "1fermion") - //--chain-id string Chain ID of tendermint node - //--fee string Fee to pay along with transaction - //--keybase-sig string optional keybase signature - //--moniker string validator-candidate name - //--name string Name of private key with which to sign - //--node string : to tendermint rpc interface for this chain (default "tcp://localhost:46657") - //--pubkey string PubKey of the validator-candidate - //--sequence int Sequence number to sign the tx - //--website string optional website - //_ = fooPubKey declStr := fmt.Sprintf("gaiacli declare-candidacy %v", flags) declStr += fmt.Sprintf(" --name=%v", "foo") declStr += fmt.Sprintf(" --address-candidate=%v", fooAddr) @@ -99,8 +87,25 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { time.Sleep(time.Second * 3) // waiting for some blocks to pass fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) assert.Equal(t, int64(99997), fooAcc.GetCoins().AmountOf("fermion")) - candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address=%v", flags, fooAddr)) + candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, fooAddr)) assert.Equal(t, candidate.Address.String(), fooAddr) + assert.Equal(t, int64(3), candidate.Assets.Evaluate()) + + // TODO figure out why this times out with connection refused errors in go-bash + // unbond a single share + //unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) + //unbondStr += fmt.Sprintf(" --name=%v", "foo") + //unbondStr += fmt.Sprintf(" --address-candidate=%v", fooAddr) + //unbondStr += fmt.Sprintf(" --address-delegator=%v", fooAddr) + //unbondStr += fmt.Sprintf(" --shares=%v", "1") + //unbondStr += fmt.Sprintf(" --sequence=%v", "1") + //fmt.Printf("debug unbondStr: %v\n", unbondStr) + //executeWrite(t, unbondStr, pass) + //time.Sleep(time.Second * 3) // waiting for some blocks to pass + //fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) + //assert.Equal(t, int64(99998), fooAcc.GetCoins().AmountOf("fermion")) + //candidate = executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, fooAddr)) + //assert.Equal(t, int64(2), candidate.Assets.Evaluate()) } func executeWrite(t *testing.T, cmdStr string, writes ...string) { @@ -128,7 +133,7 @@ func executeWritePrint(t *testing.T, cmdStr string, writes ...string) { } func executeInit(t *testing.T, cmdStr string) (masterKey, chainID string) { - out := tests.ExecuteT(t, cmdStr) + out := tests.ExecuteT(t, cmdStr, 1) outCut := "{" + strings.SplitN(out, "{", 2)[1] // weird I'm sorry var initRes map[string]json.RawMessage @@ -142,7 +147,7 @@ func executeInit(t *testing.T, cmdStr string) (masterKey, chainID string) { } func executeGetAddr(t *testing.T, cmdStr string) (addr, pubKey string) { - out := tests.ExecuteT(t, cmdStr) + out := tests.ExecuteT(t, cmdStr, 2) var info crkeys.Info keys.UnmarshalJSON([]byte(out), &info) pubKey = hex.EncodeToString(info.PubKey.(crypto.PubKeyEd25519).Bytes()) @@ -158,7 +163,7 @@ func executeGetAddr(t *testing.T, cmdStr string) (addr, pubKey string) { } func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { - out := tests.ExecuteT(t, cmdStr) + out := tests.ExecuteT(t, cmdStr, 2) var initRes map[string]json.RawMessage err := json.Unmarshal([]byte(out), &initRes) require.NoError(t, err, "out %v, err %v", out, err) @@ -170,7 +175,7 @@ func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { } func executeGetCandidate(t *testing.T, cmdStr string) stake.Candidate { - out := tests.ExecuteT(t, cmdStr) + out := tests.ExecuteT(t, cmdStr, 2) var candidate stake.Candidate cdc := app.MakeCodec() err := cdc.UnmarshalJSON([]byte(out), &candidate) diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index c5c3190c3..1e5528308 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -48,10 +48,10 @@ func main() { rootCmd.AddCommand( client.GetCommands( authcmd.GetAccountCmd("main", cdc, authcmd.GetAccountDecoder(cdc)), - stakecmd.GetCmdQueryCandidates("stake", cdc), stakecmd.GetCmdQueryCandidate("stake", cdc), + //stakecmd.GetCmdQueryCandidates("stake", cdc), stakecmd.GetCmdQueryDelegatorBond("stake", cdc), - stakecmd.GetCmdQueryDelegatorBonds("stake", cdc), + //stakecmd.GetCmdQueryDelegatorBonds("stake", cdc), )...) rootCmd.AddCommand( client.PostCommands( diff --git a/server/init.go b/server/init.go index 8c82d2796..f2578cb19 100644 --- a/server/init.go +++ b/server/init.go @@ -70,7 +70,7 @@ func (c initCmd) run(cmd *cobra.Command, args []string) error { return nil } - // generate secrete and address + // generate secret and address addr, secret, err := GenerateCoinKey() if err != nil { return err diff --git a/tests/gobash.go b/tests/gobash.go index 12b3da085..c106c1f3f 100644 --- a/tests/gobash.go +++ b/tests/gobash.go @@ -1,6 +1,7 @@ package tests import ( + "fmt" "io" "os/exec" "strings" @@ -25,10 +26,15 @@ func getCmd(t *testing.T, command string) *exec.Cmd { return cmd } -// Execute the command, return standard output and error -func ExecuteT(t *testing.T, command string) (out string) { +// Execute the command, return standard output and error, try a few times if requested +func ExecuteT(t *testing.T, command string, trials int) (out string) { cmd := getCmd(t, command) bz, err := cmd.CombinedOutput() + if err != nil && trials > 1 { + fmt.Printf("trial %v, retrying: %v\n", trials, command) + time.Sleep(time.Second * 10) + return ExecuteT(t, command, trials-1) + } require.NoError(t, err, string(bz)) out = strings.Trim(string(bz), "\n") //trim any new lines time.Sleep(time.Second) diff --git a/x/stake/commands/flags.go b/x/stake/commands/flags.go new file mode 100644 index 000000000..e5b97d62c --- /dev/null +++ b/x/stake/commands/flags.go @@ -0,0 +1,41 @@ +package commands + +import ( + flag "github.com/spf13/pflag" +) + +// nolint +const ( + FlagAddressDelegator = "address-delegator" + FlagAddressCandidate = "address-candidate" + FlagPubKey = "pubkey" + FlagAmount = "amount" + FlagShares = "shares" + + FlagMoniker = "moniker" + FlagIdentity = "keybase-sig" + FlagWebsite = "website" + FlagDetails = "details" +) + +// common flagsets to add to various functions +var ( + fsPk = flag.NewFlagSet("", flag.ContinueOnError) + fsAmount = flag.NewFlagSet("", flag.ContinueOnError) + fsShares = flag.NewFlagSet("", flag.ContinueOnError) + fsDescription = flag.NewFlagSet("", flag.ContinueOnError) + fsCandidate = flag.NewFlagSet("", flag.ContinueOnError) + fsDelegator = flag.NewFlagSet("", flag.ContinueOnError) +) + +func init() { + fsPk.String(FlagPubKey, "", "PubKey of the validator-candidate") + fsAmount.String(FlagAmount, "1fermion", "Amount of coins to bond") + fsShares.String(FlagShares, "", "Amount of shares to unbond, either in decimal or keyword MAX (ex. 1.23456789, 99, MAX)") + fsDescription.String(FlagMoniker, "", "validator-candidate name") + fsDescription.String(FlagIdentity, "", "optional keybase signature") + fsDescription.String(FlagWebsite, "", "optional website") + fsDescription.String(FlagDetails, "", "optional details") + fsCandidate.String(FlagAddressCandidate, "", "hex address of the validator/candidate") + fsDelegator.String(FlagAddressDelegator, "", "hex address of the delegator") +} diff --git a/x/stake/commands/query.go b/x/stake/commands/query.go index 187de702c..3bc2cffa7 100644 --- a/x/stake/commands/query.go +++ b/x/stake/commands/query.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/spf13/cobra" - flag "github.com/spf13/pflag" "github.com/spf13/viper" crypto "github.com/tendermint/go-crypto" @@ -16,56 +15,41 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -//nolint -var ( - fsValAddr = flag.NewFlagSet("", flag.ContinueOnError) - fsDelAddr = flag.NewFlagSet("", flag.ContinueOnError) - FlagValidatorAddr = "address" - FlagDelegatorAddr = "delegator-address" -) +//// create command to query for all candidates +//func GetCmdQueryCandidates(storeName string, cdc *wire.Codec) *cobra.Command { +//cmd := &cobra.Command{ +//Use: "candidates", +//Short: "Query for the set of validator-candidates pubkeys", +//RunE: func(cmd *cobra.Command, args []string) error { -func init() { - //Add Flags - fsValAddr.String(FlagValidatorAddr, "", "Address of the validator/candidate") - fsDelAddr.String(FlagDelegatorAddr, "", "Delegator hex address") +//key := stake.CandidatesKey -} +//ctx := context.NewCoreContextFromViper() +//res, err := ctx.Query(key, storeName) +//if err != nil { +//return err +//} -// create command to query for all candidates -func GetCmdQueryCandidates(storeName string, cdc *wire.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "candidates", - Short: "Query for the set of validator-candidates pubkeys", - RunE: func(cmd *cobra.Command, args []string) error { +//// parse out the candidates +//candidates := new(stake.Candidates) +//err = cdc.UnmarshalBinary(res, candidates) +//if err != nil { +//return err +//} +//output, err := wire.MarshalJSONIndent(cdc, candidates) +//if err != nil { +//return err +//} +//fmt.Println(string(output)) +//return nil - key := stake.CandidatesKey +//// TODO output with proofs / machine parseable etc. +//}, +//} - ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) - if err != nil { - return err - } - - // parse out the candidates - candidates := new(stake.Candidates) - err = cdc.UnmarshalBinary(res, candidates) - if err != nil { - return err - } - output, err := wire.MarshalJSONIndent(cdc, candidates) - if err != nil { - return err - } - fmt.Println(string(output)) - return nil - - // TODO output with proofs / machine parseable etc. - }, - } - - cmd.Flags().AddFlagSet(fsDelAddr) - return cmd -} +//cmd.Flags().AddFlagSet(fsDelegator) +//return cmd +//} // get the command to query a candidate func GetCmdQueryCandidate(storeName string, cdc *wire.Codec) *cobra.Command { @@ -74,7 +58,7 @@ func GetCmdQueryCandidate(storeName string, cdc *wire.Codec) *cobra.Command { Short: "Query a validator-candidate account", RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAddress(viper.GetString(FlagValidatorAddr)) + addr, err := sdk.GetAddress(viper.GetString(FlagAddressCandidate)) if err != nil { return err } @@ -105,7 +89,7 @@ func GetCmdQueryCandidate(storeName string, cdc *wire.Codec) *cobra.Command { }, } - cmd.Flags().AddFlagSet(fsValAddr) + cmd.Flags().AddFlagSet(fsCandidate) return cmd } @@ -116,12 +100,12 @@ func GetCmdQueryDelegatorBond(storeName string, cdc *wire.Codec) *cobra.Command Short: "Query a delegators bond based on address and candidate pubkey", RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAddress(viper.GetString(FlagValidatorAddr)) + addr, err := sdk.GetAddress(viper.GetString(FlagAddressCandidate)) if err != nil { return err } - bz, err := hex.DecodeString(viper.GetString(FlagDelegatorAddr)) + bz, err := hex.DecodeString(viper.GetString(FlagAddressDelegator)) if err != nil { return err } @@ -137,7 +121,7 @@ func GetCmdQueryDelegatorBond(storeName string, cdc *wire.Codec) *cobra.Command } // parse out the bond - var bond stake.DelegatorBond + bond := new(stake.DelegatorBond) err = cdc.UnmarshalBinary(res, bond) if err != nil { return err @@ -153,49 +137,49 @@ func GetCmdQueryDelegatorBond(storeName string, cdc *wire.Codec) *cobra.Command }, } - cmd.Flags().AddFlagSet(fsValAddr) - cmd.Flags().AddFlagSet(fsDelAddr) + cmd.Flags().AddFlagSet(fsCandidate) + cmd.Flags().AddFlagSet(fsDelegator) return cmd } -// get the command to query all the candidates bonded to a delegator -func GetCmdQueryDelegatorBonds(storeName string, cdc *wire.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "delegator-candidates", - Short: "Query all delegators candidates' pubkeys based on address", - RunE: func(cmd *cobra.Command, args []string) error { +//// get the command to query all the candidates bonded to a delegator +//func GetCmdQueryDelegatorBonds(storeName string, cdc *wire.Codec) *cobra.Command { +//cmd := &cobra.Command{ +//Use: "delegator-candidates", +//Short: "Query all delegators bond's candidate-addresses based on delegator-address", +//RunE: func(cmd *cobra.Command, args []string) error { - bz, err := hex.DecodeString(viper.GetString(FlagDelegatorAddr)) - if err != nil { - return err - } - delegator := crypto.Address(bz) +//bz, err := hex.DecodeString(viper.GetString(FlagAddressDelegator)) +//if err != nil { +//return err +//} +//delegator := crypto.Address(bz) - key := stake.GetDelegatorBondsKey(delegator, cdc) +//key := stake.GetDelegatorBondsKey(delegator, cdc) - ctx := context.NewCoreContextFromViper() +//ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) - if err != nil { - return err - } +//res, err := ctx.Query(key, storeName) +//if err != nil { +//return err +//} - // parse out the candidates list - var candidates []crypto.PubKey - err = cdc.UnmarshalBinary(res, candidates) - if err != nil { - return err - } - output, err := wire.MarshalJSONIndent(cdc, candidates) - if err != nil { - return err - } - fmt.Println(string(output)) - return nil +//// parse out the candidates list +//var candidates []crypto.PubKey +//err = cdc.UnmarshalBinary(res, candidates) +//if err != nil { +//return err +//} +//output, err := wire.MarshalJSONIndent(cdc, candidates) +//if err != nil { +//return err +//} +//fmt.Println(string(output)) +//return nil - // TODO output with proofs / machine parseable etc. - }, - } - cmd.Flags().AddFlagSet(fsDelAddr) - return cmd -} +//// TODO output with proofs / machine parseable etc. +//}, +//} +//cmd.Flags().AddFlagSet(fsDelegator) +//return cmd +//} diff --git a/x/stake/commands/tx.go b/x/stake/commands/tx.go index 55e009db0..4a1983743 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -5,12 +5,10 @@ import ( "fmt" "github.com/spf13/cobra" - flag "github.com/spf13/pflag" "github.com/spf13/viper" crypto "github.com/tendermint/go-crypto" - "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" @@ -18,52 +16,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -// nolint -const ( - FlagAddressDelegator = "address-delegator" - FlagAddressCandidate = "address-candidate" - FlagPubKey = "pubkey" - FlagAmount = "amount" - FlagShares = "shares" - - FlagMoniker = "moniker" - FlagIdentity = "keybase-sig" - FlagWebsite = "website" - FlagDetails = "details" -) - -// common flagsets to add to various functions -var ( - fsPk = flag.NewFlagSet("", flag.ContinueOnError) - fsAmount = flag.NewFlagSet("", flag.ContinueOnError) - fsShares = flag.NewFlagSet("", flag.ContinueOnError) - fsCandidate = flag.NewFlagSet("", flag.ContinueOnError) - fsDelegator = flag.NewFlagSet("", flag.ContinueOnError) -) - -func init() { - fsPk.String(FlagPubKey, "", "PubKey of the validator-candidate") - fsAmount.String(FlagAmount, "1fermion", "Amount of coins to bond") - fsShares.String(FlagShares, "", "Amount of shares to unbond, either in decimal or keyword MAX (ex. 1.23456789, 99, MAX)") - fsCandidate.String(FlagMoniker, "", "validator-candidate name") - fsCandidate.String(FlagIdentity, "", "optional keybase signature") - fsCandidate.String(FlagWebsite, "", "optional website") - fsCandidate.String(FlagAddressCandidate, "", "hex address of the validator/candidate") - fsDelegator.String(FlagAddressCandidate, "", "hex address of the delegator") - fsDelegator.String(FlagAddressDelegator, "", "hex address of the delegator") -} - -//TODO refactor to common functionality -func getNamePassword() (name, passphrase string, err error) { - name = viper.GetString(client.FlagName) - buf := client.BufferStdin() - prompt := fmt.Sprintf("Password to sign with '%s':", name) - passphrase, err = client.GetPassword(prompt, buf) - return -} - -//_________________________________________________________________________________________ - // create declare candidacy command func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ @@ -114,6 +66,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { cmd.Flags().AddFlagSet(fsPk) cmd.Flags().AddFlagSet(fsAmount) + cmd.Flags().AddFlagSet(fsDescription) cmd.Flags().AddFlagSet(fsCandidate) return cmd } @@ -156,6 +109,7 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { }, } + cmd.Flags().AddFlagSet(fsDescription) cmd.Flags().AddFlagSet(fsCandidate) return cmd } @@ -200,6 +154,7 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { cmd.Flags().AddFlagSet(fsAmount) cmd.Flags().AddFlagSet(fsDelegator) + cmd.Flags().AddFlagSet(fsCandidate) return cmd } @@ -253,6 +208,7 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { cmd.Flags().AddFlagSet(fsShares) cmd.Flags().AddFlagSet(fsDelegator) + cmd.Flags().AddFlagSet(fsCandidate) return cmd } diff --git a/x/stake/types.go b/x/stake/types.go index b0dbc0b1f..9f7d97ae5 100644 --- a/x/stake/types.go +++ b/x/stake/types.go @@ -153,7 +153,7 @@ func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator { // pubKey. // TODO better way of managing space type DelegatorBond struct { - DelegatorAddr sdk.Address `json:"delegatoraddr"` + DelegatorAddr sdk.Address `json:"delegator_addr"` CandidateAddr sdk.Address `json:"candidate_addr"` Shares sdk.Rat `json:"shares"` }