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  }