Display auction type and phase when querying auctions (#345)

* feat: differentiate auction types when queried

* feat: display auction type

* feat: add phase of collateral auctions

* fix: set reverse phase directly

* feat: revert base auction, use querying specifc structs

* fix: pass auction as interface to handlers

* set reverse phase on max bid (#348)

* Revert "set reverse phase on max bid (#348)" (#351)

This reverts commit 4b855250d529a4cbecb16d9d32b25ffeaffa3a68.

* fix: missing return

* fix: include collateral auction type

* fix: always include phase field for queries

Co-authored-by: Denali Marsh <denalimarsh@gmail.com>
This commit is contained in:
Kevin Davis 2020-01-29 08:42:03 -06:00 committed by GitHub
parent 84fa0ef51d
commit 55f0f8d980
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 86 additions and 21 deletions

View File

@ -60,7 +60,8 @@ func QueryGetAuctionCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
// Decode and print results // Decode and print results
var auction types.Auction var auction types.Auction
cdc.MustUnmarshalJSON(res, &auction) cdc.MustUnmarshalJSON(res, &auction)
return cliCtx.PrintOutput(auction) auctionWithPhase := types.NewAuctionWithPhase(auction)
return cliCtx.PrintOutput(auctionWithPhase)
}, },
} }
} }
@ -83,7 +84,12 @@ func QueryGetAuctionsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
// Decode and print results // Decode and print results
var auctions types.Auctions var auctions types.Auctions
cdc.MustUnmarshalJSON(res, &auctions) cdc.MustUnmarshalJSON(res, &auctions)
return cliCtx.PrintOutput(auctions)
var auctionsWithPhase []types.AuctionWithPhase
for _, a := range auctions {
auctionsWithPhase = append(auctionsWithPhase, types.NewAuctionWithPhase(a))
}
return cliCtx.PrintOutput(auctionsWithPhase)
}, },
} }
} }

View File

@ -51,10 +51,18 @@ func queryAuctionHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
return return
} }
var auction types.Auction
err = cliCtx.Codec.UnmarshalJSON(res, auction)
if err != nil {
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
return
}
// Decode and return results // Decode and return results
cliCtx = cliCtx.WithHeight(height) cliCtx = cliCtx.WithHeight(height)
rest.PostProcessResponse(w, cliCtx, res)
auctionWithPhase := types.NewAuctionWithPhase(auction)
rest.PostProcessResponse(w, cliCtx, cliCtx.Codec.MustMarshalJSON(auctionWithPhase))
} }
} }
@ -73,7 +81,20 @@ func queryAuctionsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
} }
// Return auctions // Return auctions
cliCtx = cliCtx.WithHeight(height) cliCtx = cliCtx.WithHeight(height)
rest.PostProcessResponse(w, cliCtx, res)
var auctions types.Auctions
err = cliCtx.Codec.UnmarshalJSON(res, auctions)
if err != nil {
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
return
}
var auctionsWithPhase []types.AuctionWithPhase
for _, a := range auctions {
auctionsWithPhase = append(auctionsWithPhase, types.NewAuctionWithPhase(a))
}
rest.PostProcessResponse(w, cliCtx, cliCtx.Codec.MustMarshalJSON(auctionsWithPhase))
} }
} }

View File

