github.com/Finschia/finschia-sdk@v0.48.1/x/token/keeper/msg_server.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  
     6  	sdk "github.com/Finschia/finschia-sdk/types"
     7  	"github.com/Finschia/finschia-sdk/x/token"
     8  )
     9  
    10  type msgServer struct {
    11  	keeper Keeper
    12  }
    13  
    14  // NewMsgServer returns an implementation of the token MsgServer interface
    15  // for the provided Keeper.
    16  func NewMsgServer(keeper Keeper) token.MsgServer {
    17  	return &msgServer{
    18  		keeper: keeper,
    19  	}
    20  }
    21  
    22  var _ token.MsgServer = msgServer{}
    23  
    24  // Send defines a method to send tokens from one account to another account
    25  func (s msgServer) Send(c context.Context, req *token.MsgSend) (*token.MsgSendResponse, error) {
    26  	ctx := sdk.UnwrapSDKContext(c)
    27  
    28  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	from := sdk.MustAccAddressFromBech32(req.From)
    33  	to := sdk.MustAccAddressFromBech32(req.To)
    34  
    35  	if err := s.keeper.Send(ctx, req.ContractId, from, to, req.Amount); err != nil {
    36  		return nil, err
    37  	}
    38  
    39  	event := token.EventSent{
    40  		ContractId: req.ContractId,
    41  		Operator:   req.From,
    42  		From:       req.From,
    43  		To:         req.To,
    44  		Amount:     req.Amount,
    45  	}
    46  	if err := ctx.EventManager().EmitTypedEvent(&event); err != nil {
    47  		panic(err)
    48  	}
    49  
    50  	return &token.MsgSendResponse{}, nil
    51  }
    52  
    53  // OperatorSend defines a method to send tokens from one account to another account by the operator
    54  func (s msgServer) OperatorSend(c context.Context, req *token.MsgOperatorSend) (*token.MsgOperatorSendResponse, error) {
    55  	ctx := sdk.UnwrapSDKContext(c)
    56  
    57  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	from := sdk.MustAccAddressFromBech32(req.From)
    62  	operator := sdk.MustAccAddressFromBech32(req.Operator)
    63  	to := sdk.MustAccAddressFromBech32(req.To)
    64  
    65  	if _, err := s.keeper.GetAuthorization(ctx, req.ContractId, from, operator); err != nil {
    66  		return nil, token.ErrTokenNotApproved.Wrap(err.Error())
    67  	}
    68  
    69  	if err := s.keeper.Send(ctx, req.ContractId, from, to, req.Amount); err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	event := token.EventSent{
    74  		ContractId: req.ContractId,
    75  		Operator:   req.Operator,
    76  		From:       req.From,
    77  		To:         req.To,
    78  		Amount:     req.Amount,
    79  	}
    80  	if err := ctx.EventManager().EmitTypedEvent(&event); err != nil {
    81  		panic(err)
    82  	}
    83  
    84  	return &token.MsgOperatorSendResponse{}, nil
    85  }
    86  
    87  // RevokeOperator revokes one to send tokens on behalf of the token holder
    88  func (s msgServer) RevokeOperator(c context.Context, req *token.MsgRevokeOperator) (*token.MsgRevokeOperatorResponse, error) {
    89  	ctx := sdk.UnwrapSDKContext(c)
    90  
    91  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
    92  		return nil, err
    93  	}
    94  
    95  	holder := sdk.MustAccAddressFromBech32(req.Holder)
    96  	operator := sdk.MustAccAddressFromBech32(req.Operator)
    97  
    98  	if err := s.keeper.RevokeOperator(ctx, req.ContractId, holder, operator); err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	if err := ctx.EventManager().EmitTypedEvent(&token.EventRevokedOperator{
   103  		ContractId: req.ContractId,
   104  		Holder:     req.Holder,
   105  		Operator:   req.Operator,
   106  	}); err != nil {
   107  		panic(err)
   108  	}
   109  
   110  	return &token.MsgRevokeOperatorResponse{}, nil
   111  }
   112  
   113  // AuthorizeOperator allows one to send tokens on behalf of the holder
   114  func (s msgServer) AuthorizeOperator(c context.Context, req *token.MsgAuthorizeOperator) (*token.MsgAuthorizeOperatorResponse, error) {
   115  	ctx := sdk.UnwrapSDKContext(c)
   116  
   117  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   118  		return nil, err
   119  	}
   120  
   121  	holder := sdk.MustAccAddressFromBech32(req.Holder)
   122  	operator := sdk.MustAccAddressFromBech32(req.Operator)
   123  
   124  	if err := s.keeper.AuthorizeOperator(ctx, req.ContractId, holder, operator); err != nil {
   125  		return nil, err
   126  	}
   127  
   128  	event := token.EventAuthorizedOperator{
   129  		ContractId: req.ContractId,
   130  		Holder:     req.Holder,
   131  		Operator:   req.Operator,
   132  	}
   133  	if err := ctx.EventManager().EmitTypedEvent(&event); err != nil {
   134  		panic(err)
   135  	}
   136  
   137  	return &token.MsgAuthorizeOperatorResponse{}, nil
   138  }
   139  
   140  // Issue defines a method to issue a token
   141  func (s msgServer) Issue(c context.Context, req *token.MsgIssue) (*token.MsgIssueResponse, error) {
   142  	ctx := sdk.UnwrapSDKContext(c)
   143  	class := token.Contract{
   144  		Name:     req.Name,
   145  		Symbol:   req.Symbol,
   146  		Uri:      req.Uri,
   147  		Meta:     req.Meta,
   148  		Decimals: req.Decimals,
   149  		Mintable: req.Mintable,
   150  	}
   151  
   152  	owner := sdk.MustAccAddressFromBech32(req.Owner)
   153  	to := sdk.MustAccAddressFromBech32(req.To)
   154  	contractID := s.keeper.Issue(ctx, class, owner, to, req.Amount)
   155  
   156  	return &token.MsgIssueResponse{ContractId: contractID}, nil
   157  }
   158  
   159  // GrantPermission allows one to mint or burn tokens or modify a token metadata
   160  func (s msgServer) GrantPermission(c context.Context, req *token.MsgGrantPermission) (*token.MsgGrantPermissionResponse, error) {
   161  	ctx := sdk.UnwrapSDKContext(c)
   162  
   163  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   164  		return nil, err
   165  	}
   166  
   167  	granter := sdk.MustAccAddressFromBech32(req.From)
   168  	grantee := sdk.MustAccAddressFromBech32(req.To)
   169  	permission := token.Permission(token.LegacyPermissionFromString(req.Permission))
   170  	if _, err := s.keeper.GetGrant(ctx, req.ContractId, granter, permission); err != nil {
   171  		return nil, token.ErrTokenNoPermission.Wrap(err.Error())
   172  	}
   173  
   174  	s.keeper.Grant(ctx, req.ContractId, granter, grantee, permission)
   175  
   176  	return &token.MsgGrantPermissionResponse{}, nil
   177  }
   178  
   179  // RevokePermission abandons the permission
   180  func (s msgServer) RevokePermission(c context.Context, req *token.MsgRevokePermission) (*token.MsgRevokePermissionResponse, error) {
   181  	ctx := sdk.UnwrapSDKContext(c)
   182  
   183  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   184  		return nil, err
   185  	}
   186  
   187  	grantee := sdk.MustAccAddressFromBech32(req.From)
   188  	permission := token.Permission(token.LegacyPermissionFromString(req.Permission))
   189  	if _, err := s.keeper.GetGrant(ctx, req.ContractId, grantee, permission); err != nil {
   190  		return nil, token.ErrTokenNoPermission.Wrap(err.Error())
   191  	}
   192  
   193  	s.keeper.Abandon(ctx, req.ContractId, grantee, permission)
   194  
   195  	return &token.MsgRevokePermissionResponse{}, nil
   196  }
   197  
   198  // Mint defines a method to mint tokens
   199  func (s msgServer) Mint(c context.Context, req *token.MsgMint) (*token.MsgMintResponse, error) {
   200  	ctx := sdk.UnwrapSDKContext(c)
   201  
   202  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   203  		return nil, err
   204  	}
   205  
   206  	from := sdk.MustAccAddressFromBech32(req.From)
   207  	to := sdk.MustAccAddressFromBech32(req.To)
   208  
   209  	if err := s.keeper.Mint(ctx, req.ContractId, from, to, req.Amount); err != nil {
   210  		return nil, err
   211  	}
   212  
   213  	return &token.MsgMintResponse{}, nil
   214  }
   215  
   216  // Burn defines a method to burn tokens
   217  func (s msgServer) Burn(c context.Context, req *token.MsgBurn) (*token.MsgBurnResponse, error) {
   218  	ctx := sdk.UnwrapSDKContext(c)
   219  
   220  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   221  		return nil, err
   222  	}
   223  
   224  	from := sdk.MustAccAddressFromBech32(req.From)
   225  
   226  	if err := s.keeper.Burn(ctx, req.ContractId, from, req.Amount); err != nil {
   227  		return nil, err
   228  	}
   229  
   230  	return &token.MsgBurnResponse{}, nil
   231  }
   232  
   233  // OperatorBurn defines a method for the operator to burn tokens on the behalf of the holder.
   234  func (s msgServer) OperatorBurn(c context.Context, req *token.MsgOperatorBurn) (*token.MsgOperatorBurnResponse, error) {
   235  	ctx := sdk.UnwrapSDKContext(c)
   236  
   237  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   238  		return nil, err
   239  	}
   240  
   241  	operator := sdk.MustAccAddressFromBech32(req.Operator)
   242  	from := sdk.MustAccAddressFromBech32(req.From)
   243  
   244  	if err := s.keeper.OperatorBurn(ctx, req.ContractId, operator, from, req.Amount); err != nil {
   245  		return nil, err
   246  	}
   247  
   248  	return &token.MsgOperatorBurnResponse{}, nil
   249  }
   250  
   251  // Modify defines a method to modify a token metadata
   252  func (s msgServer) Modify(c context.Context, req *token.MsgModify) (*token.MsgModifyResponse, error) {
   253  	ctx := sdk.UnwrapSDKContext(c)
   254  
   255  	token.UpdateMsgModify(req)
   256  
   257  	if err := ValidateLegacyContract(s.keeper, ctx, req.ContractId); err != nil {
   258  		return nil, err
   259  	}
   260  
   261  	grantee := sdk.MustAccAddressFromBech32(req.Owner)
   262  
   263  	if _, err := s.keeper.GetGrant(ctx, req.ContractId, grantee, token.PermissionModify); err != nil {
   264  		return nil, token.ErrTokenNoPermission.Wrap(err.Error())
   265  	}
   266  
   267  	if err := s.keeper.Modify(ctx, req.ContractId, grantee, req.Changes); err != nil {
   268  		return nil, err
   269  	}
   270  
   271  	return &token.MsgModifyResponse{}, nil
   272  }