-
Notifications
You must be signed in to change notification settings - Fork 203
/
msg_server_delegate.go
76 lines (63 loc) · 1.99 KB
/
msg_server_delegate.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
package keeper
import (
"context"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/lavanet/lava/utils"
"github.com/lavanet/lava/x/dualstaking/types"
)
func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*types.MsgDelegateResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
return &types.MsgDelegateResponse{}, k.Keeper.DelegateFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.ChainID, msg.Amount)
}
// DelegateFull uses staking module for to delegate with hooks
func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, chainID string, amount sdk.Coin) error {
_, found := k.specKeeper.GetSpec(ctx, chainID)
if !found && chainID != types.EMPTY_PROVIDER_CHAINID {
return utils.LavaFormatWarning("invalid chain ID", fmt.Errorf("chain ID not found"),
utils.LogAttr("chain_id", chainID))
}
valAddr, valErr := sdk.ValAddressFromBech32(validator)
if valErr != nil {
return valErr
}
validatorType, found := k.stakingKeeper.GetValidator(ctx, valAddr)
if !found {
return stakingtypes.ErrNoValidatorFound
}
delegatorAddress, err := sdk.AccAddressFromBech32(delegator)
if err != nil {
return err
}
if _, err = sdk.AccAddressFromBech32(provider); err != nil {
return err
}
if err := utils.ValidateCoins(ctx, k.stakingKeeper.BondDenom(ctx), amount, false); err != nil {
return err
}
_, err = k.stakingKeeper.Delegate(ctx, delegatorAddress, amount.Amount, stakingtypes.Unbonded, validatorType, true)
if err != nil {
return err
}
err = k.Redelegate(
ctx,
delegator,
types.EMPTY_PROVIDER,
provider,
types.EMPTY_PROVIDER_CHAINID,
chainID,
amount,
)
if err == nil {
logger := k.Logger(ctx)
details := map[string]string{
"delegator": delegator,
"provider": provider,
"chainID": chainID,
"amount": amount.String(),
}
utils.LogLavaEvent(ctx, logger, types.DelegateEventName, details, "Delegate")
}
return err
}