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

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    10  	client "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    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/ammswap/types"
    16  	"github.com/spf13/cobra"
    17  )
    18  
    19  // flags
    20  const (
    21  	flagMinLiquidity     = "min-liquidity"
    22  	flagMaxBaseAmount    = "max-base-amount"
    23  	flagQuoteAmount      = "quote-amount"
    24  	flagDeadlineDuration = "deadline-duration"
    25  	flagLiquidity        = "liquidity"
    26  	flagMinBaseAmount    = "min-base-amount"
    27  	flagMinQuoteAmount   = "min-quote-amount"
    28  	flagSellAmount       = "sell-amount"
    29  	flagMinBuyAmount     = "min-buy-amount"
    30  	flagRecipient        = "recipient"
    31  	flagToken0           = "token0"
    32  	flagToken1           = "token1"
    33  )
    34  
    35  // GetTxCmd returns the transaction commands for this module
    36  func GetTxCmd(cdc *codec.Codec) *cobra.Command {
    37  	txCmd := &cobra.Command{
    38  		Use:   "swap",
    39  		Short: "Swap transactions subcommands",
    40  	}
    41  
    42  	txCmd.AddCommand(client.PostCommands(
    43  		getCmdAddLiquidity(cdc),
    44  		getCmdRemoveLiquidity(cdc),
    45  		getCmdCreateExchange(cdc),
    46  		getCmdTokenSwap(cdc),
    47  	)...)
    48  
    49  	return txCmd
    50  }
    51  
    52  func getCmdAddLiquidity(cdc *codec.Codec) *cobra.Command {
    53  	// flags
    54  	var minLiquidity string
    55  	var maxBaseAmount string
    56  	var quoteAmount string
    57  	var deadlineDuration string
    58  	cmd := &cobra.Command{
    59  		Use:   "add-liquidity",
    60  		Short: "add liquidity",
    61  		Long: strings.TrimSpace(
    62  			fmt.Sprintf(`add liquidity.
    63  
    64  Example:
    65  $ fbchaincli tx swap add-liquidity --max-base-amount 10eth-355 --quote-amount 100btc-366 --min-liquidity 0.001
    66  
    67  `),
    68  		),
    69  		RunE: func(cmd *cobra.Command, args []string) error {
    70  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    71  			inBuf := bufio.NewReader(cmd.InOrStdin())
    72  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    73  
    74  			minLiquidityDec, sdkErr := sdk.NewDecFromStr(minLiquidity)
    75  			if sdkErr != nil {
    76  				return sdkErr
    77  			}
    78  			maxBaseAmountDecCoin, err := sdk.ParseDecCoin(maxBaseAmount)
    79  			if err != nil {
    80  				return err
    81  			}
    82  			quoteAmountDecCoin, err := sdk.ParseDecCoin(quoteAmount)
    83  			if err != nil {
    84  				return err
    85  			}
    86  			duration, err := time.ParseDuration(deadlineDuration)
    87  			if err != nil {
    88  				return err
    89  			}
    90  			deadline := time.Now().Add(duration).Unix()
    91  			msg := types.NewMsgAddLiquidity(minLiquidityDec, maxBaseAmountDecCoin, quoteAmountDecCoin, deadline, cliCtx.FromAddress)
    92  
    93  			return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
    94  		},
    95  	}
    96  
    97  	cmd.Flags().StringVarP(&minLiquidity, flagMinLiquidity, "l", "", "Minimum number of sender will mint if total pool token supply is greater than 0")
    98  	cmd.Flags().StringVarP(&maxBaseAmount, flagMaxBaseAmount, "", "", "Maximum number of base amount deposited. Deposits max amount if total pool token supply is 0. For example \"100xxb\"")
    99  	cmd.Flags().StringVarP(&quoteAmount, flagQuoteAmount, "q", "", "The number of quote amount. For example \"100okb\"")
   100  	cmd.Flags().StringVarP(&deadlineDuration, flagDeadlineDuration, "d", "30s", "Duration after which this transaction can no longer be executed. such as \"300ms\", \"1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".")
   101  	cmd.MarkFlagRequired(flagMinLiquidity)
   102  	cmd.MarkFlagRequired(flagMaxBaseAmount)
   103  	cmd.MarkFlagRequired(flagQuoteAmount)
   104  	return cmd
   105  }
   106  
   107  func getCmdRemoveLiquidity(cdc *codec.Codec) *cobra.Command {
   108  	// flags
   109  	var liquidity string
   110  	var minBaseAmount string
   111  	var minQuoteAmount string
   112  	var deadlineDuration string
   113  	cmd := &cobra.Command{
   114  		Use:   "remove-liquidity",
   115  		Short: "remove liquidity",
   116  		Long: strings.TrimSpace(
   117  			fmt.Sprintf(`remove liquidity.
   118  
   119  Example:
   120  $ fbchaincli tx swap remove-liquidity --liquidity 1 --min-base-amount 10eth-355 --min-quote-amount 1btc-366
   121  
   122  `),
   123  		),
   124  		RunE: func(cmd *cobra.Command, args []string) error {
   125  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   126  			inBuf := bufio.NewReader(cmd.InOrStdin())
   127  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   128  
   129  			liquidityDec, sdkErr := sdk.NewDecFromStr(liquidity)
   130  			if sdkErr != nil {
   131  				return sdkErr
   132  			}
   133  			minBaseAmountDecCoin, err := sdk.ParseDecCoin(minBaseAmount)
   134  			if err != nil {
   135  				return err
   136  			}
   137  			minQuoteAmountDecCoin, err := sdk.ParseDecCoin(minQuoteAmount)
   138  			if err != nil {
   139  				return err
   140  			}
   141  			duration, err := time.ParseDuration(deadlineDuration)
   142  			if err != nil {
   143  				return err
   144  			}
   145  			deadline := time.Now().Add(duration).Unix()
   146  			msg := types.NewMsgRemoveLiquidity(liquidityDec, minBaseAmountDecCoin, minQuoteAmountDecCoin, deadline, cliCtx.FromAddress)
   147  
   148  			return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
   149  		},
   150  	}
   151  
   152  	cmd.Flags().StringVarP(&liquidity, flagLiquidity, "l", "", "Liquidity amount of sender will burn")
   153  	cmd.Flags().StringVarP(&minBaseAmount, flagMinBaseAmount, "", "", "Minimum number of base amount withdrawn")
   154  	cmd.Flags().StringVarP(&minQuoteAmount, flagMinQuoteAmount, "q", "", "Minimum number of quote amount withdrawn")
   155  	cmd.Flags().StringVarP(&deadlineDuration, flagDeadlineDuration, "d", "30s", "Duration after which this transaction can no longer be executed. such as \"300ms\", \"1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".")
   156  	cmd.MarkFlagRequired(flagLiquidity)
   157  	cmd.MarkFlagRequired(flagMinBaseAmount)
   158  	cmd.MarkFlagRequired(flagMinQuoteAmount)
   159  	return cmd
   160  }
   161  
   162  func getCmdCreateExchange(cdc *codec.Codec) *cobra.Command {
   163  	// flags
   164  	var token0 string
   165  	var token1 string
   166  	cmd := &cobra.Command{
   167  		Use:   "create-pair",
   168  		Short: "create token pair",
   169  		Long: strings.TrimSpace(
   170  			fmt.Sprintf(`create token pair.
   171  
   172  Example:
   173  $ fbchaincli tx swap create-pair --token0 eth-355 --token1 btc-366 --fees 0.01fibo 
   174  
   175  `),
   176  		),
   177  
   178  		RunE: func(cmd *cobra.Command, args []string) error {
   179  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   180  			inBuf := bufio.NewReader(cmd.InOrStdin())
   181  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   182  			msg := types.NewMsgCreateExchange(token0, token1, cliCtx.FromAddress)
   183  
   184  			return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
   185  		},
   186  	}
   187  
   188  	cmd.Flags().StringVar(&token0, flagToken0, "", "the base token name is required to create an AMM swap pair")
   189  	cmd.Flags().StringVar(&token1, flagToken1, "", "the quote token name is required to create an AMM swap pair")
   190  	cmd.MarkFlagRequired(flagToken0)
   191  	cmd.MarkFlagRequired(flagToken1)
   192  	return cmd
   193  }
   194  
   195  func getCmdTokenSwap(cdc *codec.Codec) *cobra.Command {
   196  	// flags
   197  	var soldTokenAmount string
   198  	var minBoughtTokenAmount string
   199  	var deadline string
   200  	var recipient string
   201  	cmd := &cobra.Command{
   202  		Use:   "token",
   203  		Short: "swap token",
   204  		Long: strings.TrimSpace(
   205  			fmt.Sprintf(`swap token.
   206  
   207  Example:
   208  $ fbchaincli tx swap token --sell-amount 1eth-355 --min-buy-amount 60btc-366
   209  
   210  `),
   211  		),
   212  		RunE: func(cmd *cobra.Command, args []string) error {
   213  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   214  			inBuf := bufio.NewReader(cmd.InOrStdin())
   215  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   216  
   217  			soldTokenAmount, err := sdk.ParseDecCoin(soldTokenAmount)
   218  			if err != nil {
   219  				return err
   220  			}
   221  			minBoughtTokenAmount, err := sdk.ParseDecCoin(minBoughtTokenAmount)
   222  			if err != nil {
   223  				return err
   224  			}
   225  			dur, err := time.ParseDuration(deadline)
   226  			if err != nil {
   227  				return err
   228  			}
   229  			deadline := time.Now().Add(dur).Unix()
   230  			var recip sdk.AccAddress
   231  			if recipient == "" {
   232  				recip = cliCtx.FromAddress
   233  			} else {
   234  				recip, err = sdk.AccAddressFromBech32(recipient)
   235  				if err != nil {
   236  					return err
   237  				}
   238  			}
   239  
   240  			msg := types.NewMsgTokenToToken(soldTokenAmount, minBoughtTokenAmount,
   241  				deadline, recip, cliCtx.FromAddress)
   242  
   243  			return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
   244  		},
   245  	}
   246  
   247  	cmd.Flags().StringVarP(&soldTokenAmount, flagSellAmount, "", "",
   248  		"Amount expected to sell")
   249  	cmd.Flags().StringVarP(&minBoughtTokenAmount, flagMinBuyAmount, "", "",
   250  		"Minimum amount expected to buy")
   251  	cmd.Flags().StringVarP(&recipient, flagRecipient, "", "",
   252  		"The address to receive the amount bought")
   253  	cmd.Flags().StringVarP(&deadline, flagDeadlineDuration, "", "100s",
   254  		"Duration after which this transaction can no longer be executed. such as \"300ms\", \"1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".")
   255  	cmd.MarkFlagRequired(flagSellAmount)
   256  	cmd.MarkFlagRequired(flagMinBuyAmount)
   257  
   258  	return cmd
   259  }