Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cmd/network): creates network campaign account list command #2089

Merged
merged 29 commits into from
Mar 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
02a695c
creates `network campaign account list [campaign-id]` command
Pantani Feb 15, 2022
c0e254c
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 15, 2022
f59f0e7
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 17, 2022
7bd09d9
run make format
Pantani Feb 17, 2022
52585e0
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 17, 2022
2985d88
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 17, 2022
99edbd7
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 18, 2022
0b07789
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 21, 2022
f256051
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 22, 2022
70f9e0d
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 23, 2022
ed323c7
Merge remote-tracking branch 'origin/develop' into feat/campaign-acco…
Pantani Feb 23, 2022
1a7e544
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 23, 2022
67d4a23
use goroutine to fetch the campaign accounts
Pantani Feb 23, 2022
377d229
use Coin and Share type instead string
Pantani Feb 24, 2022
6d0fa25
add the validator account flag back
Pantani Feb 24, 2022
11e394e
add event options
Pantani Feb 24, 2022
1a85212
print a msg if the summary is empty
Pantani Feb 24, 2022
47d6e0b
remove unused flags
Pantani Feb 24, 2022
47936d9
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Feb 24, 2022
e04ec3c
put back the keyring flags
Pantani Feb 24, 2022
ef07603
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Mar 2, 2022
a0d41d5
add the keyring flags to the right cmd method
Pantani Mar 3, 2022
d709690
update spn version
Pantani Mar 4, 2022
157f9c0
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Mar 7, 2022
bd133a8
fix events unit tests
Pantani Mar 8, 2022
f4ebfbc
Merge remote-tracking branch 'origin/develop' into feat/campaign-acco…
Pantani Mar 9, 2022
d05ba35
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Mar 9, 2022
075e02f
Merge remote-tracking branch 'origin/develop' into feat/campaign-acco…
Pantani Mar 10, 2022
2fe3817
Merge branch 'develop' into feat/campaign-accounts-list
Pantani Mar 10, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions starport/cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,17 @@ func printEvents(wg *sync.WaitGroup, bus events.Bus, s *clispinner.Spinner) {
defer wg.Done()

for event := range bus {
if event.IsOngoing() {
switch event.Status {
case events.StatusOngoing:
s.SetText(event.Text())
s.Start()
} else {
case events.StatusDone:
icon := event.Icon
if icon == "" {
icon = clispinner.OK
}
s.Stop()
fmt.Printf("%s %s\n", clispinner.OK, event.Description)
fmt.Printf("%s %s\n", icon, event.Text())
}
}
}
Expand Down
1 change: 1 addition & 0 deletions starport/cmd/network_campaign.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ func NewNetworkCampaign() *cobra.Command {
NewNetworkCampaignList(),
NewNetworkCampaignShow(),
NewNetworkCampaignUpdate(),
NewNetworkCampaignAccount(),
)
return c
}
142 changes: 142 additions & 0 deletions starport/cmd/network_campaign_account.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package starportcmd

import (
"bytes"
"context"
"fmt"
"strconv"

"github.com/spf13/cobra"
"golang.org/x/sync/errgroup"

"github.com/tendermint/starport/starport/pkg/clispinner"
"github.com/tendermint/starport/starport/pkg/entrywriter"
"github.com/tendermint/starport/starport/services/network"
"github.com/tendermint/starport/starport/services/network/networktypes"
)

var (
campaignMainnetsAccSummaryHeader = []string{"Mainnet Account", "Shares"}
campaignVestingAccSummaryHeader = []string{"Vesting Account", "Total Shares", "Vesting", "End Time"}
)

// NewNetworkCampaignAccount creates a new campaign account command that holds some other
// sub commands related to account for a campaign.
func NewNetworkCampaignAccount() *cobra.Command {
c := &cobra.Command{
Use: "account",
Short: "Handle campaign accounts",
}
c.AddCommand(
newNetworkCampaignAccountList(),
)
return c
}

