Skip to content

Commit

Permalink
client: check for zero fiat rates and response status code
Browse files Browse the repository at this point in the history
This increases the request interval for fiat rates to 12min due to a
possibility of hitting source's request limits. This can be considered a
temporary solution since we need to adjust this interval for every added
asset.

This also checks the HTTP response status code instead of assuming
the response is the expected payload.
  • Loading branch information
ukane-philemon authored Nov 30, 2022
1 parent cf6d205 commit 75bb91d
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
12 changes: 6 additions & 6 deletions client/core/bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ func oracleMarketReport(ctx context.Context, b, q *SupportedAsset, log dex.Logge
// running on the same market.
var rawMarkets []*coinpapMarket
url := fmt.Sprintf("https://api.coinpaprika.com/v1/coins/%s/markets", baseSlug)
if err := getInto(ctx, url, &rawMarkets); err != nil {
if err := getRates(ctx, url, &rawMarkets); err != nil {
return nil, err
}

Expand Down Expand Up @@ -1657,7 +1657,7 @@ func fetchBinanceSpread(ctx context.Context, baseSymbol, quoteSymbol string) (se
BidPrice float64 `json:"bidPrice,string"`
AskPrice float64 `json:"askPrice,string"`
}
return resp.AskPrice, resp.BidPrice, getInto(ctx, url, &resp)
return resp.AskPrice, resp.BidPrice, getRates(ctx, url, &resp)
}

func fetchCoinbaseSpread(ctx context.Context, baseSymbol, quoteSymbol string) (sell, buy float64, err error) {
Expand All @@ -1669,7 +1669,7 @@ func fetchCoinbaseSpread(ctx context.Context, baseSymbol, quoteSymbol string) (s
Bid float64 `json:"bid,string"`
}

return resp.Ask, resp.Bid, getInto(ctx, url, &resp)
return resp.Ask, resp.Bid, getRates(ctx, url, &resp)
}

func fetchBittrexSpread(ctx context.Context, baseSymbol, quoteSymbol string) (sell, buy float64, err error) {
Expand All @@ -1679,7 +1679,7 @@ func fetchBittrexSpread(ctx context.Context, baseSymbol, quoteSymbol string) (se
AskRate float64 `json:"askRate,string"`
BidRate float64 `json:"bidRate,string"`
}
return resp.AskRate, resp.BidRate, getInto(ctx, url, &resp)
return resp.AskRate, resp.BidRate, getRates(ctx, url, &resp)
}

func fetchHitBTCSpread(ctx context.Context, baseSymbol, quoteSymbol string) (sell, buy float64, err error) {
Expand All @@ -1690,7 +1690,7 @@ func fetchHitBTCSpread(ctx context.Context, baseSymbol, quoteSymbol string) (sel
Ask [][2]json.Number `json:"ask"`
Bid [][2]json.Number `json:"bid"`
}
if err := getInto(ctx, url, &resp); err != nil {
if err := getRates(ctx, url, &resp); err != nil {
return 0, 0, err
}
if len(resp.Ask) < 1 || len(resp.Bid) < 1 {
Expand Down Expand Up @@ -1719,7 +1719,7 @@ func fetchEXMOSpread(ctx context.Context, baseSymbol, quoteSymbol string) (sell,
BidTop float64 `json:"bid_top,string"`
}

if err := getInto(ctx, url, &resp); err != nil {
if err := getRates(ctx, url, &resp); err != nil {
return 0, 0, err
}

Expand Down
2 changes: 1 addition & 1 deletion client/core/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -9063,7 +9063,7 @@ func (c *Core) fiatConversions() map[uint32]float64 {
var sources int
for _, source := range c.fiatRateSources {
rateInfo := source.assetRate(assetID)
if rateInfo != nil && time.Since(rateInfo.lastUpdate) < fiatRateDataExpiry {
if rateInfo != nil && time.Since(rateInfo.lastUpdate) < fiatRateDataExpiry && rateInfo.rate > 0 {
sources++
rateSum += rateInfo.rate
}
Expand Down
17 changes: 12 additions & 5 deletions client/core/exchangeratefetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const (
// DefaultFiatCurrency is the currency for displaying assets fiat value.
DefaultFiatCurrency = "USD"
// fiatRateRequestInterval is the amount of time between calls to the exchange API.
fiatRateRequestInterval = 5 * time.Minute
fiatRateRequestInterval = 12 * time.Minute
// fiatRateDataExpiry : Any data older than fiatRateDataExpiry will be discarded.
fiatRateDataExpiry = 60 * time.Minute

Expand Down Expand Up @@ -96,6 +96,9 @@ func (source *commonRateSource) refreshRates(ctx context.Context, logger dex.Log
source.mtx.Lock()
defer source.mtx.Unlock()
for assetID, fiatRate := range fiatRates {
if fiatRate <= 0 {
continue
}
source.fiatRates[assetID] = &fiatRateInfo{
rate: fiatRate,
lastUpdate: now,
Expand Down Expand Up @@ -132,7 +135,7 @@ func fetchCoinpaprikaRates(ctx context.Context, log dex.Logger, assets map[uint3

reqStr := fmt.Sprintf(coinpaprikaURL, coinpapSlug(sa.Symbol, sa.Info.Name))

if err := getInto(ctx, reqStr, res); err != nil {
if err := getRates(ctx, reqStr, res); err != nil {
log.Error(err)
continue
}
Expand All @@ -159,7 +162,7 @@ func fetchDcrdataRates(ctx context.Context, log dex.Logger, assets map[uint32]*S
BtcPrice float64 `json:"btcPrice"`
})

if err := getInto(ctx, dcrDataURL, res); err != nil {
if err := getRates(ctx, dcrDataURL, res); err != nil {
log.Error(err)
return nil
}
Expand Down Expand Up @@ -196,7 +199,7 @@ func fetchMessariRates(ctx context.Context, log dex.Logger, assets map[uint32]*S
slug := strings.ToLower(asset.Symbol)
reqStr := fmt.Sprintf(messariURL, slug)

if err := getInto(ctx, reqStr, res); err != nil {
if err := getRates(ctx, reqStr, res); err != nil {
log.Error(err)
continue
}
Expand All @@ -212,7 +215,7 @@ func coinpapSlug(symbol, name string) string {
return strings.ToLower(strings.ReplaceAll(slug, " ", "-"))
}

func getInto(ctx context.Context, url string, thing interface{}) error {
func getRates(ctx context.Context, url string, thing interface{}) error {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return err
Expand All @@ -224,6 +227,10 @@ func getInto(ctx context.Context, url string, thing interface{}) error {
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
return fmt.Errorf("unexpected response, got status code %d", resp.StatusCode)
}

reader := io.LimitReader(resp.Body, 1<<20)
return json.NewDecoder(reader).Decode(thing)
}

0 comments on commit 75bb91d

Please sign in to comment.