From 1a0ea7d99132a4f52f5992ff484e6b5ea0e8e58c Mon Sep 17 00:00:00 2001 From: stackman27 Date: Wed, 23 Nov 2022 18:02:46 -0800 Subject: [PATCH] added tx --- osmoutils/cli_helpers.go | 25 ++++++++++ x/valset-pref/client/cli/tx.go | 86 ++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 x/valset-pref/client/cli/tx.go diff --git a/osmoutils/cli_helpers.go b/osmoutils/cli_helpers.go index 88b2a25a0dd..3de665de000 100644 --- a/osmoutils/cli_helpers.go +++ b/osmoutils/cli_helpers.go @@ -47,3 +47,28 @@ func ParseSdkIntFromString(s string, separator string) ([]sdk.Int, error) { } return parsedInts, nil } + +func ParseSdkDecFromString(s string, separator string) ([]sdk.Dec, error) { + var parsedDec []sdk.Dec + for _, weightStr := range strings.Split(s, separator) { + weightStr = strings.TrimSpace(weightStr) + + parsed, err := sdk.NewDecFromStr(weightStr) + if err != nil { + return parsedDec, err + } + + parsedDec = append(parsedDec, parsed) + } + return parsedDec, nil +} + +func ParseSdkValAddressFromString(s string, separator string) []sdk.ValAddress { + var parsedAddr []sdk.ValAddress + for _, addr := range strings.Split(s, separator) { + valAddr := sdk.ValAddress([]byte(addr)) + parsedAddr = append(parsedAddr, valAddr) + } + + return parsedAddr +} diff --git a/x/valset-pref/client/cli/tx.go b/x/valset-pref/client/cli/tx.go new file mode 100644 index 00000000000..d6732a1b76c --- /dev/null +++ b/x/valset-pref/client/cli/tx.go @@ -0,0 +1,86 @@ +package valsetprefcli + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/v13/osmoutils" + "github.com/osmosis-labs/osmosis/v13/x/valset-pref/types" + "github.com/spf13/cobra" +) + +func NewTxCmd() *cobra.Command { + txCmd := &cobra.Command{ + Use: types.ModuleName, + Short: "Generalized automated market maker transaction subcommands", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + txCmd.AddCommand( + NewSetValSetCmd(), + ) + + return txCmd +} + +func NewSetValSetCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "set-valset [delegator_addr] [validators] [weights]", + Short: "Creates a new validator set for the delegator with valOperAddress and weight", + Example: "osmosisd tx valset-pref set-valset osmo1... osmovaloper1abc...,osmovaloper1def... 0.56,0.44", + + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + txf := tx.NewFactoryCLI(clientCtx, cmd.Flags()).WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) + + delAddr, err := sdk.AccAddressFromBech32(args[0]) + if err != nil { + return err + } + + valAddrs := osmoutils.ParseSdkValAddressFromString(args[1], ",") + + weights, err := osmoutils.ParseSdkDecFromString(args[2], ",") + if err != nil { + return err + } + + if len(valAddrs) != len(weights) { + return fmt.Errorf("the length of validator addresses and weights not matched") + } + + if len(valAddrs) == 0 { + return fmt.Errorf("records is empty") + } + + var valset []types.ValidatorPreference + for i, val := range valAddrs { + valset = append(valset, types.ValidatorPreference{ + Weight: weights[i], + ValOperAddress: val.String(), + }) + } + + msg := types.NewMsgSetValidatorSetPreference( + delAddr, + valset, + ) + + return tx.GenerateOrBroadcastTxWithFactory(clientCtx, txf, msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +}