Skip to content

Commit e6678cf

Browse files
committed
optimize reward distribution
1 parent 4b5ce1f commit e6678cf

File tree

3 files changed

+57
-41
lines changed

3 files changed

+57
-41
lines changed

x/incentive/keeper/params.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ package keeper
22

33
import (
44
sdk "github.com/cosmos/cosmos-sdk/types"
5+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
6+
7+
"github.com/sideprotocol/side/x/incentive/types"
58
)
69

710
// IncentiveEnabled returns true if the incentive mechanism is enabled, false otherwise
811
func (k Keeper) IncentiveEnabled(ctx sdk.Context) bool {
9-
return k.GetParams(ctx).Enabled
12+
return k.GetParams(ctx).Enabled && !k.bankKeeper.SpendableCoins(ctx, authtypes.NewModuleAddress(types.ModuleName)).IsZero()
1013
}
1114

1215
// RewardPerDeposit returns the reward amount for each deposit

x/incentive/keeper/reward.go

+51-39
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ import (
66
"github.com/sideprotocol/side/x/incentive/types"
77
)
88

9+
// GetReward gets the reward of the given address
10+
func (k Keeper) GetReward(ctx sdk.Context, address string) *types.Reward {
11+
store := ctx.KVStore(k.storeKey)
12+
13+
var reward types.Reward
14+
bz := store.Get(types.RewardKey(address))
15+
k.cdc.MustUnmarshal(bz, &reward)
16+
17+
return &reward
18+
}
19+
920
// SetReward sets the given reward
1021
func (k Keeper) SetReward(ctx sdk.Context, reward *types.Reward) {
1122
store := ctx.KVStore(k.storeKey)
@@ -15,35 +26,46 @@ func (k Keeper) SetReward(ctx sdk.Context, reward *types.Reward) {
1526
store.Set(types.RewardKey(reward.Address), bz)
1627
}
1728

18-
// GetReward gets the reward of the given address
19-
func (k Keeper) GetReward(ctx sdk.Context, address string) *types.Reward {
20-
store := ctx.KVStore(k.storeKey)
29+
// AddDepositReward adds the deposit reward for the specified address by the given amount
30+
func (k Keeper) AddDepositReward(ctx sdk.Context, address string, amount sdk.Coin) {
31+
reward := k.GetReward(ctx, address)
2132

22-
var reward types.Reward
23-
bz := store.Get(types.RewardKey(address))
24-
k.cdc.MustUnmarshal(bz, &reward)
33+
reward.Address = address
34+
reward.DepositCount += 1
35+
reward.TotalAmount = amount.AddAmount(reward.TotalAmount.Amount)
2536

26-
return &reward
37+
k.SetReward(ctx, reward)
2738
}
2839

29-
// SetTotalRewards sets the total rewards
30-
func (k Keeper) SetTotalRewards(ctx sdk.Context, totalRewards sdk.Coin) {
31-
store := ctx.KVStore(k.storeKey)
40+
// AddWithdrawReward adds the withdrawal reward for the specified address by the given amount
41+
func (k Keeper) AddWithdrawReward(ctx sdk.Context, address string, amount sdk.Coin) {
42+
reward := k.GetReward(ctx, address)
3243

33-
bz := k.cdc.MustMarshal(&totalRewards)
44+
reward.Address = address
45+
reward.WithdrawCount += 1
46+
reward.TotalAmount = amount.AddAmount(reward.TotalAmount.Amount)
3447

35-
store.Set(types.TotalRewardsKey, bz)
48+
k.SetReward(ctx, reward)
3649
}
3750

3851
// GetTotalRewards gets the total rewards
3952
func (k Keeper) GetTotalRewards(ctx sdk.Context) sdk.Coin {
4053
store := ctx.KVStore(k.storeKey)
4154

42-
var rewards sdk.Coin
55+
var totalRewards sdk.Coin
4356
bz := store.Get(types.TotalRewardsKey)
44-
k.cdc.MustUnmarshal(bz, &rewards)
57+
k.cdc.MustUnmarshal(bz, &totalRewards)
58+
59+
return totalRewards
60+
}
61+
62+
// SetTotalRewards sets the total rewards
63+
func (k Keeper) SetTotalRewards(ctx sdk.Context, totalRewards sdk.Coin) {
64+
store := ctx.KVStore(k.storeKey)
4565

46-
return rewards
66+
bz := k.cdc.MustMarshal(&totalRewards)
67+
68+
store.Set(types.TotalRewardsKey, bz)
4769
}
4870

4971
// UpdateTotalRewards updates the total rewards by delta
@@ -57,45 +79,35 @@ func (k Keeper) UpdateTotalRewards(ctx sdk.Context, delta sdk.Coin) {
5779
// DistributeDepositReward distributes reward for deposit
5880
func (k Keeper) DistributeDepositReward(ctx sdk.Context, address string) error {
5981
if !k.IncentiveEnabled(ctx) {
60-
return nil
82+
return types.ErrIncentiveNotEnabled
6183
}
6284

63-
if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sdk.MustAccAddressFromBech32(address), sdk.NewCoins(k.RewardPerDeposit(ctx))); err != nil {
64-
// ignore error
65-
return nil
66-
}
85+
rewardAmount := k.RewardPerDeposit(ctx)
6786

68-
reward := k.GetReward(ctx, address)
69-
70-
reward.Address = address
71-
reward.DepositCount += 1
72-
reward.TotalAmount = k.RewardPerDeposit(ctx).AddAmount(reward.TotalAmount.Amount)
87+
if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sdk.MustAccAddressFromBech32(address), sdk.NewCoins(rewardAmount)); err != nil {
88+
return err
89+
}
7390

74-
k.SetReward(ctx, reward)
75-
k.UpdateTotalRewards(ctx, k.RewardPerDeposit(ctx))
91+
k.AddDepositReward(ctx, address, rewardAmount)
92+
k.UpdateTotalRewards(ctx, rewardAmount)
7693

7794
return nil
7895
}
7996

8097
// DistributeWithdrawReward distributes reward for withdrawal
8198
func (k Keeper) DistributeWithdrawReward(ctx sdk.Context, address string) error {
8299
if !k.IncentiveEnabled(ctx) {
83-
return nil
100+
return types.ErrIncentiveNotEnabled
84101
}
85102

86-
if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sdk.MustAccAddressFromBech32(address), sdk.NewCoins(k.RewardPerWithdraw(ctx))); err != nil {
87-
// ignore error
88-
return nil
89-
}
103+
rewardAmount := k.RewardPerWithdraw(ctx)
90104

91-
reward := k.GetReward(ctx, address)
92-
93-
reward.Address = address
94-
reward.WithdrawCount += 1
95-
reward.TotalAmount = k.RewardPerWithdraw(ctx).AddAmount(reward.TotalAmount.Amount)
105+
if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sdk.MustAccAddressFromBech32(address), sdk.NewCoins(rewardAmount)); err != nil {
106+
return err
107+
}
96108

97-
k.SetReward(ctx, reward)
98-
k.UpdateTotalRewards(ctx, k.RewardPerWithdraw(ctx))
109+
k.AddWithdrawReward(ctx, address, rewardAmount)
110+
k.UpdateTotalRewards(ctx, rewardAmount)
99111

100112
return nil
101113
}

x/incentive/types/errors.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ import (
88

99
// x/incentive module sentinel errors
1010
var (
11-
ErrInvalidParams = errorsmod.Register(ModuleName, 1001, "invalid params")
11+
ErrIncentiveNotEnabled = errorsmod.Register(ModuleName, 1001, "incentive not enabled")
12+
ErrInvalidParams = errorsmod.Register(ModuleName, 1002, "invalid params")
1213
)

0 commit comments

Comments
 (0)