@ -32,7 +32,7 @@ func (k Keeper) StartSurplusAuction(ctx sdk.Context, seller string, lot sdk.Coin
sdk.NewEvent( sdk.NewEvent(
types.EventTypeAuctionStart, types.EventTypeAuctionStart,
sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())), sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())),
sdk.NewAttribute(types.AttributeKeyAuctionType, auction.Name()), sdk.NewAttribute(types.AttributeKeyAuctionType, auction.GetType()),
sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom), sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom),
sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom), sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom),
), ),
@ -70,7 +70,7 @@ func (k Keeper) StartDebtAuction(ctx sdk.Context, buyer string, bid sdk.Coin, in
sdk.NewEvent( sdk.NewEvent(
types.EventTypeAuctionStart, types.EventTypeAuctionStart,
sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())), sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())),
sdk.NewAttribute(types.AttributeKeyAuctionType, auction.Name()), sdk.NewAttribute(types.AttributeKeyAuctionType, auction.GetType()),
sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom), sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom),
sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom), sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom),
), ),
@ -111,7 +111,7 @@ func (k Keeper) StartCollateralAuction(ctx sdk.Context, seller string, lot sdk.C
sdk.NewEvent( sdk.NewEvent(
types.EventTypeAuctionStart, types.EventTypeAuctionStart,
sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())), sdk.NewAttribute(types.AttributeKeyAuctionID, fmt.Sprintf("%d", auction.GetID())),
sdk.NewAttribute(types.AttributeKeyAuctionType, auction.Name()), sdk.NewAttribute(types.AttributeKeyAuctionType, auction.GetType()),
sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom), sdk.NewAttribute(types.AttributeKeyBidDenom, auction.Bid.Denom),
sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom), sdk.NewAttribute(types.AttributeKeyLotDenom, auction.Lot.Denom),
), ),
@ -506,9 +506,8 @@ func (k Keeper) CloseExpiredAuctions(ctx sdk.Context) sdk.Error {
func earliestTime(t1, t2 time.Time) time.Time { func earliestTime(t1, t2 time.Time) time.Time {
if t1.Before(t2) { if t1.Before(t2) {
return t1 return t1
} else {
return t2 // also returned if times are equal
} }
return t2 // also returned if times are equal
} }
// splitCoinIntoWeightedBuckets divides up some amount of coins according to some weights. // splitCoinIntoWeightedBuckets divides up some amount of coins according to some weights.

View File

@ -22,6 +22,7 @@ type Auction interface {
GetBidder() sdk.AccAddress GetBidder() sdk.AccAddress
GetBid() sdk.Coin GetBid() sdk.Coin
GetEndTime() time.Time GetEndTime() time.Time
GetType() string
} }
// Auctions is a slice of auctions. // Auctions is a slice of auctions.
@ -57,6 +58,9 @@ func (a BaseAuction) GetBid() sdk.Coin { return a.Bid }
// GetEndTime is a getter for auction end time. // GetEndTime is a getter for auction end time.
func (a BaseAuction) GetEndTime() time.Time { return a.EndTime } func (a BaseAuction) GetEndTime() time.Time { return a.EndTime }
// GetType returns theauction type. Used to identify auctions in event attributes.
func (a BaseAuction) GetType() string { return "base" }
// Validate verifies that the auction end time is before max end time // Validate verifies that the auction end time is before max end time
func (a BaseAuction) Validate() error { func (a BaseAuction) Validate() error {
if a.EndTime.After(a.MaxEndTime) { if a.EndTime.After(a.MaxEndTime) {
@ -82,14 +86,14 @@ func (a BaseAuction) String() string {
// SurplusAuction is a forward auction that burns what it receives from bids. // SurplusAuction is a forward auction that burns what it receives from bids.
// It is normally used to sell off excess pegged asset acquired by the CDP system. // It is normally used to sell off excess pegged asset acquired by the CDP system.
type SurplusAuction struct { type SurplusAuction struct {
BaseAuction `json:"base_auction" yaml:"base_auction"` BaseAuction
} }
// WithID returns an auction with the ID set. // WithID returns an auction with the ID set.
func (a SurplusAuction) WithID(id uint64) Auction { a.ID = id; return a } func (a SurplusAuction) WithID(id uint64) Auction { a.ID = id; return a }
// Name returns a name for this auction type. Used to identify auctions in event attributes. // GetType returns the auction type. Used to identify auctions in event attributes.
func (a SurplusAuction) Name() string { return "surplus" } func (a SurplusAuction) GetType() string { return "surplus" }
// GetModuleAccountCoins returns the total number of coins held in the module account for this auction. // GetModuleAccountCoins returns the total number of coins held in the module account for this auction.
// It is used in genesis initialize the module account correctly. // It is used in genesis initialize the module account correctly.
@ -116,15 +120,16 @@ func NewSurplusAuction(seller string, lot sdk.Coin, bidDenom string, endTime tim
// DebtAuction is a reverse auction that mints what it pays out. // DebtAuction is a reverse auction that mints what it pays out.
// It is normally used to acquire pegged asset to cover the CDP system's debts that were not covered by selling collateral. // It is normally used to acquire pegged asset to cover the CDP system's debts that were not covered by selling collateral.
type DebtAuction struct { type DebtAuction struct {
BaseAuction `json:"base_auction" yaml:"base_auction"` BaseAuction
CorrespondingDebt sdk.Coin `json:"corresponding_debt" yaml:"corresponding_debt"` CorrespondingDebt sdk.Coin `json:"corresponding_debt" yaml:"corresponding_debt"`
} }
// WithID returns an auction with the ID set. // WithID returns an auction with the ID set.
func (a DebtAuction) WithID(id uint64) Auction { a.ID = id; return a } func (a DebtAuction) WithID(id uint64) Auction { a.ID = id; return a }
// Name returns a name for this auction type. Used to identify auctions in event attributes. // GetType returns the auction type. Used to identify auctions in event attributes.
func (a DebtAuction) Name() string { return "debt" } func (a DebtAuction) GetType() string { return "debt" }
// GetModuleAccountCoins returns the total number of coins held in the module account for this auction. // GetModuleAccountCoins returns the total number of coins held in the module account for this auction.
// It is used in genesis initialize the module account correctly. // It is used in genesis initialize the module account correctly.
@ -160,7 +165,8 @@ func NewDebtAuction(buyerModAccName string, bid sdk.Coin, initialLot sdk.Coin, e
// Unsold Lot is sent to LotReturns, being divided among the addresses by weight. // Unsold Lot is sent to LotReturns, being divided among the addresses by weight.
// Collateral auctions are normally used to sell off collateral seized from CDPs. // Collateral auctions are normally used to sell off collateral seized from CDPs.
type CollateralAuction struct { type CollateralAuction struct {
BaseAuction `json:"base_auction" yaml:"base_auction"` BaseAuction
CorrespondingDebt sdk.Coin `json:"corresponding_debt" yaml:"corresponding_debt"` CorrespondingDebt sdk.Coin `json:"corresponding_debt" yaml:"corresponding_debt"`
MaxBid sdk.Coin `json:"max_bid" yaml:"max_bid"` MaxBid sdk.Coin `json:"max_bid" yaml:"max_bid"`
LotReturns WeightedAddresses `json:"lot_returns" yaml:"lot_returns"` LotReturns WeightedAddresses `json:"lot_returns" yaml:"lot_returns"`
@ -169,8 +175,8 @@ type CollateralAuction struct {
// WithID returns an auction with the ID set. // WithID returns an auction with the ID set.
func (a CollateralAuction) WithID(id uint64) Auction { a.ID = id; return a } func (a CollateralAuction) WithID(id uint64) Auction { a.ID = id; return a }
// Name returns a name for this auction type. Used to identify auctions in event attributes. // GetType returns the auction type. Used to identify auctions in event attributes.
func (a CollateralAuction) Name() string { return "collateral" } func (a CollateralAuction) GetType() string { return "collateral" }
// GetModuleAccountCoins returns the total number of coins held in the module account for this auction. // GetModuleAccountCoins returns the total number of coins held in the module account for this auction.
// It is used in genesis initialize the module account correctly. // It is used in genesis initialize the module account correctly.
@ -185,6 +191,14 @@ func (a CollateralAuction) IsReversePhase() bool {
return a.Bid.IsEqual(a.MaxBid) return a.Bid.IsEqual(a.MaxBid)
} }
// GetPhase returns the phase of a collateral auction
func (a CollateralAuction) GetPhase() string {
if a.IsReversePhase() {
return "reverse"
}
return "forward"
}
func (a CollateralAuction) String() string { func (a CollateralAuction) String() string {
return fmt.Sprintf(`Auction %d: return fmt.Sprintf(`Auction %d:
Initiator: %s Initiator: %s

View File

@ -3,9 +3,9 @@ package types
const ( const (
// QueryGetAuction is the query path for querying one auction // QueryGetAuction is the query path for querying one auction
QueryGetAuction = "auction" QueryGetAuction = "auction"
// QueryGetAuction is the query path for querying all auctions // QueryGetAuctions is the query path for querying all auctions
QueryGetAuctions = "auctions" QueryGetAuctions = "auctions"
// QueryGetAuction is the query path for querying the global auction params // QueryGetParams is the query path for querying the global auction params
QueryGetParams = "params" QueryGetParams = "params"
) )
@ -27,3 +27,28 @@ func NewQueryAllAuctionParams(page int, limit int) QueryAllAuctionParams {
Limit: limit, Limit: limit,
} }
} }
// AuctionWithPhase augmented type for collateral auctions which includes auction phase for querying
type AuctionWithPhase struct {
Auction Auction
Type string `json:"type" yaml:"type"`
Phase string `json:"phase" yaml:"phase"`
}
// NewAuctionWithPhase returns new AuctionWithPhase
func NewAuctionWithPhase(a Auction) AuctionWithPhase {
switch auc := a.(type) {
case CollateralAuction:
return AuctionWithPhase{
Auction: auc,
Type: auc.GetType(),
Phase: auc.GetPhase(),
}
default:
return AuctionWithPhase{
Auction: auc,
Type: auc.GetType(),
}
}
}