-
Notifications
You must be signed in to change notification settings - Fork 28
/
reward_signup.go
71 lines (59 loc) · 2.46 KB
/
reward_signup.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
package types
import (
context "context"
sdkerrors "cosmossdk.io/errors"
sdkmath "cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrtypes "github.com/cosmos/cosmos-sdk/types/errors"
)
// SignUpReward is the type for signup rewards calculations
type SignUpReward struct{}
// NewSignUpReward create new object of signup reward calculator type.
func NewSignUpReward() SignUpReward { return SignUpReward{} }
// VaidateCampaign validates campaign definitions.
func (sur SignUpReward) ValidateCampaign(campaign Campaign) error {
if campaign.RewardCategory != RewardCategory_REWARD_CATEGORY_SIGNUP {
return sdkerrors.Wrapf(ErrWrongRewardCategory, "signup referral rewards can only have single definition")
}
if campaign.RewardAmount.SubaccountAmount.LTE(sdkmath.ZeroInt()) {
return sdkerrors.Wrapf(ErrWrongAmountForType, "signup referral rewards for subaccount should be positive")
}
if campaign.RewardAmountType != RewardAmountType_REWARD_AMOUNT_TYPE_FIXED {
return sdkerrors.Wrapf(ErrWrongRewardAmountType, "reward amount type not supported for given reward type.")
}
return nil
}
// Calculate parses ticket payload and returns the distribution list of signup reward.
func (sur SignUpReward) Calculate(goCtx context.Context, ctx sdk.Context, keepers RewardFactoryKeepers,
campaign Campaign, ticket, creator string,
) (RewardFactoryData, error) {
var payload GrantSignupRewardPayload
if err := keepers.OVMKeeper.VerifyTicketUnmarshal(goCtx, ticket, &payload); err != nil {
return RewardFactoryData{}, sdkerrors.Wrapf(ErrInTicketVerification, "%s", err)
}
if err := payload.Common.Validate(); err != nil {
return RewardFactoryData{}, sdkerrors.Wrapf(sdkerrtypes.ErrInvalidRequest, "%s", err)
}
addr, err := sdk.AccAddressFromBech32(payload.Common.Receiver)
if err != nil {
return RewardFactoryData{}, sdkerrors.Wrapf(sdkerrtypes.ErrInvalidAddress, "%s", err)
}
if keepers.SubaccountKeeper.IsSubaccount(ctx, addr) {
return RewardFactoryData{}, ErrReceiverAddrCanNotBeSubaccount
}
subaccountAddrStr, err := keepers.getSubaccountAddr(ctx, creator, payload.Common.Receiver)
if err != nil {
return RewardFactoryData{}, sdkerrors.Wrapf(sdkerrtypes.ErrInvalidAddress, "%s", err)
}
return NewRewardFactoryData(
NewReceiver(
payload.Common.Receiver,
subaccountAddrStr,
campaign.RewardAmount.MainAccountAmount,
campaign.RewardAmount.SubaccountAmount,
sdk.ZeroDec(), sdk.ZeroDec(),
campaign.RewardAmount.UnlockPeriod,
),
payload.Common,
), nil
}