From 099ffa1a603b0f95c8f5460ec402110c11152167 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara-Reid Date: Wed, 20 Oct 2021 15:45:06 +1100 Subject: [PATCH] stream/websocket: Consolidate fields by using exchange config pointer (#809) * stream: add exchange config pointer to setup WebsocketSetup struct to reduce and consolidate setting of variables. * config: reduce stutter * config: reduce minor stutter * glorious: nits addr. * Update exchanges/stream/websocket.go Co-authored-by: Scott * websocket: implement fix * engine/helpers: fix test * exchanges: fix after merge issues * exchange_template: fix output Co-authored-by: Scott --- backtester/backtest/backtest_test.go | 2 +- cmd/config_builder/builder.go | 4 +- cmd/exchange_template/exchange_template.go | 8 +- cmd/exchange_template/wrapper_file.tmpl | 69 ++++---- config/config.go | 14 +- config/config_test.go | 50 +++--- config/config_types.go | 12 +- docs/ADD_NEW_EXCHANGE.md | 38 ++-- engine/engine.go | 2 +- engine/engine_test.go | 4 +- engine/helpers_test.go | 8 +- engine/order_manager_test.go | 2 +- engine/rpcserver_test.go | 2 +- exchanges/alphapoint/alphapoint_wrapper.go | 2 +- exchanges/binance/binance_wrapper.go | 33 ++-- exchanges/bitfinex/bitfinex_wrapper.go | 31 ++-- exchanges/bitflyer/bitflyer_wrapper.go | 6 +- exchanges/bithumb/bithumb_wrapper.go | 27 ++- exchanges/bitmex/bitmex_wrapper.go | 30 ++-- exchanges/bitstamp/bitstamp_wrapper.go | 29 ++-- exchanges/bittrex/bittrex_wrapper.go | 33 ++-- exchanges/btcmarkets/btcmarkets_wrapper.go | 29 ++-- exchanges/btse/btse_wrapper.go | 29 ++-- exchanges/coinbasepro/coinbasepro_wrapper.go | 31 ++-- exchanges/coinbene/coinbene_wrapper.go | 31 ++-- exchanges/coinut/coinut_wrapper.go | 33 ++-- exchanges/exchange.go | 6 +- exchanges/exchange_test.go | 49 +++--- exchanges/exchange_types.go | 2 +- exchanges/exmo/exmo_wrapper.go | 6 +- exchanges/ftx/ftx_wrapper.go | 29 ++-- exchanges/gateio/gateio_wrapper.go | 27 ++- exchanges/gemini/gemini_wrapper.go | 29 ++-- exchanges/hitbtc/hitbtc_wrapper.go | 33 ++-- exchanges/huobi/huobi_wrapper.go | 31 ++-- exchanges/interfaces.go | 4 +- exchanges/itbit/itbit_wrapper.go | 6 +- exchanges/kraken/kraken_wrapper.go | 31 ++-- exchanges/lbank/lbank_wrapper.go | 6 +- .../localbitcoins/localbitcoins_wrapper.go | 6 +- exchanges/okcoin/okcoin_wrapper.go | 4 +- exchanges/okex/okex_wrapper.go | 4 +- exchanges/okgroup/okgroup_wrapper.go | 25 +-- exchanges/poloniex/poloniex_wrapper.go | 33 ++-- exchanges/sharedtestvalues/customex.go | 4 +- exchanges/stream/buffer/buffer.go | 38 ++-- exchanges/stream/buffer/buffer_test.go | 40 +++-- exchanges/stream/websocket.go | 106 +++++++----- exchanges/stream/websocket_test.go | 162 +++++++++++------- exchanges/stream/websocket_types.go | 28 ++- exchanges/yobit/yobit_wrapper.go | 6 +- exchanges/zb/zb_mock_test.go | 2 +- exchanges/zb/zb_wrapper.go | 27 ++- 53 files changed, 611 insertions(+), 692 deletions(-) diff --git a/backtester/backtest/backtest_test.go b/backtester/backtest/backtest_test.go index 15150933..170d8b9f 100644 --- a/backtester/backtest/backtest_test.go +++ b/backtester/backtest/backtest_test.go @@ -51,7 +51,7 @@ func TestMain(m *testing.M) { func newBotWithExchange() *engine.Engine { bot := &engine.Engine{ Config: &gctconfig.Config{ - Exchanges: []gctconfig.ExchangeConfig{ + Exchanges: []gctconfig.Exchange{ { Name: testExchange, Enabled: true, diff --git a/cmd/config_builder/builder.go b/cmd/config_builder/builder.go index 03af1cca..717c5681 100644 --- a/cmd/config_builder/builder.go +++ b/cmd/config_builder/builder.go @@ -30,10 +30,10 @@ func main() { wg.Wait() log.Println("Done.") - var cfgs []config.ExchangeConfig + var cfgs []config.Exchange exchanges := engine.Bot.GetExchanges() for x := range exchanges { - var cfg *config.ExchangeConfig + var cfg *config.Exchange cfg, err = exchanges[x].GetDefaultConfig() if err != nil { log.Printf("Failed to get exchanges default config. Err: %s", err) diff --git a/cmd/exchange_template/exchange_template.go b/cmd/exchange_template/exchange_template.go index 38c832fe..1edb0b02 100644 --- a/cmd/exchange_template/exchange_template.go +++ b/cmd/exchange_template/exchange_template.go @@ -93,7 +93,7 @@ func main() { exchangeDirectory := filepath.Join(targetPath, exch.Name) configTestFile := config.GetConfig() - var newConfig *config.ExchangeConfig + var newConfig *config.Exchange newConfig, err = makeExchange(exchangeDirectory, configTestFile, &exch) if err != nil { log.Fatal(err) @@ -122,7 +122,7 @@ func checkExchangeName(exchName string) error { return nil } -func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch *exchange) (*config.ExchangeConfig, error) { +func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch *exchange) (*config.Exchange, error) { err := configTestFile.LoadConfig(exchangeConfigPath, true) if err != nil { return nil, err @@ -147,7 +147,7 @@ func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch exch.CapitalName = strings.Title(exch.Name) exch.Variable = exch.Name[0:2] - newExchConfig := &config.ExchangeConfig{} + newExchConfig := &config.Exchange{} newExchConfig.Name = exch.CapitalName newExchConfig.Enabled = true newExchConfig.API.Credentials.Key = "Key" @@ -229,7 +229,7 @@ func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch return newExchConfig, nil } -func saveConfig(exchangeDirectory string, configTestFile *config.Config, newExchConfig *config.ExchangeConfig) error { +func saveConfig(exchangeDirectory string, configTestFile *config.Config, newExchConfig *config.Exchange) error { cmd := exec.Command("go", "fmt") cmd.Dir = exchangeDirectory out, err := cmd.Output() diff --git a/cmd/exchange_template/wrapper_file.tmpl b/cmd/exchange_template/wrapper_file.tmpl index 7d555a2f..3175dee9 100644 --- a/cmd/exchange_template/wrapper_file.tmpl +++ b/cmd/exchange_template/wrapper_file.tmpl @@ -3,6 +3,7 @@ package {{.Name}} import ( "sync" + "context" "time" "github.com/thrasher-corp/gocryptotrader/common" @@ -11,6 +12,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/deposit" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -24,9 +26,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.ExchangeConfig, error) { +func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.Exchange, error) { {{.Variable}}.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = {{.Variable}}.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = {{.Variable}}.BaseCurrencies @@ -34,7 +36,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.ExchangeConfi {{.Variable}}.SetupDefaults(exchCfg) if {{.Variable}}.Features.Supports.RESTCapabilities.AutoPairUpdates { - err := {{.Variable}}.UpdateTradablePairs(true) + err := {{.Variable}}.UpdateTradablePairs(context.TODO(), true) if err != nil { return nil, err } @@ -126,7 +128,7 @@ func ({{.Variable}} *{{.CapitalName}}) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error { +func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.Exchange) error { if !exch.Enabled { {{.Variable}}.SetEnabled(false) return nil @@ -144,17 +146,13 @@ func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error err = {{.Variable}}.Websocket.Setup( &stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: {{.Name}}WSAPIURL, - ExchangeName: exch.Name, - RunningURL: wsRunningEndpoint, - Connector: {{.Variable}}.WsConnect, - Subscriber: {{.Variable}}.Subscribe, - UnSubscriber: {{.Variable}}.Unsubscribe, - Features: &{{.Variable}}.Features.Supports.WebsocketCapabilities, + ExchangeConfig: exch, + DefaultURL: {{.Name}}WSAPIURL, + RunningURL: wsRunningEndpoint, + Connector: {{.Variable}}.WsConnect, + Subscriber: {{.Variable}}.Subscribe, + UnSubscriber: {{.Variable}}.Unsubscribe, + Features: &{{.Variable}}.Features.Supports.WebsocketCapabilities, }) if err != nil { return err @@ -168,15 +166,6 @@ func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, } - - // NOTE: PLEASE ENSURE YOU SET THE ORDERBOOK BUFFER SETTINGS CORRECTLY - {{.Variable}}.Websocket.Orderbook.Setup( - exch.OrderbookConfig.WebsocketBufferLimit, - true, - true, - false, - false, - exch.Name) */ return nil } @@ -204,7 +193,7 @@ func ({{.Variable}} *{{.CapitalName}}) Run() { return } - err := {{.Variable}}.UpdateTradablePairs(false) + err := {{.Variable}}.UpdateTradablePairs(context.TODO(), false) if err != nil { log.Errorf(log.ExchangeSys, "%s failed to update tradable pairs. Err: %s", @@ -222,7 +211,7 @@ func ({{.Variable}} *{{.CapitalName}}) FetchTradablePairs(ctx context.Context, a // UpdateTradablePairs updates the exchanges available pairs and stores // them in the exchanges config func ({{.Variable}} *{{.CapitalName}}) UpdateTradablePairs(ctx context.Context, forceUpdate bool) error { - pairs, err := {{.Variable}}.FetchTradablePairs(asset.Spot) + pairs, err := {{.Variable}}.FetchTradablePairs(ctx, asset.Spot) if err != nil { return err } @@ -263,7 +252,7 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateTicker(ctx context.Context, p curre } // UpdateTickers updates all currency pairs of a given asset type -func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(assetType asset.Item) error { +func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(ctx context.Context, assetType asset.Item) error { // NOTE: EXAMPLE FOR GETTING TICKER PRICE /* tick, err := {{.Variable}}.GetTickers() @@ -301,25 +290,25 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(assetType asset.Item) error func ({{.Variable}} *{{.CapitalName}}) FetchTicker(ctx context.Context, p currency.Pair, assetType asset.Item) (*ticker.Price, error) { tickerNew, err := ticker.GetTicker({{.Variable}}.Name, p, assetType) if err != nil { - return {{.Variable}}.UpdateTicker(p, assetType) + return {{.Variable}}.UpdateTicker(ctx, p, assetType) } return tickerNew, nil } // FetchOrderbook returns orderbook base on the currency pair -func ({{.Variable}} *{{.CapitalName}}) FetchOrderbook(ctx context.Context, c currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - ob, err := orderbook.Get({{.Variable}}.Name, currency, assetType) +func ({{.Variable}} *{{.CapitalName}}) FetchOrderbook(ctx context.Context, pair currency.Pair, assetType asset.Item) (*orderbook.Base, error) { + ob, err := orderbook.Get({{.Variable}}.Name, pair, assetType) if err != nil { - return {{.Variable}}.UpdateOrderbook(currency, assetType) + return {{.Variable}}.UpdateOrderbook(ctx, pair, assetType) } return ob, nil } // UpdateOrderbook updates and returns the orderbook for a currency pair -func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { +func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, pair currency.Pair, assetType asset.Item) (*orderbook.Base, error) { book := &orderbook.Base{ Exchange: {{.Variable}}.Name, - Pair: p, + Pair: pair, Asset: assetType, VerifyOrderbook: {{.Variable}}.CanVerifyOrderbook, } @@ -351,7 +340,7 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, p cu return book, err } - return orderbook.Get({{.Variable}}.Name, p, assetType) + return orderbook.Get({{.Variable}}.Name, pair, assetType) } // UpdateAccountInfo retrieves balances for all enabled currencies @@ -381,7 +370,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetRecentTrades(ctx context.Context, p cu } // GetHistoricTrades returns historic trade data within the timeframe provided -func ({{.Variable}} *{{.CapitalName}}) GetHistoricTrades (p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) { +func ({{.Variable}} *{{.CapitalName}}) GetHistoricTrades (ctx context.Context, p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) { return nil, common.ErrNotYetImplemented } @@ -396,11 +385,11 @@ func ({{.Variable}} *{{.CapitalName}}) SubmitOrder(ctx context.Context, s *order // ModifyOrder will allow of changing orderbook placement and limit to // market conversion -func ({{.Variable}} *{{.CapitalName}}) ModifyOrder(action *order.Modify) (string, error) { +func ({{.Variable}} *{{.CapitalName}}) ModifyOrder(ctx context.Context, action *order.Modify) (order.Modify, error) { // if err := action.Validate(); err != nil { // return "", err // } - return "", common.ErrNotYetImplemented + return order.Modify{}, common.ErrNotYetImplemented } // CancelOrder cancels an order by its corresponding ID number @@ -430,8 +419,8 @@ func ({{.Variable}} *{{.CapitalName}}) GetOrderInfo(ctx context.Context, orderID } // GetDepositAddress returns a deposit address for a specified currency -func ({{.Variable}} *{{.CapitalName}}) GetDepositAddress(ctx context.Context, c currency.Code, accountID string) (string, error) { - return "", common.ErrNotYetImplemented +func ({{.Variable}} *{{.CapitalName}}) GetDepositAddress(ctx context.Context, c currency.Code, accountID string, chain string) (*deposit.Address, error) { + return nil, common.ErrNotYetImplemented } // WithdrawCryptocurrencyFunds returns a withdrawal ID when a withdrawal is @@ -485,7 +474,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetFeeByType(ctx context.Context, feeBuil // ValidateCredentials validates current credentials used for wrapper func ({{.Variable}} *{{.CapitalName}}) ValidateCredentials(ctx context.Context, assetType asset.Item) error { - _, err := {{.Variable}}.UpdateAccountInfo(assetType) + _, err := {{.Variable}}.UpdateAccountInfo(ctx, assetType) return {{.Variable}}.CheckTransientError(err) } diff --git a/config/config.go b/config/config.go index 287df9e7..035f0bdb 100644 --- a/config/config.go +++ b/config/config.go @@ -734,7 +734,7 @@ func (c *Config) GetCurrencyPairDisplayConfig() *CurrencyPairFormatConfig { } // GetAllExchangeConfigs returns all exchange configurations -func (c *Config) GetAllExchangeConfigs() []ExchangeConfig { +func (c *Config) GetAllExchangeConfigs() []Exchange { m.Lock() configs := c.Exchanges m.Unlock() @@ -742,7 +742,7 @@ func (c *Config) GetAllExchangeConfigs() []ExchangeConfig { } // GetExchangeConfig returns exchange configurations by its indivdual name -func (c *Config) GetExchangeConfig(name string) (*ExchangeConfig, error) { +func (c *Config) GetExchangeConfig(name string) (*Exchange, error) { m.Lock() defer m.Unlock() for i := range c.Exchanges { @@ -786,7 +786,7 @@ func (c *Config) GetPrimaryForexProvider() string { } // UpdateExchangeConfig updates exchange configurations -func (c *Config) UpdateExchangeConfig(e *ExchangeConfig) error { +func (c *Config) UpdateExchangeConfig(e *Exchange) error { m.Lock() defer m.Unlock() for i := range c.Exchanges { @@ -1015,20 +1015,20 @@ func (c *Config) CheckExchangeConfigValues() error { defaultWebsocketTrafficTimeout) c.Exchanges[i].WebsocketTrafficTimeout = defaultWebsocketTrafficTimeout } - if c.Exchanges[i].OrderbookConfig.WebsocketBufferLimit <= 0 { + if c.Exchanges[i].Orderbook.WebsocketBufferLimit <= 0 { log.Warnf(log.ConfigMgr, "Exchange %s Websocket orderbook buffer limit value not set, defaulting to %v.", c.Exchanges[i].Name, defaultWebsocketOrderbookBufferLimit) - c.Exchanges[i].OrderbookConfig.WebsocketBufferLimit = defaultWebsocketOrderbookBufferLimit + c.Exchanges[i].Orderbook.WebsocketBufferLimit = defaultWebsocketOrderbookBufferLimit } - if c.Exchanges[i].OrderbookConfig.PublishPeriod == nil || c.Exchanges[i].OrderbookConfig.PublishPeriod.Nanoseconds() < 0 { + if c.Exchanges[i].Orderbook.PublishPeriod == nil || c.Exchanges[i].Orderbook.PublishPeriod.Nanoseconds() < 0 { log.Warnf(log.ConfigMgr, "Exchange %s Websocket orderbook publish period value not set, defaulting to %v.", c.Exchanges[i].Name, DefaultOrderbookPublishPeriod) publishPeriod := DefaultOrderbookPublishPeriod - c.Exchanges[i].OrderbookConfig.PublishPeriod = &publishPeriod + c.Exchanges[i].Orderbook.PublishPeriod = &publishPeriod } err := c.CheckPairConsistency(c.Exchanges[i].Name) if err != nil { diff --git a/config/config_test.go b/config/config_test.go index 0d864e17..8e3b2f2f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -79,7 +79,7 @@ func TestGetExchangeBankAccounts(t *testing.T) { t.Parallel() cfg := &Config{ - Exchanges: []ExchangeConfig{{ + Exchanges: []Exchange{{ Name: bfx, Enabled: true, BankAccounts: []banking.Account{ @@ -140,7 +140,7 @@ func TestCheckBankAccountConfig(t *testing.T) { func TestUpdateExchangeBankAccounts(t *testing.T) { t.Parallel() cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Name: bfx, Enabled: true, @@ -273,7 +273,7 @@ func TestCheckClientBankAccounts(t *testing.T) { func TestPurgeExchangeCredentials(t *testing.T) { t.Parallel() var c Config - c.Exchanges = []ExchangeConfig{ + c.Exchanges = []Exchange{ { Name: testString, API: APIConfig{ @@ -483,7 +483,7 @@ func TestGetExchangeAssetTypes(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, CurrencyPairs: ¤cy.PairsManager{ Pairs: map[asset.Item]*currency.PairStore{ @@ -520,7 +520,7 @@ func TestSupportsExchangeAssetType(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, CurrencyPairs: ¤cy.PairsManager{ Pairs: map[asset.Item]*currency.PairStore{ @@ -566,7 +566,7 @@ func TestSetPairs(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, }, ) @@ -602,7 +602,7 @@ func TestGetCurrencyPairConfig(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, }, ) @@ -654,7 +654,7 @@ func TestCheckPairConfigFormats(t *testing.T) { } // Test nil pair store c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, }, ) @@ -754,7 +754,7 @@ func TestCheckPairConsistency(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, }, ) @@ -903,7 +903,7 @@ func TestSupportsPair(t *testing.T) { t.Parallel() fmt := ¤cy.PairFormat{} cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Name: bfx, Enabled: true, @@ -945,7 +945,7 @@ func TestGetPairFormat(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, }, ) @@ -1043,7 +1043,7 @@ func TestGetAvailablePairs(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, CurrencyPairs: ¤cy.PairsManager{}, }, @@ -1086,7 +1086,7 @@ func TestGetEnabledPairs(t *testing.T) { } c.Exchanges = append(c.Exchanges, - ExchangeConfig{ + Exchange{ Name: testFakeExchangeName, CurrencyPairs: ¤cy.PairsManager{}, }, @@ -1126,7 +1126,7 @@ func TestGetEnabledPairs(t *testing.T) { func TestGetEnabledExchanges(t *testing.T) { t.Parallel() - cfg := &Config{Exchanges: []ExchangeConfig{ + cfg := &Config{Exchanges: []Exchange{ { Name: bfx, Enabled: true, @@ -1143,7 +1143,7 @@ func TestGetEnabledExchanges(t *testing.T) { func TestGetDisabledExchanges(t *testing.T) { t.Parallel() - cfg := &Config{Exchanges: []ExchangeConfig{ + cfg := &Config{Exchanges: []Exchange{ { Name: bfx, Enabled: true, @@ -1180,7 +1180,7 @@ func TestGetDisabledExchanges(t *testing.T) { func TestCountEnabledExchanges(t *testing.T) { t.Parallel() - cfg := &Config{Exchanges: []ExchangeConfig{ + cfg := &Config{Exchanges: []Exchange{ { Enabled: true, }, @@ -1212,7 +1212,7 @@ func TestGetCurrencyPairDisplayConfig(t *testing.T) { func TestGetAllExchangeConfigs(t *testing.T) { t.Parallel() cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ {}, }, } @@ -1224,7 +1224,7 @@ func TestGetAllExchangeConfigs(t *testing.T) { func TestGetExchangeConfig(t *testing.T) { t.Parallel() cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Name: bfx, }, @@ -1312,14 +1312,14 @@ func TestUpdateExchangeConfig(t *testing.T) { t.Parallel() ok := "OKEX" cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Name: ok, API: APIConfig{Credentials: APICredentialsConfig{}}, }, }, } - e := &ExchangeConfig{} + e := &Exchange{} err := cfg.UpdateExchangeConfig(e) if err == nil { t.Error("Expected error from non-existent exchange") @@ -1525,7 +1525,7 @@ func TestCheckExchangeConfigValues(t *testing.T) { // Test websocket and HTTP timeout values cfg.Exchanges[0].WebsocketResponseMaxLimit = 0 cfg.Exchanges[0].WebsocketResponseCheckTimeout = 0 - cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit = 0 + cfg.Exchanges[0].Orderbook.WebsocketBufferLimit = 0 cfg.Exchanges[0].WebsocketTrafficTimeout = 0 cfg.Exchanges[0].HTTPTimeout = 0 err = cfg.CheckExchangeConfigValues() @@ -1537,7 +1537,7 @@ func TestCheckExchangeConfigValues(t *testing.T) { t.Errorf("expected exchange %s to have updated WebsocketResponseMaxLimit value", cfg.Exchanges[0].Name) } - if cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit == 0 { + if cfg.Exchanges[0].Orderbook.WebsocketBufferLimit == 0 { t.Errorf("expected exchange %s to have updated WebsocketOrderbookBufferLimit value", cfg.Exchanges[0].Name) } @@ -1705,7 +1705,7 @@ func TestRetrieveConfigCurrencyPairs(t *testing.T) { cp1 := currency.NewPair(currency.DOGE, currency.XRP) cp2 := currency.NewPair(currency.DOGE, currency.USD) cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Enabled: true, BaseCurrencies: currency.Currencies{ @@ -1911,7 +1911,7 @@ func TestCheckConfig(t *testing.T) { cp1 := currency.NewPair(currency.DOGE, currency.XRP) cp2 := currency.NewPair(currency.DOGE, currency.USD) cfg := &Config{ - Exchanges: []ExchangeConfig{ + Exchanges: []Exchange{ { Name: testFakeExchangeName, Enabled: true, @@ -2187,7 +2187,7 @@ func TestRemoveExchange(t *testing.T) { t.Parallel() var c Config const testExchangeName = "0xBAAAAAAD" - c.Exchanges = append(c.Exchanges, ExchangeConfig{ + c.Exchanges = append(c.Exchanges, Exchange{ Name: testExchangeName, }) _, err := c.GetExchangeConfig(testExchangeName) diff --git a/config/config_types.go b/config/config_types.go index 7ba2d4fb..428f220c 100644 --- a/config/config_types.go +++ b/config/config_types.go @@ -90,7 +90,7 @@ type Config struct { Communications base.CommunicationsConfig `json:"communications"` RemoteControl RemoteControlConfig `json:"remoteControl"` Portfolio portfolio.Base `json:"portfolioAddresses"` - Exchanges []ExchangeConfig `json:"exchanges"` + Exchanges []Exchange `json:"exchanges"` BankAccounts []banking.Account `json:"bankAccounts"` // Deprecated config settings, will be removed at a future date @@ -128,8 +128,8 @@ type ConnectionMonitorConfig struct { CheckInterval time.Duration `json:"checkInterval"` } -// ExchangeConfig holds all the information needed for each enabled Exchange. -type ExchangeConfig struct { +// Exchange holds all the information needed for each enabled Exchange. +type Exchange struct { Name string `json:"name"` Enabled bool `json:"enabled"` Verbose bool `json:"verbose"` @@ -146,7 +146,7 @@ type ExchangeConfig struct { API APIConfig `json:"api"` Features *FeaturesConfig `json:"features"` BankAccounts []banking.Account `json:"bankAccounts,omitempty"` - OrderbookConfig `json:"orderbook"` + Orderbook Orderbook `json:"orderbook"` // Deprecated settings which will be removed in a future update AvailablePairs *currency.Pairs `json:"availablePairs,omitempty"` @@ -332,8 +332,8 @@ type APIConfig struct { Endpoints map[string]string `json:"urlEndpoints"` } -// OrderbookConfig stores the orderbook configuration variables -type OrderbookConfig struct { +// Orderbook stores the orderbook configuration variables +type Orderbook struct { VerificationBypass bool `json:"verificationBypass"` WebsocketBufferLimit int `json:"websocketBufferLimit"` WebsocketBufferEnabled bool `json:"websocketBufferEnabled"` diff --git a/docs/ADD_NEW_EXCHANGE.md b/docs/ADD_NEW_EXCHANGE.md index b476f7a2..410ac451 100644 --- a/docs/ADD_NEW_EXCHANGE.md +++ b/docs/ADD_NEW_EXCHANGE.md @@ -1095,7 +1095,7 @@ Add websocket functionality if supported to Setup: ```go // Setup takes in the supplied exchange configuration details and sets params -func (f *FTX) Setup(exch *config.ExchangeConfig) error { +func (f *FTX) Setup(exch *config.Exchange) error { if !exch.Enabled { f.SetEnabled(false) return nil @@ -1108,23 +1108,27 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error { // Websocket details setup below err = f.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: ftxWSURL, // Default ws endpoint so we can roll back via CLI if needed. - ExchangeName: exch.Name, // Sets websocket name to the exchange name. - RunningURL: exch.API.Endpoints.WebsocketURL, - Connector: f.WsConnect, // Connector function outlined above. - Subscriber: f.Subscribe, // Subscriber function outlined above. - UnSubscriber: f.Unsubscribe, // Unsubscriber function outlined above. - GenerateSubscriptions: f.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above. - Features: &f.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below. + ExchangeConfig: exch, + // DefaultURL defines the default endpoint in the event a rollback is + // needed via gctcli. + DefaultURL: ftxWSURL, + RunningURL: exch.API.Endpoints.WebsocketURL, + // Connector function outlined above. + Connector: f.WsConnect, + // Subscriber function outlined above. + Subscriber: f.Subscribe, + // Unsubscriber function outlined above. + UnSubscriber: f.Unsubscribe, + // GenerateDefaultSubscriptions function outlined above. + GenerateSubscriptions: f.GenerateDefaultSubscriptions, + // Defines the capabilities of the websocket outlined in supported + // features struct. This allows the websocket connection to be flushed + // appropriately if we have a pair/asset enable/disable change. This is + // outlined below. + Features: &f.Features.Supports.WebsocketCapabilities, - // Orderbook buffer specific variables for processing orderbook updates via websocket feed. - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - // Other orderbook buffer vars: - // BufferEnabled bool + // Orderbook buffer specific variables for processing orderbook updates + // via websocket feed: // SortBuffer bool // SortBufferByUpdateIDs bool // UpdateEntriesByID bool diff --git a/engine/engine.go b/engine/engine.go index e0b19b71..7beb8b11 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -926,7 +926,7 @@ func (bot *Engine) SetupExchanges() error { continue } wg.Add(1) - go func(c config.ExchangeConfig) { + go func(c config.Exchange) { defer wg.Done() err := bot.LoadExchange(c.Name, &wg) if err != nil { diff --git a/engine/engine_test.go b/engine/engine_test.go index c1962bb1..0f0333f7 100644 --- a/engine/engine_test.go +++ b/engine/engine_test.go @@ -215,7 +215,7 @@ func TestUnloadExchange(t *testing.T) { exch.SetEnabled(true) em.Add(exch) e := &Engine{ExchangeManager: em, - Config: &config.Config{Exchanges: []config.ExchangeConfig{{Name: testExchange}}}, + Config: &config.Config{Exchanges: []config.Exchange{{Name: testExchange}}}, } err = e.UnloadExchange("asdf") if !errors.Is(err, config.ErrExchangeNotFound) { @@ -240,7 +240,7 @@ func TestDryRunParamInteraction(t *testing.T) { ExchangeManager: SetupExchangeManager(), Settings: Settings{}, Config: &config.Config{ - Exchanges: []config.ExchangeConfig{ + Exchanges: []config.Exchange{ { Name: testExchange, WebsocketTrafficTimeout: time.Second, diff --git a/engine/helpers_test.go b/engine/helpers_test.go index 768a141f..1421ae2c 100644 --- a/engine/helpers_test.go +++ b/engine/helpers_test.go @@ -60,7 +60,7 @@ func CreateTestBot(t *testing.T) *Engine { } bot := &Engine{ ExchangeManager: SetupExchangeManager(), - Config: &config.Config{Exchanges: []config.ExchangeConfig{ + Config: &config.Config{Exchanges: []config.Exchange{ { Name: testExchange, Enabled: true, @@ -368,7 +368,7 @@ func TestGetSpecificAvailablePairs(t *testing.T) { }, } e.Config = &config.Config{ - Exchanges: []config.ExchangeConfig{ + Exchanges: []config.Exchange{ { Enabled: true, Name: testExchange, @@ -714,7 +714,7 @@ func TestGetExchangeNamesByCurrency(t *testing.T) { e := CreateTestBot(t) bf := "Bitflyer" - e.Config.Exchanges = append(e.Config.Exchanges, config.ExchangeConfig{ + e.Config.Exchanges = append(e.Config.Exchanges, config.Exchange{ Enabled: true, Name: bf, CurrencyPairs: ¤cy.PairsManager{Pairs: map[asset.Item]*currency.PairStore{ @@ -1063,7 +1063,7 @@ func createDepositEngine(opts *fakeDepositExchangeOpts) *Engine { return &Engine{ Settings: Settings{Verbose: true}, Config: &config.Config{ - Exchanges: []config.ExchangeConfig{ + Exchanges: []config.Exchange{ { Name: "fake", Enabled: true, diff --git a/engine/order_manager_test.go b/engine/order_manager_test.go index 64be84d8..95bed763 100644 --- a/engine/order_manager_test.go +++ b/engine/order_manager_test.go @@ -807,7 +807,7 @@ func TestProcessOrders(t *testing.T) { }, }, } - exch.GetBase().Config = &config.ExchangeConfig{ + exch.GetBase().Config = &config.Exchange{ CurrencyPairs: ¤cy.PairsManager{ UseGlobalFormat: true, RequestFormat: ¤cy.PairFormat{ diff --git a/engine/rpcserver_test.go b/engine/rpcserver_test.go index 6c9f8647..236f7f5a 100644 --- a/engine/rpcserver_test.go +++ b/engine/rpcserver_test.go @@ -849,7 +849,7 @@ func TestSetExchangeTradeProcessing(t *testing.T) { } exch.SetDefaults() b := exch.GetBase() - b.Config = &config.ExchangeConfig{ + b.Config = &config.Exchange{ Features: &config.FeaturesConfig{Enabled: config.FeaturesEnabledConfig{SaveTradeData: false}}, } em.Add(exch) diff --git a/exchanges/alphapoint/alphapoint_wrapper.go b/exchanges/alphapoint/alphapoint_wrapper.go index bc78a6d0..5f38b53f 100644 --- a/exchanges/alphapoint/alphapoint_wrapper.go +++ b/exchanges/alphapoint/alphapoint_wrapper.go @@ -23,7 +23,7 @@ import ( ) // GetDefaultConfig returns a default exchange config for Alphapoint -func (a *Alphapoint) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (a *Alphapoint) GetDefaultConfig() (*config.Exchange, error) { return nil, common.ErrFunctionNotSupported } diff --git a/exchanges/binance/binance_wrapper.go b/exchanges/binance/binance_wrapper.go index 5fddcd53..140bc44f 100644 --- a/exchanges/binance/binance_wrapper.go +++ b/exchanges/binance/binance_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Binance) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Binance) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -207,7 +207,7 @@ func (b *Binance) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Binance) Setup(exch *config.ExchangeConfig) error { +func (b *Binance) Setup(exch *config.Exchange) error { if !exch.Enabled { return nil } @@ -221,23 +221,16 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error { return err } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: binanceDefaultWebsocketURL, - ExchangeName: exch.Name, - RunningURL: ePoint, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - UnSubscriber: b.Unsubscribe, - GenerateSubscriptions: b.GenerateSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, - SortBufferByUpdateIDs: true, + ExchangeConfig: exch, + DefaultURL: binanceDefaultWebsocketURL, + RunningURL: ePoint, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Unsubscriber: b.Unsubscribe, + GenerateSubscriptions: b.GenerateSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, + SortBuffer: true, + SortBufferByUpdateIDs: true, }) if err != nil { return err diff --git a/exchanges/bitfinex/bitfinex_wrapper.go b/exchanges/bitfinex/bitfinex_wrapper.go index 0c618587..4cc78b53 100644 --- a/exchanges/bitfinex/bitfinex_wrapper.go +++ b/exchanges/bitfinex/bitfinex_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Bitfinex) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bitfinex) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -183,7 +183,7 @@ func (b *Bitfinex) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error { +func (b *Bitfinex) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -199,22 +199,15 @@ func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error { } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: publicBitfinexWebsocketEndpoint, - ExchangeName: exch.Name, - RunningURL: wsEndpoint, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - UnSubscriber: b.Unsubscribe, - GenerateSubscriptions: b.GenerateDefaultSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - UpdateEntriesByID: true, + ExchangeConfig: exch, + DefaultURL: publicBitfinexWebsocketEndpoint, + RunningURL: wsEndpoint, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Unsubscriber: b.Unsubscribe, + GenerateSubscriptions: b.GenerateDefaultSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, + UpdateEntriesByID: true, }) if err != nil { return err diff --git a/exchanges/bitflyer/bitflyer_wrapper.go b/exchanges/bitflyer/bitflyer_wrapper.go index 8483a203..56595219 100644 --- a/exchanges/bitflyer/bitflyer_wrapper.go +++ b/exchanges/bitflyer/bitflyer_wrapper.go @@ -27,9 +27,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Bitflyer) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bitflyer) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -107,7 +107,7 @@ func (b *Bitflyer) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Bitflyer) Setup(exch *config.ExchangeConfig) error { +func (b *Bitflyer) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil diff --git a/exchanges/bithumb/bithumb_wrapper.go b/exchanges/bithumb/bithumb_wrapper.go index 6d2ce0d7..d1cfe62e 100644 --- a/exchanges/bithumb/bithumb_wrapper.go +++ b/exchanges/bithumb/bithumb_wrapper.go @@ -36,9 +36,9 @@ const wsRateLimitMillisecond = 1000 var errNotEnoughPairs = errors.New("at least one currency is required to fetch order history") // GetDefaultConfig returns a default exchange config -func (b *Bithumb) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bithumb) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -147,7 +147,7 @@ func (b *Bithumb) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Bithumb) Setup(exch *config.ExchangeConfig) error { +func (b *Bithumb) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -167,20 +167,13 @@ func (b *Bithumb) Setup(exch *config.ExchangeConfig) error { return err } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: wsEndpoint, - ExchangeName: exch.Name, - RunningURL: ePoint, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - GenerateSubscriptions: b.GenerateSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: wsEndpoint, + RunningURL: ePoint, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + GenerateSubscriptions: b.GenerateSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/bitmex/bitmex_wrapper.go b/exchanges/bitmex/bitmex_wrapper.go index 8dd0676e..89fefbeb 100644 --- a/exchanges/bitmex/bitmex_wrapper.go +++ b/exchanges/bitmex/bitmex_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Bitmex) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bitmex) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -142,7 +142,7 @@ func (b *Bitmex) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Bitmex) Setup(exch *config.ExchangeConfig) error { +func (b *Bitmex) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -159,21 +159,15 @@ func (b *Bitmex) Setup(exch *config.ExchangeConfig) error { } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: bitmexWSURL, - ExchangeName: exch.Name, - RunningURL: wsEndpoint, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - UnSubscriber: b.Unsubscribe, - GenerateSubscriptions: b.GenerateDefaultSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - UpdateEntriesByID: true, + ExchangeConfig: exch, + DefaultURL: bitmexWSURL, + RunningURL: wsEndpoint, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Unsubscriber: b.Unsubscribe, + GenerateSubscriptions: b.GenerateDefaultSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, + UpdateEntriesByID: true, }) if err != nil { return err diff --git a/exchanges/bitstamp/bitstamp_wrapper.go b/exchanges/bitstamp/bitstamp_wrapper.go index a7ab8960..a429b6b2 100644 --- a/exchanges/bitstamp/bitstamp_wrapper.go +++ b/exchanges/bitstamp/bitstamp_wrapper.go @@ -28,9 +28,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Bitstamp) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bitstamp) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -146,7 +146,7 @@ func (b *Bitstamp) SetDefaults() { } // Setup sets configuration values to bitstamp -func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error { +func (b *Bitstamp) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -163,21 +163,14 @@ func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error { } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: bitstampWSURL, - ExchangeName: exch.Name, - RunningURL: wsURL, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - UnSubscriber: b.Unsubscribe, - GenerateSubscriptions: b.generateDefaultSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: bitstampWSURL, + RunningURL: wsURL, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Unsubscriber: b.Unsubscribe, + GenerateSubscriptions: b.generateDefaultSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/bittrex/bittrex_wrapper.go b/exchanges/bittrex/bittrex_wrapper.go index a0664b68..7dbd55b7 100644 --- a/exchanges/bittrex/bittrex_wrapper.go +++ b/exchanges/bittrex/bittrex_wrapper.go @@ -29,9 +29,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *Bittrex) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *Bittrex) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -141,7 +141,7 @@ func (b *Bittrex) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *Bittrex) Setup(exch *config.ExchangeConfig) error { +func (b *Bittrex) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -159,27 +159,20 @@ func (b *Bittrex) Setup(exch *config.ExchangeConfig) error { // Websocket details setup below err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: bittrexAPIWSURL, // Default ws endpoint so we can roll back via CLI if needed. - ExchangeName: exch.Name, // Sets websocket name to the exchange name. - RunningURL: wsRunningEndpoint, - Connector: b.WsConnect, // Connector function outlined above. - Subscriber: b.Subscribe, // Subscriber function outlined above. - UnSubscriber: b.Unsubscribe, // Unsubscriber function outlined above. - GenerateSubscriptions: b.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above. - Features: &b.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below. + ExchangeConfig: exch, + DefaultURL: bittrexAPIWSURL, // Default ws endpoint so we can roll back via CLI if needed. + RunningURL: wsRunningEndpoint, + Connector: b.WsConnect, // Connector function outlined above. + Subscriber: b.Subscribe, // Subscriber function outlined above. + Unsubscriber: b.Unsubscribe, // Unsubscriber function outlined above. + GenerateSubscriptions: b.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above. + Features: &b.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below. // Orderbook buffer specific variables for processing orderbook updates via websocket feed. // Other orderbook buffer vars: // UpdateEntriesByID bool - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, - SortBufferByUpdateIDs: true, + SortBuffer: true, + SortBufferByUpdateIDs: true, }) if err != nil { return err diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index 4a5032e2..464d626c 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *BTCMarkets) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *BTCMarkets) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -137,7 +137,7 @@ func (b *BTCMarkets) SetDefaults() { } // Setup takes in an exchange configuration and sets all parameters -func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error { +func (b *BTCMarkets) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -154,21 +154,14 @@ func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error { } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: btcMarketsWSURL, - ExchangeName: exch.Name, - RunningURL: wsURL, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - GenerateSubscriptions: b.generateDefaultSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, + ExchangeConfig: exch, + DefaultURL: btcMarketsWSURL, + RunningURL: wsURL, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + GenerateSubscriptions: b.generateDefaultSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, + SortBuffer: true, }) if err != nil { return err diff --git a/exchanges/btse/btse_wrapper.go b/exchanges/btse/btse_wrapper.go index aa113773..8e0bf7ea 100644 --- a/exchanges/btse/btse_wrapper.go +++ b/exchanges/btse/btse_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (b *BTSE) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (b *BTSE) GetDefaultConfig() (*config.Exchange, error) { b.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = b.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = b.BaseCurrencies @@ -168,7 +168,7 @@ func (b *BTSE) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (b *BTSE) Setup(exch *config.ExchangeConfig) error { +func (b *BTSE) Setup(exch *config.Exchange) error { if !exch.Enabled { b.SetEnabled(false) return nil @@ -185,21 +185,14 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error { } err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: btseWebsocket, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: b.WsConnect, - Subscriber: b.Subscribe, - UnSubscriber: b.Unsubscribe, - GenerateSubscriptions: b.GenerateDefaultSubscriptions, - Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: btseWebsocket, + RunningURL: wsRunningURL, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Unsubscriber: b.Unsubscribe, + GenerateSubscriptions: b.GenerateDefaultSubscriptions, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/coinbasepro/coinbasepro_wrapper.go b/exchanges/coinbasepro/coinbasepro_wrapper.go index 9bb220c5..46d5d008 100644 --- a/exchanges/coinbasepro/coinbasepro_wrapper.go +++ b/exchanges/coinbasepro/coinbasepro_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (c *CoinbasePro) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (c *CoinbasePro) GetDefaultConfig() (*config.Exchange, error) { c.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = c.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = c.BaseCurrencies @@ -149,7 +149,7 @@ func (c *CoinbasePro) SetDefaults() { } // Setup initialises the exchange parameters with the current configuration -func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error { +func (c *CoinbasePro) Setup(exch *config.Exchange) error { if !exch.Enabled { c.SetEnabled(false) return nil @@ -166,22 +166,15 @@ func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error { } err = c.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: coinbaseproWebsocketURL, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: c.WsConnect, - Subscriber: c.Subscribe, - UnSubscriber: c.Unsubscribe, - GenerateSubscriptions: c.GenerateDefaultSubscriptions, - Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, + ExchangeConfig: exch, + DefaultURL: coinbaseproWebsocketURL, + RunningURL: wsRunningURL, + Connector: c.WsConnect, + Subscriber: c.Subscribe, + Unsubscriber: c.Unsubscribe, + GenerateSubscriptions: c.GenerateDefaultSubscriptions, + Features: &c.Features.Supports.WebsocketCapabilities, + SortBuffer: true, }) if err != nil { return err diff --git a/exchanges/coinbene/coinbene_wrapper.go b/exchanges/coinbene/coinbene_wrapper.go index 3288217e..f5c7b0c3 100644 --- a/exchanges/coinbene/coinbene_wrapper.go +++ b/exchanges/coinbene/coinbene_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (c *Coinbene) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (c *Coinbene) GetDefaultConfig() (*config.Exchange, error) { c.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = c.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = c.BaseCurrencies @@ -169,7 +169,7 @@ func (c *Coinbene) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (c *Coinbene) Setup(exch *config.ExchangeConfig) error { +func (c *Coinbene) Setup(exch *config.Exchange) error { if !exch.Enabled { c.SetEnabled(false) return nil @@ -186,22 +186,15 @@ func (c *Coinbene) Setup(exch *config.ExchangeConfig) error { } err = c.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: wsContractURL, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: c.WsConnect, - Subscriber: c.Subscribe, - UnSubscriber: c.Unsubscribe, - GenerateSubscriptions: c.GenerateDefaultSubscriptions, - Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, + ExchangeConfig: exch, + DefaultURL: wsContractURL, + RunningURL: wsRunningURL, + Connector: c.WsConnect, + Subscriber: c.Subscribe, + Unsubscriber: c.Unsubscribe, + GenerateSubscriptions: c.GenerateDefaultSubscriptions, + Features: &c.Features.Supports.WebsocketCapabilities, + SortBuffer: true, }) if err != nil { return err diff --git a/exchanges/coinut/coinut_wrapper.go b/exchanges/coinut/coinut_wrapper.go index 801c40b1..0d1f295b 100644 --- a/exchanges/coinut/coinut_wrapper.go +++ b/exchanges/coinut/coinut_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (c *COINUT) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (c *COINUT) GetDefaultConfig() (*config.Exchange, error) { c.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = c.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = c.BaseCurrencies @@ -131,7 +131,7 @@ func (c *COINUT) SetDefaults() { } // Setup sets the current exchange configuration -func (c *COINUT) Setup(exch *config.ExchangeConfig) error { +func (c *COINUT) Setup(exch *config.Exchange) error { if !exch.Enabled { c.SetEnabled(false) return nil @@ -148,23 +148,16 @@ func (c *COINUT) Setup(exch *config.ExchangeConfig) error { } err = c.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: coinutWebsocketURL, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: c.WsConnect, - Subscriber: c.Subscribe, - UnSubscriber: c.Unsubscribe, - GenerateSubscriptions: c.GenerateDefaultSubscriptions, - Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, - SortBufferByUpdateIDs: true, + ExchangeConfig: exch, + DefaultURL: coinutWebsocketURL, + RunningURL: wsRunningURL, + Connector: c.WsConnect, + Subscriber: c.Subscribe, + Unsubscriber: c.Unsubscribe, + GenerateSubscriptions: c.GenerateDefaultSubscriptions, + Features: &c.Features.Supports.WebsocketCapabilities, + SortBuffer: true, + SortBufferByUpdateIDs: true, }) if err != nil { return err diff --git a/exchanges/exchange.go b/exchanges/exchange.go index 2f23c7c5..93b0f975 100644 --- a/exchanges/exchange.go +++ b/exchanges/exchange.go @@ -558,7 +558,7 @@ func (b *Base) SetAPIKeys(apiKey, apiSecret, clientID string) { } // SetupDefaults sets the exchange settings based on the supplied config -func (b *Base) SetupDefaults(exch *config.ExchangeConfig) error { +func (b *Base) SetupDefaults(exch *config.Exchange) error { b.Enabled = true b.LoadedByConfig = true b.Config = exch @@ -614,12 +614,12 @@ func (b *Base) SetupDefaults(exch *config.ExchangeConfig) error { } b.BaseCurrencies = exch.BaseCurrencies - if exch.OrderbookConfig.VerificationBypass { + if exch.Orderbook.VerificationBypass { log.Warnf(log.ExchangeSys, "%s orderbook verification has been bypassed via config.", b.Name) } - b.CanVerifyOrderbook = !exch.OrderbookConfig.VerificationBypass + b.CanVerifyOrderbook = !exch.Orderbook.VerificationBypass b.States = currencystate.NewCurrencyStates() return err } diff --git a/exchanges/exchange_test.go b/exchanges/exchange_test.go index c89273f7..584132a9 100644 --- a/exchanges/exchange_test.go +++ b/exchanges/exchange_test.go @@ -300,7 +300,7 @@ func TestSetFeatureDefaults(t *testing.T) { // Test nil features with basic support capabilities b := Base{ - Config: &config.ExchangeConfig{ + Config: &config.Exchange{ CurrencyPairs: ¤cy.PairsManager{}, }, Features: Features{ @@ -345,7 +345,7 @@ func TestSetAPICredentialDefaults(t *testing.T) { t.Parallel() b := Base{ - Config: &config.ExchangeConfig{}, + Config: &config.Exchange{}, } b.API.CredentialsValidator.RequiresKey = true b.API.CredentialsValidator.RequiresSecret = true @@ -366,7 +366,7 @@ func TestSetAPICredentialDefaults(t *testing.T) { func TestSetAutoPairDefaults(t *testing.T) { t.Parallel() bs := "Bitstamp" - cfg := &config.Config{Exchanges: []config.ExchangeConfig{ + cfg := &config.Config{Exchanges: []config.Exchange{ { Name: bs, CurrencyPairs: ¤cy.PairsManager{}, @@ -499,7 +499,7 @@ func TestSetCurrencyPairFormat(t *testing.T) { t.Parallel() b := Base{ - Config: &config.ExchangeConfig{}, + Config: &config.Exchange{}, } b.SetCurrencyPairFormat() if b.Config.CurrencyPairs == nil { @@ -580,7 +580,7 @@ func TestLoadConfigPairs(t *testing.T) { }, }, }, - Config: &config.ExchangeConfig{ + Config: &config.Exchange{ CurrencyPairs: ¤cy.PairsManager{}, }, } @@ -1266,7 +1266,7 @@ func TestSetupDefaults(t *testing.T) { t.Parallel() var b = Base{Name: "awesomeTest"} - cfg := config.ExchangeConfig{ + cfg := config.Exchange{ HTTPTimeout: time.Duration(-1), API: config.APIConfig{ AuthenticatedSupport: true, @@ -1319,12 +1319,14 @@ func TestSetupDefaults(t *testing.T) { b.Websocket = stream.New() b.Features.Supports.Websocket = true err = b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: false, - WebsocketTimeout: time.Second * 30, + ExchangeConfig: &config.Exchange{ + WebsocketTrafficTimeout: time.Second * 30, + Name: "test", + Features: &config.FeaturesConfig{}, + }, Features: &protocol.Features{}, DefaultURL: "ws://something.com", RunningURL: "ws://something.com", - ExchangeName: "test", Connector: func() error { return nil }, GenerateSubscriptions: func() ([]stream.ChannelSubscription, error) { return []stream.ChannelSubscription{}, nil }, Subscriber: func(cs []stream.ChannelSubscription) error { return nil }, @@ -1450,7 +1452,7 @@ func TestSetPairs(t *testing.T) { Uppercase: true, }, }, - Config: &config.ExchangeConfig{ + Config: &config.Exchange{ CurrencyPairs: ¤cy.PairsManager{ UseGlobalFormat: true, ConfigFormat: ¤cy.PairFormat{ @@ -1500,7 +1502,7 @@ func TestSetPairs(t *testing.T) { func TestUpdatePairs(t *testing.T) { t.Parallel() cfg := &config.Config{ - Exchanges: []config.ExchangeConfig{ + Exchanges: []config.Exchange{ { Name: defaultTestExchange, CurrencyPairs: ¤cy.PairsManager{}, @@ -1667,12 +1669,19 @@ func TestIsWebsocketEnabled(t *testing.T) { b.Websocket = stream.New() err := b.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: true, - WebsocketTimeout: time.Second * 30, + ExchangeConfig: &config.Exchange{ + Enabled: true, + WebsocketTrafficTimeout: time.Second * 30, + Name: "test", + Features: &config.FeaturesConfig{ + Enabled: config.FeaturesEnabledConfig{ + Websocket: true, + }, + }, + }, Features: &protocol.Features{}, DefaultURL: "ws://something.com", RunningURL: "ws://something.com", - ExchangeName: "test", Connector: func() error { return nil }, GenerateSubscriptions: func() ([]stream.ChannelSubscription, error) { return nil, nil }, Subscriber: func(cs []stream.ChannelSubscription) error { return nil }, @@ -1827,7 +1836,7 @@ func TestGetAssetType(t *testing.T) { func TestGetFormattedPairAndAssetType(t *testing.T) { t.Parallel() b := Base{ - Config: &config.ExchangeConfig{}, + Config: &config.Exchange{}, } b.SetCurrencyPairFormat() b.Config.CurrencyPairs.UseGlobalFormat = true @@ -1865,7 +1874,7 @@ func TestGetFormattedPairAndAssetType(t *testing.T) { func TestStoreAssetPairFormat(t *testing.T) { b := Base{ - Config: &config.ExchangeConfig{Name: "kitties"}, + Config: &config.Exchange{Name: "kitties"}, } err := b.StoreAssetPairFormat(asset.Item(""), currency.PairStore{}) @@ -1901,7 +1910,7 @@ func TestStoreAssetPairFormat(t *testing.T) { func TestSetGlobalPairsManager(t *testing.T) { b := Base{ - Config: &config.ExchangeConfig{Name: "kitties"}, + Config: &config.Exchange{Name: "kitties"}, } err := b.SetGlobalPairsManager(nil, nil, "") @@ -2162,7 +2171,7 @@ func TestSetSaveTradeDataStatus(t *testing.T) { SaveTradeData: false, }, }, - Config: &config.ExchangeConfig{ + Config: &config.Exchange{ Features: &config.FeaturesConfig{ Enabled: config.FeaturesEnabledConfig{}, }, @@ -2190,7 +2199,7 @@ func TestAddTradesToBuffer(t *testing.T) { Features: Features{ Enabled: FeaturesEnabled{}, }, - Config: &config.ExchangeConfig{ + Config: &config.Exchange{ Features: &config.FeaturesConfig{ Enabled: config.FeaturesEnabledConfig{}, }, @@ -2284,7 +2293,7 @@ func TestSetAPIURL(t *testing.T) { b := Base{ Name: "SomeExchange", } - b.Config = &config.ExchangeConfig{} + b.Config = &config.Exchange{} var mappy struct { Mappymap map[string]string `json:"urlEndpoints"` } diff --git a/exchanges/exchange_types.go b/exchanges/exchange_types.go index ab754985..30ad3440 100644 --- a/exchanges/exchange_types.go +++ b/exchanges/exchange_types.go @@ -225,7 +225,7 @@ type Base struct { WebsocketOrderbookBufferLimit int64 Websocket *stream.Websocket *request.Requester - Config *config.ExchangeConfig + Config *config.Exchange settingsMutex sync.RWMutex // CanVerifyOrderbook determines if the orderbook verification can be bypassed, // increasing potential update speed but decreasing confidence in orderbook diff --git a/exchanges/exmo/exmo_wrapper.go b/exchanges/exmo/exmo_wrapper.go index 57d7fd38..b7367054 100644 --- a/exchanges/exmo/exmo_wrapper.go +++ b/exchanges/exmo/exmo_wrapper.go @@ -29,9 +29,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (e *EXMO) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (e *EXMO) GetDefaultConfig() (*config.Exchange, error) { e.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = e.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = e.BaseCurrencies @@ -123,7 +123,7 @@ func (e *EXMO) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (e *EXMO) Setup(exch *config.ExchangeConfig) error { +func (e *EXMO) Setup(exch *config.Exchange) error { if !exch.Enabled { e.SetEnabled(false) return nil diff --git a/exchanges/ftx/ftx_wrapper.go b/exchanges/ftx/ftx_wrapper.go index aa882041..5c491d3e 100644 --- a/exchanges/ftx/ftx_wrapper.go +++ b/exchanges/ftx/ftx_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (f *FTX) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (f *FTX) GetDefaultConfig() (*config.Exchange, error) { f.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = f.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = f.BaseCurrencies @@ -165,7 +165,7 @@ func (f *FTX) SetDefaults() { } // Setup takes in the supplied exchange configuration details and sets params -func (f *FTX) Setup(exch *config.ExchangeConfig) error { +func (f *FTX) Setup(exch *config.Exchange) error { if !exch.Enabled { f.SetEnabled(false) return nil @@ -182,21 +182,14 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error { } err = f.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: ftxWSURL, - ExchangeName: exch.Name, - RunningURL: wsEndpoint, - Connector: f.WsConnect, - Subscriber: f.Subscribe, - UnSubscriber: f.Unsubscribe, - GenerateSubscriptions: f.GenerateDefaultSubscriptions, - Features: &f.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, + ExchangeConfig: exch, + DefaultURL: ftxWSURL, + RunningURL: wsEndpoint, + Connector: f.WsConnect, + Subscriber: f.Subscribe, + Unsubscriber: f.Unsubscribe, + GenerateSubscriptions: f.GenerateDefaultSubscriptions, + Features: &f.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/gateio/gateio_wrapper.go b/exchanges/gateio/gateio_wrapper.go index 733a841c..206f3cf2 100644 --- a/exchanges/gateio/gateio_wrapper.go +++ b/exchanges/gateio/gateio_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (g *Gateio) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (g *Gateio) GetDefaultConfig() (*config.Exchange, error) { g.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = g.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = g.BaseCurrencies @@ -148,7 +148,7 @@ func (g *Gateio) SetDefaults() { } // Setup sets user configuration -func (g *Gateio) Setup(exch *config.ExchangeConfig) error { +func (g *Gateio) Setup(exch *config.Exchange) error { if !exch.Enabled { g.SetEnabled(false) return nil @@ -165,20 +165,13 @@ func (g *Gateio) Setup(exch *config.ExchangeConfig) error { } err = g.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: gateioWebsocketEndpoint, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: g.WsConnect, - Subscriber: g.Subscribe, - GenerateSubscriptions: g.GenerateDefaultSubscriptions, - Features: &g.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: gateioWebsocketEndpoint, + RunningURL: wsRunningURL, + Connector: g.WsConnect, + Subscriber: g.Subscribe, + GenerateSubscriptions: g.GenerateDefaultSubscriptions, + Features: &g.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/gemini/gemini_wrapper.go b/exchanges/gemini/gemini_wrapper.go index 8f6f9657..bb68bcf8 100644 --- a/exchanges/gemini/gemini_wrapper.go +++ b/exchanges/gemini/gemini_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (g *Gemini) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (g *Gemini) GetDefaultConfig() (*config.Exchange, error) { g.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = g.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = g.BaseCurrencies @@ -131,7 +131,7 @@ func (g *Gemini) SetDefaults() { } // Setup sets exchange configuration parameters -func (g *Gemini) Setup(exch *config.ExchangeConfig) error { +func (g *Gemini) Setup(exch *config.Exchange) error { if !exch.Enabled { g.SetEnabled(false) return nil @@ -155,21 +155,14 @@ func (g *Gemini) Setup(exch *config.ExchangeConfig) error { } err = g.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: geminiWebsocketEndpoint, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: g.WsConnect, - Subscriber: g.Subscribe, - UnSubscriber: g.Unsubscribe, - GenerateSubscriptions: g.GenerateDefaultSubscriptions, - Features: &g.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: geminiWebsocketEndpoint, + RunningURL: wsRunningURL, + Connector: g.WsConnect, + Subscriber: g.Subscribe, + Unsubscriber: g.Unsubscribe, + GenerateSubscriptions: g.GenerateDefaultSubscriptions, + Features: &g.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/hitbtc/hitbtc_wrapper.go b/exchanges/hitbtc/hitbtc_wrapper.go index 8bf3ccc8..1e93d72f 100644 --- a/exchanges/hitbtc/hitbtc_wrapper.go +++ b/exchanges/hitbtc/hitbtc_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (h *HitBTC) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (h *HitBTC) GetDefaultConfig() (*config.Exchange, error) { h.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = h.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = h.BaseCurrencies @@ -147,7 +147,7 @@ func (h *HitBTC) SetDefaults() { } // Setup sets user exchange configuration settings -func (h *HitBTC) Setup(exch *config.ExchangeConfig) error { +func (h *HitBTC) Setup(exch *config.Exchange) error { if !exch.Enabled { h.SetEnabled(false) return nil @@ -164,23 +164,16 @@ func (h *HitBTC) Setup(exch *config.ExchangeConfig) error { } err = h.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: hitbtcWebsocketAddress, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: h.WsConnect, - Subscriber: h.Subscribe, - UnSubscriber: h.Unsubscribe, - GenerateSubscriptions: h.GenerateDefaultSubscriptions, - Features: &h.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, - SortBufferByUpdateIDs: true, + ExchangeConfig: exch, + DefaultURL: hitbtcWebsocketAddress, + RunningURL: wsRunningURL, + Connector: h.WsConnect, + Subscriber: h.Subscribe, + Unsubscriber: h.Unsubscribe, + GenerateSubscriptions: h.GenerateDefaultSubscriptions, + Features: &h.Features.Supports.WebsocketCapabilities, + SortBuffer: true, + SortBufferByUpdateIDs: true, }) if err != nil { return err diff --git a/exchanges/huobi/huobi_wrapper.go b/exchanges/huobi/huobi_wrapper.go index 2396cfe8..8d05065c 100644 --- a/exchanges/huobi/huobi_wrapper.go +++ b/exchanges/huobi/huobi_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (h *HUOBI) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (h *HUOBI) GetDefaultConfig() (*config.Exchange, error) { h.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = h.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = h.BaseCurrencies @@ -178,7 +178,7 @@ func (h *HUOBI) SetDefaults() { } // Setup sets user configuration -func (h *HUOBI) Setup(exch *config.ExchangeConfig) error { +func (h *HUOBI) Setup(exch *config.Exchange) error { if !exch.Enabled { h.SetEnabled(false) return nil @@ -195,21 +195,14 @@ func (h *HUOBI) Setup(exch *config.ExchangeConfig) error { } err = h.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: wsMarketURL, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: h.WsConnect, - Subscriber: h.Subscribe, - UnSubscriber: h.Unsubscribe, - GenerateSubscriptions: h.GenerateDefaultSubscriptions, - Features: &h.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: wsMarketURL, + RunningURL: wsRunningURL, + Connector: h.WsConnect, + Subscriber: h.Subscribe, + Unsubscriber: h.Unsubscribe, + GenerateSubscriptions: h.GenerateDefaultSubscriptions, + Features: &h.Features.Supports.WebsocketCapabilities, }) if err != nil { return err @@ -277,7 +270,7 @@ func (h *HUOBI) Run() { if common.StringDataContains(h.BaseCurrencies.Strings(), currency.CNY.String()) { cfg := config.GetConfig() - var exchCfg *config.ExchangeConfig + var exchCfg *config.Exchange exchCfg, err = cfg.GetExchangeConfig(h.Name) if err != nil { log.Errorf(log.ExchangeSys, diff --git a/exchanges/interfaces.go b/exchanges/interfaces.go index 654cbef8..5bb72729 100644 --- a/exchanges/interfaces.go +++ b/exchanges/interfaces.go @@ -23,7 +23,7 @@ import ( // IBotExchange enforces standard functions for all exchanges supported in // GoCryptoTrader type IBotExchange interface { - Setup(exch *config.ExchangeConfig) error + Setup(exch *config.Exchange) error Start(wg *sync.WaitGroup) SetDefaults() GetName() string @@ -73,7 +73,7 @@ type IBotExchange interface { SetClientProxyAddress(addr string) error SupportsREST() bool GetSubscriptions() ([]stream.ChannelSubscription, error) - GetDefaultConfig() (*config.ExchangeConfig, error) + GetDefaultConfig() (*config.Exchange, error) GetBase() *Base SupportsAsset(assetType asset.Item) bool GetHistoricCandles(ctx context.Context, p currency.Pair, a asset.Item, timeStart, timeEnd time.Time, interval kline.Interval) (kline.Item, error) diff --git a/exchanges/itbit/itbit_wrapper.go b/exchanges/itbit/itbit_wrapper.go index a6b87812..ecaacd4f 100644 --- a/exchanges/itbit/itbit_wrapper.go +++ b/exchanges/itbit/itbit_wrapper.go @@ -29,9 +29,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (i *ItBit) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (i *ItBit) GetDefaultConfig() (*config.Exchange, error) { i.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = i.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = i.BaseCurrencies @@ -106,7 +106,7 @@ func (i *ItBit) SetDefaults() { } // Setup sets the exchange parameters from exchange config -func (i *ItBit) Setup(exch *config.ExchangeConfig) error { +func (i *ItBit) Setup(exch *config.Exchange) error { if !exch.Enabled { i.SetEnabled(false) return nil diff --git a/exchanges/kraken/kraken_wrapper.go b/exchanges/kraken/kraken_wrapper.go index f4ecec12..626eb2c0 100644 --- a/exchanges/kraken/kraken_wrapper.go +++ b/exchanges/kraken/kraken_wrapper.go @@ -31,9 +31,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (k *Kraken) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (k *Kraken) GetDefaultConfig() (*config.Exchange, error) { k.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = k.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = k.BaseCurrencies @@ -190,7 +190,7 @@ func (k *Kraken) SetDefaults() { } // Setup sets current exchange configuration -func (k *Kraken) Setup(exch *config.ExchangeConfig) error { +func (k *Kraken) Setup(exch *config.Exchange) error { if !exch.Enabled { k.SetEnabled(false) return nil @@ -211,22 +211,15 @@ func (k *Kraken) Setup(exch *config.ExchangeConfig) error { return err } err = k.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: krakenWSURL, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: k.WsConnect, - Subscriber: k.Subscribe, - UnSubscriber: k.Unsubscribe, - GenerateSubscriptions: k.GenerateDefaultSubscriptions, - Features: &k.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, + ExchangeConfig: exch, + DefaultURL: krakenWSURL, + RunningURL: wsRunningURL, + Connector: k.WsConnect, + Subscriber: k.Subscribe, + Unsubscriber: k.Unsubscribe, + GenerateSubscriptions: k.GenerateDefaultSubscriptions, + Features: &k.Features.Supports.WebsocketCapabilities, + SortBuffer: true, }) if err != nil { return err diff --git a/exchanges/lbank/lbank_wrapper.go b/exchanges/lbank/lbank_wrapper.go index d5e4ce62..1a681333 100644 --- a/exchanges/lbank/lbank_wrapper.go +++ b/exchanges/lbank/lbank_wrapper.go @@ -28,9 +28,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (l *Lbank) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (l *Lbank) GetDefaultConfig() (*config.Exchange, error) { l.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = l.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = l.BaseCurrencies @@ -120,7 +120,7 @@ func (l *Lbank) SetDefaults() { } // Setup sets exchange configuration profile -func (l *Lbank) Setup(exch *config.ExchangeConfig) error { +func (l *Lbank) Setup(exch *config.Exchange) error { if !exch.Enabled { l.SetEnabled(false) return nil diff --git a/exchanges/localbitcoins/localbitcoins_wrapper.go b/exchanges/localbitcoins/localbitcoins_wrapper.go index 8f8d41b2..e79a0842 100644 --- a/exchanges/localbitcoins/localbitcoins_wrapper.go +++ b/exchanges/localbitcoins/localbitcoins_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (l *LocalBitcoins) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (l *LocalBitcoins) GetDefaultConfig() (*config.Exchange, error) { l.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = l.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = l.BaseCurrencies @@ -105,7 +105,7 @@ func (l *LocalBitcoins) SetDefaults() { } // Setup sets exchange configuration parameters -func (l *LocalBitcoins) Setup(exch *config.ExchangeConfig) error { +func (l *LocalBitcoins) Setup(exch *config.Exchange) error { if !exch.Enabled { l.SetEnabled(false) return nil diff --git a/exchanges/okcoin/okcoin_wrapper.go b/exchanges/okcoin/okcoin_wrapper.go index 2183d542..57f2f2e8 100644 --- a/exchanges/okcoin/okcoin_wrapper.go +++ b/exchanges/okcoin/okcoin_wrapper.go @@ -23,9 +23,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (o *OKCoin) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (o *OKCoin) GetDefaultConfig() (*config.Exchange, error) { o.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = o.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = o.BaseCurrencies diff --git a/exchanges/okex/okex_wrapper.go b/exchanges/okex/okex_wrapper.go index e52c822b..a2ff24a6 100644 --- a/exchanges/okex/okex_wrapper.go +++ b/exchanges/okex/okex_wrapper.go @@ -25,9 +25,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (o *OKEX) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (o *OKEX) GetDefaultConfig() (*config.Exchange, error) { o.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = o.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = o.BaseCurrencies diff --git a/exchanges/okgroup/okgroup_wrapper.go b/exchanges/okgroup/okgroup_wrapper.go index cd3f888a..4557bf81 100644 --- a/exchanges/okgroup/okgroup_wrapper.go +++ b/exchanges/okgroup/okgroup_wrapper.go @@ -30,7 +30,7 @@ import ( // When circumstances change, wrapper funcs can be split appropriately // Setup sets user exchange configuration settings -func (o *OKGroup) Setup(exch *config.ExchangeConfig) error { +func (o *OKGroup) Setup(exch *config.Exchange) error { if !exch.Enabled { o.SetEnabled(false) return nil @@ -46,21 +46,14 @@ func (o *OKGroup) Setup(exch *config.ExchangeConfig) error { return err } err = o.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: wsEndpoint, - ExchangeName: exch.Name, - RunningURL: wsEndpoint, - Connector: o.WsConnect, - Subscriber: o.Subscribe, - UnSubscriber: o.Unsubscribe, - GenerateSubscriptions: o.GenerateDefaultSubscriptions, - Features: &o.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: wsEndpoint, + RunningURL: wsEndpoint, + Connector: o.WsConnect, + Subscriber: o.Subscribe, + Unsubscriber: o.Unsubscribe, + GenerateSubscriptions: o.GenerateDefaultSubscriptions, + Features: &o.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/poloniex/poloniex_wrapper.go b/exchanges/poloniex/poloniex_wrapper.go index 86ed325e..f3381bd8 100644 --- a/exchanges/poloniex/poloniex_wrapper.go +++ b/exchanges/poloniex/poloniex_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (p *Poloniex) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (p *Poloniex) GetDefaultConfig() (*config.Exchange, error) { p.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = p.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = p.BaseCurrencies @@ -151,7 +151,7 @@ func (p *Poloniex) SetDefaults() { } // Setup sets user exchange configuration settings -func (p *Poloniex) Setup(exch *config.ExchangeConfig) error { +func (p *Poloniex) Setup(exch *config.Exchange) error { if !exch.Enabled { p.SetEnabled(false) return nil @@ -168,23 +168,16 @@ func (p *Poloniex) Setup(exch *config.ExchangeConfig) error { } err = p.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: poloniexWebsocketAddress, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: p.WsConnect, - Subscriber: p.Subscribe, - UnSubscriber: p.Unsubscribe, - GenerateSubscriptions: p.GenerateDefaultSubscriptions, - Features: &p.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, - SortBuffer: true, - SortBufferByUpdateIDs: true, + ExchangeConfig: exch, + DefaultURL: poloniexWebsocketAddress, + RunningURL: wsRunningURL, + Connector: p.WsConnect, + Subscriber: p.Subscribe, + Unsubscriber: p.Unsubscribe, + GenerateSubscriptions: p.GenerateDefaultSubscriptions, + Features: &p.Features.Supports.WebsocketCapabilities, + SortBuffer: true, + SortBufferByUpdateIDs: true, }) if err != nil { return err diff --git a/exchanges/sharedtestvalues/customex.go b/exchanges/sharedtestvalues/customex.go index 450bfc6d..a7d453c5 100644 --- a/exchanges/sharedtestvalues/customex.go +++ b/exchanges/sharedtestvalues/customex.go @@ -24,7 +24,7 @@ type CustomEx struct { exchange.Base } -func (c *CustomEx) Setup(exch *config.ExchangeConfig) error { +func (c *CustomEx) Setup(exch *config.Exchange) error { return nil } @@ -216,7 +216,7 @@ func (c *CustomEx) GetSubscriptions() ([]stream.ChannelSubscription, error) { return nil, nil } -func (c *CustomEx) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (c *CustomEx) GetDefaultConfig() (*config.Exchange, error) { return nil, nil } diff --git a/exchanges/stream/buffer/buffer.go b/exchanges/stream/buffer/buffer.go index 692c9caf..02fc1c95 100644 --- a/exchanges/stream/buffer/buffer.go +++ b/exchanges/stream/buffer/buffer.go @@ -6,6 +6,7 @@ import ( "sort" "time" + "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -15,7 +16,7 @@ import ( const packageError = "websocket orderbook buffer error: %w" var ( - errUnsetExchangeName = errors.New("exchange name unset") + errExchangeConfigNil = errors.New("exchange config is nil") errUnsetDataHandler = errors.New("datahandler unset") errIssueBufferEnabledButNoLimit = errors.New("buffer enabled but no limit set") errUpdateIsNil = errors.New("update is nil") @@ -25,34 +26,35 @@ var ( ) // Setup sets private variables -func (w *Orderbook) Setup(obBufferLimit int, - bufferEnabled, - sortBuffer, - sortBufferByUpdateIDs, - updateEntriesByID, - verbose bool, - publishPeriod time.Duration, - exchangeName string, - dataHandler chan interface{}) error { - if exchangeName == "" { - return fmt.Errorf(packageError, errUnsetExchangeName) +func (w *Orderbook) Setup(cfg *config.Exchange, sortBuffer, sortBufferByUpdateIDs, updateEntriesByID bool, dataHandler chan interface{}) error { + if cfg == nil { // exchange config fields are checked in stream package + // prior to calling this, so further checks are not needed. + return fmt.Errorf(packageError, errExchangeConfigNil) } if dataHandler == nil { return fmt.Errorf(packageError, errUnsetDataHandler) } - if bufferEnabled && obBufferLimit < 1 { + if cfg.Orderbook.WebsocketBufferEnabled && + cfg.Orderbook.WebsocketBufferLimit < 1 { return fmt.Errorf(packageError, errIssueBufferEnabledButNoLimit) } - w.obBufferLimit = obBufferLimit - w.bufferEnabled = bufferEnabled + + w.bufferEnabled = cfg.Orderbook.WebsocketBufferEnabled + w.obBufferLimit = cfg.Orderbook.WebsocketBufferLimit w.sortBuffer = sortBuffer w.sortBufferByUpdateIDs = sortBufferByUpdateIDs w.updateEntriesByID = updateEntriesByID - w.exchangeName = exchangeName + w.exchangeName = cfg.Name w.dataHandler = dataHandler w.ob = make(map[currency.Code]map[currency.Code]map[asset.Item]*orderbookHolder) - w.verbose = verbose - w.publishPeriod = publishPeriod + w.verbose = cfg.Verbose + + // set default publish period if missing + orderbookPublishPeriod := config.DefaultOrderbookPublishPeriod + if cfg.Orderbook.PublishPeriod != nil { + orderbookPublishPeriod = *cfg.Orderbook.PublishPeriod + } + w.publishPeriod = orderbookPublishPeriod return nil } diff --git a/exchanges/stream/buffer/buffer_test.go b/exchanges/stream/buffer/buffer_test.go index aea2dd64..2963c403 100644 --- a/exchanges/stream/buffer/buffer_test.go +++ b/exchanges/stream/buffer/buffer_test.go @@ -6,21 +6,24 @@ import ( "testing" "time" + "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" ) -var itemArray = [][]orderbook.Item{ - {{Price: 1000, Amount: 1, ID: 1000}}, - {{Price: 2000, Amount: 1, ID: 2000}}, - {{Price: 3000, Amount: 1, ID: 3000}}, - {{Price: 3000, Amount: 2, ID: 4000}}, - {{Price: 4000, Amount: 0, ID: 6000}}, - {{Price: 5000, Amount: 1, ID: 5000}}, -} +var ( + itemArray = [][]orderbook.Item{ + {{Price: 1000, Amount: 1, ID: 1000}}, + {{Price: 2000, Amount: 1, ID: 2000}}, + {{Price: 3000, Amount: 1, ID: 3000}}, + {{Price: 3000, Amount: 2, ID: 4000}}, + {{Price: 4000, Amount: 0, ID: 6000}}, + {{Price: 5000, Amount: 1, ID: 5000}}, + } -var cp, _ = currency.NewPairFromString("BTCUSD") + cp, _ = currency.NewPairFromString("BTCUSD") +) const ( exchangeName = "exchangeTest" @@ -712,22 +715,27 @@ func TestGetOrderbook(t *testing.T) { func TestSetup(t *testing.T) { t.Parallel() w := Orderbook{} - err := w.Setup(0, false, false, false, false, true, 0, "", nil) - if !errors.Is(err, errUnsetExchangeName) { - t.Fatalf("expected error %v but received %v", errUnsetExchangeName, err) + err := w.Setup(nil, false, false, false, nil) + if !errors.Is(err, errExchangeConfigNil) { + t.Fatalf("expected error %v but received %v", errExchangeConfigNil, err) } - err = w.Setup(0, false, false, false, false, false, 0, "test", nil) + exchangeConfig := &config.Exchange{} + err = w.Setup(exchangeConfig, false, false, false, nil) if !errors.Is(err, errUnsetDataHandler) { t.Fatalf("expected error %v but received %v", errUnsetDataHandler, err) } - err = w.Setup(0, true, false, false, false, true, 0, "test", make(chan interface{})) + exchangeConfig.Orderbook.WebsocketBufferEnabled = true + err = w.Setup(exchangeConfig, false, false, false, make(chan interface{})) if !errors.Is(err, errIssueBufferEnabledButNoLimit) { t.Fatalf("expected error %v but received %v", errIssueBufferEnabledButNoLimit, err) } - err = w.Setup(1337, true, true, true, true, false, 0, "test", make(chan interface{})) + exchangeConfig.Orderbook.WebsocketBufferLimit = 1337 + exchangeConfig.Orderbook.WebsocketBufferEnabled = true + exchangeConfig.Name = "test" + err = w.Setup(exchangeConfig, true, true, true, make(chan interface{})) if err != nil { t.Fatal(err) } @@ -1002,7 +1010,7 @@ func TestUpdateByIDAndAction(t *testing.T) { func TestFlushOrderbook(t *testing.T) { t.Parallel() w := &Orderbook{} - err := w.Setup(5, false, false, false, false, false, 0, "test", make(chan interface{}, 2)) + err := w.Setup(&config.Exchange{Name: "test"}, false, false, false, make(chan interface{}, 2)) if err != nil { t.Fatal(err) } diff --git a/exchanges/stream/websocket.go b/exchanges/stream/websocket.go index 7a23a58a..8d9609b8 100644 --- a/exchanges/stream/websocket.go +++ b/exchanges/stream/websocket.go @@ -24,10 +24,26 @@ const ( ) var ( - errClosedConnection = errors.New("use of closed network connection") // ErrSubscriptionFailure defines an error when a subscription fails ErrSubscriptionFailure = errors.New("subscription failure") - errAlreadyRunning = errors.New("connection monitor is already running") + + errAlreadyRunning = errors.New("connection monitor is already running") + errExchangeConfigIsNil = errors.New("exchange config is nil") + errWebsocketIsNil = errors.New("websocket is nil") + errWebsocketSetupIsNil = errors.New("websocket setup is nil") + errWebsocketAlreadyInitialised = errors.New("websocket already initialised") + errWebsocketFeaturesIsUnset = errors.New("websocket features is unset") + errConfigFeaturesIsNil = errors.New("exchange config features is nil") + errDefaultURLIsEmpty = errors.New("default url is empty") + errRunningURLIsEmpty = errors.New("running url cannot be empty") + errInvalidWebsocketURL = errors.New("invalid websocket url") + errExchangeConfigNameUnset = errors.New("exchange config name unset") + errInvalidTrafficTimeout = errors.New("invalid traffic timeout") + errWebsocketSubscriberUnset = errors.New("websocket subscriber function needs to be set") + errWebsocketUnsubscriberUnset = errors.New("websocket unsubscriber functionality allowed but unsubscriber function not set") + errWebsocketConnectorUnset = errors.New("websocket connector function not set") + errWebsocketSubscriptionsGeneratorUnset = errors.New("websocket subscriptions generator function needs to be set") + errClosedConnection = errors.New("use of closed network connection") ) // New initialises the websocket struct @@ -44,97 +60,95 @@ func New() *Websocket { } } -var ( - errSubscriberUnset = errors.New("subscriber function needs to be set") - errGenerateSubsciptionsUnset = errors.New("generate subscriptions function needs to be set") -) - // Setup sets main variables for websocket connection func (w *Websocket) Setup(s *WebsocketSetup) error { if w == nil { - return errors.New("websocket is nil") + return errWebsocketIsNil } if s == nil { - return errors.New("websocket setup is nil") + return errWebsocketSetupIsNil } if !w.Init { - return fmt.Errorf("%s Websocket already initialised", - s.ExchangeName) + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketAlreadyInitialised) } - w.verbose = s.Verbose + if s.ExchangeConfig == nil { + return errExchangeConfigIsNil + } + + if s.ExchangeConfig.Name == "" { + return errExchangeConfigNameUnset + } + w.exchangeName = s.ExchangeConfig.Name + w.verbose = s.ExchangeConfig.Verbose + if s.Features == nil { - return errors.New("websocket features is unset") + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketFeaturesIsUnset) } - w.features = s.Features + if s.ExchangeConfig.Features == nil { + return fmt.Errorf("%s %w", w.exchangeName, errConfigFeaturesIsNil) + } + w.enabled = s.ExchangeConfig.Features.Enabled.Websocket + + if s.Connector == nil { + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketConnectorUnset) + } + w.connector = s.Connector + if s.Subscriber == nil { - return errSubscriberUnset + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketSubscriberUnset) } w.Subscriber = s.Subscriber - if w.features.Unsubscribe && s.UnSubscriber == nil { - return errors.New("features have been set yet channel unsubscriber is not set") + if w.features.Unsubscribe && s.Unsubscriber == nil { + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketUnsubscriberUnset) } - w.Unsubscriber = s.UnSubscriber + w.Unsubscriber = s.Unsubscriber if s.GenerateSubscriptions == nil { - return errGenerateSubsciptionsUnset + return fmt.Errorf("%s %w", w.exchangeName, errWebsocketSubscriptionsGeneratorUnset) } w.GenerateSubs = s.GenerateSubscriptions - w.enabled = s.Enabled if s.DefaultURL == "" { - return errors.New("default url is empty") + return fmt.Errorf("%s websocket %w", w.exchangeName, errDefaultURLIsEmpty) } w.defaultURL = s.DefaultURL if s.RunningURL == "" { - return errors.New("running URL cannot be nil") + return fmt.Errorf("%s websocket %w", w.exchangeName, errRunningURLIsEmpty) } err := w.SetWebsocketURL(s.RunningURL, false, false) if err != nil { - return err + return fmt.Errorf("%s %w", w.exchangeName, err) } if s.RunningURLAuth != "" { err = w.SetWebsocketURL(s.RunningURLAuth, true, false) if err != nil { - return err + return fmt.Errorf("%s %w", w.exchangeName, err) } } - w.connector = s.Connector - if s.ExchangeName == "" { - return errors.New("exchange name unset") + if s.ExchangeConfig.WebsocketTrafficTimeout < time.Second { + return fmt.Errorf("%s %w cannot be less than %s", + w.exchangeName, + errInvalidTrafficTimeout, + time.Second) } - w.exchangeName = s.ExchangeName - - if s.WebsocketTimeout < time.Second { - return fmt.Errorf("traffic timeout cannot be less than %s", time.Second) - } - w.trafficTimeout = s.WebsocketTimeout + w.trafficTimeout = s.ExchangeConfig.WebsocketTrafficTimeout w.ShutdownC = make(chan struct{}) w.Wg = new(sync.WaitGroup) - w.SetCanUseAuthenticatedEndpoints(s.AuthenticatedWebsocketAPISupport) + w.SetCanUseAuthenticatedEndpoints(s.ExchangeConfig.API.AuthenticatedWebsocketSupport) - // default publish period if missing - orderbookPublishPeriod := config.DefaultOrderbookPublishPeriod - if s.OrderbookPublishPeriod != nil { - orderbookPublishPeriod = *s.OrderbookPublishPeriod - } - - return w.Orderbook.Setup(s.OrderbookBufferLimit, - s.BufferEnabled, + return w.Orderbook.Setup(s.ExchangeConfig, s.SortBuffer, s.SortBufferByUpdateIDs, s.UpdateEntriesByID, - s.Verbose, - orderbookPublishPeriod, - w.exchangeName, w.DataHandler) } @@ -948,7 +962,7 @@ func checkWebsocketURL(s string) error { return err } if u.Scheme != "ws" && u.Scheme != "wss" { - return fmt.Errorf("cannot set invalid websocket URL %s", s) + return fmt.Errorf("cannot set %w %s", errInvalidWebsocketURL, s) } return nil } diff --git a/exchanges/stream/websocket_test.go b/exchanges/stream/websocket_test.go index 1292afd0..80ea4104 100644 --- a/exchanges/stream/websocket_test.go +++ b/exchanges/stream/websocket_test.go @@ -16,6 +16,7 @@ import ( "time" "github.com/gorilla/websocket" + "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" ) @@ -52,15 +53,21 @@ type testResponse struct { } var defaultSetup = &WebsocketSetup{ - Enabled: true, - AuthenticatedWebsocketAPISupport: true, - WebsocketTimeout: time.Second * 5, - DefaultURL: "testDefaultURL", - ExchangeName: "exchangeName", - RunningURL: "wss://testRunningURL", - Connector: func() error { return nil }, - Subscriber: func(_ []ChannelSubscription) error { return nil }, - UnSubscriber: func(_ []ChannelSubscription) error { return nil }, + ExchangeConfig: &config.Exchange{ + Features: &config.FeaturesConfig{ + Enabled: config.FeaturesEnabledConfig{Websocket: true}, + }, + API: config.APIConfig{ + AuthenticatedWebsocketSupport: true, + }, + WebsocketTrafficTimeout: time.Second * 5, + Name: "exchangeName", + }, + DefaultURL: "testDefaultURL", + RunningURL: "wss://testRunningURL", + Connector: func() error { return nil }, + Subscriber: func(_ []ChannelSubscription) error { return nil }, + Unsubscriber: func(_ []ChannelSubscription) error { return nil }, GenerateSubscriptions: func() ([]ChannelSubscription, error) { return []ChannelSubscription{ {Channel: "TestSub"}, @@ -90,75 +97,104 @@ func TestSetup(t *testing.T) { t.Parallel() var w *Websocket err := w.Setup(nil) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errWebsocketIsNil) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketIsNil) } + w = &Websocket{DataHandler: make(chan interface{})} err = w.Setup(nil) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errWebsocketSetupIsNil) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSetupIsNil) } - w.Init = true + websocketSetup := &WebsocketSetup{} err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errWebsocketAlreadyInitialised) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketAlreadyInitialised) } + + w.Init = true + err = w.Setup(websocketSetup) + if !errors.Is(err, errExchangeConfigIsNil) { + t.Fatalf("received: '%v' but expected: '%v'", err, errExchangeConfigIsNil) + } + + websocketSetup.ExchangeConfig = &config.Exchange{} + err = w.Setup(websocketSetup) + if !errors.Is(err, errExchangeConfigNameUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errExchangeConfigNameUnset) + } + websocketSetup.ExchangeConfig.Name = "testname" + + err = w.Setup(websocketSetup) + if !errors.Is(err, errWebsocketFeaturesIsUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketFeaturesIsUnset) + } + websocketSetup.Features = &protocol.Features{} err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errConfigFeaturesIsNil) { + t.Fatalf("received: '%v' but expected: '%v'", err, errConfigFeaturesIsNil) } - websocketSetup.Features.Subscribe = true + + websocketSetup.ExchangeConfig.Features = &config.FeaturesConfig{} err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errWebsocketConnectorUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketConnectorUnset) } + + websocketSetup.Connector = func() error { return nil } + err = w.Setup(websocketSetup) + if !errors.Is(err, errWebsocketSubscriberUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSubscriberUnset) + } + websocketSetup.Subscriber = func([]ChannelSubscription) error { return nil } websocketSetup.Features.Unsubscribe = true err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") + if !errors.Is(err, errWebsocketUnsubscriberUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketUnsubscriberUnset) } - websocketSetup.UnSubscriber = func([]ChannelSubscription) error { return nil } + + websocketSetup.Unsubscriber = func([]ChannelSubscription) error { return nil } err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.DefaultURL = "test" - err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.RunningURL = "http://www.google.com" - err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.RunningURL = "wss://www.google.com" - websocketSetup.RunningURLAuth = "http://www.google.com" - err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.RunningURLAuth = "wss://www.google.com" - err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.ExchangeName = "testname" - err = w.Setup(websocketSetup) - if err == nil { - t.Fatal("error cannot be nil") - } - websocketSetup.WebsocketTimeout = time.Minute - err = w.Setup(websocketSetup) - if !errors.Is(err, errGenerateSubsciptionsUnset) { - t.Fatalf("received: %v but expected: %v", err, errGenerateSubsciptionsUnset) + if !errors.Is(err, errWebsocketSubscriptionsGeneratorUnset) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSubscriptionsGeneratorUnset) } websocketSetup.GenerateSubscriptions = func() ([]ChannelSubscription, error) { return nil, nil } err = w.Setup(websocketSetup) + if !errors.Is(err, errDefaultURLIsEmpty) { + t.Fatalf("received: '%v' but expected: '%v'", err, errDefaultURLIsEmpty) + } + + websocketSetup.DefaultURL = "test" + err = w.Setup(websocketSetup) + if !errors.Is(err, errRunningURLIsEmpty) { + t.Fatalf("received: '%v' but expected: '%v'", err, errRunningURLIsEmpty) + } + + websocketSetup.RunningURL = "http://www.google.com" + err = w.Setup(websocketSetup) + if !errors.Is(err, errInvalidWebsocketURL) { + t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidWebsocketURL) + } + + websocketSetup.RunningURL = "wss://www.google.com" + websocketSetup.RunningURLAuth = "http://www.google.com" + err = w.Setup(websocketSetup) + if !errors.Is(err, errInvalidWebsocketURL) { + t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidWebsocketURL) + } + + websocketSetup.RunningURLAuth = "wss://www.google.com" + err = w.Setup(websocketSetup) + if !errors.Is(err, errInvalidTrafficTimeout) { + t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidTrafficTimeout) + } + + websocketSetup.ExchangeConfig.WebsocketTrafficTimeout = time.Minute + err = w.Setup(websocketSetup) if !errors.Is(err, nil) { t.Fatalf("received: %v but expected: %v", err, nil) } @@ -294,11 +330,15 @@ func TestWebsocket(t *testing.T) { t.Parallel() wsInit := Websocket{} err := wsInit.Setup(&WebsocketSetup{ - ExchangeName: "test", - Enabled: true, + ExchangeConfig: &config.Exchange{ + Features: &config.FeaturesConfig{ + Enabled: config.FeaturesEnabledConfig{Websocket: true}, + }, + Name: "test", + }, }) - if err != nil && err.Error() != "test Websocket already initialised" { - t.Errorf("Expected 'test Websocket already initialised', received %v", err) + if !errors.Is(err, errWebsocketAlreadyInitialised) { + t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketAlreadyInitialised) } ws := *New() diff --git a/exchanges/stream/websocket_types.go b/exchanges/stream/websocket_types.go index 60a5787e..189a5c31 100644 --- a/exchanges/stream/websocket_types.go +++ b/exchanges/stream/websocket_types.go @@ -5,6 +5,7 @@ import ( "time" "github.com/gorilla/websocket" + "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/stream/buffer" ) @@ -86,28 +87,19 @@ type Websocket struct { // WebsocketSetup defines variables for setting up a websocket connection type WebsocketSetup struct { - Enabled bool - Verbose bool - AuthenticatedWebsocketAPISupport bool - WebsocketTimeout time.Duration - DefaultURL string - ExchangeName string - RunningURL string - RunningURLAuth string - Connector func() error - Subscriber func([]ChannelSubscription) error - UnSubscriber func([]ChannelSubscription) error - GenerateSubscriptions func() ([]ChannelSubscription, error) - Features *protocol.Features + ExchangeConfig *config.Exchange + DefaultURL string + RunningURL string + RunningURLAuth string + Connector func() error + Subscriber func([]ChannelSubscription) error + Unsubscriber func([]ChannelSubscription) error + GenerateSubscriptions func() ([]ChannelSubscription, error) + Features *protocol.Features // Local orderbook buffer config values - OrderbookBufferLimit int - BufferEnabled bool SortBuffer bool SortBufferByUpdateIDs bool UpdateEntriesByID bool - // OrderbookPublishPeriod is a pointer for the same reason as it is in `OrderbookConfig`: - // to allow distinguishing between a zeroed out value and a missing one - OrderbookPublishPeriod *time.Duration } // WebsocketConnection contains all the data needed to send a message to a WS diff --git a/exchanges/yobit/yobit_wrapper.go b/exchanges/yobit/yobit_wrapper.go index a8445e27..f7db2ad5 100644 --- a/exchanges/yobit/yobit_wrapper.go +++ b/exchanges/yobit/yobit_wrapper.go @@ -29,9 +29,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (y *Yobit) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (y *Yobit) GetDefaultConfig() (*config.Exchange, error) { y.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = y.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = y.BaseCurrencies @@ -111,7 +111,7 @@ func (y *Yobit) SetDefaults() { } // Setup sets exchange configuration parameters for Yobit -func (y *Yobit) Setup(exch *config.ExchangeConfig) error { +func (y *Yobit) Setup(exch *config.Exchange) error { if !exch.Enabled { y.SetEnabled(false) return nil diff --git a/exchanges/zb/zb_mock_test.go b/exchanges/zb/zb_mock_test.go index dea033b9..f1ac27e7 100644 --- a/exchanges/zb/zb_mock_test.go +++ b/exchanges/zb/zb_mock_test.go @@ -25,7 +25,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal("ZB load config error", err) } - var zbConfig *config.ExchangeConfig + var zbConfig *config.Exchange zbConfig, err = cfg.GetExchangeConfig("ZB") if err != nil { log.Fatal("ZB Setup() init error", err) diff --git a/exchanges/zb/zb_wrapper.go b/exchanges/zb/zb_wrapper.go index f35ca6f4..2954f55b 100644 --- a/exchanges/zb/zb_wrapper.go +++ b/exchanges/zb/zb_wrapper.go @@ -30,9 +30,9 @@ import ( ) // GetDefaultConfig returns a default exchange config -func (z *ZB) GetDefaultConfig() (*config.ExchangeConfig, error) { +func (z *ZB) GetDefaultConfig() (*config.Exchange, error) { z.SetDefaults() - exchCfg := new(config.ExchangeConfig) + exchCfg := new(config.Exchange) exchCfg.Name = z.Name exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout exchCfg.BaseCurrencies = z.BaseCurrencies @@ -148,7 +148,7 @@ func (z *ZB) SetDefaults() { } // Setup sets user configuration -func (z *ZB) Setup(exch *config.ExchangeConfig) error { +func (z *ZB) Setup(exch *config.Exchange) error { if !exch.Enabled { z.SetEnabled(false) return nil @@ -165,20 +165,13 @@ func (z *ZB) Setup(exch *config.ExchangeConfig) error { } err = z.Websocket.Setup(&stream.WebsocketSetup{ - Enabled: exch.Features.Enabled.Websocket, - Verbose: exch.Verbose, - AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, - WebsocketTimeout: exch.WebsocketTrafficTimeout, - DefaultURL: zbWebsocketAPI, - ExchangeName: exch.Name, - RunningURL: wsRunningURL, - Connector: z.WsConnect, - GenerateSubscriptions: z.GenerateDefaultSubscriptions, - Subscriber: z.Subscribe, - Features: &z.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, - OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod, - BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, + ExchangeConfig: exch, + DefaultURL: zbWebsocketAPI, + RunningURL: wsRunningURL, + Connector: z.WsConnect, + GenerateSubscriptions: z.GenerateDefaultSubscriptions, + Subscriber: z.Subscribe, + Features: &z.Features.Supports.WebsocketCapabilities, }) if err != nil { return err