-
Notifications
You must be signed in to change notification settings - Fork 4
/
grpc_query.go
74 lines (59 loc) · 2.38 KB
/
grpc_query.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
package keeper
import (
"context"
"github.com/Carina-labs/nova/x/airdrop/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
var _ types.QueryServer = &Querier{}
type Querier struct {
keeper Keeper
}
func NewQuerier(k Keeper) Querier {
return Querier{keeper: k}
}
// AirdropInfo returns the airdrop info
func (q Querier) AirdropInfo(goCtx context.Context, _ *types.QueryAirdropInfoRequest) (*types.QueryAirdropInfoResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
info := q.keeper.GetAirdropInfo(ctx)
return &types.QueryAirdropInfoResponse{AirdropInfo: info}, nil
}
func (q Querier) TotalAllocatedAirdropToken(goCtx context.Context, request *types.QueryTotalAllocatedAirdropTokenRequest) (*types.QueryTotalAllocatedAirdropTokenResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
userAddr, err := sdk.AccAddressFromBech32(request.Address)
info := q.keeper.GetAirdropInfo(ctx)
if err != nil {
return nil, sdkerrors.ErrInvalidAddress
}
if !q.keeper.IsEligible(ctx, userAddr) {
return &types.QueryTotalAllocatedAirdropTokenResponse{TotalAssets: sdk.NewCoin(info.AirdropDenom, sdk.ZeroInt())}, nil
}
state, err := q.keeper.GetUserState(ctx, userAddr)
if err != nil {
q.keeper.Logger(ctx).Error("cannot get airdrop state, this error must never happen", "err", err)
return nil, sdkerrors.Wrapf(sdkerrors.ErrLogic, "err: %v", err)
}
amt, ok := sdk.NewIntFromString(state.TotalAmount)
if !ok {
q.keeper.Logger(ctx).Error("cannot parse total amount, this error must never happen", "err", err)
return nil, sdkerrors.Wrapf(sdkerrors.ErrLogic, "err: %v", err)
}
asset := sdk.NewCoin(info.AirdropDenom, amt)
return &types.QueryTotalAllocatedAirdropTokenResponse{TotalAssets: asset}, nil
}
// QuestState returns state of the quest for the given user
func (q Querier) QuestState(goCtx context.Context, request *types.QueryQuestStateRequest) (*types.QueryQuestStateResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
userAddr, err := sdk.AccAddressFromBech32(request.Address)
if err != nil {
return nil, sdkerrors.ErrInvalidAddress
}
if !q.keeper.IsEligible(ctx, userAddr) {
return nil, sdkerrors.ErrUnauthorized
}
state, err := q.keeper.GetUserState(ctx, userAddr)
if err != nil {
return nil, sdkerrors.Wrapf(sdkerrors.ErrLogic, "err: %v", err)
}
return &types.QueryQuestStateResponse{QuestStates: state.QuestStates}, nil
}