-
Notifications
You must be signed in to change notification settings - Fork 44
/
msg_server_claim_vesting.go
56 lines (45 loc) · 1.59 KB
/
msg_server_claim_vesting.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package keeper
import (
"context"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/elys-network/elys/x/commitment/types"
ptypes "github.com/elys-network/elys/x/parameter/types"
)
// ClaimVesting claims already vested amount
func (k msgServer) ClaimVesting(goCtx context.Context, msg *types.MsgClaimVesting) (*types.MsgClaimVestingResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
// Get the Commitments for the sender
commitments := k.GetCommitments(ctx, msg.Sender)
sender := sdk.MustAccAddressFromBech32(msg.Sender)
newClaims := sdk.Coins{}
for i, vesting := range commitments.VestingTokens {
vestedSoFar := vesting.VestedSoFar(ctx)
newClaim := vestedSoFar.Sub(vesting.ClaimedAmount)
newClaims = newClaims.Add(sdk.NewCoin(vesting.Denom, newClaim))
commitments.VestingTokens[i].ClaimedAmount = vestedSoFar
}
if newClaims.IsAllPositive() {
// mint coins if vesting token is ELYS
if newClaims.AmountOf(ptypes.Elys).IsPositive() {
elysCoins := sdk.Coins{sdk.NewCoin(ptypes.Elys, newClaims.AmountOf(ptypes.Elys))}
err := k.bankKeeper.MintCoins(ctx, types.ModuleName, elysCoins)
if err != nil {
return nil, err
}
}
err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, newClaims)
if err != nil {
return nil, err
}
}
k.SetCommitments(ctx, commitments)
// Emit blockchain event
ctx.EventManager().EmitEvent(
sdk.NewEvent(
types.EventTypeClaimVesting,
sdk.NewAttribute(types.AttributeCreator, msg.Sender),
sdk.NewAttribute(types.AttributeAmount, newClaims.String()),
),
)
return &types.MsgClaimVestingResponse{}, nil
}