-
Notifications
You must be signed in to change notification settings - Fork 119
/
msg_server.go
53 lines (45 loc) · 2.04 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
package keeper
import (
"context"
"github.com/Sifchain/sifnode/x/ibctransfer/types"
tokenregistrytypes "github.com/Sifchain/sifnode/x/tokenregistry/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
sdktransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types"
)
type msgServer struct {
bankKeeper types.BankKeeper
tokenRegistryKeeper tokenregistrytypes.Keeper
sdkMsgServer types.MsgServer
}
// NewMsgServerImpl returns an implementation of the bank MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(sdkMsgServer types.MsgServer, bankKeeper types.BankKeeper, tokenRegistryKeeper tokenregistrytypes.Keeper) sdktransfertypes.MsgServer {
return &msgServer{
sdkMsgServer: sdkMsgServer,
bankKeeper: bankKeeper,
tokenRegistryKeeper: tokenRegistryKeeper,
}
}
var _ sdktransfertypes.MsgServer = msgServer{}
// Transfer defines a rpc handler method for MsgTransfer.
func (srv msgServer) Transfer(goCtx context.Context, msg *sdktransfertypes.MsgTransfer) (*sdktransfertypes.MsgTransferResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
registry := srv.tokenRegistryKeeper.GetRegistry(ctx)
registryEntry, err := srv.tokenRegistryKeeper.GetEntry(registry, msg.Token.Denom)
if err != nil {
return nil, sdkerrors.Wrap(tokenregistrytypes.ErrPermissionDenied, "denom is not whitelisted")
}
// disallow direct transfers of denom aliases
if registryEntry.UnitDenom != "" && registryEntry.UnitDenom != registryEntry.Denom {
return nil, sdkerrors.Wrap(tokenregistrytypes.ErrPermissionDenied, "transfers of denom aliases are not yet supported")
}
// check export permission
if !srv.tokenRegistryKeeper.CheckEntryPermissions(registryEntry, []tokenregistrytypes.Permission{tokenregistrytypes.Permission_IBCEXPORT}) {
return nil, sdkerrors.Wrap(tokenregistrytypes.ErrPermissionDenied, "denom cannot be exported")
}
if msg.Token.Amount.LTE(sdk.NewInt(0)) {
return nil, types.ErrAmountTooLowToConvert
}
return srv.sdkMsgServer.Transfer(goCtx, msg)
}