github.com/Finschia/finschia-sdk@v0.48.1/x/bank/keeper/msg_server.go (about) 1 package keeper 2 3 import ( 4 "context" 5 6 "github.com/armon/go-metrics" 7 8 "github.com/Finschia/finschia-sdk/telemetry" 9 sdk "github.com/Finschia/finschia-sdk/types" 10 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 11 "github.com/Finschia/finschia-sdk/x/bank/types" 12 ) 13 14 type msgServer struct { 15 Keeper 16 } 17 18 // NewMsgServerImpl returns an implementation of the bank MsgServer interface 19 // for the provided Keeper. 20 func NewMsgServerImpl(keeper Keeper) types.MsgServer { 21 return &msgServer{Keeper: keeper} 22 } 23 24 var _ types.MsgServer = msgServer{} 25 26 func (k msgServer) Send(goCtx context.Context, msg *types.MsgSend) (*types.MsgSendResponse, error) { 27 ctx := sdk.UnwrapSDKContext(goCtx) 28 29 if err := k.IsSendEnabledCoins(ctx, msg.Amount...); err != nil { 30 return nil, err 31 } 32 33 from, err := sdk.AccAddressFromBech32(msg.FromAddress) 34 if err != nil { 35 return nil, err 36 } 37 to, err := sdk.AccAddressFromBech32(msg.ToAddress) 38 if err != nil { 39 return nil, err 40 } 41 42 if k.BlockedAddr(to) { 43 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", msg.ToAddress) 44 } 45 46 err = k.SendCoins(ctx, from, to, msg.Amount) 47 if err != nil { 48 return nil, err 49 } 50 51 defer func() { 52 for _, a := range msg.Amount { 53 if a.Amount.IsInt64() { 54 telemetry.SetGaugeWithLabels( 55 []string{"tx", "msg", "send"}, 56 float32(a.Amount.Int64()), 57 []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, 58 ) 59 } 60 } 61 }() 62 63 return &types.MsgSendResponse{}, nil 64 } 65 66 func (k msgServer) MultiSend(goCtx context.Context, msg *types.MsgMultiSend) (*types.MsgMultiSendResponse, error) { 67 ctx := sdk.UnwrapSDKContext(goCtx) 68 69 // NOTE: totalIn == totalOut should already have been checked 70 for _, in := range msg.Inputs { 71 if err := k.IsSendEnabledCoins(ctx, in.Coins...); err != nil { 72 return nil, err 73 } 74 } 75 76 for _, out := range msg.Outputs { 77 accAddr := sdk.MustAccAddressFromBech32(out.Address) 78 79 if k.BlockedAddr(accAddr) { 80 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive transactions", out.Address) 81 } 82 } 83 84 err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs) 85 if err != nil { 86 return nil, err 87 } 88 89 return &types.MsgMultiSendResponse{}, nil 90 }