/
msg_server.go
134 lines (103 loc) · 4.45 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
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
133
134
package keeper
import (
"context"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/percosis-labs/percosis/v16/x/valset-pref/types"
)
type msgServer struct {
keeper *Keeper
}
// NewMsgServerImpl returns an implementation of the MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(keeper *Keeper) types.MsgServer {
return &msgServer{
keeper: keeper,
}
}
var _ types.MsgServer = msgServer{}
func (server msgServer) SetValidatorSetPreference(goCtx context.Context, msg *types.MsgSetValidatorSetPreference) (*types.MsgSetValidatorSetPreferenceResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
preferences, err := server.keeper.SetValidatorSetPreference(ctx, msg.Delegator, msg.Preferences)
if err != nil {
return nil, err
}
server.keeper.SetValidatorSetPreferences(ctx, msg.Delegator, preferences)
return &types.MsgSetValidatorSetPreferenceResponse{}, nil
}
// DelegateToValidatorSet delegates to a delegators existing validator-set.
func (server msgServer) DelegateToValidatorSet(goCtx context.Context, msg *types.MsgDelegateToValidatorSet) (*types.MsgDelegateToValidatorSetResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
err := server.keeper.DelegateToValidatorSet(ctx, msg.Delegator, msg.Coin)
if err != nil {
return nil, err
}
return &types.MsgDelegateToValidatorSetResponse{}, nil
}
// UndelegateFromValidatorSet undelegates {coin} amount from the validator set.
func (server msgServer) UndelegateFromValidatorSet(goCtx context.Context, msg *types.MsgUndelegateFromValidatorSet) (*types.MsgUndelegateFromValidatorSetResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
err := server.keeper.UndelegateFromValidatorSet(ctx, msg.Delegator, msg.Coin)
if err != nil {
return nil, err
}
return &types.MsgUndelegateFromValidatorSetResponse{}, nil
}
// RedelegateValidatorSet allows delegators to set a new validator set and switch validators.
func (server msgServer) RedelegateValidatorSet(goCtx context.Context, msg *types.MsgRedelegateValidatorSet) (*types.MsgRedelegateValidatorSetResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
delegator, err := sdk.AccAddressFromBech32(msg.Delegator)
if err != nil {
return nil, err
}
// get existing delegation if there is no valset set, else get valset
existingSet, err := server.keeper.GetDelegationPreferences(ctx, msg.Delegator)
if err != nil {
return nil, fmt.Errorf("user has no delegation")
}
// Message 1: override the validator set preference set entry
newPreferences, err := server.keeper.SetValidatorSetPreference(ctx, msg.Delegator, msg.Preferences)
if err != nil {
return nil, err
}
server.keeper.SetValidatorSetPreferences(ctx, msg.Delegator, newPreferences)
// Message 2: Perform the actual redelegation
err = server.keeper.PreformRedelegation(ctx, delegator, existingSet.Preferences, newPreferences.Preferences)
if err != nil {
return nil, err
}
return &types.MsgRedelegateValidatorSetResponse{}, nil
}
// WithdrawDelegationRewards withdraws all the delegation rewards from the validator in the val-set.
func (server msgServer) WithdrawDelegationRewards(goCtx context.Context, msg *types.MsgWithdrawDelegationRewards) (*types.MsgWithdrawDelegationRewardsResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
err := server.keeper.WithdrawDelegationRewards(ctx, msg.Delegator)
if err != nil {
return nil, err
}
return &types.MsgWithdrawDelegationRewardsResponse{}, nil
}
// DelegateBondedTokens force unlocks bonded ufury and stakes according to your current validator set preference.
func (server msgServer) DelegateBondedTokens(goCtx context.Context, msg *types.MsgDelegateBondedTokens) (*types.MsgDelegateBondedTokensResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
// get the existingValSet if it exists, if not check existingStakingPosition and return it
_, err := server.keeper.GetDelegationPreferences(ctx, msg.Delegator)
if err != nil {
return nil, fmt.Errorf("user %s doesn't have validator set", msg.Delegator)
}
// Message 1: force unlock bonded perco tokens.
unlockedPercoToken, err := server.keeper.ForceUnlockBondedPerco(ctx, msg.LockID, msg.Delegator)
if err != nil {
return nil, err
}
delegator, err := sdk.AccAddressFromBech32(msg.Delegator)
if err != nil {
return nil, err
}
// Message 2: Perform perco token delegation.
_, err = server.DelegateToValidatorSet(goCtx, types.NewMsgDelegateToValidatorSet(delegator, unlockedPercoToken))
if err != nil {
return nil, err
}
return &types.MsgDelegateBondedTokensResponse{}, nil
}