diff --git a/x/machine/keeper/msg_server_mint_production.go b/x/machine/keeper/msg_server_mint_production.go index 68bddc1..0f6e315 100644 --- a/x/machine/keeper/msg_server_mint_production.go +++ b/x/machine/keeper/msg_server_mint_production.go @@ -3,6 +3,7 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/planetmint/planetmint-go/x/machine/types" ) @@ -10,8 +11,20 @@ import ( func (k msgServer) MintProduction(goCtx context.Context, msg *types.MsgMintProduction) (*types.MsgMintProductionResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - // TODO: Handling the message - _ = ctx + addr, err := sdk.AccAddressFromBech32(msg.GetCreator()) + if err != nil { + return nil, errorsmod.Wrapf(types.ErrInvalidAddress, "invalid address: %s", msg.GetCreator()) + } + + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, msg.GetProduction()) + if err != nil { + return nil, errorsmod.Wrapf(types.ErrMintFailed, "error while minting production %v for address %s", msg.GetProduction(), msg.GetCreator()) + } + + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addr, msg.GetProduction()) + if err != nil { + return nil, errorsmod.Wrapf(types.ErrTransferFailed, "error while transferring %v production to address %s", msg.GetProduction(), msg.GetCreator()) + } return &types.MsgMintProductionResponse{}, nil } diff --git a/x/machine/testutil/expected_keepers_mocks.go b/x/machine/testutil/expected_keepers_mocks.go index 82e12bf..f2a05f9 100644 --- a/x/machine/testutil/expected_keepers_mocks.go +++ b/x/machine/testutil/expected_keepers_mocks.go @@ -100,6 +100,20 @@ func (mr *MockBankKeeperMockRecorder) MintCoins(ctx, moduleName, amt interface{} return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MintCoins", reflect.TypeOf((*MockBankKeeper)(nil).MintCoins), ctx, moduleName, amt) } +// SendCoinsFromModuleToAccount mocks base method. +func (m *MockBankKeeper) SendCoinsFromModuleToAccount(ctx types.Context, senderModule string, recipientAddr types.AccAddress, amt types.Coins) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendCoinsFromModuleToAccount", ctx, senderModule, recipientAddr, amt) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendCoinsFromModuleToAccount indicates an expected call of SendCoinsFromModuleToAccount. +func (mr *MockBankKeeperMockRecorder) SendCoinsFromModuleToAccount(ctx, senderModule, recipientAddr, amt interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendCoinsFromModuleToAccount", reflect.TypeOf((*MockBankKeeper)(nil).SendCoinsFromModuleToAccount), ctx, senderModule, recipientAddr, amt) +} + // SpendableCoins mocks base method. func (m *MockBankKeeper) SpendableCoins(ctx types.Context, addr types.AccAddress) types.Coins { m.ctrl.T.Helper() diff --git a/x/machine/types/errors.go b/x/machine/types/errors.go index 1613f53..74b0a08 100644 --- a/x/machine/types/errors.go +++ b/x/machine/types/errors.go @@ -23,4 +23,5 @@ var ( ErrAssetRegistryRepsonse = errorsmod.Register(ModuleName, 15, "request response issue") ErrInvalidAddress = errorsmod.Register(ModuleName, 16, "invalid address") ErrTransferFailed = errorsmod.Register(ModuleName, 17, "transfer failed") + ErrMintFailed = errorsmod.Register(ModuleName, 18, "minting failed") ) diff --git a/x/machine/types/expected_keepers.go b/x/machine/types/expected_keepers.go index 68929ea..b5c6e0a 100644 --- a/x/machine/types/expected_keepers.go +++ b/x/machine/types/expected_keepers.go @@ -16,5 +16,6 @@ type BankKeeper interface { SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error // Methods imported from bank should be defined here }