mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 08:57:27 +00:00 
			
		
		
		
	[R4R] Add flags to auction queries (#522)
* cli auction query flags * update bep3 filter method name * rest auction query flags * add constants for auction type, phase * fix test * revisions
This commit is contained in:
		
							parent
							
								
									e7ceada952
								
							
						
					
					
						commit
						b2edeb8549
					
				@ -3,16 +3,26 @@ package cli
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
 | 
						"github.com/spf13/viper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/context"
 | 
						"github.com/cosmos/cosmos-sdk/client/context"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
						"github.com/cosmos/cosmos-sdk/client/flags"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
						"github.com/cosmos/cosmos-sdk/codec"
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/kava-labs/kava/x/auction/types"
 | 
						"github.com/kava-labs/kava/x/auction/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Query auction flags
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						flagType  = "type"
 | 
				
			||||||
 | 
						flagDenom = "denom"
 | 
				
			||||||
 | 
						flagPhase = "phase"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetQueryCmd returns the cli query commands for this module
 | 
					// GetQueryCmd returns the cli query commands for this module
 | 
				
			||||||
func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
					func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			||||||
	// Group nameservice queries under a subcommand
 | 
						// Group nameservice queries under a subcommand
 | 
				
			||||||
@ -52,7 +62,7 @@ func QueryGetAuctionCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Query
 | 
								// Query
 | 
				
			||||||
			res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetAuction), bz)
 | 
								res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetAuction), bz)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -61,6 +71,8 @@ func QueryGetAuctionCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
			var auction types.Auction
 | 
								var auction types.Auction
 | 
				
			||||||
			cdc.MustUnmarshalJSON(res, &auction)
 | 
								cdc.MustUnmarshalJSON(res, &auction)
 | 
				
			||||||
			auctionWithPhase := types.NewAuctionWithPhase(auction)
 | 
								auctionWithPhase := types.NewAuctionWithPhase(auction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
			return cliCtx.PrintOutput(auctionWithPhase)
 | 
								return cliCtx.PrintOutput(auctionWithPhase)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -68,30 +80,99 @@ func QueryGetAuctionCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// QueryGetAuctionsCmd queries the auctions in the store
 | 
					// QueryGetAuctionsCmd queries the auctions in the store
 | 
				
			||||||
func QueryGetAuctionsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
					func QueryGetAuctionsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			||||||
	return &cobra.Command{
 | 
						cmd := &cobra.Command{
 | 
				
			||||||
		Use:   "auctions",
 | 
							Use:   "auctions",
 | 
				
			||||||
		Short: "get a list of active auctions",
 | 
							Short: "query auctions with optional filters",
 | 
				
			||||||
		Args:  cobra.NoArgs,
 | 
							Long: strings.TrimSpace(`Query for all paginated auctions that match optional filters:
 | 
				
			||||||
 | 
					Example:
 | 
				
			||||||
 | 
					$ kvcli q auction auctions --type=(collateral|surplus|debt)
 | 
				
			||||||
 | 
					$ kvcli q auction auctions --denom=bnb
 | 
				
			||||||
 | 
					$ kvcli q auction auctions --phase=(forward|reverse)
 | 
				
			||||||
 | 
					$ kvcli q auction auctions --page=2 --limit=100
 | 
				
			||||||
 | 
					`,
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
							RunE: func(cmd *cobra.Command, args []string) error {
 | 
				
			||||||
 | 
								strType := viper.GetString(flagType)
 | 
				
			||||||
 | 
								strDenom := viper.GetString(flagDenom)
 | 
				
			||||||
 | 
								strPhase := viper.GetString(flagPhase)
 | 
				
			||||||
 | 
								page := viper.GetInt(flags.FlagPage)
 | 
				
			||||||
 | 
								limit := viper.GetInt(flags.FlagLimit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var (
 | 
				
			||||||
 | 
									auctionType  string
 | 
				
			||||||
 | 
									auctionDenom string
 | 
				
			||||||
 | 
									auctionPhase string
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								params := types.NewQueryAllAuctionParams(page, limit, auctionType, auctionDenom, auctionPhase)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if len(strType) != 0 {
 | 
				
			||||||
 | 
									auctionType = strings.ToLower(strings.TrimSpace(strType))
 | 
				
			||||||
 | 
									if auctionType != types.CollateralAuctionType &&
 | 
				
			||||||
 | 
										auctionType != types.SurplusAuctionType &&
 | 
				
			||||||
 | 
										auctionType != types.DebtAuctionType {
 | 
				
			||||||
 | 
										return fmt.Errorf("invalid auction type %s", strType)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									params.Type = auctionType
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if len(strDenom) != 0 {
 | 
				
			||||||
 | 
									auctionDenom := strings.TrimSpace(strDenom)
 | 
				
			||||||
 | 
									err := sdk.ValidateDenom(auctionDenom)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									params.Denom = auctionDenom
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if len(strPhase) != 0 {
 | 
				
			||||||
 | 
									auctionPhase := strings.ToLower(strings.TrimSpace(strPhase))
 | 
				
			||||||
 | 
									if auctionType != types.CollateralAuctionType && len(auctionType) > 0 {
 | 
				
			||||||
 | 
										return fmt.Errorf("cannot apply phase flag to non-collateral auction type")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if auctionPhase != types.ForwardAuctionPhase && auctionPhase != types.ReverseAuctionPhase {
 | 
				
			||||||
 | 
										return fmt.Errorf("invalid auction phase %s", strPhase)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									params.Phase = auctionPhase
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								bz, err := cdc.MarshalJSON(params)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
								cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Query
 | 
								// Query
 | 
				
			||||||
			res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetAuctions), nil)
 | 
								res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetAuctions), bz)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Decode and print results
 | 
								// Decode and print results
 | 
				
			||||||
			var auctions types.Auctions
 | 
								var matchingAuctions types.Auctions
 | 
				
			||||||
			cdc.MustUnmarshalJSON(res, &auctions)
 | 
								cdc.MustUnmarshalJSON(res, &matchingAuctions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if len(matchingAuctions) == 0 {
 | 
				
			||||||
 | 
									return fmt.Errorf("No matching auctions found")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			auctionsWithPhase := []types.AuctionWithPhase{} // using empty slice so json returns [] instead of null when there's no auctions
 | 
								auctionsWithPhase := []types.AuctionWithPhase{} // using empty slice so json returns [] instead of null when there's no auctions
 | 
				
			||||||
			for _, a := range auctions {
 | 
								for _, a := range matchingAuctions {
 | 
				
			||||||
				auctionsWithPhase = append(auctionsWithPhase, types.NewAuctionWithPhase(a))
 | 
									auctionsWithPhase = append(auctionsWithPhase, types.NewAuctionWithPhase(a))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return cliCtx.PrintOutput(auctionsWithPhase)
 | 
								cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
								return cliCtx.PrintOutput(auctionsWithPhase) // nolint:errcheck
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd.Flags().Int(flags.FlagPage, 1, "pagination page of auctions to to query for")
 | 
				
			||||||
 | 
						cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit of auctions to query for")
 | 
				
			||||||
 | 
						cmd.Flags().String(flagType, "", "(optional) filter by auction type, type: collateral, debt, surplus")
 | 
				
			||||||
 | 
						cmd.Flags().String(flagDenom, "", "(optional) filter by auction denom")
 | 
				
			||||||
 | 
						cmd.Flags().String(flagPhase, "", "(optional) filter by collateral auction phase, phase: forward/reverse")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cmd
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// QueryParamsCmd queries the auction module parameters
 | 
					// QueryParamsCmd queries the auction module parameters
 | 
				
			||||||
@ -106,7 +187,7 @@ func QueryParamsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// Query
 | 
								// Query
 | 
				
			||||||
			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetParams)
 | 
								route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetParams)
 | 
				
			||||||
			res, _, err := cliCtx.QueryWithData(route, nil)
 | 
								res, height, err := cliCtx.QueryWithData(route, nil)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -114,6 +195,7 @@ func QueryParamsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
			// Decode and print results
 | 
								// Decode and print results
 | 
				
			||||||
			var out types.Params
 | 
								var out types.Params
 | 
				
			||||||
			cdc.MustUnmarshalJSON(res, &out)
 | 
								cdc.MustUnmarshalJSON(res, &out)
 | 
				
			||||||
 | 
								cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
			return cliCtx.PrintOutput(out)
 | 
								return cliCtx.PrintOutput(out)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,10 +3,12 @@ package rest
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gorilla/mux"
 | 
						"github.com/gorilla/mux"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/context"
 | 
						"github.com/cosmos/cosmos-sdk/client/context"
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/types/rest"
 | 
						"github.com/cosmos/cosmos-sdk/types/rest"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/kava-labs/kava/x/auction/types"
 | 
						"github.com/kava-labs/kava/x/auction/types"
 | 
				
			||||||
@ -68,22 +70,70 @@ func queryAuctionHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func queryAuctionsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
					func queryAuctionsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			||||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
						return func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
							_, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Parse the query height
 | 
							// Parse the query height
 | 
				
			||||||
		cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r)
 | 
							cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get all auctions
 | 
							var auctionType string
 | 
				
			||||||
		res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetAuctions), nil)
 | 
							var auctionDenom string
 | 
				
			||||||
 | 
							var auctionPhase string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if x := r.URL.Query().Get(RestType); len(x) != 0 {
 | 
				
			||||||
 | 
								auctionType = strings.ToLower(strings.TrimSpace(x))
 | 
				
			||||||
 | 
								if auctionType != types.CollateralAuctionType &&
 | 
				
			||||||
 | 
									auctionType != types.SurplusAuctionType &&
 | 
				
			||||||
 | 
									auctionType != types.DebtAuctionType {
 | 
				
			||||||
 | 
									rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("invalid auction type %s", x))
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if x := r.URL.Query().Get(RestDenom); len(x) != 0 {
 | 
				
			||||||
 | 
								auctionDenom = strings.TrimSpace(x)
 | 
				
			||||||
 | 
								err := sdk.ValidateDenom(auctionDenom)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if x := r.URL.Query().Get(RestPhase); len(x) != 0 {
 | 
				
			||||||
 | 
								auctionPhase = strings.ToLower(strings.TrimSpace(x))
 | 
				
			||||||
 | 
								if auctionType != types.CollateralAuctionType && len(auctionType) > 0 {
 | 
				
			||||||
 | 
									rest.WriteErrorResponse(w, http.StatusBadRequest, "cannot apply phase flag to non-collateral auction type")
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if auctionPhase != types.ForwardAuctionPhase && auctionPhase != types.ReverseAuctionPhase {
 | 
				
			||||||
 | 
									rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("invalid auction phase %s", x))
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							params := types.NewQueryAllAuctionParams(page, limit, auctionType, auctionDenom, auctionPhase)
 | 
				
			||||||
 | 
							bz, err := cliCtx.Codec.MarshalJSON(params)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetAuctions)
 | 
				
			||||||
 | 
							res, height, err := cliCtx.QueryWithData(route, bz)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Decode and return results
 | 
					 | 
				
			||||||
		cliCtx = cliCtx.WithHeight(height)
 | 
							cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Unmarshal to Auction and remarshal as AuctionWithPhase
 | 
				
			||||||
		var auctions types.Auctions
 | 
							var auctions types.Auctions
 | 
				
			||||||
		err = cliCtx.Codec.UnmarshalJSON(res, &auctions)
 | 
							err = cliCtx.Codec.UnmarshalJSON(res, &auctions)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,16 @@ import (
 | 
				
			|||||||
	"github.com/gorilla/mux"
 | 
						"github.com/gorilla/mux"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/context"
 | 
						"github.com/cosmos/cosmos-sdk/client/context"
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/types/rest"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// REST Variable names
 | 
				
			||||||
 | 
					// nolint
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						RestType  = "type"
 | 
				
			||||||
 | 
						RestDenom = "denom"
 | 
				
			||||||
 | 
						RestPhase = "phase"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RegisterRoutes - Central function to define routes that get registered by the main application
 | 
					// RegisterRoutes - Central function to define routes that get registered by the main application
 | 
				
			||||||
@ -11,3 +21,9 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router) {
 | 
				
			|||||||
	registerQueryRoutes(cliCtx, r)
 | 
						registerQueryRoutes(cliCtx, r)
 | 
				
			||||||
	registerTxRoutes(cliCtx, r)
 | 
						registerTxRoutes(cliCtx, r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// placeBidReq defines the properties of a bid request's body
 | 
				
			||||||
 | 
					type placeBidReq struct {
 | 
				
			||||||
 | 
						BaseReq rest.BaseReq `json:"base_req"`
 | 
				
			||||||
 | 
						Amount  sdk.Coin     `json:"amount"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -18,14 +18,8 @@ func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
 | 
				
			|||||||
	r.HandleFunc(fmt.Sprintf("/%s/auctions/{%s}/bids", types.ModuleName, restAuctionID), bidHandlerFn(cliCtx)).Methods("POST")
 | 
						r.HandleFunc(fmt.Sprintf("/%s/auctions/{%s}/bids", types.ModuleName, restAuctionID), bidHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type placeBidReq struct {
 | 
					 | 
				
			||||||
	BaseReq rest.BaseReq `json:"base_req"`
 | 
					 | 
				
			||||||
	Amount  sdk.Coin     `json:"amount"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func bidHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
					func bidHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			||||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
						return func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Get auction ID from url
 | 
							// Get auction ID from url
 | 
				
			||||||
		auctionID, ok := rest.ParseUint64OrReturnBadRequest(w, mux.Vars(r)[restAuctionID])
 | 
							auctionID, ok := rest.ParseUint64OrReturnBadRequest(w, mux.Vars(r)[restAuctionID])
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
 | 
				
			|||||||
@ -174,3 +174,12 @@ func (k Keeper) IterateAuctions(ctx sdk.Context, cb func(auction types.Auction)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetAllAuctions returns all auctions from the store
 | 
				
			||||||
 | 
					func (k Keeper) GetAllAuctions(ctx sdk.Context) (auctions types.Auctions) {
 | 
				
			||||||
 | 
						k.IterateAuctions(ctx, func(auction types.Auction) bool {
 | 
				
			||||||
 | 
							auctions = append(auctions, auction)
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ package keeper
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	abci "github.com/tendermint/tendermint/abci/types"
 | 
						abci "github.com/tendermint/tendermint/abci/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/client"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
						"github.com/cosmos/cosmos-sdk/codec"
 | 
				
			||||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
 | 
						sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
 | 
				
			||||||
@ -50,15 +51,19 @@ func queryAuction(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func queryAuctions(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) {
 | 
					func queryAuctions(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) {
 | 
				
			||||||
	// Get all auctions
 | 
						var params types.QueryAllAuctionParams
 | 
				
			||||||
	auctionsList := types.Auctions{}
 | 
						err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
 | 
				
			||||||
	keeper.IterateAuctions(ctx, func(a types.Auction) bool {
 | 
						if err != nil {
 | 
				
			||||||
		auctionsList = append(auctionsList, a)
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
 | 
				
			||||||
		return false
 | 
						}
 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Encode Results
 | 
						unfilteredAuctions := keeper.GetAllAuctions(ctx)
 | 
				
			||||||
	bz, err := codec.MarshalJSONIndent(keeper.cdc, auctionsList)
 | 
						auctions := filterAuctions(ctx, unfilteredAuctions, params)
 | 
				
			||||||
 | 
						if auctions == nil {
 | 
				
			||||||
 | 
							auctions = types.Auctions{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bz, err := codec.MarshalJSONIndent(keeper.cdc, auctions)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -79,3 +84,41 @@ func queryGetParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]by
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return bz, nil
 | 
						return bz, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// filterAuctions retrieves auctions filtered by a given set of params.
 | 
				
			||||||
 | 
					// If no filters are provided, all auctions will be returned in paginated form.
 | 
				
			||||||
 | 
					func filterAuctions(ctx sdk.Context, auctions types.Auctions, params types.QueryAllAuctionParams) types.Auctions {
 | 
				
			||||||
 | 
						filteredAuctions := make(types.Auctions, 0, len(auctions))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, auc := range auctions {
 | 
				
			||||||
 | 
							matchType, matchDenom, matchPhase := true, true, true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// match auction type (if supplied)
 | 
				
			||||||
 | 
							if len(params.Type) > 0 {
 | 
				
			||||||
 | 
								matchType = auc.GetType() == params.Type
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// match auction denom (if supplied)
 | 
				
			||||||
 | 
							if len(params.Denom) > 0 {
 | 
				
			||||||
 | 
								matchDenom = auc.GetBid().Denom == params.Denom || auc.GetLot().Denom == params.Denom
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// match auction phase (if supplied)
 | 
				
			||||||
 | 
							if len(params.Phase) > 0 {
 | 
				
			||||||
 | 
								matchPhase = auc.GetPhase() == params.Phase
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if matchType && matchDenom && matchPhase {
 | 
				
			||||||
 | 
								filteredAuctions = append(filteredAuctions, auc)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start, end := client.Paginate(len(filteredAuctions), params.Page, params.Limit, 100)
 | 
				
			||||||
 | 
						if start < 0 || end < 0 {
 | 
				
			||||||
 | 
							filteredAuctions = types.Auctions{}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							filteredAuctions = filteredAuctions[start:end]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return filteredAuctions
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -107,7 +107,9 @@ func (suite *QuerierTestSuite) TestQueryAuctions() {
 | 
				
			|||||||
	// Set up request query
 | 
						// Set up request query
 | 
				
			||||||
	query := abci.RequestQuery{
 | 
						query := abci.RequestQuery{
 | 
				
			||||||
		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetAuctions}, "/"),
 | 
							Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetAuctions}, "/"),
 | 
				
			||||||
		Data: types.ModuleCdc.MustMarshalJSON(types.NewQueryAllAuctionParams(1, TestAuctionCount)),
 | 
							Data: types.ModuleCdc.MustMarshalJSON(
 | 
				
			||||||
 | 
								types.NewQueryAllAuctionParams(int(1), int(TestAuctionCount), "", "", ""),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Execute query and check the []byte result
 | 
						// Execute query and check the []byte result
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,14 @@ import (
 | 
				
			|||||||
	"github.com/cosmos/cosmos-sdk/x/supply"
 | 
						"github.com/cosmos/cosmos-sdk/x/supply"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						CollateralAuctionType = "collateral"
 | 
				
			||||||
 | 
						SurplusAuctionType    = "surplus"
 | 
				
			||||||
 | 
						DebtAuctionType       = "debt"
 | 
				
			||||||
 | 
						ForwardAuctionPhase   = "forward"
 | 
				
			||||||
 | 
						ReverseAuctionPhase   = "reverse"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DistantFuture is a very large time value to use as initial the ending time for auctions.
 | 
					// DistantFuture is a very large time value to use as initial the ending time for auctions.
 | 
				
			||||||
// It is not set to the max time supported. This can cause problems with time comparisons, see https://stackoverflow.com/a/32620397.
 | 
					// It is not set to the max time supported. This can cause problems with time comparisons, see https://stackoverflow.com/a/32620397.
 | 
				
			||||||
// Also amino panics when encoding times ≥ the start of year 10000.
 | 
					// Also amino panics when encoding times ≥ the start of year 10000.
 | 
				
			||||||
@ -115,7 +123,7 @@ type SurplusAuction struct {
 | 
				
			|||||||
func (a SurplusAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
					func (a SurplusAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
					// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
				
			||||||
func (a SurplusAuction) GetType() string { return "surplus" }
 | 
					func (a SurplusAuction) GetType() string { return SurplusAuctionType }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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.
 | 
				
			||||||
@ -125,7 +133,7 @@ func (a SurplusAuction) GetModuleAccountCoins() sdk.Coins {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetPhase returns the direction of a surplus auction, which never changes.
 | 
					// GetPhase returns the direction of a surplus auction, which never changes.
 | 
				
			||||||
func (a SurplusAuction) GetPhase() string { return "forward" }
 | 
					func (a SurplusAuction) GetPhase() string { return ForwardAuctionPhase }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewSurplusAuction returns a new surplus auction.
 | 
					// NewSurplusAuction returns a new surplus auction.
 | 
				
			||||||
func NewSurplusAuction(seller string, lot sdk.Coin, bidDenom string, endTime time.Time) SurplusAuction {
 | 
					func NewSurplusAuction(seller string, lot sdk.Coin, bidDenom string, endTime time.Time) SurplusAuction {
 | 
				
			||||||
@ -154,7 +162,7 @@ type DebtAuction struct {
 | 
				
			|||||||
func (a DebtAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
					func (a DebtAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
					// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
				
			||||||
func (a DebtAuction) GetType() string { return "debt" }
 | 
					func (a DebtAuction) GetType() string { return DebtAuctionType }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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.
 | 
				
			||||||
@ -165,7 +173,7 @@ func (a DebtAuction) GetModuleAccountCoins() sdk.Coins {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetPhase returns the direction of a debt auction, which never changes.
 | 
					// GetPhase returns the direction of a debt auction, which never changes.
 | 
				
			||||||
func (a DebtAuction) GetPhase() string { return "reverse" }
 | 
					func (a DebtAuction) GetPhase() string { return ReverseAuctionPhase }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the DebtAuction fields values.
 | 
					// Validate validates the DebtAuction fields values.
 | 
				
			||||||
func (a DebtAuction) Validate() error {
 | 
					func (a DebtAuction) Validate() error {
 | 
				
			||||||
@ -213,7 +221,7 @@ type CollateralAuction struct {
 | 
				
			|||||||
func (a CollateralAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
					func (a CollateralAuction) WithID(id uint64) Auction { a.ID = id; return a }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
					// GetType returns the auction type. Used to identify auctions in event attributes.
 | 
				
			||||||
func (a CollateralAuction) GetType() string { return "collateral" }
 | 
					func (a CollateralAuction) GetType() string { return CollateralAuctionType }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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.
 | 
				
			||||||
@ -231,9 +239,9 @@ func (a CollateralAuction) IsReversePhase() bool {
 | 
				
			|||||||
// GetPhase returns the direction of a collateral auction.
 | 
					// GetPhase returns the direction of a collateral auction.
 | 
				
			||||||
func (a CollateralAuction) GetPhase() string {
 | 
					func (a CollateralAuction) GetPhase() string {
 | 
				
			||||||
	if a.IsReversePhase() {
 | 
						if a.IsReversePhase() {
 | 
				
			||||||
		return "reverse"
 | 
							return ReverseAuctionPhase
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return "forward"
 | 
						return ForwardAuctionPhase
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the CollateralAuction fields values.
 | 
					// Validate validates the CollateralAuction fields values.
 | 
				
			||||||
 | 
				
			|||||||
@ -16,15 +16,21 @@ type QueryAuctionParams struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// QueryAllAuctionParams is the params for an auctions query
 | 
					// QueryAllAuctionParams is the params for an auctions query
 | 
				
			||||||
type QueryAllAuctionParams struct {
 | 
					type QueryAllAuctionParams struct {
 | 
				
			||||||
	Page  int `json:"page" yaml:"page"`
 | 
						Page  int    `json:"page" yaml:"page"`
 | 
				
			||||||
	Limit int `json:"limit" yaml:"limit"`
 | 
						Limit int    `json:"limit" yaml:"limit"`
 | 
				
			||||||
 | 
						Type  string `json:"type" yaml:"type"`
 | 
				
			||||||
 | 
						Denom string `json:"denom" yaml:"denom"`
 | 
				
			||||||
 | 
						Phase string `json:"phase" yaml:"phase"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewQueryAllAuctionParams creates a new QueryAllAuctionParams
 | 
					// NewQueryAllAuctionParams creates a new QueryAllAuctionParams
 | 
				
			||||||
func NewQueryAllAuctionParams(page int, limit int) QueryAllAuctionParams {
 | 
					func NewQueryAllAuctionParams(page, limit int, aucType, aucDenom, aucPhase string) QueryAllAuctionParams {
 | 
				
			||||||
	return QueryAllAuctionParams{
 | 
						return QueryAllAuctionParams{
 | 
				
			||||||
		Page:  page,
 | 
							Page:  page,
 | 
				
			||||||
		Limit: limit,
 | 
							Limit: limit,
 | 
				
			||||||
 | 
							Type:  aucType,
 | 
				
			||||||
 | 
							Denom: aucDenom,
 | 
				
			||||||
 | 
							Phase: aucPhase,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -124,7 +124,7 @@ func queryGetParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]by
 | 
				
			|||||||
	return bz, nil
 | 
						return bz, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getAtomicSwapsFiltered retrieves atomic swaps filtered by a given set of params.
 | 
					// filterAtomicSwaps retrieves atomic swaps filtered by a given set of params.
 | 
				
			||||||
// If no filters are provided, all atomic swaps will be returned in paginated form.
 | 
					// If no filters are provided, all atomic swaps will be returned in paginated form.
 | 
				
			||||||
func filterAtomicSwaps(ctx sdk.Context, swaps types.AtomicSwaps, params types.QueryAtomicSwaps) types.AtomicSwaps {
 | 
					func filterAtomicSwaps(ctx sdk.Context, swaps types.AtomicSwaps, params types.QueryAtomicSwaps) types.AtomicSwaps {
 | 
				
			||||||
	filteredSwaps := make(types.AtomicSwaps, 0, len(swaps))
 | 
						filteredSwaps := make(types.AtomicSwaps, 0, len(swaps))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user