/
msg_server.go
63 lines (48 loc) · 1.96 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
package keeper
import (
"context"
errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
tenderminttypes "github.com/cosmos/ibc-go/v6/modules/light-clients/07-tendermint/types"
"github.com/dymensionxyz/dymension-rdk/x/hub-genesis/types"
)
type msgServer struct {
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 (m msgServer) TriggerGenesisEvent(goCtx context.Context, msg *types.MsgHubGenesisEvent) (*types.MsgHubGenesisEventResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
// Get the sender and validate they are in the Allowlist
if !m.IsAddressInGenesisTriggererAllowList(ctx, msg.Address) {
return nil, sdkerrors.ErrUnauthorized
}
_, clientState, err := m.channelKeeper.GetChannelClientState(ctx, "transfer", msg.ChannelId)
if err != nil {
return nil, errorsmod.Wrapf(types.ErrFailedGetClientState, "failed to get client state for channel %s: %v", msg.ChannelId, err)
}
tmClientState, ok := clientState.(*tenderminttypes.ClientState)
if !ok {
return nil, errorsmod.Wrapf(types.ErrFailedGetClientState, "expected tendermint client state, got %T", clientState)
}
if tmClientState.GetChainID() != msg.HubId {
return nil, errorsmod.Wrapf(types.ErrChainIDMismatch, "channel %s is connected to chain ID %s",
msg.ChannelId, tmClientState.GetChainID())
}
// check if genesis event was already triggered
state := m.GetState(ctx)
if state.IsLocked {
return nil, types.ErrGenesisEventAlreadyTriggered
}
if err := m.lockRollappGenesisTokens(ctx, msg.ChannelId, state.GenesisTokens); err != nil {
return nil, errorsmod.Wrapf(types.ErrLockingGenesisTokens, "failed to lock tokens: %v", err)
}
state.IsLocked = true
m.SetState(ctx, state)
return &types.MsgHubGenesisEventResponse{}, nil
}