/
msg_server.go
86 lines (73 loc) · 2.35 KB
/
msg_server.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package keeper
import (
"context"
"cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
"github.com/ojo-network/ojo/x/airdrop/types"
)
type msgServer struct {
keeper Keeper
}
// NewMsgServerImpl returns an implementation of the airdrop MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(keeper Keeper) types.MsgServer {
return &msgServer{keeper: keeper}
}
// SetParams implements MsgServer.SetParams method.
// It defines a method to update the x/airdrop module parameters.
func (ms msgServer) SetParams(goCtx context.Context, msg *types.MsgSetParams) (*types.MsgSetParamsResponse, error) {
if ms.keeper.authority != msg.Authority {
err := errors.Wrapf(
govtypes.ErrInvalidSigner,
"invalid authority; expected %s, got %s",
ms.keeper.authority,
msg.Authority,
)
return nil, err
}
if err := msg.Params.Validate(); err != nil {
return nil, err
}
ctx := sdk.UnwrapSDKContext(goCtx)
ms.keeper.SetParams(ctx, *msg.Params)
return &types.MsgSetParamsResponse{}, nil
}
// ClaimAirdrop implements MsgServer.ClaimAirdrop method.
// It defines a method to claim an airdrop.
func (ms msgServer) ClaimAirdrop(
goCtx context.Context,
msg *types.MsgClaimAirdrop,
) (*types.MsgClaimAirdropResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
airdropAccount, err := ms.keeper.GetAirdropAccount(ctx, msg.FromAddress, types.AirdropAccount_STATE_UNCLAIMED)
if err != nil {
return nil, err
}
if err := airdropAccount.VerifyNotClaimed(); err != nil {
return nil, err
}
airdropAccount.ClaimAddress = msg.ToAddress
// Check if past expiry block
if ctx.BlockHeight() > int64(ms.keeper.GetParams(ctx).ExpiryBlock) {
err = types.ErrAirdropExpired
return nil, err
}
if err = ms.keeper.VerifyDelegationRequirement(ctx, airdropAccount); err != nil {
return nil, err
}
ms.keeper.SetClaimAmount(ctx, airdropAccount)
if err = ms.keeper.MintClaimTokensToAirdrop(ctx, airdropAccount); err != nil {
return nil, err
}
if err = ms.keeper.CreateClaimAccount(ctx, airdropAccount); err != nil {
return nil, err
}
if err = ms.keeper.SendClaimTokens(ctx, airdropAccount); err != nil {
return nil, err
}
if err = ms.keeper.ChangeAirdropAccountState(ctx, airdropAccount, types.AirdropAccount_STATE_CLAIMED); err != nil {
return nil, err
}
return &types.MsgClaimAirdropResponse{}, nil
}