package keeper import ( "context" "fmt" "math/big" "reflect" "cosmos-test/x/cosmostest/memdb" "cosmos-test/x/cosmostest/types" sdk "github.com/cosmos/cosmos-sdk/types" ) func (k msgServer) NewBid(goCtx context.Context, msg *types.MsgNewBid) (*types.MsgNewBidResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) _, found := k.Keeper.GetAuction(ctx, msg.AuctionIndex) if !found { return nil, fmt.Errorf("didn't find auction of index %s", msg.AuctionIndex) } auctionExpired, err := k.Keeper.AuctionIsExpired(ctx, msg.AuctionIndex) if err != nil { return nil, fmt.Errorf("error while checking auction %s expiry status: %s", msg.AuctionIndex, err) } if auctionExpired { return nil, fmt.Errorf("auction %s is expired", msg.AuctionIndex) } ok := false amt := new(big.Int) amt, ok = amt.SetString(msg.Amount, 10) if !ok { return nil, fmt.Errorf("failed to convert `%s` to a large integer", msg.Amount) } if amt.Sign() != 1 { return nil, fmt.Errorf("bid amount must be greater than 0") } highestBid, err := memdb.BidDB.GetHighestBid(msg.AuctionIndex) // we manually handle KeyNotFound in GetHighestBid, so should return (nil, nil) if not found if err != nil { return nil, fmt.Errorf("failed to get highest bid: %s", reflect.TypeOf(err)) } if highestBid != nil { amtPrev := new(big.Int) amtPrev, ok = amtPrev.SetString(highestBid.Amount, 10) if !ok { // this should have been checked before, but whatever return nil, fmt.Errorf("failed to convert max bid (%s) to a large integer", msg.Amount) } if amt.Cmp(amtPrev) < 1 { return nil, fmt.Errorf("bid amount must be greater than largest bid") } } bid := &types.Bid{ Amount: msg.Amount, Owner: msg.Creator, } memdb.BidDB.AddBid(msg.AuctionIndex, bid) // auction.Bids = append(auction.Bids, bid) // k.Keeper.SetAuction(ctx, auction) return &types.MsgNewBidResponse{}, nil }