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 }