diff --git a/feeder/priceprovider/sources/bybit.go b/feeder/priceprovider/sources/bybit.go index 1792ca4..7a04009 100644 --- a/feeder/priceprovider/sources/bybit.go +++ b/feeder/priceprovider/sources/bybit.go @@ -2,9 +2,11 @@ package sources import ( "encoding/json" + "fmt" "io" "net/http" "strconv" + "strings" "github.com/NibiruChain/nibiru/x/common/set" "github.com/NibiruChain/pricefeeder/metrics" @@ -27,6 +29,8 @@ type BybitResponse struct { } `json:"result"` } +const ErrBybitBlockAccess = "configured to block access from your country" + // BybitPriceUpdate returns the prices for given symbols or an error. // Uses BYBIT API at https://bybit-exchange.github.io/docs/v5/market/tickers. func BybitPriceUpdate(symbols set.Set[types.Symbol], logger zerolog.Logger) (rawPrices map[types.Symbol]float64, err error) { @@ -40,7 +44,7 @@ func BybitPriceUpdate(symbols set.Set[types.Symbol], logger zerolog.Logger) (raw } defer resp.Body.Close() - b, err := io.ReadAll(resp.Body) + respBody, err := io.ReadAll(resp.Body) if err != nil { logger.Err(err).Msg("failed to read response body from Bybit") metrics.PriceSourceCounter.WithLabelValues(Bybit, "false").Inc() @@ -48,8 +52,11 @@ func BybitPriceUpdate(symbols set.Set[types.Symbol], logger zerolog.Logger) (raw } var response BybitResponse - err = json.Unmarshal(b, &response) + err = json.Unmarshal(respBody, &response) if err != nil { + if strings.Contains(string(respBody), ErrBybitBlockAccess) { + err = fmt.Errorf("%s: %w", ErrBybitBlockAccess, err) + } logger.Err(err).Msg("failed to unmarshal response body from Bybit") metrics.PriceSourceCounter.WithLabelValues(Bybit, "false").Inc() return nil, err diff --git a/feeder/priceprovider/sources/bybit_test.go b/feeder/priceprovider/sources/bybit_test.go index b9d58f2..d72fa76 100644 --- a/feeder/priceprovider/sources/bybit_test.go +++ b/feeder/priceprovider/sources/bybit_test.go @@ -13,6 +13,10 @@ import ( func TestBybitPriceUpdate(t *testing.T) { t.Run("success", func(t *testing.T) { rawPrices, err := BybitPriceUpdate(set.New[types.Symbol]("BTCUSDT", "ETHUSDT"), zerolog.New(io.Discard)) + if err != nil { + require.ErrorContains(t, err, ErrBybitBlockAccess) + return + } require.NoError(t, err) require.Equal(t, 2, len(rawPrices)) require.NotZero(t, rawPrices["BTCUSDT"])