exchanges: Initial context propagation (#744)

* gct: phase one context awareness pass

* exchanges: context propagation pass

* common/requester: force context requirement

* gctcli/exchanges: linter fix

* rpcserver: fix test using dummy rpc server

* backtester: fix comments

* grpc: add correct cancel and timeout for commands

* rpcserver_test: add comment on dummy server

* common: deprecated SendHTTPGetRequest

* linter: fix

* linter: turn on no context check

* apichecker: fix context linter issue

* binance: use param context

* common: remove checks as this gets executed before main

* common: change mutex to RW as clients can be used by multiple go routines.

* common: remove init and JIT default client. Unexport global variables and add protection.

* common: Add comments

* bithumb: after dinner mints fix
This commit is contained in:
Ryan O'Hara-Reid
2021-09-11 13:52:07 +10:00
committed by GitHub
parent 72516f7268
commit d636049fb2
168 changed files with 8085 additions and 6996 deletions

View File

@@ -57,27 +57,27 @@ const (
)
// FetchFundingHistory gets funding history
func (b *BTSE) FetchFundingHistory(symbol string) (map[string][]FundingHistoryData, error) {
func (b *BTSE) FetchFundingHistory(ctx context.Context, symbol string) (map[string][]FundingHistoryData, error) {
var resp map[string][]FundingHistoryData
params := url.Values{}
if symbol != "" {
params.Set("symbol", symbol)
}
return resp, b.SendHTTPRequest(exchange.RestFutures, http.MethodGet, btseFuturesFunding+params.Encode(), &resp, false, queryFunc)
return resp, b.SendHTTPRequest(ctx, exchange.RestFutures, http.MethodGet, btseFuturesFunding+params.Encode(), &resp, false, queryFunc)
}
// GetMarketSummary stores market summary data
func (b *BTSE) GetMarketSummary(symbol string, spot bool) (MarketSummary, error) {
func (b *BTSE) GetMarketSummary(ctx context.Context, symbol string, spot bool) (MarketSummary, error) {
var m MarketSummary
path := btseMarketOverview
if symbol != "" {
path += "?symbol=" + url.QueryEscape(symbol)
}
return m, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet, path, &m, spot, queryFunc)
return m, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, path, &m, spot, queryFunc)
}
// FetchOrderBook gets orderbook data for a given pair
func (b *BTSE) FetchOrderBook(symbol string, group, limitBids, limitAsks int, spot bool) (*Orderbook, error) {
func (b *BTSE) FetchOrderBook(ctx context.Context, symbol string, group, limitBids, limitAsks int, spot bool) (*Orderbook, error) {
var o Orderbook
urlValues := url.Values{}
urlValues.Add("symbol", symbol)
@@ -90,22 +90,22 @@ func (b *BTSE) FetchOrderBook(symbol string, group, limitBids, limitAsks int, sp
if group > 0 {
urlValues.Add("group", strconv.Itoa(group))
}
return &o, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet,
return &o, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet,
common.EncodeURLValues(btseOrderbook, urlValues), &o, spot, queryFunc)
}
// FetchOrderBookL2 retrieve level 2 orderbook for requested symbol and depth
func (b *BTSE) FetchOrderBookL2(symbol string, depth int) (*Orderbook, error) {
func (b *BTSE) FetchOrderBookL2(ctx context.Context, symbol string, depth int) (*Orderbook, error) {
var o Orderbook
urlValues := url.Values{}
urlValues.Add("symbol", symbol)
urlValues.Add("depth", strconv.FormatInt(int64(depth), 10))
endpoint := common.EncodeURLValues(btseOrderbook+"/L2", urlValues)
return &o, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet, endpoint, &o, true, queryFunc)
return &o, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, endpoint, &o, true, queryFunc)
}
// GetTrades returns a list of trades for the specified symbol
func (b *BTSE) GetTrades(symbol string, start, end time.Time, beforeSerialID, afterSerialID, count int, includeOld, spot bool) ([]Trade, error) {
func (b *BTSE) GetTrades(ctx context.Context, symbol string, start, end time.Time, beforeSerialID, afterSerialID, count int, includeOld, spot bool) ([]Trade, error) {
var t []Trade
urlValues := url.Values{}
urlValues.Add("symbol", symbol)
@@ -130,12 +130,12 @@ func (b *BTSE) GetTrades(symbol string, start, end time.Time, beforeSerialID, af
if includeOld {
urlValues.Add("includeOld", "true")
}
return t, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet,
return t, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet,
common.EncodeURLValues(btseTrades, urlValues), &t, spot, queryFunc)
}
// OHLCV retrieve and return OHLCV candle data for requested symbol
func (b *BTSE) OHLCV(symbol string, start, end time.Time, resolution int) (OHLCV, error) {
func (b *BTSE) OHLCV(ctx context.Context, symbol string, start, end time.Time, resolution int) (OHLCV, error) {
var o OHLCV
urlValues := url.Values{}
urlValues.Add("symbol", symbol)
@@ -153,40 +153,40 @@ func (b *BTSE) OHLCV(symbol string, start, end time.Time, resolution int) (OHLCV
}
urlValues.Add("resolution", strconv.FormatInt(int64(res), 10))
endpoint := common.EncodeURLValues(btseOHLCV, urlValues)
return o, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet, endpoint, &o, true, queryFunc)
return o, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, endpoint, &o, true, queryFunc)
}
// GetPrice get current price for requested symbol
func (b *BTSE) GetPrice(symbol string) (Price, error) {
func (b *BTSE) GetPrice(ctx context.Context, symbol string) (Price, error) {
var p Price
path := btsePrice + "?symbol=" + url.QueryEscape(symbol)
return p, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet, path, &p, true, queryFunc)
return p, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, path, &p, true, queryFunc)
}
// GetServerTime returns the exchanges server time
func (b *BTSE) GetServerTime() (*ServerTime, error) {
func (b *BTSE) GetServerTime(ctx context.Context) (*ServerTime, error) {
var s ServerTime
return &s, b.SendHTTPRequest(exchange.RestSpot, http.MethodGet, btseTime, &s, true, queryFunc)
return &s, b.SendHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseTime, &s, true, queryFunc)
}
// GetWalletInformation returns the users account balance
func (b *BTSE) GetWalletInformation() ([]CurrencyBalance, error) {
func (b *BTSE) GetWalletInformation(ctx context.Context) ([]CurrencyBalance, error) {
var a []CurrencyBalance
return a, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btseWallet, true, nil, nil, &a, queryFunc)
return a, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseWallet, true, nil, nil, &a, queryFunc)
}
// GetFeeInformation retrieve fee's (maker/taker) for requested symbol
func (b *BTSE) GetFeeInformation(symbol string) ([]AccountFees, error) {
func (b *BTSE) GetFeeInformation(ctx context.Context, symbol string) ([]AccountFees, error) {
var resp []AccountFees
urlValues := url.Values{}
if symbol != "" {
urlValues.Add("symbol", symbol)
}
return resp, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btseUserFee, true, urlValues, nil, &resp, queryFunc)
return resp, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseUserFee, true, urlValues, nil, &resp, queryFunc)
}
// GetWalletHistory returns the users account balance
func (b *BTSE) GetWalletHistory(symbol string, start, end time.Time, count int) (WalletHistory, error) {
func (b *BTSE) GetWalletHistory(ctx context.Context, symbol string, start, end time.Time, count int) (WalletHistory, error) {
var resp WalletHistory
urlValues := url.Values{}
@@ -203,11 +203,11 @@ func (b *BTSE) GetWalletHistory(symbol string, start, end time.Time, count int)
if count > 0 {
urlValues.Add("count", strconv.Itoa(count))
}
return resp, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btseWalletHistory, true, urlValues, nil, &resp, queryFunc)
return resp, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseWalletHistory, true, urlValues, nil, &resp, queryFunc)
}
// GetWalletAddress returns the users account balance
func (b *BTSE) GetWalletAddress(currency string) (WalletAddress, error) {
func (b *BTSE) GetWalletAddress(ctx context.Context, currency string) (WalletAddress, error) {
var resp WalletAddress
urlValues := url.Values{}
@@ -215,15 +215,15 @@ func (b *BTSE) GetWalletAddress(currency string) (WalletAddress, error) {
urlValues.Add("currency", currency)
}
return resp, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btseWalletAddress, true, urlValues, nil, &resp, queryFunc)
return resp, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseWalletAddress, true, urlValues, nil, &resp, queryFunc)
}
// CreateWalletAddress create new deposit address for requested currency
func (b *BTSE) CreateWalletAddress(currency string) (WalletAddress, error) {
func (b *BTSE) CreateWalletAddress(ctx context.Context, currency string) (WalletAddress, error) {
var resp WalletAddress
req := make(map[string]interface{}, 1)
req["currency"] = currency
err := b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost, btseWalletAddress, true, nil, req, &resp, queryFunc)
err := b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, btseWalletAddress, true, nil, req, &resp, queryFunc)
if err != nil {
errResp := ErrorResponse{}
errResponseStr := strings.Split(err.Error(), "raw response: ")
@@ -246,18 +246,18 @@ func (b *BTSE) CreateWalletAddress(currency string) (WalletAddress, error) {
}
// WalletWithdrawal submit request to withdraw crypto currency
func (b *BTSE) WalletWithdrawal(currency, address, tag, amount string) (WithdrawalResponse, error) {
func (b *BTSE) WalletWithdrawal(ctx context.Context, currency, address, tag, amount string) (WithdrawalResponse, error) {
var resp WithdrawalResponse
req := make(map[string]interface{}, 4)
req["currency"] = currency
req["address"] = address
req["tag"] = tag
req["amount"] = amount
return resp, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost, btseWalletWithdrawal, true, nil, req, &resp, queryFunc)
return resp, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, btseWalletWithdrawal, true, nil, req, &resp, queryFunc)
}
// CreateOrder creates an order
func (b *BTSE) CreateOrder(clOrderID string, deviation float64, postOnly bool, price float64, side string, size, stealth, stopPrice float64, symbol, timeInForce string, trailValue, triggerPrice float64, txType, orderType string) ([]Order, error) {
func (b *BTSE) CreateOrder(ctx context.Context, clOrderID string, deviation float64, postOnly bool, price float64, side string, size, stealth, stopPrice float64, symbol, timeInForce string, trailValue, triggerPrice float64, txType, orderType string) ([]Order, error) {
req := make(map[string]interface{})
if clOrderID != "" {
req["clOrderID"] = clOrderID
@@ -303,11 +303,11 @@ func (b *BTSE) CreateOrder(clOrderID string, deviation float64, postOnly bool, p
}
var r []Order
return r, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost, btseOrder, true, url.Values{}, req, &r, orderFunc)
return r, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, btseOrder, true, url.Values{}, req, &r, orderFunc)
}
// GetOrders returns all pending orders
func (b *BTSE) GetOrders(symbol, orderID, clOrderID string) ([]OpenOrder, error) {
func (b *BTSE) GetOrders(ctx context.Context, symbol, orderID, clOrderID string) ([]OpenOrder, error) {
req := url.Values{}
if orderID != "" {
req.Add("orderID", orderID)
@@ -317,11 +317,11 @@ func (b *BTSE) GetOrders(symbol, orderID, clOrderID string) ([]OpenOrder, error)
req.Add("clOrderID", clOrderID)
}
var o []OpenOrder
return o, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btsePendingOrders, true, req, nil, &o, orderFunc)
return o, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btsePendingOrders, true, req, nil, &o, orderFunc)
}
// CancelExistingOrder cancels an order
func (b *BTSE) CancelExistingOrder(orderID, symbol, clOrderID string) (CancelOrder, error) {
func (b *BTSE) CancelExistingOrder(ctx context.Context, orderID, symbol, clOrderID string) (CancelOrder, error) {
var c CancelOrder
req := url.Values{}
if orderID != "" {
@@ -332,18 +332,18 @@ func (b *BTSE) CancelExistingOrder(orderID, symbol, clOrderID string) (CancelOrd
req.Add("clOrderID", clOrderID)
}
return c, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodDelete, btseOrder, true, req, nil, &c, orderFunc)
return c, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodDelete, btseOrder, true, req, nil, &c, orderFunc)
}
// CancelAllAfter cancels all orders after timeout
func (b *BTSE) CancelAllAfter(timeout int) error {
func (b *BTSE) CancelAllAfter(ctx context.Context, timeout int) error {
req := make(map[string]interface{})
req["timeout"] = timeout
return b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost, btseCancelAllAfter, true, url.Values{}, req, nil, orderFunc)
return b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, btseCancelAllAfter, true, url.Values{}, req, nil, orderFunc)
}
// IndexOrderPeg create peg order that will track a certain percentage above/below the index price
func (b *BTSE) IndexOrderPeg(clOrderID string, deviation float64, postOnly bool, price float64, side string, size, stealth, stopPrice float64, symbol, timeInForce string, trailValue, triggerPrice float64, txType, orderType string) ([]Order, error) {
func (b *BTSE) IndexOrderPeg(ctx context.Context, clOrderID string, deviation float64, postOnly bool, price float64, side string, size, stealth, stopPrice float64, symbol, timeInForce string, trailValue, triggerPrice float64, txType, orderType string) ([]Order, error) {
var o []Order
req := make(map[string]interface{})
if clOrderID != "" {
@@ -389,11 +389,11 @@ func (b *BTSE) IndexOrderPeg(clOrderID string, deviation float64, postOnly bool,
req["type"] = orderType
}
return o, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost, btsePegOrder, true, url.Values{}, req, nil, orderFunc)
return o, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, btsePegOrder, true, url.Values{}, req, nil, orderFunc)
}
// TradeHistory returns previous trades on exchange
func (b *BTSE) TradeHistory(symbol string, start, end time.Time, beforeSerialID, afterSerialID, count int, includeOld bool, clOrderID, orderID string) (TradeHistory, error) {
func (b *BTSE) TradeHistory(ctx context.Context, symbol string, start, end time.Time, beforeSerialID, afterSerialID, count int, includeOld bool, clOrderID, orderID string) (TradeHistory, error) {
var resp TradeHistory
urlValues := url.Values{}
if symbol != "" {
@@ -424,11 +424,11 @@ func (b *BTSE) TradeHistory(symbol string, start, end time.Time, beforeSerialID,
if orderID != "" {
urlValues.Add("orderID", orderID)
}
return resp, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodGet, btseExchangeHistory, true, urlValues, nil, &resp, queryFunc)
return resp, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, btseExchangeHistory, true, urlValues, nil, &resp, queryFunc)
}
// SendHTTPRequest sends an HTTP request to the desired endpoint
func (b *BTSE) SendHTTPRequest(ep exchange.URL, method, endpoint string, result interface{}, spotEndpoint bool, f request.EndpointLimit) error {
func (b *BTSE) SendHTTPRequest(ctx context.Context, ep exchange.URL, method, endpoint string, result interface{}, spotEndpoint bool, f request.EndpointLimit) error {
ePoint, err := b.API.Endpoints.GetURL(ep)
if err != nil {
return err
@@ -445,13 +445,13 @@ func (b *BTSE) SendHTTPRequest(ep exchange.URL, method, endpoint string, result
HTTPDebugging: b.HTTPDebugging,
HTTPRecording: b.HTTPRecording,
}
return b.SendPayload(context.Background(), f, func() (*request.Item, error) {
return b.SendPayload(ctx, f, func() (*request.Item, error) {
return item, nil
})
}
// SendAuthenticatedHTTPRequest sends an authenticated HTTP request to the desired endpoint
func (b *BTSE) SendAuthenticatedHTTPRequest(ep exchange.URL, method, endpoint string, isSpot bool, values url.Values, req map[string]interface{}, result interface{}, f request.EndpointLimit) error {
func (b *BTSE) SendAuthenticatedHTTPRequest(ctx context.Context, ep exchange.URL, method, endpoint string, isSpot bool, values url.Values, req map[string]interface{}, result interface{}, f request.EndpointLimit) error {
if !b.AllowAuthenticatedRequest() {
return fmt.Errorf("%s %w", b.Name, exchange.ErrAuthenticatedRequestWithoutCredentialsSet)
}
@@ -525,16 +525,16 @@ func (b *BTSE) SendAuthenticatedHTTPRequest(ep exchange.URL, method, endpoint st
HTTPRecording: b.HTTPRecording,
}, nil
}
return b.SendPayload(context.Background(), f, newRequest)
return b.SendPayload(ctx, f, newRequest)
}
// GetFee returns an estimate of fee based on type of transaction
func (b *BTSE) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) {
func (b *BTSE) GetFee(ctx context.Context, feeBuilder *exchange.FeeBuilder) (float64, error) {
var fee float64
switch feeBuilder.FeeType {
case exchange.CryptocurrencyTradeFee:
fee = b.calculateTradingFee(feeBuilder) * feeBuilder.Amount * feeBuilder.PurchasePrice
fee = b.calculateTradingFee(ctx, feeBuilder) * feeBuilder.Amount * feeBuilder.PurchasePrice
case exchange.CryptocurrencyWithdrawalFee:
switch feeBuilder.Pair.Base {
case currency.USDT:
@@ -590,7 +590,7 @@ func getInternationalBankWithdrawalFee(amount float64) float64 {
}
// calculateTradingFee return fee based on users current fee tier or default values
func (b *BTSE) calculateTradingFee(feeBuilder *exchange.FeeBuilder) float64 {
func (b *BTSE) calculateTradingFee(ctx context.Context, feeBuilder *exchange.FeeBuilder) float64 {
formattedPair, err := b.FormatExchangeCurrency(feeBuilder.Pair, asset.Spot)
if err != nil {
if feeBuilder.IsMaker {
@@ -598,8 +598,9 @@ func (b *BTSE) calculateTradingFee(feeBuilder *exchange.FeeBuilder) float64 {
}
return 0.002
}
feeTiers, err := b.GetFeeInformation(formattedPair.String())
feeTiers, err := b.GetFeeInformation(ctx, formattedPair.String())
if err != nil {
// TODO: Return actual error, we should't pivot around errors.
if feeBuilder.IsMaker {
return 0.001
}

View File

@@ -1,6 +1,7 @@
package btse
import (
"context"
"errors"
"log"
"os"
@@ -58,7 +59,7 @@ func areTestAPIKeysSet() bool {
}
func TestFetchFundingHistory(t *testing.T) {
_, err := b.FetchFundingHistory("")
_, err := b.FetchFundingHistory(context.Background(), "")
if err != nil {
t.Error(err)
}
@@ -66,12 +67,12 @@ func TestFetchFundingHistory(t *testing.T) {
func TestGetMarketsSummary(t *testing.T) {
t.Parallel()
_, err := b.GetMarketSummary("", true)
_, err := b.GetMarketSummary(context.Background(), "", true)
if err != nil {
t.Error(err)
}
ret, err := b.GetMarketSummary(testSPOTPair, true)
ret, err := b.GetMarketSummary(context.Background(), testSPOTPair, true)
if err != nil {
t.Error(err)
}
@@ -82,17 +83,17 @@ func TestGetMarketsSummary(t *testing.T) {
func TestFetchOrderBook(t *testing.T) {
t.Parallel()
_, err := b.FetchOrderBook(testSPOTPair, 0, 1, 1, true)
_, err := b.FetchOrderBook(context.Background(), testSPOTPair, 0, 1, 1, true)
if err != nil {
t.Error(err)
}
_, err = b.FetchOrderBook(testFUTURESPair, 0, 1, 1, false)
_, err = b.FetchOrderBook(context.Background(), testFUTURESPair, 0, 1, 1, false)
if err != nil {
t.Error(err)
}
_, err = b.FetchOrderBook(testSPOTPair, 1, 1, 1, true)
_, err = b.FetchOrderBook(context.Background(), testSPOTPair, 1, 1, 1, true)
if err != nil {
t.Error(err)
}
@@ -105,7 +106,7 @@ func TestUpdateOrderbook(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.UpdateOrderbook(p, asset.Spot)
_, err = b.UpdateOrderbook(context.Background(), p, asset.Spot)
if err != nil {
t.Fatal(err)
}
@@ -114,7 +115,7 @@ func TestUpdateOrderbook(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.UpdateOrderbook(f, asset.Futures)
_, err = b.UpdateOrderbook(context.Background(), f, asset.Futures)
if err != nil {
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatal(err)
@@ -124,7 +125,7 @@ func TestUpdateOrderbook(t *testing.T) {
func TestFetchOrderBookL2(t *testing.T) {
t.Parallel()
_, err := b.FetchOrderBookL2(testSPOTPair, 20)
_, err := b.FetchOrderBookL2(context.Background(), testSPOTPair, 20)
if err != nil {
t.Error(err)
}
@@ -132,14 +133,16 @@ func TestFetchOrderBookL2(t *testing.T) {
func TestOHLCV(t *testing.T) {
t.Parallel()
_, err := b.OHLCV(testSPOTPair,
_, err := b.OHLCV(context.Background(),
testSPOTPair,
time.Now().AddDate(0, 0, -1),
time.Now(), 60)
if err != nil {
t.Fatal(err)
}
_, err = b.OHLCV(testSPOTPair, time.Now(), time.Now().AddDate(0, 0, -1), 60)
_, err = b.OHLCV(context.Background(),
testSPOTPair, time.Now(), time.Now().AddDate(0, 0, -1), 60)
if err == nil {
t.Fatal("expected error if start is after end date")
}
@@ -147,7 +150,7 @@ func TestOHLCV(t *testing.T) {
func TestGetPrice(t *testing.T) {
t.Parallel()
_, err := b.GetPrice(testSPOTPair)
_, err := b.GetPrice(context.Background(), testSPOTPair)
if err != nil {
t.Fatal(err)
}
@@ -167,7 +170,7 @@ func TestGetHistoricCandles(t *testing.T) {
t.Fatal(err)
}
_, err = b.GetHistoricCandles(
_, err = b.GetHistoricCandles(context.Background(),
curr, asset.Spot,
time.Time{}, time.Time{},
kline.OneMin)
@@ -175,7 +178,7 @@ func TestGetHistoricCandles(t *testing.T) {
t.Fatal(err)
}
_, err = b.GetHistoricCandles(
_, err = b.GetHistoricCandles(context.Background(),
curr, asset.Spot,
time.Time{}, time.Time{},
kline.OneDay)
@@ -184,7 +187,7 @@ func TestGetHistoricCandles(t *testing.T) {
}
curr.Quote = currency.XRP
_, err = b.GetHistoricCandles(
_, err = b.GetHistoricCandles(context.Background(),
curr, asset.Spot,
time.Time{}, time.Time{},
kline.OneMin)
@@ -200,7 +203,7 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
t.Fatal(err)
}
_, err = b.GetHistoricCandlesExtended(
_, err = b.GetHistoricCandlesExtended(context.Background(),
curr, asset.Spot,
time.Time{}, time.Time{},
kline.OneMin)
@@ -211,21 +214,24 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
func TestGetTrades(t *testing.T) {
t.Parallel()
_, err := b.GetTrades(testSPOTPair,
_, err := b.GetTrades(context.Background(),
testSPOTPair,
time.Now().AddDate(0, 0, -1), time.Now(),
0, 0, 50, false, true)
if err != nil {
t.Error(err)
}
_, err = b.GetTrades(testSPOTPair,
_, err = b.GetTrades(context.Background(),
testSPOTPair,
time.Now(), time.Now().AddDate(0, -1, 0),
0, 0, 50, false, true)
if err == nil {
t.Error("expected error if start time is after end time")
}
_, err = b.GetTrades(testFUTURESPair,
_, err = b.GetTrades(context.Background(),
testFUTURESPair,
time.Now().AddDate(0, 0, -1), time.Now(),
0, 0, 50, false, false)
if err != nil {
@@ -240,7 +246,7 @@ func TestUpdateTicker(t *testing.T) {
t.Fatal(err)
}
_, err = b.UpdateTicker(curr, asset.Spot)
_, err = b.UpdateTicker(context.Background(), curr, asset.Spot)
if err != nil {
t.Fatal(err)
}
@@ -250,7 +256,7 @@ func TestUpdateTicker(t *testing.T) {
t.Fatal(err)
}
_, err = b.UpdateTicker(curr, asset.Futures)
_, err = b.UpdateTicker(context.Background(), curr, asset.Futures)
if err != nil {
t.Fatal(err)
}
@@ -259,12 +265,12 @@ func TestUpdateTicker(t *testing.T) {
func TestUpdateTickers(t *testing.T) {
t.Parallel()
err := b.UpdateTickers(asset.Spot)
err := b.UpdateTickers(context.Background(), asset.Spot)
if err != nil {
t.Fatal(err)
}
err = b.UpdateTickers(asset.Futures)
err = b.UpdateTickers(context.Background(), asset.Futures)
if err != nil {
t.Fatal(err)
}
@@ -272,7 +278,7 @@ func TestUpdateTickers(t *testing.T) {
func TestGetServerTime(t *testing.T) {
t.Parallel()
_, err := b.GetServerTime()
_, err := b.GetServerTime(context.Background())
if err != nil {
t.Error(err)
}
@@ -283,7 +289,7 @@ func TestGetWalletInformation(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetWalletInformation()
_, err := b.GetWalletInformation(context.Background())
if err != nil {
t.Error(err)
}
@@ -294,7 +300,7 @@ func TestGetFeeInformation(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetFeeInformation("")
_, err := b.GetFeeInformation(context.Background(), "")
if err != nil {
t.Error(err)
}
@@ -305,7 +311,8 @@ func TestGetWalletHistory(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetWalletHistory(testSPOTPair,
_, err := b.GetWalletHistory(context.Background(),
testSPOTPair,
time.Time{}, time.Time{},
50)
if err != nil {
@@ -318,7 +325,7 @@ func TestGetWalletAddress(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetWalletAddress("XRP")
_, err := b.GetWalletAddress(context.Background(), "XRP")
if err != nil {
t.Error(err)
}
@@ -329,7 +336,7 @@ func TestCreateWalletAddress(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.CreateWalletAddress("XRP")
_, err := b.CreateWalletAddress(context.Background(), "XRP")
if err != nil {
t.Error(err)
}
@@ -340,7 +347,7 @@ func TestGetDepositAddress(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetDepositAddress(currency.XRP, "")
_, err := b.GetDepositAddress(context.Background(), currency.XRP, "")
if err != nil {
t.Error(err)
}
@@ -351,7 +358,8 @@ func TestCreateOrder(t *testing.T) {
if !areTestAPIKeysSet() || !canManipulateRealOrders {
t.Skip("skipping test, either api keys are unset or canManipulateRealOrders is false")
}
_, err := b.CreateOrder("", 0.0,
_, err := b.CreateOrder(context.Background(),
"", 0.0,
false,
-1, "BUY", 100, 0, 0,
testSPOTPair, "GTC",
@@ -367,7 +375,8 @@ func TestBTSEIndexOrderPeg(t *testing.T) {
if !areTestAPIKeysSet() || !canManipulateRealOrders {
t.Skip("skipping test, either api keys are unset or canManipulateRealOrders is false")
}
_, err := b.IndexOrderPeg("", 0.0,
_, err := b.IndexOrderPeg(context.Background(),
"", 0.0,
false,
-1, "BUY", 100, 0, 0,
testSPOTPair, "GTC",
@@ -383,7 +392,7 @@ func TestGetOrders(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.GetOrders(testSPOTPair, "", "")
_, err := b.GetOrders(context.Background(), testSPOTPair, "", "")
if err != nil {
t.Error(err)
}
@@ -411,7 +420,7 @@ func TestGetActiveOrders(t *testing.T) {
AssetType: asset.Spot,
}
_, err := b.GetActiveOrders(&getOrdersRequest)
_, err := b.GetActiveOrders(context.Background(), &getOrdersRequest)
if err != nil {
t.Error(err)
}
@@ -426,7 +435,7 @@ func TestGetOrderHistory(t *testing.T) {
Type: order.AnyType,
AssetType: asset.Spot,
}
_, err := b.GetOrderHistory(&getOrdersRequest)
_, err := b.GetOrderHistory(context.Background(), &getOrdersRequest)
if err != nil {
t.Error(err)
}
@@ -437,7 +446,8 @@ func TestTradeHistory(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("API keys not set, skipping test")
}
_, err := b.TradeHistory("",
_, err := b.TradeHistory(context.Background(),
"",
time.Time{}, time.Time{},
0, 0, 0,
false,
@@ -466,7 +476,7 @@ func TestGetFeeByTypeOfflineTradeFee(t *testing.T) {
PurchasePrice: 1000,
}
_, err := b.GetFeeByType(feeBuilder)
_, err := b.GetFeeByType(context.Background(), feeBuilder)
if err != nil {
t.Fatal(err)
}
@@ -492,42 +502,42 @@ func TestGetFee(t *testing.T) {
PurchasePrice: 1000,
}
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.IsMaker = false
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.Pair.Base = currency.USDT
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.FeeType = exchange.InternationalBankDepositFee
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.Amount = 1000000
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
feeBuilder.Amount = 1000
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
}
@@ -560,7 +570,7 @@ func TestSubmitOrder(t *testing.T) {
ClientID: "",
AssetType: asset.Spot,
}
response, err := b.SubmitOrder(orderSubmission)
response, err := b.SubmitOrder(context.Background(), orderSubmission)
if areTestAPIKeysSet() && (err != nil || !response.IsOrderPlaced) {
t.Errorf("Order failed to be placed: %v", err)
} else if !areTestAPIKeysSet() && err == nil {
@@ -574,7 +584,7 @@ func TestCancelAllAfter(t *testing.T) {
t.Skip("skipping test, either api keys are unset or canManipulateRealOrders is false")
}
err := b.CancelAllAfter(1)
err := b.CancelAllAfter(context.Background(), 1)
if err != nil {
t.Fatal(err)
}
@@ -595,7 +605,7 @@ func TestCancelExchangeOrder(t *testing.T) {
Pair: currencyPair,
AssetType: asset.Spot,
}
err := b.CancelOrder(orderCancellation)
err := b.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
@@ -606,7 +616,7 @@ func TestCancelOrder(t *testing.T) {
if !areTestAPIKeysSet() || !canManipulateRealOrders {
t.Skip("skipping test, either api keys are unset or canManipulateRealOrders is false")
}
_, err := b.CancelExistingOrder("", testSPOTPair, "")
_, err := b.CancelExistingOrder(context.Background(), "", testSPOTPair, "")
if err != nil {
t.Fatal(err)
}
@@ -627,7 +637,7 @@ func TestCancelAllExchangeOrders(t *testing.T) {
Pair: currencyPair,
AssetType: asset.Spot,
}
resp, err := b.CancelAllOrders(orderCancellation)
resp, err := b.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Errorf("Could not cancel orders: %v", err)
@@ -697,7 +707,7 @@ func TestFetchTradablePairs(t *testing.T) {
t.Parallel()
assets := b.GetAssetTypes(false)
for i := range assets {
data, err := b.FetchTradablePairs(assets[i])
data, err := b.FetchTradablePairs(context.Background(), assets[i])
if err != nil {
t.Fatal(err)
}
@@ -732,7 +742,7 @@ func TestMatchType(t *testing.T) {
func TestSeedOrderSizeLimits(t *testing.T) {
t.Parallel()
err := b.seedOrderSizeLimits()
err := b.seedOrderSizeLimits(context.Background())
if err != nil {
t.Fatal(err)
}
@@ -842,7 +852,7 @@ func TestGetRecentTrades(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetRecentTrades(currencyPair, asset.Spot)
_, err = b.GetRecentTrades(context.Background(), currencyPair, asset.Spot)
if err != nil {
t.Error(err)
}
@@ -850,7 +860,7 @@ func TestGetRecentTrades(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetRecentTrades(currencyPair, asset.Futures)
_, err = b.GetRecentTrades(context.Background(), currencyPair, asset.Futures)
if err != nil {
t.Error(err)
}
@@ -860,7 +870,8 @@ func TestGetHistoricTrades(t *testing.T) {
t.Parallel()
curr, _ := currency.NewPairFromString(testSPOTPair)
_, err := b.GetHistoricTrades(curr, asset.Spot, time.Now().Add(-time.Minute), time.Now())
_, err := b.GetHistoricTrades(context.Background(),
curr, asset.Spot, time.Now().Add(-time.Minute), time.Now())
if err == nil {
t.Fatal("expected error")
}

View File

@@ -1,6 +1,7 @@
package btse
import (
"context"
"errors"
"fmt"
"math"
@@ -42,7 +43,7 @@ func (b *BTSE) GetDefaultConfig() (*config.ExchangeConfig, error) {
}
if b.Features.Supports.RESTCapabilities.AutoPairUpdates {
err = b.UpdateTradablePairs(true)
err = b.UpdateTradablePairs(context.TODO(), true)
if err != nil {
return nil, err
}
@@ -202,7 +203,7 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error {
return err
}
err = b.seedOrderSizeLimits()
err = b.seedOrderSizeLimits(context.TODO())
if err != nil {
return err
}
@@ -232,7 +233,7 @@ func (b *BTSE) Run() {
return
}
err := b.UpdateTradablePairs(false)
err := b.UpdateTradablePairs(context.TODO(), false)
if err != nil {
log.Errorf(log.ExchangeSys,
"%s Failed to update tradable pairs. Error: %s", b.Name, err)
@@ -240,9 +241,9 @@ func (b *BTSE) Run() {
}
// FetchTradablePairs returns a list of the exchanges tradable pairs
func (b *BTSE) FetchTradablePairs(a asset.Item) ([]string, error) {
func (b *BTSE) FetchTradablePairs(ctx context.Context, a asset.Item) ([]string, error) {
var currencies []string
m, err := b.GetMarketSummary("", a == asset.Spot)
m, err := b.GetMarketSummary(ctx, "", a == asset.Spot)
if err != nil {
return nil, err
}
@@ -258,10 +259,10 @@ func (b *BTSE) FetchTradablePairs(a asset.Item) ([]string, error) {
// UpdateTradablePairs updates the exchanges available pairs and stores
// them in the exchanges config
func (b *BTSE) UpdateTradablePairs(forceUpdate bool) error {
func (b *BTSE) UpdateTradablePairs(ctx context.Context, forceUpdate bool) error {
a := b.GetAssetTypes(false)
for i := range a {
pairs, err := b.FetchTradablePairs(a[i])
pairs, err := b.FetchTradablePairs(ctx, a[i])
if err != nil {
return err
}
@@ -280,8 +281,8 @@ func (b *BTSE) UpdateTradablePairs(forceUpdate bool) error {
}
// UpdateTickers updates the ticker for all currency pairs of a given asset type
func (b *BTSE) UpdateTickers(a asset.Item) error {
tickers, err := b.GetMarketSummary("", a == asset.Spot)
func (b *BTSE) UpdateTickers(ctx context.Context, a asset.Item) error {
tickers, err := b.GetMarketSummary(ctx, "", a == asset.Spot)
if err != nil {
return err
}
@@ -311,8 +312,8 @@ func (b *BTSE) UpdateTickers(a asset.Item) error {
}
// UpdateTicker updates and returns the ticker for a currency pair
func (b *BTSE) UpdateTicker(p currency.Pair, a asset.Item) (*ticker.Price, error) {
err := b.UpdateTickers(a)
func (b *BTSE) UpdateTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error) {
err := b.UpdateTickers(ctx, a)
if err != nil {
return nil, err
}
@@ -320,25 +321,25 @@ func (b *BTSE) UpdateTicker(p currency.Pair, a asset.Item) (*ticker.Price, error
}
// FetchTicker returns the ticker for a currency pair
func (b *BTSE) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
func (b *BTSE) FetchTicker(ctx context.Context, p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(b.Name, p, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
return b.UpdateTicker(ctx, p, assetType)
}
return tickerNew, nil
}
// FetchOrderbook returns orderbook base on the currency pair
func (b *BTSE) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
func (b *BTSE) FetchOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(b.Name, p, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
return b.UpdateOrderbook(ctx, p, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (b *BTSE) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
func (b *BTSE) UpdateOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
book := &orderbook.Base{
Exchange: b.Name,
Pair: p,
@@ -349,7 +350,7 @@ func (b *BTSE) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderboo
if err != nil {
return book, err
}
a, err := b.FetchOrderBook(fPair.String(), 0, 0, 0, assetType == asset.Spot)
a, err := b.FetchOrderBook(ctx, fPair.String(), 0, 0, 0, assetType == asset.Spot)
if err != nil {
return book, err
}
@@ -383,9 +384,9 @@ func (b *BTSE) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderboo
// UpdateAccountInfo retrieves balances for all enabled currencies for the
// BTSE exchange
func (b *BTSE) UpdateAccountInfo(assetType asset.Item) (account.Holdings, error) {
func (b *BTSE) UpdateAccountInfo(ctx context.Context, assetType asset.Item) (account.Holdings, error) {
var a account.Holdings
balance, err := b.GetWalletInformation()
balance, err := b.GetWalletInformation(ctx)
if err != nil {
return a, err
}
@@ -416,10 +417,10 @@ func (b *BTSE) UpdateAccountInfo(assetType asset.Item) (account.Holdings, error)
}
// FetchAccountInfo retrieves balances for all enabled currencies
func (b *BTSE) FetchAccountInfo(assetType asset.Item) (account.Holdings, error) {
func (b *BTSE) FetchAccountInfo(ctx context.Context, assetType asset.Item) (account.Holdings, error) {
acc, err := account.GetHoldings(b.Name, assetType)
if err != nil {
return b.UpdateAccountInfo(assetType)
return b.UpdateAccountInfo(ctx, assetType)
}
return acc, nil
@@ -427,7 +428,7 @@ func (b *BTSE) FetchAccountInfo(assetType asset.Item) (account.Holdings, error)
// GetFundingHistory returns funding history, deposits and
// withdrawals
func (b *BTSE) GetFundingHistory() ([]exchange.FundHistory, error) {
func (b *BTSE) GetFundingHistory(ctx context.Context) ([]exchange.FundHistory, error) {
return nil, common.ErrFunctionNotSupported
}
@@ -442,12 +443,12 @@ func (b *BTSE) withinLimits(pair currency.Pair, amount float64) bool {
}
// GetWithdrawalsHistory returns previous withdrawals data
func (b *BTSE) GetWithdrawalsHistory(c currency.Code) (resp []exchange.WithdrawalHistory, err error) {
func (b *BTSE) GetWithdrawalsHistory(ctx context.Context, c currency.Code) (resp []exchange.WithdrawalHistory, err error) {
return nil, common.ErrNotYetImplemented
}
// GetRecentTrades returns the most recent trades for a currency and asset
func (b *BTSE) GetRecentTrades(p currency.Pair, assetType asset.Item) ([]trade.Data, error) {
func (b *BTSE) GetRecentTrades(ctx context.Context, p currency.Pair, assetType asset.Item) ([]trade.Data, error) {
var err error
p, err = b.FormatExchangeCurrency(p, assetType)
if err != nil {
@@ -457,7 +458,8 @@ func (b *BTSE) GetRecentTrades(p currency.Pair, assetType asset.Item) ([]trade.D
limit := 500
var tradeData []Trade
tradeData, err = b.GetTrades(p.String(),
tradeData, err = b.GetTrades(ctx,
p.String(),
time.Time{}, time.Time{},
0, 0, limit,
false,
@@ -493,12 +495,12 @@ func (b *BTSE) GetRecentTrades(p currency.Pair, assetType asset.Item) ([]trade.D
}
// GetHistoricTrades returns historic trade data within the timeframe provided
func (b *BTSE) GetHistoricTrades(_ currency.Pair, _ asset.Item, _, _ time.Time) ([]trade.Data, error) {
func (b *BTSE) GetHistoricTrades(_ context.Context, _ currency.Pair, _ asset.Item, _, _ time.Time) ([]trade.Data, error) {
return nil, common.ErrFunctionNotSupported
}
// SubmitOrder submits a new order
func (b *BTSE) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
func (b *BTSE) SubmitOrder(ctx context.Context, s *order.Submit) (order.SubmitResponse, error) {
var resp order.SubmitResponse
if err := s.Validate(); err != nil {
return resp, err
@@ -513,12 +515,18 @@ func (b *BTSE) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return resp, errors.New("order outside of limits")
}
r, err := b.CreateOrder(s.ClientID, 0.0,
r, err := b.CreateOrder(ctx,
s.ClientID, 0.0,
false,
s.Price, s.Side.String(), s.Amount, 0, 0,
fPair.String(), goodTillCancel,
0.0, s.TriggerPrice,
"", s.Type.String())
s.Price,
s.Side.String(),
s.Amount, 0, 0,
fPair.String(),
goodTillCancel,
0.0,
s.TriggerPrice,
"",
s.Type.String())
if err != nil {
return resp, err
}
@@ -534,12 +542,12 @@ func (b *BTSE) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
// ModifyOrder will allow of changing orderbook placement and limit to
// market conversion
func (b *BTSE) ModifyOrder(action *order.Modify) (order.Modify, error) {
func (b *BTSE) ModifyOrder(ctx context.Context, action *order.Modify) (order.Modify, error) {
return order.Modify{}, common.ErrFunctionNotSupported
}
// CancelOrder cancels an order by its corresponding ID number
func (b *BTSE) CancelOrder(o *order.Cancel) error {
func (b *BTSE) CancelOrder(ctx context.Context, o *order.Cancel) error {
if err := o.Validate(o.StandardCancel()); err != nil {
return err
}
@@ -550,7 +558,7 @@ func (b *BTSE) CancelOrder(o *order.Cancel) error {
return err
}
_, err = b.CancelExistingOrder(o.ID, fPair.String(), o.ClientOrderID)
_, err = b.CancelExistingOrder(ctx, o.ID, fPair.String(), o.ClientOrderID)
if err != nil {
return err
}
@@ -559,14 +567,14 @@ func (b *BTSE) CancelOrder(o *order.Cancel) error {
}
// CancelBatchOrders cancels an orders by their corresponding ID numbers
func (b *BTSE) CancelBatchOrders(o []order.Cancel) (order.CancelBatchResponse, error) {
func (b *BTSE) CancelBatchOrders(ctx context.Context, o []order.Cancel) (order.CancelBatchResponse, error) {
return order.CancelBatchResponse{}, common.ErrNotYetImplemented
}
// CancelAllOrders cancels all orders associated with a currency pair
// If product ID is sent, all orders of that specified market will be cancelled
// If not specified, all orders of all markets will be cancelled
func (b *BTSE) CancelAllOrders(orderCancellation *order.Cancel) (order.CancelAllResponse, error) {
func (b *BTSE) CancelAllOrders(ctx context.Context, orderCancellation *order.Cancel) (order.CancelAllResponse, error) {
if err := orderCancellation.Validate(); err != nil {
return order.CancelAllResponse{}, err
}
@@ -579,7 +587,7 @@ func (b *BTSE) CancelAllOrders(orderCancellation *order.Cancel) (order.CancelAll
return resp, err
}
allOrders, err := b.CancelExistingOrder("", fPair.String(), "")
allOrders, err := b.CancelExistingOrder(ctx, "", fPair.String(), "")
if err != nil {
return resp, nil
}
@@ -603,8 +611,8 @@ func orderIntToType(i int) order.Type {
}
// GetOrderInfo returns order information based on order ID
func (b *BTSE) GetOrderInfo(orderID string, pair currency.Pair, assetType asset.Item) (order.Detail, error) {
o, err := b.GetOrders("", orderID, "")
func (b *BTSE) GetOrderInfo(ctx context.Context, orderID string, pair currency.Pair, assetType asset.Item) (order.Detail, error) {
o, err := b.GetOrders(ctx, "", orderID, "")
if err != nil {
return order.Detail{}, err
}
@@ -648,7 +656,8 @@ func (b *BTSE) GetOrderInfo(orderID string, pair currency.Pair, assetType asset.
od.Price = o[i].Price
od.Status = order.Status(o[i].OrderState)
th, err := b.TradeHistory("",
th, err := b.TradeHistory(ctx,
"",
time.Time{}, time.Time{},
0, 0, 0,
false,
@@ -679,13 +688,13 @@ func (b *BTSE) GetOrderInfo(orderID string, pair currency.Pair, assetType asset.
}
// GetDepositAddress returns a deposit address for a specified currency
func (b *BTSE) GetDepositAddress(cryptocurrency currency.Code, accountID string) (string, error) {
address, err := b.GetWalletAddress(cryptocurrency.String())
func (b *BTSE) GetDepositAddress(ctx context.Context, c currency.Code, accountID string) (string, error) {
address, err := b.GetWalletAddress(ctx, c.String())
if err != nil {
return "", err
}
if len(address) == 0 {
addressCreate, err := b.CreateWalletAddress(cryptocurrency.String())
addressCreate, err := b.CreateWalletAddress(ctx, c.String())
if err != nil {
return "", err
}
@@ -699,12 +708,13 @@ func (b *BTSE) GetDepositAddress(cryptocurrency currency.Code, accountID string)
// WithdrawCryptocurrencyFunds returns a withdrawal ID when a withdrawal is
// submitted
func (b *BTSE) WithdrawCryptocurrencyFunds(withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *BTSE) WithdrawCryptocurrencyFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
if err := withdrawRequest.Validate(); err != nil {
return nil, err
}
amountToString := strconv.FormatFloat(withdrawRequest.Amount, 'f', 8, 64)
resp, err := b.WalletWithdrawal(withdrawRequest.Currency.String(),
resp, err := b.WalletWithdrawal(ctx,
withdrawRequest.Currency.String(),
withdrawRequest.Crypto.Address,
withdrawRequest.Crypto.AddressTag,
amountToString)
@@ -719,18 +729,18 @@ func (b *BTSE) WithdrawCryptocurrencyFunds(withdrawRequest *withdraw.Request) (*
// WithdrawFiatFunds returns a withdrawal ID when a withdrawal is
// submitted
func (b *BTSE) WithdrawFiatFunds(_ *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *BTSE) WithdrawFiatFunds(_ context.Context, _ *withdraw.Request) (*withdraw.ExchangeResponse, error) {
return nil, common.ErrFunctionNotSupported
}
// WithdrawFiatFundsToInternationalBank returns a withdrawal ID when a withdrawal is
// submitted
func (b *BTSE) WithdrawFiatFundsToInternationalBank(_ *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *BTSE) WithdrawFiatFundsToInternationalBank(_ context.Context, _ *withdraw.Request) (*withdraw.ExchangeResponse, error) {
return nil, common.ErrFunctionNotSupported
}
// GetActiveOrders retrieves any orders that are active/open
func (b *BTSE) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, error) {
func (b *BTSE) GetActiveOrders(ctx context.Context, req *order.GetOrdersRequest) ([]order.Detail, error) {
if err := req.Validate(); err != nil {
return nil, err
}
@@ -745,7 +755,7 @@ func (b *BTSE) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, err
if err != nil {
return nil, err
}
resp, err := b.GetOrders(formattedPair.String(), "", "")
resp, err := b.GetOrders(ctx, formattedPair.String(), "", "")
if err != nil {
return nil, err
}
@@ -787,7 +797,7 @@ func (b *BTSE) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, err
openOrder.Type = order.Limit
}
fills, err := b.TradeHistory(
fills, err := b.TradeHistory(ctx,
"",
time.Time{}, time.Time{},
0, 0, 0,
@@ -838,7 +848,7 @@ func matchType(input int, required order.Type) bool {
// GetOrderHistory retrieves account order information
// Can Limit response to specific order status
func (b *BTSE) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]order.Detail, error) {
func (b *BTSE) GetOrderHistory(ctx context.Context, getOrdersRequest *order.GetOrdersRequest) ([]order.Detail, error) {
if err := getOrdersRequest.Validate(); err != nil {
return nil, err
}
@@ -857,7 +867,7 @@ func (b *BTSE) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]orde
if err != nil {
return nil, err
}
currentOrder, err := b.GetOrders(fPair.String(), "", "")
currentOrder, err := b.GetOrders(ctx, fPair.String(), "", "")
if err != nil {
return nil, err
}
@@ -890,18 +900,18 @@ func (b *BTSE) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]orde
}
// GetFeeByType returns an estimate of fee based on type of transaction
func (b *BTSE) GetFeeByType(feeBuilder *exchange.FeeBuilder) (float64, error) {
func (b *BTSE) GetFeeByType(ctx context.Context, feeBuilder *exchange.FeeBuilder) (float64, error) {
if !b.AllowAuthenticatedRequest() && // Todo check connection status
feeBuilder.FeeType == exchange.CryptocurrencyTradeFee {
feeBuilder.FeeType = exchange.OfflineTradeFee
}
return b.GetFee(feeBuilder)
return b.GetFee(ctx, feeBuilder)
}
// ValidateCredentials validates current credentials used for wrapper
// functionality
func (b *BTSE) ValidateCredentials(assetType asset.Item) error {
_, err := b.UpdateAccountInfo(assetType)
func (b *BTSE) ValidateCredentials(ctx context.Context, assetType asset.Item) error {
_, err := b.UpdateAccountInfo(ctx, assetType)
return b.CheckTransientError(err)
}
@@ -911,7 +921,7 @@ func (b *BTSE) FormatExchangeKlineInterval(in kline.Interval) string {
}
// GetHistoricCandles returns candles between a time period for a set time interval
func (b *BTSE) GetHistoricCandles(pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
func (b *BTSE) GetHistoricCandles(ctx context.Context, pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
if err := b.ValidateKline(pair, a, interval); err != nil {
return kline.Item{}, err
}
@@ -934,7 +944,8 @@ func (b *BTSE) GetHistoricCandles(pair currency.Pair, a asset.Item, start, end t
switch a {
case asset.Spot:
req, err := b.OHLCV(fPair.String(),
req, err := b.OHLCV(ctx,
fPair.String(),
start,
end,
intervalInt)
@@ -962,7 +973,7 @@ func (b *BTSE) GetHistoricCandles(pair currency.Pair, a asset.Item, start, end t
}
// GetHistoricCandlesExtended returns candles between a time period for a set time interval
func (b *BTSE) GetHistoricCandlesExtended(pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
func (b *BTSE) GetHistoricCandlesExtended(ctx context.Context, pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
if err := b.ValidateKline(pair, a, interval); err != nil {
return kline.Item{}, err
}
@@ -989,7 +1000,8 @@ func (b *BTSE) GetHistoricCandlesExtended(pair currency.Pair, a asset.Item, star
switch a {
case asset.Spot:
req, err := b.OHLCV(fPair.String(),
req, err := b.OHLCV(ctx,
fPair.String(),
start,
end,
intervalInt)
@@ -1016,8 +1028,8 @@ func (b *BTSE) GetHistoricCandlesExtended(pair currency.Pair, a asset.Item, star
return klineRet, nil
}
func (b *BTSE) seedOrderSizeLimits() error {
pairs, err := b.GetMarketSummary("", true)
func (b *BTSE) seedOrderSizeLimits(ctx context.Context) error {
pairs, err := b.GetMarketSummary(ctx, "", true)
if err != nil {
return err
}
@@ -1030,7 +1042,7 @@ func (b *BTSE) seedOrderSizeLimits() error {
orderSizeLimitMap.Store(pairs[x].Symbol, tempValues)
}
pairs, err = b.GetMarketSummary("", false)
pairs, err = b.GetMarketSummary(ctx, "", false)
if err != nil {
return err
}