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): add network reward set command #2086

Merged
merged 45 commits into from
Mar 11, 2022
Merged
Show file tree
Hide file tree
Changes from 41 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
cb7f773
add `n chain reward-set` command
Pantani Feb 14, 2022
2559b61
fix comments for reward-set cmd
Pantani Feb 14, 2022
d00debb
improve the log messages
Pantani Feb 15, 2022
675cbe9
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 15, 2022
8ef9588
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 16, 2022
1b1da0f
fix block indentation
Pantani Feb 16, 2022
f6ad87a
add reward flags to the publish command
Pantani Feb 17, 2022
15204a1
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 17, 2022
dabf70b
run make format
Pantani Feb 17, 2022
fdd058b
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 17, 2022
f8dfc30
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 17, 2022
f202c3d
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 18, 2022
b31fdaf
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 21, 2022
e606187
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 22, 2022
20257da
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 23, 2022
513ac09
Merge remote-tracking branch 'origin/develop' into feat/network-rewar…
Pantani Feb 23, 2022
44a5dd3
fix the spn upgrade version
Pantani Feb 23, 2022
aa193c7
improve the log message
Pantani Feb 23, 2022
bff928c
add validator account flag
Pantani Feb 23, 2022
5986754
improve the reward log with the new message response
Pantani Feb 23, 2022
90267c3
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 23, 2022
b1a2ec2
improve the events messages and logs
Pantani Feb 24, 2022
c885f78
improve the event message options adding the icon
Pantani Feb 24, 2022
891266a
fix method names and text color
Pantani Feb 24, 2022
6ded79c
fix events struct comment
Pantani Feb 24, 2022
06d4980
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Feb 24, 2022
e080ca9
fix lint
Pantani Feb 24, 2022
e07214f
move chain reward to reward
Pantani Feb 25, 2022
04ecdf3
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Mar 2, 2022
d8a9635
improve the error return message
Pantani Mar 3, 2022
b976847
update spn version
Pantani Mar 4, 2022
9169d75
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Mar 7, 2022
58ba196
fix events unit tests
Pantani Mar 8, 2022
de035f4
Merge remote-tracking branch 'origin/develop' into feat/network-rewar…
Pantani Mar 8, 2022
1c8438d
fix duplicated log message
Pantani Mar 9, 2022
45a0583
fix reward height flag
Pantani Mar 9, 2022
9f9054b
Merge branch 'develop' into feat/network-reward-set-cmd
Pantani Mar 9, 2022
2800591
update spn version
Pantani Mar 9, 2022
5278cc3
Merge remote-tracking branch 'origin/develop' into feat/network-rewar…
Pantani Mar 10, 2022
d81ecc2
Merge remote-tracking branch 'origin/develop' into feat/network-rewar…
Pantani Mar 10, 2022
7499c4a
Merge branch 'develop' into feat/network-reward-set-cmd
ilgooz Mar 11, 2022
9558771
Apply suggestions from code review
ilgooz Mar 11, 2022
427e6c7
Apply suggestions from code review
ilgooz Mar 11, 2022
ad1e38d
Apply suggestions from code review
ilgooz Mar 11, 2022
99ee665
Apply suggestions from code review
ilgooz Mar 11, 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
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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.20220307175754-0b579dc934ec
github.com/tendermint/spn v0.1.1-0.20220309210912-ae38eed8fbee
github.com/tendermint/tendermint v0.34.14
github.com/tendermint/tm-db v0.6.4
github.com/tendermint/vue v0.3.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1505,8 +1505,8 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
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.20220307175754-0b579dc934ec h1:D6iJ2DGu6iGTbxCp0ye5KM1OlabfoyrueH672qXtZMQ=
github.com/tendermint/spn v0.1.1-0.20220307175754-0b579dc934ec/go.mod h1:E1/XLH8W9U3B+E/Lyytly+HXbpkIXqy5nbhdra14paU=
github.com/tendermint/spn v0.1.1-0.20220309210912-ae38eed8fbee h1:V4aDFMIRRTEqDAOyxg9o1CweDifo8JECJTjwNdWEww4=
github.com/tendermint/spn v0.1.1-0.20220309210912-ae38eed8fbee/go.mod h1:E1/XLH8W9U3B+E/Lyytly+HXbpkIXqy5nbhdra14paU=
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=
Expand Down
1 change: 1 addition & 0 deletions starport/cmd/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ func NewNetwork() *cobra.Command {
NewNetworkChain(),
NewNetworkCampaign(),
NewNetworkRequest(),
NewNetworkReward(),
)

