-
Notifications
You must be signed in to change notification settings - Fork 37
/
msg_server.go
104 lines (85 loc) · 3.11 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
package keeper
import (
"context"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/ethereum/go-ethereum/common"
"github.com/peggyjv/sommelier/v4/x/cork/types"
)
var _ types.MsgServer = Keeper{}
func (k Keeper) signerToValAddr(ctx sdk.Context, signer sdk.AccAddress) (sdk.ValAddress, error) {
validatorAddr := k.gravityKeeper.GetOrchestratorValidatorAddress(ctx, signer)
if validatorAddr == nil {
validator := k.stakingKeeper.Validator(ctx, sdk.ValAddress(signer))
if validator == nil {
return nil, sdkerrors.Wrap(stakingtypes.ErrNoValidatorFound, sdk.ValAddress(signer).String())
}
validatorAddr = validator.GetOperator()
// NOTE: we set the validator address so we don't have to call look up for the validator
// everytime a validator feeder submits oracle data
k.gravityKeeper.SetOrchestratorValidatorAddress(ctx, validatorAddr, signer)
}
return validatorAddr, nil
}
// SubmitCork implements types.MsgServer
func (k Keeper) SubmitCork(c context.Context, msg *types.MsgSubmitCorkRequest) (*types.MsgSubmitCorkResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
if !k.HasCellarID(ctx, common.HexToAddress(msg.Cork.TargetContractAddress)) {
return nil, types.ErrUnmanagedCellarAddress
}
signer := msg.MustGetSigner()
validatorAddr, err := k.signerToValAddr(ctx, signer)
if err != nil {
return nil, err
}
k.SetCork(ctx, validatorAddr, *msg.Cork)
ctx.EventManager().EmitEvents(
sdk.Events{
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
),
sdk.NewEvent(
types.EventTypeCork,
sdk.NewAttribute(types.AttributeKeySigner, signer.String()),
sdk.NewAttribute(types.AttributeKeyValidator, validatorAddr.String()),
sdk.NewAttribute(types.AttributeKeyCork, msg.Cork.String()),
),
},
)
return &types.MsgSubmitCorkResponse{}, nil
}
// ScheduleCork implements types.MsgServer
func (k Keeper) ScheduleCork(c context.Context, msg *types.MsgScheduleCorkRequest) (*types.MsgScheduleCorkResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
if !k.HasCellarID(ctx, common.HexToAddress(msg.Cork.TargetContractAddress)) {
return nil, types.ErrUnmanagedCellarAddress
}
if msg.BlockHeight <= uint64(ctx.BlockHeight()) {
return nil, types.ErrSchedulingInThePast
}
signer := msg.MustGetSigner()
validatorAddr, err := k.signerToValAddr(ctx, signer)
if err != nil {
return nil, err
}
k.SetScheduledCork(ctx, msg.BlockHeight, validatorAddr, *msg.Cork)
ctx.EventManager().EmitEvents(
sdk.Events{
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
),
sdk.NewEvent(
types.EventTypeCork,
sdk.NewAttribute(types.AttributeKeySigner, signer.String()),
sdk.NewAttribute(types.AttributeKeyValidator, validatorAddr.String()),
sdk.NewAttribute(types.AttributeKeyCork, msg.Cork.String()),
sdk.NewAttribute(types.AttributeKeyBlockHeight, fmt.Sprintf("%d", msg.BlockHeight)),
),
},
)
return &types.MsgScheduleCorkResponse{}, nil
}