github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/farm/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	interfacetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
     7  	"strconv"
     8  	"strings"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    15  	"github.com/fibonacci-chain/fbc/x/gov"
    16  	"github.com/spf13/cobra"
    17  
    18  	client "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    20  	farmutils "github.com/fibonacci-chain/fbc/x/farm/client/utils"
    21  	"github.com/fibonacci-chain/fbc/x/farm/types"
    22  )
    23  
    24  // GetTxCmd returns the transaction commands for this module
    25  func GetTxCmd(cdc *codec.Codec) *cobra.Command {
    26  	farmTxCmd := &cobra.Command{
    27  		Use:                        types.ModuleName,
    28  		Short:                      fmt.Sprintf("%s transactions subcommands", types.ModuleName),
    29  		SuggestionsMinimumDistance: 2,
    30  	}
    31  
    32  	farmTxCmd.AddCommand(client.PostCommands(
    33  		GetCmdCreatePool(cdc),
    34  		GetCmdDestroyPool(cdc),
    35  		GetCmdProvide(cdc),
    36  		GetCmdLock(cdc),
    37  		GetCmdUnlock(cdc),
    38  		GetCmdClaim(cdc),
    39  	)...)
    40  	return farmTxCmd
    41  }
    42  
    43  func GetCmdCreatePool(cdc *codec.Codec) *cobra.Command {
    44  	cmd := &cobra.Command{
    45  		Use:   "create-pool [pool-name] [min-lock-amount] [yield-token]",
    46  		Short: "create a farm pool",
    47  		Long: strings.TrimSpace(
    48  			fmt.Sprintf(`Create a farm pool.
    49  
    50  Example:
    51  $ %s tx farm create-pool pool-eth-xxb 10eth xxb --from mykey
    52  $ %s tx farm create-pool pool-ammswap_eth_usdk-xxb 10ammswap_eth_usdk xxb --from mykey
    53  `, version.ClientName, version.ClientName),
    54  		),
    55  		Args: cobra.ExactArgs(3),
    56  		RunE: func(cmd *cobra.Command, args []string) error {
    57  			inBuf := bufio.NewReader(cmd.InOrStdin())
    58  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    59  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    60  
    61  			poolName := args[0]
    62  			minLockAmount, err := sdk.ParseDecCoin(args[1])
    63  			if err != nil {
    64  				return err
    65  			}
    66  			yieldToken := args[2]
    67  			msg := types.NewMsgCreatePool(cliCtx.GetFromAddress(), poolName, minLockAmount, yieldToken)
    68  
    69  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    70  		},
    71  	}
    72  	return cmd
    73  }
    74  
    75  func GetCmdDestroyPool(cdc *codec.Codec) *cobra.Command {
    76  	cmd := &cobra.Command{
    77  		Use:   "destroy-pool [pool-name]",
    78  		Short: "destroy a farm pool",
    79  		Long: strings.TrimSpace(
    80  			fmt.Sprintf(`Destroy a farm pool.
    81  
    82  Example:
    83  $ %s tx farm destroy-pool pool-eth-xxb --from mykey
    84  `, version.ClientName),
    85  		),
    86  		Args: cobra.ExactArgs(1),
    87  		RunE: func(cmd *cobra.Command, args []string) error {
    88  			inBuf := bufio.NewReader(cmd.InOrStdin())
    89  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    90  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    91  			poolName := args[0]
    92  			msg := types.NewMsgDestroyPool(cliCtx.GetFromAddress(), poolName)
    93  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    94  		},
    95  	}
    96  	return cmd
    97  }
    98  
    99  func GetCmdProvide(cdc *codec.Codec) *cobra.Command {
   100  	cmd := &cobra.Command{
   101  		Use:   "provide [pool-name] [amount] [yield-per-block] [start-height-to-yield]",
   102  		Short: "provide a number of yield tokens into a pool",
   103  		Long: strings.TrimSpace(
   104  			fmt.Sprintf(`Provide a number of yield tokens into a pool.
   105  
   106  Example:
   107  $ %s tx farm provide pool-eth-xxb 1000xxb 5 10000 --from mykey
   108  `, version.ClientName),
   109  		),
   110  		Args: cobra.ExactArgs(4),
   111  		RunE: func(cmd *cobra.Command, args []string) error {
   112  			inBuf := bufio.NewReader(cmd.InOrStdin())
   113  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   114  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   115  
   116  			amount, err := sdk.ParseDecCoin(args[1])
   117  			if err != nil {
   118  				return err
   119  			}
   120  
   121  			yieldPerBlock, err := sdk.NewDecFromStr(args[2])
   122  			if err != nil {
   123  				return err
   124  			}
   125  
   126  			startHeightToYield, err := strconv.ParseInt(args[3], 10, 64)
   127  			if err != nil {
   128  				return err
   129  			}
   130  
   131  			poolName := args[0]
   132  			msg := types.NewMsgProvide(poolName, cliCtx.GetFromAddress(), amount, yieldPerBlock, startHeightToYield)
   133  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   134  		},
   135  	}
   136  	return cmd
   137  }
   138  
   139  func GetCmdLock(cdc *codec.Codec) *cobra.Command {
   140  	cmd := &cobra.Command{
   141  		Use:   "lock [pool-name] [amount]",
   142  		Short: "lock a number of tokens for yield farming",
   143  		Long: strings.TrimSpace(
   144  			fmt.Sprintf(`Lock a number of tokens for yield farming.
   145  
   146  Example:
   147  $ %s tx farm lock pool-eth-xxb 5eth --from mykey
   148  `, version.ClientName),
   149  		),
   150  		Args: cobra.ExactArgs(2),
   151  		RunE: func(cmd *cobra.Command, args []string) error {
   152  			inBuf := bufio.NewReader(cmd.InOrStdin())
   153  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   154  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   155  
   156  			amount, err := sdk.ParseDecCoin(args[1])
   157  			if err != nil {
   158  				return err
   159  			}
   160  
   161  			poolName := args[0]
   162  			msg := types.NewMsgLock(poolName, cliCtx.GetFromAddress(), amount)
   163  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   164  		},
   165  	}
   166  	return cmd
   167  }
   168  
   169  func GetCmdUnlock(cdc *codec.Codec) *cobra.Command {
   170  	cmd := &cobra.Command{
   171  		Use:   "unlock [pool-name] [amount]",
   172  		Short: "unlock a number of tokens",
   173  		Long: strings.TrimSpace(
   174  			fmt.Sprintf(`Unlock a number of tokens.
   175  
   176  Example:
   177  $ %s tx farm unlock pool-eth-xxb 1eth --from mykey
   178  `, version.ClientName),
   179  		),
   180  		Args: cobra.ExactArgs(2),
   181  		RunE: func(cmd *cobra.Command, args []string) error {
   182  			inBuf := bufio.NewReader(cmd.InOrStdin())
   183  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   184  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   185  
   186  			amount, err := sdk.ParseDecCoin(args[1])
   187  			if err != nil {
   188  				return err
   189  			}
   190  
   191  			poolName := args[0]
   192  			msg := types.NewMsgUnlock(poolName, cliCtx.GetFromAddress(), amount)
   193  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   194  		},
   195  	}
   196  	return cmd
   197  }
   198  
   199  func GetCmdClaim(cdc *codec.Codec) *cobra.Command {
   200  	cmd := &cobra.Command{
   201  		Use:   "claim [pool-name]",
   202  		Short: "claim yield farming rewards",
   203  		Long: strings.TrimSpace(
   204  			fmt.Sprintf(`Claim yield farming rewards.
   205  
   206  Example:
   207  $ %s tx farm claim --from mykey
   208  `, version.ClientName),
   209  		),
   210  		Args: cobra.ExactArgs(1),
   211  		RunE: func(cmd *cobra.Command, args []string) error {
   212  			inBuf := bufio.NewReader(cmd.InOrStdin())
   213  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   214  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   215  
   216  			poolName := args[0]
   217  			msg := types.NewMsgClaim(poolName, cliCtx.GetFromAddress())
   218  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   219  		},
   220  	}
   221  	return cmd
   222  }
   223  
   224  // GetCmdManageWhiteListProposal implements a command handler for submitting a farm manage white list proposal transaction
   225  func GetCmdManageWhiteListProposal(cdcP *codec.CodecProxy, reg interfacetypes.InterfaceRegistry) *cobra.Command {
   226  	return &cobra.Command{
   227  		Use:   "manage-white-list [proposal-file]",
   228  		Args:  cobra.ExactArgs(1),
   229  		Short: "Submit a manage white list proposal",
   230  		Long: strings.TrimSpace(
   231  			fmt.Sprintf(`Submit a manage white list proposal along with an initial deposit.
   232  The proposal details must be supplied via a JSON file.
   233  
   234  Example:
   235  $ %s tx gov submit-proposal manage-white-list <path/to/proposal.json> --from=<key_or_address>
   236  
   237  Where proposal.json contains:
   238  
   239  {
   240   "title": "manage white list with a pool name",
   241   "description": "add a pool name into the white list",
   242   "pool_name": "pool-eth-xxb",
   243   "is_added": true,
   244   "deposit": [
   245     {
   246       "denom": "%s",
   247       "amount": "100"
   248     }
   249   ]
   250  }
   251  `, version.ClientName, sdk.DefaultBondDenom,
   252  			)),
   253  		RunE: func(cmd *cobra.Command, args []string) error {
   254  			cdc := cdcP.GetCdc()
   255  			inBuf := bufio.NewReader(cmd.InOrStdin())
   256  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   257  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   258  
   259  			proposal, err := farmutils.ParseManageWhiteListProposalJSON(cdc, args[0])
   260  			if err != nil {
   261  				return err
   262  			}
   263  
   264  			from := cliCtx.GetFromAddress()
   265  			content := types.NewManageWhiteListProposal(proposal.Title, proposal.Description, proposal.PoolName, proposal.IsAdded)
   266  			msg := gov.NewMsgSubmitProposal(content, proposal.Deposit, from)
   267  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   268  		},
   269  	}
   270  }