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("eAmount, 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 }