From bf031aa3ad03c13f409fc16566fcaab2f7271584 Mon Sep 17 00:00:00 2001 From: rbajollari Date: Sun, 22 Jan 2023 13:38:35 -0500 Subject: [PATCH 1/6] Fix GetTickerPrice() and GetCandlePrices() in providers --- oracle/provider/binance.go | 36 ++++++++++++++++--- oracle/provider/binance_test.go | 2 +- oracle/provider/bitget.go | 44 ++++++++++++++++++----- oracle/provider/bitget_test.go | 4 +-- oracle/provider/coinbase.go | 40 +++++++++++++++------ oracle/provider/coinbase_test.go | 2 +- oracle/provider/crypto.go | 36 +++++++++++++++---- oracle/provider/crypto_test.go | 4 +-- oracle/provider/gate.go | 59 ++++++++++++++++++++++--------- oracle/provider/gate_test.go | 2 +- oracle/provider/huobi.go | 44 ++++++++++++++++++----- oracle/provider/huobi_test.go | 2 +- oracle/provider/kraken.go | 49 ++++++++++++++++++------- oracle/provider/kraken_test.go | 2 +- oracle/provider/mexc.go | 28 ++++++++++++--- oracle/provider/mexc_test.go | 2 +- oracle/provider/okx.go | 50 +++++++++++++++++++------- oracle/provider/okx_test.go | 2 +- oracle/provider/osmosisv2.go | 28 ++++++++++++--- oracle/provider/osmosisv2_test.go | 4 +-- oracle/types/errors.go | 10 +++--- 21 files changed, 348 insertions(+), 102 deletions(-) diff --git a/oracle/provider/binance.go b/oracle/provider/binance.go index 1be8aa26..4d08253e 100644 --- a/oracle/provider/binance.go +++ b/oracle/provider/binance.go @@ -179,15 +179,25 @@ func (p *BinanceProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) erro func (p *BinanceProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := cp.String() price, err := p.getTickerPrice(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[key] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -195,15 +205,25 @@ func (p *BinanceProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[stri func (p *BinanceProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := cp.String() prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } candlePrices[key] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -213,7 +233,11 @@ func (p *BinanceProvider) getTickerPrice(key string) (types.TickerPrice, error) ticker, ok := p.tickers[key] if !ok { - return types.TickerPrice{}, fmt.Errorf("binance failed to get ticker price for %s", key) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + key, + ) } return ticker.toTickerPrice() @@ -225,7 +249,11 @@ func (p *BinanceProvider) getCandlePrices(key string) ([]types.CandlePrice, erro candles, ok := p.candles[key] if !ok { - return []types.CandlePrice{}, fmt.Errorf("binance failed to get candle prices for %s", key) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + key, + ) } candleList := []types.CandlePrice{} diff --git a/oracle/provider/binance_test.go b/oracle/provider/binance_test.go index 10d3cc6e..fa7d8bdb 100644 --- a/oracle/provider/binance_test.go +++ b/oracle/provider/binance_test.go @@ -74,7 +74,7 @@ func TestBinanceProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "binance failed to get ticker price for FOOBAR") + require.EqualError(t, err, "binance has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/bitget.go b/oracle/provider/bitget.go index 2df09c79..a41c24f6 100644 --- a/oracle/provider/bitget.go +++ b/oracle/provider/bitget.go @@ -182,33 +182,53 @@ func (p *BitgetProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *BitgetProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetCandlePrices returns the candlePrices based on the provided pairs. func (p *BitgetProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { - price, err := p.getCandlePrices(cp) + prices, err := p.getCandlePrices(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } - candlePrices[cp.String()] = price + candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -324,7 +344,11 @@ func (p *BitgetProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPric ticker, ok := p.tickers[cp.String()] if !ok { - return types.TickerPrice{}, fmt.Errorf("bitget failed to get ticker price for %s", cp.String()) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } return ticker.toTickerPrice() @@ -336,7 +360,11 @@ func (p *BitgetProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandleP candles, ok := p.candles[cp.String()] if !ok { - return []types.CandlePrice{}, fmt.Errorf("failed to get candles price for %s", cp.String()) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } candleList := []types.CandlePrice{} diff --git a/oracle/provider/bitget_test.go b/oracle/provider/bitget_test.go index ddf06341..f935e660 100644 --- a/oracle/provider/bitget_test.go +++ b/oracle/provider/bitget_test.go @@ -98,7 +98,7 @@ func TestBitgetProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "bitget failed to get ticker price for FOOBAR") + require.EqualError(t, err, "bitget has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } @@ -139,7 +139,7 @@ func TestBitgetProvider_GetCandlePrices(t *testing.T) { t.Run("invalid_request_invalid_candle", func(t *testing.T) { prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "failed to get candles price for FOOBAR") + require.EqualError(t, err, "bitget has no candle data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/coinbase.go b/oracle/provider/coinbase.go index 265b4c9b..d5a7e824 100644 --- a/oracle/provider/coinbase.go +++ b/oracle/provider/coinbase.go @@ -172,19 +172,28 @@ func (p *CoinbaseProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) err return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *CoinbaseProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) + tickerErrs := 0 + for _, cp := range pairs { + price, err := p.getTickerPrice(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } - - tickerPrices[currencyPair.String()] = price + tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -193,16 +202,23 @@ func (p *CoinbaseProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[str func (p *CoinbaseProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { tradeMap := make(map[string][]CoinbaseTrade, len(pairs)) + tradeErrs := 0 for _, cp := range pairs { key := currencyPairToCoinbasePair(cp) tradeSet, err := p.getTradePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tradeErrs++ + continue } tradeMap[key] = tradeSet } - if len(tradeMap) == 0 { - return nil, fmt.Errorf("no trades have been received") + if tradeErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) } candles := make(map[string][]types.CandlePrice) @@ -292,7 +308,11 @@ func (p *CoinbaseProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPr return tickerPair.toTickerPrice() } - return types.TickerPrice{}, fmt.Errorf("coinbase failed to get ticker price for %s", gp) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + gp, + ) } func (p *CoinbaseProvider) getTradePrices(key string) ([]CoinbaseTrade, error) { diff --git a/oracle/provider/coinbase_test.go b/oracle/provider/coinbase_test.go index 5e5b99e8..7aaa17ea 100644 --- a/oracle/provider/coinbase_test.go +++ b/oracle/provider/coinbase_test.go @@ -70,7 +70,7 @@ func TestCoinbaseProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "coinbase failed to get ticker price for FOO-BAR") + require.EqualError(t, err, "coinbase has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/crypto.go b/oracle/provider/crypto.go index 0de56c96..74d8d736 100644 --- a/oracle/provider/crypto.go +++ b/oracle/provider/crypto.go @@ -185,35 +185,59 @@ func (p *CryptoProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *CryptoProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := currencyPairToCryptoPair(cp) + fmt.Println( + "key:", + key, + ) price, err := p.getTickerPrice(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } -// GetCandlePrices returns the candlePrices based on the saved map +// GetCandlePrices returns the candlePrices based on the provided pairs. func (p *CryptoProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := currencyPairToCryptoPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -225,7 +249,7 @@ func (p *CryptoProvider) getTickerPrice(key string) (types.TickerPrice, error) { if !ok { return types.TickerPrice{}, fmt.Errorf( types.ErrTickerNotFound.Error(), - ProviderCrypto, + p.endpoints.Name, key, ) } @@ -241,7 +265,7 @@ func (p *CryptoProvider) getCandlePrices(key string) ([]types.CandlePrice, error if !ok { return []types.CandlePrice{}, fmt.Errorf( types.ErrCandleNotFound.Error(), - ProviderCrypto, + p.endpoints.Name, key, ) } diff --git a/oracle/provider/crypto_test.go b/oracle/provider/crypto_test.go index 99cb9fe6..5b5461ea 100644 --- a/oracle/provider/crypto_test.go +++ b/oracle/provider/crypto_test.go @@ -70,7 +70,7 @@ func TestCryptoProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) require.Error(t, err) - require.Equal(t, "crypto failed to get ticker price for FOO_BAR", err.Error()) + require.Equal(t, "crypto has no ticker data for requested pairs: [FOOBAR]", err.Error()) require.Nil(t, prices) }) } @@ -110,7 +110,7 @@ func TestCryptoProvider_GetCandlePrices(t *testing.T) { t.Run("invalid_request_invalid_candle", func(t *testing.T) { prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "crypto failed to get candle price for FOO_BAR") + require.EqualError(t, err, "crypto has no candle data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/gate.go b/oracle/provider/gate.go index 68ed23ef..ca15c7e8 100644 --- a/oracle/provider/gate.go +++ b/oracle/provider/gate.go @@ -181,46 +181,67 @@ func (p *GateProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *GateProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) + tickerErrs := 0 + for _, cp := range pairs { + price, err := p.getTickerPrice(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } - - tickerPrices[currencyPair.String()] = price + tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } -// GetCandlePrices returns the candlePrices based on the saved map +// GetCandlePrices returns the candlePrices based on the provided pairs. func (p *GateProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - for _, currencyPair := range pairs { - gp := currencyPairToGatePair(currencyPair) - price, err := p.getCandlePrices(gp) + candleErrs := 0 + for _, cp := range pairs { + prices, err := p.getCandlePrices(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } - - candlePrices[currencyPair.String()] = price + candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } -func (p *GateProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { +func (p *GateProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePrice, error) { p.mtx.RLock() defer p.mtx.RUnlock() - candles, ok := p.candles[key] + candles, ok := p.candles[cp.String()] if !ok { - return []types.CandlePrice{}, fmt.Errorf("gate failed to get candle prices for %s", key) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } candleList := []types.CandlePrice{} @@ -245,7 +266,11 @@ func (p *GateProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, return tickerPair.toTickerPrice() } - return types.TickerPrice{}, fmt.Errorf("gate failed to get ticker price for %s", gp) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } func (p *GateProvider) messageReceived(messageType int, bz []byte) { diff --git a/oracle/provider/gate_test.go b/oracle/provider/gate_test.go index a65c3501..6a6541bf 100644 --- a/oracle/provider/gate_test.go +++ b/oracle/provider/gate_test.go @@ -73,7 +73,7 @@ func TestGateProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "gate failed to get ticker price for FOO_BAR") + require.EqualError(t, err, "gate has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/huobi.go b/oracle/provider/huobi.go index 2d53f377..1284eab6 100644 --- a/oracle/provider/huobi.go +++ b/oracle/provider/huobi.go @@ -173,33 +173,53 @@ func (p *HuobiProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *HuobiProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetCandlePrices returns the candlePrices based on the provided pairs. func (p *HuobiProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { - price, err := p.getCandlePrices(cp) + prices, err := p.getCandlePrices(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } - candlePrices[cp.String()] = price + candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -310,7 +330,11 @@ func (p *HuobiProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice ticker, ok := p.tickers[currencyPairToHuobiTickerPair(cp)] if !ok { - return types.TickerPrice{}, fmt.Errorf("huobi failed to get ticker price for %s", cp.String()) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } return ticker.toTickerPrice() @@ -322,7 +346,11 @@ func (p *HuobiProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePr candles, ok := p.candles[currencyPairToHuobiCandlePair(cp)] if !ok { - return []types.CandlePrice{}, fmt.Errorf("failed to get candles price for %s", cp.String()) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + cp.String(), + ) } candleList := []types.CandlePrice{} diff --git a/oracle/provider/huobi_test.go b/oracle/provider/huobi_test.go index ec8e04e5..362ca0b4 100644 --- a/oracle/provider/huobi_test.go +++ b/oracle/provider/huobi_test.go @@ -86,7 +86,7 @@ func TestHuobiProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "huobi failed to get ticker price for FOOBAR") + require.EqualError(t, err, "huobi has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/kraken.go b/oracle/provider/kraken.go index c801b3b9..44d7e5bf 100644 --- a/oracle/provider/kraken.go +++ b/oracle/provider/kraken.go @@ -170,38 +170,59 @@ func (p *KrakenProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error return nil } -// GetTickerPrices returns the tickerPrices based on the saved map. +// GetTickerPrices returns the tickerPrices based on the provided pairs. func (p *KrakenProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := cp.String() - tickerPrice, ok := p.tickers[key] + price, ok := p.tickers[key] if !ok { - return nil, fmt.Errorf("kraken failed to get ticker price for %s", key) + p.logger.Error().Err(fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + key, + )) + tickerErrs++ + continue } - tickerPrices[key] = tickerPrice + tickerPrices[key] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } -// GetCandlePrices returns the candlePrices based on the saved map. +// GetCandlePrices returns the candlePrices based on the provided pairs. func (p *KrakenProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := cp.String() - candlePrice, err := p.getCandlePrices(key) + prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } - candlePrices[key] = candlePrice + candlePrices[key] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -221,7 +242,11 @@ func (p *KrakenProvider) getCandlePrices(key string) ([]types.CandlePrice, error candles, ok := p.candles[key] if !ok { - return []types.CandlePrice{}, fmt.Errorf("kraken failed to get candle prices for %s", key) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + key, + ) } candleList := []types.CandlePrice{} diff --git a/oracle/provider/kraken_test.go b/oracle/provider/kraken_test.go index e5eb357a..7eb375c7 100644 --- a/oracle/provider/kraken_test.go +++ b/oracle/provider/kraken_test.go @@ -70,7 +70,7 @@ func TestKrakenProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "kraken failed to get ticker price for FOOBAR") + require.EqualError(t, err, "kraken has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/mexc.go b/oracle/provider/mexc.go index 32a9ed8b..c518487f 100644 --- a/oracle/provider/mexc.go +++ b/oracle/provider/mexc.go @@ -163,15 +163,25 @@ func (p *MexcProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { func (p *MexcProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := currencyPairToMexcPair(cp) price, err := p.getTickerPrice(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -179,15 +189,25 @@ func (p *MexcProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string] func (p *MexcProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := currencyPairToMexcPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -199,7 +219,7 @@ func (p *MexcProvider) getTickerPrice(key string) (types.TickerPrice, error) { if !ok { return types.TickerPrice{}, fmt.Errorf( types.ErrTickerNotFound.Error(), - ProviderMexc, + p.endpoints.Name, key, ) } @@ -215,7 +235,7 @@ func (p *MexcProvider) getCandlePrices(key string) ([]types.CandlePrice, error) if !ok { return []types.CandlePrice{}, fmt.Errorf( types.ErrCandleNotFound.Error(), - ProviderMexc, + p.endpoints.Name, key, ) } diff --git a/oracle/provider/mexc_test.go b/oracle/provider/mexc_test.go index e10008af..ccd5367c 100644 --- a/oracle/provider/mexc_test.go +++ b/oracle/provider/mexc_test.go @@ -71,7 +71,7 @@ func TestMexcProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) require.Error(t, err) - require.Equal(t, "mexc failed to get ticker price for FOO_BAR", err.Error()) + require.Equal(t, "mexc has no ticker data for requested pairs: [FOOBAR]", err.Error()) require.Nil(t, prices) }) } diff --git a/oracle/provider/okx.go b/oracle/provider/okx.go index e6a7550d..89a94be4 100644 --- a/oracle/provider/okx.go +++ b/oracle/provider/okx.go @@ -182,15 +182,24 @@ func (p *OkxProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { func (p *OkxProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) + tickerErrs := 0 + for _, cp := range pairs { + price, err := p.getTickerPrice(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } - - tickerPrices[currencyPair.String()] = price + tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -198,15 +207,24 @@ func (p *OkxProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]t func (p *OkxProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - for _, currencyPair := range pairs { - candles, err := p.getCandlePrices(currencyPair) + candleErrs := 0 + for _, cp := range pairs { + prices, err := p.getCandlePrices(cp) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } - - candlePrices[currencyPair.String()] = candles + candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -217,7 +235,11 @@ func (p *OkxProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, instrumentID := currencyPairToOkxPair(cp) tickerPair, ok := p.tickers[instrumentID] if !ok { - return types.TickerPrice{}, fmt.Errorf("okx failed to get ticker price for %s", instrumentID) + return types.TickerPrice{}, fmt.Errorf( + types.ErrTickerNotFound.Error(), + p.endpoints.Name, + instrumentID, + ) } return tickerPair.toTickerPrice() @@ -230,7 +252,11 @@ func (p *OkxProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePric instrumentID := currencyPairToOkxPair(cp) candles, ok := p.candles[instrumentID] if !ok { - return []types.CandlePrice{}, fmt.Errorf("okx failed to get candle prices for %s", instrumentID) + return []types.CandlePrice{}, fmt.Errorf( + types.ErrCandleNotFound.Error(), + p.endpoints.Name, + instrumentID, + ) } candleList := []types.CandlePrice{} for _, candle := range candles { diff --git a/oracle/provider/okx_test.go b/oracle/provider/okx_test.go index e259037d..0feef213 100644 --- a/oracle/provider/okx_test.go +++ b/oracle/provider/okx_test.go @@ -79,7 +79,7 @@ func TestOkxProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "okx failed to get ticker price for FOO-BAR") + require.EqualError(t, err, "okx has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/osmosisv2.go b/oracle/provider/osmosisv2.go index d62ad8f1..6ea7ae7f 100644 --- a/oracle/provider/osmosisv2.go +++ b/oracle/provider/osmosisv2.go @@ -126,15 +126,25 @@ func (p *OsmosisV2Provider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) er func (p *OsmosisV2Provider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := currencyPairToOsmosisV2Pair(cp) price, err := p.getTickerPrice(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -142,15 +152,25 @@ func (p *OsmosisV2Provider) GetTickerPrices(pairs ...types.CurrencyPair) (map[st func (p *OsmosisV2Provider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := currencyPairToOsmosisV2Pair(cp) prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -162,7 +182,7 @@ func (p *OsmosisV2Provider) getTickerPrice(key string) (types.TickerPrice, error if !ok { return types.TickerPrice{}, fmt.Errorf( types.ErrTickerNotFound.Error(), - ProviderOsmosisV2, + p.endpoints.Name, key, ) } @@ -178,7 +198,7 @@ func (p *OsmosisV2Provider) getCandlePrices(key string) ([]types.CandlePrice, er if !ok { return []types.CandlePrice{}, fmt.Errorf( types.ErrCandleNotFound.Error(), - ProviderOsmosisV2, + p.endpoints.Name, key, ) } diff --git a/oracle/provider/osmosisv2_test.go b/oracle/provider/osmosisv2_test.go index 39307086..fce247cd 100644 --- a/oracle/provider/osmosisv2_test.go +++ b/oracle/provider/osmosisv2_test.go @@ -70,7 +70,7 @@ func TestOsmosisV2Provider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) require.Error(t, err) - require.Equal(t, "osmosisv2 failed to get ticker price for FOO/BAR", err.Error()) + require.Equal(t, "osmosisv2 has no ticker data for requested pairs: [FOOBAR]", err.Error()) require.Nil(t, prices) }) } @@ -107,7 +107,7 @@ func TestOsmosisV2Provider_GetCandlePrices(t *testing.T) { t.Run("invalid_request_invalid_candle", func(t *testing.T) { prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "osmosisv2 failed to get candle price for FOO/BAR") + require.EqualError(t, err, "osmosisv2 has no candle data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/types/errors.go b/oracle/types/errors.go index 20b55046..2323aff9 100644 --- a/oracle/types/errors.go +++ b/oracle/types/errors.go @@ -12,9 +12,11 @@ var ( ErrMissingExchangeRate = sdkerrors.Register(ModuleName, 2, "missing exchange rate for %s") ErrTickerNotFound = sdkerrors.Register(ModuleName, 3, "%s failed to get ticker price for %s") ErrCandleNotFound = sdkerrors.Register(ModuleName, 4, "%s failed to get candle price for %s") + ErrNoTickers = sdkerrors.Register(ModuleName, 5, "%s has no ticker data for requested pairs: %v") + ErrNoCandles = sdkerrors.Register(ModuleName, 6, "%s has no candle data for requested pairs: %v") - ErrWebsocketDial = sdkerrors.Register(ModuleName, 5, "error connecting to %s websocket: %w") - ErrWebsocketClose = sdkerrors.Register(ModuleName, 6, "error closing %s websocket: %w") - ErrWebsocketSend = sdkerrors.Register(ModuleName, 7, "error sending to %s websocket: %w") - ErrWebsocketRead = sdkerrors.Register(ModuleName, 8, "error reading from %s websocket: %w") + ErrWebsocketDial = sdkerrors.Register(ModuleName, 7, "error connecting to %s websocket: %w") + ErrWebsocketClose = sdkerrors.Register(ModuleName, 8, "error closing %s websocket: %w") + ErrWebsocketSend = sdkerrors.Register(ModuleName, 9, "error sending to %s websocket: %w") + ErrWebsocketRead = sdkerrors.Register(ModuleName, 10, "error reading from %s websocket: %w") ) From b66e154060b66214b73dd1ed58910bccabf0f36f Mon Sep 17 00:00:00 2001 From: rbajollari Date: Tue, 24 Jan 2023 11:29:18 -0500 Subject: [PATCH 2/6] Fix get ticker and candle methods in polygon provider --- oracle/provider/binance_test.go | 2 +- oracle/provider/polygon.go | 28 ++++++++++++++++++++++++---- oracle/provider/polygon_test.go | 4 ++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/oracle/provider/binance_test.go b/oracle/provider/binance_test.go index c2fa9e24..dc7d2711 100644 --- a/oracle/provider/binance_test.go +++ b/oracle/provider/binance_test.go @@ -74,7 +74,7 @@ func TestBinanceProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "binance has no ticker data for requested pairs: [FOOBAR]") + require.EqualError(t, err, "binanceus has no ticker data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } diff --git a/oracle/provider/polygon.go b/oracle/provider/polygon.go index ba055d32..bf0cbf7a 100644 --- a/oracle/provider/polygon.go +++ b/oracle/provider/polygon.go @@ -184,15 +184,25 @@ func (p *PolygonProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) erro func (p *PolygonProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { tickerPrices := make(map[string]types.TickerPrice, len(pairs)) + tickerErrs := 0 for _, cp := range pairs { key := currencyPairToPolygonPair(cp) price, err := p.getTickerPrice(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + tickerErrs++ + continue } tickerPrices[cp.String()] = price } + if tickerErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoTickers.Error(), + p.endpoints.Name, + pairs, + ) + } return tickerPrices, nil } @@ -200,15 +210,25 @@ func (p *PolygonProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[stri func (p *PolygonProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { candlePrices := make(map[string][]types.CandlePrice, len(pairs)) + candleErrs := 0 for _, cp := range pairs { key := currencyPairToPolygonPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - return nil, err + p.logger.Error().Err(err) + candleErrs++ + continue } candlePrices[cp.String()] = prices } + if candleErrs == len(pairs) { + return nil, fmt.Errorf( + types.ErrNoCandles.Error(), + p.endpoints.Name, + pairs, + ) + } return candlePrices, nil } @@ -220,7 +240,7 @@ func (p *PolygonProvider) getTickerPrice(key string) (types.TickerPrice, error) if !ok { return types.TickerPrice{}, fmt.Errorf( types.ErrTickerNotFound.Error(), - ProviderPolygon, + p.endpoints.Name, key, ) } @@ -236,7 +256,7 @@ func (p *PolygonProvider) getCandlePrices(key string) ([]types.CandlePrice, erro if !ok { return []types.CandlePrice{}, fmt.Errorf( types.ErrCandleNotFound.Error(), - ProviderPolygon, + p.endpoints.Name, key, ) } diff --git a/oracle/provider/polygon_test.go b/oracle/provider/polygon_test.go index 42932abf..730bf0b6 100644 --- a/oracle/provider/polygon_test.go +++ b/oracle/provider/polygon_test.go @@ -71,7 +71,7 @@ func TestPolygonProvider_GetTickerPrices(t *testing.T) { t.Run("invalid_request_invalid_ticker", func(t *testing.T) { prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) require.Error(t, err) - require.Equal(t, "polygon failed to get ticker price for FOO/BAR", err.Error()) + require.Equal(t, "polygon has no ticker data for requested pairs: [FOOBAR]", err.Error()) require.Nil(t, prices) }) } @@ -113,7 +113,7 @@ func TestPolygonProvider_GetCandlePrices(t *testing.T) { t.Run("invalid_request_invalid_candle", func(t *testing.T) { prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "polygon failed to get candle price for FOO/BAR") + require.EqualError(t, err, "polygon has no candle data for requested pairs: [FOOBAR]") require.Nil(t, prices) }) } From ad38f08e76fa7f2222c1271350f071b078ed434b Mon Sep 17 00:00:00 2001 From: rbajollari Date: Tue, 24 Jan 2023 13:33:08 -0500 Subject: [PATCH 3/6] Seperate commits configs --- README.md | 2 + oracle/provider/binance.go | 4 +- oracle/provider/bitget.go | 4 +- oracle/provider/coinbase.go | 4 +- oracle/provider/crypto.go | 4 +- oracle/provider/gate.go | 4 +- oracle/provider/huobi.go | 4 +- oracle/provider/kraken.go | 4 +- oracle/provider/mexc.go | 4 +- oracle/provider/okx.go | 4 +- oracle/provider/osmosisv2.go | 4 +- oracle/provider/polygon.go | 4 +- price-feeder.example.toml | 27 ------ price-feeder.example_forex.toml | 163 ++++++++++++++++++++++++++++++++ 14 files changed, 187 insertions(+), 49 deletions(-) create mode 100644 price-feeder.example_forex.toml diff --git a/README.md b/README.md index 61ddef5b..192365a4 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ In addition, it defines the oracle's keyring and feeder account information. The keyring's password is defined via environment variables or user input. More information on the keyring can be found [here](#keyring) Please see the [example configuration](price-feeder.example.toml) for more details. +Please see the [example configuration](price-feeder.example_forex.toml) for an example +configuration fetching Forex rates from [polygon.io](polygon.io) (premium API key required). ```shell $ price-feeder /path/to/price_feeder_config.toml diff --git a/oracle/provider/binance.go b/oracle/provider/binance.go index 8a0d4391..a2bf7d33 100644 --- a/oracle/provider/binance.go +++ b/oracle/provider/binance.go @@ -204,7 +204,7 @@ func (p *BinanceProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[stri key := cp.String() price, err := p.getTickerPrice(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -230,7 +230,7 @@ func (p *BinanceProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[stri key := cp.String() prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/bitget.go b/oracle/provider/bitget.go index ec0db039..5ff0d778 100644 --- a/oracle/provider/bitget.go +++ b/oracle/provider/bitget.go @@ -210,7 +210,7 @@ func (p *BitgetProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[strin for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -235,7 +235,7 @@ func (p *BitgetProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[strin for _, cp := range pairs { prices, err := p.getCandlePrices(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/coinbase.go b/oracle/provider/coinbase.go index 1775d615..c1a82e93 100644 --- a/oracle/provider/coinbase.go +++ b/oracle/provider/coinbase.go @@ -200,7 +200,7 @@ func (p *CoinbaseProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[str for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -227,7 +227,7 @@ func (p *CoinbaseProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[str key := currencyPairToCoinbasePair(cp) tradeSet, err := p.getTradePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tradeErrs++ continue } diff --git a/oracle/provider/crypto.go b/oracle/provider/crypto.go index 3539e216..7aac7d93 100644 --- a/oracle/provider/crypto.go +++ b/oracle/provider/crypto.go @@ -218,7 +218,7 @@ func (p *CryptoProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[strin ) price, err := p.getTickerPrice(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -244,7 +244,7 @@ func (p *CryptoProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[strin key := currencyPairToCryptoPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/gate.go b/oracle/provider/gate.go index a85f41e1..e5b777a2 100644 --- a/oracle/provider/gate.go +++ b/oracle/provider/gate.go @@ -209,7 +209,7 @@ func (p *GateProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string] for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -234,7 +234,7 @@ func (p *GateProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string] for _, cp := range pairs { prices, err := p.getCandlePrices(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/huobi.go b/oracle/provider/huobi.go index e0738fe9..8b68a5dd 100644 --- a/oracle/provider/huobi.go +++ b/oracle/provider/huobi.go @@ -201,7 +201,7 @@ func (p *HuobiProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -226,7 +226,7 @@ func (p *HuobiProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string for _, cp := range pairs { prices, err := p.getCandlePrices(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/kraken.go b/oracle/provider/kraken.go index 8656338d..827f02d6 100644 --- a/oracle/provider/kraken.go +++ b/oracle/provider/kraken.go @@ -199,7 +199,7 @@ func (p *KrakenProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[strin key := cp.String() price, ok := p.tickers[key] if !ok { - p.logger.Error().Err(fmt.Errorf( + p.logger.Warn().Err(fmt.Errorf( types.ErrTickerNotFound.Error(), p.endpoints.Name, key, @@ -229,7 +229,7 @@ func (p *KrakenProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[strin key := cp.String() prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/mexc.go b/oracle/provider/mexc.go index 467df16c..2b4c34d8 100644 --- a/oracle/provider/mexc.go +++ b/oracle/provider/mexc.go @@ -193,7 +193,7 @@ func (p *MexcProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string] key := currencyPairToMexcPair(cp) price, err := p.getTickerPrice(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -219,7 +219,7 @@ func (p *MexcProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string] key := currencyPairToMexcPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/okx.go b/oracle/provider/okx.go index 7e41f1b6..7633b401 100644 --- a/oracle/provider/okx.go +++ b/oracle/provider/okx.go @@ -206,7 +206,7 @@ func (p *OkxProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]t for _, cp := range pairs { price, err := p.getTickerPrice(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -231,7 +231,7 @@ func (p *OkxProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][ for _, cp := range pairs { prices, err := p.getCandlePrices(cp) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/osmosisv2.go b/oracle/provider/osmosisv2.go index ed2a78b2..96d4118f 100644 --- a/oracle/provider/osmosisv2.go +++ b/oracle/provider/osmosisv2.go @@ -151,7 +151,7 @@ func (p *OsmosisV2Provider) GetTickerPrices(pairs ...types.CurrencyPair) (map[st key := currencyPairToOsmosisV2Pair(cp) price, err := p.getTickerPrice(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -177,7 +177,7 @@ func (p *OsmosisV2Provider) GetCandlePrices(pairs ...types.CurrencyPair) (map[st key := currencyPairToOsmosisV2Pair(cp) prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/oracle/provider/polygon.go b/oracle/provider/polygon.go index bf0cbf7a..1277f02f 100644 --- a/oracle/provider/polygon.go +++ b/oracle/provider/polygon.go @@ -189,7 +189,7 @@ func (p *PolygonProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[stri key := currencyPairToPolygonPair(cp) price, err := p.getTickerPrice(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) tickerErrs++ continue } @@ -215,7 +215,7 @@ func (p *PolygonProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[stri key := currencyPairToPolygonPair(cp) prices, err := p.getCandlePrices(key) if err != nil { - p.logger.Error().Err(err) + p.logger.Warn().Err(err) candleErrs++ continue } diff --git a/price-feeder.example.toml b/price-feeder.example.toml index 1a35a59e..d00da714 100644 --- a/price-feeder.example.toml +++ b/price-feeder.example.toml @@ -107,27 +107,6 @@ providers = [ ] quote = "USDT" -[[currency_pairs]] -base = "EUR" -providers = [ - "polygon", -] -quote = "USD" - -[[currency_pairs]] -base = "JPY" -providers = [ - "polygon", -] -quote = "USD" - -[[currency_pairs]] -base = "MXN" -providers = [ - "polygon", -] -quote = "USD" - [account] address = "ojo1zypqa76je7pxsdwkfah6mu9a583sju6xzthge3" chain_id = "ojo-testnet" @@ -155,9 +134,3 @@ prometheus-retention-time = 100 name = "binance" rest = "https://api1.binance.com" websocket = "stream.binance.com:9443" - -[[provider_endpoints]] -name = "polygon" -rest = "https://api.polygon.io" -websocket = "socket.polygon.io" -apikey = "test" diff --git a/price-feeder.example_forex.toml b/price-feeder.example_forex.toml new file mode 100644 index 00000000..1a35a59e --- /dev/null +++ b/price-feeder.example_forex.toml @@ -0,0 +1,163 @@ +gas_adjustment = 1 + +[server] +listen_addr = "0.0.0.0:7171" +read_timeout = "20s" +verbose_cors = true +write_timeout = "20s" + +[[deviation_thresholds]] +base = "USDT" +threshold = "1.5" + +[[deviation_thresholds]] +base = "ATOM" +threshold = "1.5" + +[[deviation_thresholds]] +base = "USDC" +threshold = "1.5" + +[[deviation_thresholds]] +base = "CRO" +threshold = "1.5" + +[[deviation_thresholds]] +base = "DAI" +threshold = "2" + +[[deviation_thresholds]] +base = "ETH" +threshold = "2" + +[[deviation_thresholds]] +base = "WBTC" +threshold = "1.5" + +[[currency_pairs]] +base = "USDT" +providers = [ + "kraken", + "coinbase", + "binanceus", +] +quote = "USD" + +[[currency_pairs]] +base = "ATOM" +providers = [ + "okx", + "bitget", +] +quote = "USDT" + +[[currency_pairs]] +base = "ATOM" +providers = [ + "kraken", +] +quote = "USD" + +[[currency_pairs]] +base = "USDC" +providers = [ + "okx", + "bitget", + "kraken", +] +quote = "USDT" + +[[currency_pairs]] +base = "DAI" +providers = [ + "okx", + "bitget", + "huobi", +] +quote = "USDT" + +[[currency_pairs]] +base = "DAI" +providers = [ + "kraken", +] +quote = "USD" + +[[currency_pairs]] +base = "ETH" +providers = [ + "okx", + "bitget", +] +quote = "USDT" + +[[currency_pairs]] +base = "ETH" +providers = [ + "kraken", +] +quote = "USD" + +[[currency_pairs]] +base = "WBTC" +providers = [ + "okx", + "bitget", + "crypto", +] +quote = "USDT" + +[[currency_pairs]] +base = "EUR" +providers = [ + "polygon", +] +quote = "USD" + +[[currency_pairs]] +base = "JPY" +providers = [ + "polygon", +] +quote = "USD" + +[[currency_pairs]] +base = "MXN" +providers = [ + "polygon", +] +quote = "USD" + +[account] +address = "ojo1zypqa76je7pxsdwkfah6mu9a583sju6xzthge3" +chain_id = "ojo-testnet" +validator = "ojovaloper1zypqa76je7pxsdwkfah6mu9a583sju6x6tnq6w" + +[keyring] +backend = "test" +dir = "/Users/username/.ojo" + +[rpc] +grpc_endpoint = "localhost:9090" +rpc_timeout = "100ms" +tmrpc_endpoint = "http://localhost:26657" + +[telemetry] +enable-hostname = true +enable-hostname-label = true +enable-service-label = true +enabled = true +global-labels = [["chain_id", "ojo-testnet"]] +service-name = "price-feeder" +prometheus-retention-time = 100 + +[[provider_endpoints]] +name = "binance" +rest = "https://api1.binance.com" +websocket = "stream.binance.com:9443" + +[[provider_endpoints]] +name = "polygon" +rest = "https://api.polygon.io" +websocket = "socket.polygon.io" +apikey = "test" From 72f9b981ec95dd2d0ac1cad1ac5ea8be380872d6 Mon Sep 17 00:00:00 2001 From: rbajollari Date: Tue, 24 Jan 2023 13:36:00 -0500 Subject: [PATCH 4/6] Fix README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 192365a4..95b0fefb 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,8 @@ In addition, it defines the oracle's keyring and feeder account information. The keyring's password is defined via environment variables or user input. More information on the keyring can be found [here](#keyring) Please see the [example configuration](price-feeder.example.toml) for more details. -Please see the [example configuration](price-feeder.example_forex.toml) for an example -configuration fetching Forex rates from [polygon.io](polygon.io) (premium API key required). +Please see the [forex example configuration](price-feeder.example_forex.toml) for an example +configuration fetching Forex rates from polygon.io (premium API key required). ```shell $ price-feeder /path/to/price_feeder_config.toml From 2e676d676836fef2a75255e36f7885be5bbd8ce4 Mon Sep 17 00:00:00 2001 From: rbajollari Date: Fri, 27 Jan 2023 11:31:09 -0500 Subject: [PATCH 5/6] Update error codes --- oracle/types/errors.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/oracle/types/errors.go b/oracle/types/errors.go index 2323aff9..2a60108c 100644 --- a/oracle/types/errors.go +++ b/oracle/types/errors.go @@ -8,15 +8,15 @@ const ModuleName = "price-feeder" // Price feeder errors var ( - ErrProviderConnection = sdkerrors.Register(ModuleName, 1, "provider connection") - ErrMissingExchangeRate = sdkerrors.Register(ModuleName, 2, "missing exchange rate for %s") - ErrTickerNotFound = sdkerrors.Register(ModuleName, 3, "%s failed to get ticker price for %s") - ErrCandleNotFound = sdkerrors.Register(ModuleName, 4, "%s failed to get candle price for %s") - ErrNoTickers = sdkerrors.Register(ModuleName, 5, "%s has no ticker data for requested pairs: %v") - ErrNoCandles = sdkerrors.Register(ModuleName, 6, "%s has no candle data for requested pairs: %v") + ErrProviderConnection = sdkerrors.Register(ModuleName, 2, "provider connection") + ErrMissingExchangeRate = sdkerrors.Register(ModuleName, 3, "missing exchange rate for %s") + ErrTickerNotFound = sdkerrors.Register(ModuleName, 4, "%s failed to get ticker price for %s") + ErrCandleNotFound = sdkerrors.Register(ModuleName, 5, "%s failed to get candle price for %s") + ErrNoTickers = sdkerrors.Register(ModuleName, 6, "%s has no ticker data for requested pairs: %v") + ErrNoCandles = sdkerrors.Register(ModuleName, 7, "%s has no candle data for requested pairs: %v") - ErrWebsocketDial = sdkerrors.Register(ModuleName, 7, "error connecting to %s websocket: %w") - ErrWebsocketClose = sdkerrors.Register(ModuleName, 8, "error closing %s websocket: %w") - ErrWebsocketSend = sdkerrors.Register(ModuleName, 9, "error sending to %s websocket: %w") - ErrWebsocketRead = sdkerrors.Register(ModuleName, 10, "error reading from %s websocket: %w") + ErrWebsocketDial = sdkerrors.Register(ModuleName, 8, "error connecting to %s websocket: %w") + ErrWebsocketClose = sdkerrors.Register(ModuleName, 9, "error closing %s websocket: %w") + ErrWebsocketSend = sdkerrors.Register(ModuleName, 10, "error sending to %s websocket: %w") + ErrWebsocketRead = sdkerrors.Register(ModuleName, 11, "error reading from %s websocket: %w") ) From 3d6c3498e82d539345885fd18e9297307c1ba17d Mon Sep 17 00:00:00 2001 From: rbajollari Date: Fri, 27 Jan 2023 15:17:45 -0500 Subject: [PATCH 6/6] Review comments --- README.md | 2 - price-feeder.example_forex.toml | 163 -------------------------------- 2 files changed, 165 deletions(-) delete mode 100644 price-feeder.example_forex.toml diff --git a/README.md b/README.md index 95b0fefb..61ddef5b 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,6 @@ In addition, it defines the oracle's keyring and feeder account information. The keyring's password is defined via environment variables or user input. More information on the keyring can be found [here](#keyring) Please see the [example configuration](price-feeder.example.toml) for more details. -Please see the [forex example configuration](price-feeder.example_forex.toml) for an example -configuration fetching Forex rates from polygon.io (premium API key required). ```shell $ price-feeder /path/to/price_feeder_config.toml diff --git a/price-feeder.example_forex.toml b/price-feeder.example_forex.toml deleted file mode 100644 index 1a35a59e..00000000 --- a/price-feeder.example_forex.toml +++ /dev/null @@ -1,163 +0,0 @@ -gas_adjustment = 1 - -[server] -listen_addr = "0.0.0.0:7171" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[deviation_thresholds]] -base = "USDT" -threshold = "1.5" - -[[deviation_thresholds]] -base = "ATOM" -threshold = "1.5" - -[[deviation_thresholds]] -base = "USDC" -threshold = "1.5" - -[[deviation_thresholds]] -base = "CRO" -threshold = "1.5" - -[[deviation_thresholds]] -base = "DAI" -threshold = "2" - -[[deviation_thresholds]] -base = "ETH" -threshold = "2" - -[[deviation_thresholds]] -base = "WBTC" -threshold = "1.5" - -[[currency_pairs]] -base = "USDT" -providers = [ - "kraken", - "coinbase", - "binanceus", -] -quote = "USD" - -[[currency_pairs]] -base = "ATOM" -providers = [ - "okx", - "bitget", -] -quote = "USDT" - -[[currency_pairs]] -base = "ATOM" -providers = [ - "kraken", -] -quote = "USD" - -[[currency_pairs]] -base = "USDC" -providers = [ - "okx", - "bitget", - "kraken", -] -quote = "USDT" - -[[currency_pairs]] -base = "DAI" -providers = [ - "okx", - "bitget", - "huobi", -] -quote = "USDT" - -[[currency_pairs]] -base = "DAI" -providers = [ - "kraken", -] -quote = "USD" - -[[currency_pairs]] -base = "ETH" -providers = [ - "okx", - "bitget", -] -quote = "USDT" - -[[currency_pairs]] -base = "ETH" -providers = [ - "kraken", -] -quote = "USD" - -[[currency_pairs]] -base = "WBTC" -providers = [ - "okx", - "bitget", - "crypto", -] -quote = "USDT" - -[[currency_pairs]] -base = "EUR" -providers = [ - "polygon", -] -quote = "USD" - -[[currency_pairs]] -base = "JPY" -providers = [ - "polygon", -] -quote = "USD" - -[[currency_pairs]] -base = "MXN" -providers = [ - "polygon", -] -quote = "USD" - -[account] -address = "ojo1zypqa76je7pxsdwkfah6mu9a583sju6xzthge3" -chain_id = "ojo-testnet" -validator = "ojovaloper1zypqa76je7pxsdwkfah6mu9a583sju6x6tnq6w" - -[keyring] -backend = "test" -dir = "/Users/username/.ojo" - -[rpc] -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" -tmrpc_endpoint = "http://localhost:26657" - -[telemetry] -enable-hostname = true -enable-hostname-label = true -enable-service-label = true -enabled = true -global-labels = [["chain_id", "ojo-testnet"]] -service-name = "price-feeder" -prometheus-retention-time = 100 - -[[provider_endpoints]] -name = "binance" -rest = "https://api1.binance.com" -websocket = "stream.binance.com:9443" - -[[provider_endpoints]] -name = "polygon" -rest = "https://api.polygon.io" -websocket = "socket.polygon.io" -apikey = "test"