func newNetworkCampaignAccountList() *cobra.Command {
c := &cobra.Command{
Use: "list [campaign-id]",
Short: "Show all mainnet and mainnet vesting of the campaign",
Args: cobra.ExactArgs(1),
RunE: newNetworkCampaignAccountListHandler,
}
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
return c
}

func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) error {
nb, campaignID, err := networkChainLaunch(cmd, args)
if err != nil {
return err
}
defer nb.Cleanup()

n, err := nb.Network()
if err != nil {
return err
}

accountSummary := &bytes.Buffer{}

// get all campaign accounts
mainnetAccs, vestingAccs, err := getAccounts(cmd.Context(), n, campaignID)
if err != nil {
return err
}

mainnetAccEntries := make([][]string, 0)
for _, acc := range mainnetAccs {
mainnetAccEntries = append(mainnetAccEntries, []string{
acc.Address,
acc.Shares.String(),
})
}
if len(mainnetAccEntries) > 0 {
if err = entrywriter.MustWrite(
accountSummary,
campaignMainnetsAccSummaryHeader,
mainnetAccEntries...,
); err != nil {
return err
}
}

mainnetVestingAccEntries := make([][]string, 0)
for _, acc := range vestingAccs {
mainnetVestingAccEntries = append(mainnetVestingAccEntries, []string{
acc.Address,
acc.TotalShares.String(),
acc.Vesting.String(),
strconv.FormatInt(acc.EndTime, 10),
})
}
if len(mainnetVestingAccEntries) > 0 {
if err = entrywriter.MustWrite(
accountSummary,
campaignVestingAccSummaryHeader,
mainnetVestingAccEntries...,
); err != nil {
return err
}
}

nb.Spinner.Stop()
if accountSummary.Len() > 0 {
fmt.Print(accountSummary.String())
} else {
fmt.Printf("%s %s\n", clispinner.Info, "no campaign account found")
}
return nil
}

// getAccounts get all campaign mainnet and vesting accounts.
func getAccounts(
ctx context.Context,
n network.Network,
campaignID uint64,
) (
[]networktypes.MainnetAccount,
[]networktypes.MainnetVestingAccount,
error,
) {
// start serving components.
g, ctx := errgroup.WithContext(ctx)
var (
mainnetAccs []networktypes.MainnetAccount
vestingAccs []networktypes.MainnetVestingAccount
err error
)
// get all campaign mainnet accounts
g.Go(func() error {
mainnetAccs, err = n.MainnetAccounts(ctx, campaignID)
return err
})

// get all campaign vesting accounts
g.Go(func() error {
vestingAccs, err = n.MainnetVestingAccounts(ctx, campaignID)
return err
})
return mainnetAccs, vestingAccs, g.Wait()
}
1 change: 0 additions & 1 deletion starport/cmd/network_campaign_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ func NewNetworkCampaignList() *cobra.Command {
}
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagSetHome())
return c
}

Expand Down
1 change: 0 additions & 1 deletion starport/cmd/network_campaign_show.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ func NewNetworkCampaignShow() *cobra.Command {
}
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagSetHome())
return c
}

Expand Down
1 change: 0 additions & 1 deletion starport/cmd/network_chain_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ func NewNetworkChainList() *cobra.Command {
}
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagSetHome())
return c
}

Expand Down
19 changes: 13 additions & 6 deletions starport/cmd/network_chain_show.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/spf13/cobra"

"github.com/tendermint/starport/starport/pkg/clispinner"
"github.com/tendermint/starport/starport/pkg/cosmosutil"
"github.com/tendermint/starport/starport/pkg/entrywriter"
"github.com/tendermint/starport/starport/pkg/yaml"
Expand Down Expand Up @@ -39,8 +40,8 @@ func NewNetworkChainShow() *cobra.Command {
newNetworkChainShowValidators(),
newNetworkChainShowPeers(),
)
c.PersistentFlags().AddFlagSet(flagNetworkFrom())
c.PersistentFlags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
return c
}

Expand Down Expand Up @@ -191,7 +192,7 @@ func newNetworkChainShowAccounts() *cobra.Command {
return err
}

accountSummary := bytes.NewBufferString("")
accountSummary := &bytes.Buffer{}

// get all chain genesis accounts
genesisAccs, err := n.GenesisAccounts(cmd.Context(), launchID)
Expand Down Expand Up @@ -239,7 +240,11 @@ func newNetworkChainShowAccounts() *cobra.Command {
}
}
nb.Spinner.Stop()
fmt.Print(accountSummary.String())
if accountSummary.Len() > 0 {
fmt.Print(accountSummary.String())
} else {
fmt.Printf("%s %s\n", clispinner.Info, "empty chain account list")
}
return nil
},
}
Expand Down Expand Up @@ -279,6 +284,7 @@ func newNetworkChainShowValidators() *cobra.Command {
peer,
})
}
nb.Spinner.Stop()
if len(validatorEntries) > 0 {
if err = entrywriter.MustWrite(
validatorSummary,
Expand All @@ -287,9 +293,10 @@ func newNetworkChainShowValidators() *cobra.Command {
); err != nil {
return err
}
fmt.Print(validatorSummary.String())
} else {
fmt.Printf("%s %s\n", clispinner.Info, "no account found")
}
nb.Spinner.Stop()
fmt.Print(validatorSummary.String())
return nil
},
}
Expand Down
3 changes: 1 addition & 2 deletions starport/cmd/network_request_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,8 @@ func NewNetworkRequestList() *cobra.Command {
RunE: networkRequestListHandler,
Args: cobra.ExactArgs(1),
}
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetHome())
c.Flags().AddFlagSet(flagSetKeyringBackend())
return c
}

Expand Down
2 changes: 0 additions & 2 deletions starport/cmd/network_request_show.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ func NewNetworkRequestShow() *cobra.Command {
Args: cobra.ExactArgs(2),
}
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetHome())
return c
}

Expand Down
5 changes: 4 additions & 1 deletion starport/pkg/clispinner/icon.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ var (
// OK is an OK mark.
OK = color.New(color.FgGreen).SprintFunc()("✔")
// NotOK is a red cross mark
NotOK = color.New(color.FgRed).SprintFunc()("✘")
NotOK = color.New(color.FgRed).SprintFunc()("✘")
// Bullet is a bullet mark
Bullet = color.New(color.FgYellow).SprintFunc()("⋆")
// Info is an info mark
Info = color.New(color.FgYellow).SprintFunc()("𝓲")
)
50 changes: 35 additions & 15 deletions starport/pkg/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,61 @@
// for others to consume and display to end users in meaningful ways.
package events

import "fmt"
import (
"fmt"

// Event represents a state.
type Event struct {
// Status shows the current status of event.
status Status
"github.com/gookit/color"
)

// Description of the state.
Description string
}
type (
// Event represents a state.
Event struct {
// Description of the state.
Description string

// Status shows the current status of event.
Status Status

// Status shows if state is ongoing or completed.
type Status int
// TextColor of the text.
TextColor color.Color

// Icon of the text.
Icon string
}

// Status shows if state is ongoing or completed.
Status int

// Option event options
Option func(*Event)
)

const (
StatusOngoing Status = iota
StatusDone
)

// New creates a new event with given config.
func New(status Status, description string) Event {
return Event{status, description}
func New(status Status, description string, options ...Option) Event {
ev := Event{Status: status, Description: description}
for _, applyOption := range options {
applyOption(&ev)
}
return ev
}

// IsOngoing checks if state change that triggered this event is still ongoing.
func (e Event) IsOngoing() bool {
return e.status == StatusOngoing
return e.Status == StatusOngoing
}

// Text returns the text state of event.
func (e Event) Text() string {
text := e.Description
if e.IsOngoing() {
return fmt.Sprintf("%s...", e.Description)
text = fmt.Sprintf("%s...", e.Description)
}
return e.Description
return e.TextColor.Render(text)
}

// Bus is a send/receive event bus.
Expand Down
Loading