-
Notifications
You must be signed in to change notification settings - Fork 0
/
msg_server_buy_item.go
65 lines (62 loc) · 1.96 KB
/
msg_server_buy_item.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package keeper
import (
"context"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
storetypes "github.com/harish551/cosmostore/x/store/types"
"strconv"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/harish551/cosmostore/x/market/types"
)
func (k msgServer) BuyItem(goCtx context.Context, msg *types.MsgBuyItem) (*types.MsgBuyItemResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
id, err := strconv.ParseUint(msg.Id, 10, 64)
if err != nil {
return nil, err
}
marketItem, found := k.GetMarketItem(ctx, id)
if !found {
return nil, sdkerrors.Wrap(types.ErrSample, "Sample Error")
}
itd, err := strconv.ParseUint(marketItem.ItemID, 10, 64)
if err != nil {
return nil, err
}
if !marketItem.Price.IsEqual(msg.Price) {
return nil, sdkerrors.Wrap(types.ErrSample, "Sample Error")
}
val, found := k.storeKeeper.GetItem(ctx, itd)
buyer, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return nil, err
}
owner, err := sdk.AccAddressFromBech32(marketItem.Owner)
if err != nil {
return nil, err
}
err = k.bankKeeper.SendCoins(ctx, buyer, owner, marketItem.Price)
if err != nil {
return nil, err
}
k.storeKeeper.Transfer(ctx, val.Id, buyer)
k.RemoveMarketItem(ctx, marketItem.Id)
ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
types.EventTypeBuyItem,
sdk.NewAttribute(types.AttributeKeyItemId, marketItem.ItemID),
sdk.NewAttribute(types.AttributeKeyOwner, owner.String()),
sdk.NewAttribute(types.AttributeKeyBuyer, buyer.String()),
),
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator),
),
sdk.NewEvent(
types.EventTypeTransferItem,
sdk.NewAttribute(sdk.AttributeKeyModule, storetypes.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeySender, owner.String()),
sdk.NewAttribute(types.AttributeKeyRecipient, buyer.String()),
),
})
return &types.MsgBuyItemResponse{}, nil
}