From eff76fad5e41513e8312a0e443bbed965e36b14c Mon Sep 17 00:00:00 2001 From: faneaatiku Date: Fri, 9 Feb 2024 18:23:03 +0200 Subject: [PATCH] added burning token message --- docs/static/openapi.yml | 2 + proto/tokenfactory/tx.proto | 12 +- .../bze/bze.tokenfactory.v1/index.ts | 44 +- .../bze/bze.tokenfactory.v1/module/index.ts | 9 +- .../bze/bze.tokenfactory.v1/module/rest.ts | 2 + .../module/types/tokenfactory/tx.ts | 168 +++++-- x/tokenfactory/client/cli/tx.go | 1 + x/tokenfactory/client/cli/tx_burn.go | 42 ++ x/tokenfactory/client/cli/tx_mint.go | 12 +- x/tokenfactory/handler.go | 3 + x/tokenfactory/keeper/msg_server_burn.go | 65 +++ x/tokenfactory/keeper/msg_server_mint.go | 27 +- x/tokenfactory/module_simulation.go | 15 + x/tokenfactory/simulation/burn.go | 29 ++ x/tokenfactory/types/codec.go | 4 + x/tokenfactory/types/message_burn.go | 46 ++ x/tokenfactory/types/message_burn_test.go | 40 ++ x/tokenfactory/types/message_mint.go | 5 +- x/tokenfactory/types/tx.pb.go | 416 ++++++++++++++++-- 19 files changed, 829 insertions(+), 113 deletions(-) create mode 100644 x/tokenfactory/client/cli/tx_burn.go create mode 100644 x/tokenfactory/keeper/msg_server_burn.go create mode 100644 x/tokenfactory/simulation/burn.go create mode 100644 x/tokenfactory/types/message_burn.go create mode 100644 x/tokenfactory/types/message_burn_test.go diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index c7002309..617e7a46 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -32342,6 +32342,8 @@ definitions: admin: type: string title: 'Can be empty for no admin, or a valid osmosis address' + bze.tokenfactory.v1.MsgBurnResponse: + type: object bze.tokenfactory.v1.MsgCreateDenomResponse: type: object properties: diff --git a/proto/tokenfactory/tx.proto b/proto/tokenfactory/tx.proto index 1acacb2e..ae75ee76 100644 --- a/proto/tokenfactory/tx.proto +++ b/proto/tokenfactory/tx.proto @@ -9,6 +9,7 @@ option go_package = "github.com/bze-alphateam/bze/x/tokenfactory/types"; service Msg { rpc CreateDenom(MsgCreateDenom) returns (MsgCreateDenomResponse); rpc Mint(MsgMint) returns (MsgMintResponse); + rpc Burn(MsgBurn) returns (MsgBurnResponse); // this line is used by starport scaffolding # proto/tx/rpc } @@ -23,11 +24,18 @@ message MsgCreateDenomResponse { message MsgMint { string creator = 1; - string denom = 2; - string amount = 3; + string coins = 2; } message MsgMintResponse { } +message MsgBurn { + string creator = 1; + string coins = 2; +} + +message MsgBurnResponse { +} + // this line is used by starport scaffolding # proto/tx/message diff --git a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/index.ts b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/index.ts index df036355..f727366d 100755 --- a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/index.ts +++ b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/index.ts @@ -168,18 +168,18 @@ export default { }, - async sendMsgMint({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgBurn({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgMint(value) + const msg = await txClient.msgBurn(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgMint:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgBurn:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgMint:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgBurn:Send Could not broadcast Tx: '+ e.message) } } }, @@ -198,17 +198,32 @@ export default { } } }, - - async MsgMint({ rootGetters }, { value }) { + async sendMsgMint({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) const msg = await txClient.msgMint(value) - return msg + const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, + gas: "200000" }, memo}) + return result } catch (e) { if (e == MissingWalletError) { throw new Error('TxClient:MsgMint:Init Could not initialize signing client. Wallet is required.') + }else{ + throw new Error('TxClient:MsgMint:Send Could not broadcast Tx: '+ e.message) + } + } + }, + + async MsgBurn({ rootGetters }, { value }) { + try { + const txClient=await initTxClient(rootGetters) + const msg = await txClient.msgBurn(value) + return msg + } catch (e) { + if (e == MissingWalletError) { + throw new Error('TxClient:MsgBurn:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgMint:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgBurn:Create Could not create message: ' + e.message) } } }, @@ -225,6 +240,19 @@ export default { } } }, + async MsgMint({ rootGetters }, { value }) { + try { + const txClient=await initTxClient(rootGetters) + const msg = await txClient.msgMint(value) + return msg + } catch (e) { + if (e == MissingWalletError) { + throw new Error('TxClient:MsgMint:Init Could not initialize signing client. Wallet is required.') + } else{ + throw new Error('TxClient:MsgMint:Create Could not create message: ' + e.message) + } + } + }, } } diff --git a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/index.ts b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/index.ts index d9d6ff12..1ec89d83 100755 --- a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/index.ts +++ b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/index.ts @@ -4,13 +4,15 @@ import { StdFee } from "@cosmjs/launchpad"; import { SigningStargateClient } from "@cosmjs/stargate"; import { Registry, OfflineSigner, EncodeObject, DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { Api } from "./rest"; -import { MsgMint } from "./types/tokenfactory/tx"; +import { MsgBurn } from "./types/tokenfactory/tx"; import { MsgCreateDenom } from "./types/tokenfactory/tx"; +import { MsgMint } from "./types/tokenfactory/tx"; const types = [ - ["/bze.tokenfactory.v1.MsgMint", MsgMint], + ["/bze.tokenfactory.v1.MsgBurn", MsgBurn], ["/bze.tokenfactory.v1.MsgCreateDenom", MsgCreateDenom], + ["/bze.tokenfactory.v1.MsgMint", MsgMint], ]; export const MissingWalletError = new Error("wallet is required"); @@ -43,8 +45,9 @@ const txClient = async (wallet: OfflineSigner, { addr: addr }: TxClientOptions = return { signAndBroadcast: (msgs: EncodeObject[], { fee, memo }: SignAndBroadcastOptions = {fee: defaultFee, memo: ""}) => client.signAndBroadcast(address, msgs, fee,memo), - msgMint: (data: MsgMint): EncodeObject => ({ typeUrl: "/bze.tokenfactory.v1.MsgMint", value: MsgMint.fromPartial( data ) }), + msgBurn: (data: MsgBurn): EncodeObject => ({ typeUrl: "/bze.tokenfactory.v1.MsgBurn", value: MsgBurn.fromPartial( data ) }), msgCreateDenom: (data: MsgCreateDenom): EncodeObject => ({ typeUrl: "/bze.tokenfactory.v1.MsgCreateDenom", value: MsgCreateDenom.fromPartial( data ) }), + msgMint: (data: MsgMint): EncodeObject => ({ typeUrl: "/bze.tokenfactory.v1.MsgMint", value: MsgMint.fromPartial( data ) }), }; }; diff --git a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/rest.ts b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/rest.ts index c6c0ed53..88843eb9 100644 --- a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/rest.ts +++ b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/rest.ts @@ -31,6 +31,8 @@ export interface Tokenfactoryv1Params { createDenomFee?: string; } +export type V1MsgBurnResponse = object; + export interface V1MsgCreateDenomResponse { new_denom?: string; } diff --git a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/types/tokenfactory/tx.ts b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/types/tokenfactory/tx.ts index 0b5efa2f..7994def0 100644 --- a/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/types/tokenfactory/tx.ts +++ b/vue/src/store/generated/bze-alphateam/bze/bze.tokenfactory.v1/module/types/tokenfactory/tx.ts @@ -14,12 +14,18 @@ export interface MsgCreateDenomResponse { export interface MsgMint { creator: string; - denom: string; - amount: string; + coins: string; } export interface MsgMintResponse {} +export interface MsgBurn { + creator: string; + coins: string; +} + +export interface MsgBurnResponse {} + const baseMsgCreateDenom: object = { creator: "", subdenom: "" }; export const MsgCreateDenom = { @@ -152,18 +158,15 @@ export const MsgCreateDenomResponse = { }, }; -const baseMsgMint: object = { creator: "", denom: "", amount: "" }; +const baseMsgMint: object = { creator: "", coins: "" }; export const MsgMint = { encode(message: MsgMint, writer: Writer = Writer.create()): Writer { if (message.creator !== "") { writer.uint32(10).string(message.creator); } - if (message.denom !== "") { - writer.uint32(18).string(message.denom); - } - if (message.amount !== "") { - writer.uint32(26).string(message.amount); + if (message.coins !== "") { + writer.uint32(18).string(message.coins); } return writer; }, @@ -179,10 +182,7 @@ export const MsgMint = { message.creator = reader.string(); break; case 2: - message.denom = reader.string(); - break; - case 3: - message.amount = reader.string(); + message.coins = reader.string(); break; default: reader.skipType(tag & 7); @@ -199,15 +199,10 @@ export const MsgMint = { } else { message.creator = ""; } - if (object.denom !== undefined && object.denom !== null) { - message.denom = String(object.denom); + if (object.coins !== undefined && object.coins !== null) { + message.coins = String(object.coins); } else { - message.denom = ""; - } - if (object.amount !== undefined && object.amount !== null) { - message.amount = String(object.amount); - } else { - message.amount = ""; + message.coins = ""; } return message; }, @@ -215,8 +210,7 @@ export const MsgMint = { toJSON(message: MsgMint): unknown { const obj: any = {}; message.creator !== undefined && (obj.creator = message.creator); - message.denom !== undefined && (obj.denom = message.denom); - message.amount !== undefined && (obj.amount = message.amount); + message.coins !== undefined && (obj.coins = message.coins); return obj; }, @@ -227,15 +221,10 @@ export const MsgMint = { } else { message.creator = ""; } - if (object.denom !== undefined && object.denom !== null) { - message.denom = object.denom; - } else { - message.denom = ""; - } - if (object.amount !== undefined && object.amount !== null) { - message.amount = object.amount; + if (object.coins !== undefined && object.coins !== null) { + message.coins = object.coins; } else { - message.amount = ""; + message.coins = ""; } return message; }, @@ -279,11 +268,122 @@ export const MsgMintResponse = { }, }; +const baseMsgBurn: object = { creator: "", coins: "" }; + +export const MsgBurn = { + encode(message: MsgBurn, writer: Writer = Writer.create()): Writer { + if (message.creator !== "") { + writer.uint32(10).string(message.creator); + } + if (message.coins !== "") { + writer.uint32(18).string(message.coins); + } + return writer; + }, + + decode(input: Reader | Uint8Array, length?: number): MsgBurn { + const reader = input instanceof Uint8Array ? new Reader(input) : input; + let end = length === undefined ? reader.len : reader.pos + length; + const message = { ...baseMsgBurn } as MsgBurn; + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.creator = reader.string(); + break; + case 2: + message.coins = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): MsgBurn { + const message = { ...baseMsgBurn } as MsgBurn; + if (object.creator !== undefined && object.creator !== null) { + message.creator = String(object.creator); + } else { + message.creator = ""; + } + if (object.coins !== undefined && object.coins !== null) { + message.coins = String(object.coins); + } else { + message.coins = ""; + } + return message; + }, + + toJSON(message: MsgBurn): unknown { + const obj: any = {}; + message.creator !== undefined && (obj.creator = message.creator); + message.coins !== undefined && (obj.coins = message.coins); + return obj; + }, + + fromPartial(object: DeepPartial): MsgBurn { + const message = { ...baseMsgBurn } as MsgBurn; + if (object.creator !== undefined && object.creator !== null) { + message.creator = object.creator; + } else { + message.creator = ""; + } + if (object.coins !== undefined && object.coins !== null) { + message.coins = object.coins; + } else { + message.coins = ""; + } + return message; + }, +}; + +const baseMsgBurnResponse: object = {}; + +export const MsgBurnResponse = { + encode(_: MsgBurnResponse, writer: Writer = Writer.create()): Writer { + return writer; + }, + + decode(input: Reader | Uint8Array, length?: number): MsgBurnResponse { + const reader = input instanceof Uint8Array ? new Reader(input) : input; + let end = length === undefined ? reader.len : reader.pos + length; + const message = { ...baseMsgBurnResponse } as MsgBurnResponse; + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(_: any): MsgBurnResponse { + const message = { ...baseMsgBurnResponse } as MsgBurnResponse; + return message; + }, + + toJSON(_: MsgBurnResponse): unknown { + const obj: any = {}; + return obj; + }, + + fromPartial(_: DeepPartial): MsgBurnResponse { + const message = { ...baseMsgBurnResponse } as MsgBurnResponse; + return message; + }, +}; + /** Msg defines the Msg service. */ export interface Msg { CreateDenom(request: MsgCreateDenom): Promise; - /** this line is used by starport scaffolding # proto/tx/rpc */ Mint(request: MsgMint): Promise; + /** this line is used by starport scaffolding # proto/tx/rpc */ + Burn(request: MsgBurn): Promise; } export class MsgClientImpl implements Msg { @@ -308,6 +408,12 @@ export class MsgClientImpl implements Msg { const promise = this.rpc.request("bze.tokenfactory.v1.Msg", "Mint", data); return promise.then((data) => MsgMintResponse.decode(new Reader(data))); } + + Burn(request: MsgBurn): Promise { + const data = MsgBurn.encode(request).finish(); + const promise = this.rpc.request("bze.tokenfactory.v1.Msg", "Burn", data); + return promise.then((data) => MsgBurnResponse.decode(new Reader(data))); + } } interface Rpc { diff --git a/x/tokenfactory/client/cli/tx.go b/x/tokenfactory/client/cli/tx.go index 18c54d27..76c629cd 100644 --- a/x/tokenfactory/client/cli/tx.go +++ b/x/tokenfactory/client/cli/tx.go @@ -32,6 +32,7 @@ func GetTxCmd() *cobra.Command { cmd.AddCommand(CmdCreateDenom()) cmd.AddCommand(CmdMint()) + cmd.AddCommand(CmdBurn()) // this line is used by starport scaffolding # 1 return cmd diff --git a/x/tokenfactory/client/cli/tx_burn.go b/x/tokenfactory/client/cli/tx_burn.go new file mode 100644 index 00000000..dbb1c1b9 --- /dev/null +++ b/x/tokenfactory/client/cli/tx_burn.go @@ -0,0 +1,42 @@ +package cli + +import ( + "strconv" + + "github.com/bze-alphateam/bze/x/tokenfactory/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" +) + +var _ = strconv.Itoa(0) + +func CmdBurn() *cobra.Command { + cmd := &cobra.Command{ + Use: "burn [coins]", + Short: "Broadcast message Burn. usage: bze burn 100denom", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argCoins := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgBurn( + clientCtx.GetFromAddress().String(), + argCoins, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/tokenfactory/client/cli/tx_mint.go b/x/tokenfactory/client/cli/tx_mint.go index 178fd760..19167236 100644 --- a/x/tokenfactory/client/cli/tx_mint.go +++ b/x/tokenfactory/client/cli/tx_mint.go @@ -14,12 +14,11 @@ var _ = strconv.Itoa(0) func CmdMint() *cobra.Command { cmd := &cobra.Command{ - Use: "mint [denom] [amount]", - Short: "Broadcast message Mint", - Args: cobra.ExactArgs(2), + Use: "mint [coins]", + Short: "Broadcast message Mint. Usage bze mint 101denom", + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) (err error) { - argDenom := args[0] - argAmount := args[1] + argCoins := args[0] clientCtx, err := client.GetClientTxContext(cmd) if err != nil { @@ -28,8 +27,7 @@ func CmdMint() *cobra.Command { msg := types.NewMsgMint( clientCtx.GetFromAddress().String(), - argDenom, - argAmount, + argCoins, ) if err := msg.ValidateBasic(); err != nil { return err diff --git a/x/tokenfactory/handler.go b/x/tokenfactory/handler.go index e0d29039..0dc81af5 100644 --- a/x/tokenfactory/handler.go +++ b/x/tokenfactory/handler.go @@ -23,6 +23,9 @@ func NewHandler(k keeper.Keeper) sdk.Handler { case *types.MsgMint: res, err := msgServer.Mint(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgBurn: + res, err := msgServer.Burn(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) // this line is used by starport scaffolding # 1 default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) diff --git a/x/tokenfactory/keeper/msg_server_burn.go b/x/tokenfactory/keeper/msg_server_burn.go new file mode 100644 index 00000000..e22dda84 --- /dev/null +++ b/x/tokenfactory/keeper/msg_server_burn.go @@ -0,0 +1,65 @@ +package keeper + +import ( + "context" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + "github.com/bze-alphateam/bze/x/tokenfactory/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (k msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types.MsgBurnResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + coin, err := sdk.ParseCoinNormalized(msg.Coins) + if err != nil || !coin.IsPositive() { + return nil, types.ErrInvalidAmount.Wrapf("coins: %s", msg.Coins) + } + + dAuth, err := k.Keeper.GetDenomAuthority(ctx, coin.GetDenom()) + if err != nil { + return nil, err + } + + if msg.Creator != dAuth.GetAdmin() { + return nil, types.ErrUnauthorized + } + + accAddr, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return nil, err + } + + //make sure it's not a module account + burnFrom := k.Keeper.accountKeeper.GetAccount(ctx, accAddr) + _, ok := burnFrom.(authtypes.ModuleAccountI) + if ok { + return nil, types.ErrBurnFromModuleAccount + } + + _, _, err = types.DeconstructDenom(coin.GetDenom()) + if err != nil { + return nil, err + } + + //send to module + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, accAddr, types.ModuleName, sdk.NewCoins(coin)) + if err != nil { + return nil, err + } + + //burn the coins from module + err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, sdk.NewCoins(coin)) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.TypeMsgBurn, + sdk.NewAttribute(types.AttributeBurnFromAddress, msg.Creator), + sdk.NewAttribute(types.AttributeAmount, coin.String()), + ), + }) + + return &types.MsgBurnResponse{}, nil +} diff --git a/x/tokenfactory/keeper/msg_server_mint.go b/x/tokenfactory/keeper/msg_server_mint.go index 4b8baa80..78b8dcdb 100644 --- a/x/tokenfactory/keeper/msg_server_mint.go +++ b/x/tokenfactory/keeper/msg_server_mint.go @@ -9,29 +9,29 @@ import ( func (k msgServer) Mint(goCtx context.Context, msg *types.MsgMint) (*types.MsgMintResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - _, denomExists := k.bankKeeper.GetDenomMetaData(ctx, msg.Denom) + coin, err := sdk.ParseCoinNormalized(msg.Coins) + if err != nil || !coin.IsPositive() { + return nil, types.ErrInvalidAmount.Wrapf("coins: %s", msg.Coins) + } + + _, denomExists := k.bankKeeper.GetDenomMetaData(ctx, coin.GetDenom()) if !denomExists { - return nil, types.ErrDenomDoesNotExist.Wrapf("denom: %s", msg.Denom) + return nil, types.ErrDenomDoesNotExist.Wrapf("denom: %s", coin.GetDenom()) } - dAuth, err := k.Keeper.GetDenomAuthority(ctx, msg.Denom) + //check denom is a tokenfactory denom + _, _, err = types.DeconstructDenom(coin.GetDenom()) if err != nil { return nil, err } - if msg.Creator != dAuth.GetAdmin() { - return nil, types.ErrUnauthorized - } - - //check denom is a tokenfactory denom - _, _, err = types.DeconstructDenom(msg.Denom) + dAuth, err := k.Keeper.GetDenomAuthority(ctx, coin.GetDenom()) if err != nil { return nil, err } - amountInt, ok := sdk.NewIntFromString(msg.Amount) - if !ok || !amountInt.IsPositive() { - return nil, types.ErrInvalidAmount.Wrapf("converting amount [%s] to int [%d] failed", msg.Amount, amountInt.Int64()) + if msg.Creator != dAuth.GetAdmin() { + return nil, types.ErrUnauthorized } addr, err := sdk.AccAddressFromBech32(msg.Creator) @@ -39,7 +39,6 @@ func (k msgServer) Mint(goCtx context.Context, msg *types.MsgMint) (*types.MsgMi return nil, err } - coin := sdk.NewCoin(msg.Denom, amountInt) err = k.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(coin)) if err != nil { return nil, err @@ -54,7 +53,7 @@ func (k msgServer) Mint(goCtx context.Context, msg *types.MsgMint) (*types.MsgMi sdk.NewEvent( types.TypeMsgMint, sdk.NewAttribute(types.AttributeMintToAddress, msg.Creator), - sdk.NewAttribute(types.AttributeAmount, msg.Amount), + sdk.NewAttribute(types.AttributeAmount, coin.String()), ), }) diff --git a/x/tokenfactory/module_simulation.go b/x/tokenfactory/module_simulation.go index 32e0d94a..f86ac005 100644 --- a/x/tokenfactory/module_simulation.go +++ b/x/tokenfactory/module_simulation.go @@ -32,6 +32,10 @@ const ( // TODO: Determine the simulation weight value defaultWeightMsgMint int = 100 + opWeightMsgBurn = "op_weight_msg_burn" + // TODO: Determine the simulation weight value + defaultWeightMsgBurn int = 100 + // this line is used by starport scaffolding # simapp/module/const ) @@ -92,6 +96,17 @@ func (am AppModule) WeightedOperations(simState module.SimulationState) []simtyp tokenfactorysimulation.SimulateMsgMint(am.accountKeeper, am.bankKeeper, am.keeper), )) + var weightMsgBurn int + simState.AppParams.GetOrGenerate(simState.Cdc, opWeightMsgBurn, &weightMsgBurn, nil, + func(_ *rand.Rand) { + weightMsgBurn = defaultWeightMsgBurn + }, + ) + operations = append(operations, simulation.NewWeightedOperation( + weightMsgBurn, + tokenfactorysimulation.SimulateMsgBurn(am.accountKeeper, am.bankKeeper, am.keeper), + )) + // this line is used by starport scaffolding # simapp/module/operation return operations diff --git a/x/tokenfactory/simulation/burn.go b/x/tokenfactory/simulation/burn.go new file mode 100644 index 00000000..6be18f1d --- /dev/null +++ b/x/tokenfactory/simulation/burn.go @@ -0,0 +1,29 @@ +package simulation + +import ( + "math/rand" + + "github.com/bze-alphateam/bze/x/tokenfactory/keeper" + "github.com/bze-alphateam/bze/x/tokenfactory/types" + "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" +) + +func SimulateMsgBurn( + ak types.AccountKeeper, + bk types.BankKeeper, + k keeper.Keeper, +) simtypes.Operation { + return func(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + msg := &types.MsgBurn{ + Creator: simAccount.Address.String(), + } + + // TODO: Handling the Burn simulation + + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "Burn simulation not implemented"), nil, nil + } +} diff --git a/x/tokenfactory/types/codec.go b/x/tokenfactory/types/codec.go index 8c06e439..a1302b92 100644 --- a/x/tokenfactory/types/codec.go +++ b/x/tokenfactory/types/codec.go @@ -10,6 +10,7 @@ import ( func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgCreateDenom{}, "tokenfactory/CreateDenom", nil) cdc.RegisterConcrete(&MsgMint{}, "tokenfactory/Mint", nil) + cdc.RegisterConcrete(&MsgBurn{}, "tokenfactory/Burn", nil) // this line is used by starport scaffolding # 2 } @@ -20,6 +21,9 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations((*sdk.Msg)(nil), &MsgMint{}, ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgBurn{}, + ) // this line is used by starport scaffolding # 3 msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/tokenfactory/types/message_burn.go b/x/tokenfactory/types/message_burn.go new file mode 100644 index 00000000..bd226de1 --- /dev/null +++ b/x/tokenfactory/types/message_burn.go @@ -0,0 +1,46 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +const TypeMsgBurn = "burn" + +var _ sdk.Msg = &MsgBurn{} + +func NewMsgBurn(creator string, coins string) *MsgBurn { + return &MsgBurn{ + Creator: creator, + Coins: coins, + } +} + +func (msg *MsgBurn) Route() string { + return RouterKey +} + +func (msg *MsgBurn) Type() string { + return TypeMsgBurn +} + +func (msg *MsgBurn) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgBurn) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgBurn) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} diff --git a/x/tokenfactory/types/message_burn_test.go b/x/tokenfactory/types/message_burn_test.go new file mode 100644 index 00000000..0620c0d4 --- /dev/null +++ b/x/tokenfactory/types/message_burn_test.go @@ -0,0 +1,40 @@ +package types + +import ( + "testing" + + "github.com/bze-alphateam/bze/testutil/sample" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/require" +) + +func TestMsgBurn_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgBurn + err error + }{ + { + name: "invalid address", + msg: MsgBurn{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgBurn{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/tokenfactory/types/message_mint.go b/x/tokenfactory/types/message_mint.go index 989972d4..056a4ae5 100644 --- a/x/tokenfactory/types/message_mint.go +++ b/x/tokenfactory/types/message_mint.go @@ -9,11 +9,10 @@ const TypeMsgMint = "mint" var _ sdk.Msg = &MsgMint{} -func NewMsgMint(creator string, denom string, amount string) *MsgMint { +func NewMsgMint(creator string, coins string) *MsgMint { return &MsgMint{ Creator: creator, - Denom: denom, - Amount: amount, + Coins: coins, } } diff --git a/x/tokenfactory/types/tx.pb.go b/x/tokenfactory/types/tx.pb.go index 483db6ba..12825dae 100644 --- a/x/tokenfactory/types/tx.pb.go +++ b/x/tokenfactory/types/tx.pb.go @@ -125,8 +125,7 @@ func (m *MsgCreateDenomResponse) GetNewDenom() string { type MsgMint struct { Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Denom string `protobuf:"bytes,2,opt,name=denom,proto3" json:"denom,omitempty"` - Amount string `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount,omitempty"` + Coins string `protobuf:"bytes,2,opt,name=coins,proto3" json:"coins,omitempty"` } func (m *MsgMint) Reset() { *m = MsgMint{} } @@ -169,16 +168,9 @@ func (m *MsgMint) GetCreator() string { return "" } -func (m *MsgMint) GetDenom() string { +func (m *MsgMint) GetCoins() string { if m != nil { - return m.Denom - } - return "" -} - -func (m *MsgMint) GetAmount() string { - if m != nil { - return m.Amount + return m.Coins } return "" } @@ -219,17 +211,107 @@ func (m *MsgMintResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgMintResponse proto.InternalMessageInfo +type MsgBurn struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Coins string `protobuf:"bytes,2,opt,name=coins,proto3" json:"coins,omitempty"` +} + +func (m *MsgBurn) Reset() { *m = MsgBurn{} } +func (m *MsgBurn) String() string { return proto.CompactTextString(m) } +func (*MsgBurn) ProtoMessage() {} +func (*MsgBurn) Descriptor() ([]byte, []int) { + return fileDescriptor_51ab120c97d57038, []int{4} +} +func (m *MsgBurn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurn.Merge(m, src) +} +func (m *MsgBurn) XXX_Size() int { + return m.Size() +} +func (m *MsgBurn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurn proto.InternalMessageInfo + +func (m *MsgBurn) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgBurn) GetCoins() string { + if m != nil { + return m.Coins + } + return "" +} + +type MsgBurnResponse struct { +} + +func (m *MsgBurnResponse) Reset() { *m = MsgBurnResponse{} } +func (m *MsgBurnResponse) String() string { return proto.CompactTextString(m) } +func (*MsgBurnResponse) ProtoMessage() {} +func (*MsgBurnResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_51ab120c97d57038, []int{5} +} +func (m *MsgBurnResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurnResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurnResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurnResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurnResponse.Merge(m, src) +} +func (m *MsgBurnResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgBurnResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurnResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurnResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateDenom)(nil), "bze.tokenfactory.v1.MsgCreateDenom") proto.RegisterType((*MsgCreateDenomResponse)(nil), "bze.tokenfactory.v1.MsgCreateDenomResponse") proto.RegisterType((*MsgMint)(nil), "bze.tokenfactory.v1.MsgMint") proto.RegisterType((*MsgMintResponse)(nil), "bze.tokenfactory.v1.MsgMintResponse") + proto.RegisterType((*MsgBurn)(nil), "bze.tokenfactory.v1.MsgBurn") + proto.RegisterType((*MsgBurnResponse)(nil), "bze.tokenfactory.v1.MsgBurnResponse") } func init() { proto.RegisterFile("tokenfactory/tx.proto", fileDescriptor_51ab120c97d57038) } var fileDescriptor_51ab120c97d57038 = []byte{ - // 301 bytes of a gzipped FileDescriptorProto + // 315 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2d, 0xc9, 0xcf, 0x4e, 0xcd, 0x4b, 0x4b, 0x4c, 0x2e, 0xc9, 0x2f, 0xaa, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4e, 0xaa, 0x4a, 0xd5, 0x43, 0x96, 0xd2, 0x2b, 0x33, 0x54, 0x72, 0xe3, 0xe2, @@ -238,17 +320,18 @@ var fileDescriptor_51ab120c97d57038 = []byte{ 0x21, 0x29, 0x2e, 0x8e, 0xe2, 0xd2, 0xa4, 0x14, 0x90, 0x2a, 0x09, 0x26, 0xb0, 0x14, 0x9c, 0xaf, 0x64, 0xca, 0x25, 0x86, 0x6a, 0x4e, 0x50, 0x6a, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x90, 0x34, 0x17, 0x67, 0x5e, 0x6a, 0x79, 0x3c, 0x44, 0x1b, 0xc4, 0x44, 0x8e, 0xbc, 0xd4, 0x72, 0xb0, 0x22, - 0xa5, 0x40, 0x2e, 0x76, 0xdf, 0xe2, 0x74, 0xdf, 0xcc, 0xbc, 0x12, 0x3c, 0xf6, 0x8a, 0x70, 0xb1, - 0x22, 0x5b, 0x0a, 0xe1, 0x08, 0x89, 0x71, 0xb1, 0x25, 0xe6, 0xe6, 0x97, 0xe6, 0x95, 0x48, 0x30, - 0x83, 0x85, 0xa1, 0x3c, 0x25, 0x41, 0x2e, 0x7e, 0xa8, 0x91, 0x30, 0x27, 0x18, 0x6d, 0x62, 0xe4, - 0x62, 0xf6, 0x2d, 0x4e, 0x17, 0x8a, 0xe7, 0xe2, 0x46, 0xf6, 0xa9, 0xb2, 0x1e, 0x96, 0x10, 0xd1, - 0x43, 0xf5, 0x86, 0x94, 0x36, 0x11, 0x8a, 0xe0, 0x7e, 0xf5, 0xe2, 0x62, 0x01, 0xfb, 0x45, 0x06, - 0x97, 0x26, 0x90, 0xac, 0x94, 0x0a, 0x3e, 0x59, 0x98, 0x59, 0x4e, 0xde, 0x27, 0x1e, 0xc9, 0x31, - 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, - 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0x65, 0x98, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, - 0x9f, 0xab, 0x9f, 0x54, 0x95, 0xaa, 0x9b, 0x98, 0x53, 0x90, 0x91, 0x58, 0x92, 0x9a, 0x08, 0xe6, - 0xe9, 0x57, 0xe8, 0xa3, 0x46, 0x7f, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0x38, 0x09, 0x18, 0x03, - 0x02, 0x00, 0x00, 0xff, 0xff, 0xac, 0xa1, 0x0f, 0xaf, 0x1b, 0x02, 0x00, 0x00, + 0x25, 0x4b, 0x2e, 0x76, 0xdf, 0xe2, 0x74, 0xdf, 0xcc, 0xbc, 0x12, 0x3c, 0xf6, 0x8a, 0x70, 0xb1, + 0x26, 0xe7, 0x67, 0xe6, 0x15, 0x43, 0x2d, 0x85, 0x70, 0x94, 0x04, 0xb9, 0xf8, 0xa1, 0x5a, 0x61, + 0x56, 0x41, 0x4d, 0x73, 0x2a, 0x2d, 0xca, 0x23, 0xd3, 0x34, 0x90, 0x56, 0x98, 0x69, 0x46, 0xff, + 0x18, 0xb9, 0x98, 0x7d, 0x8b, 0xd3, 0x85, 0xe2, 0xb9, 0xb8, 0x91, 0xc3, 0x47, 0x59, 0x0f, 0x4b, + 0x38, 0xea, 0xa1, 0x7a, 0x5e, 0x4a, 0x9b, 0x08, 0x45, 0xf0, 0x10, 0xf2, 0xe2, 0x62, 0x01, 0x87, + 0x80, 0x0c, 0x2e, 0x4d, 0x20, 0x59, 0x29, 0x15, 0x7c, 0xb2, 0xc8, 0x66, 0x81, 0xfd, 0x8f, 0xd3, + 0x2c, 0x90, 0x2c, 0x6e, 0xb3, 0x90, 0x03, 0xc0, 0xc9, 0xfb, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, + 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, + 0x8f, 0xe5, 0x18, 0xa2, 0x0c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, + 0x93, 0xaa, 0x52, 0x75, 0x13, 0x73, 0x0a, 0x32, 0x12, 0x4b, 0x52, 0x13, 0xc1, 0x3c, 0xfd, 0x0a, + 0x7d, 0xd4, 0x04, 0x58, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x4e, 0x84, 0xc6, 0x80, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x18, 0xf6, 0x9c, 0xa0, 0x9d, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -265,6 +348,7 @@ const _ = grpc.SupportPackageIsVersion4 type MsgClient interface { CreateDenom(ctx context.Context, in *MsgCreateDenom, opts ...grpc.CallOption) (*MsgCreateDenomResponse, error) Mint(ctx context.Context, in *MsgMint, opts ...grpc.CallOption) (*MsgMintResponse, error) + Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) } type msgClient struct { @@ -293,10 +377,20 @@ func (c *msgClient) Mint(ctx context.Context, in *MsgMint, opts ...grpc.CallOpti return out, nil } +func (c *msgClient) Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) { + out := new(MsgBurnResponse) + err := c.cc.Invoke(ctx, "/bze.tokenfactory.v1.Msg/Burn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { CreateDenom(context.Context, *MsgCreateDenom) (*MsgCreateDenomResponse, error) Mint(context.Context, *MsgMint) (*MsgMintResponse, error) + Burn(context.Context, *MsgBurn) (*MsgBurnResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -309,6 +403,9 @@ func (*UnimplementedMsgServer) CreateDenom(ctx context.Context, req *MsgCreateDe func (*UnimplementedMsgServer) Mint(ctx context.Context, req *MsgMint) (*MsgMintResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Mint not implemented") } +func (*UnimplementedMsgServer) Burn(ctx context.Context, req *MsgBurn) (*MsgBurnResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Burn not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -350,6 +447,24 @@ func _Msg_Mint_Handler(srv interface{}, ctx context.Context, dec func(interface{ return interceptor(ctx, in, info, handler) } +func _Msg_Burn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgBurn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Burn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bze.tokenfactory.v1.Msg/Burn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Burn(ctx, req.(*MsgBurn)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "bze.tokenfactory.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -362,6 +477,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "Mint", Handler: _Msg_Mint_Handler, }, + { + MethodName: "Burn", + Handler: _Msg_Burn_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tokenfactory/tx.proto", @@ -454,17 +573,10 @@ func (m *MsgMint) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Amount) > 0 { - i -= len(m.Amount) - copy(dAtA[i:], m.Amount) - i = encodeVarintTx(dAtA, i, uint64(len(m.Amount))) - i-- - dAtA[i] = 0x1a - } - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintTx(dAtA, i, uint64(len(m.Denom))) + if len(m.Coins) > 0 { + i -= len(m.Coins) + copy(dAtA[i:], m.Coins) + i = encodeVarintTx(dAtA, i, uint64(len(m.Coins))) i-- dAtA[i] = 0x12 } @@ -501,6 +613,66 @@ func (m *MsgMintResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MsgBurn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Coins) > 0 { + i -= len(m.Coins) + copy(dAtA[i:], m.Coins) + i = encodeVarintTx(dAtA, i, uint64(len(m.Coins))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgBurnResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurnResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurnResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -552,18 +724,40 @@ func (m *MsgMint) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.Denom) + l = len(m.Coins) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.Amount) + return n +} + +func (m *MsgMintResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgBurn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Coins) if l > 0 { n += 1 + l + sovTx(uint64(l)) } return n } -func (m *MsgMintResponse) Size() (n int) { +func (m *MsgBurnResponse) Size() (n int) { if m == nil { return 0 } @@ -837,7 +1031,7 @@ func (m *MsgMint) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -865,11 +1059,143 @@ func (m *MsgMint) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Denom = string(dAtA[iNdEx:postIndex]) + m.Coins = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgMintResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgMintResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgMintResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBurn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgBurn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -897,7 +1223,7 @@ func (m *MsgMint) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Amount = string(dAtA[iNdEx:postIndex]) + m.Coins = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -920,7 +1246,7 @@ func (m *MsgMint) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgMintResponse) Unmarshal(dAtA []byte) error { +func (m *MsgBurnResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -943,10 +1269,10 @@ func (m *MsgMintResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgMintResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgBurnResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMintResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgBurnResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: