From 4aed6589f8d15cb57723261f4e7666b7fa1f60e2 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:06:45 +0800 Subject: [PATCH 01/30] Build generate chain link json command --- app/desmos/cmd/generate-chain-link-json.go | 59 +++++++++++++++++ .../cmd/generate-chain-link-json_test.go | 64 +++++++++++++++++++ app/desmos/cmd/root.go | 1 + app/desmos/cmd/sign_test.go | 1 - 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 app/desmos/cmd/generate-chain-link-json.go create mode 100644 app/desmos/cmd/generate-chain-link-json_test.go diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go new file mode 100644 index 0000000000..3c3ef76b70 --- /dev/null +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -0,0 +1,59 @@ +package cmd + +import ( + "encoding/hex" + "io/ioutil" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/desmos-labs/desmos/app" + profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" + "github.com/desmos-labs/desmos/x/profiles/types" +) + +// GetGenerateChainlinkJsonCmd returns the command allowing to generate the chain link json file for creating chain link +func GetGenerateChainlinkJsonCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "generate-chain-link-json", + Short: "generate the chain link json for creating chain link with the key specified using the --from flag", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + // generate signature + addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) + sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) + if err != nil { + return err + } + + // create chan link json + cdc, _ := app.MakeCodecs() + chainLinkJson := profilescliutils.NewChainLinkJSON( + types.NewBech32Address(addr, app.Bech32MainPrefix), + types.NewProof(pubkey, hex.EncodeToString(sig), addr), + types.NewChainConfig(app.Bech32MainPrefix), + ) + if err := chainLinkJson.UnpackInterfaces(cdc); err != nil { + return err + } + + bz, err := cdc.MarshalJSON(&chainLinkJson) + if err != nil { + return err + } + if err := ioutil.WriteFile("data.json", bz, 0644); err != nil { + return err + } + return clientCtx.PrintBytes(bz) + }, + } + flags.AddTxFlagsToCmd(cmd) + return cmd +} diff --git a/app/desmos/cmd/generate-chain-link-json_test.go b/app/desmos/cmd/generate-chain-link-json_test.go new file mode 100644 index 0000000000..80d68b1f4e --- /dev/null +++ b/app/desmos/cmd/generate-chain-link-json_test.go @@ -0,0 +1,64 @@ +package cmd_test + +import ( + "encoding/hex" + "fmt" + "os" + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/desmos-labs/desmos/app" + cmd "github.com/desmos-labs/desmos/app/desmos/cmd" + profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" + "github.com/desmos-labs/desmos/x/profiles/types" +) + +func TestGetGenerateChainlinkJsonCmd(t *testing.T) { + cfg := sdk.GetConfig() + app.SetupConfig(cfg) + + keyBase := keyring.NewInMemory() + algo := hd.Secp256k1 + hdPath := sdk.GetConfig().GetFullFundraiserPath() + + keyName := "test" + mnemonic := "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel" + _, err := keyBase.NewAccount(keyName, mnemonic, "", hdPath, algo) + require.NoError(t, err) + + output := os.Stdout + clientCtx := client.Context{}. + WithKeyring(keyBase). + WithOutput(output) + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJsonCmd(), []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, keyName), + }) + require.NoError(t, err) + + key, err := keyBase.Key(keyName) + addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, key.GetAddress()) + sig, pubkey, err := clientCtx.Keyring.Sign(keyName, []byte(addr)) + require.NoError(t, err) + + cdc, _ := app.MakeCodecs() + var data profilescliutils.ChainLinkJSON + err = cdc.UnmarshalJSON(out.Bytes(), &data) + require.NoError(t, err) + + expected := profilescliutils.NewChainLinkJSON( + types.NewBech32Address(addr, app.Bech32MainPrefix), + types.NewProof(pubkey, hex.EncodeToString(sig), addr), + types.NewChainConfig(app.Bech32MainPrefix), + ) + + require.Equal(t, expected, data) + +} diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index 82a21af1bc..200ae1932b 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -110,6 +110,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { queryCommand(), txCommand(), GetSignCmd(), + GetGenerateChainlinkJsonCmd(), keys.Commands(app.DefaultNodeHome), ) } diff --git a/app/desmos/cmd/sign_test.go b/app/desmos/cmd/sign_test.go index 665a0e0b95..5425e503ed 100644 --- a/app/desmos/cmd/sign_test.go +++ b/app/desmos/cmd/sign_test.go @@ -21,7 +21,6 @@ import ( func TestGetSignCmd(t *testing.T) { cfg := sdk.GetConfig() app.SetupConfig(cfg) - cfg.Seal() keyBase := keyring.NewInMemory() algo := hd.Secp256k1 From 1c40e11d7828de21aaadbb2c3da811bf2d1d4f49 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:07:06 +0800 Subject: [PATCH 02/30] Fix typo --- app/desmos/cmd/generate-chain-link-json.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 3c3ef76b70..49441d4f67 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -33,7 +33,7 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return err } - // create chan link json + // create chain link json cdc, _ := app.MakeCodecs() chainLinkJson := profilescliutils.NewChainLinkJSON( types.NewBech32Address(addr, app.Bech32MainPrefix), From 02e74d7e3dba701ab43c77b926e8cc88c1e94648 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:13:51 +0800 Subject: [PATCH 03/30] Make chain link json file not generate when testing --- app/desmos/cmd/generate-chain-link-json.go | 10 ++++++++-- app/desmos/cmd/generate-chain-link-json_test.go | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 49441d4f67..3b722b0acc 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -3,6 +3,7 @@ package cmd import ( "encoding/hex" "io/ioutil" + "strings" "github.com/spf13/cobra" @@ -48,12 +49,17 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { if err != nil { return err } - if err := ioutil.WriteFile("data.json", bz, 0644); err != nil { - return err + + filename, _ := cmd.Flags().GetString("filename") + if strings.TrimSpace(filename) != "" { + if err := ioutil.WriteFile("data.json", bz, 0644); err != nil { + return err + } } return clientCtx.PrintBytes(bz) }, } flags.AddTxFlagsToCmd(cmd) + cmd.Flags().String("filename", "data.json", "The name of output chain link json file") return cmd } diff --git a/app/desmos/cmd/generate-chain-link-json_test.go b/app/desmos/cmd/generate-chain-link-json_test.go index 80d68b1f4e..91b98292a6 100644 --- a/app/desmos/cmd/generate-chain-link-json_test.go +++ b/app/desmos/cmd/generate-chain-link-json_test.go @@ -40,6 +40,7 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJsonCmd(), []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, keyName), + fmt.Sprintf("--%s=%s", "filename", ""), }) require.NoError(t, err) From caa3429dbb61ed9376174b082ce6da285fdc3396 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:17:55 +0800 Subject: [PATCH 04/30] Change thecomment of the flag --- app/desmos/cmd/generate-chain-link-json.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 3b722b0acc..6f9c047dc5 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -60,6 +60,6 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { }, } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String("filename", "data.json", "The name of output chain link json file") + cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") return cmd } From b7e355351955709d1e2dad7627e797fe09f509ae Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:32:09 +0800 Subject: [PATCH 05/30] Seperate chain link generae function from cmd --- app/desmos/cmd/generate-chain-link-json.go | 42 +++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 6f9c047dc5..4b64d702ac 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -27,24 +27,12 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return err } - // generate signature - addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) - sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) - if err != nil { - return err - } - - // create chain link json - cdc, _ := app.MakeCodecs() - chainLinkJson := profilescliutils.NewChainLinkJSON( - types.NewBech32Address(addr, app.Bech32MainPrefix), - types.NewProof(pubkey, hex.EncodeToString(sig), addr), - types.NewChainConfig(app.Bech32MainPrefix), + err, chainLinkJson := GenerateChainLinkJson( + clientCtx, + app.Bech32MainPrefix, ) - if err := chainLinkJson.UnpackInterfaces(cdc); err != nil { - return err - } + cdc, _ := app.MakeCodecs() bz, err := cdc.MarshalJSON(&chainLinkJson) if err != nil { return err @@ -63,3 +51,25 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") return cmd } + +func GenerateChainLinkJson(clientCtx client.Context, prefix string) (error, profilescliutils.ChainLinkJSON) { + + // generate signature + addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) + sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) + if err != nil { + return err, profilescliutils.ChainLinkJSON{} + } + + // create chain link json + cdc, _ := app.MakeCodecs() + chainLinkJson := profilescliutils.NewChainLinkJSON( + types.NewBech32Address(addr, app.Bech32MainPrefix), + types.NewProof(pubkey, hex.EncodeToString(sig), addr), + types.NewChainConfig(app.Bech32MainPrefix), + ) + if err := chainLinkJson.UnpackInterfaces(cdc); err != nil { + return err, profilescliutils.ChainLinkJSON{} + } + return nil, chainLinkJson +} From e98064766354db61d444bb78622633681826af13 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 6 Aug 2021 19:33:33 +0800 Subject: [PATCH 06/30] Add comments --- app/desmos/cmd/generate-chain-link-json.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 4b64d702ac..d7904feaba 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -52,6 +52,7 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return cmd } +// GenerateChainLinkJson returns ChainLinkJSON instance for creating chain link func GenerateChainLinkJson(clientCtx client.Context, prefix string) (error, profilescliutils.ChainLinkJSON) { // generate signature From df91b025da1f86ec57e39e3576cde4dff4b3686c Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 9 Aug 2021 12:12:53 +0800 Subject: [PATCH 07/30] Fix lint --- app/desmos/cmd/generate-chain-link-json.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index d7904feaba..ce7a9eb487 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -27,7 +27,7 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return err } - err, chainLinkJson := GenerateChainLinkJson( + chainLinkJson, err := GenerateChainLinkJson( clientCtx, app.Bech32MainPrefix, ) @@ -53,13 +53,13 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { } // GenerateChainLinkJson returns ChainLinkJSON instance for creating chain link -func GenerateChainLinkJson(clientCtx client.Context, prefix string) (error, profilescliutils.ChainLinkJSON) { +func GenerateChainLinkJson(clientCtx client.Context, prefix string) (profilescliutils.ChainLinkJSON, error) { // generate signature addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) if err != nil { - return err, profilescliutils.ChainLinkJSON{} + return profilescliutils.ChainLinkJSON{}, err } // create chain link json @@ -70,7 +70,7 @@ func GenerateChainLinkJson(clientCtx client.Context, prefix string) (error, prof types.NewChainConfig(app.Bech32MainPrefix), ) if err := chainLinkJson.UnpackInterfaces(cdc); err != nil { - return err, profilescliutils.ChainLinkJSON{} + return profilescliutils.ChainLinkJSON{}, err } - return nil, chainLinkJson + return chainLinkJson, nil } From 6c7d35fe219853c150b7992d3526613acb861ac7 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 9 Aug 2021 12:26:27 +0800 Subject: [PATCH 08/30] Fix lint --- app/desmos/cmd/generate-chain-link-json.go | 23 +++++++++++-------- .../cmd/generate-chain-link-json_test.go | 2 +- app/desmos/cmd/root.go | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index ce7a9eb487..7b7cc0a23f 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -16,8 +16,8 @@ import ( "github.com/desmos-labs/desmos/x/profiles/types" ) -// GetGenerateChainlinkJsonCmd returns the command allowing to generate the chain link json file for creating chain link -func GetGenerateChainlinkJsonCmd() *cobra.Command { +// GetGenerateChainlinkJSONCmd returns the command allowing to generate the chain link json file for creating chain link +func GetGenerateChainlinkJSONCmd() *cobra.Command { cmd := &cobra.Command{ Use: "generate-chain-link-json", Short: "generate the chain link json for creating chain link with the key specified using the --from flag", @@ -27,20 +27,23 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return err } - chainLinkJson, err := GenerateChainLinkJson( + chainLinkJSON, err := GenerateChainLinkJSON( clientCtx, app.Bech32MainPrefix, ) + if err != nil { + return err + } cdc, _ := app.MakeCodecs() - bz, err := cdc.MarshalJSON(&chainLinkJson) + bz, err := cdc.MarshalJSON(&chainLinkJSON) if err != nil { return err } filename, _ := cmd.Flags().GetString("filename") if strings.TrimSpace(filename) != "" { - if err := ioutil.WriteFile("data.json", bz, 0644); err != nil { + if err := ioutil.WriteFile("data.json", bz, 0600); err != nil { return err } } @@ -52,8 +55,8 @@ func GetGenerateChainlinkJsonCmd() *cobra.Command { return cmd } -// GenerateChainLinkJson returns ChainLinkJSON instance for creating chain link -func GenerateChainLinkJson(clientCtx client.Context, prefix string) (profilescliutils.ChainLinkJSON, error) { +// GenerateChainLinkJSON returns ChainLinkJSON instance for creating chain link +func GenerateChainLinkJSON(clientCtx client.Context, prefix string) (profilescliutils.ChainLinkJSON, error) { // generate signature addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) @@ -64,13 +67,13 @@ func GenerateChainLinkJson(clientCtx client.Context, prefix string) (profilescli // create chain link json cdc, _ := app.MakeCodecs() - chainLinkJson := profilescliutils.NewChainLinkJSON( + chainLinkJSON := profilescliutils.NewChainLinkJSON( types.NewBech32Address(addr, app.Bech32MainPrefix), types.NewProof(pubkey, hex.EncodeToString(sig), addr), types.NewChainConfig(app.Bech32MainPrefix), ) - if err := chainLinkJson.UnpackInterfaces(cdc); err != nil { + if err := chainLinkJSON.UnpackInterfaces(cdc); err != nil { return profilescliutils.ChainLinkJSON{}, err } - return chainLinkJson, nil + return chainLinkJSON, nil } diff --git a/app/desmos/cmd/generate-chain-link-json_test.go b/app/desmos/cmd/generate-chain-link-json_test.go index 91b98292a6..f186b61cdd 100644 --- a/app/desmos/cmd/generate-chain-link-json_test.go +++ b/app/desmos/cmd/generate-chain-link-json_test.go @@ -38,7 +38,7 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { WithKeyring(keyBase). WithOutput(output) - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJsonCmd(), []string{ + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJSONCmd(), []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, keyName), fmt.Sprintf("--%s=%s", "filename", ""), }) diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index 200ae1932b..862ba41922 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -110,7 +110,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { queryCommand(), txCommand(), GetSignCmd(), - GetGenerateChainlinkJsonCmd(), + GetGenerateChainlinkJSONCmd(), keys.Commands(app.DefaultNodeHome), ) } From e68e4364773a6dfd9986d50329c61437b433f1aa Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 9 Aug 2021 12:27:46 +0800 Subject: [PATCH 09/30] Update changeset --- .changeset/entries/2021-08-09T04:27:29Z.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/entries/2021-08-09T04:27:29Z.yaml diff --git a/.changeset/entries/2021-08-09T04:27:29Z.yaml b/.changeset/entries/2021-08-09T04:27:29Z.yaml new file mode 100644 index 0000000000..1448acc47d --- /dev/null +++ b/.changeset/entries/2021-08-09T04:27:29Z.yaml @@ -0,0 +1,5 @@ +type: added +module: x/profiles +pull_request: 583 +description: Added generate chain link JSON file command +backward_compatible: true From 07a1ec1708096a2ececd791e9a03aa74efcb21bb Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 15:02:25 +0800 Subject: [PATCH 10/30] Allow generate link json using other chain config --- app/desmos/cmd/generate-chain-link-json.go | 23 ++++++++++++++----- .../cmd/generate-chain-link-json_test.go | 10 +++++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go index 7b7cc0a23f..07eeb18b24 100644 --- a/app/desmos/cmd/generate-chain-link-json.go +++ b/app/desmos/cmd/generate-chain-link-json.go @@ -2,6 +2,7 @@ package cmd import ( "encoding/hex" + "fmt" "io/ioutil" "strings" @@ -10,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/version" "github.com/desmos-labs/desmos/app" profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" @@ -20,16 +22,23 @@ import ( func GetGenerateChainlinkJSONCmd() *cobra.Command { cmd := &cobra.Command{ Use: "generate-chain-link-json", - Short: "generate the chain link json for creating chain link with the key specified using the --from flag", + Short: "Generate the chain link json for creating chain link with the key specified using the --from flag", + Long: strings.TrimSpace(fmt.Sprintf(`Generate the chain link json for creating chain link. +If you want to create chain link with the key from other chain, you have to use --prefix and --target-chain flags. +E.g. +$ %s generate-chain-link-json --prefix cosmos --target-chain cosmos --from --home ~/.gaia`, version.AppName)), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } + prefix, _ := cmd.Flags().GetString("prefix") + targetChain, _ := cmd.Flags().GetString("target-chain") chainLinkJSON, err := GenerateChainLinkJSON( clientCtx, - app.Bech32MainPrefix, + prefix, + targetChain, ) if err != nil { return err @@ -52,14 +61,16 @@ func GetGenerateChainlinkJSONCmd() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") + cmd.Flags().String("prefix", app.Bech32MainPrefix, "The bech32 prefix of the target chain.") + cmd.Flags().String("target-chain", app.Bech32MainPrefix, "The name of the target chain.") return cmd } // GenerateChainLinkJSON returns ChainLinkJSON instance for creating chain link -func GenerateChainLinkJSON(clientCtx client.Context, prefix string) (profilescliutils.ChainLinkJSON, error) { +func GenerateChainLinkJSON(clientCtx client.Context, prefix, chainName string) (profilescliutils.ChainLinkJSON, error) { // generate signature - addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, clientCtx.GetFromAddress()) + addr, _ := sdk.Bech32ifyAddressBytes(prefix, clientCtx.GetFromAddress()) sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) if err != nil { return profilescliutils.ChainLinkJSON{}, err @@ -68,9 +79,9 @@ func GenerateChainLinkJSON(clientCtx client.Context, prefix string) (profilescli // create chain link json cdc, _ := app.MakeCodecs() chainLinkJSON := profilescliutils.NewChainLinkJSON( - types.NewBech32Address(addr, app.Bech32MainPrefix), + types.NewBech32Address(addr, prefix), types.NewProof(pubkey, hex.EncodeToString(sig), addr), - types.NewChainConfig(app.Bech32MainPrefix), + types.NewChainConfig(chainName), ) if err := chainLinkJSON.UnpackInterfaces(cdc); err != nil { return profilescliutils.ChainLinkJSON{}, err diff --git a/app/desmos/cmd/generate-chain-link-json_test.go b/app/desmos/cmd/generate-chain-link-json_test.go index f186b61cdd..4f6c6b0795 100644 --- a/app/desmos/cmd/generate-chain-link-json_test.go +++ b/app/desmos/cmd/generate-chain-link-json_test.go @@ -38,14 +38,18 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { WithKeyring(keyBase). WithOutput(output) + prefix := "cosmos" + target := "cosmos" out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJSONCmd(), []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, keyName), + fmt.Sprintf("--%s=%s", "prefix", prefix), + fmt.Sprintf("--%s=%s", "target-chain", target), fmt.Sprintf("--%s=%s", "filename", ""), }) require.NoError(t, err) key, err := keyBase.Key(keyName) - addr, _ := sdk.Bech32ifyAddressBytes(app.Bech32MainPrefix, key.GetAddress()) + addr, _ := sdk.Bech32ifyAddressBytes(prefix, key.GetAddress()) sig, pubkey, err := clientCtx.Keyring.Sign(keyName, []byte(addr)) require.NoError(t, err) @@ -55,9 +59,9 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { require.NoError(t, err) expected := profilescliutils.NewChainLinkJSON( - types.NewBech32Address(addr, app.Bech32MainPrefix), + types.NewBech32Address(addr, prefix), types.NewProof(pubkey, hex.EncodeToString(sig), addr), - types.NewChainConfig(app.Bech32MainPrefix), + types.NewChainConfig(target), ) require.Equal(t, expected, data) From 14a9353ac4d490d89e734a1a4218d9b13d9c4bcd Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 20:03:07 +0800 Subject: [PATCH 11/30] Build interactive prompt for creating chain link json file --- app/desmos/cmd/create-chain-link.go | 94 +++++++++++ app/desmos/cmd/create-chain-link_test.go | 79 ++++++++++ app/desmos/cmd/generate-chain-link-json.go | 90 ----------- .../cmd/generate-chain-link-json_test.go | 69 --------- app/desmos/cmd/root.go | 7 +- app/desmos/types/chain.go | 19 +++ app/desmos/types/config.go | 19 +++ app/desmos/types/getter.go | 146 ++++++++++++++++++ go.mod | 2 + go.sum | 8 + 10 files changed, 371 insertions(+), 162 deletions(-) create mode 100644 app/desmos/cmd/create-chain-link.go create mode 100644 app/desmos/cmd/create-chain-link_test.go delete mode 100644 app/desmos/cmd/generate-chain-link-json.go delete mode 100644 app/desmos/cmd/generate-chain-link-json_test.go create mode 100644 app/desmos/types/chain.go create mode 100644 app/desmos/types/config.go create mode 100644 app/desmos/types/getter.go diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go new file mode 100644 index 0000000000..fc0ae5c5b0 --- /dev/null +++ b/app/desmos/cmd/create-chain-link.go @@ -0,0 +1,94 @@ +package cmd + +import ( + "encoding/hex" + "io/ioutil" + "strings" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/cobra" + + "github.com/desmos-labs/desmos/app" + "github.com/desmos-labs/desmos/app/desmos/types" + + profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" + profilestypes "github.com/desmos-labs/desmos/x/profiles/types" +) + +// GetCreateChainlinkFileCmd returns the command allowing to generate the chain link json file for creating chain link +func GetCreateChainlinkFileCmd(generator types.ChainLinkReferenceGetter) *cobra.Command { + cmd := &cobra.Command{ + Use: "create-chain-link-file", + Short: "Generate the chain link json for creating chain link with the key", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + mnemonic, chain, err := generator.GetReference() + if err != nil { + return err + } + + chainLinkJSON, err := generateChainLink(mnemonic, chain) + if err != nil { + return err + } + + cdc, _ := app.MakeCodecs() + bz, err := cdc.MarshalJSON(&chainLinkJSON) + if err != nil { + return err + } + + filename, _ := cmd.Flags().GetString("filename") + if strings.TrimSpace(filename) != "" { + if err := ioutil.WriteFile("data.json", bz, 0600); err != nil { + return err + } + } + return clientCtx.PrintBytes(bz) + }, + } + flags.AddTxFlagsToCmd(cmd) + cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") + return cmd +} + +// generateChainLink returns ChainLinkJSON for creating chain link +func generateChainLink(mnemonic string, chain types.ChainType) (profilescliutils.ChainLinkJSON, error) { + // generate keybase for signing + keyBase := keyring.NewInMemory() + algo := hd.Secp256k1 + hdPath := chain.DerivationPath + keyName := "chainlink" + _, err := keyBase.NewAccount("chainlink", mnemonic, "", hdPath, algo) + if err != nil { + return profilescliutils.ChainLinkJSON{}, err + } + + // create the proof with the key + key, _ := keyBase.Key(keyName) + addr, _ := sdk.Bech32ifyAddressBytes(chain.Prefix, key.GetAddress()) + sig, pubkey, err := keyBase.Sign(keyName, []byte(addr)) + if err != nil { + return profilescliutils.ChainLinkJSON{}, err + } + + // create chain link json + cdc, _ := app.MakeCodecs() + chainLinkJSON := profilescliutils.NewChainLinkJSON( + profilestypes.NewBech32Address(addr, chain.Prefix), + profilestypes.NewProof(pubkey, hex.EncodeToString(sig), addr), + profilestypes.NewChainConfig(chain.Name), + ) + if err := chainLinkJSON.UnpackInterfaces(cdc); err != nil { + return profilescliutils.ChainLinkJSON{}, err + } + return chainLinkJSON, nil +} diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/create-chain-link_test.go new file mode 100644 index 0000000000..0b679cba0b --- /dev/null +++ b/app/desmos/cmd/create-chain-link_test.go @@ -0,0 +1,79 @@ +package cmd_test + +import ( + "fmt" + "os" + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/desmos-labs/desmos/app" + cmd "github.com/desmos-labs/desmos/app/desmos/cmd" + "github.com/desmos-labs/desmos/app/desmos/types" + + profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" + profilestypes "github.com/desmos-labs/desmos/x/profiles/types" +) + +// Create mock chain type generator instead of prompt +type MockChainTypeGenerator struct{} + +func (mock MockChainTypeGenerator) GetReference() (string, types.ChainType, error) { + return "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", + types.ChainType{ID: "Cosmos", Name: "cosmos", Prefix: "cosmos", DerivationPath: "m/44'/118'/0'/0/0"}, + nil +} + +func TestGetGenerateChainlinkJsonCmd(t *testing.T) { + cfg := sdk.GetConfig() + app.SetupConfig(cfg) + + output := os.Stdout + clientCtx := client.Context{}. + WithOutput(output) + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkFileCmd(MockChainTypeGenerator{}), []string{ + fmt.Sprintf("--%s=%s", "filename", ""), + }) + require.NoError(t, err) + + cdc, _ := app.MakeCodecs() + var data profilescliutils.ChainLinkJSON + err = cdc.UnmarshalJSON(out.Bytes(), &data) + require.NoError(t, err) + + // create a account to inmemory keybase + keyBase := keyring.NewInMemory() + algo := hd.Secp256k1 + hdPath := "m/44'/118'/0'/0/0" + keyName := "chainlink" + _, err = keyBase.NewAccount( + "chainlink", + "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", + "", + hdPath, + algo, + ) + require.NoError(t, err) + + // get key from keybase + key, err := keyBase.Key(keyName) + require.NoError(t, err) + + expected := profilescliutils.NewChainLinkJSON( + profilestypes.NewBech32Address("cosmos13j7p6faa9jr8ty6lvqv0prldprr6m5xenmafnt", "cosmos"), + profilestypes.NewProof( + key.GetPubKey(), + "c3bd014b2178d63d94b9c28e628bfcf56736de28f352841b0bb27d6fff2968d62c13a10aeddd1ebfe3b13f3f8e61f79a2c63ae6ff5cb78cb0d64e6b0a70fae57", + "cosmos13j7p6faa9jr8ty6lvqv0prldprr6m5xenmafnt"), + profilestypes.NewChainConfig("cosmos"), + ) + + require.Equal(t, expected, data) + +} diff --git a/app/desmos/cmd/generate-chain-link-json.go b/app/desmos/cmd/generate-chain-link-json.go deleted file mode 100644 index 07eeb18b24..0000000000 --- a/app/desmos/cmd/generate-chain-link-json.go +++ /dev/null @@ -1,90 +0,0 @@ -package cmd - -import ( - "encoding/hex" - "fmt" - "io/ioutil" - "strings" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - - "github.com/desmos-labs/desmos/app" - profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" - "github.com/desmos-labs/desmos/x/profiles/types" -) - -// GetGenerateChainlinkJSONCmd returns the command allowing to generate the chain link json file for creating chain link -func GetGenerateChainlinkJSONCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "generate-chain-link-json", - Short: "Generate the chain link json for creating chain link with the key specified using the --from flag", - Long: strings.TrimSpace(fmt.Sprintf(`Generate the chain link json for creating chain link. -If you want to create chain link with the key from other chain, you have to use --prefix and --target-chain flags. -E.g. -$ %s generate-chain-link-json --prefix cosmos --target-chain cosmos --from --home ~/.gaia`, version.AppName)), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - prefix, _ := cmd.Flags().GetString("prefix") - targetChain, _ := cmd.Flags().GetString("target-chain") - chainLinkJSON, err := GenerateChainLinkJSON( - clientCtx, - prefix, - targetChain, - ) - if err != nil { - return err - } - - cdc, _ := app.MakeCodecs() - bz, err := cdc.MarshalJSON(&chainLinkJSON) - if err != nil { - return err - } - - filename, _ := cmd.Flags().GetString("filename") - if strings.TrimSpace(filename) != "" { - if err := ioutil.WriteFile("data.json", bz, 0600); err != nil { - return err - } - } - return clientCtx.PrintBytes(bz) - }, - } - flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") - cmd.Flags().String("prefix", app.Bech32MainPrefix, "The bech32 prefix of the target chain.") - cmd.Flags().String("target-chain", app.Bech32MainPrefix, "The name of the target chain.") - return cmd -} - -// GenerateChainLinkJSON returns ChainLinkJSON instance for creating chain link -func GenerateChainLinkJSON(clientCtx client.Context, prefix, chainName string) (profilescliutils.ChainLinkJSON, error) { - - // generate signature - addr, _ := sdk.Bech32ifyAddressBytes(prefix, clientCtx.GetFromAddress()) - sig, pubkey, err := clientCtx.Keyring.Sign(clientCtx.GetFromName(), []byte(addr)) - if err != nil { - return profilescliutils.ChainLinkJSON{}, err - } - - // create chain link json - cdc, _ := app.MakeCodecs() - chainLinkJSON := profilescliutils.NewChainLinkJSON( - types.NewBech32Address(addr, prefix), - types.NewProof(pubkey, hex.EncodeToString(sig), addr), - types.NewChainConfig(chainName), - ) - if err := chainLinkJSON.UnpackInterfaces(cdc); err != nil { - return profilescliutils.ChainLinkJSON{}, err - } - return chainLinkJSON, nil -} diff --git a/app/desmos/cmd/generate-chain-link-json_test.go b/app/desmos/cmd/generate-chain-link-json_test.go deleted file mode 100644 index 4f6c6b0795..0000000000 --- a/app/desmos/cmd/generate-chain-link-json_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package cmd_test - -import ( - "encoding/hex" - "fmt" - "os" - "testing" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/desmos-labs/desmos/app" - cmd "github.com/desmos-labs/desmos/app/desmos/cmd" - profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" - "github.com/desmos-labs/desmos/x/profiles/types" -) - -func TestGetGenerateChainlinkJsonCmd(t *testing.T) { - cfg := sdk.GetConfig() - app.SetupConfig(cfg) - - keyBase := keyring.NewInMemory() - algo := hd.Secp256k1 - hdPath := sdk.GetConfig().GetFullFundraiserPath() - - keyName := "test" - mnemonic := "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel" - _, err := keyBase.NewAccount(keyName, mnemonic, "", hdPath, algo) - require.NoError(t, err) - - output := os.Stdout - clientCtx := client.Context{}. - WithKeyring(keyBase). - WithOutput(output) - - prefix := "cosmos" - target := "cosmos" - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetGenerateChainlinkJSONCmd(), []string{ - fmt.Sprintf("--%s=%s", flags.FlagFrom, keyName), - fmt.Sprintf("--%s=%s", "prefix", prefix), - fmt.Sprintf("--%s=%s", "target-chain", target), - fmt.Sprintf("--%s=%s", "filename", ""), - }) - require.NoError(t, err) - - key, err := keyBase.Key(keyName) - addr, _ := sdk.Bech32ifyAddressBytes(prefix, key.GetAddress()) - sig, pubkey, err := clientCtx.Keyring.Sign(keyName, []byte(addr)) - require.NoError(t, err) - - cdc, _ := app.MakeCodecs() - var data profilescliutils.ChainLinkJSON - err = cdc.UnmarshalJSON(out.Bytes(), &data) - require.NoError(t, err) - - expected := profilescliutils.NewChainLinkJSON( - types.NewBech32Address(addr, prefix), - types.NewProof(pubkey, hex.EncodeToString(sig), addr), - types.NewChainConfig(target), - ) - - require.Equal(t, expected, data) - -} diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index 862ba41922..d0c5a15b47 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" "github.com/desmos-labs/desmos/app" + "github.com/desmos-labs/desmos/app/desmos/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp/params" @@ -34,7 +35,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - "github.com/cosmos/cosmos-sdk/x/auth/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" cosmosgenutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" @@ -56,7 +57,7 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). WithInput(os.Stdin). - WithAccountRetriever(types.AccountRetriever{}). + WithAccountRetriever(authtypes.AccountRetriever{}). WithBroadcastMode(flags.BroadcastBlock). WithHomeDir(app.DefaultNodeHome). WithViper("DESMOS") @@ -110,7 +111,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { queryCommand(), txCommand(), GetSignCmd(), - GetGenerateChainlinkJSONCmd(), + GetCreateChainlinkFileCmd(types.NewChainTypePrompt(types.DefaultConfig())), keys.Commands(app.DefaultNodeHome), ) } diff --git a/app/desmos/types/chain.go b/app/desmos/types/chain.go new file mode 100644 index 0000000000..d58d469426 --- /dev/null +++ b/app/desmos/types/chain.go @@ -0,0 +1,19 @@ +package types + +// ChainType contains the data of the chain +type ChainType struct { + ID string + Name string + Prefix string + DerivationPath string +} + +// NewChainType returns a new ChainType instance +func NewChainType(id, name, prefix, derivationPath string) ChainType { + return ChainType{ + id, + name, + prefix, + derivationPath, + } +} diff --git a/app/desmos/types/config.go b/app/desmos/types/config.go new file mode 100644 index 0000000000..337a9b131d --- /dev/null +++ b/app/desmos/types/config.go @@ -0,0 +1,19 @@ +package types + +// Config contains the data of the configuration +type Config struct { + Chains []ChainType `yaml:"chains"` +} + +// DefaultConfig returns the default config instance of the configuration +func DefaultConfig() Config { + return Config{ + Chains: []ChainType{ + NewChainType("Desmos", "desmos", "desmos", "m/44'/852'/0'/0/0"), + NewChainType("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), + NewChainType("Akash", "akash", "akash", "m/44'/118'/0'/0/0"), + NewChainType("Osmosis", "osmo", "osmo", "m/44'/118'/0'/0/0"), + NewChainType("Other", "", "", ""), + }, + } +} diff --git a/app/desmos/types/getter.go b/app/desmos/types/getter.go new file mode 100644 index 0000000000..30c36774b6 --- /dev/null +++ b/app/desmos/types/getter.go @@ -0,0 +1,146 @@ +package types + +import ( + "fmt" + "strings" + + "github.com/manifoldco/promptui" +) + +// ChainLinkReferenceGetter is an interface to get mnemonic and chain type +type ChainLinkReferenceGetter interface { + // GetReference returns mnemonic and ChainType instance for creating ChainLinkJSON + GetReference() (string, ChainType, error) +} + +// ChainLinkReferencePrompt is a ChainTypeGetter implemented by promptui +type ChainLinkReferencePrompt struct { + ChainLinkReferenceGetter + cfg Config +} + +// NewChainTypePrompt returns a ChainTypePrompt instance +func NewChainTypePrompt(cfg Config) *ChainLinkReferencePrompt { + return &ChainLinkReferencePrompt{cfg: cfg} +} + +// GetMnemonicAndChainType returns mnemonic and ChainType instance from the prompt +func (cp ChainLinkReferencePrompt) GetReference() (string, ChainType, error) { + mnemonic, _ := cp.getMnemonic() + chain, _ := cp.selectChain() + + if chain.ID == "Other" { + newChain, err := cp.getCustomChain(chain) + if err != nil { + return "", ChainType{}, err + } + chain = newChain + } + + return mnemonic, chain, nil +} + +// getMnemonic returns mnemonic from the prompt +func (cp ChainLinkReferencePrompt) getMnemonic() (string, error) { + prompt := promptui.Prompt{ + Label: "Please enter your mnemonic", + Validate: func(s string) error { + if strings.TrimSpace(s) == "" { + return fmt.Errorf("Invalid mnemonic") + } + return nil + }, + } + return prompt.Run() +} + +// selectChain returns ChainType instance from the prompt +func (cp ChainLinkReferencePrompt) selectChain() (ChainType, error) { + cfg := cp.cfg + prompt := promptui.Select{ + Label: "Select a target chain", + Items: cfg.Chains, + Templates: &promptui.SelectTemplates{ + Active: "\U00002713 {{ .ID | cyan }}", + Inactive: " {{ .ID | cyan }}", + Selected: "Module: \U00002713 {{ .ID | cyan }}", + }, + } + + index, _, err := prompt.Run() + if err != nil { + return ChainType{}, err + } + + return cfg.Chains[index], nil +} + +// getCustomChain returns ChainType instance not in the default config from the prompt +func (cp ChainLinkReferencePrompt) getCustomChain(chain ChainType) (ChainType, error) { + chainName, err := cp.getChainName() + if err != nil { + return ChainType{}, err + } + + prefix, err := cp.getBech32Prefix() + if err != nil { + return ChainType{}, err + } + + derivationPath, err := cp.getDerivationPath() + if err != nil { + return ChainType{}, err + } + + chain.Name = chainName + chain.Prefix = prefix + chain.DerivationPath = derivationPath + + return chain, nil +} + +// getChainName returns chain name from the prompt +func (cp ChainLinkReferencePrompt) getChainName() (string, error) { + prompt := promptui.Prompt{ + Label: "Please input the name of the chain", + Validate: func(s string) error { + if strings.TrimSpace(s) == "" { + return fmt.Errorf("Chain name cannot be empty or blank") + } + if strings.ToLower(s) != s { + return fmt.Errorf("Chain name should be lowercase") + } + return nil + }, + } + return prompt.Run() +} + +// getBech32Prefix returns bech32 prefix from the prompt +func (cp ChainLinkReferencePrompt) getBech32Prefix() (string, error) { + prompt := promptui.Prompt{ + Label: "Please input the bech32 prefix of the chain", + Validate: func(s string) error { + if strings.TrimSpace(s) == "" { + return fmt.Errorf("Invalid bech32 prefix") + } + return nil + }, + } + return prompt.Run() +} + +// getDerivationPath returns derivation path from the prompt +func (cp ChainLinkReferencePrompt) getDerivationPath() (string, error) { + prompt := promptui.Prompt{ + Label: "Please input the derivation path of the chain", + Default: "m/44'/118'/0'/0/0", + Validate: func(s string) error { + if strings.TrimSpace(s) == "" { + return fmt.Errorf("Invalid derivation path") + } + return nil + }, + } + return prompt.Run() +} diff --git a/go.mod b/go.mod index 19b61e6795..b1aeddf9fd 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/manifoldco/promptui v0.8.0 github.com/mr-tron/base58 v1.2.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 @@ -23,6 +24,7 @@ require ( google.golang.org/genproto v0.0.0-20210510173355-fb37daa5cd7a google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0 + gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index 5206447362..ffbd70415a 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,9 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -325,6 +328,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= @@ -345,10 +350,13 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= From bae26a5f718d5df06306565cdda4124b1f15a6c4 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 20:08:54 +0800 Subject: [PATCH 12/30] Fix lint --- app/desmos/types/getter.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/desmos/types/getter.go b/app/desmos/types/getter.go index 30c36774b6..9947af7d4c 100644 --- a/app/desmos/types/getter.go +++ b/app/desmos/types/getter.go @@ -46,7 +46,7 @@ func (cp ChainLinkReferencePrompt) getMnemonic() (string, error) { Label: "Please enter your mnemonic", Validate: func(s string) error { if strings.TrimSpace(s) == "" { - return fmt.Errorf("Invalid mnemonic") + return fmt.Errorf("mnemonic cannot be empty or blank") } return nil }, @@ -105,10 +105,10 @@ func (cp ChainLinkReferencePrompt) getChainName() (string, error) { Label: "Please input the name of the chain", Validate: func(s string) error { if strings.TrimSpace(s) == "" { - return fmt.Errorf("Chain name cannot be empty or blank") + return fmt.Errorf("chain name cannot be empty or blank") } if strings.ToLower(s) != s { - return fmt.Errorf("Chain name should be lowercase") + return fmt.Errorf("chain name should be lowercase") } return nil }, @@ -122,7 +122,7 @@ func (cp ChainLinkReferencePrompt) getBech32Prefix() (string, error) { Label: "Please input the bech32 prefix of the chain", Validate: func(s string) error { if strings.TrimSpace(s) == "" { - return fmt.Errorf("Invalid bech32 prefix") + return fmt.Errorf("bech32 prefix cannot be empty or blank") } return nil }, @@ -137,7 +137,7 @@ func (cp ChainLinkReferencePrompt) getDerivationPath() (string, error) { Default: "m/44'/118'/0'/0/0", Validate: func(s string) error { if strings.TrimSpace(s) == "" { - return fmt.Errorf("Invalid derivation path") + return fmt.Errorf("derivation path cannot be empty or blank") } return nil }, From 1bee089aa51deca85ca54226c86fd370865e7277 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 20:20:09 +0800 Subject: [PATCH 13/30] Remove unused package --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index b1aeddf9fd..24a2967168 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,6 @@ require ( google.golang.org/genproto v0.0.0-20210510173355-fb37daa5cd7a google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0 - gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 From a83d60fb923e678d3a02708913c667c128750546 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 20:25:45 +0800 Subject: [PATCH 14/30] Remove unused pkgs --- app/desmos/types/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desmos/types/config.go b/app/desmos/types/config.go index 337a9b131d..0c5765bd24 100644 --- a/app/desmos/types/config.go +++ b/app/desmos/types/config.go @@ -2,7 +2,7 @@ package types // Config contains the data of the configuration type Config struct { - Chains []ChainType `yaml:"chains"` + Chains []ChainType } // DefaultConfig returns the default config instance of the configuration From 5ab6370993a9243a666f05e878fcbac31491d56d Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 20:31:42 +0800 Subject: [PATCH 15/30] Reset sum --- go.sum | 8 -------- 1 file changed, 8 deletions(-) diff --git a/go.sum b/go.sum index ffbd70415a..5206447362 100644 --- a/go.sum +++ b/go.sum @@ -81,9 +81,6 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -328,8 +325,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= @@ -350,13 +345,10 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= -github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= From d87d4520e1c7e53c4553fcbc904339a2c52989fc Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 22:01:22 +0800 Subject: [PATCH 16/30] Add go mod tidy in workflow --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 48dedc935f..fc30b93b7e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -66,6 +66,9 @@ jobs: **/**.go go.mod go.sum + + - name: Update dependency + run: go mod tidy - name: Build 🔨 run: | From bd9c83f5d5a2b7d5fb002d6b9dde4e3b6d345478 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 22:02:36 +0800 Subject: [PATCH 17/30] Fix dependency --- go.sum | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/go.sum b/go.sum index 25959b56f9..a627c0b510 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,9 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -325,6 +328,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= @@ -345,10 +350,13 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= From c4f5449f82361df2324332bfab628944b35c3e97 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 22:02:53 +0800 Subject: [PATCH 18/30] Remove go mod tidy in workflow --- .github/workflows/release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc30b93b7e..48dedc935f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -66,9 +66,6 @@ jobs: **/**.go go.mod go.sum - - - name: Update dependency - run: go mod tidy - name: Build 🔨 run: | From 388d4539601936f025953d8bdeeb8687fe56230e Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 Aug 2021 23:38:46 +0800 Subject: [PATCH 19/30] Update sum again with go1.16 --- go.sum | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/go.sum b/go.sum index a627c0b510..2fcbb1f071 100644 --- a/go.sum +++ b/go.sum @@ -81,8 +81,11 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= @@ -356,7 +359,9 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= From bcf575e2f12e6072912fd467a8877f2882607537 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 00:25:59 +0800 Subject: [PATCH 20/30] Fix osmosis chain name --- app/desmos/types/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desmos/types/config.go b/app/desmos/types/config.go index 0c5765bd24..c1b6dac361 100644 --- a/app/desmos/types/config.go +++ b/app/desmos/types/config.go @@ -12,7 +12,7 @@ func DefaultConfig() Config { NewChainType("Desmos", "desmos", "desmos", "m/44'/852'/0'/0/0"), NewChainType("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), NewChainType("Akash", "akash", "akash", "m/44'/118'/0'/0/0"), - NewChainType("Osmosis", "osmo", "osmo", "m/44'/118'/0'/0/0"), + NewChainType("Osmosis", "osmosis", "osmo", "m/44'/118'/0'/0/0"), NewChainType("Other", "", "", ""), }, } From 28178ba8938c4d9af4a16d99c70b36f00a3490cc Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 14:57:36 +0800 Subject: [PATCH 21/30] Update app/desmos/cmd/create-chain-link.go Co-authored-by: Riccardo Montagnin --- app/desmos/cmd/create-chain-link.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go index fc0ae5c5b0..4d6ae74902 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/create-chain-link.go @@ -64,10 +64,8 @@ func GetCreateChainlinkFileCmd(generator types.ChainLinkReferenceGetter) *cobra. func generateChainLink(mnemonic string, chain types.ChainType) (profilescliutils.ChainLinkJSON, error) { // generate keybase for signing keyBase := keyring.NewInMemory() - algo := hd.Secp256k1 - hdPath := chain.DerivationPath keyName := "chainlink" - _, err := keyBase.NewAccount("chainlink", mnemonic, "", hdPath, algo) + _, err := keyBase.NewAccount("chainlink", mnemonic, "", chain.DerivationPath, hd.Secp256k1) if err != nil { return profilescliutils.ChainLinkJSON{}, err } From 65a2f5adb12c1ff33a4a253a9c0393398128e4eb Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:05:37 +0800 Subject: [PATCH 22/30] Remove unused unpack interface --- app/desmos/cmd/create-chain-link.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go index fc0ae5c5b0..12e08c1828 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/create-chain-link.go @@ -80,15 +80,8 @@ func generateChainLink(mnemonic string, chain types.ChainType) (profilescliutils return profilescliutils.ChainLinkJSON{}, err } - // create chain link json - cdc, _ := app.MakeCodecs() - chainLinkJSON := profilescliutils.NewChainLinkJSON( + return profilescliutils.NewChainLinkJSON( profilestypes.NewBech32Address(addr, chain.Prefix), profilestypes.NewProof(pubkey, hex.EncodeToString(sig), addr), - profilestypes.NewChainConfig(chain.Name), - ) - if err := chainLinkJSON.UnpackInterfaces(cdc); err != nil { - return profilescliutils.ChainLinkJSON{}, err - } - return chainLinkJSON, nil + profilestypes.NewChainConfig(chain.Name), nil } From 5fcd7d9084cc1be817b0a9f72c3e5a5c08d6adf5 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:10:31 +0800 Subject: [PATCH 23/30] Fix syntax and apply suggestions --- app/desmos/cmd/create-chain-link.go | 10 +++++----- app/desmos/cmd/create-chain-link_test.go | 5 +---- app/desmos/cmd/root.go | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go index 12e08c1828..ba41b143f6 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/create-chain-link.go @@ -19,10 +19,10 @@ import ( profilestypes "github.com/desmos-labs/desmos/x/profiles/types" ) -// GetCreateChainlinkFileCmd returns the command allowing to generate the chain link json file for creating chain link -func GetCreateChainlinkFileCmd(generator types.ChainLinkReferenceGetter) *cobra.Command { +// GetCreateChainlinkJSON returns the command allowing to generate the chain link json file for creating chain link +func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Command { cmd := &cobra.Command{ - Use: "create-chain-link-file", + Use: "create-chain-link-json", Short: "Generate the chain link json for creating chain link with the key", RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) @@ -56,7 +56,6 @@ func GetCreateChainlinkFileCmd(generator types.ChainLinkReferenceGetter) *cobra. }, } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String("filename", "data.json", "The name of output chain link json file. It does not generate the file if it is empty.") return cmd } @@ -83,5 +82,6 @@ func generateChainLink(mnemonic string, chain types.ChainType) (profilescliutils return profilescliutils.NewChainLinkJSON( profilestypes.NewBech32Address(addr, chain.Prefix), profilestypes.NewProof(pubkey, hex.EncodeToString(sig), addr), - profilestypes.NewChainConfig(chain.Name), nil + profilestypes.NewChainConfig(chain.Name), + ), nil } diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/create-chain-link_test.go index 0b679cba0b..e76ad1e580 100644 --- a/app/desmos/cmd/create-chain-link_test.go +++ b/app/desmos/cmd/create-chain-link_test.go @@ -1,7 +1,6 @@ package cmd_test import ( - "fmt" "os" "testing" @@ -37,9 +36,7 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { clientCtx := client.Context{}. WithOutput(output) - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkFileCmd(MockChainTypeGenerator{}), []string{ - fmt.Sprintf("--%s=%s", "filename", ""), - }) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkJSON(MockChainTypeGenerator{}), []string{}) require.NoError(t, err) cdc, _ := app.MakeCodecs() diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index d0c5a15b47..2edf07be79 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -111,7 +111,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { queryCommand(), txCommand(), GetSignCmd(), - GetCreateChainlinkFileCmd(types.NewChainTypePrompt(types.DefaultConfig())), + GetCreateChainlinkJSON(types.NewChainTypePrompt(types.DefaultConfig())), keys.Commands(app.DefaultNodeHome), ) } From 4a392e3afa5ed2749caff5668a7080d2fd1808fb Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:12:40 +0800 Subject: [PATCH 24/30] Remove unused filename flag --- app/desmos/cmd/create-chain-link.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go index 2b0aeb1509..682821cf7a 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/create-chain-link.go @@ -2,8 +2,6 @@ package cmd import ( "encoding/hex" - "io/ioutil" - "strings" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -46,12 +44,6 @@ func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Com return err } - filename, _ := cmd.Flags().GetString("filename") - if strings.TrimSpace(filename) != "" { - if err := ioutil.WriteFile("data.json", bz, 0600); err != nil { - return err - } - } return clientCtx.PrintBytes(bz) }, } From 53b90d5903a9893b0fb8a65b5d43e742ff29e558 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:18:34 +0800 Subject: [PATCH 25/30] Simplify unit test code --- app/desmos/cmd/create-chain-link_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/create-chain-link_test.go index e76ad1e580..12ea73cfa7 100644 --- a/app/desmos/cmd/create-chain-link_test.go +++ b/app/desmos/cmd/create-chain-link_test.go @@ -46,15 +46,13 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { // create a account to inmemory keybase keyBase := keyring.NewInMemory() - algo := hd.Secp256k1 - hdPath := "m/44'/118'/0'/0/0" keyName := "chainlink" _, err = keyBase.NewAccount( "chainlink", "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", "", - hdPath, - algo, + "m/44'/118'/0'/0/0", + hd.Secp256k1, ) require.NoError(t, err) From b5987933ea79eb1c141d0938b5957c356e162fd8 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:19:48 +0800 Subject: [PATCH 26/30] Fix mock generator --- app/desmos/cmd/create-chain-link_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/create-chain-link_test.go index 12ea73cfa7..b8e8c12b7f 100644 --- a/app/desmos/cmd/create-chain-link_test.go +++ b/app/desmos/cmd/create-chain-link_test.go @@ -24,7 +24,7 @@ type MockChainTypeGenerator struct{} func (mock MockChainTypeGenerator) GetReference() (string, types.ChainType, error) { return "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", - types.ChainType{ID: "Cosmos", Name: "cosmos", Prefix: "cosmos", DerivationPath: "m/44'/118'/0'/0/0"}, + types.NewChainType("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), nil } From 68c6d44cc372181ca1143d98ffca0aedf1db9dac Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Aug 2021 15:21:20 +0800 Subject: [PATCH 27/30] Update changeset --- .changeset/entries/2021-08-09T04:27:29Z.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/entries/2021-08-09T04:27:29Z.yaml b/.changeset/entries/2021-08-09T04:27:29Z.yaml index 1448acc47d..4b42270494 100644 --- a/.changeset/entries/2021-08-09T04:27:29Z.yaml +++ b/.changeset/entries/2021-08-09T04:27:29Z.yaml @@ -1,5 +1,5 @@ type: added module: x/profiles pull_request: 583 -description: Added generate chain link JSON file command +description: Added create chain link JSON command backward_compatible: true From 45149b64311fe7194157fe0066cdbb54024d37da Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 14 Aug 2021 15:07:59 +0800 Subject: [PATCH 28/30] Add prompt to ask filename --- app/desmos/cmd/create-chain-link.go | 27 ++++++-- app/desmos/cmd/create-chain-link_test.go | 18 ++++-- app/desmos/cmd/root.go | 2 +- app/desmos/types/chain.go | 10 +-- app/desmos/types/config.go | 15 ++--- app/desmos/types/getter.go | 80 ++++++++++++++++++------ 6 files changed, 108 insertions(+), 44 deletions(-) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/create-chain-link.go index 682821cf7a..12e257d405 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/create-chain-link.go @@ -2,6 +2,7 @@ package cmd import ( "encoding/hex" + "io/ioutil" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -18,7 +19,7 @@ import ( ) // GetCreateChainlinkJSON returns the command allowing to generate the chain link json file for creating chain link -func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Command { +func GetCreateChainlinkJSON(getter types.ChainLinkReferenceGetter) *cobra.Command { cmd := &cobra.Command{ Use: "create-chain-link-json", Short: "Generate the chain link json for creating chain link with the key", @@ -28,12 +29,22 @@ func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Com return err } - mnemonic, chain, err := generator.GetReference() + mnemonic, err := getter.GetMnemonic() if err != nil { return err } - chainLinkJSON, err := generateChainLink(mnemonic, chain) + chain, err := getter.GetChain() + if err != nil { + return err + } + + filename, err := getter.GetFilename() + if err != nil { + return err + } + + chainLinkJSON, err := generateChainLinkJSON(mnemonic, chain) if err != nil { return err } @@ -44,6 +55,12 @@ func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Com return err } + if filename != "" { + if err := ioutil.WriteFile(filename, bz, 0600); err != nil { + return err + } + } + return clientCtx.PrintBytes(bz) }, } @@ -51,8 +68,8 @@ func GetCreateChainlinkJSON(generator types.ChainLinkReferenceGetter) *cobra.Com return cmd } -// generateChainLink returns ChainLinkJSON for creating chain link -func generateChainLink(mnemonic string, chain types.ChainType) (profilescliutils.ChainLinkJSON, error) { +// generateChainLinkJSON returns ChainLinkJSON for creating chain link +func generateChainLinkJSON(mnemonic string, chain types.Chain) (profilescliutils.ChainLinkJSON, error) { // generate keybase for signing keyBase := keyring.NewInMemory() keyName := "chainlink" diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/create-chain-link_test.go index b8e8c12b7f..fe3492cbbf 100644 --- a/app/desmos/cmd/create-chain-link_test.go +++ b/app/desmos/cmd/create-chain-link_test.go @@ -20,12 +20,18 @@ import ( ) // Create mock chain type generator instead of prompt -type MockChainTypeGenerator struct{} +type MockGetter struct{} -func (mock MockChainTypeGenerator) GetReference() (string, types.ChainType, error) { - return "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", - types.NewChainType("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), - nil +func (mock MockGetter) GetMnemonic() (string, error) { + return "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", nil +} + +func (mock MockGetter) GetChain() (types.Chain, error) { + return types.NewChain("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), nil +} + +func (mock MockGetter) GetFilename() (string, error) { + return "", nil } func TestGetGenerateChainlinkJsonCmd(t *testing.T) { @@ -36,7 +42,7 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { clientCtx := client.Context{}. WithOutput(output) - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkJSON(MockChainTypeGenerator{}), []string{}) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkJSON(MockGetter{}), []string{}) require.NoError(t, err) cdc, _ := app.MakeCodecs() diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index 2edf07be79..25984068a3 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -111,7 +111,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { queryCommand(), txCommand(), GetSignCmd(), - GetCreateChainlinkJSON(types.NewChainTypePrompt(types.DefaultConfig())), + GetCreateChainlinkJSON(types.NewChainLinkReferencePrompt(types.DefaultConfig())), keys.Commands(app.DefaultNodeHome), ) } diff --git a/app/desmos/types/chain.go b/app/desmos/types/chain.go index d58d469426..7c8e33f21e 100644 --- a/app/desmos/types/chain.go +++ b/app/desmos/types/chain.go @@ -1,16 +1,16 @@ package types -// ChainType contains the data of the chain -type ChainType struct { +// Chain contains the data of the chain +type Chain struct { ID string Name string Prefix string DerivationPath string } -// NewChainType returns a new ChainType instance -func NewChainType(id, name, prefix, derivationPath string) ChainType { - return ChainType{ +// NewChain returns a new ChainType instance +func NewChain(id, name, prefix, derivationPath string) Chain { + return Chain{ id, name, prefix, diff --git a/app/desmos/types/config.go b/app/desmos/types/config.go index c1b6dac361..e4197d85be 100644 --- a/app/desmos/types/config.go +++ b/app/desmos/types/config.go @@ -2,18 +2,19 @@ package types // Config contains the data of the configuration type Config struct { - Chains []ChainType + Chains []Chain + FilePath string } // DefaultConfig returns the default config instance of the configuration func DefaultConfig() Config { return Config{ - Chains: []ChainType{ - NewChainType("Desmos", "desmos", "desmos", "m/44'/852'/0'/0/0"), - NewChainType("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), - NewChainType("Akash", "akash", "akash", "m/44'/118'/0'/0/0"), - NewChainType("Osmosis", "osmosis", "osmo", "m/44'/118'/0'/0/0"), - NewChainType("Other", "", "", ""), + Chains: []Chain{ + NewChain("Desmos", "desmos", "desmos", "m/44'/852'/0'/0/0"), + NewChain("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), + NewChain("Akash", "akash", "akash", "m/44'/118'/0'/0/0"), + NewChain("Osmosis", "osmosis", "osmo", "m/44'/118'/0'/0/0"), + NewChain("Other", "", "", ""), }, } } diff --git a/app/desmos/types/getter.go b/app/desmos/types/getter.go index 9947af7d4c..9acd28a43b 100644 --- a/app/desmos/types/getter.go +++ b/app/desmos/types/getter.go @@ -2,42 +2,69 @@ package types import ( "fmt" + "os" + "path" "strings" "github.com/manifoldco/promptui" ) -// ChainLinkReferenceGetter is an interface to get mnemonic and chain type +// ChainLinkReferenceGetter is an interface to get reference for creating ChainLinkJSON type ChainLinkReferenceGetter interface { - // GetReference returns mnemonic and ChainType instance for creating ChainLinkJSON - GetReference() (string, ChainType, error) + // GetMnemonic returns the mnemonic + GetMnemonic() (string, error) + + // GetChain returns Chain instance + GetChain() (Chain, error) + + // GetFilename returns filename to save + GetFilename() (string, error) } -// ChainLinkReferencePrompt is a ChainTypeGetter implemented by promptui +// ChainLinkReferencePrompt is a ChainGetter implemented by promptui type ChainLinkReferencePrompt struct { ChainLinkReferenceGetter cfg Config } -// NewChainTypePrompt returns a ChainTypePrompt instance -func NewChainTypePrompt(cfg Config) *ChainLinkReferencePrompt { +// NewChainLinkReferencePrompt returns an instance implementing ChainLinkReferencePrompt +func NewChainLinkReferencePrompt(cfg Config) *ChainLinkReferencePrompt { return &ChainLinkReferencePrompt{cfg: cfg} } -// GetMnemonicAndChainType returns mnemonic and ChainType instance from the prompt -func (cp ChainLinkReferencePrompt) GetReference() (string, ChainType, error) { - mnemonic, _ := cp.getMnemonic() - chain, _ := cp.selectChain() +func (cp ChainLinkReferencePrompt) GetMnemonic() (string, error) { + mnemonic, err := cp.getMnemonic() + if err != nil { + return "", err + } + return mnemonic, nil +} + +// GetChain returns Chain instance from the prompt +func (cp ChainLinkReferencePrompt) GetChain() (Chain, error) { + chain, err := cp.selectChain() + if err != nil { + return Chain{}, err + } if chain.ID == "Other" { newChain, err := cp.getCustomChain(chain) if err != nil { - return "", ChainType{}, err + return Chain{}, err } chain = newChain } - return mnemonic, chain, nil + return chain, nil +} + +// GetFilename returns filename to save from the prompt +func (cp ChainLinkReferencePrompt) GetFilename() (string, error) { + filename, err := cp.getFilename() + if err != nil { + return "", err + } + return filename, nil } // getMnemonic returns mnemonic from the prompt @@ -54,8 +81,8 @@ func (cp ChainLinkReferencePrompt) getMnemonic() (string, error) { return prompt.Run() } -// selectChain returns ChainType instance from the prompt -func (cp ChainLinkReferencePrompt) selectChain() (ChainType, error) { +// selectChain returns Chain instance from the prompt +func (cp ChainLinkReferencePrompt) selectChain() (Chain, error) { cfg := cp.cfg prompt := promptui.Select{ Label: "Select a target chain", @@ -69,27 +96,27 @@ func (cp ChainLinkReferencePrompt) selectChain() (ChainType, error) { index, _, err := prompt.Run() if err != nil { - return ChainType{}, err + return Chain{}, err } return cfg.Chains[index], nil } -// getCustomChain returns ChainType instance not in the default config from the prompt -func (cp ChainLinkReferencePrompt) getCustomChain(chain ChainType) (ChainType, error) { +// getCustomChain returns Chain instance not in the default config from the prompt +func (cp ChainLinkReferencePrompt) getCustomChain(chain Chain) (Chain, error) { chainName, err := cp.getChainName() if err != nil { - return ChainType{}, err + return Chain{}, err } prefix, err := cp.getBech32Prefix() if err != nil { - return ChainType{}, err + return Chain{}, err } derivationPath, err := cp.getDerivationPath() if err != nil { - return ChainType{}, err + return Chain{}, err } chain.Name = chainName @@ -144,3 +171,16 @@ func (cp ChainLinkReferencePrompt) getDerivationPath() (string, error) { } return prompt.Run() } + +// getFilename returns filename to save from the prompt +func (cp ChainLinkReferencePrompt) getFilename() (string, error) { + wd, err := os.Getwd() + if err != nil { + return "", err + } + prompt := promptui.Prompt{ + Label: "Please input the output filename if provided", + Default: path.Join(wd, "data.json"), + } + return prompt.Run() +} From 3231ea45504783556f63c2716b1a5dc587548e3c Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Sat, 14 Aug 2021 15:34:30 +0200 Subject: [PATCH 29/30] Small improvements and code re-arrangement --- .../create_json.go} | 49 +++++++++++-------- .../create_json_test.go} | 17 ++++--- app/desmos/{ => cmd/chainlink}/types/chain.go | 4 +- .../{ => cmd/chainlink}/types/config.go | 3 +- .../{ => cmd/chainlink}/types/getter.go | 44 ++++++++++------- app/desmos/cmd/root.go | 12 +++-- app/desmos/cmd/{ => sign}/sign.go | 2 +- app/desmos/cmd/{ => sign}/sign_test.go | 5 +- 8 files changed, 78 insertions(+), 58 deletions(-) rename app/desmos/cmd/{create-chain-link.go => chainlink/create_json.go} (50%) rename app/desmos/cmd/{create-chain-link_test.go => chainlink/create_json_test.go} (82%) rename app/desmos/{ => cmd/chainlink}/types/chain.go (74%) rename app/desmos/{ => cmd/chainlink}/types/config.go (93%) rename app/desmos/{ => cmd/chainlink}/types/getter.go (67%) rename app/desmos/cmd/{ => sign}/sign.go (99%) rename app/desmos/cmd/{ => sign}/sign_test.go (95%) diff --git a/app/desmos/cmd/create-chain-link.go b/app/desmos/cmd/chainlink/create_json.go similarity index 50% rename from app/desmos/cmd/create-chain-link.go rename to app/desmos/cmd/chainlink/create_json.go index 12e257d405..6558a8e2d1 100644 --- a/app/desmos/cmd/create-chain-link.go +++ b/app/desmos/cmd/chainlink/create_json.go @@ -1,34 +1,40 @@ -package cmd +package chainlink import ( "encoding/hex" + "fmt" "io/ioutil" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" + chainlinktypes "github.com/desmos-labs/desmos/app/desmos/cmd/chainlink/types" + "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" "github.com/desmos-labs/desmos/app" - "github.com/desmos-labs/desmos/app/desmos/types" - profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" profilestypes "github.com/desmos-labs/desmos/x/profiles/types" ) -// GetCreateChainlinkJSON returns the command allowing to generate the chain link json file for creating chain link -func GetCreateChainlinkJSON(getter types.ChainLinkReferenceGetter) *cobra.Command { - cmd := &cobra.Command{ +// GetCreateChainLinkJSON returns the command allowing to generate the chain link JSON +// file that is required by the link-chain command +func GetCreateChainLinkJSON() *cobra.Command { + return &cobra.Command{ Use: "create-chain-link-json", - Short: "Generate the chain link json for creating chain link with the key", + Short: "Start an interactive prompt to create a new chain link JSON object", + Long: `Start an interactive prompt to create a new chain link JSON object that can be used to later link your Desmos profile to another chain. +Once you have built the JSON object using this command, you can then run the following command to complete the linkage: + +desmos tx profiles link-chain [/path/to/json/file.json] + +Note that this command will ask you the mnemonic that should be used to generate the private key of the address you want to link. +The mnemonic is only used temporarily and never stored anywhere.`, RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } + // Build the chain link reference getter + getter := chainlinktypes.NewChainLinkReferencePrompt() + // Get the data mnemonic, err := getter.GetMnemonic() if err != nil { return err @@ -44,6 +50,7 @@ func GetCreateChainlinkJSON(getter types.ChainLinkReferenceGetter) *cobra.Comman return err } + // Build che chain link JSON chainLinkJSON, err := generateChainLinkJSON(mnemonic, chain) if err != nil { return err @@ -61,24 +68,24 @@ func GetCreateChainlinkJSON(getter types.ChainLinkReferenceGetter) *cobra.Comman } } - return clientCtx.PrintBytes(bz) + cmd.Println(fmt.Sprintf("Chain link JSON file stored at %s", filename)) + + return nil }, } - flags.AddTxFlagsToCmd(cmd) - return cmd } -// generateChainLinkJSON returns ChainLinkJSON for creating chain link -func generateChainLinkJSON(mnemonic string, chain types.Chain) (profilescliutils.ChainLinkJSON, error) { - // generate keybase for signing +// generateChainLinkJSON returns build a new ChainLinkJSON intance using the provided mnemonic and chain configuration +func generateChainLinkJSON(mnemonic string, chain chainlinktypes.Chain) (profilescliutils.ChainLinkJSON, error) { + // Create an in-memory keybase for signing keyBase := keyring.NewInMemory() keyName := "chainlink" - _, err := keyBase.NewAccount("chainlink", mnemonic, "", chain.DerivationPath, hd.Secp256k1) + _, err := keyBase.NewAccount(keyName, mnemonic, "", chain.DerivationPath, hd.Secp256k1) if err != nil { return profilescliutils.ChainLinkJSON{}, err } - // create the proof with the key + // Generate the proof signing it with the key key, _ := keyBase.Key(keyName) addr, _ := sdk.Bech32ifyAddressBytes(chain.Prefix, key.GetAddress()) sig, pubkey, err := keyBase.Sign(keyName, []byte(addr)) diff --git a/app/desmos/cmd/create-chain-link_test.go b/app/desmos/cmd/chainlink/create_json_test.go similarity index 82% rename from app/desmos/cmd/create-chain-link_test.go rename to app/desmos/cmd/chainlink/create_json_test.go index fe3492cbbf..c091ba74e4 100644 --- a/app/desmos/cmd/create-chain-link_test.go +++ b/app/desmos/cmd/chainlink/create_json_test.go @@ -1,9 +1,12 @@ -package cmd_test +package chainlink_test import ( "os" "testing" + cmd "github.com/desmos-labs/desmos/app/desmos/cmd/chainlink" + "github.com/desmos-labs/desmos/app/desmos/cmd/chainlink/types" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -12,29 +15,29 @@ import ( "github.com/stretchr/testify/require" "github.com/desmos-labs/desmos/app" - cmd "github.com/desmos-labs/desmos/app/desmos/cmd" - "github.com/desmos-labs/desmos/app/desmos/types" - profilescliutils "github.com/desmos-labs/desmos/x/profiles/client/utils" profilestypes "github.com/desmos-labs/desmos/x/profiles/types" ) -// Create mock chain type generator instead of prompt +// MockGetter represents a mock implementation of ChainLinkReferenceGetter type MockGetter struct{} +// GetMnemonic implements ChainLinkReferenceGetter func (mock MockGetter) GetMnemonic() (string, error) { return "clip toilet stairs jaguar baby over mosquito capital speed mule adjust eye print voyage verify smart open crack imitate auto gauge museum planet rebel", nil } +// GetChain implements ChainLinkReferenceGetter func (mock MockGetter) GetChain() (types.Chain, error) { return types.NewChain("Cosmos", "cosmos", "cosmos", "m/44'/118'/0'/0/0"), nil } +// GetFilename implements ChainLinkReferenceGetter func (mock MockGetter) GetFilename() (string, error) { return "", nil } -func TestGetGenerateChainlinkJsonCmd(t *testing.T) { +func TestGetCreateChainLinkJSON(t *testing.T) { cfg := sdk.GetConfig() app.SetupConfig(cfg) @@ -42,7 +45,7 @@ func TestGetGenerateChainlinkJsonCmd(t *testing.T) { clientCtx := client.Context{}. WithOutput(output) - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainlinkJSON(MockGetter{}), []string{}) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd.GetCreateChainLinkJSON(MockGetter{}), []string{}) require.NoError(t, err) cdc, _ := app.MakeCodecs() diff --git a/app/desmos/types/chain.go b/app/desmos/cmd/chainlink/types/chain.go similarity index 74% rename from app/desmos/types/chain.go rename to app/desmos/cmd/chainlink/types/chain.go index 7c8e33f21e..460436882c 100644 --- a/app/desmos/types/chain.go +++ b/app/desmos/cmd/chainlink/types/chain.go @@ -1,6 +1,6 @@ package types -// Chain contains the data of the chain +// Chain contains the data of a single chain type Chain struct { ID string Name string @@ -8,7 +8,7 @@ type Chain struct { DerivationPath string } -// NewChain returns a new ChainType instance +// NewChain returns a new Chain instance func NewChain(id, name, prefix, derivationPath string) Chain { return Chain{ id, diff --git a/app/desmos/types/config.go b/app/desmos/cmd/chainlink/types/config.go similarity index 93% rename from app/desmos/types/config.go rename to app/desmos/cmd/chainlink/types/config.go index e4197d85be..5e49f85f1a 100644 --- a/app/desmos/types/config.go +++ b/app/desmos/cmd/chainlink/types/config.go @@ -2,8 +2,7 @@ package types // Config contains the data of the configuration type Config struct { - Chains []Chain - FilePath string + Chains []Chain } // DefaultConfig returns the default config instance of the configuration diff --git a/app/desmos/types/getter.go b/app/desmos/cmd/chainlink/types/getter.go similarity index 67% rename from app/desmos/types/getter.go rename to app/desmos/cmd/chainlink/types/getter.go index 9acd28a43b..6c4e71f906 100644 --- a/app/desmos/types/getter.go +++ b/app/desmos/cmd/chainlink/types/getter.go @@ -6,10 +6,12 @@ import ( "path" "strings" + "github.com/cosmos/go-bip39" + "github.com/manifoldco/promptui" ) -// ChainLinkReferenceGetter is an interface to get reference for creating ChainLinkJSON +// ChainLinkReferenceGetter allows to get all the data needed to generate a ChainLinkJSON instance type ChainLinkReferenceGetter interface { // GetMnemonic returns the mnemonic GetMnemonic() (string, error) @@ -21,17 +23,20 @@ type ChainLinkReferenceGetter interface { GetFilename() (string, error) } -// ChainLinkReferencePrompt is a ChainGetter implemented by promptui +// ChainLinkReferencePrompt is a ChainLinkReferenceGetter implemented with an interactive prompt type ChainLinkReferencePrompt struct { ChainLinkReferenceGetter cfg Config } // NewChainLinkReferencePrompt returns an instance implementing ChainLinkReferencePrompt -func NewChainLinkReferencePrompt(cfg Config) *ChainLinkReferencePrompt { - return &ChainLinkReferencePrompt{cfg: cfg} +func NewChainLinkReferencePrompt() *ChainLinkReferencePrompt { + return &ChainLinkReferencePrompt{ + cfg: DefaultConfig(), + } } +// GetMnemonic implements ChainLinkReferenceGetter func (cp ChainLinkReferencePrompt) GetMnemonic() (string, error) { mnemonic, err := cp.getMnemonic() if err != nil { @@ -40,7 +45,7 @@ func (cp ChainLinkReferencePrompt) GetMnemonic() (string, error) { return mnemonic, nil } -// GetChain returns Chain instance from the prompt +// GetChain implements ChainLinkReferenceGetter func (cp ChainLinkReferencePrompt) GetChain() (Chain, error) { chain, err := cp.selectChain() if err != nil { @@ -58,7 +63,7 @@ func (cp ChainLinkReferencePrompt) GetChain() (Chain, error) { return chain, nil } -// GetFilename returns filename to save from the prompt +// GetFilename implements ChainLinkReferenceGetter func (cp ChainLinkReferencePrompt) GetFilename() (string, error) { filename, err := cp.getFilename() if err != nil { @@ -67,13 +72,16 @@ func (cp ChainLinkReferencePrompt) GetFilename() (string, error) { return filename, nil } -// getMnemonic returns mnemonic from the prompt +// getMnemonic asks the user the mnemonic and then returns it func (cp ChainLinkReferencePrompt) getMnemonic() (string, error) { prompt := promptui.Prompt{ - Label: "Please enter your mnemonic", + Label: "Please enter the mnemonic that should be used to generate the address you want to link", + HideEntered: true, Validate: func(s string) error { if strings.TrimSpace(s) == "" { return fmt.Errorf("mnemonic cannot be empty or blank") + } else if _, err := bip39.MnemonicToByteArray(s); err != nil { + return fmt.Errorf("invalid mnemonic") } return nil }, @@ -81,7 +89,7 @@ func (cp ChainLinkReferencePrompt) getMnemonic() (string, error) { return prompt.Run() } -// selectChain returns Chain instance from the prompt +// selectChain asks the user to select a predefined Chain instance, and returns it func (cp ChainLinkReferencePrompt) selectChain() (Chain, error) { cfg := cp.cfg prompt := promptui.Select{ @@ -102,7 +110,7 @@ func (cp ChainLinkReferencePrompt) selectChain() (Chain, error) { return cfg.Chains[index], nil } -// getCustomChain returns Chain instance not in the default config from the prompt +// getCustomChain asks the user to input the data to build a custom Chain instance, and then returns it func (cp ChainLinkReferencePrompt) getCustomChain(chain Chain) (Chain, error) { chainName, err := cp.getChainName() if err != nil { @@ -126,10 +134,10 @@ func (cp ChainLinkReferencePrompt) getCustomChain(chain Chain) (Chain, error) { return chain, nil } -// getChainName returns chain name from the prompt +// getChainName asks the user to input a chain name, and returns it func (cp ChainLinkReferencePrompt) getChainName() (string, error) { prompt := promptui.Prompt{ - Label: "Please input the name of the chain", + Label: "Please input the name of the chain you want to link with", Validate: func(s string) error { if strings.TrimSpace(s) == "" { return fmt.Errorf("chain name cannot be empty or blank") @@ -143,10 +151,10 @@ func (cp ChainLinkReferencePrompt) getChainName() (string, error) { return prompt.Run() } -// getBech32Prefix returns bech32 prefix from the prompt +// getBech32Prefix asks the user to input the Bech32 prefix of the address, and then returns it func (cp ChainLinkReferencePrompt) getBech32Prefix() (string, error) { prompt := promptui.Prompt{ - Label: "Please input the bech32 prefix of the chain", + Label: "Please input the Bech32 account address prefix used inside the the chain", Validate: func(s string) error { if strings.TrimSpace(s) == "" { return fmt.Errorf("bech32 prefix cannot be empty or blank") @@ -157,10 +165,10 @@ func (cp ChainLinkReferencePrompt) getBech32Prefix() (string, error) { return prompt.Run() } -// getDerivationPath returns derivation path from the prompt +// getDerivationPath asks the user to input the derivation path of the account, and then returns it func (cp ChainLinkReferencePrompt) getDerivationPath() (string, error) { prompt := promptui.Prompt{ - Label: "Please input the derivation path of the chain", + Label: "Please input the derivation path used by the chain to generate the accounts", Default: "m/44'/118'/0'/0/0", Validate: func(s string) error { if strings.TrimSpace(s) == "" { @@ -172,14 +180,14 @@ func (cp ChainLinkReferencePrompt) getDerivationPath() (string, error) { return prompt.Run() } -// getFilename returns filename to save from the prompt +// getFilename asks the user to input the filename where to store the chain link, and then returns it func (cp ChainLinkReferencePrompt) getFilename() (string, error) { wd, err := os.Getwd() if err != nil { return "", err } prompt := promptui.Prompt{ - Label: "Please input the output filename if provided", + Label: "Please insert where the chain link JSON object should be stored (fully qualified path)", Default: path.Join(wd, "data.json"), } return prompt.Run() diff --git a/app/desmos/cmd/root.go b/app/desmos/cmd/root.go index 25984068a3..cc7e951594 100644 --- a/app/desmos/cmd/root.go +++ b/app/desmos/cmd/root.go @@ -5,17 +5,19 @@ import ( "os" "path/filepath" + "github.com/desmos-labs/desmos/app/desmos/cmd/chainlink" + "github.com/desmos-labs/desmos/app/desmos/cmd/sign" + config "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/x/crisis" - "github.com/desmos-labs/desmos/app" - "github.com/desmos-labs/desmos/app/desmos/types" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/snapshots" + "github.com/desmos-labs/desmos/app" + "github.com/spf13/cast" "github.com/spf13/cobra" tmcli "github.com/tendermint/tendermint/libs/cli" @@ -110,8 +112,8 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { rpc.StatusCommand(), queryCommand(), txCommand(), - GetSignCmd(), - GetCreateChainlinkJSON(types.NewChainLinkReferencePrompt(types.DefaultConfig())), + sign.GetSignCmd(), + chainlink.GetCreateChainLinkJSON(), keys.Commands(app.DefaultNodeHome), ) } diff --git a/app/desmos/cmd/sign.go b/app/desmos/cmd/sign/sign.go similarity index 99% rename from app/desmos/cmd/sign.go rename to app/desmos/cmd/sign/sign.go index 5695d89393..2b7113509e 100644 --- a/app/desmos/cmd/sign.go +++ b/app/desmos/cmd/sign/sign.go @@ -1,4 +1,4 @@ -package cmd +package sign import ( "encoding/hex" diff --git a/app/desmos/cmd/sign_test.go b/app/desmos/cmd/sign/sign_test.go similarity index 95% rename from app/desmos/cmd/sign_test.go rename to app/desmos/cmd/sign/sign_test.go index 5425e503ed..388a685adc 100644 --- a/app/desmos/cmd/sign_test.go +++ b/app/desmos/cmd/sign/sign_test.go @@ -1,4 +1,4 @@ -package cmd_test +package sign_test import ( "encoding/json" @@ -6,6 +6,8 @@ import ( "os" "testing" + cmd "github.com/desmos-labs/desmos/app/desmos/cmd/sign" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -15,7 +17,6 @@ import ( "github.com/stretchr/testify/require" "github.com/desmos-labs/desmos/app" - cmd "github.com/desmos-labs/desmos/app/desmos/cmd" ) func TestGetSignCmd(t *testing.T) { From 04afde88bbdb15889cff1375e0031bdd54b276cc Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Sat, 14 Aug 2021 15:35:45 +0200 Subject: [PATCH 30/30] Removed changeset in favor of CHANGELOG entry --- .changeset/entries/2021-08-09T04:27:29Z.yaml | 5 ----- CHANGELOG.md | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 .changeset/entries/2021-08-09T04:27:29Z.yaml diff --git a/.changeset/entries/2021-08-09T04:27:29Z.yaml b/.changeset/entries/2021-08-09T04:27:29Z.yaml deleted file mode 100644 index 4b42270494..0000000000 --- a/.changeset/entries/2021-08-09T04:27:29Z.yaml +++ /dev/null @@ -1,5 +0,0 @@ -type: added -module: x/profiles -pull_request: 583 -description: Added create chain link JSON command -backward_compatible: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 837ffcb402..abe9a39eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Renamed `PollData` and `PollAnswer` to `Poll` and `ProvidedAnswer` ([\#536]((https://github.com/desmos-labs/desmos/issues/536))) - Enabled snapshot by default ([\#529](https://github.com/desmos-labs/desmos/pull/529)) - Improved the performance of profile validation checks ([\#548](https://github.com/desmos-labs/desmos/pull/548)) +- Added `create-chain-link-json` command ([\#572](https://github.com/desmos-labs/desmos/pull/572)) ## Version 0.17.7