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

fix: refine sentinel errors #57

Merged
merged 3 commits into from
Oct 15, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Next Next commit
fix: refine sentinel errors
also update comments and simplify logic
  • Loading branch information
hallazzang committed Oct 15, 2021
commit 49624716a7968b4cb41a3e3fe7d557bc95940879
16 changes: 7 additions & 9 deletions x/budget/keeper/budget.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,6 @@ func (k Keeper) CollectBudgets(ctx sdk.Context) error {

var inputs []banktypes.Input
var outputs []banktypes.Output
sendCoins := func(from, to sdk.AccAddress, coins sdk.Coins) {
if !coins.Empty() && coins.IsValid() {
inputs = append(inputs, banktypes.NewInput(from, coins))
outputs = append(outputs, banktypes.NewOutput(to, coins))
}
}

// Get a map GetBudgetsBySourceMap that has a list of budgets and their total rate, which
// contain the same BudgetSourceAddress
Expand Down Expand Up @@ -56,8 +50,11 @@ func (k Keeper) CollectBudgets(ctx sdk.Context) error {
totalCollectionCoins = totalCollectionCoins.Add(collectionCoins...)
totalChangeCoins = totalChangeCoins.Add(changeCoins...)

// TODO: sendcoins after validation
sendCoins(budgetSourceAcc, collectionAcc, collectionCoins)
if !collectionCoins.Empty() && collectionCoins.IsValid() {
inputs = append(inputs, banktypes.NewInput(budgetSourceAcc, collectionCoins))
outputs = append(outputs, banktypes.NewOutput(collectionAcc, collectionCoins))
}

k.AddTotalCollectedCoins(ctx, budget.Name, collectionCoins)

ctx.EventManager().EmitEvents(sdk.Events{
Expand Down Expand Up @@ -86,7 +83,8 @@ func (k Keeper) CollectBudgets(ctx sdk.Context) error {
return nil
}

// Get all the Budgets registered in params.Budgets and return only the valid and not expired budgets
// CollectibleBudgets returns scan through the budgets registered in params.Budgets
// and returns only the valid and not expired budgets.
func (k Keeper) CollectibleBudgets(ctx sdk.Context) (budgets []types.Budget) {
params := k.GetParams(ctx)
if params.EpochBlocks > 0 && ctx.BlockHeight()%int64(params.EpochBlocks) == 0 {
Expand Down
11 changes: 7 additions & 4 deletions x/budget/types/budget.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,23 @@ func (budget Budget) Validate() error {
}

if _, err := sdk.AccAddressFromBech32(budget.CollectionAddress); err != nil {
return err
return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid collection address %s: %v", budget.CollectionAddress, err)
}

if _, err := sdk.AccAddressFromBech32(budget.BudgetSourceAddress); err != nil {
return err
return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid budget source address %s: %v", budget.CollectionAddress, err)
dongsam marked this conversation as resolved.
Show resolved Hide resolved
}

if budget.EndTime.Before(budget.StartTime) {
return ErrInvalidStartEndTime
}

if budget.Rate == sdk.ZeroDec() {
return ErrZeroBudgetRate
if !budget.Rate.IsPositive() {
return sdkerrors.Wrapf(ErrInvalidBudgetRate, "budget rate must not be positive: %s", budget.Rate)
} else if budget.Rate.GT(sdk.OneDec()) {
return sdkerrors.Wrapf(ErrInvalidBudgetRate, "budget rate must not exceed 1: %s", budget.Rate)
}

return nil
}

Expand Down
12 changes: 5 additions & 7 deletions x/budget/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ import (

// Sentinel errors for the budget module.
var (
ErrInvalidBudgetEndTime = sdkerrors.Register(ModuleName, 2, "invalid Budget end time")
ErrInvalidBudgetName = sdkerrors.Register(ModuleName, 3, "budget name only allows letters, digits, and dash(-) without spaces and the maximum length is 50")
ErrInvalidNameOfAddr = sdkerrors.Register(ModuleName, 4, "address must be generated in accordance with Rule adr-028 using the name and matched")
ErrInvalidStartEndTime = sdkerrors.Register(ModuleName, 5, "budget endtime should not be earlier than budget starttime")
ErrZeroBudgetRate = sdkerrors.Register(ModuleName, 6, "budget rate can't be zero")
ErrOverflowedBudgetRate = sdkerrors.Register(ModuleName, 7, "the total rate of budgets with the same budget source address value should not exceed 1")
ErrDuplicatedBudgetName = sdkerrors.Register(ModuleName, 8, "budget name cannot be duplicated")
ErrInvalidBudgetName = sdkerrors.Register(ModuleName, 2, "budget name only allows letters, digits, and dash(-) without spaces and the maximum length is 50")
ErrInvalidStartEndTime = sdkerrors.Register(ModuleName, 3, "budget end time should not be earlier than budget start time")
ErrInvalidBudgetRate = sdkerrors.Register(ModuleName, 4, "invalid budget rate")
ErrInvalidTotalBudgetRate = sdkerrors.Register(ModuleName, 5, "invalid total rate of the budgets with the same budget source address")
ErrDuplicateBudgetName = sdkerrors.Register(ModuleName, 6, "duplicate budget name")
)
8 changes: 7 additions & 1 deletion x/budget/types/genesis.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package types

import (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)

// NewGenesisState returns new GenesisState instance.
func NewGenesisState(params Params, records []BudgetRecord) *GenesisState {
return &GenesisState{
Expand All @@ -23,7 +27,9 @@ func ValidateGenesis(data GenesisState) error {
}
for _, record := range data.BudgetRecords {
if err := record.TotalCollectedCoins.Validate(); err != nil {
return err
return sdkerrors.Wrapf(
sdkerrors.ErrInvalidCoins,
"invalid total collected coins %s: %v", record.TotalCollectedCoins, err)
}
if err := ValidateName(record.Name); err != nil {
return err
Expand Down
8 changes: 4 additions & 4 deletions x/budget/types/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,10 @@ func TestValidateGenesis(t *testing.T) {
},
}
},
"decoding bech32 failed: failed converting data to bytes: invalid character not part of charset: 105",
"invalid budget source address cosmos1xq6geq9rc9zgkqmn9kxz2rykwe52thp0w9vz2w: decoding bech32 failed: failed converting data to bytes: invalid character not part of charset: 105: invalid address",
},
{
"duplicated budget case",
"duplicate budget name",
func(genState *types.GenesisState) {
genState.Params = types.DefaultParams()
genState.Params.Budgets = []types.Budget{
Expand All @@ -83,7 +83,7 @@ func TestValidateGenesis(t *testing.T) {
},
}
},
"budget1: budget name cannot be duplicated",
"budget1: duplicate budget name",
},
{
"invalid budget name case",
Expand All @@ -109,7 +109,7 @@ func TestValidateGenesis(t *testing.T) {
},
}
},
"coin 0stake amount is not positive",
"invalid total collected coins 0stake: coin 0stake amount is not positive: invalid coins",
},
}
for _, tc := range testCases {
Expand Down
8 changes: 5 additions & 3 deletions x/budget/types/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,17 @@ func ValidateBudgets(i interface{}) error {
return err
}
if _, ok := names[budget.Name]; ok {
return sdkerrors.Wrap(ErrDuplicatedBudgetName, budget.Name)
return sdkerrors.Wrap(ErrDuplicateBudgetName, budget.Name)
}
names[budget.Name] = true
}

budgetsBySourceMap := GetBudgetsBySourceMap(budgets)
for addr, budgets := range budgetsBySourceMap {
if budgets.TotalRate.GT(sdk.NewDec(1)) {
return sdkerrors.Wrap(ErrOverflowedBudgetRate, addr)
if budgets.TotalRate.GT(sdk.OneDec()) {
return sdkerrors.Wrapf(
ErrInvalidTotalBudgetRate,
"total rate for budget source address %s must not exceed 1: %v", addr, budgets.TotalRate)
}
}
return nil
Expand Down
4 changes: 2 additions & 2 deletions x/budget/types/params_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ func TestValidateBudgets(t *testing.T) {
require.NoError(t, err)

err = types.ValidateBudgets(budgets[:3])
require.Error(t, err, types.ErrOverflowedBudgetRate)
require.ErrorIs(t, err, types.ErrInvalidTotalBudgetRate)

err = types.ValidateBudgets(budgets)
require.Error(t, err, types.ErrDuplicatedBudgetName)
require.ErrorIs(t, err, types.ErrDuplicateBudgetName)
}

func TestValidateEpochBlocks(t *testing.T) {
Expand Down