Skip to content

Commit c2676d1

Browse files
committed
implement batch reward claim
1 parent da68c4b commit c2676d1

File tree

9 files changed

+1429
-101
lines changed

9 files changed

+1429
-101
lines changed

api/side/farming/tx.pulsar.go

Lines changed: 938 additions & 63 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/side/farming/tx_grpc.pb.go

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/static/openapi.yml

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

proto/side/farming/tx.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ service Msg {
1818
rpc Stake(MsgStake) returns (MsgStakeResponse);
1919
rpc Unstake(MsgUnstake) returns (MsgUnstakeResponse);
2020
rpc Claim(MsgClaim) returns (MsgClaimResponse);
21+
rpc ClaimAll(MsgClaimAll) returns (MsgClaimAllResponse);
2122

2223
// UpdateParams defines a governance operation for updating the x/farming module
2324
// parameters. The authority defaults to the x/gov module account.
@@ -61,6 +62,15 @@ message MsgClaim {
6162

6263
message MsgClaimResponse {}
6364

65+
message MsgClaimAll {
66+
option (cosmos.msg.v1.signer) = "staker";
67+
68+
// Staker address
69+
string staker = 1;
70+
}
71+
72+
message MsgClaimAllResponse {}
73+
6474
// MsgUpdateParams is the Msg/UpdateParams request type.
6575
//
6676
// Since: cosmos-sdk 0.47

x/farming/keeper/msg_server.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,31 @@ func (m msgServer) Claim(goCtx context.Context, msg *types.MsgClaim) (*types.Msg
181181
return &types.MsgClaimResponse{}, nil
182182
}
183183

184+
// ClaimAll implements types.MsgServer.
185+
func (m msgServer) ClaimAll(goCtx context.Context, msg *types.MsgClaimAll) (*types.MsgClaimAllResponse, error) {
186+
if err := msg.ValidateBasic(); err != nil {
187+
return nil, err
188+
}
189+
190+
ctx := sdk.UnwrapSDKContext(goCtx)
191+
192+
pendingRewards, err := m.ClaimAllRewards(ctx, msg.Staker)
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
// emit events
198+
ctx.EventManager().EmitEvent(
199+
sdk.NewEvent(
200+
types.EventTypeClaim,
201+
sdk.NewAttribute(types.AttributeKeyStaker, msg.Staker),
202+
sdk.NewAttribute(types.AttributeKeyRewards, pendingRewards.String()),
203+
),
204+
)
205+
206+
return &types.MsgClaimAllResponse{}, nil
207+
}
208+
184209
// UpdateParams updates the module params.
185210
func (m msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) {
186211
if m.authority != msg.Authority {

x/farming/keeper/reward.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,29 @@ func (k Keeper) GetRewards(ctx sdk.Context, address string) (sdk.Coin, sdk.Coin)
5454

5555
return pendingRewards, totalRewards
5656
}
57+
58+
// ClaimAllRewards claims all pending rewards of the given address
59+
func (k Keeper) ClaimAllRewards(ctx sdk.Context, address string) (sdk.Coin, error) {
60+
pendingRewards := sdk.NewCoin(k.RewardPerEpoch(ctx).Denom, sdkmath.ZeroInt())
61+
62+
k.IterateStakingsByAddress(ctx, address, func(staking *types.Staking) (stop bool) {
63+
// accumulate pending rewards
64+
pendingRewards = pendingRewards.Add(staking.PendingRewards)
65+
66+
// reset pending rewards
67+
staking.PendingRewards = sdk.NewCoin(k.RewardPerEpoch(ctx).Denom, sdkmath.ZeroInt())
68+
k.SetStaking(ctx, staking)
69+
70+
return false
71+
})
72+
73+
if pendingRewards.IsZero() {
74+
return pendingRewards, types.ErrNoPendingRewards
75+
}
76+
77+
if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sdk.MustAccAddressFromBech32(address), sdk.NewCoins(pendingRewards)); err != nil {
78+
return pendingRewards, err
79+
}
80+
81+
return pendingRewards, nil
82+
}

x/farming/types/codec.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ import (
1010
func RegisterCodec(cdc *codec.LegacyAmino) {
1111
cdc.RegisterConcrete(&MsgStake{}, "farming/MsgStake", nil)
1212
cdc.RegisterConcrete(&MsgUnstake{}, "farming/MsgUnstake", nil)
13+
cdc.RegisterConcrete(&MsgClaim{}, "farming/MsgClaim", nil)
14+
cdc.RegisterConcrete(&MsgClaimAll{}, "farming/MsgClaimAll", nil)
1315
cdc.RegisterConcrete(&MsgUpdateParams{}, "farming/MsgUpdateParams", nil)
1416
// this line is used by starport scaffolding # 2
1517
}
1618

1719
func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
1820
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgStake{})
1921
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgUnstake{})
22+
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgClaim{})
23+
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgClaimAll{})
2024
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgUpdateParams{})
2125

2226
// this line is used by starport scaffolding # 3

x/farming/types/msg_claim_all.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package types
2+
3+
import (
4+
errorsmod "cosmossdk.io/errors"
5+
sdk "github.com/cosmos/cosmos-sdk/types"
6+
)
7+
8+
var _ sdk.Msg = &MsgClaimAll{}
9+
10+
func NewMsgClaimAll(staker string) *MsgClaimAll {
11+
return &MsgClaimAll{
12+
Staker: staker,
13+
}
14+
}
15+
16+
// ValidateBasic performs basic message validation.
17+
func (m *MsgClaimAll) ValidateBasic() error {
18+
if _, err := sdk.AccAddressFromBech32(m.Staker); err != nil {
19+
return errorsmod.Wrap(err, "invalid sender address")
20+
}
21+
22+
return nil
23+
}

0 commit comments

Comments
 (0)