return c
Expand Down
40 changes: 31 additions & 9 deletions starport/cmd/network_chain_publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@ import (
)

const (
flagTag = "tag"
flagBranch = "branch"
flagHash = "hash"
flagGenesis = "genesis"
flagCampaign = "campaign"
flagNoCheck = "no-check"
flagChainID = "chain-id"
flagMainnet = "mainnet"
flagTag = "tag"
flagBranch = "branch"
flagHash = "hash"
flagGenesis = "genesis"
flagCampaign = "campaign"
flagNoCheck = "no-check"
flagChainID = "chain-id"
flagMainnet = "mainnet"
flagRewardCoins = "reward.coins"
flagRewardHeight = "reward.height"
)

// NewNetworkChainPublish returns a new command to publish a new chain to start a new network.
Expand All @@ -41,12 +43,14 @@ func NewNetworkChainPublish() *cobra.Command {
c.Flags().Uint64(flagCampaign, 0, "Campaign ID to use for this network")
c.Flags().Bool(flagNoCheck, false, "Skip verifying chain's integrity")
// FIXME: total shares cannot be set if the campaign doesn't have dynamic shares.
// TODO: we should update the SPN to accept dynamic shares before enabling this flag
// TODO: we should update the SPN to accept dynamic shares before enabling this flag.
// c.Flags().String(flagCampaignTotalShares, "", "Add a total shares to the campaign")
c.Flags().String(flagCampaignMetadata, "", "Add a campaign metadata")
c.Flags().String(flagCampaignTotalShares, "", "Add a shares supply for the campaign")
c.Flags().String(flagCampaignTotalSupply, "", "Add a total of the mainnet of a campaign")
c.Flags().Bool(flagMainnet, false, "Initialize a mainnet campaign")
c.Flags().String(flagRewardCoins, "", "Reward coins")
c.Flags().Int64(flagRewardHeight, 0, "Last reward height")
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagSetHome())
Expand All @@ -69,6 +73,8 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error {
campaignTotalSharesStr, _ = cmd.Flags().GetString(flagCampaignTotalShares)
campaignTotalSupplyStr, _ = cmd.Flags().GetString(flagCampaignTotalSupply)
isMainnet, _ = cmd.Flags().GetBool(flagMainnet)
rewardCoinsStr, _ = cmd.Flags().GetString(flagRewardCoins)
rewardDuration, _ = cmd.Flags().GetInt64(flagRewardHeight)
)

