-
Notifications
You must be signed in to change notification settings - Fork 44
/
cli_chain_links.go
146 lines (120 loc) · 4.03 KB
/
cli_chain_links.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package cli
import (
"context"
"fmt"
"strings"
"github.com/cosmos/cosmos-sdk/version"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
"github.com/spf13/cobra"
profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils"
"github.com/desmos-labs/desmos/x/profiles/types"
)
// GetCmdLinkChainAccount returns the command allowing to link an external chain account
func GetCmdLinkChainAccount() *cobra.Command {
cmd := &cobra.Command{
Use: "link-chain [data-file]",
Args: cobra.ExactArgs(1),
Short: "Link a Desmos profile to an external chain account using the data written inside the given file",
Long: strings.TrimSpace(fmt.Sprintf(`Link an external account to a Desmos profile.
The link data must be supplied via a JSON file.
Example:
$ %s tx profiles link <path/to/data.json> --from=<key_or_address>
Where data.json contains:
{
"address":{
"@type":"/desmos.profiles.v1beta1.Bech32Address",
"value":"cosmos15uc89vnzufu5kuhhsxdkltt38zfx8vcyggzwfm",
"prefix":"cosmos"
},
"proof":{
"pub_key":{
"@type":"/cosmos.crypto.secp256k1.PubKey",
"key":"A58DXR/lXKVkIjLofXgST/OHi+pkOQbVIiOjnTy7Zoqo"
},
"signature":"ecc6175e730917fb289d3a9f4e49a5630a44b42d972f481342f540e09def2ec5169780d85c4e060d52cc3ffb3d677745a4d56cd385760735bc6db0f1816713be",
"plain_text":"cosmos15uc89vnzufu5kuhhsxdkltt38zfx8vcyggzwfm"
},
"chain_config":{
"name":"cosmos"
}
}
`, version.AppName)),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
data, err := profilescliutils.ParseChainLinkJSON(clientCtx.JSONMarshaler, args[0])
if err != nil {
return err
}
addr := data.Address.GetCachedValue().(types.AddressData)
msg := types.NewMsgLinkChainAccount(
addr,
data.Proof,
data.ChainConfig,
clientCtx.GetFromAddress().String(),
)
if err = msg.ValidateBasic(); err != nil {
return fmt.Errorf("message validation failed: %w", err)
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
return cmd
}
// GetCmdUnlinkChainAccount returns the command allowing to unlink an external chain account from a profile
func GetCmdUnlinkChainAccount() *cobra.Command {
cmd := &cobra.Command{
Use: "unlink-chain [chain-name] [address]",
Short: "Unlink the external account having the given chain name and address",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
msg := types.NewMsgUnlinkChainAccount(clientCtx.FromAddress.String(), args[0], args[1])
if err = msg.ValidateBasic(); err != nil {
return fmt.Errorf("message validation failed: %w", err)
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
return cmd
}
// --------------------------------------------------------------------------------------------------------------------
// GetCmdQueryUserChainLinks returns the command allowing to query all the chain links of a specific user
func GetCmdQueryUserChainLinks() *cobra.Command {
cmd := &cobra.Command{
Use: "chain-links [address]",
Short: "Retrieve all the user's chain links with optional pagination",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
queryClient := types.NewQueryClient(clientCtx)
pageReq, err := client.ReadPageRequest(cmd.Flags())
if err != nil {
return err
}
res, err := queryClient.UserChainLinks(
context.Background(),
&types.QueryUserChainLinksRequest{User: args[0], Pagination: pageReq},
)
if err != nil {
return err
}
return clientCtx.PrintProto(res)
},
}
flags.AddPaginationFlagsToCmd(cmd, "chain_links")
flags.AddQueryFlagsToCmd(cmd)
return cmd
}