From 5d9959e4353ab0bd8d664b4c3802f25b85181942 Mon Sep 17 00:00:00 2001 From: Danilo Pantani Date: Wed, 23 Feb 2022 10:45:48 -0300 Subject: [PATCH] feat(network): add network campaign `list` and `show` commands (#2100) * add campaign info command * add campaign show command * apply pr review discussions * remove unused method call --- go.mod | 2 +- go.sum | 4 +- starport/cmd/network.go | 1 + starport/cmd/network_campaign.go | 21 ++++++ starport/cmd/network_campaign_list.go | 73 +++++++++++++++++++ starport/cmd/network_campaign_show.go | 56 ++++++++++++++ starport/cmd/network_chain_init.go | 6 +- starport/cmd/network_chain_join.go | 2 +- starport/cmd/network_chain_launch.go | 2 +- starport/cmd/network_chain_list.go | 12 +-- starport/cmd/network_chain_prepare.go | 2 +- starport/cmd/network_chain_show.go | 2 +- starport/cmd/network_request_approve.go | 2 +- starport/cmd/network_request_list.go | 2 +- starport/cmd/network_request_reject.go | 2 +- starport/cmd/network_request_show.go | 2 +- starport/cmd/network_request_verify.go | 2 +- starport/cmd/relayer_configure.go | 3 +- starport/pkg/entrywriter/entrywriter.go | 4 + starport/services/network/campaign.go | 40 ++++++++++ starport/services/network/network.go | 2 +- starport/services/network/network_test.go | 4 +- .../services/network/networktypes/campaign.go | 33 +++++++++ starport/services/network/publish.go | 1 + 24 files changed, 248 insertions(+), 32 deletions(-) create mode 100644 starport/cmd/network_campaign.go create mode 100644 starport/cmd/network_campaign_list.go create mode 100644 starport/cmd/network_campaign_show.go create mode 100644 starport/services/network/campaign.go create mode 100644 starport/services/network/networktypes/campaign.go diff --git a/go.mod b/go.mod index 12a7f27247..0fa1d7ac26 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/stretchr/testify v1.7.0 github.com/takuoki/gocase v1.0.0 github.com/tendermint/flutter/v2 v2.0.3 - github.com/tendermint/spn v0.1.1-0.20220201164838-2464b6474c82 + github.com/tendermint/spn v0.1.1-0.20220217212620-bb39a868898e github.com/tendermint/tendermint v0.34.14 github.com/tendermint/tm-db v0.6.4 github.com/tendermint/vue v0.3.0 diff --git a/go.sum b/go.sum index 30f6d72668..52e8278f2d 100644 --- a/go.sum +++ b/go.sum @@ -1510,8 +1510,8 @@ github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoM github.com/tendermint/spm v0.1.5/go.mod h1:+rHrI1axfSX1R0DY6KA4IbrHPgJ0WVNJKhey71ulXO8= github.com/tendermint/spm v0.1.8/go.mod h1:iHgfQ5YOI6ONc9E7ugGQolVdfSMHpeXfZ/OpXuN/42Q= github.com/tendermint/spn v0.1.1-0.20211210094128-4ca78a240c57/go.mod h1:p4BO8YC6kOKSKqMfySqaLHfwBmuPE/QcLwnnVhh7H9M= -github.com/tendermint/spn v0.1.1-0.20220201164838-2464b6474c82 h1:qxeAiKDPJ/Yw2dtNp2lLRV1bqEc0UKidoOhXOzLS0iQ= -github.com/tendermint/spn v0.1.1-0.20220201164838-2464b6474c82/go.mod h1:aPUMZ2zCuwpu98HIhaG+hWjOKgw23k5202P0LAIbFHw= +github.com/tendermint/spn v0.1.1-0.20220217212620-bb39a868898e h1:7ToGHB8AiaqKHtKWG7LzR5CMM+FxVoUhpwWLLdTiM6w= +github.com/tendermint/spn v0.1.1-0.20220217212620-bb39a868898e/go.mod h1:aPUMZ2zCuwpu98HIhaG+hWjOKgw23k5202P0LAIbFHw= github.com/tendermint/starport v0.19.3/go.mod h1:1BlPohoDtLl8CFqTHbMSN3rhq5YLBHlTQ9mJhcRuvwI= github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4= github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= diff --git a/starport/cmd/network.go b/starport/cmd/network.go index fdda8fe3b7..06d05f6faa 100644 --- a/starport/cmd/network.go +++ b/starport/cmd/network.go @@ -61,6 +61,7 @@ func NewNetwork() *cobra.Command { // add sub commands. c.AddCommand( NewNetworkChain(), + NewNetworkCampaign(), NewNetworkRequest(), ) diff --git a/starport/cmd/network_campaign.go b/starport/cmd/network_campaign.go new file mode 100644 index 0000000000..27a2758467 --- /dev/null +++ b/starport/cmd/network_campaign.go @@ -0,0 +1,21 @@ +package starportcmd + +import ( + "github.com/spf13/cobra" +) + +// NewNetworkCampaign creates a new campaign command that holds other +// subcommands related to launching a network for a campaign. +func NewNetworkCampaign() *cobra.Command { + c := &cobra.Command{ + Use: "campaign", + Short: "Handle campaigns", + } + + c.AddCommand( + NewNetworkCampaignList(), + NewNetworkCampaignShow(), + ) + + return c +} diff --git a/starport/cmd/network_campaign_list.go b/starport/cmd/network_campaign_list.go new file mode 100644 index 0000000000..915da2d119 --- /dev/null +++ b/starport/cmd/network_campaign_list.go @@ -0,0 +1,73 @@ +package starportcmd + +import ( + "fmt" + "io" + "os" + + "github.com/spf13/cobra" + + "github.com/tendermint/starport/starport/pkg/entrywriter" + "github.com/tendermint/starport/starport/services/network/networktypes" +) + +var CampaignSummaryHeader = []string{ + "id", + "name", + "coordinator id", + "mainnet id", +} + +// NewNetworkCampaignList returns a new command to list all published campaigns on Starport Network. +func NewNetworkCampaignList() *cobra.Command { + c := &cobra.Command{ + Use: "list", + Short: "List published campaigns", + Args: cobra.NoArgs, + RunE: networkCampaignListHandler, + } + c.Flags().AddFlagSet(flagNetworkFrom()) + c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetHome()) + return c +} + +func networkCampaignListHandler(cmd *cobra.Command, args []string) error { + nb, err := newNetworkBuilder(cmd) + if err != nil { + return err + } + + n, err := nb.Network() + if err != nil { + return err + } + campaigns, err := n.Campaigns(cmd.Context()) + if err != nil { + return err + } + + nb.Cleanup() + return renderCampaignSummaries(campaigns, os.Stdout) +} + +// renderCampaignSummaries writes into the provided out, the list of summarized campaigns +func renderCampaignSummaries(campaigns []networktypes.Campaign, out io.Writer) error { + var campaignEntries [][]string + + for _, c := range campaigns { + mainnetID := entrywriter.None + if c.MainnetInitialized { + mainnetID = fmt.Sprintf("%d", c.MainnetID) + } + + campaignEntries = append(campaignEntries, []string{ + fmt.Sprintf("%d", c.ID), + c.Name, + fmt.Sprintf("%d", c.CoordinatorID), + mainnetID, + }) + } + + return entrywriter.MustWrite(out, CampaignSummaryHeader, campaignEntries...) +} diff --git a/starport/cmd/network_campaign_show.go b/starport/cmd/network_campaign_show.go new file mode 100644 index 0000000000..d5da593ebc --- /dev/null +++ b/starport/cmd/network_campaign_show.go @@ -0,0 +1,56 @@ +package starportcmd + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/tendermint/starport/starport/pkg/yaml" + "github.com/tendermint/starport/starport/services/network" +) + +// NewNetworkCampaignShow returns a new command to show published campaign on Starport Network +func NewNetworkCampaignShow() *cobra.Command { + c := &cobra.Command{ + Use: "show [campaign-id]", + Short: "Show published campaign", + Args: cobra.ExactArgs(1), + RunE: networkCampaignShowHandler, + } + c.Flags().AddFlagSet(flagNetworkFrom()) + c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetHome()) + return c +} + +func networkCampaignShowHandler(cmd *cobra.Command, args []string) error { + // parse campaign ID + campaignID, err := network.ParseID(args[0]) + if err != nil { + return err + } + + nb, err := newNetworkBuilder(cmd) + if err != nil { + return err + } + defer nb.Cleanup() + + n, err := nb.Network() + if err != nil { + return err + } + campaign, err := n.Campaign(cmd.Context(), campaignID) + if err != nil { + return err + } + + info, err := yaml.Marshal(cmd.Context(), campaign) + if err != nil { + return err + } + + nb.Spinner.Stop() + fmt.Print(info) + return nil +} diff --git a/starport/cmd/network_chain_init.go b/starport/cmd/network_chain_init.go index 9a359db020..86be866e4e 100644 --- a/starport/cmd/network_chain_init.go +++ b/starport/cmd/network_chain_init.go @@ -8,7 +8,6 @@ import ( "github.com/tendermint/starport/starport/pkg/cliquiz" "github.com/tendermint/starport/starport/pkg/clispinner" - "github.com/tendermint/starport/starport/pkg/cosmosaccount" "github.com/tendermint/starport/starport/pkg/cosmosutil" "github.com/tendermint/starport/starport/services/chain" "github.com/tendermint/starport/starport/services/network" @@ -34,8 +33,6 @@ func NewNetworkChainInit() *cobra.Command { Args: cobra.ExactArgs(1), RunE: networkChainInitHandler, } - - c.Flags().String(flagValidatorAccount, cosmosaccount.DefaultAccount, "Account for the chain validator") c.Flags().String(flagValidatorWebsite, "", "Associate a website with the validator") c.Flags().String(flagValidatorDetails, "", "Details about the validator") c.Flags().String(flagValidatorSecurityContact, "", "Validator security contact email") @@ -47,7 +44,6 @@ func NewNetworkChainInit() *cobra.Command { c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) c.Flags().AddFlagSet(flagSetYes()) - return c } @@ -59,7 +55,7 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_chain_join.go b/starport/cmd/network_chain_join.go index a930f6d772..7926a92fd0 100644 --- a/starport/cmd/network_chain_join.go +++ b/starport/cmd/network_chain_join.go @@ -44,7 +44,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID. - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_chain_launch.go b/starport/cmd/network_chain_launch.go index ea00dd9c5c..43d2a00f93 100644 --- a/starport/cmd/network_chain_launch.go +++ b/starport/cmd/network_chain_launch.go @@ -35,7 +35,7 @@ func networkChainLaunchHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_chain_list.go b/starport/cmd/network_chain_list.go index 9d324aae4d..f057b634bf 100644 --- a/starport/cmd/network_chain_list.go +++ b/starport/cmd/network_chain_list.go @@ -7,21 +7,12 @@ import ( "github.com/spf13/cobra" - "github.com/tendermint/starport/starport/pkg/cosmosaccount" "github.com/tendermint/starport/starport/pkg/entrywriter" "github.com/tendermint/starport/starport/services/network/networktypes" ) var LaunchSummaryHeader = []string{"launch ID", "chain ID", "source", "campaign ID"} -// LaunchSummary holds summarized information about a chain launch -type LaunchSummary struct { - LaunchID string - ChainID string - Source string - CampaignID string -} - // NewNetworkChainList returns a new command to list all published chains on Starport Network func NewNetworkChainList() *cobra.Command { c := &cobra.Command{ @@ -30,10 +21,9 @@ func NewNetworkChainList() *cobra.Command { Args: cobra.NoArgs, RunE: networkChainListHandler, } - c.Flags().String(flagFrom, cosmosaccount.DefaultAccount, "Account name to use for sending transactions to SPN") + c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) c.Flags().AddFlagSet(flagSetHome()) - return c } diff --git a/starport/cmd/network_chain_prepare.go b/starport/cmd/network_chain_prepare.go index 3a7b70de76..2ec287fb92 100644 --- a/starport/cmd/network_chain_prepare.go +++ b/starport/cmd/network_chain_prepare.go @@ -40,7 +40,7 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_chain_show.go b/starport/cmd/network_chain_show.go index 7376351d14..06f0c76b65 100644 --- a/starport/cmd/network_chain_show.go +++ b/starport/cmd/network_chain_show.go @@ -50,7 +50,7 @@ func networkChainLaunch(cmd *cobra.Command, args []string) (NetworkBuilder, uint return nb, 0, err } // parse launch ID. - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return nb, launchID, err } diff --git a/starport/cmd/network_request_approve.go b/starport/cmd/network_request_approve.go index 29c3bff818..23ae55d0a8 100644 --- a/starport/cmd/network_request_approve.go +++ b/starport/cmd/network_request_approve.go @@ -41,7 +41,7 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_request_list.go b/starport/cmd/network_request_list.go index a4ac610ef2..e9f3ae0132 100644 --- a/starport/cmd/network_request_list.go +++ b/starport/cmd/network_request_list.go @@ -37,7 +37,7 @@ func networkRequestListHandler(cmd *cobra.Command, args []string) error { } // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_request_reject.go b/starport/cmd/network_request_reject.go index 410946bba1..767d0a4bca 100644 --- a/starport/cmd/network_request_reject.go +++ b/starport/cmd/network_request_reject.go @@ -35,7 +35,7 @@ func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_request_show.go b/starport/cmd/network_request_show.go index 280926a968..3b5125e2c8 100644 --- a/starport/cmd/network_request_show.go +++ b/starport/cmd/network_request_show.go @@ -35,7 +35,7 @@ func networkRequestShowHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/network_request_verify.go b/starport/cmd/network_request_verify.go index 8f3f500647..d8926854bc 100644 --- a/starport/cmd/network_request_verify.go +++ b/starport/cmd/network_request_verify.go @@ -37,7 +37,7 @@ func networkRequestVerifyHandler(cmd *cobra.Command, args []string) error { defer nb.Cleanup() // parse launch ID - launchID, err := network.ParseLaunchID(args[0]) + launchID, err := network.ParseID(args[0]) if err != nil { return err } diff --git a/starport/cmd/relayer_configure.go b/starport/cmd/relayer_configure.go index d1f40cb652..f7b299b777 100644 --- a/starport/cmd/relayer_configure.go +++ b/starport/cmd/relayer_configure.go @@ -11,6 +11,7 @@ import ( "github.com/tendermint/starport/starport/pkg/cliquiz" "github.com/tendermint/starport/starport/pkg/clispinner" "github.com/tendermint/starport/starport/pkg/cosmosaccount" + "github.com/tendermint/starport/starport/pkg/entrywriter" "github.com/tendermint/starport/starport/pkg/relayer" ) @@ -478,7 +479,7 @@ func initChain( balance := coins.String() if balance == "" { - balance = "-" + balance = entrywriter.None } fmt.Printf(" |ยท (balance: %s)\n\n", balance) diff --git a/starport/pkg/entrywriter/entrywriter.go b/starport/pkg/entrywriter/entrywriter.go index fa713eb6d8..8a61ed66fb 100644 --- a/starport/pkg/entrywriter/entrywriter.go +++ b/starport/pkg/entrywriter/entrywriter.go @@ -9,6 +9,10 @@ import ( "github.com/pkg/errors" ) +const ( + None = "-" +) + var ErrInvalidFormat = errors.New("invalid entry format") // MustWrite writes into out the tabulated entries and panic if the entry format is invalid diff --git a/starport/services/network/campaign.go b/starport/services/network/campaign.go new file mode 100644 index 0000000000..9110fd5381 --- /dev/null +++ b/starport/services/network/campaign.go @@ -0,0 +1,40 @@ +package network + +import ( + "context" + + campaigntypes "github.com/tendermint/spn/x/campaign/types" + + "github.com/tendermint/starport/starport/pkg/events" + "github.com/tendermint/starport/starport/services/network/networktypes" +) + +// Campaign fetches the campaign from Starport Network +func (n Network) Campaign(ctx context.Context, campaignID uint64) (networktypes.Campaign, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching campaign information")) + res, err := campaigntypes.NewQueryClient(n.cosmos.Context).Campaign(ctx, &campaigntypes.QueryGetCampaignRequest{ + CampaignID: campaignID, + }) + if err != nil { + return networktypes.Campaign{}, err + } + return networktypes.ToCampaign(res.Campaign), nil +} + +// Campaigns fetches the campaigns from Starport Network +func (n Network) Campaigns(ctx context.Context) ([]networktypes.Campaign, error) { + var campaigns []networktypes.Campaign + + n.ev.Send(events.New(events.StatusOngoing, "Fetching campaigns information")) + res, err := campaigntypes.NewQueryClient(n.cosmos.Context).CampaignAll(ctx, &campaigntypes.QueryAllCampaignRequest{}) + if err != nil { + return campaigns, err + } + + // Parse fetched campaigns + for _, campaign := range res.Campaign { + campaigns = append(campaigns, networktypes.ToCampaign(campaign)) + } + + return campaigns, nil +} diff --git a/starport/services/network/network.go b/starport/services/network/network.go index 8f093146f0..a140374d31 100644 --- a/starport/services/network/network.go +++ b/starport/services/network/network.go @@ -52,7 +52,7 @@ func New(cosmos cosmosclient.Client, account cosmosaccount.Account, options ...O return n, nil } -func ParseLaunchID(id string) (uint64, error) { +func ParseID(id string) (uint64, error) { launchID, err := strconv.ParseUint(id, 10, 64) if err != nil { return 0, errors.Wrap(err, "error parsing launchID") diff --git a/starport/services/network/network_test.go b/starport/services/network/network_test.go index d8995e5604..99d079a3d7 100644 --- a/starport/services/network/network_test.go +++ b/starport/services/network/network_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestParseLaunchID(t *testing.T) { +func TestParseID(t *testing.T) { tests := []struct { name string id string @@ -37,7 +37,7 @@ func TestParseLaunchID(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := ParseLaunchID(tt.id) + got, err := ParseID(tt.id) if tt.err != nil { require.Error(t, err) require.Equal(t, tt.err.Error(), err.Error()) diff --git a/starport/services/network/networktypes/campaign.go b/starport/services/network/networktypes/campaign.go new file mode 100644 index 0000000000..9b32fbbc9b --- /dev/null +++ b/starport/services/network/networktypes/campaign.go @@ -0,0 +1,33 @@ +package networktypes + +import ( + campaigntypes "github.com/tendermint/spn/x/campaign/types" +) + +// Campaign represents the campaign of a chain on SPN +type Campaign struct { + ID uint64 `json:"ID"` + Name string `json:"Name"` + CoordinatorID uint64 `json:"CoordinatorID"` + MainnetID uint64 `json:"MainnetID"` + MainnetInitialized bool `json:"MainnetInitialized"` + TotalSupply string `json:"TotalSupply"` + AllocatedShares string `json:"AllocatedShares"` + DynamicShares bool `json:"DynamicShares"` + TotalShares string `json:"TotalShares"` +} + +// ToCampaign converts a campaign data from SPN and returns a Campaign object +func ToCampaign(campaign campaigntypes.Campaign) Campaign { + return Campaign{ + ID: campaign.CampaignID, + Name: campaign.CampaignName, + CoordinatorID: campaign.CoordinatorID, + MainnetID: campaign.MainnetID, + MainnetInitialized: campaign.MainnetInitialized, + TotalSupply: campaign.TotalSupply.String(), + AllocatedShares: campaign.AllocatedShares.String(), + DynamicShares: campaign.DynamicShares, + TotalShares: campaign.TotalShares.String(), + } +} diff --git a/starport/services/network/publish.go b/starport/services/network/publish.go index 7ab4603a08..3eef1c5740 100644 --- a/starport/services/network/publish.go +++ b/starport/services/network/publish.go @@ -136,6 +136,7 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) genesisHash, true, campaignID, + nil, ) res, err := n.cosmos.BroadcastTx(n.account.Name, msgCreateChain) if err != nil {