if campaign != 0 && campaignTotalSupplyStr != "" {
Expand All @@ -93,6 +99,16 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error {
return err
}

rewardCoins, err := sdk.ParseCoinsNormalized(rewardCoinsStr)
if err != nil {
return err
}

if (!rewardCoins.Empty() && rewardDuration == 0) ||
(rewardCoins.Empty() && rewardDuration > 0) {
return fmt.Errorf("%s and %s flags must be provided together", flagRewardCoins, flagRewardHeight)
}

nb, err := newNetworkBuilder(cmd)
if err != nil {
return err
Expand Down Expand Up @@ -186,6 +202,12 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error {
return err
}

if !rewardCoins.Empty() && rewardDuration > 0 {
if err := n.SetReward(launchID, rewardDuration, rewardCoins); err != nil {
return err
}
}

nb.Spinner.Stop()

fmt.Printf("%s Network published \n", clispinner.OK)
Expand Down
17 changes: 17 additions & 0 deletions starport/cmd/network_reward.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package starportcmd

import (
"github.com/spf13/cobra"
)

// NewNetworkReward creates a new chain reward command
func NewNetworkReward() *cobra.Command {
c := &cobra.Command{
Use: "reward",
Short: "Manage network rewards",
}
c.AddCommand(
NewNetworkRewardSet(),
)
return c
}
58 changes: 58 additions & 0 deletions starport/cmd/network_reward_set.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package starportcmd

import (
"fmt"
"strconv"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/spf13/cobra"

"github.com/tendermint/starport/starport/services/network"
)

// NewNetworkRewardSet creates a new chain reward set command to
// add the chain reward to the network as a coordinator.
func NewNetworkRewardSet() *cobra.Command {
c := &cobra.Command{
Use: "set [launch-id] [last-reward-height] [coins]",
Short: "set a network chain reward",
Args: cobra.ExactArgs(3),
RunE: networkChainRewardSetHandler,
}
c.Flags().AddFlagSet(flagSetKeyringBackend())
c.Flags().AddFlagSet(flagNetworkFrom())
c.Flags().AddFlagSet(flagSetHome())
return c
}

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

// parse launch ID
launchID, err := network.ParseID(args[0])
if err != nil {
return err
}

// parse the last reward height
lastRewardHeight, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return err
}

coins, err := sdk.ParseCoinsNormalized(args[2])
if err != nil {
return fmt.Errorf("failed to parse coins: %w", err)
}

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

return n.SetReward(launchID, lastRewardHeight, coins)
}
14 changes: 14 additions & 0 deletions starport/pkg/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,20 @@ const (
StatusDone
)

// TextColor sets the text color
func TextColor(c color.Color) Option {
return func(e *Event) {
e.TextColor = c
}
}

// Icon sets the text icon prefix
func Icon(icon string) Option {
return func(e *Event) {
e.Icon = icon
}
}

// New creates a new event with given config.
func New(status Status, description string, options ...Option) Event {
ev := Event{Status: status, Description: description}
Expand Down
69 changes: 69 additions & 0 deletions starport/services/network/reward.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package network

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
rewardtypes "github.com/tendermint/spn/x/reward/types"

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

// SetReward set a chain reward
func (n Network) SetReward(launchID uint64, lastRewardHeight int64, coins sdk.Coins) error {
n.ev.Send(events.New(
events.StatusOngoing,
fmt.Sprintf("Setting reward %s to the chain %d at height %d",
coins.String(),
launchID,
lastRewardHeight,
),
))

msg := rewardtypes.NewMsgSetRewards(
n.account.Address(networktypes.SPN),
launchID,
lastRewardHeight,
coins,
)
res, err := n.cosmos.BroadcastTx(n.account.Name, msg)
if err != nil {
return err
}

var setRewardRes rewardtypes.MsgSetRewardsResponse
if err := res.Decode(&setRewardRes); err != nil {
return err
}

if setRewardRes.PreviousCoins.Empty() {
n.ev.Send(events.New(
events.StatusDone,
"The reward pool is empty.",
events.Icon(clispinner.Info),
))
} else {
n.ev.Send(events.New(events.StatusDone,
fmt.Sprintf(
"Previous reward pool %s at height %d was overwritten.",
coins.String(),
lastRewardHeight,
),
events.Icon(clispinner.Info),
))
}

if setRewardRes.NewCoins.Empty() {
n.ev.Send(events.New(events.StatusDone, "The reward pool was removed."))
} else {
n.ev.Send(events.New(events.StatusDone, fmt.Sprintf(
"%s will be distributed to validators at height %d. The chain %d is now an incentivized testnet",
coins.String(),
lastRewardHeight,
launchID,
)))
}
return nil
}