mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 00:05:18 +00:00
[R4R] harvest fixes (#673)
* fix: don't allow denoms other than hard for harvest rewards * fix: parse cli flags correctly * fix: convert duration to seconds before calculating time elapsed * fix: don't distribute rewards before they start or after they end * fix: return correct message type
This commit is contained in:
parent
993d36d05a
commit
c416423412
@ -114,7 +114,7 @@ func queryModAccountsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||||
return &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "deposits",
|
Use: "deposits",
|
||||||
Short: "query harvest module deposits with optional filters",
|
Short: "query harvest module deposits with optional filters",
|
||||||
Long: strings.TrimSpace(`query for all harvest module deposits or a specific deposit using flags:
|
Long: strings.TrimSpace(`query for all harvest module deposits or a specific deposit using flags:
|
||||||
@ -174,10 +174,16 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
return cliCtx.PrintOutput(deposits)
|
return cliCtx.PrintOutput(deposits)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for")
|
||||||
|
cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)")
|
||||||
|
cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address")
|
||||||
|
cmd.Flags().String(flagDepositDenom, "", "(optional) filter for deposits by denom")
|
||||||
|
cmd.Flags().String(flagDepositType, "", "(optional) filter for deposits by type (lp or staking)")
|
||||||
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||||
return &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "claims",
|
Use: "claims",
|
||||||
Short: "query harvest module claims with optional filters",
|
Short: "query harvest module claims with optional filters",
|
||||||
Long: strings.TrimSpace(`query for all harvest module claims or a specific claim using flags:
|
Long: strings.TrimSpace(`query for all harvest module claims or a specific claim using flags:
|
||||||
@ -237,4 +243,10 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
return cliCtx.PrintOutput(claims)
|
return cliCtx.PrintOutput(claims)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for")
|
||||||
|
cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)")
|
||||||
|
cmd.Flags().String(flagOwner, "", "(optional) filter for claims by owner address")
|
||||||
|
cmd.Flags().String(flagDepositDenom, "", "(optional) filter for claims by denom")
|
||||||
|
cmd.Flags().String(flagDepositType, "", "(optional) filter for claims by type (lp or staking)")
|
||||||
|
return cmd
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ func getCmdDeposit(cdc *codec.Codec) *cobra.Command {
|
|||||||
return &cobra.Command{
|
return &cobra.Command{
|
||||||
Use: "deposit [amount] [deposit-type]",
|
Use: "deposit [amount] [deposit-type]",
|
||||||
Short: "deposit coins to harvest",
|
Short: "deposit coins to harvest",
|
||||||
Args: cobra.ExactArgs(3),
|
Args: cobra.ExactArgs(2),
|
||||||
Example: fmt.Sprintf(
|
Example: fmt.Sprintf(
|
||||||
`%s tx %s deposit 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
`%s tx %s deposit 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
||||||
),
|
),
|
||||||
@ -67,7 +67,7 @@ func getCmdWithdraw(cdc *codec.Codec) *cobra.Command {
|
|||||||
return &cobra.Command{
|
return &cobra.Command{
|
||||||
Use: "withdraw [amount] [deposit-type]",
|
Use: "withdraw [amount] [deposit-type]",
|
||||||
Short: "withdraw coins from harvest",
|
Short: "withdraw coins from harvest",
|
||||||
Args: cobra.ExactArgs(3),
|
Args: cobra.ExactArgs(2),
|
||||||
Example: fmt.Sprintf(
|
Example: fmt.Sprintf(
|
||||||
`%s tx %s withdraw 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
`%s tx %s withdraw 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
||||||
),
|
),
|
||||||
|
@ -31,6 +31,9 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
|||||||
if lps.End.Before(ctx.BlockTime()) {
|
if lps.End.Before(ctx.BlockTime()) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if lps.Start.After(ctx.BlockTime()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
totalDeposited := k.GetTotalDeposited(ctx, types.LP, lps.DepositDenom)
|
totalDeposited := k.GetTotalDeposited(ctx, types.LP, lps.DepositDenom)
|
||||||
if totalDeposited.IsZero() {
|
if totalDeposited.IsZero() {
|
||||||
continue
|
continue
|
||||||
@ -80,8 +83,11 @@ func (k Keeper) ShouldDistributeValidatorRewards(ctx sdk.Context, denom string)
|
|||||||
if denom != dds.DistributionSchedule.DepositDenom {
|
if denom != dds.DistributionSchedule.DepositDenom {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if dds.DistributionSchedule.End.Before(ctx.BlockTime()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
timeElapsed := sdk.NewInt(ctx.BlockTime().Unix() - previousDistributionTime.Unix())
|
timeElapsed := sdk.NewInt(ctx.BlockTime().Unix() - previousDistributionTime.Unix())
|
||||||
if timeElapsed.GTE(sdk.NewInt(int64(dds.DistributionFrequency))) {
|
if timeElapsed.GTE(sdk.NewInt(int64(dds.DistributionFrequency.Seconds()))) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -97,6 +103,9 @@ func (k Keeper) ApplyDelegationRewards(ctx sdk.Context, denom string) {
|
|||||||
if !dds.DistributionSchedule.Active {
|
if !dds.DistributionSchedule.Active {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if dds.DistributionSchedule.Start.After(ctx.BlockTime()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
bondMacc := k.stakingKeeper.GetBondedPool(ctx)
|
bondMacc := k.stakingKeeper.GetBondedPool(ctx)
|
||||||
bondedCoinAmount := bondMacc.GetCoins().AmountOf(dds.DistributionSchedule.DepositDenom)
|
bondedCoinAmount := bondMacc.GetCoins().AmountOf(dds.DistributionSchedule.DepositDenom)
|
||||||
if bondedCoinAmount.IsZero() {
|
if bondedCoinAmount.IsZero() {
|
||||||
|
@ -116,8 +116,8 @@ type MsgWithdraw struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewMsgWithdraw returns a new MsgWithdraw
|
// NewMsgWithdraw returns a new MsgWithdraw
|
||||||
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coin, depositType string) MsgDeposit {
|
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coin, depositType string) MsgWithdraw {
|
||||||
return MsgDeposit{
|
return MsgWithdraw{
|
||||||
Depositor: depositor,
|
Depositor: depositor,
|
||||||
Amount: amount,
|
Amount: amount,
|
||||||
DepositType: depositType,
|
DepositType: depositType,
|
||||||
|
@ -74,6 +74,9 @@ func (ds DistributionSchedule) Validate() error {
|
|||||||
if !ds.RewardsPerSecond.IsPositive() {
|
if !ds.RewardsPerSecond.IsPositive() {
|
||||||
return fmt.Errorf("reward amount must be positive, is %s for %s", ds.RewardsPerSecond, ds.DepositDenom)
|
return fmt.Errorf("reward amount must be positive, is %s for %s", ds.RewardsPerSecond, ds.DepositDenom)
|
||||||
}
|
}
|
||||||
|
if ds.RewardsPerSecond.Denom != "hard" {
|
||||||
|
return fmt.Errorf("reward denom should be hard, is %s", ds.RewardsPerSecond.Denom)
|
||||||
|
}
|
||||||
if ds.Start.IsZero() {
|
if ds.Start.IsZero() {
|
||||||
return errors.New("reward period start time cannot be 0")
|
return errors.New("reward period start time cannot be 0")
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,22 @@ func (suite *ParamTestSuite) TestParamValidation() {
|
|||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "invalid rewards",
|
||||||
|
args: args{
|
||||||
|
lps: types.DistributionSchedules{
|
||||||
|
types.NewDistributionSchedule(true, "bnb", time.Date(2020, 10, 8, 14, 0, 0, 0, time.UTC), time.Date(2020, 11, 22, 14, 0, 0, 0, time.UTC), sdk.NewCoin("busd", sdk.NewInt(5000)), time.Date(2021, 11, 22, 14, 0, 0, 0, time.UTC), types.Multipliers{types.NewMultiplier(types.Small, 0, sdk.MustNewDecFromStr("0.33")), types.NewMultiplier(types.Medium, 6, sdk.MustNewDecFromStr("0.5")), types.NewMultiplier(types.Medium, 24, sdk.OneDec())}),
|
||||||
|
},
|
||||||
|
dds: types.DelegatorDistributionSchedules{types.NewDelegatorDistributionSchedule(
|
||||||
|
types.NewDistributionSchedule(true, "bnb", time.Date(2020, 10, 8, 14, 0, 0, 0, time.UTC), time.Date(2025, 10, 8, 14, 0, 0, 0, time.UTC), sdk.NewCoin("hard", sdk.NewInt(500)), time.Date(2026, 10, 8, 14, 0, 0, 0, time.UTC), types.Multipliers{types.NewMultiplier(types.Small, 0, sdk.MustNewDecFromStr("0.33")), types.NewMultiplier(types.Medium, 6, sdk.MustNewDecFromStr("0.5")), types.NewMultiplier(types.Medium, 24, sdk.OneDec())}),
|
||||||
|
time.Hour*24,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
active: true,
|
||||||
|
},
|
||||||
|
expectPass: false,
|
||||||
|
expectedErr: "reward denom should be hard",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
|
Loading…
Reference in New Issue
Block a user