diff --git a/README.md b/README.md index ada6a237..de4a63e0 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ Binaries will be published once the codebase reaches a stable condition. | [dependabot[bot]](https://github.com/apps/dependabot) | 369 | | [shazbert](https://github.com/shazbert) | 362 | | [gloriousCode](https://github.com/gloriousCode) | 237 | -| [gbjk](https://github.com/gbjk) | 123 | +| [gbjk](https://github.com/gbjk) | 125 | | [dependabot-preview[bot]](https://github.com/apps/dependabot-preview) | 88 | | [xtda](https://github.com/xtda) | 47 | | [lrascao](https://github.com/lrascao) | 27 | diff --git a/cmd/documentation/internal_templates/internal_exchange_websocket_readme.tmpl b/cmd/documentation/exchange_templates/exchange_websocket_readme.tmpl similarity index 83% rename from cmd/documentation/internal_templates/internal_exchange_websocket_readme.tmpl rename to cmd/documentation/exchange_templates/exchange_websocket_readme.tmpl index 5ea81254..ee7a9100 100644 --- a/cmd/documentation/internal_templates/internal_exchange_websocket_readme.tmpl +++ b/cmd/documentation/exchange_templates/exchange_websocket_readme.tmpl @@ -1,4 +1,4 @@ -{{define "internal exchange websocket" -}} +{{define "exchange websocket" -}} {{template "header" .}} ## Overview @@ -26,18 +26,18 @@ Example setup for the `websocket` package connection: package main import ( - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - exchange "github.com/thrasher-corp/gocryptotrader/exchanges" - "github.com/thrasher-corp/gocryptotrader/exchanges/request" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + exchange "github.com/thrasher-corp/gocryptotrader/exchanges" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" ) type Exchange struct { - exchange.Base + exchange.Base } // In the exchange wrapper this will set up the initial pointer field provided by exchange.Base func (e *Exchange) SetDefault() { - e.Websocket = websocket.NewManager() + e.Websocket = websocket.NewManager() e.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit e.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout e.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -45,8 +45,8 @@ func (e *Exchange) SetDefault() { // In the exchange wrapper this is the original setup pattern for the websocket services func (e *Exchange) Setup(exch *config.Exchange) error { - // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. - if err := e.Websocket.Setup(&websocket.ManagerSetup{ + // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. + if err := e.Websocket.Setup(&websocket.ManagerSetup{ ExchangeConfig: exch, DefaultURL: connectionURLString, RunningURL: connectionURLString, @@ -61,7 +61,7 @@ func (e *Exchange) Setup(exch *config.Exchange) error { return err } - // This is a public websocket connection + // This is a public websocket connection if err := ok.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLString, ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, @@ -71,7 +71,7 @@ func (e *Exchange) Setup(exch *config.Exchange) error { return err } - // This is a private websocket connection + // This is a private websocket connection return ok.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: privateConnectionURLString, ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, @@ -87,49 +87,46 @@ func (e *Exchange) Setup(exch *config.Exchange) error { to be maintained and established based off URL, connections types, asset types etc. ```go func (e *Exchange) Setup(exch *config.Exchange) error { - // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. - if err := e.Websocket.Setup(&websocket.ManagerSetup{ + // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. + if err := e.Websocket.Setup(&websocket.ManagerSetup{ ExchangeConfig: exch, Features: &e.Features.Supports.WebsocketCapabilities, FillsFeed: e.Features.Enabled.FillsFeed, TradeFeed: e.Features.Enabled.TradeFeed, UseMultiConnectionManagement: true, - }) - if err != nil { + }); err != nil { return err } // Spot connection - err = g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ + if err := g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLStringForSpot, RateLimit: request.NewWeightedRateLimitByDuration(gateioWebsocketRateLimit), ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, - // Custom handlers for the specific connection: + // Custom handlers for the specific connection: Handler: e.WsHandleSpotData, Subscriber: e.SpotSubscribe, Unsubscriber: e.SpotUnsubscribe, GenerateSubscriptions: e.GenerateDefaultSubscriptionsSpot, Connector: e.WsConnectSpot, BespokeGenerateMessageID: e.GenerateWebsocketMessageID, - }) - if err != nil { + }); err != nil { return err } // Futures connection - USDT margined - err = g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ + if err := g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLStringForSpotForFutures, RateLimit: request.NewWeightedRateLimitByDuration(gateioWebsocketRateLimit), ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, - // Custom handlers for the specific connection: + // Custom handlers for the specific connection: Handler: func(ctx context.Context, incoming []byte) error { return e.WsHandleFuturesData(ctx, incoming, asset.Futures) }, Subscriber: e.FuturesSubscribe, Unsubscriber: e.FuturesUnsubscribe, GenerateSubscriptions: func() (subscription.List, error) { return e.GenerateFuturesDefaultSubscriptions(currency.USDT) }, Connector: e.WsFuturesConnect, BespokeGenerateMessageID: e.GenerateWebsocketMessageID, - }) - if err != nil { + }); err != nil { return err } } diff --git a/cmd/exchange_template/wrapper_file.tmpl b/cmd/exchange_template/wrapper_file.tmpl index fca261ea..0a1c82e1 100644 --- a/cmd/exchange_template/wrapper_file.tmpl +++ b/cmd/exchange_template/wrapper_file.tmpl @@ -21,7 +21,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/cmd/exchange_wrapper_standards/exchange_wrapper_standards_test.go b/cmd/exchange_wrapper_standards/exchange_wrapper_standards_test.go index 8e6f8116..2239c17c 100644 --- a/cmd/exchange_wrapper_standards/exchange_wrapper_standards_test.go +++ b/cmd/exchange_wrapper_standards/exchange_wrapper_standards_test.go @@ -16,6 +16,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/engine" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -649,6 +650,7 @@ var acceptableErrors = []error{ account.ErrExchangeHoldingsNotFound, ticker.ErrTickerNotFound, orderbook.ErrOrderbookNotFound, + websocket.ErrNotConnected, } // warningErrors will t.Log(err) when thrown to diagnose things, but not necessarily suggest diff --git a/common/common.go b/common/common.go index 2958caed..0b5a3c63 100644 --- a/common/common.go +++ b/common/common.go @@ -67,6 +67,7 @@ var ( ErrEmptyParams = errors.New("empty parameters") ErrCannotCalculateOffline = errors.New("cannot calculate offline, unsupported") ErrNoResponse = errors.New("no response") + ErrInvalidResponse = errors.New("invalid response") ErrTypeAssertFailure = errors.New("type assert failure") ErrNoResults = errors.New("no results found") ErrUnknownError = errors.New("unknown error") diff --git a/engine/websocketroutine_manager.go b/engine/websocketroutine_manager.go index 3434339e..8795661b 100644 --- a/engine/websocketroutine_manager.go +++ b/engine/websocketroutine_manager.go @@ -7,13 +7,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/engine/websocketroutine_manager_test.go b/engine/websocketroutine_manager_test.go index e8fcd299..201383a4 100644 --- a/engine/websocketroutine_manager_test.go +++ b/engine/websocketroutine_manager_test.go @@ -9,11 +9,11 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) func TestWebsocketRoutineManagerSetup(t *testing.T) { diff --git a/internal/exchange/websocket/README.md b/exchange/websocket/README.md similarity index 87% rename from internal/exchange/websocket/README.md rename to exchange/websocket/README.md index bd038473..eda0e8a4 100644 --- a/internal/exchange/websocket/README.md +++ b/exchange/websocket/README.md @@ -5,7 +5,7 @@ [![Build Status](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml) [![Software License](https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square)](https://github.com/thrasher-corp/gocryptotrader/blob/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/thrasher-corp/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket) +[![GoDoc](https://godoc.org/github.com/thrasher-corp/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-corp/gocryptotrader/exchange/websocket) [![Coverage Status](https://codecov.io/gh/thrasher-corp/gocryptotrader/graph/badge.svg?token=41784B23TS)](https://codecov.io/gh/thrasher-corp/gocryptotrader) [![Go Report Card](https://goreportcard.com/badge/github.com/thrasher-corp/gocryptotrader)](https://goreportcard.com/report/github.com/thrasher-corp/gocryptotrader) @@ -44,18 +44,18 @@ Example setup for the `websocket` package connection: package main import ( - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - exchange "github.com/thrasher-corp/gocryptotrader/exchanges" - "github.com/thrasher-corp/gocryptotrader/exchanges/request" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + exchange "github.com/thrasher-corp/gocryptotrader/exchanges" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" ) type Exchange struct { - exchange.Base + exchange.Base } // In the exchange wrapper this will set up the initial pointer field provided by exchange.Base func (e *Exchange) SetDefault() { - e.Websocket = websocket.NewManager() + e.Websocket = websocket.NewManager() e.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit e.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout e.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -63,8 +63,8 @@ func (e *Exchange) SetDefault() { // In the exchange wrapper this is the original setup pattern for the websocket services func (e *Exchange) Setup(exch *config.Exchange) error { - // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. - if err := e.Websocket.Setup(&websocket.ManagerSetup{ + // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. + if err := e.Websocket.Setup(&websocket.ManagerSetup{ ExchangeConfig: exch, DefaultURL: connectionURLString, RunningURL: connectionURLString, @@ -79,7 +79,7 @@ func (e *Exchange) Setup(exch *config.Exchange) error { return err } - // This is a public websocket connection + // This is a public websocket connection if err := ok.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLString, ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, @@ -89,7 +89,7 @@ func (e *Exchange) Setup(exch *config.Exchange) error { return err } - // This is a private websocket connection + // This is a private websocket connection return ok.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: privateConnectionURLString, ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, @@ -105,49 +105,46 @@ func (e *Exchange) Setup(exch *config.Exchange) error { to be maintained and established based off URL, connections types, asset types etc. ```go func (e *Exchange) Setup(exch *config.Exchange) error { - // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. - if err := e.Websocket.Setup(&websocket.ManagerSetup{ + // This sets up global connection, sub, unsub and generate subscriptions for each connection defined below. + if err := e.Websocket.Setup(&websocket.ManagerSetup{ ExchangeConfig: exch, Features: &e.Features.Supports.WebsocketCapabilities, FillsFeed: e.Features.Enabled.FillsFeed, TradeFeed: e.Features.Enabled.TradeFeed, UseMultiConnectionManagement: true, - }) - if err != nil { + }); err != nil { return err } // Spot connection - err = g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ + if err := g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLStringForSpot, RateLimit: request.NewWeightedRateLimitByDuration(gateioWebsocketRateLimit), ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, - // Custom handlers for the specific connection: + // Custom handlers for the specific connection: Handler: e.WsHandleSpotData, Subscriber: e.SpotSubscribe, Unsubscriber: e.SpotUnsubscribe, GenerateSubscriptions: e.GenerateDefaultSubscriptionsSpot, Connector: e.WsConnectSpot, BespokeGenerateMessageID: e.GenerateWebsocketMessageID, - }) - if err != nil { + }); err != nil { return err } // Futures connection - USDT margined - err = g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ + if err := g.Websocket.SetupNewConnection(&websocket.ConnectionSetup{ URL: connectionURLStringForSpotForFutures, RateLimit: request.NewWeightedRateLimitByDuration(gateioWebsocketRateLimit), ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, - // Custom handlers for the specific connection: + // Custom handlers for the specific connection: Handler: func(ctx context.Context, incoming []byte) error { return e.WsHandleFuturesData(ctx, incoming, asset.Futures) }, Subscriber: e.FuturesSubscribe, Unsubscriber: e.FuturesUnsubscribe, GenerateSubscriptions: func() (subscription.List, error) { return e.GenerateFuturesDefaultSubscriptions(currency.USDT) }, Connector: e.WsFuturesConnect, BespokeGenerateMessageID: e.GenerateWebsocketMessageID, - }) - if err != nil { + }); err != nil { return err } } diff --git a/internal/exchange/websocket/buffer/buffer.go b/exchange/websocket/buffer/buffer.go similarity index 100% rename from internal/exchange/websocket/buffer/buffer.go rename to exchange/websocket/buffer/buffer.go diff --git a/internal/exchange/websocket/buffer/buffer_test.go b/exchange/websocket/buffer/buffer_test.go similarity index 100% rename from internal/exchange/websocket/buffer/buffer_test.go rename to exchange/websocket/buffer/buffer_test.go diff --git a/internal/exchange/websocket/buffer/buffer_types.go b/exchange/websocket/buffer/buffer_types.go similarity index 100% rename from internal/exchange/websocket/buffer/buffer_types.go rename to exchange/websocket/buffer/buffer_types.go diff --git a/internal/exchange/websocket/connection.go b/exchange/websocket/connection.go similarity index 99% rename from internal/exchange/websocket/connection.go rename to exchange/websocket/connection.go index 762f2036..d560b5c8 100644 --- a/internal/exchange/websocket/connection.go +++ b/exchange/websocket/connection.go @@ -393,8 +393,8 @@ func (c *connection) GetURL() string { } // SendMessageReturnResponse will send a WS message to the connection and wait for response -func (c *connection) SendMessageReturnResponse(ctx context.Context, epl request.EndpointLimit, signature, request any) ([]byte, error) { - resps, err := c.SendMessageReturnResponses(ctx, epl, signature, request, 1) +func (c *connection) SendMessageReturnResponse(ctx context.Context, epl request.EndpointLimit, signature, payload any) ([]byte, error) { + resps, err := c.SendMessageReturnResponses(ctx, epl, signature, payload, 1) if err != nil { return nil, err } diff --git a/internal/exchange/websocket/manager.go b/exchange/websocket/manager.go similarity index 99% rename from internal/exchange/websocket/manager.go rename to exchange/websocket/manager.go index d283761f..6762b63e 100644 --- a/internal/exchange/websocket/manager.go +++ b/exchange/websocket/manager.go @@ -12,12 +12,12 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/internal/exchange/websocket/manager_test.go b/exchange/websocket/manager_test.go similarity index 100% rename from internal/exchange/websocket/manager_test.go rename to exchange/websocket/manager_test.go diff --git a/internal/exchange/websocket/match.go b/exchange/websocket/match.go similarity index 100% rename from internal/exchange/websocket/match.go rename to exchange/websocket/match.go diff --git a/internal/exchange/websocket/match_test.go b/exchange/websocket/match_test.go similarity index 100% rename from internal/exchange/websocket/match_test.go rename to exchange/websocket/match_test.go diff --git a/internal/exchange/websocket/subscriptions.go b/exchange/websocket/subscriptions.go similarity index 100% rename from internal/exchange/websocket/subscriptions.go rename to exchange/websocket/subscriptions.go diff --git a/internal/exchange/websocket/subscriptions_test.go b/exchange/websocket/subscriptions_test.go similarity index 100% rename from internal/exchange/websocket/subscriptions_test.go rename to exchange/websocket/subscriptions_test.go diff --git a/internal/exchange/websocket/types.go b/exchange/websocket/types.go similarity index 100% rename from internal/exchange/websocket/types.go rename to exchange/websocket/types.go diff --git a/exchanges/binance/binance_websocket.go b/exchanges/binance/binance_websocket.go index 3bb1429a..579784d3 100644 --- a/exchanges/binance/binance_websocket.go +++ b/exchanges/binance/binance_websocket.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -22,7 +23,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/binance/binance_wrapper.go b/exchanges/binance/binance_wrapper.go index 241bf706..419c5dc2 100644 --- a/exchanges/binance/binance_wrapper.go +++ b/exchanges/binance/binance_wrapper.go @@ -14,6 +14,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -30,8 +32,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/binanceus/binanceus_websocket.go b/exchanges/binanceus/binanceus_websocket.go index df2bb03c..ecfea815 100644 --- a/exchanges/binanceus/binanceus_websocket.go +++ b/exchanges/binanceus/binanceus_websocket.go @@ -12,6 +12,7 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -19,7 +20,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/binanceus/binanceus_wrapper.go b/exchanges/binanceus/binanceus_wrapper.go index 7ba008f3..f5c2acdf 100644 --- a/exchanges/binanceus/binanceus_wrapper.go +++ b/exchanges/binanceus/binanceus_wrapper.go @@ -11,6 +11,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -24,8 +26,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/bitfinex/bitfinex_test.go b/exchanges/bitfinex/bitfinex_test.go index 1c9dffbf..056bd04c 100644 --- a/exchanges/bitfinex/bitfinex_test.go +++ b/exchanges/bitfinex/bitfinex_test.go @@ -17,6 +17,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" @@ -26,7 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" diff --git a/exchanges/bitfinex/bitfinex_websocket.go b/exchanges/bitfinex/bitfinex_websocket.go index 575d4a7b..22996dd1 100644 --- a/exchanges/bitfinex/bitfinex_websocket.go +++ b/exchanges/bitfinex/bitfinex_websocket.go @@ -22,6 +22,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" @@ -30,7 +31,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/bitfinex/bitfinex_wrapper.go b/exchanges/bitfinex/bitfinex_wrapper.go index d69590bc..49b5ddbb 100644 --- a/exchanges/bitfinex/bitfinex_wrapper.go +++ b/exchanges/bitfinex/bitfinex_wrapper.go @@ -14,6 +14,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,8 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/bithumb/bithumb_websocket.go b/exchanges/bithumb/bithumb_websocket.go index 7fc953d7..65b19285 100644 --- a/exchanges/bithumb/bithumb_websocket.go +++ b/exchanges/bithumb/bithumb_websocket.go @@ -13,13 +13,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( diff --git a/exchanges/bithumb/bithumb_websocket_test.go b/exchanges/bithumb/bithumb_websocket_test.go index 6498de85..e310d773 100644 --- a/exchanges/bithumb/bithumb_websocket_test.go +++ b/exchanges/bithumb/bithumb_websocket_test.go @@ -7,12 +7,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" ) diff --git a/exchanges/bithumb/bithumb_wrapper.go b/exchanges/bithumb/bithumb_wrapper.go index 60a9c8f0..751f3dd5 100644 --- a/exchanges/bithumb/bithumb_wrapper.go +++ b/exchanges/bithumb/bithumb_wrapper.go @@ -13,6 +13,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,7 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/bitmex/bitmex_test.go b/exchanges/bitmex/bitmex_test.go index 895ef758..637a0a97 100644 --- a/exchanges/bitmex/bitmex_test.go +++ b/exchanges/bitmex/bitmex_test.go @@ -16,6 +16,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" diff --git a/exchanges/bitmex/bitmex_websocket.go b/exchanges/bitmex/bitmex_websocket.go index 4bc15ddc..8780ded4 100644 --- a/exchanges/bitmex/bitmex_websocket.go +++ b/exchanges/bitmex/bitmex_websocket.go @@ -16,13 +16,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/bitmex/bitmex_wrapper.go b/exchanges/bitmex/bitmex_wrapper.go index b929a8a2..c01c51f1 100644 --- a/exchanges/bitmex/bitmex_wrapper.go +++ b/exchanges/bitmex/bitmex_wrapper.go @@ -15,6 +15,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -28,8 +30,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/bitstamp/bitstamp_websocket.go b/exchanges/bitstamp/bitstamp_websocket.go index 6e2de693..c51a4b66 100644 --- a/exchanges/bitstamp/bitstamp_websocket.go +++ b/exchanges/bitstamp/bitstamp_websocket.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" @@ -23,7 +24,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/bitstamp/bitstamp_wrapper.go b/exchanges/bitstamp/bitstamp_wrapper.go index 92e5da7a..aac9e3f1 100644 --- a/exchanges/bitstamp/bitstamp_wrapper.go +++ b/exchanges/bitstamp/bitstamp_wrapper.go @@ -12,6 +12,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -25,7 +26,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/btcmarkets/btcmarkets_websocket.go b/exchanges/btcmarkets/btcmarkets_websocket.go index 21ac9296..21eaeff9 100644 --- a/exchanges/btcmarkets/btcmarkets_websocket.go +++ b/exchanges/btcmarkets/btcmarkets_websocket.go @@ -16,6 +16,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -23,7 +24,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index 3386418d..c41df944 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -13,6 +13,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -26,8 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/btse/btse_test.go b/exchanges/btse/btse_test.go index e7f6344a..72e05fe5 100644 --- a/exchanges/btse/btse_test.go +++ b/exchanges/btse/btse_test.go @@ -14,6 +14,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" ) diff --git a/exchanges/btse/btse_websocket.go b/exchanges/btse/btse_websocket.go index 967f7260..f66504df 100644 --- a/exchanges/btse/btse_websocket.go +++ b/exchanges/btse/btse_websocket.go @@ -13,13 +13,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/btse/btse_wrapper.go b/exchanges/btse/btse_wrapper.go index db8b495d..910a971e 100644 --- a/exchanges/btse/btse_wrapper.go +++ b/exchanges/btse/btse_wrapper.go @@ -14,6 +14,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,7 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/bybit/bybit_inverse_websocket.go b/exchanges/bybit/bybit_inverse_websocket.go index 890dea97..c3c9a785 100644 --- a/exchanges/bybit/bybit_inverse_websocket.go +++ b/exchanges/bybit/bybit_inverse_websocket.go @@ -6,10 +6,10 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) // WsInverseConnect connects to inverse websocket feed diff --git a/exchanges/bybit/bybit_linear_websocket.go b/exchanges/bybit/bybit_linear_websocket.go index 8f8d5b52..473d1b62 100644 --- a/exchanges/bybit/bybit_linear_websocket.go +++ b/exchanges/bybit/bybit_linear_websocket.go @@ -6,10 +6,10 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) // WsLinearConnect connects to linear a websocket feed diff --git a/exchanges/bybit/bybit_options_websocket.go b/exchanges/bybit/bybit_options_websocket.go index dfffe3dd..646ed088 100644 --- a/exchanges/bybit/bybit_options_websocket.go +++ b/exchanges/bybit/bybit_options_websocket.go @@ -8,10 +8,10 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) // WsOptionsConnect connects to options a websocket feed diff --git a/exchanges/bybit/bybit_test.go b/exchanges/bybit/bybit_test.go index 7c7c6703..3132717b 100644 --- a/exchanges/bybit/bybit_test.go +++ b/exchanges/bybit/bybit_test.go @@ -17,6 +17,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate" @@ -27,7 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" testws "github.com/thrasher-corp/gocryptotrader/internal/testing/websocket" diff --git a/exchanges/bybit/bybit_websocket.go b/exchanges/bybit/bybit_websocket.go index b0d0f0ec..85bd6755 100644 --- a/exchanges/bybit/bybit_websocket.go +++ b/exchanges/bybit/bybit_websocket.go @@ -14,6 +14,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( diff --git a/exchanges/bybit/bybit_wrapper.go b/exchanges/bybit/bybit_wrapper.go index ff5ce76e..88a52549 100644 --- a/exchanges/bybit/bybit_wrapper.go +++ b/exchanges/bybit/bybit_wrapper.go @@ -13,6 +13,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,8 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/coinbasepro/coinbasepro_test.go b/exchanges/coinbasepro/coinbasepro_test.go index 663d719b..10bae962 100644 --- a/exchanges/coinbasepro/coinbasepro_test.go +++ b/exchanges/coinbasepro/coinbasepro_test.go @@ -15,13 +15,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" "github.com/thrasher-corp/gocryptotrader/portfolio/banking" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" diff --git a/exchanges/coinbasepro/coinbasepro_websocket.go b/exchanges/coinbasepro/coinbasepro_websocket.go index 4f04e318..3c4258da 100644 --- a/exchanges/coinbasepro/coinbasepro_websocket.go +++ b/exchanges/coinbasepro/coinbasepro_websocket.go @@ -13,6 +13,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -20,7 +21,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( diff --git a/exchanges/coinbasepro/coinbasepro_wrapper.go b/exchanges/coinbasepro/coinbasepro_wrapper.go index b76abb97..883e1737 100644 --- a/exchanges/coinbasepro/coinbasepro_wrapper.go +++ b/exchanges/coinbasepro/coinbasepro_wrapper.go @@ -10,6 +10,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -24,8 +26,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/coinut/coinut_test.go b/exchanges/coinut/coinut_test.go index 33b57617..ce3e59ad 100644 --- a/exchanges/coinut/coinut_test.go +++ b/exchanges/coinut/coinut_test.go @@ -15,12 +15,12 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" 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/order" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/coinut/coinut_websocket.go b/exchanges/coinut/coinut_websocket.go index 243b6e5e..f00823e2 100644 --- a/exchanges/coinut/coinut_websocket.go +++ b/exchanges/coinut/coinut_websocket.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" @@ -22,7 +23,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/coinut/coinut_wrapper.go b/exchanges/coinut/coinut_wrapper.go index cee815d2..257c5fde 100644 --- a/exchanges/coinut/coinut_wrapper.go +++ b/exchanges/coinut/coinut_wrapper.go @@ -12,6 +12,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -25,8 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/deribit/deribit_websocket.go b/exchanges/deribit/deribit_websocket.go index 92cda72a..ca449ee4 100644 --- a/exchanges/deribit/deribit_websocket.go +++ b/exchanges/deribit/deribit_websocket.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/nonce" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/deribit/deribit_wrapper.go b/exchanges/deribit/deribit_wrapper.go index 501c6c60..de81a38f 100644 --- a/exchanges/deribit/deribit_wrapper.go +++ b/exchanges/deribit/deribit_wrapper.go @@ -14,6 +14,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,8 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/exchange.go b/exchanges/exchange.go index 96a68fa8..e73e6bba 100644 --- a/exchanges/exchange.go +++ b/exchanges/exchange.go @@ -19,6 +19,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/collateral" @@ -34,7 +35,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/banking" ) @@ -58,7 +58,6 @@ var ( ) var ( - errSetAssetPairStore = errors.New("error storing asset pair store") errEndpointStringNotFound = errors.New("endpoint string not found") errConfigPairFormatRequiresDelimiter = errors.New("config pair format requires delimiter") errSetDefaultsNotCalled = errors.New("set defaults not called") @@ -1932,3 +1931,8 @@ func (b *Base) GetCachedAccountInfo(ctx context.Context, assetType asset.Item) ( } return account.GetHoldings(b.Name, creds, assetType) } + +// WebsocketSubmitOrder submits an order to the exchange via a websocket connection +func (*Base) WebsocketSubmitOrder(context.Context, *order.Submit) (*order.SubmitResponse, error) { + return nil, common.ErrFunctionNotSupported +} diff --git a/exchanges/exchange_test.go b/exchanges/exchange_test.go index fd009f22..bd036f0a 100644 --- a/exchanges/exchange_test.go +++ b/exchanges/exchange_test.go @@ -13,6 +13,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/collateral" @@ -28,7 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/portfolio/banking" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) @@ -3144,3 +3144,8 @@ func TestSetConfigPairFormatFromExchange(t *testing.T) { assert.Equal(t, "🐋", b.Config.CurrencyPairs.Pairs[asset.Spot].ConfigFormat.Delimiter, "ConfigFormat should be correct and have a blow hole") assert.Equal(t, "🦥", b.Config.CurrencyPairs.Pairs[asset.Spot].RequestFormat.Delimiter, "RequestFormat should be correct and kinda lazy") } + +func TestWebsocketSubmitOrder(t *testing.T) { + _, err := (&Base{}).WebsocketSubmitOrder(context.Background(), nil) + require.ErrorIs(t, err, common.ErrFunctionNotSupported) +} diff --git a/exchanges/exchange_types.go b/exchanges/exchange_types.go index d1d557af..011382cb 100644 --- a/exchanges/exchange_types.go +++ b/exchanges/exchange_types.go @@ -6,6 +6,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/currencystate" @@ -14,7 +15,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) // Endpoint authentication types diff --git a/exchanges/gateio/gateio.go b/exchanges/gateio/gateio.go index 6062497e..b3abf8c7 100644 --- a/exchanges/gateio/gateio.go +++ b/exchanges/gateio/gateio.go @@ -142,7 +142,6 @@ var ( errInvalidAmount = errors.New("invalid amount") errInvalidOrEmptySubaccount = errors.New("invalid or empty subaccount") errInvalidTransferDirection = errors.New("invalid transfer direction") - errInvalidOrderSide = errors.New("invalid order side") errDifferentAccount = errors.New("account type must be identical for all orders") errInvalidPrice = errors.New("invalid price") errNoValidParameterPassed = errors.New("no valid parameter passed") @@ -560,7 +559,7 @@ func (g *Gateio) GetUnifiedAccount(ctx context.Context, ccy currency.Code) (*Uni // CreateBatchOrders Create a batch of orders Batch orders requirements: custom order field text is required At most 4 currency pairs, // maximum 10 orders each, are allowed in one request No mixture of spot orders and margin orders, i.e. account must be identical for all orders -func (g *Gateio) CreateBatchOrders(ctx context.Context, args []CreateOrderRequestData) ([]SpotOrder, error) { +func (g *Gateio) CreateBatchOrders(ctx context.Context, args []CreateOrderRequest) ([]SpotOrder, error) { if len(args) > 10 { return nil, fmt.Errorf("%w only 10 orders are canceled at once", errMultipleOrders) } @@ -576,7 +575,7 @@ func (g *Gateio) CreateBatchOrders(ctx context.Context, args []CreateOrderReques } args[x].Side = strings.ToLower(args[x].Side) if args[x].Side != "buy" && args[x].Side != "sell" { - return nil, errInvalidOrderSide + return nil, order.ErrSideIsInvalid } if !strings.EqualFold(args[x].Account, asset.Spot.String()) && !strings.EqualFold(args[x].Account, asset.CrossMargin.String()) && @@ -633,7 +632,7 @@ func (g *Gateio) SpotClosePositionWhenCrossCurrencyDisabled(ctx context.Context, // PlaceSpotOrder creates a spot order you can place orders with spot, margin or cross margin account through setting the accountfield. // It defaults to spot, which means spot account is used to place orders. -func (g *Gateio) PlaceSpotOrder(ctx context.Context, arg *CreateOrderRequestData) (*SpotOrder, error) { +func (g *Gateio) PlaceSpotOrder(ctx context.Context, arg *CreateOrderRequest) (*SpotOrder, error) { if arg == nil { return nil, errNilArgument } @@ -642,7 +641,7 @@ func (g *Gateio) PlaceSpotOrder(ctx context.Context, arg *CreateOrderRequestData } arg.Side = strings.ToLower(arg.Side) if arg.Side != "buy" && arg.Side != "sell" { - return nil, errInvalidOrderSide + return nil, order.ErrSideIsInvalid } if !strings.EqualFold(arg.Account, asset.Spot.String()) && !strings.EqualFold(arg.Account, asset.CrossMargin.String()) && @@ -852,7 +851,7 @@ func (g *Gateio) CreatePriceTriggeredOrder(ctx context.Context, arg *PriceTrigge return nil, errors.New("invalid order type, only order type 'limit' is allowed") } if arg.Put.Side != "buy" && arg.Put.Side != "sell" { - return nil, errInvalidOrderSide + return nil, order.ErrSideIsInvalid } if arg.Put.Price < 0 { return nil, fmt.Errorf("%w, %s", errInvalidPrice, "put price has to be greater than 0") @@ -1445,7 +1444,7 @@ func (g *Gateio) MarginLoan(ctx context.Context, arg *MarginLoanRequestParam) (* // GetMarginAllLoans retrieves all loans (borrow and lending) orders. func (g *Gateio) GetMarginAllLoans(ctx context.Context, status, side, sortBy string, ccy currency.Code, currencyPair currency.Pair, reverseSort bool, page, limit uint64) ([]MarginLoanResponse, error) { if side != sideLend && side != sideBorrow { - return nil, fmt.Errorf("%w, only 'lend' and 'borrow' are supported", errInvalidOrderSide) + return nil, fmt.Errorf("%w, only 'lend' and 'borrow' are supported", order.ErrSideIsInvalid) } params := url.Values{} params.Set("side", side) @@ -2263,7 +2262,7 @@ func (g *Gateio) UpdatePositionRiskLimitInDualMode(ctx context.Context, settle c // Set reduce_only to true can keep the position from changing side when reducing position size // In single position mode, to close a position, you need to set size to 0 and close to true // In dual position mode, to close one side position, you need to set auto_size side, reduce_only to true and size to 0 -func (g *Gateio) PlaceFuturesOrder(ctx context.Context, arg *OrderCreateParams) (*Order, error) { +func (g *Gateio) PlaceFuturesOrder(ctx context.Context, arg *ContractOrderCreateParams) (*Order, error) { if arg == nil { return nil, errNilArgument } @@ -2271,7 +2270,7 @@ func (g *Gateio) PlaceFuturesOrder(ctx context.Context, arg *OrderCreateParams) return nil, fmt.Errorf("%w, currency pair for contract must not be empty", errInvalidOrMissingContractParam) } if arg.Size == 0 { - return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", errInvalidOrderSide) + return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", order.ErrSideIsInvalid) } if arg.TimeInForce != gtcTIF && arg.TimeInForce != iocTIF && arg.TimeInForce != pocTIF && arg.TimeInForce != fokTIF { return nil, errInvalidTimeInForce @@ -2351,7 +2350,7 @@ func (g *Gateio) CancelMultipleFuturesOpenOrders(ctx context.Context, contract c // In the returned result, the succeeded field of type bool indicates whether the execution was successful or not // If the execution is successful, the normal order content is included; if the execution fails, the label field is included to indicate the cause of the error // In the rate limiting, each order is counted individually -func (g *Gateio) PlaceBatchFuturesOrders(ctx context.Context, settle currency.Code, args []OrderCreateParams) ([]Order, error) { +func (g *Gateio) PlaceBatchFuturesOrders(ctx context.Context, settle currency.Code, args []ContractOrderCreateParams) ([]Order, error) { if settle.IsEmpty() { return nil, errEmptyOrInvalidSettlementCurrency } @@ -2360,7 +2359,7 @@ func (g *Gateio) PlaceBatchFuturesOrders(ctx context.Context, settle currency.Co } for x := range args { if args[x].Size == 0 { - return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", errInvalidOrderSide) + return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", order.ErrSideIsInvalid) } if args[x].TimeInForce != gtcTIF && args[x].TimeInForce != iocTIF && @@ -2839,7 +2838,7 @@ func (g *Gateio) UpdateDeliveryPositionRiskLimit(ctx context.Context, settle cur // PlaceDeliveryOrder create a futures order // Zero-filled order cannot be retrieved 10 minutes after order cancellation -func (g *Gateio) PlaceDeliveryOrder(ctx context.Context, arg *OrderCreateParams) (*Order, error) { +func (g *Gateio) PlaceDeliveryOrder(ctx context.Context, arg *ContractOrderCreateParams) (*Order, error) { if arg == nil { return nil, errNilArgument } @@ -2847,7 +2846,7 @@ func (g *Gateio) PlaceDeliveryOrder(ctx context.Context, arg *OrderCreateParams) return nil, fmt.Errorf("%w, currency pair for contract must not be empty", errInvalidOrMissingContractParam) } if arg.Size == 0 { - return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", errInvalidOrderSide) + return nil, fmt.Errorf("%w, specify positive number to make a bid, and negative number to ask", order.ErrSideIsInvalid) } if arg.TimeInForce != gtcTIF && arg.TimeInForce != iocTIF && arg.TimeInForce != pocTIF && arg.TimeInForce != fokTIF { return nil, errInvalidTimeInForce diff --git a/exchanges/gateio/gateio_test.go b/exchanges/gateio/gateio_test.go index 5c27d2e7..5ef7980d 100644 --- a/exchanges/gateio/gateio_test.go +++ b/exchanges/gateio/gateio_test.go @@ -1,6 +1,7 @@ package gateio import ( + "bytes" "context" "errors" "fmt" @@ -19,6 +20,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate" "github.com/thrasher-corp/gocryptotrader/exchanges/futures" @@ -27,7 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" @@ -67,7 +68,7 @@ func TestUpdateTradablePairs(t *testing.T) { func TestCancelAllExchangeOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelAllOrders(context.Background(), nil) + _, err := g.CancelAllOrders(t.Context(), nil) if !errors.Is(err, order.ErrCancelOrderIsNil) { t.Error(err) } @@ -78,57 +79,57 @@ func TestCancelAllExchangeOrders(t *testing.T) { Pair: getPair(t, asset.Options), AssetType: asset.Options, } - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } orderCancellation.AssetType = asset.Spot orderCancellation.Pair = getPair(t, asset.Spot) - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } orderCancellation.Pair = currency.EMPTYPAIR orderCancellation.AssetType = asset.Margin - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Error(err) } orderCancellation.Pair = getPair(t, asset.Margin) - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } orderCancellation.Pair = currency.EMPTYPAIR orderCancellation.AssetType = asset.CrossMargin - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Error(err) } orderCancellation.Pair = getPair(t, asset.CrossMargin) - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } orderCancellation.Pair = currency.EMPTYPAIR orderCancellation.AssetType = asset.Futures - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Error(err) } orderCancellation.Pair = getPair(t, asset.Futures) - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } orderCancellation.Pair = currency.EMPTYPAIR orderCancellation.AssetType = asset.DeliveryFutures - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Error(err) } orderCancellation.Pair = getPair(t, asset.DeliveryFutures) - _, err = g.CancelAllOrders(context.Background(), orderCancellation) + _, err = g.CancelAllOrders(t.Context(), orderCancellation) if err != nil { t.Error(err) } @@ -137,30 +138,30 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestGetAccountInfo(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.UpdateAccountInfo(context.Background(), asset.Spot) + _, err := g.UpdateAccountInfo(t.Context(), asset.Spot) if err != nil { t.Error("GetAccountInfo() error", err) } - if _, err := g.UpdateAccountInfo(context.Background(), asset.Margin); err != nil { + if _, err := g.UpdateAccountInfo(t.Context(), asset.Margin); err != nil { t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err) } - if _, err := g.UpdateAccountInfo(context.Background(), asset.CrossMargin); err != nil { + if _, err := g.UpdateAccountInfo(t.Context(), asset.CrossMargin); err != nil { t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err) } - if _, err := g.UpdateAccountInfo(context.Background(), asset.Options); err != nil { + if _, err := g.UpdateAccountInfo(t.Context(), asset.Options); err != nil { t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err) } - if _, err := g.UpdateAccountInfo(context.Background(), asset.Futures); err != nil { + if _, err := g.UpdateAccountInfo(t.Context(), asset.Futures); err != nil { t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err) } - if _, err := g.UpdateAccountInfo(context.Background(), asset.DeliveryFutures); err != nil { + if _, err := g.UpdateAccountInfo(t.Context(), asset.DeliveryFutures); err != nil { t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err) } } func TestWithdraw(t *testing.T) { t.Parallel() - cryptocurrencyChains, err := g.GetAvailableTransferChains(context.Background(), currency.BTC) + cryptocurrencyChains, err := g.GetAvailableTransferChains(t.Context(), currency.BTC) if err != nil { t.Fatal(err) } else if len(cryptocurrencyChains) == 0 { @@ -177,7 +178,7 @@ func TestWithdraw(t *testing.T) { }, } sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err = g.WithdrawCryptocurrencyFunds(context.Background(), &withdrawCryptoRequest); err != nil { + if _, err = g.WithdrawCryptocurrencyFunds(t.Context(), &withdrawCryptoRequest); err != nil { t.Errorf("%s WithdrawCryptocurrencyFunds() error: %v", g.Name, err) } } @@ -185,28 +186,28 @@ func TestWithdraw(t *testing.T) { func TestGetOrderInfo(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetOrderInfo(context.Background(), + _, err := g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.Spot), asset.Spot) if err != nil { t.Errorf("GetOrderInfo() %v", err) } - _, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Options), asset.Options) + _, err = g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.Options), asset.Options) if err != nil { t.Errorf("GetOrderInfo() %v", err) } - _, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Margin), asset.Margin) + _, err = g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.Margin), asset.Margin) if err != nil { t.Errorf("GetOrderInfo() %v", err) } - _, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.CrossMargin), asset.CrossMargin) + _, err = g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.CrossMargin), asset.CrossMargin) if err != nil { t.Errorf("GetOrderInfo() %v", err) } - _, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Futures), asset.Futures) + _, err = g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.Futures), asset.Futures) if err != nil { t.Errorf("GetOrderInfo() %v", err) } - _, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.DeliveryFutures), asset.DeliveryFutures) + _, err = g.GetOrderInfo(t.Context(), "917591554", getPair(t, asset.DeliveryFutures), asset.DeliveryFutures) if err != nil { t.Errorf("GetOrderInfo() %v", err) } @@ -215,79 +216,79 @@ func TestGetOrderInfo(t *testing.T) { func TestUpdateTicker(t *testing.T) { t.Parallel() for _, a := range g.GetAssetTypes(false) { - _, err := g.UpdateTicker(context.Background(), getPair(t, a), a) + _, err := g.UpdateTicker(t.Context(), getPair(t, a), a) assert.NoError(t, err, "UpdateTicker should not error for %s", a) } } func TestListSpotCurrencies(t *testing.T) { t.Parallel() - if _, err := g.ListSpotCurrencies(context.Background()); err != nil { + if _, err := g.ListSpotCurrencies(t.Context()); err != nil { t.Errorf("%s ListAllCurrencies() error %v", g.Name, err) } } func TestGetCurrencyDetail(t *testing.T) { t.Parallel() - if _, err := g.GetCurrencyDetail(context.Background(), currency.BTC); err != nil { + if _, err := g.GetCurrencyDetail(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetCurrencyDetail() error %v", g.Name, err) } } func TestListAllCurrencyPairs(t *testing.T) { t.Parallel() - if _, err := g.ListSpotCurrencyPairs(context.Background()); err != nil { + if _, err := g.ListSpotCurrencyPairs(t.Context()); err != nil { t.Errorf("%s ListAllCurrencyPairs() error %v", g.Name, err) } } func TestGetCurrencyPairDetal(t *testing.T) { t.Parallel() - if _, err := g.GetCurrencyPairDetail(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()); err != nil { + if _, err := g.GetCurrencyPairDetail(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()); err != nil { t.Errorf("%s GetCurrencyPairDetal() error %v", g.Name, err) } } func TestGetTickers(t *testing.T) { t.Parallel() - if _, err := g.GetTickers(context.Background(), "BTC_USDT", ""); err != nil { + if _, err := g.GetTickers(t.Context(), "BTC_USDT", ""); err != nil { t.Errorf("%s GetTickers() error %v", g.Name, err) } } func TestGetTicker(t *testing.T) { t.Parallel() - if _, err := g.GetTicker(context.Background(), currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}.String(), utc8TimeZone); err != nil { + if _, err := g.GetTicker(t.Context(), currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}.String(), utc8TimeZone); err != nil { t.Errorf("%s GetTicker() error %v", g.Name, err) } } func TestGetOrderbook(t *testing.T) { t.Parallel() - _, err := g.GetOrderbook(context.Background(), getPair(t, asset.Spot).String(), "0.1", 10, false) + _, err := g.GetOrderbook(t.Context(), getPair(t, asset.Spot).String(), "0.1", 10, false) assert.NoError(t, err, "GetOrderbook should not error") settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) assert.NoError(t, err, "getSettlementFromCurrency should not error") - _, err = g.GetFuturesOrderbook(context.Background(), settle, getPair(t, asset.Futures).String(), "", 10, false) + _, err = g.GetFuturesOrderbook(t.Context(), settle, getPair(t, asset.Futures).String(), "", 10, false) assert.NoError(t, err, "GetFuturesOrderbook should not error") settle, err = getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "getSettlementFromCurrency should not error") - _, err = g.GetDeliveryOrderbook(context.Background(), settle, "0.1", getPair(t, asset.DeliveryFutures), 10, false) + _, err = g.GetDeliveryOrderbook(t.Context(), settle, "0.1", getPair(t, asset.DeliveryFutures), 10, false) assert.NoError(t, err, "GetDeliveryOrderbook should not error") - _, err = g.GetOptionsOrderbook(context.Background(), getPair(t, asset.Options), "0.1", 10, false) + _, err = g.GetOptionsOrderbook(t.Context(), getPair(t, asset.Options), "0.1", 10, false) assert.NoError(t, err, "GetOptionsOrderbook should not error") } func TestGetMarketTrades(t *testing.T) { t.Parallel() - if _, err := g.GetMarketTrades(context.Background(), getPair(t, asset.Spot), 0, "", true, time.Time{}, time.Time{}, 1); err != nil { + if _, err := g.GetMarketTrades(t.Context(), getPair(t, asset.Spot), 0, "", true, time.Time{}, time.Time{}, 1); err != nil { t.Errorf("%s GetMarketTrades() error %v", g.Name, err) } } func TestGetCandlesticks(t *testing.T) { t.Parallel() - if _, err := g.GetCandlesticks(context.Background(), getPair(t, asset.Spot), 0, time.Time{}, time.Time{}, kline.OneDay); err != nil { + if _, err := g.GetCandlesticks(t.Context(), getPair(t, asset.Spot), 0, time.Time{}, time.Time{}, kline.OneDay); err != nil { t.Errorf("%s GetCandlesticks() error %v", g.Name, err) } } @@ -295,7 +296,7 @@ func TestGetCandlesticks(t *testing.T) { func TestGetTradingFeeRatio(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetTradingFeeRatio(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}); err != nil { + if _, err := g.GetTradingFeeRatio(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}); err != nil { t.Errorf("%s GetTradingFeeRatio() error %v", g.Name, err) } } @@ -303,7 +304,7 @@ func TestGetTradingFeeRatio(t *testing.T) { func TestGetSpotAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSpotAccounts(context.Background(), currency.BTC); err != nil { + if _, err := g.GetSpotAccounts(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetSpotAccounts() error %v", g.Name, err) } } @@ -311,7 +312,7 @@ func TestGetSpotAccounts(t *testing.T) { func TestCreateBatchOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreateBatchOrders(context.Background(), []CreateOrderRequestData{ + _, err := g.CreateBatchOrders(t.Context(), []CreateOrderRequest{ { CurrencyPair: getPair(t, asset.Spot), Side: "sell", @@ -328,15 +329,14 @@ func TestCreateBatchOrders(t *testing.T) { Account: g.assetTypeToString(asset.Spot), Type: "limit", }, - }); err != nil { - t.Errorf("%s CreateBatchOrders() error %v", g.Name, err) - } + }) + assert.NoError(t, err, "CreateBatchOrders should not error") } func TestGetSpotOpenOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSpotOpenOrders(context.Background(), 0, 0, false); err != nil { + if _, err := g.GetSpotOpenOrders(t.Context(), 0, 0, false); err != nil { t.Errorf("%s GetSpotOpenOrders() error %v", g.Name, err) } } @@ -344,7 +344,7 @@ func TestGetSpotOpenOrders(t *testing.T) { func TestSpotClosePositionWhenCrossCurrencyDisabled(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.SpotClosePositionWhenCrossCurrencyDisabled(context.Background(), &ClosePositionRequestParam{ + if _, err := g.SpotClosePositionWhenCrossCurrencyDisabled(t.Context(), &ClosePositionRequestParam{ Amount: 0.1, Price: 1234567384, CurrencyPair: getPair(t, asset.Spot), @@ -356,30 +356,28 @@ func TestSpotClosePositionWhenCrossCurrencyDisabled(t *testing.T) { func TestCreateSpotOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.PlaceSpotOrder(context.Background(), &CreateOrderRequestData{ + _, err := g.PlaceSpotOrder(t.Context(), &CreateOrderRequest{ CurrencyPair: getPair(t, asset.Spot), Side: "buy", Amount: 1, Price: 900000, Account: g.assetTypeToString(asset.Spot), Type: "limit", - }); err != nil { - t.Errorf("%s CreateSpotOrder() error %v", g.Name, err) - } + }) + assert.NoError(t, err, "PlaceSpotOrder should not error") } func TestGetSpotOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSpotOrders(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "open", 0, 0); err != nil { - t.Errorf("%s GetSpotOrders() error %v", g.Name, err) - } + _, err := g.GetSpotOrders(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, statusOpen, 0, 0) + assert.NoError(t, err, "GetSpotOrders should not error") } func TestCancelAllOpenOrdersSpecifiedCurrencyPair(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelAllOpenOrdersSpecifiedCurrencyPair(context.Background(), getPair(t, asset.Spot), order.Sell, asset.Empty); err != nil { + if _, err := g.CancelAllOpenOrdersSpecifiedCurrencyPair(t.Context(), getPair(t, asset.Spot), order.Sell, asset.Empty); err != nil { t.Errorf("%s CancelAllOpenOrdersSpecifiedCurrencyPair() error %v", g.Name, err) } } @@ -387,7 +385,7 @@ func TestCancelAllOpenOrdersSpecifiedCurrencyPair(t *testing.T) { func TestCancelBatchOrdersWithIDList(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelBatchOrdersWithIDList(context.Background(), []CancelOrderByIDParam{ + if _, err := g.CancelBatchOrdersWithIDList(t.Context(), []CancelOrderByIDParam{ { CurrencyPair: getPair(t, asset.Spot), ID: "1234567", @@ -404,7 +402,7 @@ func TestCancelBatchOrdersWithIDList(t *testing.T) { func TestGetSpotOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSpotOrder(context.Background(), "1234", currency.Pair{ + if _, err := g.GetSpotOrder(t.Context(), "1234", currency.Pair{ Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT, @@ -415,20 +413,20 @@ func TestGetSpotOrder(t *testing.T) { func TestAmendSpotOrder(t *testing.T) { t.Parallel() - _, err := g.AmendSpotOrder(context.Background(), "", getPair(t, asset.Spot), false, &PriceAndAmount{ + _, err := g.AmendSpotOrder(t.Context(), "", getPair(t, asset.Spot), false, &PriceAndAmount{ Price: 1000, }) if !errors.Is(err, errInvalidOrderID) { t.Errorf("expecting %v, but found %v", errInvalidOrderID, err) } - _, err = g.AmendSpotOrder(context.Background(), "123", currency.EMPTYPAIR, false, &PriceAndAmount{ + _, err = g.AmendSpotOrder(t.Context(), "123", currency.EMPTYPAIR, false, &PriceAndAmount{ Price: 1000, }) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Errorf("expecting %v, but found %v", currency.ErrCurrencyPairEmpty, err) } sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err = g.AmendSpotOrder(context.Background(), "123", getPair(t, asset.Spot), false, &PriceAndAmount{ + _, err = g.AmendSpotOrder(t.Context(), "123", getPair(t, asset.Spot), false, &PriceAndAmount{ Price: 1000, }) if err != nil { @@ -439,7 +437,7 @@ func TestAmendSpotOrder(t *testing.T) { func TestCancelSingleSpotOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelSingleSpotOrder(context.Background(), "1234", + if _, err := g.CancelSingleSpotOrder(t.Context(), "1234", getPair(t, asset.Spot).String(), false); err != nil { t.Errorf("%s CancelSingleSpotOrder() error %v", g.Name, err) } @@ -448,13 +446,13 @@ func TestCancelSingleSpotOrder(t *testing.T) { func TestGetMySpotTradingHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetMySpotTradingHistory(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "", 0, 0, false, time.Time{}, time.Time{}) + _, err := g.GetMySpotTradingHistory(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "", 0, 0, false, time.Time{}, time.Time{}) require.NoError(t, err) } func TestGetServerTime(t *testing.T) { t.Parallel() - if _, err := g.GetServerTime(context.Background(), asset.Spot); err != nil { + if _, err := g.GetServerTime(t.Context(), asset.Spot); err != nil { t.Errorf("%s GetServerTime() error %v", g.Name, err) } } @@ -462,7 +460,7 @@ func TestGetServerTime(t *testing.T) { func TestCountdownCancelorder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CountdownCancelorders(context.Background(), CountdownCancelOrderParam{ + if _, err := g.CountdownCancelorders(t.Context(), CountdownCancelOrderParam{ Timeout: 10, CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.ETH, Delimiter: currency.UnderscoreDelimiter}, }); err != nil { @@ -473,7 +471,7 @@ func TestCountdownCancelorder(t *testing.T) { func TestCreatePriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreatePriceTriggeredOrder(context.Background(), &PriceTriggeredOrderParam{ + if _, err := g.CreatePriceTriggeredOrder(t.Context(), &PriceTriggeredOrderParam{ Trigger: TriggerPriceInfo{ Price: 123, Rule: ">=", @@ -495,15 +493,14 @@ func TestCreatePriceTriggeredOrder(t *testing.T) { func TestGetPriceTriggeredOrderList(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetPriceTriggeredOrderList(context.Background(), "open", currency.EMPTYPAIR, asset.Empty, 0, 0); err != nil { - t.Errorf("%s GetPriceTriggeredOrderList() error %v", g.Name, err) - } + _, err := g.GetPriceTriggeredOrderList(t.Context(), statusOpen, currency.EMPTYPAIR, asset.Empty, 0, 0) + assert.NoError(t, err, "GetPriceTriggeredOrderList should not error") } func TestCancelAllOpenOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelMultipleSpotOpenOrders(context.Background(), currency.EMPTYPAIR, asset.CrossMargin); err != nil { + if _, err := g.CancelMultipleSpotOpenOrders(t.Context(), currency.EMPTYPAIR, asset.CrossMargin); err != nil { t.Errorf("%s CancelAllOpenOrders() error %v", g.Name, err) } } @@ -511,7 +508,7 @@ func TestCancelAllOpenOrders(t *testing.T) { func TestGetSinglePriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSinglePriceTriggeredOrder(context.Background(), "1234"); err != nil { + if _, err := g.GetSinglePriceTriggeredOrder(t.Context(), "1234"); err != nil { t.Errorf("%s GetSinglePriceTriggeredOrder() error %v", g.Name, err) } } @@ -519,7 +516,7 @@ func TestGetSinglePriceTriggeredOrder(t *testing.T) { func TestCancelPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.CancelPriceTriggeredOrder(context.Background(), "1234"); err != nil { + if _, err := g.CancelPriceTriggeredOrder(t.Context(), "1234"); err != nil { t.Errorf("%s CancelPriceTriggeredOrder() error %v", g.Name, err) } } @@ -527,7 +524,7 @@ func TestCancelPriceTriggeredOrder(t *testing.T) { func TestGetMarginAccountList(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMarginAccountList(context.Background(), currency.EMPTYPAIR); err != nil { + if _, err := g.GetMarginAccountList(t.Context(), currency.EMPTYPAIR); err != nil { t.Errorf("%s GetMarginAccountList() error %v", g.Name, err) } } @@ -535,7 +532,7 @@ func TestGetMarginAccountList(t *testing.T) { func TestListMarginAccountBalanceChangeHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.ListMarginAccountBalanceChangeHistory(context.Background(), currency.BTC, currency.Pair{ + if _, err := g.ListMarginAccountBalanceChangeHistory(t.Context(), currency.BTC, currency.Pair{ Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT, @@ -547,7 +544,7 @@ func TestListMarginAccountBalanceChangeHistory(t *testing.T) { func TestGetMarginFundingAccountList(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMarginFundingAccountList(context.Background(), currency.BTC); err != nil { + if _, err := g.GetMarginFundingAccountList(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetMarginFundingAccountList %v", g.Name, err) } } @@ -555,7 +552,7 @@ func TestGetMarginFundingAccountList(t *testing.T) { func TestMarginLoan(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.MarginLoan(context.Background(), &MarginLoanRequestParam{ + if _, err := g.MarginLoan(t.Context(), &MarginLoanRequestParam{ Side: "borrow", Amount: 1, Currency: currency.BTC, @@ -570,15 +567,14 @@ func TestMarginLoan(t *testing.T) { func TestGetMarginAllLoans(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMarginAllLoans(context.Background(), "open", "lend", "", currency.BTC, currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}, false, 0, 0); err != nil { - t.Errorf("%s GetMarginAllLoans() error %v", g.Name, err) - } + _, err := g.GetMarginAllLoans(t.Context(), statusOpen, "lend", "", currency.BTC, currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}, false, 0, 0) + assert.NoError(t, err, "GetMarginAllLoans should not error") } func TestMergeMultipleLendingLoans(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.MergeMultipleLendingLoans(context.Background(), currency.USDT, []string{"123", "23423"}); err != nil { + if _, err := g.MergeMultipleLendingLoans(t.Context(), currency.USDT, []string{"123", "23423"}); err != nil { t.Errorf("%s MergeMultipleLendingLoans() error %v", g.Name, err) } } @@ -586,14 +582,14 @@ func TestMergeMultipleLendingLoans(t *testing.T) { func TestRetriveOneSingleLoanDetail(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.RetriveOneSingleLoanDetail(context.Background(), "borrow", "123"); err != nil { + if _, err := g.RetriveOneSingleLoanDetail(t.Context(), "borrow", "123"); err != nil { t.Errorf("%s RetriveOneSingleLoanDetail() error %v", g.Name, err) } } func TestModifyALoan(t *testing.T) { t.Parallel() - if _, err := g.ModifyALoan(context.Background(), "1234", &ModifyLoanRequestParam{ + if _, err := g.ModifyALoan(t.Context(), "1234", &ModifyLoanRequestParam{ Currency: currency.BTC, Side: "borrow", AutoRenew: false, @@ -601,7 +597,7 @@ func TestModifyALoan(t *testing.T) { t.Errorf("%s ModifyALoan() error %v", g.Name, err) } sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.ModifyALoan(context.Background(), "1234", &ModifyLoanRequestParam{ + if _, err := g.ModifyALoan(t.Context(), "1234", &ModifyLoanRequestParam{ Currency: currency.BTC, Side: "borrow", AutoRenew: false, @@ -614,7 +610,7 @@ func TestModifyALoan(t *testing.T) { func TestCancelLendingLoan(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.CancelLendingLoan(context.Background(), currency.BTC, "1234"); err != nil { + if _, err := g.CancelLendingLoan(t.Context(), currency.BTC, "1234"); err != nil { t.Errorf("%s CancelLendingLoan() error %v", g.Name, err) } } @@ -622,7 +618,7 @@ func TestCancelLendingLoan(t *testing.T) { func TestRepayALoan(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.RepayALoan(context.Background(), "1234", &RepayLoanRequestParam{ + if _, err := g.RepayALoan(t.Context(), "1234", &RepayLoanRequestParam{ CurrencyPair: currency.NewPair(currency.BTC, currency.USDT), Currency: currency.BTC, Mode: "all", @@ -634,7 +630,7 @@ func TestRepayALoan(t *testing.T) { func TestListLoanRepaymentRecords(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.ListLoanRepaymentRecords(context.Background(), "1234"); err != nil { + if _, err := g.ListLoanRepaymentRecords(t.Context(), "1234"); err != nil { t.Errorf("%s LoanRepaymentRecord() error %v", g.Name, err) } } @@ -642,7 +638,7 @@ func TestListLoanRepaymentRecords(t *testing.T) { func TestListRepaymentRecordsOfSpecificLoan(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.ListRepaymentRecordsOfSpecificLoan(context.Background(), "1234", "", 0, 0); err != nil { + if _, err := g.ListRepaymentRecordsOfSpecificLoan(t.Context(), "1234", "", 0, 0); err != nil { t.Errorf("%s error while ListRepaymentRecordsOfSpecificLoan() %v", g.Name, err) } } @@ -650,7 +646,7 @@ func TestListRepaymentRecordsOfSpecificLoan(t *testing.T) { func TestGetOneSingleloanRecord(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetOneSingleLoanRecord(context.Background(), "1234", "123"); err != nil { + if _, err := g.GetOneSingleLoanRecord(t.Context(), "1234", "123"); err != nil { t.Errorf("%s error while GetOneSingleloanRecord() %v", g.Name, err) } } @@ -658,7 +654,7 @@ func TestGetOneSingleloanRecord(t *testing.T) { func TestModifyALoanRecord(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.ModifyALoanRecord(context.Background(), "1234", &ModifyLoanRequestParam{ + if _, err := g.ModifyALoanRecord(t.Context(), "1234", &ModifyLoanRequestParam{ Currency: currency.USDT, CurrencyPair: currency.NewPair(currency.BTC, currency.USDT), Side: "lend", @@ -672,7 +668,7 @@ func TestModifyALoanRecord(t *testing.T) { func TestUpdateUsersAutoRepaymentSetting(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.UpdateUsersAutoRepaymentSetting(context.Background(), true); err != nil { + if _, err := g.UpdateUsersAutoRepaymentSetting(t.Context(), true); err != nil { t.Errorf("%s UpdateUsersAutoRepaymentSetting() error %v", g.Name, err) } } @@ -680,7 +676,7 @@ func TestUpdateUsersAutoRepaymentSetting(t *testing.T) { func TestGetUserAutoRepaymentSetting(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetUserAutoRepaymentSetting(context.Background()); err != nil { + if _, err := g.GetUserAutoRepaymentSetting(t.Context()); err != nil { t.Errorf("%s GetUserAutoRepaymentSetting() error %v", g.Name, err) } } @@ -688,7 +684,7 @@ func TestGetUserAutoRepaymentSetting(t *testing.T) { func TestGetMaxTransferableAmountForSpecificMarginCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMaxTransferableAmountForSpecificMarginCurrency(context.Background(), currency.BTC, currency.EMPTYPAIR); err != nil { + if _, err := g.GetMaxTransferableAmountForSpecificMarginCurrency(t.Context(), currency.BTC, currency.EMPTYPAIR); err != nil { t.Errorf("%s GetMaxTransferableAmountForSpecificMarginCurrency() error %v", g.Name, err) } } @@ -696,7 +692,7 @@ func TestGetMaxTransferableAmountForSpecificMarginCurrency(t *testing.T) { func TestGetMaxBorrowableAmountForSpecificMarginCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMaxBorrowableAmountForSpecificMarginCurrency(context.Background(), currency.BTC, currency.EMPTYPAIR); err != nil { + if _, err := g.GetMaxBorrowableAmountForSpecificMarginCurrency(t.Context(), currency.BTC, currency.EMPTYPAIR); err != nil { t.Errorf("%s GetMaxBorrowableAmountForSpecificMarginCurrency() error %v", g.Name, err) } } @@ -704,7 +700,7 @@ func TestGetMaxBorrowableAmountForSpecificMarginCurrency(t *testing.T) { func TestCurrencySupportedByCrossMargin(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.CurrencySupportedByCrossMargin(context.Background()); err != nil { + if _, err := g.CurrencySupportedByCrossMargin(t.Context()); err != nil { t.Errorf("%s CurrencySupportedByCrossMargin() error %v", g.Name, err) } } @@ -712,7 +708,7 @@ func TestCurrencySupportedByCrossMargin(t *testing.T) { func TestGetCrossMarginSupportedCurrencyDetail(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetCrossMarginSupportedCurrencyDetail(context.Background(), currency.BTC); err != nil { + if _, err := g.GetCrossMarginSupportedCurrencyDetail(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetCrossMarginSupportedCurrencyDetail() error %v", g.Name, err) } } @@ -720,7 +716,7 @@ func TestGetCrossMarginSupportedCurrencyDetail(t *testing.T) { func TestGetCrossMarginAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetCrossMarginAccounts(context.Background()); err != nil { + if _, err := g.GetCrossMarginAccounts(t.Context()); err != nil { t.Errorf("%s GetCrossMarginAccounts() error %v", g.Name, err) } } @@ -728,7 +724,7 @@ func TestGetCrossMarginAccounts(t *testing.T) { func TestGetCrossMarginAccountChangeHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetCrossMarginAccountChangeHistory(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 6, "in"); err != nil { + if _, err := g.GetCrossMarginAccountChangeHistory(t.Context(), currency.BTC, time.Time{}, time.Time{}, 0, 6, "in"); err != nil { t.Errorf("%s GetCrossMarginAccountChangeHistory() error %v", g.Name, err) } } @@ -742,7 +738,7 @@ func TestCreateCrossMarginBorrowLoan(t *testing.T) { t.Errorf("%s error while deserializing to CrossMarginBorrowLoanResponse %v", g.Name, err) } sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreateCrossMarginBorrowLoan(context.Background(), CrossMarginBorrowLoanParams{ + if _, err := g.CreateCrossMarginBorrowLoan(t.Context(), CrossMarginBorrowLoanParams{ Currency: currency.BTC, Amount: 3, }); err != nil { @@ -753,7 +749,7 @@ func TestCreateCrossMarginBorrowLoan(t *testing.T) { func TestGetCrossMarginBorrowHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetCrossMarginBorrowHistory(context.Background(), 1, currency.BTC, 0, 0, false); err != nil { + if _, err := g.GetCrossMarginBorrowHistory(t.Context(), 1, currency.BTC, 0, 0, false); err != nil { t.Errorf("%s GetCrossMarginBorrowHistory() error %v", g.Name, err) } } @@ -761,7 +757,7 @@ func TestGetCrossMarginBorrowHistory(t *testing.T) { func TestGetSingleBorrowLoanDetail(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSingleBorrowLoanDetail(context.Background(), "1234"); err != nil { + if _, err := g.GetSingleBorrowLoanDetail(t.Context(), "1234"); err != nil { t.Errorf("%s GetSingleBorrowLoanDetail() error %v", g.Name, err) } } @@ -769,7 +765,7 @@ func TestGetSingleBorrowLoanDetail(t *testing.T) { func TestExecuteRepayment(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.ExecuteRepayment(context.Background(), CurrencyAndAmount{ + if _, err := g.ExecuteRepayment(t.Context(), CurrencyAndAmount{ Currency: currency.USD, Amount: 1234.55, }); err != nil { @@ -780,7 +776,7 @@ func TestExecuteRepayment(t *testing.T) { func TestGetCrossMarginRepayments(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetCrossMarginRepayments(context.Background(), currency.BTC, "123", 0, 0, false); err != nil { + if _, err := g.GetCrossMarginRepayments(t.Context(), currency.BTC, "123", 0, 0, false); err != nil { t.Errorf("%s GetCrossMarginRepayments() error %v", g.Name, err) } } @@ -788,7 +784,7 @@ func TestGetCrossMarginRepayments(t *testing.T) { func TestGetMaxTransferableAmountForSpecificCrossMarginCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMaxTransferableAmountForSpecificCrossMarginCurrency(context.Background(), currency.BTC); err != nil { + if _, err := g.GetMaxTransferableAmountForSpecificCrossMarginCurrency(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetMaxTransferableAmountForSpecificCrossMarginCurrency() error %v", g.Name, err) } } @@ -796,14 +792,14 @@ func TestGetMaxTransferableAmountForSpecificCrossMarginCurrency(t *testing.T) { func TestGetMaxBorrowableAmountForSpecificCrossMarginCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMaxBorrowableAmountForSpecificCrossMarginCurrency(context.Background(), currency.BTC); err != nil { + if _, err := g.GetMaxBorrowableAmountForSpecificCrossMarginCurrency(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetMaxBorrowableAmountForSpecificCrossMarginCurrency() error %v", g.Name, err) } } func TestListCurrencyChain(t *testing.T) { t.Parallel() - if _, err := g.ListCurrencyChain(context.Background(), currency.BTC); err != nil { + if _, err := g.ListCurrencyChain(t.Context(), currency.BTC); err != nil { t.Errorf("%s ListCurrencyChain() error %v", g.Name, err) } } @@ -811,7 +807,7 @@ func TestListCurrencyChain(t *testing.T) { func TestGenerateCurrencyDepositAddress(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GenerateCurrencyDepositAddress(context.Background(), currency.BTC); err != nil { + if _, err := g.GenerateCurrencyDepositAddress(t.Context(), currency.BTC); err != nil { t.Errorf("%s GenerateCurrencyDepositAddress() error %v", g.Name, err) } } @@ -819,7 +815,7 @@ func TestGenerateCurrencyDepositAddress(t *testing.T) { func TestGetWithdrawalRecords(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetWithdrawalRecords(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil { + if _, err := g.GetWithdrawalRecords(t.Context(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil { t.Errorf("%s GetWithdrawalRecords() error %v", g.Name, err) } } @@ -827,7 +823,7 @@ func TestGetWithdrawalRecords(t *testing.T) { func TestGetDepositRecords(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetDepositRecords(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil { + if _, err := g.GetDepositRecords(t.Context(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil { t.Errorf("%s GetDepositRecords() error %v", g.Name, err) } } @@ -835,7 +831,7 @@ func TestGetDepositRecords(t *testing.T) { func TestTransferCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.TransferCurrency(context.Background(), &TransferCurrencyParam{ + if _, err := g.TransferCurrency(t.Context(), &TransferCurrencyParam{ Currency: currency.BTC, From: g.assetTypeToString(asset.Spot), To: g.assetTypeToString(asset.Margin), @@ -849,7 +845,7 @@ func TestTransferCurrency(t *testing.T) { func TestSubAccountTransfer(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if err := g.SubAccountTransfer(context.Background(), SubAccountTransferParam{ + if err := g.SubAccountTransfer(t.Context(), SubAccountTransferParam{ Currency: currency.BTC, SubAccount: "12222", Direction: "to", @@ -862,7 +858,7 @@ func TestSubAccountTransfer(t *testing.T) { func TestGetSubAccountTransferHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.GetSubAccountTransferHistory(context.Background(), "", time.Time{}, time.Time{}, 0, 0); err != nil { + if _, err := g.GetSubAccountTransferHistory(t.Context(), "", time.Time{}, time.Time{}, 0, 0); err != nil { t.Errorf("%s GetSubAccountTransferHistory() error %v", g.Name, err) } } @@ -870,7 +866,7 @@ func TestGetSubAccountTransferHistory(t *testing.T) { func TestSubAccountTransferToSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if err := g.SubAccountTransferToSubAccount(context.Background(), &InterSubAccountTransferParams{ + if err := g.SubAccountTransferToSubAccount(t.Context(), &InterSubAccountTransferParams{ Currency: currency.BTC, SubAccountFromUserID: "1234", SubAccountFromAssetType: asset.Spot, @@ -885,7 +881,7 @@ func TestSubAccountTransferToSubAccount(t *testing.T) { func TestGetWithdrawalStatus(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetWithdrawalStatus(context.Background(), currency.NewCode("")); err != nil { + if _, err := g.GetWithdrawalStatus(t.Context(), currency.NewCode("")); err != nil { t.Errorf("%s GetWithdrawalStatus() error %v", g.Name, err) } } @@ -893,7 +889,7 @@ func TestGetWithdrawalStatus(t *testing.T) { func TestGetSubAccountBalances(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSubAccountBalances(context.Background(), ""); err != nil { + if _, err := g.GetSubAccountBalances(t.Context(), ""); err != nil { t.Errorf("%s GetSubAccountBalances() error %v", g.Name, err) } } @@ -901,7 +897,7 @@ func TestGetSubAccountBalances(t *testing.T) { func TestGetSubAccountMarginBalances(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSubAccountMarginBalances(context.Background(), ""); err != nil { + if _, err := g.GetSubAccountMarginBalances(t.Context(), ""); err != nil { t.Errorf("%s GetSubAccountMarginBalances() error %v", g.Name, err) } } @@ -909,14 +905,14 @@ func TestGetSubAccountMarginBalances(t *testing.T) { func TestGetSubAccountFuturesBalances(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSubAccountFuturesBalances(context.Background(), "", currency.EMPTYCODE) + _, err := g.GetSubAccountFuturesBalances(t.Context(), "", currency.EMPTYCODE) assert.Error(t, err, "GetSubAccountFuturesBalances should not error") } func TestGetSubAccountCrossMarginBalances(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSubAccountCrossMarginBalances(context.Background(), ""); err != nil { + if _, err := g.GetSubAccountCrossMarginBalances(t.Context(), ""); err != nil { t.Errorf("%s GetSubAccountCrossMarginBalances() error %v", g.Name, err) } } @@ -924,7 +920,7 @@ func TestGetSubAccountCrossMarginBalances(t *testing.T) { func TestGetSavedAddresses(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSavedAddresses(context.Background(), currency.BTC, "", 0); err != nil { + if _, err := g.GetSavedAddresses(t.Context(), currency.BTC, "", 0); err != nil { t.Errorf("%s GetSavedAddresses() error %v", g.Name, err) } } @@ -932,35 +928,35 @@ func TestGetSavedAddresses(t *testing.T) { func TestGetPersonalTradingFee(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetPersonalTradingFee(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, currency.EMPTYCODE) + _, err := g.GetPersonalTradingFee(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, currency.EMPTYCODE) assert.NoError(t, err, "GetPersonalTradingFee should not error") } func TestGetUsersTotalBalance(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetUsersTotalBalance(context.Background(), currency.BTC); err != nil { + if _, err := g.GetUsersTotalBalance(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetUsersTotalBalance() error %v", g.Name, err) } } func TestGetMarginSupportedCurrencyPairs(t *testing.T) { t.Parallel() - if _, err := g.GetMarginSupportedCurrencyPairs(context.Background()); err != nil { + if _, err := g.GetMarginSupportedCurrencyPairs(t.Context()); err != nil { t.Errorf("%s GetMarginSupportedCurrencyPair() error %v", g.Name, err) } } func TestGetMarginSupportedCurrencyPair(t *testing.T) { t.Parallel() - if _, err := g.GetSingleMarginSupportedCurrencyPair(context.Background(), getPair(t, asset.Margin)); err != nil { + if _, err := g.GetSingleMarginSupportedCurrencyPair(t.Context(), getPair(t, asset.Margin)); err != nil { t.Errorf("%s GetMarginSupportedCurrencyPair() error %v", g.Name, err) } } func TestGetOrderbookOfLendingLoans(t *testing.T) { t.Parallel() - if _, err := g.GetOrderbookOfLendingLoans(context.Background(), currency.BTC); err != nil { + if _, err := g.GetOrderbookOfLendingLoans(t.Context(), currency.BTC); err != nil { t.Errorf("%s GetOrderbookOfLendingLoans() error %v", g.Name, err) } } @@ -968,7 +964,7 @@ func TestGetOrderbookOfLendingLoans(t *testing.T) { func TestGetAllFutureContracts(t *testing.T) { t.Parallel() for _, settlementCurrency := range settlementCurrencies { - if _, err := g.GetAllFutureContracts(context.Background(), settlementCurrency); err != nil { + if _, err := g.GetAllFutureContracts(t.Context(), settlementCurrency); err != nil { assert.Errorf(t, err, "GetAllFutureContracts %s should not error", settlementCurrency) } } @@ -978,7 +974,7 @@ func TestGetFuturesContract(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFuturesContract(context.Background(), settle, getPair(t, asset.Futures).String()) + _, err = g.GetFuturesContract(t.Context(), settle, getPair(t, asset.Futures).String()) assert.NoError(t, err, "GetFuturesContract should not error") } @@ -986,7 +982,7 @@ func TestGetFuturesOrderbook(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFuturesOrderbook(context.Background(), settle, getPair(t, asset.Futures).String(), "", 0, false) + _, err = g.GetFuturesOrderbook(t.Context(), settle, getPair(t, asset.Futures).String(), "", 0, false) assert.NoError(t, err, "GetFuturesOrderbook should not error") } @@ -994,7 +990,7 @@ func TestGetFuturesTradingHistory(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFuturesTradingHistory(context.Background(), settle, getPair(t, asset.Futures), 0, 0, "", time.Time{}, time.Time{}) + _, err = g.GetFuturesTradingHistory(t.Context(), settle, getPair(t, asset.Futures), 0, 0, "", time.Time{}, time.Time{}) assert.NoError(t, err, "GetFuturesTradingHistory should not error") } @@ -1002,7 +998,7 @@ func TestGetFuturesCandlesticks(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFuturesCandlesticks(context.Background(), settle, getPair(t, asset.Futures).String(), time.Time{}, time.Time{}, 0, kline.OneWeek) + _, err = g.GetFuturesCandlesticks(t.Context(), settle, getPair(t, asset.Futures).String(), time.Time{}, time.Time{}, 0, kline.OneWeek) assert.NoError(t, err, "GetFuturesCandlesticks should not error") } @@ -1010,7 +1006,7 @@ func TestPremiumIndexKLine(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.PremiumIndexKLine(context.Background(), settle, getPair(t, asset.Futures), time.Time{}, time.Time{}, 0, kline.OneWeek) + _, err = g.PremiumIndexKLine(t.Context(), settle, getPair(t, asset.Futures), time.Time{}, time.Time{}, 0, kline.OneWeek) assert.NoError(t, err, "PremiumIndexKLine should not error") } @@ -1018,7 +1014,7 @@ func TestGetFutureTickers(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFuturesTickers(context.Background(), settle, getPair(t, asset.Futures)) + _, err = g.GetFuturesTickers(t.Context(), settle, getPair(t, asset.Futures)) assert.NoError(t, err, "GetFutureTickers should not error") } @@ -1026,13 +1022,13 @@ func TestGetFutureFundingRates(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFutureFundingRates(context.Background(), settle, getPair(t, asset.Futures), 0) + _, err = g.GetFutureFundingRates(t.Context(), settle, getPair(t, asset.Futures), 0) assert.NoError(t, err, "GetFutureFundingRates should not error") } func TestGetFuturesInsuranceBalanceHistory(t *testing.T) { t.Parallel() - _, err := g.GetFuturesInsuranceBalanceHistory(context.Background(), currency.USDT, 0) + _, err := g.GetFuturesInsuranceBalanceHistory(t.Context(), currency.USDT, 0) assert.NoError(t, err, "GetFuturesInsuranceBalanceHistory should not error") } @@ -1040,13 +1036,13 @@ func TestGetFutureStats(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetFutureStats(context.Background(), settle, getPair(t, asset.Futures), time.Time{}, 0, 0) + _, err = g.GetFutureStats(t.Context(), settle, getPair(t, asset.Futures), time.Time{}, 0, 0) assert.NoError(t, err, "GetFutureStats should not error") } func TestGetIndexConstituent(t *testing.T) { t.Parallel() - _, err := g.GetIndexConstituent(context.Background(), currency.USDT, currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()) + _, err := g.GetIndexConstituent(t.Context(), currency.USDT, currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()) assert.NoError(t, err, "GetIndexConstituent should not error") } @@ -1054,35 +1050,35 @@ func TestGetLiquidationHistory(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetLiquidationHistory(context.Background(), settle, getPair(t, asset.Futures), time.Time{}, time.Time{}, 0) + _, err = g.GetLiquidationHistory(t.Context(), settle, getPair(t, asset.Futures), time.Time{}, time.Time{}, 0) assert.NoError(t, err, "GetLiquidationHistory should not error") } func TestQueryFuturesAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.QueryFuturesAccount(context.Background(), currency.USDT) + _, err := g.QueryFuturesAccount(t.Context(), currency.USDT) assert.NoError(t, err, "QueryFuturesAccount should not error") } func TestGetFuturesAccountBooks(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetFuturesAccountBooks(context.Background(), currency.USDT, 0, time.Time{}, time.Time{}, "dnw") + _, err := g.GetFuturesAccountBooks(t.Context(), currency.USDT, 0, time.Time{}, time.Time{}, "dnw") assert.NoError(t, err, "GetFuturesAccountBooks should not error") } func TestGetAllFuturesPositionsOfUsers(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetAllFuturesPositionsOfUsers(context.Background(), currency.USDT, true) + _, err := g.GetAllFuturesPositionsOfUsers(t.Context(), currency.USDT, true) assert.NoError(t, err, "GetAllPositionsOfUsers should not error") } func TestGetSinglePosition(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSinglePosition(context.Background(), currency.USDT, currency.Pair{Quote: currency.BTC, Base: currency.USDT}) + _, err := g.GetSinglePosition(t.Context(), currency.USDT, currency.Pair{Quote: currency.BTC, Base: currency.USDT}) assert.NoError(t, err, "GetSinglePosition should not error") } @@ -1091,7 +1087,7 @@ func TestUpdateFuturesPositionMargin(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdateFuturesPositionMargin(context.Background(), settle, 0.01, getPair(t, asset.Futures)) + _, err = g.UpdateFuturesPositionMargin(t.Context(), settle, 0.01, getPair(t, asset.Futures)) assert.NoError(t, err, "UpdateFuturesPositionMargin should not error") } @@ -1100,7 +1096,7 @@ func TestUpdateFuturesPositionLeverage(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdateFuturesPositionLeverage(context.Background(), settle, getPair(t, asset.Futures), 1, 0) + _, err = g.UpdateFuturesPositionLeverage(t.Context(), settle, getPair(t, asset.Futures), 1, 0) assert.NoError(t, err, "UpdateFuturesPositionLeverage should not error") } @@ -1109,7 +1105,7 @@ func TestUpdateFuturesPositionRiskLimit(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdateFuturesPositionRiskLimit(context.Background(), settle, getPair(t, asset.Futures), 10) + _, err = g.UpdateFuturesPositionRiskLimit(t.Context(), settle, getPair(t, asset.Futures), 10) assert.NoError(t, err, "UpdateFuturesPositionRiskLimit should not error") } @@ -1118,7 +1114,7 @@ func TestPlaceDeliveryOrder(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.PlaceDeliveryOrder(context.Background(), &OrderCreateParams{ + _, err = g.PlaceDeliveryOrder(t.Context(), &ContractOrderCreateParams{ Contract: getPair(t, asset.DeliveryFutures), Size: 6024, Iceberg: 0, @@ -1135,7 +1131,7 @@ func TestGetDeliveryOrders(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g) settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetDeliveryOrders(context.Background(), getPair(t, asset.DeliveryFutures), "open", settle, "", 0, 0, 1) + _, err = g.GetDeliveryOrders(t.Context(), getPair(t, asset.DeliveryFutures), statusOpen, settle, "", 0, 0, 1) assert.NoError(t, err, "GetDeliveryOrders should not error") } @@ -1144,58 +1140,58 @@ func TestCancelMultipleDeliveryOrders(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.CancelMultipleDeliveryOrders(context.Background(), getPair(t, asset.DeliveryFutures), "ask", settle) + _, err = g.CancelMultipleDeliveryOrders(t.Context(), getPair(t, asset.DeliveryFutures), "ask", settle) assert.NoError(t, err, "CancelMultipleDeliveryOrders should not error") } func TestGetSingleDeliveryOrder(t *testing.T) { t.Parallel() - _, err := g.GetSingleDeliveryOrder(context.Background(), currency.EMPTYCODE, "123456") + _, err := g.GetSingleDeliveryOrder(t.Context(), currency.EMPTYCODE, "123456") assert.ErrorIs(t, err, errEmptyOrInvalidSettlementCurrency, "GetSingleDeliveryOrder should return errEmptyOrInvalidSettlementCurrency") sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err = g.GetSingleDeliveryOrder(context.Background(), currency.USDT, "123456") + _, err = g.GetSingleDeliveryOrder(t.Context(), currency.USDT, "123456") assert.NoError(t, err, "GetSingleDeliveryOrder should not error") } func TestCancelSingleDeliveryOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelSingleDeliveryOrder(context.Background(), currency.USDT, "123456") + _, err := g.CancelSingleDeliveryOrder(t.Context(), currency.USDT, "123456") assert.NoError(t, err, "CancelSingleDeliveryOrder should not error") } func TestGetMyDeliveryTradingHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetMyDeliveryTradingHistory(context.Background(), currency.USDT, "", getPair(t, asset.DeliveryFutures), 0, 0, 1, "") + _, err := g.GetMyDeliveryTradingHistory(t.Context(), currency.USDT, "", getPair(t, asset.DeliveryFutures), 0, 0, 1, "") assert.NoError(t, err, "GetMyDeliveryTradingHistory should not error") } func TestGetDeliveryPositionCloseHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryPositionCloseHistory(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, 0, time.Time{}, time.Time{}) + _, err := g.GetDeliveryPositionCloseHistory(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, 0, time.Time{}, time.Time{}) assert.NoError(t, err, "GetDeliveryPositionCloseHistory should not error") } func TestGetDeliveryLiquidationHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryLiquidationHistory(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, time.Now()) + _, err := g.GetDeliveryLiquidationHistory(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, time.Now()) assert.NoError(t, err, "GetDeliveryLiquidationHistory should not error") } func TestGetDeliverySettlementHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliverySettlementHistory(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, time.Now()) + _, err := g.GetDeliverySettlementHistory(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures), 0, time.Now()) assert.NoError(t, err, "GetDeliverySettlementHistory should not error") } func TestGetDeliveryPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryPriceTriggeredOrder(context.Background(), currency.USDT, &FuturesPriceTriggeredOrderParam{ + _, err := g.GetDeliveryPriceTriggeredOrder(t.Context(), currency.USDT, &FuturesPriceTriggeredOrderParam{ Initial: FuturesInitial{ Price: 1234., Size: 12, @@ -1213,7 +1209,7 @@ func TestGetDeliveryPriceTriggeredOrder(t *testing.T) { func TestGetDeliveryAllAutoOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryAllAutoOrder(context.Background(), "open", currency.USDT, getPair(t, asset.DeliveryFutures), 0, 1) + _, err := g.GetDeliveryAllAutoOrder(t.Context(), statusOpen, currency.USDT, getPair(t, asset.DeliveryFutures), 0, 1) assert.NoError(t, err, "GetDeliveryAllAutoOrder should not error") } @@ -1222,28 +1218,28 @@ func TestCancelAllDeliveryPriceTriggeredOrder(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.CancelAllDeliveryPriceTriggeredOrder(context.Background(), settle, getPair(t, asset.DeliveryFutures)) + _, err = g.CancelAllDeliveryPriceTriggeredOrder(t.Context(), settle, getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "CancelAllDeliveryPriceTriggeredOrder should not error") } func TestGetSingleDeliveryPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSingleDeliveryPriceTriggeredOrder(context.Background(), currency.USDT, "12345") + _, err := g.GetSingleDeliveryPriceTriggeredOrder(t.Context(), currency.USDT, "12345") assert.NoError(t, err, "GetSingleDeliveryPriceTriggeredOrder should not error") } func TestCancelDeliveryPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelDeliveryPriceTriggeredOrder(context.Background(), currency.USDT, "12345") + _, err := g.CancelDeliveryPriceTriggeredOrder(t.Context(), currency.USDT, "12345") assert.NoError(t, err, "CancelDeliveryPriceTriggeredOrder should not error") } func TestEnableOrDisableDualMode(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.EnableOrDisableDualMode(context.Background(), currency.BTC, true) + _, err := g.EnableOrDisableDualMode(t.Context(), currency.BTC, true) assert.NoError(t, err, "EnableOrDisableDualMode should not error") } @@ -1252,7 +1248,7 @@ func TestRetrivePositionDetailInDualMode(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.RetrivePositionDetailInDualMode(context.Background(), settle, getPair(t, asset.Futures)) + _, err = g.RetrivePositionDetailInDualMode(t.Context(), settle, getPair(t, asset.Futures)) assert.NoError(t, err, "RetrivePositionDetailInDualMode should not error") } @@ -1261,7 +1257,7 @@ func TestUpdatePositionMarginInDualMode(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdatePositionMarginInDualMode(context.Background(), settle, getPair(t, asset.Futures), 0.001, "dual_long") + _, err = g.UpdatePositionMarginInDualMode(t.Context(), settle, getPair(t, asset.Futures), 0.001, "dual_long") assert.NoError(t, err, "UpdatePositionMarginInDualMode should not error") } @@ -1270,7 +1266,7 @@ func TestUpdatePositionLeverageInDualMode(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdatePositionLeverageInDualMode(context.Background(), settle, getPair(t, asset.Futures), 0.001, 0.001) + _, err = g.UpdatePositionLeverageInDualMode(t.Context(), settle, getPair(t, asset.Futures), 0.001, 0.001) assert.NoError(t, err, "UpdatePositionLeverageInDualMode should not error") } @@ -1279,7 +1275,7 @@ func TestUpdatePositionRiskLimitInDualMode(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdatePositionRiskLimitInDualMode(context.Background(), settle, getPair(t, asset.Futures), 10) + _, err = g.UpdatePositionRiskLimitInDualMode(t.Context(), settle, getPair(t, asset.Futures), 10) assert.NoError(t, err, "UpdatePositionRiskLimitInDualMode should not error") } @@ -1288,7 +1284,7 @@ func TestPlaceFuturesOrder(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.PlaceFuturesOrder(context.Background(), &OrderCreateParams{ + _, err = g.PlaceFuturesOrder(t.Context(), &ContractOrderCreateParams{ Contract: getPair(t, asset.Futures), Size: 6024, Iceberg: 0, @@ -1303,28 +1299,28 @@ func TestPlaceFuturesOrder(t *testing.T) { func TestGetFuturesOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetFuturesOrders(context.Background(), currency.NewPair(currency.BTC, currency.USD), "open", "", currency.BTC, 0, 0, 1) + _, err := g.GetFuturesOrders(t.Context(), currency.NewPair(currency.BTC, currency.USD), statusOpen, "", currency.BTC, 0, 0, 1) assert.NoError(t, err, "GetFuturesOrders should not error") } func TestCancelMultipleFuturesOpenOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelMultipleFuturesOpenOrders(context.Background(), getPair(t, asset.Futures), "ask", currency.USDT) + _, err := g.CancelMultipleFuturesOpenOrders(t.Context(), getPair(t, asset.Futures), "ask", currency.USDT) assert.NoError(t, err, "CancelMultipleFuturesOpenOrders should not error") } func TestGetSingleFuturesPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSingleFuturesPriceTriggeredOrder(context.Background(), currency.BTC, "12345") + _, err := g.GetSingleFuturesPriceTriggeredOrder(t.Context(), currency.BTC, "12345") assert.NoError(t, err, "GetSingleFuturesPriceTriggeredOrder should not error") } func TestCancelFuturesPriceTriggeredOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelFuturesPriceTriggeredOrder(context.Background(), currency.USDT, "12345") + _, err := g.CancelFuturesPriceTriggeredOrder(t.Context(), currency.USDT, "12345") assert.NoError(t, err, "CancelFuturesPriceTriggeredOrder should not error") } @@ -1333,7 +1329,7 @@ func TestPlaceBatchFuturesOrders(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.PlaceBatchFuturesOrders(context.Background(), currency.BTC, []OrderCreateParams{ + _, err = g.PlaceBatchFuturesOrders(t.Context(), currency.BTC, []ContractOrderCreateParams{ { Contract: getPair(t, asset.Futures), Size: 6024, @@ -1359,21 +1355,21 @@ func TestPlaceBatchFuturesOrders(t *testing.T) { func TestGetSingleFuturesOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSingleFuturesOrder(context.Background(), currency.BTC, "12345") + _, err := g.GetSingleFuturesOrder(t.Context(), currency.BTC, "12345") assert.NoError(t, err, "GetSingleFuturesOrder should not error") } func TestCancelSingleFuturesOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelSingleFuturesOrder(context.Background(), currency.BTC, "12345") + _, err := g.CancelSingleFuturesOrder(t.Context(), currency.BTC, "12345") assert.NoError(t, err, "CancelSingleFuturesOrder should not error") } func TestAmendFuturesOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.AmendFuturesOrder(context.Background(), currency.BTC, "1234", AmendFuturesOrderParam{ + _, err := g.AmendFuturesOrder(t.Context(), currency.BTC, "1234", AmendFuturesOrderParam{ Price: 12345.990, }) assert.NoError(t, err, "AmendFuturesOrder should not error") @@ -1382,28 +1378,28 @@ func TestAmendFuturesOrder(t *testing.T) { func TestGetMyFuturesTradingHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetMyFuturesTradingHistory(context.Background(), currency.BTC, "", "", getPair(t, asset.Futures), 0, 0, 0) + _, err := g.GetMyFuturesTradingHistory(t.Context(), currency.BTC, "", "", getPair(t, asset.Futures), 0, 0, 0) assert.NoError(t, err, "GetMyFuturesTradingHistory should not error") } func TestGetFuturesPositionCloseHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetFuturesPositionCloseHistory(context.Background(), currency.BTC, getPair(t, asset.Futures), 0, 0, time.Time{}, time.Time{}) + _, err := g.GetFuturesPositionCloseHistory(t.Context(), currency.BTC, getPair(t, asset.Futures), 0, 0, time.Time{}, time.Time{}) assert.NoError(t, err, "GetFuturesPositionCloseHistory should not error") } func TestGetFuturesLiquidationHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetFuturesLiquidationHistory(context.Background(), currency.BTC, getPair(t, asset.Futures), 0, time.Time{}) + _, err := g.GetFuturesLiquidationHistory(t.Context(), currency.BTC, getPair(t, asset.Futures), 0, time.Time{}) assert.NoError(t, err, "GetFuturesLiquidationHistory should not error") } func TestCountdownCancelOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CountdownCancelOrders(context.Background(), currency.BTC, CountdownParams{ + _, err := g.CountdownCancelOrders(t.Context(), currency.BTC, CountdownParams{ Timeout: 8, }) assert.NoError(t, err, "CountdownCancelOrders should not error") @@ -1414,7 +1410,7 @@ func TestCreatePriceTriggeredFuturesOrder(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.CreatePriceTriggeredFuturesOrder(context.Background(), settle, &FuturesPriceTriggeredOrderParam{ + _, err = g.CreatePriceTriggeredFuturesOrder(t.Context(), settle, &FuturesPriceTriggeredOrderParam{ Initial: FuturesInitial{ Price: 1234., Size: 2, @@ -1426,7 +1422,7 @@ func TestCreatePriceTriggeredFuturesOrder(t *testing.T) { }, }) assert.NoError(t, err, "CreatePriceTriggeredFuturesOrder should not error") - _, err = g.CreatePriceTriggeredFuturesOrder(context.Background(), settle, &FuturesPriceTriggeredOrderParam{ + _, err = g.CreatePriceTriggeredFuturesOrder(t.Context(), settle, &FuturesPriceTriggeredOrderParam{ Initial: FuturesInitial{ Price: 1234., Size: 1, @@ -1442,7 +1438,7 @@ func TestCreatePriceTriggeredFuturesOrder(t *testing.T) { func TestListAllFuturesAutoOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.ListAllFuturesAutoOrders(context.Background(), "open", currency.BTC, currency.EMPTYPAIR, 0, 0) + _, err := g.ListAllFuturesAutoOrders(t.Context(), statusOpen, currency.BTC, currency.EMPTYPAIR, 0, 0) assert.NoError(t, err, "ListAllFuturesAutoOrders should not error") } @@ -1451,16 +1447,16 @@ func TestCancelAllFuturesOpenOrders(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.Futures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.CancelAllFuturesOpenOrders(context.Background(), settle, getPair(t, asset.Futures)) + _, err = g.CancelAllFuturesOpenOrders(t.Context(), settle, getPair(t, asset.Futures)) assert.NoError(t, err, "CancelAllFuturesOpenOrders should not error") } func TestGetAllDeliveryContracts(t *testing.T) { t.Parallel() - r, err := g.GetAllDeliveryContracts(context.Background(), currency.USDT) + r, err := g.GetAllDeliveryContracts(t.Context(), currency.USDT) require.NoError(t, err, "GetAllDeliveryContracts must not error") assert.NotEmpty(t, r, "GetAllDeliveryContracts should return data") - r, err = g.GetAllDeliveryContracts(context.Background(), currency.BTC) + r, err = g.GetAllDeliveryContracts(t.Context(), currency.BTC) require.NoError(t, err, "GetAllDeliveryContracts must not error") // The test below will fail if support for BTC settlement is added. This is intentional, as it ensures we are alerted when it's time to reintroduce support if !assert.Empty(t, r, "GetAllDeliveryContracts should not return any data with unsupported settlement currency BTC") { @@ -1472,13 +1468,13 @@ func TestGetDeliveryContract(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetDeliveryContract(context.Background(), settle, getPair(t, asset.DeliveryFutures)) + _, err = g.GetDeliveryContract(t.Context(), settle, getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "GetDeliveryContract should not error") } func TestGetDeliveryOrderbook(t *testing.T) { t.Parallel() - _, err := g.GetDeliveryOrderbook(context.Background(), currency.USDT, "0", getPair(t, asset.DeliveryFutures), 0, false) + _, err := g.GetDeliveryOrderbook(t.Context(), currency.USDT, "0", getPair(t, asset.DeliveryFutures), 0, false) assert.NoError(t, err, "GetDeliveryOrderbook should not error") } @@ -1486,7 +1482,7 @@ func TestGetDeliveryTradingHistory(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetDeliveryTradingHistory(context.Background(), settle, "", getPair(t, asset.DeliveryFutures), 0, time.Time{}, time.Time{}) + _, err = g.GetDeliveryTradingHistory(t.Context(), settle, "", getPair(t, asset.DeliveryFutures), 0, time.Time{}, time.Time{}) assert.NoError(t, err, "GetDeliveryTradingHistory should not error") } @@ -1494,7 +1490,7 @@ func TestGetDeliveryFuturesCandlesticks(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetDeliveryFuturesCandlesticks(context.Background(), settle, getPair(t, asset.DeliveryFutures), time.Time{}, time.Time{}, 0, kline.OneWeek) + _, err = g.GetDeliveryFuturesCandlesticks(t.Context(), settle, getPair(t, asset.DeliveryFutures), time.Time{}, time.Time{}, 0, kline.OneWeek) assert.NoError(t, err, "GetDeliveryFuturesCandlesticks should not error") } @@ -1502,104 +1498,104 @@ func TestGetDeliveryFutureTickers(t *testing.T) { t.Parallel() settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.GetDeliveryFutureTickers(context.Background(), settle, getPair(t, asset.DeliveryFutures)) + _, err = g.GetDeliveryFutureTickers(t.Context(), settle, getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "GetDeliveryFutureTickers should not error") } func TestGetDeliveryInsuranceBalanceHistory(t *testing.T) { t.Parallel() - _, err := g.GetDeliveryInsuranceBalanceHistory(context.Background(), currency.BTC, 0) + _, err := g.GetDeliveryInsuranceBalanceHistory(t.Context(), currency.BTC, 0) assert.NoError(t, err, "GetDeliveryInsuranceBalanceHistory should not error") } func TestQueryDeliveryFuturesAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryFuturesAccounts(context.Background(), currency.USDT) + _, err := g.GetDeliveryFuturesAccounts(t.Context(), currency.USDT) assert.NoError(t, err, "GetDeliveryFuturesAccounts should not error") } func TestGetDeliveryAccountBooks(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetDeliveryAccountBooks(context.Background(), currency.USDT, 0, time.Time{}, time.Now(), "dnw") + _, err := g.GetDeliveryAccountBooks(t.Context(), currency.USDT, 0, time.Time{}, time.Now(), "dnw") assert.NoError(t, err, "GetDeliveryAccountBooks should not error") } func TestGetAllDeliveryPositionsOfUser(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetAllDeliveryPositionsOfUser(context.Background(), currency.USDT) + _, err := g.GetAllDeliveryPositionsOfUser(t.Context(), currency.USDT) assert.NoError(t, err, "GetAllDeliveryPositionsOfUser should not error") } func TestGetSingleDeliveryPosition(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSingleDeliveryPosition(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures)) + _, err := g.GetSingleDeliveryPosition(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "GetSingleDeliveryPosition should not error") } func TestUpdateDeliveryPositionMargin(t *testing.T) { t.Parallel() - _, err := g.UpdateDeliveryPositionMargin(context.Background(), currency.EMPTYCODE, 0.001, currency.Pair{}) + _, err := g.UpdateDeliveryPositionMargin(t.Context(), currency.EMPTYCODE, 0.001, currency.Pair{}) assert.ErrorIs(t, err, errEmptyOrInvalidSettlementCurrency) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) settle, err := getSettlementFromCurrency(getPair(t, asset.DeliveryFutures)) require.NoError(t, err, "getSettlementFromCurrency must not error") - _, err = g.UpdateDeliveryPositionMargin(context.Background(), settle, 0.001, getPair(t, asset.DeliveryFutures)) + _, err = g.UpdateDeliveryPositionMargin(t.Context(), settle, 0.001, getPair(t, asset.DeliveryFutures)) assert.NoError(t, err, "UpdateDeliveryPositionMargin should not error") } func TestUpdateDeliveryPositionLeverage(t *testing.T) { t.Parallel() - _, err := g.UpdateDeliveryPositionLeverage(context.Background(), currency.EMPTYCODE, currency.Pair{}, 0.001) + _, err := g.UpdateDeliveryPositionLeverage(t.Context(), currency.EMPTYCODE, currency.Pair{}, 0.001) assert.ErrorIs(t, err, errEmptyOrInvalidSettlementCurrency) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err = g.UpdateDeliveryPositionLeverage(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures), 0.001) + _, err = g.UpdateDeliveryPositionLeverage(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures), 0.001) assert.NoError(t, err, "UpdateDeliveryPositionLeverage should not error") } func TestUpdateDeliveryPositionRiskLimit(t *testing.T) { t.Parallel() - _, err := g.UpdateDeliveryPositionRiskLimit(context.Background(), currency.EMPTYCODE, currency.Pair{}, 0) + _, err := g.UpdateDeliveryPositionRiskLimit(t.Context(), currency.EMPTYCODE, currency.Pair{}, 0) assert.ErrorIs(t, err, errEmptyOrInvalidSettlementCurrency) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err = g.UpdateDeliveryPositionRiskLimit(context.Background(), currency.USDT, getPair(t, asset.DeliveryFutures), 30) + _, err = g.UpdateDeliveryPositionRiskLimit(t.Context(), currency.USDT, getPair(t, asset.DeliveryFutures), 30) assert.NoError(t, err, "UpdateDeliveryPositionRiskLimit should not error") } func TestGetAllOptionsUnderlyings(t *testing.T) { t.Parallel() - if _, err := g.GetAllOptionsUnderlyings(context.Background()); err != nil { + if _, err := g.GetAllOptionsUnderlyings(t.Context()); err != nil { t.Errorf("%s GetAllOptionsUnderlyings() error %v", g.Name, err) } } func TestGetExpirationTime(t *testing.T) { t.Parallel() - if _, err := g.GetExpirationTime(context.Background(), "BTC_USDT"); err != nil { + if _, err := g.GetExpirationTime(t.Context(), "BTC_USDT"); err != nil { t.Errorf("%s GetExpirationTime() error %v", g.Name, err) } } func TestGetAllContractOfUnderlyingWithinExpiryDate(t *testing.T) { t.Parallel() - if _, err := g.GetAllContractOfUnderlyingWithinExpiryDate(context.Background(), "BTC_USDT", time.Time{}); err != nil { + if _, err := g.GetAllContractOfUnderlyingWithinExpiryDate(t.Context(), "BTC_USDT", time.Time{}); err != nil { t.Errorf("%s GetAllContractOfUnderlyingWithinExpiryDate() error %v", g.Name, err) } } func TestGetOptionsSpecifiedContractDetail(t *testing.T) { t.Parallel() - if _, err := g.GetOptionsSpecifiedContractDetail(context.Background(), getPair(t, asset.Options)); err != nil { + if _, err := g.GetOptionsSpecifiedContractDetail(t.Context(), getPair(t, asset.Options)); err != nil { t.Errorf("%s GetOptionsSpecifiedContractDetail() error %v", g.Name, err) } } func TestGetSettlementHistory(t *testing.T) { t.Parallel() - if _, err := g.GetSettlementHistory(context.Background(), "BTC_USDT", 0, 0, time.Time{}, time.Time{}); err != nil { + if _, err := g.GetSettlementHistory(t.Context(), "BTC_USDT", 0, 0, time.Time{}, time.Time{}); err != nil { t.Errorf("%s GetSettlementHistory() error %v", g.Name, err) } } @@ -1607,7 +1603,7 @@ func TestGetSettlementHistory(t *testing.T) { func TestGetOptionsSpecifiedSettlementHistory(t *testing.T) { t.Parallel() underlying := "BTC_USDT" - optionsSettlement, err := g.GetSettlementHistory(context.Background(), underlying, 0, 1, time.Time{}, time.Time{}) + optionsSettlement, err := g.GetSettlementHistory(t.Context(), underlying, 0, 1, time.Time{}, time.Time{}) if err != nil { t.Fatal(err) } @@ -1615,14 +1611,14 @@ func TestGetOptionsSpecifiedSettlementHistory(t *testing.T) { if err != nil { t.Fatal(err) } - if _, err := g.GetOptionsSpecifiedContractsSettlement(context.Background(), cp, underlying, optionsSettlement[0].Timestamp.Time().Unix()); err != nil { + if _, err := g.GetOptionsSpecifiedContractsSettlement(t.Context(), cp, underlying, optionsSettlement[0].Timestamp.Time().Unix()); err != nil { t.Errorf("%s GetOptionsSpecifiedContractsSettlement() error %s", g.Name, err) } } func TestGetSupportedFlashSwapCurrencies(t *testing.T) { t.Parallel() - if _, err := g.GetSupportedFlashSwapCurrencies(context.Background()); err != nil { + if _, err := g.GetSupportedFlashSwapCurrencies(t.Context()); err != nil { t.Errorf("%s GetSupportedFlashSwapCurrencies() error %v", g.Name, err) } } @@ -1636,7 +1632,7 @@ func TestCreateFlashSwapOrder(t *testing.T) { t.Errorf("%s error while deserializing to FlashSwapOrderResponse %v", g.Name, err) } sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreateFlashSwapOrder(context.Background(), FlashSwapOrderParams{ + if _, err := g.CreateFlashSwapOrder(t.Context(), FlashSwapOrderParams{ PreviewID: "1234", SellCurrency: currency.USDT, BuyCurrency: currency.BTC, @@ -1650,7 +1646,7 @@ func TestCreateFlashSwapOrder(t *testing.T) { func TestGetAllFlashSwapOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetAllFlashSwapOrders(context.Background(), 1, currency.EMPTYCODE, currency.EMPTYCODE, true, 0, 0); err != nil { + if _, err := g.GetAllFlashSwapOrders(t.Context(), 1, currency.EMPTYCODE, currency.EMPTYCODE, true, 0, 0); err != nil { t.Errorf("%s GetAllFlashSwapOrders() error %v", g.Name, err) } } @@ -1658,7 +1654,7 @@ func TestGetAllFlashSwapOrders(t *testing.T) { func TestGetSingleFlashSwapOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSingleFlashSwapOrder(context.Background(), "1234"); err != nil { + if _, err := g.GetSingleFlashSwapOrder(t.Context(), "1234"); err != nil { t.Errorf("%s GetSingleFlashSwapOrder() error %v", g.Name, err) } } @@ -1666,7 +1662,7 @@ func TestGetSingleFlashSwapOrders(t *testing.T) { func TestInitiateFlashSwapOrderReview(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.InitiateFlashSwapOrderReview(context.Background(), FlashSwapOrderParams{ + if _, err := g.InitiateFlashSwapOrderReview(t.Context(), FlashSwapOrderParams{ PreviewID: "1234", SellCurrency: currency.USDT, BuyCurrency: currency.BTC, @@ -1679,7 +1675,7 @@ func TestInitiateFlashSwapOrderReview(t *testing.T) { func TestGetMyOptionsSettlements(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetMyOptionsSettlements(context.Background(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}); err != nil { + if _, err := g.GetMyOptionsSettlements(t.Context(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}); err != nil { t.Errorf("%s GetMyOptionsSettlements() error %v", g.Name, err) } } @@ -1687,7 +1683,7 @@ func TestGetMyOptionsSettlements(t *testing.T) { func TestGetOptionAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetOptionAccounts(context.Background()); err != nil { + if _, err := g.GetOptionAccounts(t.Context()); err != nil { t.Errorf("%s GetOptionAccounts() error %v", g.Name, err) } } @@ -1695,7 +1691,7 @@ func TestGetOptionAccounts(t *testing.T) { func TestGetAccountChangingHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetAccountChangingHistory(context.Background(), 0, 0, time.Time{}, time.Time{}, ""); err != nil { + if _, err := g.GetAccountChangingHistory(t.Context(), 0, 0, time.Time{}, time.Time{}, ""); err != nil { t.Errorf("%s GetAccountChangingHistory() error %v", g.Name, err) } } @@ -1703,7 +1699,7 @@ func TestGetAccountChangingHistory(t *testing.T) { func TestGetUsersPositionSpecifiedUnderlying(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetUsersPositionSpecifiedUnderlying(context.Background(), ""); err != nil { + if _, err := g.GetUsersPositionSpecifiedUnderlying(t.Context(), ""); err != nil { t.Errorf("%s GetUsersPositionSpecifiedUnderlying() error %v", g.Name, err) } } @@ -1711,11 +1707,11 @@ func TestGetUsersPositionSpecifiedUnderlying(t *testing.T) { func TestGetSpecifiedContractPosition(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetSpecifiedContractPosition(context.Background(), currency.EMPTYPAIR) + _, err := g.GetSpecifiedContractPosition(t.Context(), currency.EMPTYPAIR) if err != nil && !errors.Is(err, errInvalidOrMissingContractParam) { t.Errorf("%s GetSpecifiedContractPosition() error expecting %v, but found %v", g.Name, errInvalidOrMissingContractParam, err) } - _, err = g.GetSpecifiedContractPosition(context.Background(), getPair(t, asset.Options)) + _, err = g.GetSpecifiedContractPosition(t.Context(), getPair(t, asset.Options)) if err != nil { t.Errorf("%s GetSpecifiedContractPosition() error expecting %v, but found %v", g.Name, errInvalidOrMissingContractParam, err) } @@ -1724,7 +1720,7 @@ func TestGetSpecifiedContractPosition(t *testing.T) { func TestGetUsersLiquidationHistoryForSpecifiedUnderlying(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetUsersLiquidationHistoryForSpecifiedUnderlying(context.Background(), "BTC_USDT", currency.EMPTYPAIR); err != nil { + if _, err := g.GetUsersLiquidationHistoryForSpecifiedUnderlying(t.Context(), "BTC_USDT", currency.EMPTYPAIR); err != nil { t.Errorf("%s GetUsersLiquidationHistoryForSpecifiedUnderlying() error %v", g.Name, err) } } @@ -1732,7 +1728,7 @@ func TestGetUsersLiquidationHistoryForSpecifiedUnderlying(t *testing.T) { func TestPlaceOptionOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.PlaceOptionOrder(context.Background(), &OptionOrderParam{ + _, err := g.PlaceOptionOrder(t.Context(), &OptionOrderParam{ Contract: getPair(t, asset.Options).String(), OrderSize: -1, Iceberg: 0, @@ -1748,7 +1744,7 @@ func TestPlaceOptionOrder(t *testing.T) { func TestGetOptionFuturesOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetOptionFuturesOrders(context.Background(), currency.EMPTYPAIR, "", "", 0, 0, time.Time{}, time.Time{}); err != nil { + if _, err := g.GetOptionFuturesOrders(t.Context(), currency.EMPTYPAIR, "", "", 0, 0, time.Time{}, time.Time{}); err != nil { t.Errorf("%s GetOptionFuturesOrders() error %v", g.Name, err) } } @@ -1756,7 +1752,7 @@ func TestGetOptionFuturesOrders(t *testing.T) { func TestCancelOptionOpenOrders(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelMultipleOptionOpenOrders(context.Background(), getPair(t, asset.Options), "", ""); err != nil { + if _, err := g.CancelMultipleOptionOpenOrders(t.Context(), getPair(t, asset.Options), "", ""); err != nil { t.Errorf("%s CancelOptionOpenOrders() error %v", g.Name, err) } } @@ -1764,10 +1760,10 @@ func TestCancelOptionOpenOrders(t *testing.T) { func TestGetSingleOptionOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSingleOptionOrder(context.Background(), ""); err != nil && !errors.Is(errInvalidOrderID, err) { + if _, err := g.GetSingleOptionOrder(t.Context(), ""); err != nil && !errors.Is(errInvalidOrderID, err) { t.Errorf("%s GetSingleOptionorder() expecting %v, but found %v", g.Name, errInvalidOrderID, err) } - if _, err := g.GetSingleOptionOrder(context.Background(), "1234"); err != nil { + if _, err := g.GetSingleOptionOrder(t.Context(), "1234"); err != nil { t.Errorf("%s GetSingleOptionOrder() error %v", g.Name, err) } } @@ -1775,7 +1771,7 @@ func TestGetSingleOptionOrder(t *testing.T) { func TestCancelSingleOrder(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelOptionSingleOrder(context.Background(), "1234"); err != nil { + if _, err := g.CancelOptionSingleOrder(t.Context(), "1234"); err != nil { t.Errorf("%s CancelSingleOrder() error %v", g.Name, err) } } @@ -1784,18 +1780,18 @@ func TestGetMyOptionsTradingHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetMyOptionsTradingHistory(context.Background(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}, time.Time{}) + _, err := g.GetMyOptionsTradingHistory(t.Context(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}, time.Time{}) require.NoError(t, err) } func TestWithdrawCurrency(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.WithdrawCurrency(context.Background(), WithdrawalRequestParam{}) + _, err := g.WithdrawCurrency(t.Context(), WithdrawalRequestParam{}) if err != nil && !errors.Is(err, errInvalidAmount) { t.Errorf("%s WithdrawCurrency() expecting error %v, but found %v", g.Name, errInvalidAmount, err) } - _, err = g.WithdrawCurrency(context.Background(), WithdrawalRequestParam{ + _, err = g.WithdrawCurrency(t.Context(), WithdrawalRequestParam{ Currency: currency.BTC, Amount: 0.00000001, Chain: "BTC", @@ -1809,49 +1805,49 @@ func TestWithdrawCurrency(t *testing.T) { func TestCancelWithdrawalWithSpecifiedID(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CancelWithdrawalWithSpecifiedID(context.Background(), "1234567"); err != nil { + if _, err := g.CancelWithdrawalWithSpecifiedID(t.Context(), "1234567"); err != nil { t.Errorf("%s CancelWithdrawalWithSpecifiedID() error %v", g.Name, err) } } func TestGetOptionsOrderbook(t *testing.T) { t.Parallel() - if _, err := g.GetOptionsOrderbook(context.Background(), getPair(t, asset.Options), "0.1", 9, true); err != nil { + if _, err := g.GetOptionsOrderbook(t.Context(), getPair(t, asset.Options), "0.1", 9, true); err != nil { t.Errorf("%s GetOptionsFuturesOrderbooks() error %v", g.Name, err) } } func TestGetOptionsTickers(t *testing.T) { t.Parallel() - if _, err := g.GetOptionsTickers(context.Background(), "BTC_USDT"); err != nil { + if _, err := g.GetOptionsTickers(t.Context(), "BTC_USDT"); err != nil { t.Errorf("%s GetOptionsTickers() error %v", g.Name, err) } } func TestGetOptionUnderlyingTickers(t *testing.T) { t.Parallel() - if _, err := g.GetOptionUnderlyingTickers(context.Background(), "BTC_USDT"); err != nil { + if _, err := g.GetOptionUnderlyingTickers(t.Context(), "BTC_USDT"); err != nil { t.Errorf("%s GetOptionUnderlyingTickers() error %v", g.Name, err) } } func TestGetOptionFuturesCandlesticks(t *testing.T) { t.Parallel() - if _, err := g.GetOptionFuturesCandlesticks(context.Background(), getPair(t, asset.Options), 0, time.Now().Add(-time.Hour*10), time.Time{}, kline.ThirtyMin); err != nil { + if _, err := g.GetOptionFuturesCandlesticks(t.Context(), getPair(t, asset.Options), 0, time.Now().Add(-time.Hour*10), time.Time{}, kline.ThirtyMin); err != nil { t.Error(err) } } func TestGetOptionFuturesMarkPriceCandlesticks(t *testing.T) { t.Parallel() - if _, err := g.GetOptionFuturesMarkPriceCandlesticks(context.Background(), "BTC_USDT", 0, time.Time{}, time.Time{}, kline.OneMonth); err != nil { + if _, err := g.GetOptionFuturesMarkPriceCandlesticks(t.Context(), "BTC_USDT", 0, time.Time{}, time.Time{}, kline.OneMonth); err != nil { t.Errorf("%s GetOptionFuturesMarkPriceCandlesticks() error %v", g.Name, err) } } func TestGetOptionsTradeHistory(t *testing.T) { t.Parallel() - if _, err := g.GetOptionsTradeHistory(context.Background(), getPair(t, asset.Options), "C", 0, 0, time.Time{}, time.Time{}); err != nil { + if _, err := g.GetOptionsTradeHistory(t.Context(), getPair(t, asset.Options), "C", 0, 0, time.Time{}, time.Time{}); err != nil { t.Errorf("%s GetOptionsTradeHistory() error %v", g.Name, err) } } @@ -1861,7 +1857,7 @@ func TestGetOptionsTradeHistory(t *testing.T) { func TestCreateNewSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreateNewSubAccount(context.Background(), SubAccountParams{ + if _, err := g.CreateNewSubAccount(t.Context(), SubAccountParams{ LoginName: "Sub_Account_for_testing", }); err != nil { t.Errorf("%s CreateNewSubAccount() error %v", g.Name, err) @@ -1871,7 +1867,7 @@ func TestCreateNewSubAccount(t *testing.T) { func TestGetSubAccounts(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSubAccounts(context.Background()); err != nil { + if _, err := g.GetSubAccounts(t.Context()); err != nil { t.Errorf("%s GetSubAccounts() error %v", g.Name, err) } } @@ -1879,7 +1875,7 @@ func TestGetSubAccounts(t *testing.T) { func TestGetSingleSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetSingleSubAccount(context.Background(), "123423"); err != nil { + if _, err := g.GetSingleSubAccount(t.Context(), "123423"); err != nil { t.Errorf("%s GetSingleSubAccount() error %v", g.Name, err) } } @@ -1888,25 +1884,25 @@ func TestGetSingleSubAccount(t *testing.T) { func TestFetchTradablePairs(t *testing.T) { t.Parallel() - _, err := g.FetchTradablePairs(context.Background(), asset.DeliveryFutures) + _, err := g.FetchTradablePairs(t.Context(), asset.DeliveryFutures) if err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } - if _, err = g.FetchTradablePairs(context.Background(), asset.Options); err != nil { + if _, err = g.FetchTradablePairs(t.Context(), asset.Options); err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } - _, err = g.FetchTradablePairs(context.Background(), asset.Futures) + _, err = g.FetchTradablePairs(t.Context(), asset.Futures) if err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } - if _, err = g.FetchTradablePairs(context.Background(), asset.Margin); err != nil { + if _, err = g.FetchTradablePairs(t.Context(), asset.Margin); err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } - _, err = g.FetchTradablePairs(context.Background(), asset.CrossMargin) + _, err = g.FetchTradablePairs(t.Context(), asset.CrossMargin) if err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } - _, err = g.FetchTradablePairs(context.Background(), asset.Spot) + _, err = g.FetchTradablePairs(t.Context(), asset.Spot) if err != nil { t.Errorf("%s FetchTradablePairs() error %v", g.Name, err) } @@ -1914,48 +1910,48 @@ func TestFetchTradablePairs(t *testing.T) { func TestUpdateTickers(t *testing.T) { t.Parallel() - if err := g.UpdateTickers(context.Background(), asset.DeliveryFutures); err != nil { + if err := g.UpdateTickers(t.Context(), asset.DeliveryFutures); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } - if err := g.UpdateTickers(context.Background(), asset.Futures); err != nil { + if err := g.UpdateTickers(t.Context(), asset.Futures); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } - if err := g.UpdateTickers(context.Background(), asset.Spot); err != nil { + if err := g.UpdateTickers(t.Context(), asset.Spot); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } - if err := g.UpdateTickers(context.Background(), asset.Options); err != nil { + if err := g.UpdateTickers(t.Context(), asset.Options); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } - if err := g.UpdateTickers(context.Background(), asset.CrossMargin); err != nil { + if err := g.UpdateTickers(t.Context(), asset.CrossMargin); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } - if err := g.UpdateTickers(context.Background(), asset.Margin); err != nil { + if err := g.UpdateTickers(t.Context(), asset.Margin); err != nil { t.Errorf("%s UpdateTickers() error %v", g.Name, err) } } func TestUpdateOrderbook(t *testing.T) { t.Parallel() - _, err := g.UpdateOrderbook(context.Background(), getPair(t, asset.Spot), asset.Spot) + _, err := g.UpdateOrderbook(t.Context(), getPair(t, asset.Spot), asset.Spot) if err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } - _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Margin), asset.Margin) + _, err = g.UpdateOrderbook(t.Context(), getPair(t, asset.Margin), asset.Margin) if err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } - _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin) + _, err = g.UpdateOrderbook(t.Context(), getPair(t, asset.CrossMargin), asset.CrossMargin) if err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } - _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Futures), asset.Futures) + _, err = g.UpdateOrderbook(t.Context(), getPair(t, asset.Futures), asset.Futures) if err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } - if _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures); err != nil { + if _, err = g.UpdateOrderbook(t.Context(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures); err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } - if _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Options), asset.Options); err != nil { + if _, err = g.UpdateOrderbook(t.Context(), getPair(t, asset.Options), asset.Options); err != nil { t.Errorf("%s UpdateOrderbook() error %v", g.Name, err) } } @@ -1963,34 +1959,34 @@ func TestUpdateOrderbook(t *testing.T) { func TestGetWithdrawalsHistory(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if _, err := g.GetWithdrawalsHistory(context.Background(), currency.BTC, asset.Empty); err != nil { + if _, err := g.GetWithdrawalsHistory(t.Context(), currency.BTC, asset.Empty); err != nil { t.Errorf("%s GetWithdrawalsHistory() error %v", g.Name, err) } } func TestGetRecentTrades(t *testing.T) { t.Parallel() - _, err := g.GetRecentTrades(context.Background(), getPair(t, asset.Spot), asset.Spot) + _, err := g.GetRecentTrades(t.Context(), getPair(t, asset.Spot), asset.Spot) if err != nil { t.Error(err) } - _, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Margin), asset.Margin) + _, err = g.GetRecentTrades(t.Context(), getPair(t, asset.Margin), asset.Margin) if err != nil { t.Error(err) } - _, err = g.GetRecentTrades(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin) + _, err = g.GetRecentTrades(t.Context(), getPair(t, asset.CrossMargin), asset.CrossMargin) if err != nil { t.Error(err) } - _, err = g.GetRecentTrades(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures) + _, err = g.GetRecentTrades(t.Context(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures) if err != nil { t.Error(err) } - _, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Futures), asset.Futures) + _, err = g.GetRecentTrades(t.Context(), getPair(t, asset.Futures), asset.Futures) if err != nil { t.Error(err) } - _, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Options), asset.Options) + _, err = g.GetRecentTrades(t.Context(), getPair(t, asset.Options), asset.Options) if err != nil { t.Error(err) } @@ -1998,7 +1994,7 @@ func TestGetRecentTrades(t *testing.T) { func TestSubmitOrder(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.SubmitOrder(context.Background(), &order.Submit{ + _, err := g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.CrossMargin), Side: order.Buy, @@ -2010,7 +2006,7 @@ func TestSubmitOrder(t *testing.T) { if err != nil { t.Errorf("Order failed to be placed: %v", err) } - _, err = g.SubmitOrder(context.Background(), &order.Submit{ + _, err = g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.Spot), Side: order.Buy, @@ -2022,7 +2018,7 @@ func TestSubmitOrder(t *testing.T) { if err != nil { t.Errorf("Order failed to be placed: %v", err) } - _, err = g.SubmitOrder(context.Background(), &order.Submit{ + _, err = g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.Options), Side: order.Buy, @@ -2034,7 +2030,7 @@ func TestSubmitOrder(t *testing.T) { if err != nil { t.Errorf("Order failed to be placed: %v", err) } - _, err = g.SubmitOrder(context.Background(), &order.Submit{ + _, err = g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.DeliveryFutures), Side: order.Buy, @@ -2046,7 +2042,7 @@ func TestSubmitOrder(t *testing.T) { if err != nil { t.Errorf("Order failed to be placed: %v", err) } - _, err = g.SubmitOrder(context.Background(), &order.Submit{ + _, err = g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.Futures), Side: order.Buy, @@ -2058,7 +2054,7 @@ func TestSubmitOrder(t *testing.T) { if err != nil { t.Errorf("Order failed to be placed: %v", err) } - _, err = g.SubmitOrder(context.Background(), &order.Submit{ + _, err = g.SubmitOrder(t.Context(), &order.Submit{ Exchange: g.Name, Pair: getPair(t, asset.Margin), Side: order.Buy, @@ -2081,32 +2077,32 @@ func TestCancelExchangeOrder(t *testing.T) { Pair: currency.NewPair(currency.LTC, currency.BTC), AssetType: asset.Spot, } - err := g.CancelOrder(context.Background(), orderCancellation) + err := g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } orderCancellation.AssetType = asset.Margin - err = g.CancelOrder(context.Background(), orderCancellation) + err = g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } orderCancellation.AssetType = asset.CrossMargin - err = g.CancelOrder(context.Background(), orderCancellation) + err = g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } orderCancellation.AssetType = asset.Options - err = g.CancelOrder(context.Background(), orderCancellation) + err = g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } orderCancellation.AssetType = asset.Futures - err = g.CancelOrder(context.Background(), orderCancellation) + err = g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } orderCancellation.AssetType = asset.DeliveryFutures - err = g.CancelOrder(context.Background(), orderCancellation) + err = g.CancelOrder(t.Context(), orderCancellation) if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } @@ -2114,7 +2110,7 @@ func TestCancelExchangeOrder(t *testing.T) { func TestCancelBatchOrders(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - _, err := g.CancelBatchOrders(context.Background(), []order.Cancel{ + _, err := g.CancelBatchOrders(t.Context(), []order.Cancel{ { OrderID: "1", WalletAddress: core.BitcoinDonationAddress, @@ -2132,7 +2128,7 @@ func TestCancelBatchOrders(t *testing.T) { if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } - _, err = g.CancelBatchOrders(context.Background(), []order.Cancel{ + _, err = g.CancelBatchOrders(t.Context(), []order.Cancel{ { OrderID: "1", WalletAddress: core.BitcoinDonationAddress, @@ -2150,7 +2146,7 @@ func TestCancelBatchOrders(t *testing.T) { if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } - _, err = g.CancelBatchOrders(context.Background(), []order.Cancel{ + _, err = g.CancelBatchOrders(t.Context(), []order.Cancel{ { OrderID: "1", WalletAddress: core.BitcoinDonationAddress, @@ -2168,7 +2164,7 @@ func TestCancelBatchOrders(t *testing.T) { if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } - _, err = g.CancelBatchOrders(context.Background(), []order.Cancel{ + _, err = g.CancelBatchOrders(t.Context(), []order.Cancel{ { OrderID: "1", WalletAddress: core.BitcoinDonationAddress, @@ -2186,7 +2182,7 @@ func TestCancelBatchOrders(t *testing.T) { if err != nil { t.Errorf("%s CancelOrder error: %v", g.Name, err) } - _, err = g.CancelBatchOrders(context.Background(), []order.Cancel{ + _, err = g.CancelBatchOrders(t.Context(), []order.Cancel{ { OrderID: "1", WalletAddress: core.BitcoinDonationAddress, @@ -2208,12 +2204,12 @@ func TestCancelBatchOrders(t *testing.T) { func TestGetDepositAddress(t *testing.T) { sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - chains, err := g.GetAvailableTransferChains(context.Background(), currency.BTC) + chains, err := g.GetAvailableTransferChains(t.Context(), currency.BTC) if err != nil { t.Fatal(err) } for i := range chains { - _, err = g.GetDepositAddress(context.Background(), currency.BTC, "", chains[i]) + _, err = g.GetDepositAddress(t.Context(), currency.BTC, "", chains[i]) if err != nil { t.Error("Test Fail - GetDepositAddress error", err) } @@ -2226,7 +2222,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Error(err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: enabledPairs[:2], Type: order.AnyType, Side: order.AnySide, @@ -2239,7 +2235,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Error(err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: []currency.Pair{cp}, Type: order.AnyType, Side: order.AnySide, @@ -2248,7 +2244,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: enabledPairs[:2], Type: order.AnyType, Side: order.AnySide, @@ -2257,7 +2253,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: enabledPairs[:2], Type: order.AnyType, Side: order.AnySide, @@ -2266,7 +2262,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: currency.Pairs{getPair(t, asset.Futures)}, Type: order.AnyType, Side: order.AnySide, @@ -2275,7 +2271,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: currency.Pairs{getPair(t, asset.DeliveryFutures)}, Type: order.AnyType, Side: order.AnySide, @@ -2284,7 +2280,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: currency.Pairs{getPair(t, asset.Options)}, Type: order.AnyType, Side: order.AnySide, @@ -2293,7 +2289,7 @@ func TestGetActiveOrders(t *testing.T) { if err != nil { t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err) } - if _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{ + if _, err = g.GetActiveOrders(t.Context(), &order.MultiOrderRequest{ Pairs: currency.Pairs{}, Type: order.AnyType, Side: order.AnySide, @@ -2315,7 +2311,7 @@ func TestGetOrderHistory(t *testing.T) { t.Fatal(err) } multiOrderRequest.Pairs = enabledPairs[:3] - _, err = g.GetOrderHistory(context.Background(), &multiOrderRequest) + _, err = g.GetOrderHistory(t.Context(), &multiOrderRequest) if err != nil { t.Errorf("%s GetOrderhistory() error: %v", g.Name, err) } @@ -2325,7 +2321,7 @@ func TestGetOrderHistory(t *testing.T) { t.Fatal(err) } multiOrderRequest.Pairs = multiOrderRequest.Pairs[len(multiOrderRequest.Pairs)-4:] - _, err = g.GetOrderHistory(context.Background(), &multiOrderRequest) + _, err = g.GetOrderHistory(t.Context(), &multiOrderRequest) if err != nil { t.Errorf("%s GetOrderhistory() error: %v", g.Name, err) } @@ -2334,7 +2330,7 @@ func TestGetOrderHistory(t *testing.T) { if err != nil { t.Fatal(err) } - _, err = g.GetOrderHistory(context.Background(), &multiOrderRequest) + _, err = g.GetOrderHistory(t.Context(), &multiOrderRequest) if err != nil { t.Errorf("%s GetOrderhistory() error: %v", g.Name, err) } @@ -2343,7 +2339,7 @@ func TestGetOrderHistory(t *testing.T) { if err != nil { t.Fatal(err) } - _, err = g.GetOrderHistory(context.Background(), &multiOrderRequest) + _, err = g.GetOrderHistory(t.Context(), &multiOrderRequest) if err != nil { t.Errorf("%s GetOrderhistory() error: %v", g.Name, err) } @@ -2352,25 +2348,25 @@ func TestGetOrderHistory(t *testing.T) { func TestGetHistoricCandles(t *testing.T) { t.Parallel() startTime := time.Now().Add(-time.Hour * 10) - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Spot), asset.Spot, kline.OneDay, startTime, time.Now()); err != nil { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.Spot), asset.Spot, kline.OneDay, startTime, time.Now()); err != nil { t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Margin), asset.Margin, kline.OneDay, startTime, time.Now()); err != nil { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.Margin), asset.Margin, kline.OneDay, startTime, time.Now()); err != nil { t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin, kline.OneDay, startTime, time.Now()); err != nil { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.CrossMargin), asset.CrossMargin, kline.OneDay, startTime, time.Now()); err != nil { t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Futures), asset.Futures, kline.OneDay, startTime, time.Now()); err != nil { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.Futures), asset.Futures, kline.OneDay, startTime, time.Now()); err != nil { t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures, kline.OneDay, startTime, time.Now()); err != nil { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures, kline.OneDay, startTime, time.Now()); err != nil { t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { t.Errorf("%s GetHistoricCandles() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err) } - if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { + if _, err := g.GetHistoricCandles(t.Context(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { t.Errorf("%s GetHistoricCandles() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err) } } @@ -2378,38 +2374,38 @@ func TestGetHistoricCandles(t *testing.T) { func TestGetHistoricCandlesExtended(t *testing.T) { t.Parallel() startTime := time.Now().Add(-time.Hour * 5) - _, err := g.GetHistoricCandlesExtended(context.Background(), + _, err := g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.Spot), asset.Spot, kline.OneMin, startTime, time.Now()) if err != nil { t.Fatal(err) } - _, err = g.GetHistoricCandlesExtended(context.Background(), + _, err = g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.Margin), asset.Margin, kline.OneMin, startTime, time.Now()) if err != nil { t.Fatal(err) } - _, err = g.GetHistoricCandlesExtended(context.Background(), + _, err = g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures, kline.OneMin, time.Now().Add(-time.Hour*5), time.Now()) if err != nil { t.Error(err) } - _, err = g.GetHistoricCandlesExtended(context.Background(), getPair(t, asset.Futures), asset.Futures, kline.OneMin, startTime, time.Now()) + _, err = g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.Futures), asset.Futures, kline.OneMin, startTime, time.Now()) if err != nil { t.Error(err) } - _, err = g.GetHistoricCandlesExtended(context.Background(), + _, err = g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.CrossMargin), asset.CrossMargin, kline.OneMin, startTime, time.Now()) if err != nil { t.Error(err) } - if _, err = g.GetHistoricCandlesExtended(context.Background(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { + if _, err = g.GetHistoricCandlesExtended(t.Context(), getPair(t, asset.Options), asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) { t.Errorf("%s GetHistoricCandlesExtended() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err) } } func TestGetAvailableTransferTrains(t *testing.T) { t.Parallel() - _, err := g.GetAvailableTransferChains(context.Background(), currency.USDT) + _, err := g.GetAvailableTransferChains(t.Context(), currency.USDT) if err != nil { t.Error(err) } @@ -2428,7 +2424,7 @@ const wsTickerPushDataJSON = `{"time": 1606291803, "channel": "spot.tickers", "e func TestWsTickerPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsTickerPushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsTickerPushDataJSON)); err != nil { t.Errorf("%s websocket ticker push data error: %v", g.Name, err) } } @@ -2437,7 +2433,7 @@ const wsTradePushDataJSON = `{ "time": 1606292218, "channel": "spot.trades", "ev func TestWsTradePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsTradePushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsTradePushDataJSON)); err != nil { t.Errorf("%s websocket trade push data error: %v", g.Name, err) } } @@ -2446,7 +2442,7 @@ const wsCandlestickPushDataJSON = `{"time": 1606292600, "channel": "spot.candles func TestWsCandlestickPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsCandlestickPushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsCandlestickPushDataJSON)); err != nil { t.Errorf("%s websocket candlestick push data error: %v", g.Name, err) } } @@ -2455,7 +2451,7 @@ const wsOrderbookTickerJSON = `{"time": 1606293275, "channel": "spot.book_ticker func TestWsOrderbookTickerPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsOrderbookTickerJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsOrderbookTickerJSON)); err != nil { t.Errorf("%s websocket orderbook push data error: %v", g.Name, err) } } @@ -2467,11 +2463,11 @@ const ( func TestWsOrderbookSnapshotPushData(t *testing.T) { t.Parallel() - err := g.WsHandleSpotData(context.Background(), []byte(wsOrderbookSnapshotPushDataJSON)) + err := g.WsHandleSpotData(t.Context(), []byte(wsOrderbookSnapshotPushDataJSON)) if err != nil { t.Errorf("%s websocket orderbook snapshot push data error: %v", g.Name, err) } - if err = g.WsHandleSpotData(context.Background(), []byte(wsOrderbookUpdatePushDataJSON)); err != nil { + if err = g.WsHandleSpotData(t.Context(), []byte(wsOrderbookUpdatePushDataJSON)); err != nil { t.Errorf("%s websocket orderbook update push data error: %v", g.Name, err) } } @@ -2480,7 +2476,7 @@ const wsSpotOrderPushDataJSON = `{"time": 1605175506, "channel": "spot.orders", func TestWsPushOrders(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsSpotOrderPushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsSpotOrderPushDataJSON)); err != nil { t.Errorf("%s websocket orders push data error: %v", g.Name, err) } } @@ -2489,7 +2485,7 @@ const wsUserTradePushDataJSON = `{"time": 1605176741, "channel": "spot.usertrade func TestWsUserTradesPushDataJSON(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsUserTradePushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsUserTradePushDataJSON)); err != nil { t.Errorf("%s websocket users trade push data error: %v", g.Name, err) } } @@ -2498,7 +2494,7 @@ const wsBalancesPushDataJSON = `{"time": 1605248616, "channel": "spot.balances", func TestBalancesPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsBalancesPushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsBalancesPushDataJSON)); err != nil { t.Errorf("%s websocket balances push data error: %v", g.Name, err) } } @@ -2507,7 +2503,7 @@ const wsMarginBalancePushDataJSON = `{"time": 1605248616, "channel": "spot.fundi func TestMarginBalancePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsMarginBalancePushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsMarginBalancePushDataJSON)); err != nil { t.Errorf("%s websocket margin balance push data error: %v", g.Name, err) } } @@ -2516,7 +2512,7 @@ const wsCrossMarginBalancePushDataJSON = `{"time": 1605248616,"channel": "spot.c func TestCrossMarginBalancePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsCrossMarginBalancePushDataJSON)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsCrossMarginBalancePushDataJSON)); err != nil { t.Errorf("%s websocket cross margin balance push data error: %v", g.Name, err) } } @@ -2525,7 +2521,7 @@ const wsCrossMarginBalanceLoan = `{ "time":1658289372, "channel":"spot.cross_loa func TestCrossMarginBalanceLoan(t *testing.T) { t.Parallel() - if err := g.WsHandleSpotData(context.Background(), []byte(wsCrossMarginBalanceLoan)); err != nil { + if err := g.WsHandleSpotData(t.Context(), []byte(wsCrossMarginBalanceLoan)); err != nil { t.Errorf("%s websocket cross margin loan push data error: %v", g.Name, err) } } @@ -2534,7 +2530,7 @@ const wsFuturesTickerPushDataJSON = `{"time": 1541659086, "channel": "futures.ti func TestFuturesTicker(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesTickerPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesTickerPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket push data error: %v", g.Name, err) } } @@ -2543,7 +2539,7 @@ const wsFuturesTradesPushDataJSON = `{"channel": "futures.trades","event": "upda func TestFuturesTrades(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesTradesPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesTradesPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket push data error: %v", g.Name, err) } } @@ -2554,7 +2550,7 @@ const ( func TestOrderbookData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesOrderbookTickerJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesOrderbookTickerJSON), asset.Futures); err != nil { t.Errorf("%s websocket orderbook ticker push data error: %v", g.Name, err) } } @@ -2563,7 +2559,7 @@ const wsFuturesOrderPushDataJSON = `{ "channel": "futures.orders", "event": "upd func TestFuturesOrderPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesOrderPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesOrderPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures order push data error: %v", g.Name, err) } } @@ -2572,7 +2568,7 @@ const wsFuturesUsertradesPushDataJSON = `{"time": 1543205083, "channel": "future func TestFuturesUserTrades(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesUsertradesPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesUsertradesPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures user trades push data error: %v", g.Name, err) } } @@ -2581,7 +2577,7 @@ const wsFuturesLiquidationPushDataJSON = `{"channel": "futures.liquidates", "eve func TestFuturesLiquidationPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesLiquidationPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesLiquidationPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures liquidation push data error: %v", g.Name, err) } } @@ -2590,7 +2586,7 @@ const wsFuturesAutoDelevergesNotification = `{"channel": "futures.auto_deleverag func TestFuturesAutoDeleverges(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesAutoDelevergesNotification), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesAutoDelevergesNotification), asset.Futures); err != nil { t.Errorf("%s websocket futures auto deleverge push data error: %v", g.Name, err) } } @@ -2599,7 +2595,7 @@ const wsFuturesPositionClosePushDataJSON = ` {"channel": "futures.position_close func TestPositionClosePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesPositionClosePushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesPositionClosePushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures position close push data error: %v", g.Name, err) } } @@ -2608,7 +2604,7 @@ const wsFuturesBalanceNotificationPushDataJSON = `{"channel": "futures.balances" func TestFuturesBalanceNotification(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesBalanceNotificationPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesBalanceNotificationPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures balance notification push data error: %v", g.Name, err) } } @@ -2617,7 +2613,7 @@ const wsFuturesReduceRiskLimitNotificationPushDataJSON = `{"time": 1551858330, " func TestFuturesReduceRiskLimitPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesReduceRiskLimitNotificationPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesReduceRiskLimitNotificationPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures reduce risk limit notification push data error: %v", g.Name, err) } } @@ -2626,7 +2622,7 @@ const wsFuturesPositionsNotificationPushDataJSON = `{"time": 1588212926,"channel func TestFuturesPositionsNotification(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesPositionsNotificationPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesPositionsNotificationPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures positions change notification push data error: %v", g.Name, err) } } @@ -2635,7 +2631,7 @@ const wsFuturesAutoOrdersPushDataJSON = `{"time": 1596798126,"channel": "futures func TestFuturesAutoOrderPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleFuturesData(context.Background(), []byte(wsFuturesAutoOrdersPushDataJSON), asset.Futures); err != nil { + if err := g.WsHandleFuturesData(t.Context(), []byte(wsFuturesAutoOrdersPushDataJSON), asset.Futures); err != nil { t.Errorf("%s websocket futures auto orders push data error: %v", g.Name, err) } } @@ -2646,7 +2642,7 @@ const optionsContractTickerPushDataJSON = `{"time": 1630576352, "channel": "opti func TestOptionsContractTickerPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsContractTickerPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsContractTickerPushDataJSON)); err != nil { t.Errorf("%s websocket options contract ticker push data failed with error %v", g.Name, err) } } @@ -2655,7 +2651,7 @@ const optionsUnderlyingTickerPushDataJSON = `{"time": 1630576352, "channel": "op func TestOptionsUnderlyingTickerPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsUnderlyingTickerPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsUnderlyingTickerPushDataJSON)); err != nil { t.Errorf("%s websocket options underlying ticker push data error: %v", g.Name, err) } } @@ -2664,7 +2660,7 @@ const optionsContractTradesPushDataJSON = `{"time": 1630576356, "channel": "opti func TestOptionsContractTradesPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsContractTradesPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsContractTradesPushDataJSON)); err != nil { t.Errorf("%s websocket contract trades push data error: %v", g.Name, err) } } @@ -2673,7 +2669,7 @@ const optionsUnderlyingTradesPushDataJSON = `{"time": 1630576356, "channel": "op func TestOptionsUnderlyingTradesPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsUnderlyingTradesPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsUnderlyingTradesPushDataJSON)); err != nil { t.Errorf("%s websocket underlying trades push data error: %v", g.Name, err) } } @@ -2682,7 +2678,7 @@ const optionsUnderlyingPricePushDataJSON = `{ "time": 1630576356, "channel": "op func TestOptionsUnderlyingPricePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsUnderlyingPricePushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsUnderlyingPricePushDataJSON)); err != nil { t.Errorf("%s websocket underlying price push data error: %v", g.Name, err) } } @@ -2691,7 +2687,7 @@ const optionsMarkPricePushDataJSON = `{ "time": 1630576356, "channel": "options. func TestOptionsMarkPricePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsMarkPricePushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsMarkPricePushDataJSON)); err != nil { t.Errorf("%s websocket mark price push data error: %v", g.Name, err) } } @@ -2700,7 +2696,7 @@ const optionsSettlementsPushDataJSON = `{ "time": 1630576356, "channel": "option func TestSettlementsPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsSettlementsPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsSettlementsPushDataJSON)); err != nil { t.Errorf("%s websocket options settlements push data error: %v", g.Name, err) } } @@ -2709,7 +2705,7 @@ const optionsContractPushDataJSON = `{"time": 1630576356, "channel": "options.co func TestOptionsContractPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsContractPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsContractPushDataJSON)); err != nil { t.Errorf("%s websocket options contracts push data error: %v", g.Name, err) } } @@ -2721,10 +2717,10 @@ const ( func TestOptionsCandlesticksPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsContractCandlesticksPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsContractCandlesticksPushDataJSON)); err != nil { t.Errorf("%s websocket options contracts candlestick push data error: %v", g.Name, err) } - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsUnderlyingCandlesticksPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsUnderlyingCandlesticksPushDataJSON)); err != nil { t.Errorf("%s websocket options underlying candlestick push data error: %v", g.Name, err) } } @@ -2739,19 +2735,19 @@ const ( func TestOptionsOrderbookPushData(t *testing.T) { t.Parallel() testexch.UpdatePairsOnce(t, g) - assert.NoError(t, g.WsHandleOptionsData(context.Background(), []byte(optionsOrderbookTickerPushDataJSON))) + assert.NoError(t, g.WsHandleOptionsData(t.Context(), []byte(optionsOrderbookTickerPushDataJSON))) avail, err := g.GetAvailablePairs(asset.Options) require.NoError(t, err, "GetAvailablePairs must not error") - assert.NoError(t, g.WsHandleOptionsData(context.Background(), fmt.Appendf(nil, optionsOrderbookUpdatePushDataJSON, avail[0].Upper().String()))) - assert.NoError(t, g.WsHandleOptionsData(context.Background(), []byte(optionsOrderbookSnapshotPushDataJSON))) - assert.NoError(t, g.WsHandleOptionsData(context.Background(), []byte(optionsOrderbookSnapshotUpdateEventPushDataJSON))) + assert.NoError(t, g.WsHandleOptionsData(t.Context(), fmt.Appendf(nil, optionsOrderbookUpdatePushDataJSON, avail[0].Upper().String()))) + assert.NoError(t, g.WsHandleOptionsData(t.Context(), []byte(optionsOrderbookSnapshotPushDataJSON))) + assert.NoError(t, g.WsHandleOptionsData(t.Context(), []byte(optionsOrderbookSnapshotUpdateEventPushDataJSON))) } const optionsOrderPushDataJSON = `{"time": 1630654851,"channel": "options.orders", "event": "update", "result": [ { "contract": "BTC_USDT-20211130-65000-C", "create_time": 1637897000, "fill_price": 0, "finish_as": "cancelled", "iceberg": 0, "id": 106, "is_close": false, "is_liq": false, "is_reduce_only": false, "left": -10, "mkfr": 0.0004, "price": 15000, "refr": 0, "refu": 0, "size": -10, "status": "finished", "text": "web", "tif": "gtc", "tkfr": 0.0004, "underlying": "BTC_USDT", "user": "9xxx", "time": 1639051907,"time_ms": 1639051907000}]}` func TestOptionsOrderPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsOrderPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsOrderPushDataJSON)); err != nil { t.Errorf("%s websocket options orders push data error: %v", g.Name, err) } } @@ -2760,7 +2756,7 @@ const optionsUsersTradesPushDataJSON = `{ "time": 1639144214, "channel": "option func TestOptionUserTradesPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsUsersTradesPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsUsersTradesPushDataJSON)); err != nil { t.Errorf("%s websocket options orders push data error: %v", g.Name, err) } } @@ -2769,7 +2765,7 @@ const optionsLiquidatesPushDataJSON = `{ "channel": "options.liquidates", "event func TestOptionsLiquidatesPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsLiquidatesPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsLiquidatesPushDataJSON)); err != nil { t.Errorf("%s websocket options liquidates push data error: %v", g.Name, err) } } @@ -2778,7 +2774,7 @@ const optionsSettlementPushDataJSON = `{ "channel": "options.user_settlements", func TestOptionsSettlementPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsSettlementPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsSettlementPushDataJSON)); err != nil { t.Errorf("%s websocket options settlement push data error: %v", g.Name, err) } } @@ -2787,7 +2783,7 @@ const optionsPositionClosePushDataJSON = `{"channel": "options.position_closes", func TestOptionsPositionClosePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsPositionClosePushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsPositionClosePushDataJSON)); err != nil { t.Errorf("%s websocket options position close push data error: %v", g.Name, err) } } @@ -2796,7 +2792,7 @@ const optionsBalancePushDataJSON = `{ "channel": "options.balances", "event": "u func TestOptionsBalancePushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsBalancePushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsBalancePushDataJSON)); err != nil { t.Errorf("%s websocket options balance push data error: %v", g.Name, err) } } @@ -2805,7 +2801,7 @@ const optionsPositionPushDataJSON = `{"time": 1630654851, "channel": "options.po func TestOptionsPositionPushData(t *testing.T) { t.Parallel() - if err := g.WsHandleOptionsData(context.Background(), []byte(optionsPositionPushDataJSON)); err != nil { + if err := g.WsHandleOptionsData(t.Context(), []byte(optionsPositionPushDataJSON)); err != nil { t.Errorf("%s websocket options position push data error: %v", g.Name, err) } } @@ -2817,11 +2813,11 @@ const ( func TestFuturesOrderbookPushData(t *testing.T) { t.Parallel() - err := g.WsHandleFuturesData(context.Background(), []byte(futuresOrderbookPushData), asset.Futures) + err := g.WsHandleFuturesData(t.Context(), []byte(futuresOrderbookPushData), asset.Futures) if err != nil { t.Error(err) } - err = g.WsHandleFuturesData(context.Background(), []byte(futuresOrderbookUpdatePushData), asset.Futures) + err = g.WsHandleFuturesData(t.Context(), []byte(futuresOrderbookUpdatePushData), asset.Futures) if err != nil { t.Error(err) } @@ -2831,7 +2827,7 @@ const futuresCandlesticksPushData = `{"time": 1678469467, "time_ms": 16784694679 func TestFuturesCandlestickPushData(t *testing.T) { t.Parallel() - err := g.WsHandleFuturesData(context.Background(), []byte(futuresCandlesticksPushData), asset.Futures) + err := g.WsHandleFuturesData(t.Context(), []byte(futuresCandlesticksPushData), asset.Futures) if err != nil { t.Error(err) } @@ -2890,7 +2886,7 @@ func TestSubscribe(t *testing.T) { subs, err := g.Features.Subscriptions.ExpandTemplates(g) require.NoError(t, err, "ExpandTemplates must not error") g.Features.Subscriptions = subscription.List{} - err = g.Subscribe(context.Background(), &DummyConnection{}, subs) + err = g.Subscribe(t.Context(), &DummyConnection{}, subs) require.NoError(t, err, "Subscribe must not error") } @@ -2923,7 +2919,7 @@ func TestGenerateOptionsDefaultSubscriptions(t *testing.T) { func TestCreateAPIKeysOfSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if _, err := g.CreateAPIKeysOfSubAccount(context.Background(), CreateAPIKeySubAccountParams{ + if _, err := g.CreateAPIKeysOfSubAccount(t.Context(), CreateAPIKeySubAccountParams{ SubAccountUserID: 12345, Body: &SubAccountKey{ APIKeyName: "12312mnfsndfsfjsdklfjsdlkfj", @@ -2962,7 +2958,7 @@ func TestCreateAPIKeysOfSubAccount(t *testing.T) { func TestListAllAPIKeyOfSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetAllAPIKeyOfSubAccount(context.Background(), 1234) + _, err := g.GetAllAPIKeyOfSubAccount(t.Context(), 1234) if err != nil { t.Error(err) } @@ -2971,7 +2967,7 @@ func TestListAllAPIKeyOfSubAccount(t *testing.T) { func TestUpdateAPIKeyOfSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - if err := g.UpdateAPIKeyOfSubAccount(context.Background(), apiKey, CreateAPIKeySubAccountParams{ + if err := g.UpdateAPIKeyOfSubAccount(t.Context(), apiKey, CreateAPIKeySubAccountParams{ SubAccountUserID: 12345, Body: &SubAccountKey{ APIKeyName: "12312mnfsndfsfjsdklfjsdlkfj", @@ -3010,7 +3006,7 @@ func TestUpdateAPIKeyOfSubAccount(t *testing.T) { func TestGetAPIKeyOfSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - _, err := g.GetAPIKeyOfSubAccount(context.Background(), 1234, "target_api_key") + _, err := g.GetAPIKeyOfSubAccount(t.Context(), 1234, "target_api_key") if err != nil { t.Error(err) } @@ -3019,7 +3015,7 @@ func TestGetAPIKeyOfSubAccount(t *testing.T) { func TestLockSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if err := g.LockSubAccount(context.Background(), 1234); err != nil { + if err := g.LockSubAccount(t.Context(), 1234); err != nil { t.Error(err) } } @@ -3027,7 +3023,7 @@ func TestLockSubAccount(t *testing.T) { func TestUnlockSubAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) - if err := g.UnlockSubAccount(context.Background(), 1234); err != nil { + if err := g.UnlockSubAccount(t.Context(), 1234); err != nil { t.Error(err) } } @@ -3142,17 +3138,17 @@ func TestUpdateOrderExecutionLimits(t *testing.T) { t.Parallel() testexch.UpdatePairsOnce(t, g) - err := g.UpdateOrderExecutionLimits(context.Background(), 1336) + err := g.UpdateOrderExecutionLimits(t.Context(), 1336) if !errors.Is(err, asset.ErrNotSupported) { t.Fatalf("received %v, expected %v", err, asset.ErrNotSupported) } - err = g.UpdateOrderExecutionLimits(context.Background(), asset.Options) + err = g.UpdateOrderExecutionLimits(t.Context(), asset.Options) if !errors.Is(err, common.ErrNotYetImplemented) { t.Fatalf("received %v, expected %v", err, common.ErrNotYetImplemented) } - err = g.UpdateOrderExecutionLimits(context.Background(), asset.Spot) + err = g.UpdateOrderExecutionLimits(t.Context(), asset.Spot) if err != nil { t.Fatal(err) } @@ -3201,26 +3197,26 @@ func TestForceFileStandard(t *testing.T) { func TestGetFuturesContractDetails(t *testing.T) { t.Parallel() - _, err := g.GetFuturesContractDetails(context.Background(), asset.Spot) + _, err := g.GetFuturesContractDetails(t.Context(), asset.Spot) require.ErrorIs(t, err, futures.ErrNotFuturesAsset) - _, err = g.GetFuturesContractDetails(context.Background(), asset.PerpetualContract) + _, err = g.GetFuturesContractDetails(t.Context(), asset.PerpetualContract) require.ErrorIs(t, err, asset.ErrNotSupported) - exp, err := g.GetAllDeliveryContracts(context.Background(), currency.USDT) + exp, err := g.GetAllDeliveryContracts(t.Context(), currency.USDT) require.NoError(t, err, "GetAllDeliveryContracts must not error") - c, err := g.GetFuturesContractDetails(context.Background(), asset.DeliveryFutures) + c, err := g.GetFuturesContractDetails(t.Context(), asset.DeliveryFutures) require.NoError(t, err, "GetFuturesContractDetails must not error for DeliveryFutures") assert.Equal(t, len(exp), len(c), "GetFuturesContractDetails should return same number of Delivery contracts as exist") - c, err = g.GetFuturesContractDetails(context.Background(), asset.Futures) + c, err = g.GetFuturesContractDetails(t.Context(), asset.Futures) require.NoError(t, err, "GetFuturesContractDetails must not error for DeliveryFutures") assert.NotEmpty(t, c, "GetFuturesContractDetails should return same number of Future contracts as exist") } func TestGetLatestFundingRates(t *testing.T) { t.Parallel() - _, err := g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{ + _, err := g.GetLatestFundingRates(t.Context(), &fundingrate.LatestRateRequest{ Asset: asset.USDTMarginedFutures, Pair: currency.NewPair(currency.BTC, currency.USDT), IncludePredictedRate: true, @@ -3228,14 +3224,14 @@ func TestGetLatestFundingRates(t *testing.T) { if !errors.Is(err, asset.ErrNotSupported) { t.Error(err) } - _, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{ + _, err = g.GetLatestFundingRates(t.Context(), &fundingrate.LatestRateRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.BTC, currency.USD), }) if err != nil { t.Error(err) } - _, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{ + _, err = g.GetLatestFundingRates(t.Context(), &fundingrate.LatestRateRequest{ Asset: asset.Futures, }) if err != nil { @@ -3245,24 +3241,24 @@ func TestGetLatestFundingRates(t *testing.T) { func TestGetHistoricalFundingRates(t *testing.T) { t.Parallel() - _, err := g.GetHistoricalFundingRates(context.Background(), nil) + _, err := g.GetHistoricalFundingRates(t.Context(), nil) if !errors.Is(err, common.ErrNilPointer) { t.Fatalf("received: %v, expected: %v", err, common.ErrNilPointer) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{}) + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{}) if !errors.Is(err, asset.ErrNotSupported) { t.Fatalf("received: %v, expected: %v", err, asset.ErrNotSupported) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, }) if !errors.Is(err, currency.ErrCurrencyPairEmpty) { t.Fatalf("received: %v, expected: %v", err, currency.ErrCurrencyPairEmpty) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), }) @@ -3270,7 +3266,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrPaymentCurrencyCannotBeEmpty) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), PaymentCurrency: currency.USDT, @@ -3281,7 +3277,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), PaymentCurrency: currency.USDT, @@ -3291,7 +3287,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), PaymentCurrency: currency.USDT, @@ -3302,7 +3298,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { t.Fatalf("received: %v, expected: %v", err, common.ErrStartAfterEnd) } - _, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + _, err = g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), PaymentCurrency: currency.USDT, @@ -3313,7 +3309,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrFundingRateOutsideLimits) } - history, err := g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{ + history, err := g.GetHistoricalFundingRates(t.Context(), &fundingrate.HistoricalRatesRequest{ Asset: asset.Futures, Pair: currency.NewPair(currency.ENJ, currency.USDT), PaymentCurrency: currency.USDT, @@ -3327,7 +3323,7 @@ func TestGetHistoricalFundingRates(t *testing.T) { func TestGetOpenInterest(t *testing.T) { t.Parallel() - _, err := g.GetOpenInterest(context.Background(), key.PairAsset{ + _, err := g.GetOpenInterest(t.Context(), key.PairAsset{ Base: currency.ETH.Item, Quote: currency.USDT.Item, Asset: asset.USDTMarginedFutures, @@ -3337,7 +3333,7 @@ func TestGetOpenInterest(t *testing.T) { var resp []futures.OpenInterest for _, a := range []asset.Item{asset.Futures, asset.DeliveryFutures} { p := getPair(t, a) - resp, err = g.GetOpenInterest(context.Background(), key.PairAsset{ + resp, err = g.GetOpenInterest(t.Context(), key.PairAsset{ Base: p.Base.Item, Quote: p.Quote.Item, Asset: a, @@ -3346,7 +3342,7 @@ func TestGetOpenInterest(t *testing.T) { assert.Lenf(t, resp, 1, "GetOpenInterest should return 1 item for %s asset", a) } - resp, err = g.GetOpenInterest(context.Background()) + resp, err = g.GetOpenInterest(t.Context()) assert.NoError(t, err, "GetOpenInterest should not error") assert.NotEmpty(t, resp, "GetOpenInterest should return some items") } @@ -3425,7 +3421,7 @@ func TestGetSideAndAmountFromSize(t *testing.T) { func TestGetFutureOrderSize(t *testing.T) { t.Parallel() _, err := getFutureOrderSize(&order.Submit{Side: order.CouldNotCloseShort, Amount: 1}) - assert.ErrorIs(t, err, errInvalidOrderSide) + assert.ErrorIs(t, err, order.ErrSideIsInvalid) ret, err := getFutureOrderSize(&order.Submit{Side: order.Buy, Amount: 1}) require.NoError(t, err) @@ -3496,7 +3492,7 @@ func TestGetCurrencyTradeURL(t *testing.T) { pairs, err := g.CurrencyPairs.GetPairs(a, false) require.NoError(t, err, "cannot get pairs for %s", a) require.NotEmpty(t, pairs, "no pairs for %s", a) - resp, err := g.GetCurrencyTradeURL(context.Background(), a, pairs[0]) + resp, err := g.GetCurrencyTradeURL(t.Context(), a, pairs[0]) if a == asset.Options { require.ErrorIs(t, err, asset.ErrNotSupported) } else { @@ -3510,7 +3506,7 @@ func TestGetUnifiedAccount(t *testing.T) { t.Parallel() sharedtestvalues.SkipTestIfCredentialsUnset(t, g) // Requires unified account to be enabled for this to function. - payload, err := g.GetUnifiedAccount(context.Background(), currency.EMPTYCODE) + payload, err := g.GetUnifiedAccount(t.Context(), currency.EMPTYCODE) require.NoError(t, err) require.NotEmpty(t, payload) } @@ -3532,12 +3528,12 @@ func TestHandleSubscriptions(t *testing.T) { subs := subscription.List{{Channel: subscription.OrderbookChannel}} - err := g.handleSubscription(context.Background(), &DummyConnection{}, subscribeEvent, subs, func(context.Context, websocket.Connection, string, subscription.List) ([]WsInput, error) { + err := g.handleSubscription(t.Context(), &DummyConnection{}, subscribeEvent, subs, func(context.Context, websocket.Connection, string, subscription.List) ([]WsInput, error) { return []WsInput{{}}, nil }) require.NoError(t, err) - err = g.handleSubscription(context.Background(), &DummyConnection{}, unsubscribeEvent, subs, func(context.Context, websocket.Connection, string, subscription.List) ([]WsInput, error) { + err = g.handleSubscription(t.Context(), &DummyConnection{}, unsubscribeEvent, subs, func(context.Context, websocket.Connection, string, subscription.List) ([]WsInput, error) { return []WsInput{{}}, nil }) require.NoError(t, err) @@ -3567,3 +3563,327 @@ func TestParseWSHeader(t *testing.T) { } } } + +func TestDeriveSpotWebsocketOrderResponse(t *testing.T) { + t.Parallel() + + var resp *WebsocketOrderResponse + require.NoError(t, json.Unmarshal([]byte(`{"left":"0","update_time":"1735720637","amount":"0.0001","create_time":"1735720637","price":"0","finish_as":"filled","time_in_force":"ioc","currency_pair":"BTC_USDT","type":"market","account":"spot","side":"sell","amend_text":"-","text":"t-1735720637181634009","status":"closed","iceberg":"0","avg_deal_price":"93503.3","filled_total":"9.35033","id":"766075454481","fill_price":"9.35033","update_time_ms":1735720637188,"create_time_ms":1735720637188}`), &resp), "unmarshal must not error") + + got, err := g.deriveSpotWebsocketOrderResponse(resp) + require.NoError(t, err) + assert.Equal(t, &order.SubmitResponse{ + Exchange: g.Name, + OrderID: "766075454481", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1735720637181634009", + Date: time.UnixMilli(1735720637188), + LastUpdated: time.UnixMilli(1735720637188), + Amount: 0.0001, + AverageExecutedPrice: 93503.3, + Type: order.Market, + Side: order.Sell, + Status: order.Filled, + ImmediateOrCancel: true, + Cost: 0.0001, + Purchased: 9.35033, + }, got) +} + +func TestDeriveSpotWebsocketOrderResponses(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + orders [][]byte + error error + expected []*order.SubmitResponse + }{ + { + name: "no response", + orders: [][]byte{}, + error: common.ErrNoResponse, + }, + { + name: "assortment of spot orders", + orders: [][]byte{ + []byte(`{"left":"0","update_time":"1735720637","amount":"0.0001","create_time":"1735720637","price":"0","finish_as":"filled","time_in_force":"ioc","currency_pair":"BTC_USDT","type":"market","account":"spot","side":"sell","amend_text":"-","text":"t-1735720637181634009","status":"closed","iceberg":"0","avg_deal_price":"93503.3","filled_total":"9.35033","id":"766075454481","fill_price":"9.35033","update_time_ms":1735720637188,"create_time_ms":1735720637188}`), + []byte(`{"left":"0.000008","update_time":"1735720637","amount":"9.99152","create_time":"1735720637","price":"0","finish_as":"filled","time_in_force":"ioc","currency_pair":"HNS_USDT","type":"market","account":"spot","side":"buy","amend_text":"-","text":"t-1735720637126962151","status":"closed","iceberg":"0","avg_deal_price":"0.01224","filled_total":"9.991512","id":"766075454188","fill_price":"9.991512","update_time_ms":1735720637142,"create_time_ms":1735720637142}`), + []byte(`{"left":"0","update_time":"1735778597","amount":"200","create_time":"1735778597","price":"0.03673","finish_as":"filled","time_in_force":"fok","currency_pair":"REX_USDT","type":"limit","account":"spot","side":"buy","amend_text":"-","text":"t-1364","status":"closed","iceberg":"0","avg_deal_price":"0.03673","filled_total":"7.346","id":"766488882062","fill_price":"7.346","update_time_ms":1735778597363,"create_time_ms":1735778597363}`), + []byte(`{"left":"0.0003","update_time":"1735780321","amount":"0.0003","create_time":"1735780321","price":"20000","finish_as":"open","time_in_force":"poc","currency_pair":"BTC_USDT","type":"limit","account":"spot","side":"buy","amend_text":"-","text":"t-1735780321603944400","status":"open","iceberg":"0","filled_total":"0","id":"766504537761","fill_price":"0","update_time_ms":1735780321729,"create_time_ms":1735780321729}`), + []byte(`{"left":"1","update_time":"1735784755","amount":"1","create_time":"1735784755","price":"100","finish_as":"open","time_in_force":"gtc","currency_pair":"GT_USDT","type":"limit","account":"spot","side":"sell","amend_text":"-","text":"t-1735784754905434100","status":"open","iceberg":"0","filled_total":"0","id":"766536556747","fill_price":"0","update_time_ms":1735784755068,"create_time_ms":1735784755068}`), + }, + expected: []*order.SubmitResponse{ + { + Exchange: g.Name, + OrderID: "766075454481", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1735720637181634009", + Date: time.UnixMilli(1735720637188), + LastUpdated: time.UnixMilli(1735720637188), + Amount: 0.0001, + AverageExecutedPrice: 93503.3, + Type: order.Market, + Side: order.Sell, + Status: order.Filled, + ImmediateOrCancel: true, + Cost: 0.0001, + Purchased: 9.35033, + }, + { + Exchange: g.Name, + OrderID: "766075454188", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.HNS, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1735720637126962151", + Date: time.UnixMilli(1735720637142), + LastUpdated: time.UnixMilli(1735720637142), + RemainingAmount: 0.000008, + Amount: 9.99152, + AverageExecutedPrice: 0.01224, + Type: order.Market, + Side: order.Buy, + Status: order.Filled, + ImmediateOrCancel: true, + Cost: 9.991512, + Purchased: 816.3, + }, + { + Exchange: g.Name, + OrderID: "766488882062", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.NewCode("REX"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1364", + Date: time.UnixMilli(1735778597363), + LastUpdated: time.UnixMilli(1735778597363), + Amount: 200, + Price: 0.03673, + AverageExecutedPrice: 0.03673, + Type: order.Limit, + Side: order.Buy, + Status: order.Filled, + FillOrKill: true, + Cost: 7.346, + Purchased: 200, + }, + { + Exchange: g.Name, + OrderID: "766504537761", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1735780321603944400", + Date: time.UnixMilli(1735780321729), + LastUpdated: time.UnixMilli(1735780321729), + RemainingAmount: 0.0003, + Amount: 0.0003, + Price: 20000, + Type: order.Limit, + Side: order.Buy, + Status: order.Open, + PostOnly: true, + }, + { + Exchange: g.Name, + OrderID: "766536556747", + AssetType: asset.Spot, + Pair: currency.NewPair(currency.NewCode("GT"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1735784754905434100", + Date: time.UnixMilli(1735784755068), + LastUpdated: time.UnixMilli(1735784755068), + RemainingAmount: 1, + Amount: 1, + Price: 100, + Type: order.Limit, + Side: order.Sell, + Status: order.Open, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + orders := bytes.Join(tc.orders, []byte(",")) + orders = append([]byte("["), append(orders, []byte("]")...)...) + + var resp []*WebsocketOrderResponse + require.NoError(t, json.Unmarshal(orders, &resp), "unmarshal must not error") + + got, err := g.deriveSpotWebsocketOrderResponses(resp) + require.ErrorIs(t, err, tc.error) + + require.Len(t, got, len(tc.expected)) + for i := range got { + assert.Equal(t, tc.expected[i], got[i]) + } + }) + } +} + +func TestDeriveFuturesWebsocketOrderResponse(t *testing.T) { + t.Parallel() + + var resp *WebsocketFuturesOrderResponse + require.NoError(t, json.Unmarshal([]byte(`{"text":"t-1337","price":"0","biz_info":"-","tif":"ioc","amend_text":"-","status":"finished","contract":"CWIF_USDT","stp_act":"-","finish_as":"filled","fill_price":"0.0000002625","id":596729318437,"create_time":1735787107.449,"size":2,"finish_time":1735787107.45,"update_time":1735787107.45,"left":0,"user":12870774,"is_reduce_only":true}`), &resp), "unmarshal must not error") + + got, err := g.deriveFuturesWebsocketOrderResponse(resp) + require.NoError(t, err) + assert.Equal(t, &order.SubmitResponse{ + Exchange: g.Name, + OrderID: "596729318437", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.NewCode("CWIF"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1337", + Date: time.UnixMilli(1735787107449), + LastUpdated: time.UnixMilli(1735787107450), + Amount: 2, + AverageExecutedPrice: 0.0000002625, + Type: order.Market, + Side: order.Long, + Status: order.Filled, + ImmediateOrCancel: true, + ReduceOnly: true, + }, got) +} + +func TestDeriveFuturesWebsocketOrderResponses(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + orders [][]byte + error error + expected []*order.SubmitResponse + }{ + { + name: "no response", + orders: [][]byte{}, + error: common.ErrNoResponse, + }, + { + name: "assortment of futures orders", + orders: [][]byte{ + []byte(`{"text":"t-1337","price":"0","biz_info":"-","tif":"ioc","amend_text":"-","status":"finished","contract":"CWIF_USDT","stp_act":"-","finish_as":"filled","fill_price":"0.0000002625","id":596729318437,"create_time":1735787107.449,"size":2,"finish_time":1735787107.45,"update_time":1735787107.45,"left":0,"user":12870774,"is_reduce_only":true}`), + []byte(`{"text":"t-1336","price":"0","biz_info":"-","tif":"ioc","amend_text":"-","status":"finished","contract":"REX_USDT","stp_act":"-","finish_as":"filled","fill_price":"0.03654","id":596662040388,"create_time":1735778597.374,"size":-2,"finish_time":1735778597.374,"update_time":1735778597.374,"left":0,"user":12870774}`), + []byte(`{"text":"apiv4-ws","price":"40000","biz_info":"-","tif":"gtc","amend_text":"-","status":"open","contract":"BTC_USDT","stp_act":"-","fill_price":"0","id":596746193678,"create_time":1735789790.476,"size":1,"update_time":1735789790.476,"left":1,"user":2365748}`), + []byte(`{"text":"apiv4-ws","price":"200000","biz_info":"-","tif":"gtc","amend_text":"-","status":"open","contract":"BTC_USDT","stp_act":"-","fill_price":"0","id":596748780649,"create_time":1735790222.185,"size":-1,"update_time":1735790222.185,"left":-1,"user":2365748}`), + []byte(`{"text":"apiv4-ws","price":"0","biz_info":"-","tif":"ioc","amend_text":"-","status":"finished","contract":"BTC_USDT","stp_act":"-","finish_as":"filled","fill_price":"98172.9","id":36028797827161124,"create_time":1740108860.761,"size":1,"finish_time":1740108860.761,"update_time":1740108860.761,"left":0,"user":2365748}`), + []byte(`{"text":"apiv4-ws","price":"0","biz_info":"-","tif":"ioc","amend_text":"-","status":"finished","contract":"BTC_USDT","stp_act":"-","finish_as":"filled","fill_price":"98113.1","id":36028797827225781,"create_time":1740109172.06,"size":-1,"finish_time":1740109172.06,"update_time":1740109172.06,"left":0,"user":2365748,"is_reduce_only":true}`), + }, + expected: []*order.SubmitResponse{ + { + Exchange: g.Name, + OrderID: "596729318437", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.NewCode("CWIF"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1337", + Date: time.UnixMilli(1735787107449), + LastUpdated: time.UnixMilli(1735787107450), + Amount: 2, + AverageExecutedPrice: 0.0000002625, + Type: order.Market, + Side: order.Long, + Status: order.Filled, + ImmediateOrCancel: true, + ReduceOnly: true, + }, + { + Exchange: g.Name, + OrderID: "596662040388", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.NewCode("REX"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + ClientOrderID: "t-1336", + Date: time.UnixMilli(1735778597374), + LastUpdated: time.UnixMilli(1735778597374), + Amount: 2, + AverageExecutedPrice: 0.03654, + Type: order.Market, + Side: order.Short, + Status: order.Filled, + ImmediateOrCancel: true, + }, + { + Exchange: g.Name, + OrderID: "596746193678", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + Date: time.UnixMilli(1735789790476), + LastUpdated: time.UnixMilli(1735789790476), + RemainingAmount: 1, + Amount: 1, + Price: 40000, + Type: order.Limit, + Side: order.Long, + Status: order.Open, + }, + { + Exchange: g.Name, + OrderID: "596748780649", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + Date: time.UnixMilli(1735790222185), + LastUpdated: time.UnixMilli(1735790222185), + RemainingAmount: 1, + Amount: 1, + Price: 200000, + Type: order.Limit, + Side: order.Short, + Status: order.Open, + }, + { + Exchange: g.Name, + OrderID: "36028797827161124", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + Date: time.UnixMilli(1740108860761), + LastUpdated: time.UnixMilli(1740108860761), + Amount: 1, + AverageExecutedPrice: 98172.9, + Type: order.Market, + Side: order.Long, + Status: order.Filled, + ImmediateOrCancel: true, + }, + { + Exchange: g.Name, + OrderID: "36028797827225781", + AssetType: asset.Futures, + Pair: currency.NewPair(currency.BTC, currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"}), + Date: time.UnixMilli(1740109172060), + LastUpdated: time.UnixMilli(1740109172060), + Amount: 1, + AverageExecutedPrice: 98113.1, + Type: order.Market, + Side: order.Short, + Status: order.Filled, + ImmediateOrCancel: true, + ReduceOnly: true, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + orders := bytes.Join(tc.orders, []byte(",")) + orders = append([]byte("["), append(orders, []byte("]")...)...) + + var resp []*WebsocketFuturesOrderResponse + require.NoError(t, json.Unmarshal(orders, &resp), "unmarshal must not error") + + got, err := g.deriveFuturesWebsocketOrderResponses(resp) + require.ErrorIs(t, err, tc.error) + + require.Len(t, got, len(tc.expected)) + for i := range got { + assert.Equal(t, tc.expected[i], got[i]) + } + }) + } +} diff --git a/exchanges/gateio/gateio_types.go b/exchanges/gateio/gateio_types.go index b9aba181..663b1830 100644 --- a/exchanges/gateio/gateio_types.go +++ b/exchanges/gateio/gateio_types.go @@ -14,7 +14,7 @@ const ( // Order time in force variables gtcTIF = "gtc" // good-'til-canceled iocTIF = "ioc" // immediate-or-cancel - pocTIF = "poc" + pocTIF = "poc" // pending-or-cancel - post only fokTIF = "fok" // fill-or-kill // Frequently used order Status @@ -1364,18 +1364,26 @@ type SpotAccount struct { Locked types.Number `json:"locked"` } -// CreateOrderRequestData represents a single order creation param. -type CreateOrderRequestData struct { - Text string `json:"text,omitempty"` - CurrencyPair currency.Pair `json:"currency_pair,omitzero"` - Type string `json:"type,omitempty"` - Account string `json:"account,omitempty"` - Side string `json:"side,omitempty"` - Iceberg string `json:"iceberg,omitempty"` - Amount types.Number `json:"amount,omitempty"` - Price types.Number `json:"price,omitempty"` - TimeInForce string `json:"time_in_force,omitempty"` - AutoBorrow bool `json:"auto_borrow,omitempty"` +// CreateOrderRequest represents a single order creation param. +type CreateOrderRequest struct { + Text string `json:"text,omitempty"` + CurrencyPair currency.Pair `json:"currency_pair,omitzero"` + Type string `json:"type,omitempty"` + Account string `json:"account,omitempty"` + Side string `json:"side,omitempty"` + Iceberg string `json:"iceberg,omitempty"` + Amount types.Number `json:"amount,omitempty"` + Price types.Number `json:"price,omitempty"` + TimeInForce string `json:"time_in_force,omitempty"` + AutoBorrow bool `json:"auto_borrow,omitempty"` + AutoRepay bool `json:"auto_repay,omitempty"` + SelfTradePreventionAction string `json:"stp_act,omitempty"` + // ActionMode specifies the processing mode for an order request, determining the fields returned in the response. + // Valid only during the request and omitted from the response. Options: + // - ACK: Asynchronous mode, returns only key order fields + // - RESULT: Excludes clearing information + // - FULL: Full mode (default) + ActionMode string `json:"action_mode,omitempty"` } // SpotOrder represents create order response. @@ -1800,18 +1808,19 @@ type DualModeResponse struct { } `json:"history"` } -// OrderCreateParams represents future order creation parameters -type OrderCreateParams struct { - Contract currency.Pair `json:"contract"` - Size float64 `json:"size"` - Iceberg int64 `json:"iceberg"` - Price string `json:"price"` // NOTE: Market orders require string "0" - TimeInForce string `json:"tif"` - Text string `json:"text,omitempty"` // Omitempty required as payload sent as `text:""` will return error message: Text content not starting with `t-`" - ClosePosition bool `json:"close,omitempty"` // Size needs to be zero if true - ReduceOnly bool `json:"reduce_only,omitempty"` - AutoSize string `json:"auto_size,omitempty"` - Settle currency.Code `json:"-"` // Used in URL. +// ContractOrderCreateParams represents future order creation parameters +type ContractOrderCreateParams struct { + Contract currency.Pair `json:"contract"` + Size float64 `json:"size"` // positive long, negative short + Iceberg int64 `json:"iceberg"` // required; can be zero + Price string `json:"price"` // NOTE: Market orders require string "0" + TimeInForce string `json:"tif"` + Text string `json:"text,omitempty"` // errors when empty; Either populated or omitted + ClosePosition bool `json:"close,omitempty"` // Size needs to be zero if true + ReduceOnly bool `json:"reduce_only,omitempty"` + AutoSize string `json:"auto_size,omitempty"` // either close_long or close_short, requires zero in size field + Settle currency.Code `json:"-"` // Used in URL. REST Calls only. + SelfTradePreventionAction string `json:"stp_act,omitempty"` } // Order represents future order response diff --git a/exchanges/gateio/gateio_websocket.go b/exchanges/gateio/gateio_websocket.go index 11ff1a5d..55cdff82 100644 --- a/exchanges/gateio/gateio_websocket.go +++ b/exchanges/gateio/gateio_websocket.go @@ -19,16 +19,17 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( @@ -98,11 +99,6 @@ func (g *Gateio) WsConnectSpot(ctx context.Context, conn websocket.Connection) e return nil } -// authenticateSpot sends an authentication message to the websocket connection -func (g *Gateio) authenticateSpot(ctx context.Context, conn websocket.Connection) error { - return g.websocketLogin(ctx, conn, "spot.login") -} - // websocketLogin authenticates the websocket connection func (g *Gateio) websocketLogin(ctx context.Context, conn websocket.Connection, channel string) error { if conn == nil { @@ -135,7 +131,7 @@ func (g *Gateio) websocketLogin(ctx context.Context, conn websocket.Connection, req := WebsocketRequest{Time: tn, Channel: channel, Event: "api", Payload: payload} - resp, err := conn.SendMessageReturnResponse(ctx, websocketRateLimitNotNeededEPL, req.Payload.RequestID, req) + resp, err := conn.SendMessageReturnResponse(ctx, websocketRateLimitNotNeededEPL, payload.RequestID, req) if err != nil { return err } @@ -145,15 +141,16 @@ func (g *Gateio) websocketLogin(ctx context.Context, conn websocket.Connection, return err } - if inbound.Header.Status != "200" { - var wsErr WebsocketErrors - if err := json.Unmarshal(inbound.Data, &wsErr.Errors); err != nil { - return err - } - return fmt.Errorf("%s: %s", wsErr.Errors.Label, wsErr.Errors.Message) + if inbound.Header.Status == http.StatusOK { + return nil } - return nil + var wsErr WebsocketErrors + if err := json.Unmarshal(inbound.Data, &wsErr.Errors); err != nil { + return err + } + + return fmt.Errorf("%s: %s", wsErr.Errors.Label, wsErr.Errors.Message) } func (g *Gateio) generateWsSignature(secret, event, channel string, t int64) (string, error) { @@ -816,3 +813,67 @@ func (g *Gateio) handleSubscription(ctx context.Context, conn websocket.Connecti } return errs } + +type resultHolder struct { + Result any `json:"result"` +} + +// SendWebsocketRequest sends a websocket request to the exchange +func (g *Gateio) SendWebsocketRequest(ctx context.Context, epl request.EndpointLimit, channel string, connSignature, params, result any, expectedResponses int) error { + paramPayload, err := json.Marshal(params) + if err != nil { + return err + } + + conn, err := g.Websocket.GetConnection(connSignature) + if err != nil { + return err + } + + tn := time.Now().Unix() + req := &WebsocketRequest{ + Time: tn, + Channel: channel, + Event: "api", + Payload: WebsocketPayload{ + RequestID: strconv.FormatInt(conn.GenerateMessageID(false), 10), + RequestParam: paramPayload, + Timestamp: strconv.FormatInt(tn, 10), + }, + } + + responses, err := conn.SendMessageReturnResponsesWithInspector(ctx, epl, req.Payload.RequestID, req, expectedResponses, wsRespAckInspector{}) + if err != nil { + return err + } + + if len(responses) == 0 { + return common.ErrNoResponse + } + + // responses may include an ack resp, which we skip + endResponse := responses[len(responses)-1] + + var inbound WebsocketAPIResponse + if err := json.Unmarshal(endResponse, &inbound); err != nil { + return err + } + + if inbound.Header.Status != http.StatusOK { + var wsErr WebsocketErrors + if err := json.Unmarshal(inbound.Data, &wsErr); err != nil { + return err + } + return fmt.Errorf("%s: %s", wsErr.Errors.Label, wsErr.Errors.Message) + } + + return json.Unmarshal(inbound.Data, &resultHolder{Result: result}) +} + +type wsRespAckInspector struct{} + +// IsFinal checks the payload for an ack, it returns true if the payload does not contain an ack. +// This will force the cancellation of further waiting for responses. +func (wsRespAckInspector) IsFinal(data []byte) bool { + return !strings.Contains(string(data), "ack") +} diff --git a/exchanges/gateio/gateio_websocket_delivery_futures.go b/exchanges/gateio/gateio_websocket_delivery_futures.go index 5e766a6e..53e48a4c 100644 --- a/exchanges/gateio/gateio_websocket_delivery_futures.go +++ b/exchanges/gateio/gateio_websocket_delivery_futures.go @@ -10,11 +10,11 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( diff --git a/exchanges/gateio/gateio_websocket_futures.go b/exchanges/gateio/gateio_websocket_futures.go index c60f49ce..2f4c8993 100644 --- a/exchanges/gateio/gateio_websocket_futures.go +++ b/exchanges/gateio/gateio_websocket_futures.go @@ -13,6 +13,7 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" @@ -22,7 +23,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) const ( @@ -154,11 +154,12 @@ func (g *Gateio) WsHandleFuturesData(_ context.Context, respRaw []byte, a asset. return err } + if push.RequestID != "" { + return g.Websocket.Match.RequireMatchWithData(push.RequestID, respRaw) + } + if push.Event == subscribeEvent || push.Event == unsubscribeEvent { - if !g.Websocket.Match.IncomingWithData(push.ID, respRaw) { - return fmt.Errorf("couldn't match subscription message with ID: %d", push.ID) - } - return nil + return g.Websocket.Match.RequireMatchWithData(push.ID, respRaw) } switch push.Channel { @@ -175,8 +176,7 @@ func (g *Gateio) WsHandleFuturesData(_ context.Context, respRaw []byte, a asset. case futuresCandlesticksChannel: return g.processFuturesCandlesticks(respRaw, a) case futuresOrdersChannel: - var processed []order.Detail - processed, err = g.processFuturesOrdersPushData(respRaw, a) + processed, err := g.processFuturesOrdersPushData(respRaw, a) if err != nil { return err } diff --git a/exchanges/gateio/gateio_websocket_option.go b/exchanges/gateio/gateio_websocket_option.go index 849149f8..1e0cf62c 100644 --- a/exchanges/gateio/gateio_websocket_option.go +++ b/exchanges/gateio/gateio_websocket_option.go @@ -12,6 +12,7 @@ import ( gws "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fill" @@ -21,7 +22,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) @@ -300,10 +300,7 @@ func (g *Gateio) WsHandleOptionsData(_ context.Context, respRaw []byte) error { } if push.Event == subscribeEvent || push.Event == unsubscribeEvent { - if !g.Websocket.Match.IncomingWithData(push.ID, respRaw) { - return fmt.Errorf("couldn't match subscription message with ID: %d", push.ID) - } - return nil + return g.Websocket.Match.RequireMatchWithData(push.ID, respRaw) } switch push.Channel { diff --git a/exchanges/gateio/gateio_websocket_request_futures.go b/exchanges/gateio/gateio_websocket_request_futures.go new file mode 100644 index 00000000..06e77b02 --- /dev/null +++ b/exchanges/gateio/gateio_websocket_request_futures.go @@ -0,0 +1,204 @@ +package gateio + +import ( + "context" + "errors" + "fmt" + + "github.com/thrasher-corp/gocryptotrader/common" + "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/order" +) + +var ( + errInvalidAutoSize = errors.New("invalid auto size") + errStatusNotSet = errors.New("status not set") +) + +// authenticateFutures sends an authentication message to the websocket connection +func (g *Gateio) authenticateFutures(ctx context.Context, conn websocket.Connection) error { + return g.websocketLogin(ctx, conn, "futures.login") +} + +// WebsocketFuturesSubmitOrder submits an order via the websocket connection +func (g *Gateio) WebsocketFuturesSubmitOrder(ctx context.Context, a asset.Item, order *ContractOrderCreateParams) (*WebsocketFuturesOrderResponse, error) { + resps, err := g.WebsocketFuturesSubmitOrders(ctx, a, order) + if err != nil { + return nil, err + } + if len(resps) != 1 { + return nil, common.ErrInvalidResponse + } + return &resps[0], err +} + +// WebsocketFuturesSubmitOrders submits orders via the websocket connection. All orders must be for the same asset. +func (g *Gateio) WebsocketFuturesSubmitOrders(ctx context.Context, a asset.Item, orders ...*ContractOrderCreateParams) ([]WebsocketFuturesOrderResponse, error) { + if len(orders) == 0 { + return nil, errOrdersEmpty + } + + for _, o := range orders { + if err := validateFuturesPairAsset(o.Contract, a); err != nil { + return nil, err + } + + if o.Price == "" && o.TimeInForce != "ioc" { + return nil, fmt.Errorf("%w: cannot be zero when time in force is not IOC", errInvalidPrice) + } + + if o.Size == 0 && o.AutoSize == "" { + return nil, fmt.Errorf("%w: size cannot be zero", errInvalidAmount) + } + + if o.AutoSize != "" { + if o.AutoSize != "close_long" && o.AutoSize != "close_short" { + return nil, fmt.Errorf("%w: %s", errInvalidAutoSize, o.AutoSize) + } + if o.Size != 0 { + return nil, fmt.Errorf("%w: size needs to be zero when auto size is set", errInvalidAmount) + } + } + } + + if len(orders) == 1 { + var singleResponse WebsocketFuturesOrderResponse + err := g.SendWebsocketRequest(ctx, perpetualSubmitOrderEPL, "futures.order_place", a, orders[0], &singleResponse, 2) + return []WebsocketFuturesOrderResponse{singleResponse}, err + } + + var resp []WebsocketFuturesOrderResponse + return resp, g.SendWebsocketRequest(ctx, perpetualSubmitBatchOrdersEPL, "futures.order_batch_place", a, orders, &resp, 2) +} + +// WebsocketFuturesCancelOrder cancels an order via the websocket connection. +func (g *Gateio) WebsocketFuturesCancelOrder(ctx context.Context, orderID string, contract currency.Pair, a asset.Item) (*WebsocketFuturesOrderResponse, error) { + if orderID == "" { + return nil, order.ErrOrderIDNotSet + } + + if err := validateFuturesPairAsset(contract, a); err != nil { + return nil, err + } + + params := &struct { + OrderID string `json:"order_id"` + }{OrderID: orderID} + + var resp WebsocketFuturesOrderResponse + return &resp, g.SendWebsocketRequest(ctx, perpetualCancelOrderEPL, "futures.order_cancel", a, params, &resp, 1) +} + +// WebsocketFuturesCancelAllOpenFuturesOrders cancels multiple orders via the websocket. +func (g *Gateio) WebsocketFuturesCancelAllOpenFuturesOrders(ctx context.Context, contract currency.Pair, a asset.Item, side string) ([]WebsocketFuturesOrderResponse, error) { + if err := validateFuturesPairAsset(contract, a); err != nil { + return nil, err + } + + if side != "" && side != "ask" && side != "bid" { + return nil, fmt.Errorf("%w: %s", order.ErrSideIsInvalid, side) + } + + params := &struct { + Contract currency.Pair `json:"contract"` + Side string `json:"side,omitempty"` + }{Contract: contract, Side: side} + + var resp []WebsocketFuturesOrderResponse + return resp, g.SendWebsocketRequest(ctx, perpetualCancelOpenOrdersEPL, "futures.order_cancel_cp", a, params, &resp, 2) +} + +// WebsocketFuturesAmendOrder amends an order via the websocket connection +func (g *Gateio) WebsocketFuturesAmendOrder(ctx context.Context, amend *WebsocketFuturesAmendOrder) (*WebsocketFuturesOrderResponse, error) { + if amend == nil { + return nil, fmt.Errorf("%w: %T", common.ErrNilPointer, amend) + } + + if amend.OrderID == "" { + return nil, order.ErrOrderIDNotSet + } + + if err := validateFuturesPairAsset(amend.Contract, amend.Asset); err != nil { + return nil, err + } + + if amend.Size == 0 && amend.Price == "" { + return nil, fmt.Errorf("%w: size or price must be set", errInvalidAmount) + } + + var resp WebsocketFuturesOrderResponse + return &resp, g.SendWebsocketRequest(ctx, perpetualAmendOrderEPL, "futures.order_amend", amend.Asset, amend, &resp, 1) +} + +// WebsocketFuturesOrderList fetches a list of orders via the websocket connection +func (g *Gateio) WebsocketFuturesOrderList(ctx context.Context, list *WebsocketFutureOrdersList) ([]WebsocketFuturesOrderResponse, error) { + if list == nil { + return nil, fmt.Errorf("%w: %T", common.ErrNilPointer, list) + } + + if err := validateFuturesPairAsset(list.Contract, list.Asset); err != nil { + return nil, err + } + + if list.Status == "" { + return nil, errStatusNotSet + } + + var resp []WebsocketFuturesOrderResponse + return resp, g.SendWebsocketRequest(ctx, perpetualGetOrdersEPL, "futures.order_list", list.Asset, list, &resp, 1) +} + +// WebsocketFuturesGetOrderStatus gets the status of an order via the websocket connection. +func (g *Gateio) WebsocketFuturesGetOrderStatus(ctx context.Context, contract currency.Pair, a asset.Item, orderID string) (*WebsocketFuturesOrderResponse, error) { + if err := validateFuturesPairAsset(contract, a); err != nil { + return nil, err + } + + if orderID == "" { + return nil, order.ErrOrderIDNotSet + } + + params := &struct { + OrderID string `json:"order_id"` + }{OrderID: orderID} + + var resp WebsocketFuturesOrderResponse + return &resp, g.SendWebsocketRequest(ctx, perpetualFetchOrderEPL, "futures.order_status", a, params, &resp, 1) +} + +func getAssetFromFuturesPair(pair currency.Pair) (asset.Item, error) { + if pair.IsEmpty() { + return asset.Empty, currency.ErrCurrencyPairEmpty + } + switch pair.Quote.Item { + case currency.USDT.Item: + return asset.USDTMarginedFutures, nil + case currency.USD.Item: + return asset.CoinMarginedFutures, nil + default: + return asset.Empty, fmt.Errorf("%w futures pair: `%v`", asset.ErrNotSupported, pair) + } +} + +// validateFuturesPairAsset enforces the asset.Item to be either USDT or Coin margined futures in relation to the pair +// for correct routing. +func validateFuturesPairAsset(pair currency.Pair, a asset.Item) error { + if pair.IsEmpty() { + return currency.ErrCurrencyPairEmpty + } + switch a { + case asset.USDTMarginedFutures: + if pair.Quote.Item != currency.USDT.Item { + return fmt.Errorf("%w: '%v' for pair '%v'", asset.ErrNotSupported, a, pair) + } + case asset.CoinMarginedFutures: + if pair.Quote.Item != currency.USD.Item { + return fmt.Errorf("%w: '%v' for pair '%v'", asset.ErrNotSupported, a, pair) + } + default: + return fmt.Errorf("%w: '%v' for pair '%v'", asset.ErrNotSupported, a, pair) + } + return nil +} diff --git a/exchanges/gateio/gateio_websocket_request_futures_test.go b/exchanges/gateio/gateio_websocket_request_futures_test.go new file mode 100644 index 00000000..80ad1354 --- /dev/null +++ b/exchanges/gateio/gateio_websocket_request_futures_test.go @@ -0,0 +1,235 @@ +package gateio + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/thrasher-corp/gocryptotrader/common" + "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/order" + "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" +) + +var ( + BTCUSDT = currency.NewPairWithDelimiter("BTC", "USDT", "_") + BTCUSD = currency.NewPairWithDelimiter("BTC", "USD", "_") +) + +func TestWebsocketFuturesSubmitOrder(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesSubmitOrder(t.Context(), asset.USDTMarginedFutures, &ContractOrderCreateParams{}) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + out := &ContractOrderCreateParams{Contract: BTCUSDT} + _, err = g.WebsocketFuturesSubmitOrder(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidPrice) + out.Price = "40000" + _, err = g.WebsocketFuturesSubmitOrder(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidAmount) + out.Size = 1 // 1 lovely long contract + out.AutoSize = "silly_billies" + _, err = g.WebsocketFuturesSubmitOrder(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidAutoSize) + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + out.AutoSize = "" + + got, err := g.WebsocketFuturesSubmitOrder(t.Context(), asset.USDTMarginedFutures, out) + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesSubmitOrders(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures) + require.ErrorIs(t, err, errOrdersEmpty) + + out := &ContractOrderCreateParams{} + _, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + out.Contract = BTCUSDT + + _, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidPrice) + + out.Price = "40000" + _, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidAmount) + + out.Size = 1 // 1 lovely long contract + out.AutoSize = "silly_billies" + _, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidAutoSize) + + out.AutoSize = "close_long" + _, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.USDTMarginedFutures, out) + require.ErrorIs(t, err, errInvalidAmount) + + out.AutoSize = "" + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + // test single order + got, err := g.WebsocketFuturesSubmitOrders(t.Context(), asset.CoinMarginedFutures, out) + require.NoError(t, err) + require.NotEmpty(t, got) + + // test batch orders + got, err = g.WebsocketFuturesSubmitOrders(t.Context(), asset.CoinMarginedFutures, out, out) + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesCancelOrder(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesCancelOrder(t.Context(), "", currency.EMPTYPAIR, asset.Empty) + require.ErrorIs(t, err, order.ErrOrderIDNotSet) + + _, err = g.WebsocketFuturesCancelOrder(t.Context(), "42069", currency.EMPTYPAIR, asset.Empty) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + _, err = g.WebsocketFuturesCancelOrder(t.Context(), "42069", BTCUSDT, asset.CoinMarginedFutures) + require.ErrorIs(t, err, asset.ErrNotSupported) + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + got, err := g.WebsocketFuturesCancelOrder(t.Context(), "513160761072", BTCUSDT, asset.USDTMarginedFutures) + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesCancelAllOpenFuturesOrders(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesCancelAllOpenFuturesOrders(t.Context(), currency.EMPTYPAIR, asset.Empty, "") + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + _, err = g.WebsocketFuturesCancelAllOpenFuturesOrders(t.Context(), BTCUSDT, asset.Empty, "bruh") + require.ErrorIs(t, err, asset.ErrNotSupported) + + _, err = g.WebsocketFuturesCancelAllOpenFuturesOrders(t.Context(), BTCUSDT, asset.USDTMarginedFutures, "bruh") + require.ErrorIs(t, err, order.ErrSideIsInvalid) + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + got, err := g.WebsocketFuturesCancelAllOpenFuturesOrders(t.Context(), BTCUSDT, asset.USDTMarginedFutures, "bid") + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesAmendOrder(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesAmendOrder(t.Context(), nil) + require.ErrorIs(t, err, common.ErrNilPointer) + + amend := &WebsocketFuturesAmendOrder{} + _, err = g.WebsocketFuturesAmendOrder(t.Context(), amend) + require.ErrorIs(t, err, order.ErrOrderIDNotSet) + + amend.OrderID = "1337" + _, err = g.WebsocketFuturesAmendOrder(t.Context(), amend) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + amend.Contract = BTCUSDT + _, err = g.WebsocketFuturesAmendOrder(t.Context(), amend) + require.ErrorIs(t, err, asset.ErrNotSupported) + + amend.Asset = asset.USDTMarginedFutures + _, err = g.WebsocketFuturesAmendOrder(t.Context(), amend) + require.ErrorIs(t, err, errInvalidAmount) + + amend.Size = 2 + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + amend.OrderID = "513170215869" + got, err := g.WebsocketFuturesAmendOrder(t.Context(), amend) + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesOrderList(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesOrderList(t.Context(), nil) + require.ErrorIs(t, err, common.ErrNilPointer) + + list := &WebsocketFutureOrdersList{} + _, err = g.WebsocketFuturesOrderList(t.Context(), list) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + list.Contract = BTCUSDT + _, err = g.WebsocketFuturesOrderList(t.Context(), list) + require.ErrorIs(t, err, asset.ErrNotSupported) + + list.Asset = asset.USDTMarginedFutures + _, err = g.WebsocketFuturesOrderList(t.Context(), list) + require.ErrorIs(t, err, errStatusNotSet) + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + list.Status = statusOpen + got, err := g.WebsocketFuturesOrderList(t.Context(), list) + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestWebsocketFuturesGetOrderStatus(t *testing.T) { + t.Parallel() + _, err := g.WebsocketFuturesGetOrderStatus(t.Context(), currency.EMPTYPAIR, asset.Empty, "") + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + _, err = g.WebsocketFuturesGetOrderStatus(t.Context(), BTCUSDT, asset.Empty, "") + require.ErrorIs(t, err, asset.ErrNotSupported) + + _, err = g.WebsocketFuturesGetOrderStatus(t.Context(), BTCUSDT, asset.USDTMarginedFutures, "") + require.ErrorIs(t, err, order.ErrOrderIDNotSet) + + sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) + + g := newExchangeWithWebsocket(t, asset.Futures) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + + got, err := g.WebsocketFuturesGetOrderStatus(t.Context(), BTCUSDT, asset.USDTMarginedFutures, "513170215869") + require.NoError(t, err) + require.NotEmpty(t, got) +} + +func TestGetAssetFromFuturesPair(t *testing.T) { + t.Parallel() + _, err := getAssetFromFuturesPair(currency.Pair{}) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + _, err = getAssetFromFuturesPair(currency.NewPair(currency.BTC, currency.USDC)) + require.ErrorIs(t, err, asset.ErrNotSupported) + + a, err := getAssetFromFuturesPair(BTCUSDT) + require.NoError(t, err) + require.Equal(t, asset.USDTMarginedFutures, a) + + a, err = getAssetFromFuturesPair(BTCUSD) + require.NoError(t, err) + require.Equal(t, asset.CoinMarginedFutures, a) +} + +func TestValidateFuturesPairAsset(t *testing.T) { + t.Parallel() + err := validateFuturesPairAsset(currency.Pair{}, asset.USDTMarginedFutures) + require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) + + err = validateFuturesPairAsset(BTCUSDT, asset.USDTMarginedFutures) + require.NoError(t, err) + + err = validateFuturesPairAsset(BTCUSD, asset.USDTMarginedFutures) + require.ErrorIs(t, err, asset.ErrNotSupported) +} diff --git a/exchanges/gateio/gateio_websocket_request_spot.go b/exchanges/gateio/gateio_websocket_request_spot.go index 4069c3a2..e9261b4c 100644 --- a/exchanges/gateio/gateio_websocket_request_spot.go +++ b/exchanges/gateio/gateio_websocket_request_spot.go @@ -5,15 +5,12 @@ import ( "errors" "fmt" "strconv" - "strings" - "time" "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" - "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" - "github.com/thrasher-corp/gocryptotrader/exchanges/request" ) var ( @@ -22,14 +19,26 @@ var ( errChannelEmpty = errors.New("channel cannot be empty") ) +// authenticateSpot sends an authentication message to the websocket connection +func (g *Gateio) authenticateSpot(ctx context.Context, conn websocket.Connection) error { + return g.websocketLogin(ctx, conn, "spot.login") +} + // WebsocketSpotSubmitOrder submits an order via the websocket connection -func (g *Gateio) WebsocketSpotSubmitOrder(ctx context.Context, order *WebsocketOrder) ([]WebsocketOrderResponse, error) { - return g.WebsocketSpotSubmitOrders(ctx, []WebsocketOrder{*order}) +func (g *Gateio) WebsocketSpotSubmitOrder(ctx context.Context, order *CreateOrderRequest) (*WebsocketOrderResponse, error) { + resps, err := g.WebsocketSpotSubmitOrders(ctx, order) + if err != nil { + return nil, err + } + if len(resps) != 1 { + return nil, common.ErrInvalidResponse + } + return &resps[0], nil } // WebsocketSpotSubmitOrders submits orders via the websocket connection. You can // send multiple orders in a single request. But only for one asset route. -func (g *Gateio) WebsocketSpotSubmitOrders(ctx context.Context, orders []WebsocketOrder) ([]WebsocketOrderResponse, error) { +func (g *Gateio) WebsocketSpotSubmitOrders(ctx context.Context, orders ...*CreateOrderRequest) ([]WebsocketOrderResponse, error) { if len(orders) == 0 { return nil, errOrdersEmpty } @@ -39,16 +48,16 @@ func (g *Gateio) WebsocketSpotSubmitOrders(ctx context.Context, orders []Websock // API requires Text field, or it will be rejected orders[i].Text = "t-" + strconv.FormatInt(g.Counter.IncrementAndGet(), 10) } - if orders[i].CurrencyPair == "" { + if orders[i].CurrencyPair.IsEmpty() { return nil, currency.ErrCurrencyPairEmpty } if orders[i].Side == "" { return nil, order.ErrSideIsInvalid } - if orders[i].Amount == "" { + if orders[i].Amount == 0 { return nil, errInvalidAmount } - if orders[i].Type == "limit" && orders[i].Price == "" { + if orders[i].Type == "limit" && orders[i].Price == 0 { return nil, errInvalidPrice } } @@ -153,72 +162,3 @@ func (g *Gateio) WebsocketSpotGetOrderStatus(ctx context.Context, orderID string var resp WebsocketOrderResponse return &resp, g.SendWebsocketRequest(ctx, spotGetOrdersEPL, "spot.order_status", asset.Spot, params, &resp, 1) } - -// funnelResult is used to unmarshal the result of a websocket request back to the required caller type -type funnelResult struct { - Result any `json:"result"` -} - -// SendWebsocketRequest sends a websocket request to the exchange -func (g *Gateio) SendWebsocketRequest(ctx context.Context, epl request.EndpointLimit, channel string, connSignature, params, result any, expectedResponses int) error { - paramPayload, err := json.Marshal(params) - if err != nil { - return err - } - - conn, err := g.Websocket.GetConnection(connSignature) - if err != nil { - return err - } - - tn := time.Now().Unix() - req := &WebsocketRequest{ - Time: tn, - Channel: channel, - Event: "api", - Payload: WebsocketPayload{ - // This request ID associated with the payload is the match to the - // response. - RequestID: strconv.FormatInt(conn.GenerateMessageID(false), 10), - RequestParam: paramPayload, - Timestamp: strconv.FormatInt(tn, 10), - }, - } - - responses, err := conn.SendMessageReturnResponsesWithInspector(ctx, epl, req.Payload.RequestID, req, expectedResponses, wsRespAckInspector{}) - if err != nil { - return err - } - - if len(responses) == 0 { - return common.ErrNoResponse - } - - var inbound WebsocketAPIResponse - // The last response is the one we want to unmarshal, the other is just - // an ack. If the request fails on the ACK then we can unmarshal the error - // from that as the next response won't come anyway. - endResponse := responses[len(responses)-1] - - if err := json.Unmarshal(endResponse, &inbound); err != nil { - return err - } - - if inbound.Header.Status != "200" { - var wsErr WebsocketErrors - if err := json.Unmarshal(inbound.Data, &wsErr); err != nil { - return err - } - return fmt.Errorf("%s: %s", wsErr.Errors.Label, wsErr.Errors.Message) - } - - return json.Unmarshal(inbound.Data, &funnelResult{Result: result}) -} - -type wsRespAckInspector struct{} - -// IsFinal checks the payload for an ack, it returns true if the payload does not contain an ack. -// This will force the cancellation of further waiting for responses. -func (wsRespAckInspector) IsFinal(data []byte) bool { - return !strings.Contains(string(data), "ack") -} diff --git a/exchanges/gateio/gateio_websocket_request_spot_test.go b/exchanges/gateio/gateio_websocket_request_spot_test.go index cdf9e9f0..4f50bdd4 100644 --- a/exchanges/gateio/gateio_websocket_request_spot_test.go +++ b/exchanges/gateio/gateio_websocket_request_spot_test.go @@ -1,13 +1,11 @@ package gateio import ( - "context" "strings" "testing" "github.com/stretchr/testify/require" "github.com/thrasher-corp/gocryptotrader/common" - "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/order" @@ -17,231 +15,222 @@ import ( func TestWebsocketLogin(t *testing.T) { t.Parallel() - err := g.websocketLogin(context.Background(), nil, "") + err := g.websocketLogin(t.Context(), nil, "") require.ErrorIs(t, err, common.ErrNilPointer) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes c, err := g.Websocket.GetConnection(asset.Spot) require.NoError(t, err) - err = g.websocketLogin(context.Background(), c, "") + err = g.websocketLogin(t.Context(), c, "") require.ErrorIs(t, err, errChannelEmpty) - err = g.websocketLogin(context.Background(), c, "spot.login") + err = g.websocketLogin(t.Context(), c, "spot.login") require.NoError(t, err) } func TestWebsocketSpotSubmitOrder(t *testing.T) { t.Parallel() - _, err := g.WebsocketSpotSubmitOrder(context.Background(), &WebsocketOrder{}) + _, err := g.WebsocketSpotSubmitOrder(t.Context(), &CreateOrderRequest{}) require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) - out := &WebsocketOrder{CurrencyPair: "BTC_USDT"} - _, err = g.WebsocketSpotSubmitOrder(context.Background(), out) + out := &CreateOrderRequest{CurrencyPair: currency.NewPair(currency.NewCode("GT"), currency.USDT).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"})} + _, err = g.WebsocketSpotSubmitOrder(t.Context(), out) require.ErrorIs(t, err, order.ErrSideIsInvalid) - out.Side = strings.ToLower(order.Buy.String()) - _, err = g.WebsocketSpotSubmitOrder(context.Background(), out) + out.Side = strings.ToLower(order.Sell.String()) + _, err = g.WebsocketSpotSubmitOrder(t.Context(), out) require.ErrorIs(t, err, errInvalidAmount) - out.Amount = "0.0003" + out.Amount = 1 out.Type = "limit" - _, err = g.WebsocketSpotSubmitOrder(context.Background(), out) + _, err = g.WebsocketSpotSubmitOrder(t.Context(), out) require.ErrorIs(t, err, errInvalidPrice) - out.Price = "20000" + out.Price = 100 sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes - got, err := g.WebsocketSpotSubmitOrder(context.Background(), out) + got, err := g.WebsocketSpotSubmitOrder(t.Context(), out) require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotSubmitOrders(t *testing.T) { t.Parallel() - _, err := g.WebsocketSpotSubmitOrders(context.Background(), nil) + _, err := g.WebsocketSpotSubmitOrders(t.Context()) require.ErrorIs(t, err, errOrdersEmpty) - _, err = g.WebsocketSpotSubmitOrders(context.Background(), make([]WebsocketOrder, 1)) + out := &CreateOrderRequest{} + _, err = g.WebsocketSpotSubmitOrders(t.Context(), out) require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) - out := WebsocketOrder{CurrencyPair: "BTC_USDT"} - _, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out}) + out.CurrencyPair = currency.NewBTCUSDT() + _, err = g.WebsocketSpotSubmitOrders(t.Context(), out) require.ErrorIs(t, err, order.ErrSideIsInvalid) out.Side = strings.ToLower(order.Buy.String()) - _, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out}) + _, err = g.WebsocketSpotSubmitOrders(t.Context(), out) require.ErrorIs(t, err, errInvalidAmount) - out.Amount = "0.0003" + out.Amount = 0.0003 out.Type = "limit" - _, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out}) + _, err = g.WebsocketSpotSubmitOrders(t.Context(), out) require.ErrorIs(t, err, errInvalidPrice) - out.Price = "20000" + out.Price = 20000 sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes // test single order - got, err := g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out}) + got, err := g.WebsocketSpotSubmitOrders(t.Context(), out) require.NoError(t, err) require.NotEmpty(t, got) // test batch orders - got, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out, out}) + got, err = g.WebsocketSpotSubmitOrders(t.Context(), out, out) require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotCancelOrder(t *testing.T) { t.Parallel() - _, err := g.WebsocketSpotCancelOrder(context.Background(), "", currency.EMPTYPAIR, "") + _, err := g.WebsocketSpotCancelOrder(t.Context(), "", currency.EMPTYPAIR, "") require.ErrorIs(t, err, order.ErrOrderIDNotSet) - _, err = g.WebsocketSpotCancelOrder(context.Background(), "1337", currency.EMPTYPAIR, "") + _, err = g.WebsocketSpotCancelOrder(t.Context(), "1337", currency.EMPTYPAIR, "") require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) - btcusdt, err := currency.NewPairFromString("BTC_USDT") - require.NoError(t, err) - sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes - got, err := g.WebsocketSpotCancelOrder(context.Background(), "644913098758", btcusdt, "") + got, err := g.WebsocketSpotCancelOrder(t.Context(), "644913098758", BTCUSDT, "") require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotCancelAllOrdersByIDs(t *testing.T) { t.Parallel() - _, err := g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{}) + _, err := g.WebsocketSpotCancelAllOrdersByIDs(t.Context(), []WebsocketOrderBatchRequest{}) require.ErrorIs(t, err, errNoOrdersToCancel) out := WebsocketOrderBatchRequest{} - _, err = g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out}) + _, err = g.WebsocketSpotCancelAllOrdersByIDs(t.Context(), []WebsocketOrderBatchRequest{out}) require.ErrorIs(t, err, order.ErrOrderIDNotSet) out.OrderID = "1337" - _, err = g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out}) + _, err = g.WebsocketSpotCancelAllOrdersByIDs(t.Context(), []WebsocketOrderBatchRequest{out}) require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) - out.Pair, err = currency.NewPairFromString("BTC_USDT") - require.NoError(t, err) + out.Pair = BTCUSDT sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes out.OrderID = "644913101755" - got, err := g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out}) + got, err := g.WebsocketSpotCancelAllOrdersByIDs(t.Context(), []WebsocketOrderBatchRequest{out}) require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotCancelAllOrdersByPair(t *testing.T) { t.Parallel() - pair, err := currency.NewPairFromString("LTC_USDT") - require.NoError(t, err) - - _, err = g.WebsocketSpotCancelAllOrdersByPair(context.Background(), pair, 0, "") + _, err := g.WebsocketSpotCancelAllOrdersByPair(t.Context(), currency.NewPairWithDelimiter("LTC", "USDT", "_"), 0, "") require.ErrorIs(t, err, order.ErrSideIsInvalid) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes - got, err := g.WebsocketSpotCancelAllOrdersByPair(context.Background(), currency.EMPTYPAIR, order.Buy, "") + got, err := g.WebsocketSpotCancelAllOrdersByPair(t.Context(), currency.EMPTYPAIR, order.Buy, "") require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotAmendOrder(t *testing.T) { t.Parallel() - - _, err := g.WebsocketSpotAmendOrder(context.Background(), nil) + _, err := g.WebsocketSpotAmendOrder(t.Context(), nil) require.ErrorIs(t, err, common.ErrNilPointer) amend := &WebsocketAmendOrder{} - _, err = g.WebsocketSpotAmendOrder(context.Background(), amend) + _, err = g.WebsocketSpotAmendOrder(t.Context(), amend) require.ErrorIs(t, err, order.ErrOrderIDNotSet) amend.OrderID = "1337" - _, err = g.WebsocketSpotAmendOrder(context.Background(), amend) + _, err = g.WebsocketSpotAmendOrder(t.Context(), amend) require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) - amend.Pair, err = currency.NewPairFromString("BTC_USDT") - require.NoError(t, err) + amend.Pair = BTCUSDT - _, err = g.WebsocketSpotAmendOrder(context.Background(), amend) + _, err = g.WebsocketSpotAmendOrder(t.Context(), amend) require.ErrorIs(t, err, errInvalidAmount) amend.Amount = "0.0004" sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) - testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes amend.OrderID = "645029162673" - got, err := g.WebsocketSpotAmendOrder(context.Background(), amend) + got, err := g.WebsocketSpotAmendOrder(t.Context(), amend) require.NoError(t, err) require.NotEmpty(t, got) } func TestWebsocketSpotGetOrderStatus(t *testing.T) { t.Parallel() - - _, err := g.WebsocketSpotGetOrderStatus(context.Background(), "", currency.EMPTYPAIR, "") + _, err := g.WebsocketSpotGetOrderStatus(t.Context(), "", currency.EMPTYPAIR, "") require.ErrorIs(t, err, order.ErrOrderIDNotSet) - _, err = g.WebsocketSpotGetOrderStatus(context.Background(), "1337", currency.EMPTYPAIR, "") + _, err = g.WebsocketSpotGetOrderStatus(t.Context(), "1337", currency.EMPTYPAIR, "") require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty) sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders) testexch.UpdatePairsOnce(t, g) - g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes + g := newExchangeWithWebsocket(t, asset.Spot) - pair, err := currency.NewPairFromString("BTC_USDT") - require.NoError(t, err) - - got, err := g.WebsocketSpotGetOrderStatus(context.Background(), "644999650452", pair, "") + got, err := g.WebsocketSpotGetOrderStatus(t.Context(), "644999650452", BTCUSDT, "") require.NoError(t, err) require.NotEmpty(t, got) } // getWebsocketInstance returns a websocket instance copy for testing. // This restricts the pairs to a single pair per asset type to reduce test time. -func getWebsocketInstance(t *testing.T, g *Gateio) *Gateio { +func newExchangeWithWebsocket(t *testing.T, a asset.Item) *Gateio { t.Helper() - - cpy := new(Gateio) - cpy.SetDefaults() - gConf, err := config.GetConfig().GetExchangeConfig("GateIO") - require.NoError(t, err) - gConf.API.AuthenticatedSupport = true - gConf.API.AuthenticatedWebsocketSupport = true - gConf.API.Credentials.Key = apiKey - gConf.API.Credentials.Secret = apiSecret - - require.NoError(t, cpy.Setup(gConf), "Test instance Setup must not error") - cpy.CurrencyPairs.Load(&g.CurrencyPairs) - - for _, a := range cpy.GetAssetTypes(true) { - if a != asset.Spot { - require.NoError(t, cpy.CurrencyPairs.SetAssetEnabled(a, false)) - continue - } - avail, err := cpy.GetAvailablePairs(a) + if apiKey == "" || apiSecret == "" { + t.Skip() + } + g := new(Gateio) + require.NoError(t, testexch.Setup(g), "Test instance Setup must not error") + testexch.UpdatePairsOnce(t, g) + g.API.AuthenticatedSupport = true + g.API.AuthenticatedWebsocketSupport = true + g.SetCredentials(apiKey, apiSecret, "", "", "", "") + g.Websocket.SetCanUseAuthenticatedEndpoints(true) + switch a { + case asset.Spot: + avail, err := g.GetAvailablePairs(a) require.NoError(t, err) - if len(avail) > 1 { + if len(avail) > 1 { // reduce pairs to 1 to speed up tests avail = avail[:1] } - require.NoError(t, cpy.SetPairs(avail, a, true)) + require.NoError(t, g.SetPairs(avail, a, true)) + case asset.Futures: + avail, err := g.GetAvailablePairs(a) + require.NoError(t, err) + usdtPairs, err := avail.GetPairsByQuote(currency.USDT) // Get USDT margin pairs + require.NoError(t, err) + btcPairs, err := avail.GetPairsByQuote(currency.USD) // Get BTC margin pairs + require.NoError(t, err) + // below makes sure there is both a USDT and BTC pair available + // so that allows two connections to be made. + avail[0] = usdtPairs[0] + avail[1] = btcPairs[0] + avail = avail[:2] + require.NoError(t, g.SetPairs(avail, a, true)) + default: + require.NoError(t, g.CurrencyPairs.SetAssetEnabled(a, false)) } - require.NoError(t, cpy.Websocket.Connect()) - return cpy + + require.NoError(t, g.Websocket.Connect()) + return g } diff --git a/exchanges/gateio/gateio_websocket_request_types.go b/exchanges/gateio/gateio_websocket_request_types.go index c4bc766f..80f08da8 100644 --- a/exchanges/gateio/gateio_websocket_request_types.go +++ b/exchanges/gateio/gateio_websocket_request_types.go @@ -3,6 +3,7 @@ package gateio import ( "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/types" ) @@ -15,7 +16,7 @@ type WebsocketAPIResponse struct { // Header defines a websocket header type Header struct { ResponseTime types.Time `json:"response_time"` - Status string `json:"status"` + Status int64 `json:"status,string"` Channel string `json:"channel"` Event string `json:"event"` ClientID string `json:"client_id"` @@ -51,60 +52,75 @@ type WebsocketErrors struct { } `json:"errs"` } -// WebsocketOrder defines a websocket order -type WebsocketOrder struct { - Text string `json:"text"` - CurrencyPair string `json:"currency_pair,omitempty"` - Type string `json:"type,omitempty"` - Account string `json:"account,omitempty"` - Side string `json:"side,omitempty"` - Amount string `json:"amount,omitempty"` - Price string `json:"price,omitempty"` - TimeInForce string `json:"time_in_force,omitempty"` - Iceberg string `json:"iceberg,omitempty"` - AutoBorrow bool `json:"auto_borrow,omitempty"` - AutoRepay bool `json:"auto_repay,omitempty"` - StpAct string `json:"stp_act,omitempty"` -} - // WebsocketOrderResponse defines a websocket order response type WebsocketOrderResponse struct { - Left types.Number `json:"left"` - UpdateTime types.Time `json:"update_time"` - Amount types.Number `json:"amount"` - CreateTime types.Time `json:"create_time"` - Price types.Number `json:"price"` - FinishAs string `json:"finish_as"` - TimeInForce string `json:"time_in_force"` - CurrencyPair currency.Pair `json:"currency_pair"` - Type string `json:"type"` - Account string `json:"account"` - Side string `json:"side"` - AmendText string `json:"amend_text"` - Text string `json:"text"` - Status string `json:"status"` - Iceberg types.Number `json:"iceberg"` - FilledTotal types.Number `json:"filled_total"` - ID string `json:"id"` - FillPrice types.Number `json:"fill_price"` - UpdateTimeMs types.Time `json:"update_time_ms"` - CreateTimeMs types.Time `json:"create_time_ms"` - Fee types.Number `json:"fee"` - FeeCurrency currency.Code `json:"fee_currency"` - PointFee types.Number `json:"point_fee"` - GTFee types.Number `json:"gt_fee"` - GTMakerFee types.Number `json:"gt_maker_fee"` - GTTakerFee types.Number `json:"gt_taker_fee"` - GTDiscount bool `json:"gt_discount"` - RebatedFee types.Number `json:"rebated_fee"` - RebatedFeeCurrency currency.Code `json:"rebated_fee_currency"` - STPID int `json:"stp_id"` - STPAct string `json:"stp_act"` + Left types.Number `json:"left"` + UpdateTime types.Time `json:"update_time"` + Amount types.Number `json:"amount"` + CreateTime types.Time `json:"create_time"` + Price types.Number `json:"price"` + FinishAs string `json:"finish_as"` + TimeInForce string `json:"time_in_force"` + CurrencyPair currency.Pair `json:"currency_pair"` + Type string `json:"type"` + Account asset.Item `json:"account"` + Side string `json:"side"` + AmendText string `json:"amend_text"` + Text string `json:"text"` + Status string `json:"status"` + Iceberg types.Number `json:"iceberg"` + FilledTotal types.Number `json:"filled_total"` + ID string `json:"id"` + FillPrice types.Number `json:"fill_price"` + UpdateTimeMs types.Time `json:"update_time_ms"` + CreateTimeMs types.Time `json:"create_time_ms"` + Fee types.Number `json:"fee"` + FeeCurrency currency.Code `json:"fee_currency"` + PointFee types.Number `json:"point_fee"` + GTFee types.Number `json:"gt_fee"` + GTMakerFee types.Number `json:"gt_maker_fee"` + GTTakerFee types.Number `json:"gt_taker_fee"` + GTDiscount bool `json:"gt_discount"` + RebatedFee types.Number `json:"rebated_fee"` + RebatedFeeCurrency currency.Code `json:"rebated_fee_currency"` + SelfTradePreventionID int `json:"stp_id"` + SelfTradePreventionAction string `json:"stp_act"` + AverageDealPrice types.Number `json:"avg_deal_price"` +} + +// WebsocketFuturesOrderResponse defines a websocket futures order response +type WebsocketFuturesOrderResponse struct { + ID int64 `json:"id"` + User int64 `json:"user"` + CreateTime types.Time `json:"create_time"` + FinishTime types.Time `json:"finish_time"` + FinishAs string `json:"finish_as"` + Status string `json:"status"` + Contract currency.Pair `json:"contract"` + Size float64 `json:"size"` + Iceberg int64 `json:"iceberg"` + Price types.Number `json:"price"` + IsClose bool `json:"is_close"` + IsReduceOnly bool `json:"is_reduce_only"` + IsForLiquidation bool `json:"is_liq"` + TimeInForce string `json:"tif"` + Left float64 `json:"left"` + FillPrice types.Number `json:"fill_price"` + Text string `json:"text"` + TakerFee types.Number `json:"tkfr"` + MakerFee types.Number `json:"mkfr"` + ReferenceUserID int64 `json:"refu"` + SelfTradePreventionID int64 `json:"stp_id"` + SelfTradePreventionAction string `json:"stp_act"` + AmendText string `json:"amend_text"` + BizInfo string `json:"biz_info"` + UpdateTime types.Time `json:"update_time"` + Succeeded *bool `json:"succeeded"` // Nil if not present in returned response. } // WebsocketOrderBatchRequest defines a websocket order batch request type WebsocketOrderBatchRequest struct { - OrderID string `json:"id"` // This require id tag not order_id + OrderID string `json:"id"` // This requires id tag not order_id Pair currency.Pair `json:"currency_pair"` Account string `json:"account,omitempty"` } @@ -112,7 +128,7 @@ type WebsocketOrderBatchRequest struct { // WebsocketOrderRequest defines a websocket order request type WebsocketOrderRequest struct { OrderID string `json:"order_id"` // This requires order_id tag - Pair string `json:"pair"` + Pair string `json:"currency_pair"` Account string `json:"account,omitempty"` } @@ -140,3 +156,23 @@ type WebsocketAmendOrder struct { Price string `json:"price,omitempty"` Amount string `json:"amount,omitempty"` } + +// WebsocketFuturesAmendOrder defines a websocket amend order +type WebsocketFuturesAmendOrder struct { + OrderID string `json:"order_id"` + Contract currency.Pair `json:"-"` // Only used internally for routing + Asset asset.Item `json:"-"` // Only used internally for routing + AmendText string `json:"amend_text,omitempty"` + Price string `json:"price,omitempty"` + Size int64 `json:"size,omitempty"` +} + +// WebsocketFutureOrdersList defines a websocket future orders list +type WebsocketFutureOrdersList struct { + Contract currency.Pair `json:"contract,omitempty"` + Asset asset.Item `json:"-"` // Only used internally for routing + Status string `json:"status"` + Limit int64 `json:"limit,omitempty"` + Offset int64 `json:"offset,omitempty"` + LastID string `json:"last_id,omitempty"` +} diff --git a/exchanges/gateio/gateio_wrapper.go b/exchanges/gateio/gateio_wrapper.go index c25541fd..00fb5139 100644 --- a/exchanges/gateio/gateio_wrapper.go +++ b/exchanges/gateio/gateio_wrapper.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -29,7 +30,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" "github.com/thrasher-corp/gocryptotrader/types" @@ -237,6 +237,7 @@ func (g *Gateio) Setup(exch *config.Exchange) error { Unsubscriber: g.FuturesUnsubscribe, GenerateSubscriptions: func() (subscription.List, error) { return g.GenerateFuturesDefaultSubscriptions(currency.USDT) }, Connector: g.WsFuturesConnect, + Authenticate: g.authenticateFutures, MessageFilter: asset.USDTMarginedFutures, BespokeGenerateMessageID: g.GenerateWebsocketMessageID, }) @@ -1022,34 +1023,14 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi return nil, err } s.Pair = s.Pair.Upper() + switch s.AssetType { case asset.Spot, asset.Margin, asset.CrossMargin: - switch { - case s.Side.IsLong(): - s.Side = order.Buy - case s.Side.IsShort(): - s.Side = order.Sell - default: - return nil, errInvalidOrderSide - } - timeInForce, err := getTimeInForce(s) + req, err := g.getSpotOrderRequest(s) if err != nil { return nil, err } - - sOrder, err := g.PlaceSpotOrder(ctx, &CreateOrderRequestData{ - Side: s.Side.Lower(), - Type: s.Type.Lower(), - Account: g.assetTypeToString(s.AssetType), - // When doing spot market orders when purchasing base currency, the - // quote currency amount is used. When selling the base currency the - // base currency amount is used. - Amount: types.Number(s.GetTradeAmount(g.GetTradingRequirements())), - Price: types.Number(s.Price), - CurrencyPair: s.Pair, - Text: s.ClientOrderID, - TimeInForce: timeInForce, - }) + sOrder, err := g.PlaceSpotOrder(ctx, req) if err != nil { return nil, err } @@ -1094,7 +1075,7 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi if err != nil { return nil, err } - fOrder, err := g.PlaceFuturesOrder(ctx, &OrderCreateParams{ + fOrder, err := g.PlaceFuturesOrder(ctx, &ContractOrderCreateParams{ Contract: s.Pair, Size: amountWithDirection, Price: strconv.FormatFloat(s.Price, 'f', -1, 64), // Cannot be an empty string, requires "0" for market orders. @@ -1111,7 +1092,7 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi return nil, err } status := order.Open - if fOrder.Status != "open" { + if fOrder.Status != statusOpen { status, err = order.StringToOrderStatus(fOrder.FinishAs) if err != nil { return nil, err @@ -1141,7 +1122,7 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi if err != nil { return nil, err } - newOrder, err := g.PlaceDeliveryOrder(ctx, &OrderCreateParams{ + newOrder, err := g.PlaceDeliveryOrder(ctx, &ContractOrderCreateParams{ Contract: s.Pair, Size: amountWithDirection, Price: strconv.FormatFloat(s.Price, 'f', -1, 64), // Cannot be an empty string, requires "0" for market orders. @@ -1158,7 +1139,7 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi return nil, err } status := order.Open - if newOrder.Status != "open" { + if newOrder.Status != statusOpen { status, err = order.StringToOrderStatus(newOrder.FinishAs) if err != nil { return nil, err @@ -1476,7 +1457,7 @@ func (g *Gateio) GetOrderInfo(ctx context.Context, orderID string, pair currency return nil, err } orderStatus := order.Open - if fOrder.Status != "open" { + if fOrder.Status != statusOpen { orderStatus, err = order.StringToOrderStatus(fOrder.FinishAs) if err != nil { return nil, err @@ -1635,7 +1616,7 @@ func (g *Gateio) GetActiveOrders(ctx context.Context, req *order.MultiOrderReque return nil, err } for y := range spotOrders[x].Orders { - if spotOrders[x].Orders[y].Status != "open" { + if spotOrders[x].Orders[y].Status != statusOpen { continue } var side order.Side @@ -1698,9 +1679,9 @@ func (g *Gateio) GetActiveOrders(ctx context.Context, req *order.MultiOrderReque var futuresOrders []Order if req.AssetType == asset.Futures { - futuresOrders, err = g.GetFuturesOrders(ctx, currency.EMPTYPAIR, "open", "", settlement, 0, 0, 0) + futuresOrders, err = g.GetFuturesOrders(ctx, currency.EMPTYPAIR, statusOpen, "", settlement, 0, 0, 0) } else { - futuresOrders, err = g.GetDeliveryOrders(ctx, currency.EMPTYPAIR, "open", settlement, "", 0, 0, 0) + futuresOrders, err = g.GetDeliveryOrders(ctx, currency.EMPTYPAIR, statusOpen, settlement, "", 0, 0, 0) } if err != nil { if strings.Contains(err.Error(), unfundedFuturesAccount) { @@ -1716,7 +1697,7 @@ func (g *Gateio) GetActiveOrders(ctx context.Context, req *order.MultiOrderReque return nil, err } - if futuresOrders[x].Status != "open" || (len(req.Pairs) > 0 && !req.Pairs.Contains(pair, true)) { + if futuresOrders[x].Status != statusOpen || (len(req.Pairs) > 0 && !req.Pairs.Contains(pair, true)) { continue } @@ -1739,14 +1720,14 @@ func (g *Gateio) GetActiveOrders(ctx context.Context, req *order.MultiOrderReque Type: order.Limit, SettlementCurrency: settlement, ReduceOnly: futuresOrders[x].IsReduceOnly, - PostOnly: futuresOrders[x].TimeInForce == "poc", + PostOnly: futuresOrders[x].TimeInForce == pocTIF, AverageExecutedPrice: futuresOrders[x].FillPrice.Float64(), }) } } case asset.Options: var optionsOrders []OptionOrderResponse - optionsOrders, err = g.GetOptionFuturesOrders(ctx, currency.EMPTYPAIR, "", "open", 0, 0, req.StartTime, req.EndTime) + optionsOrders, err = g.GetOptionFuturesOrders(ctx, currency.EMPTYPAIR, "", statusOpen, 0, 0, req.StartTime, req.EndTime) if err != nil { return nil, err } @@ -2509,11 +2490,11 @@ func getClientOrderIDFromText(text string) string { // getTypeFromTimeInForce returns the order type and if the order is post only func getTypeFromTimeInForce(tif string) (orderType order.Type, postOnly bool) { switch tif { - case "ioc": + case iocTIF: return order.Market, false - case "fok": + case fokTIF: return order.Market, false - case "poc": + case pocTIF: return order.Limit, true default: return order.Limit, false @@ -2536,7 +2517,7 @@ func getFutureOrderSize(s *order.Submit) (float64, error) { case s.Side.IsShort(): return -s.Amount, nil default: - return 0, errInvalidOrderSide + return 0, order.ErrSideIsInvalid } } @@ -2547,16 +2528,16 @@ var errPostOnlyOrderTypeUnsupported = errors.New("post only is only supported fo func getTimeInForce(s *order.Submit) (string, error) { timeInForce := "gtc" // limit order taker/maker if s.Type == order.Market || s.ImmediateOrCancel { - timeInForce = "ioc" // market taker only + timeInForce = iocTIF // market taker only } if s.PostOnly { if s.Type != order.Limit { return "", fmt.Errorf("%w not for %v", errPostOnlyOrderTypeUnsupported, s.Type) } - timeInForce = "poc" // limit order maker only + timeInForce = pocTIF // limit order maker only } if s.FillOrKill { - timeInForce = "fok" // market order entire fill or kill + timeInForce = fokTIF // limit order entire fill or kill } return timeInForce, nil } @@ -2579,3 +2560,224 @@ func (g *Gateio) GetCurrencyTradeURL(_ context.Context, a asset.Item, cp currenc return "", fmt.Errorf("%w %v", asset.ErrNotSupported, a) } } + +// WebsocketSubmitOrder submits an order to the exchange +// NOTE: Regarding spot orders, fee is applied to purchased currency. +func (g *Gateio) WebsocketSubmitOrder(ctx context.Context, s *order.Submit) (*order.SubmitResponse, error) { + err := s.Validate(g.GetTradingRequirements()) + if err != nil { + return nil, err + } + + s.Pair, err = g.FormatExchangeCurrency(s.Pair, s.AssetType) + if err != nil { + return nil, err + } + s.Pair = s.Pair.Upper() + + switch s.AssetType { + case asset.Spot: + req, err := g.getSpotOrderRequest(s) + if err != nil { + return nil, err + } + + got, err := g.WebsocketSpotSubmitOrder(ctx, req) + if err != nil { + return nil, err + } + return g.deriveSpotWebsocketOrderResponse(got) + case asset.Futures: + amountWithDirection, err := getFutureOrderSize(s) + if err != nil { + return nil, err + } + + timeInForce, err := getTimeInForce(s) + if err != nil { + return nil, err + } + + a, err := getAssetFromFuturesPair(s.Pair) + if err != nil { + return nil, err + } + + got, err := g.WebsocketFuturesSubmitOrder(ctx, a, &ContractOrderCreateParams{ + Contract: s.Pair, + Size: amountWithDirection, + Price: strconv.FormatFloat(s.Price, 'f', -1, 64), + ReduceOnly: s.ReduceOnly, + TimeInForce: timeInForce, + Text: s.ClientOrderID, + }) + if err != nil { + return nil, err + } + return g.deriveFuturesWebsocketOrderResponse(got) + default: + return nil, common.ErrNotYetImplemented + } +} + +func (g *Gateio) deriveSpotWebsocketOrderResponse(responses *WebsocketOrderResponse) (*order.SubmitResponse, error) { + got, err := g.deriveSpotWebsocketOrderResponses([]*WebsocketOrderResponse{responses}) + if err != nil { + return nil, err + } + return got[0], nil +} + +// deriveSpotWebsocketOrderResponses returns the order submission responses for spot +func (g *Gateio) deriveSpotWebsocketOrderResponses(responses []*WebsocketOrderResponse) ([]*order.SubmitResponse, error) { + if len(responses) == 0 { + return nil, common.ErrNoResponse + } + + out := make([]*order.SubmitResponse, 0, len(responses)) + for _, resp := range responses { + side, err := order.StringToOrderSide(resp.Side) + if err != nil { + return nil, err + } + status := order.Open + if resp.FinishAs != "" && resp.FinishAs != statusOpen { + status, err = order.StringToOrderStatus(resp.FinishAs) + if err != nil { + return nil, err + } + } + oType, err := order.StringToOrderType(resp.Type) + if err != nil { + return nil, err + } + + var cost float64 + var purchased float64 + if resp.AverageDealPrice != 0 { + if side.IsLong() { + cost = resp.FilledTotal.Float64() + purchased = resp.FilledTotal.Decimal().Div(resp.AverageDealPrice.Decimal()).InexactFloat64() + } else { + cost = resp.Amount.Float64() + purchased = resp.FilledTotal.Float64() + } + } + + out = append(out, &order.SubmitResponse{ + Exchange: g.Name, + OrderID: resp.ID, + AssetType: resp.Account, + Pair: resp.CurrencyPair, + ClientOrderID: resp.Text, + Date: resp.CreateTimeMs.Time(), + LastUpdated: resp.UpdateTimeMs.Time(), + RemainingAmount: resp.Left.Float64(), + Amount: resp.Amount.Float64(), + Price: resp.Price.Float64(), + AverageExecutedPrice: resp.AverageDealPrice.Float64(), + Type: oType, + Side: side, + Status: status, + ImmediateOrCancel: resp.TimeInForce == iocTIF, + FillOrKill: resp.TimeInForce == fokTIF, + PostOnly: resp.TimeInForce == pocTIF, + Cost: cost, + Purchased: purchased, + Fee: resp.Fee.Float64(), + FeeAsset: resp.FeeCurrency, + }) + } + return out, nil +} + +func (g *Gateio) deriveFuturesWebsocketOrderResponse(responses *WebsocketFuturesOrderResponse) (*order.SubmitResponse, error) { + got, err := g.deriveFuturesWebsocketOrderResponses([]*WebsocketFuturesOrderResponse{responses}) + if err != nil { + return nil, err + } + return got[0], nil +} + +// deriveFuturesWebsocketOrderResponses returns the order submission responses for futures +func (g *Gateio) deriveFuturesWebsocketOrderResponses(responses []*WebsocketFuturesOrderResponse) ([]*order.SubmitResponse, error) { + if len(responses) == 0 { + return nil, common.ErrNoResponse + } + + out := make([]*order.SubmitResponse, 0, len(responses)) + for _, resp := range responses { + status := order.Open + if resp.FinishAs != "" && resp.FinishAs != statusOpen { + var err error + status, err = order.StringToOrderStatus(resp.FinishAs) + if err != nil { + return nil, err + } + } + + oType := order.Market + if resp.Price != 0 { + oType = order.Limit + } + + side := order.Long + if resp.Size < 0 { + side = order.Short + } + + var clientOrderID string + if resp.Text != "" && strings.HasPrefix(resp.Text, "t-") { + clientOrderID = resp.Text + } + + out = append(out, &order.SubmitResponse{ + Exchange: g.Name, + OrderID: strconv.FormatInt(resp.ID, 10), + AssetType: asset.Futures, + Pair: resp.Contract, + ClientOrderID: clientOrderID, + Date: resp.CreateTime.Time(), + LastUpdated: resp.UpdateTime.Time(), + RemainingAmount: math.Abs(resp.Left), + Amount: math.Abs(resp.Size), + Price: resp.Price.Float64(), + AverageExecutedPrice: resp.FillPrice.Float64(), + Type: oType, + Side: side, + Status: status, + ImmediateOrCancel: resp.TimeInForce == iocTIF, + FillOrKill: resp.TimeInForce == fokTIF, + PostOnly: resp.TimeInForce == pocTIF, + ReduceOnly: resp.IsReduceOnly, + }) + } + return out, nil +} + +func (g *Gateio) getSpotOrderRequest(s *order.Submit) (*CreateOrderRequest, error) { + switch { + case s.Side.IsLong(): + s.Side = order.Buy + case s.Side.IsShort(): + s.Side = order.Sell + default: + return nil, order.ErrSideIsInvalid + } + + timeInForce, err := getTimeInForce(s) + if err != nil { + return nil, err + } + + return &CreateOrderRequest{ + Side: s.Side.Lower(), + Type: s.Type.Lower(), + Account: g.assetTypeToString(s.AssetType), + Amount: types.Number(s.GetTradeAmount(g.GetTradingRequirements())), + Price: types.Number(s.Price), + CurrencyPair: s.Pair, + Text: s.ClientOrderID, + TimeInForce: timeInForce, + }, nil +} diff --git a/exchanges/gemini/gemini_test.go b/exchanges/gemini/gemini_test.go index b2146d4d..f7ca1ced 100644 --- a/exchanges/gemini/gemini_test.go +++ b/exchanges/gemini/gemini_test.go @@ -14,13 +14,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" diff --git a/exchanges/gemini/gemini_websocket.go b/exchanges/gemini/gemini_websocket.go index 557ede68..59ca0ac4 100644 --- a/exchanges/gemini/gemini_websocket.go +++ b/exchanges/gemini/gemini_websocket.go @@ -16,6 +16,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/gemini/gemini_wrapper.go b/exchanges/gemini/gemini_wrapper.go index e4f06d13..fca95568 100644 --- a/exchanges/gemini/gemini_wrapper.go +++ b/exchanges/gemini/gemini_wrapper.go @@ -13,6 +13,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -26,7 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/hitbtc/hitbtc_test.go b/exchanges/hitbtc/hitbtc_test.go index d7540317..1aa542b6 100644 --- a/exchanges/hitbtc/hitbtc_test.go +++ b/exchanges/hitbtc/hitbtc_test.go @@ -15,13 +15,13 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" diff --git a/exchanges/hitbtc/hitbtc_websocket.go b/exchanges/hitbtc/hitbtc_websocket.go index 40096ec3..3a52030b 100644 --- a/exchanges/hitbtc/hitbtc_websocket.go +++ b/exchanges/hitbtc/hitbtc_websocket.go @@ -16,6 +16,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" @@ -24,7 +25,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/hitbtc/hitbtc_wrapper.go b/exchanges/hitbtc/hitbtc_wrapper.go index cb272af1..52b38be3 100644 --- a/exchanges/hitbtc/hitbtc_wrapper.go +++ b/exchanges/hitbtc/hitbtc_wrapper.go @@ -12,6 +12,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -25,8 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/huobi/huobi_test.go b/exchanges/huobi/huobi_test.go index e0fe42c1..2569341a 100644 --- a/exchanges/huobi/huobi_test.go +++ b/exchanges/huobi/huobi_test.go @@ -20,6 +20,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate" @@ -31,7 +32,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions" mockws "github.com/thrasher-corp/gocryptotrader/internal/testing/websocket" diff --git a/exchanges/huobi/huobi_websocket.go b/exchanges/huobi/huobi_websocket.go index 19f8c0a8..6d11b0bf 100644 --- a/exchanges/huobi/huobi_websocket.go +++ b/exchanges/huobi/huobi_websocket.go @@ -17,6 +17,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" @@ -26,7 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/huobi/huobi_wrapper.go b/exchanges/huobi/huobi_wrapper.go index b6d0a088..6fdaf9db 100644 --- a/exchanges/huobi/huobi_wrapper.go +++ b/exchanges/huobi/huobi_wrapper.go @@ -15,6 +15,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -28,7 +29,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/interfaces.go b/exchanges/interfaces.go index 946835d2..2ecc503d 100644 --- a/exchanges/interfaces.go +++ b/exchanges/interfaces.go @@ -8,6 +8,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/collateral" @@ -23,7 +24,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) @@ -134,6 +134,7 @@ type OrderManagement interface { GetOrderInfo(ctx context.Context, orderID string, pair currency.Pair, assetType asset.Item) (*order.Detail, error) GetActiveOrders(ctx context.Context, getOrdersRequest *order.MultiOrderRequest) (order.FilteredOrders, error) GetOrderHistory(ctx context.Context, getOrdersRequest *order.MultiOrderRequest) (order.FilteredOrders, error) + WebsocketSubmitOrder(ctx context.Context, s *order.Submit) (*order.SubmitResponse, error) } // CurrencyStateManagement defines functionality for currency state management diff --git a/exchanges/kraken/kraken_websocket.go b/exchanges/kraken/kraken_websocket.go index 3d6ce3d0..00b90fbf 100644 --- a/exchanges/kraken/kraken_websocket.go +++ b/exchanges/kraken/kraken_websocket.go @@ -18,6 +18,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" @@ -26,7 +27,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/kraken/kraken_wrapper.go b/exchanges/kraken/kraken_wrapper.go index eda5df4b..6bdce41c 100644 --- a/exchanges/kraken/kraken_wrapper.go +++ b/exchanges/kraken/kraken_wrapper.go @@ -15,6 +15,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -28,8 +30,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/kucoin/kucoin_websocket.go b/exchanges/kucoin/kucoin_websocket.go index df714da1..43dfa962 100644 --- a/exchanges/kucoin/kucoin_websocket.go +++ b/exchanges/kucoin/kucoin_websocket.go @@ -17,6 +17,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -27,7 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/kucoin/kucoin_wrapper.go b/exchanges/kucoin/kucoin_wrapper.go index 93984734..f6cb1ad9 100644 --- a/exchanges/kucoin/kucoin_wrapper.go +++ b/exchanges/kucoin/kucoin_wrapper.go @@ -13,6 +13,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -28,8 +30,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/okx/okx_business_websocket.go b/exchanges/okx/okx_business_websocket.go index dc55d492..65a6d090 100644 --- a/exchanges/okx/okx_business_websocket.go +++ b/exchanges/okx/okx_business_websocket.go @@ -12,10 +12,10 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/okx/okx_websocket.go b/exchanges/okx/okx_websocket.go index 1c09844e..e4a651c8 100644 --- a/exchanges/okx/okx_websocket.go +++ b/exchanges/okx/okx_websocket.go @@ -17,6 +17,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" @@ -25,7 +26,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/types" ) diff --git a/exchanges/okx/okx_wrapper.go b/exchanges/okx/okx_wrapper.go index d112846b..ccc58ddb 100644 --- a/exchanges/okx/okx_wrapper.go +++ b/exchanges/okx/okx_wrapper.go @@ -15,6 +15,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/key" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -30,8 +32,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/order/order_types.go b/exchanges/order/order_types.go index 17e214e6..c316b648 100644 --- a/exchanges/order/order_types.go +++ b/exchanges/order/order_types.go @@ -118,6 +118,7 @@ type SubmitResponse struct { AverageExecutedPrice float64 Amount float64 QuoteAmount float64 + RemainingAmount float64 TriggerPrice float64 ClientID string ClientOrderID string @@ -129,7 +130,9 @@ type SubmitResponse struct { Trades []TradeHistory Fee float64 FeeAsset currency.Code - Cost float64 + + Cost float64 + Purchased float64 // Buy in base currency, Sell in quote BorrowSize float64 LoanApplyID string diff --git a/exchanges/poloniex/poloniex_test.go b/exchanges/poloniex/poloniex_test.go index 740724e8..23aa0473 100644 --- a/exchanges/poloniex/poloniex_test.go +++ b/exchanges/poloniex/poloniex_test.go @@ -14,12 +14,12 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/core" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/kline" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/poloniex/poloniex_websocket.go b/exchanges/poloniex/poloniex_websocket.go index c972e644..dd3b9e51 100644 --- a/exchanges/poloniex/poloniex_websocket.go +++ b/exchanges/poloniex/poloniex_websocket.go @@ -14,6 +14,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/encoding/json" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/order" @@ -22,7 +23,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/log" ) diff --git a/exchanges/poloniex/poloniex_wrapper.go b/exchanges/poloniex/poloniex_wrapper.go index 2993ab5a..ae427f26 100644 --- a/exchanges/poloniex/poloniex_wrapper.go +++ b/exchanges/poloniex/poloniex_wrapper.go @@ -13,6 +13,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -26,8 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket/buffer" "github.com/thrasher-corp/gocryptotrader/log" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/request/request.go b/exchanges/request/request.go index 7ef053b5..2d370300 100644 --- a/exchanges/request/request.go +++ b/exchanges/request/request.go @@ -379,10 +379,8 @@ func WithVerbose(ctx context.Context) context.Context { // IsVerbose checks main verbosity first then checks context verbose values // for specific request verbosity. func IsVerbose(ctx context.Context, verbose bool) bool { - if verbose { - return true + if !verbose { + verbose, _ = ctx.Value(contextVerboseFlag).(bool) } - - isCtxVerbose, _ := ctx.Value(contextVerboseFlag).(bool) - return isCtxVerbose + return verbose } diff --git a/exchanges/request/request_test.go b/exchanges/request/request_test.go index c5de115b..7013da74 100644 --- a/exchanges/request/request_test.go +++ b/exchanges/request/request_test.go @@ -700,7 +700,7 @@ func TestGetHTTPClientUserAgent(t *testing.T) { } } -func TestContextVerbosity(t *testing.T) { +func TestIsVerbose(t *testing.T) { t.Parallel() require.False(t, IsVerbose(context.Background(), false)) require.True(t, IsVerbose(context.Background(), true)) diff --git a/exchanges/sharedtestvalues/customex.go b/exchanges/sharedtestvalues/customex.go index 38ddc20a..df8c2a2a 100644 --- a/exchanges/sharedtestvalues/customex.go +++ b/exchanges/sharedtestvalues/customex.go @@ -7,6 +7,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/account" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" @@ -19,7 +20,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/subscription" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" ) diff --git a/exchanges/sharedtestvalues/sharedtestvalues.go b/exchanges/sharedtestvalues/sharedtestvalues.go index b4780850..7bb13ce3 100644 --- a/exchanges/sharedtestvalues/sharedtestvalues.go +++ b/exchanges/sharedtestvalues/sharedtestvalues.go @@ -12,9 +12,9 @@ import ( "github.com/stretchr/testify/require" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchange/websocket" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" - "github.com/thrasher-corp/gocryptotrader/internal/exchange/websocket" ) // This package is only to be referenced in test files