-
Notifications
You must be signed in to change notification settings - Fork 0
/
handler.go
132 lines (109 loc) · 4.99 KB
/
handler.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package handler
import (
"fmt"
sdk "github.com/ci123chain/ci123chain/pkg/abci/types"
"github.com/ci123chain/ci123chain/pkg/distribution/keeper"
"github.com/ci123chain/ci123chain/pkg/distribution/types"
"github.com/pkg/errors"
)
func NewHandler(k keeper.DistrKeeper) sdk.Handler {
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
ctx = ctx.WithEventManager(sdk.NewEventManager())
switch msg := msg.(type) {
case *types.MsgSetWithdrawAddress:
return handleMsgModifyWithdrawAddress(ctx, *msg, k)
case *types.MsgWithdrawDelegatorReward:
return handleMsgWithdrawDelegatorReward(ctx, *msg, k)
case *types.MsgWithdrawValidatorCommission:
return handleMsgWithdrawValidatorCommission(ctx, *msg, k)
case *types.MsgFundCommunityPool:
return handleMsgFundCommunityPool(ctx, *msg, k)
default:
errMsg := fmt.Sprintf("unrecognized supply message type: %T", msg)
return nil, errors.New(errMsg)
}
}
}
func handleMsgModifyWithdrawAddress(ctx sdk.Context, msg types.MsgSetWithdrawAddress, k keeper.DistrKeeper) (*sdk.Result, error) {
//verify identity
if !msg.FromAddress.Equal(msg.DelegatorAddress) {
return nil, errors.New(fmt.Sprintf("account address mismatch, expected %s, got %s", msg.FromAddress.String(), msg.DelegatorAddress.String()))
}
//check validator that is bonded to delegator account.
validators, Err := k.StakingKeeper.GetDelegatorValidators(ctx, msg.DelegatorAddress, 3)
if Err != nil || validators == nil {
return nil, errors.New(fmt.Sprintf("got no validator that is bonded to %s", msg.DelegatorAddress.String()))
}
err := k.SetWithdrawAddr(ctx, msg.DelegatorAddress, msg.WithdrawAddress)
if err != nil {
return nil, err
}
//ctx.EventManager().EmitEvent(
// sdk.NewEvent(
// types.EventTypeModifyWithdrawAddress,
// sdk.NewAttribute([]byte(sdk.AttributeKeyMethod), []byte(types.EventTypeModifyWithdrawAddress)),
// sdk.NewAttribute([]byte(sdk.AttributeKeyModule), []byte(types.AttributeValueCategory)),
// sdk.NewAttribute([]byte(sdk.AttributeKeySender), []byte(msg.FromAddress.String())),
// ),
//)
return &sdk.Result{Events: ctx.EventManager().Events()}, nil
}
func handleMsgWithdrawDelegatorReward(ctx sdk.Context, msg types.MsgWithdrawDelegatorReward, k keeper.DistrKeeper) (*sdk.Result, error) {
//verify identity
if !msg.FromAddress.Equal(msg.DelegatorAddress) {
return nil, errors.New(fmt.Sprintf("account address mismatch, expected %s, got %s", msg.FromAddress.String(), msg.DelegatorAddress.String()))
}
_, err := k.WithdrawDelegationRewards(ctx, msg.DelegatorAddress, msg.ValidatorAddress)
if err != nil {
return nil, err
}
//ctx.EventManager().EmitEvent(
// sdk.NewEvent(
// types.EventTypeWithdrawRewards,
// sdk.NewAttribute([]byte(sdk.AttributeKeyMethod), []byte(types.EventTypeWithdrawRewards)),
// sdk.NewAttribute([]byte(sdk.AttributeKeyModule), []byte(types.AttributeValueCategory)),
// sdk.NewAttribute([]byte(types.AttributeKeyWithdrawAddress), []byte(msg.FromAddress.String())),
// sdk.NewAttribute([]byte(sdk.AttributeKeySender), []byte(msg.FromAddress.String())),
// ),
//)
return &sdk.Result{Events: ctx.EventManager().Events()}, nil
}
func handleMsgWithdrawValidatorCommission(ctx sdk.Context, msg types.MsgWithdrawValidatorCommission, k keeper.DistrKeeper) (*sdk.Result, error) {
//verify identity
if !msg.FromAddress.Equal(msg.ValidatorAddress) {
return nil, errors.New(fmt.Sprintf("account address mismatch, expected %s, got %s", msg.FromAddress.String(), msg.ValidatorAddress.String()))
}
_, ok := k.StakingKeeper.GetValidator(ctx, msg.ValidatorAddress)
if !ok {
return nil, errors.New(fmt.Sprintf("validator %s not exist", msg.ValidatorAddress.String()))
}
_, err := k.WithdrawValidatorCommission(ctx, msg.ValidatorAddress)
if err != nil {
return nil, err
}
//ctx.EventManager().EmitEvent(
// sdk.NewEvent(
// types.EventTypeWithdrawCommission,
// sdk.NewAttribute([]byte(sdk.AttributeKeyMethod), []byte(types.EventTypeWithdrawCommission)),
// sdk.NewAttribute([]byte(sdk.AttributeKeyModule), []byte(types.AttributeValueCategory)),
// sdk.NewAttribute([]byte(types.AttributeKeyWithdrawAddress), []byte(msg.FromAddress.String())),
// sdk.NewAttribute([]byte(sdk.AttributeKeySender), []byte(msg.FromAddress.String())),
// ),
//)
return &sdk.Result{Events: ctx.EventManager().Events()}, nil
}
//send funds from personal account to communityPool.
func handleMsgFundCommunityPool(ctx sdk.Context, msg types.MsgFundCommunityPool, k keeper.DistrKeeper) (*sdk.Result, error) {
if err := k.FundCommunityPool(ctx, msg.Amount, msg.Depositor); err != nil {
return nil, err
}
//ctx.EventManager().EmitEvent(
// sdk.NewEvent(
// types.EventTypeFundCommunityPool,
// sdk.NewAttribute([]byte(sdk.AttributeKeyMethod), []byte(types.EventTypeFundCommunityPool)),
// sdk.NewAttribute([]byte(sdk.AttributeKeyModule), []byte(types.AttributeValueCategory)),
// sdk.NewAttribute([]byte(sdk.AttributeKeySender), []byte(msg.FromAddress.String())),
// ),
//)
return &sdk.Result{Events: ctx.EventManager().Events()}, nil
}