-
Notifications
You must be signed in to change notification settings - Fork 37
/
tx_swap_by_denom.go
99 lines (87 loc) · 2.67 KB
/
tx_swap_by_denom.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package cli
import (
"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/elys-network/elys/x/amm/types"
"github.com/spf13/cobra"
)
const (
FlagMinAmount = "min-amount"
FlagMaxAmount = "max-amount"
)
func CmdSwapByDenom() *cobra.Command {
cmd := &cobra.Command{
Use: "swap-by-denom [amount] [denom-in] [denom-out]",
Short: "Swap an exact amount of tokens for a minimum of another token or a maximum amount of tokens for an exact amount on another token, similar to swapping a token on the trade screen GUI.",
Example: "elysd tx amm swap-by-denom 1000000000uatom uatom uusd --min-amount=1000000000uatom --max-amount=1000000000uatom --discount=0.1 --from jack --keyring-backend test",
Args: cobra.ExactArgs(3),
RunE: func(cmd *cobra.Command, args []string) (err error) {
argAmount, err := sdk.ParseCoinNormalized(args[0])
if err != nil {
return err
}
argDenomIn := args[1]
argDenomOut := args[2]
minAmountStr, err := cmd.Flags().GetString(FlagMinAmount)
if err != nil {
return err
}
minAmount := sdk.Coin{}
if minAmountStr != "" {
minAmount, err = sdk.ParseCoinNormalized(minAmountStr)
if err != nil {
return err
}
}
maxAmountStr, err := cmd.Flags().GetString(FlagMaxAmount)
if err != nil {
return err
}
maxAmount := sdk.Coin{}
if maxAmountStr == "" {
maxAmount, err = sdk.ParseCoinNormalized(maxAmountStr)
if err != nil {
return err
}
}
discountStr, err := cmd.Flags().GetString(FlagDiscount)
if err != nil {
return err
}
discount, err := sdk.NewDecFromStr(discountStr)
if err != nil {
return err
}
recipient, err := cmd.Flags().GetString(FlagRecipient)
if err != nil {
return err
}
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
msg := types.NewMsgSwapByDenom(
clientCtx.GetFromAddress().String(),
recipient,
argAmount,
minAmount,
maxAmount,
argDenomIn,
argDenomOut,
discount,
)
if err := msg.ValidateBasic(); err != nil {
return err
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
cmd.Flags().String(FlagMinAmount, "", "minimum amount of tokens to receive")
cmd.Flags().String(FlagMaxAmount, "", "maximum amount of tokens to send")
cmd.Flags().String(FlagDiscount, "0.0", "discount to apply to the swap fee (only smart contract broker can apply the discount)")
cmd.Flags().String(FlagRecipient, "", "optional recipient field for the tokens swapped to be sent to")
return cmd
}