(goCtx context.Context, msg *types.MsgCreateToken)
| 11 | ) |
| 12 | |
| 13 | func (ms msgServer) CreateToken(goCtx context.Context, msg *types.MsgCreateToken) (*types.MsgCreateTokenResponse, error) { |
| 14 | |
| 15 | if err := msg.ValidateBasic(); err != nil { |
| 16 | return nil, err |
| 17 | } |
| 18 | |
| 19 | ctx := sdk.UnwrapSDKContext(goCtx) |
| 20 | |
| 21 | // ex) GAMETOKEN -> ugametoken |
| 22 | tokenID := "u" + strings.ToLower(msg.Symbol) |
| 23 | |
| 24 | err := ms.keeper.CheckCommonError(tokenID, msg.Symbol, msg.Name, msg.TotalSupply) |
| 25 | |
| 26 | if err != nil { |
| 27 | return nil, err |
| 28 | } |
| 29 | |
| 30 | _, isFound := ms.keeper.GetTokenData(ctx, tokenID) |
| 31 | |
| 32 | if isFound { |
| 33 | return nil, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "index already set") |
| 34 | } |
| 35 | |
| 36 | // send minted coins to receiver |
| 37 | receiver, err := sdk.AccAddressFromBech32(msg.Owner) |
| 38 | if err != nil { |
| 39 | return nil, err |
| 40 | } |
| 41 | |
| 42 | const mintSequence = 1 |
| 43 | const burnSequence = 0 |
| 44 | |
| 45 | var tokenData = types.TokenData{ |
| 46 | Owner: msg.Owner, |
| 47 | TokenID: tokenID, |
| 48 | Name: msg.Name, |
| 49 | Symbol: msg.Symbol, |
| 50 | TokenURI: msg.TokenURI, |
| 51 | TotalSupply: msg.TotalSupply, |
| 52 | Decimal: msg.Decimal, |
| 53 | Mintable: msg.Mintable, |
| 54 | Burnable: msg.Burnable, |
| 55 | MintSequence: mintSequence, |
| 56 | BurnSequence: burnSequence, |
| 57 | } |
| 58 | |
| 59 | ms.keeper.SetTokenData(ctx, tokenData) |
| 60 | |
| 61 | // bank module |
| 62 | // mint |
| 63 | newCoin := sdk.NewInt64Coin(tokenID, int64(msg.TotalSupply)) |
| 64 | err = ms.keeper.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(newCoin)) |
| 65 | |
| 66 | if err != nil { |
| 67 | return nil, err |
| 68 | } |
| 69 | |
| 70 | // transfer to account |
nothing calls this directly
no test coverage detected