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

@@ -97,9 +97,9 @@ type Bitfinex struct {
}
// GetPlatformStatus returns the Bifinex platform status
func (b *Bitfinex) GetPlatformStatus() (int, error) {
func (b *Bitfinex) GetPlatformStatus(ctx context.Context) (int, error) {
var response []int
err := b.SendHTTPRequest(exchange.RestSpot,
err := b.SendHTTPRequest(ctx, exchange.RestSpot,
bitfinexAPIVersion2+
bitfinexPlatformStatus,
&response,
@@ -223,9 +223,10 @@ func defaultMarginV2Info(data []interface{}) (MarginInfoV2, error) {
// GetV2MarginInfo gets v2 margin info for a symbol provided
// symbol: base, sym_all, any other trading symbol example tBTCUSD
func (b *Bitfinex) GetV2MarginInfo(symbol string) ([]MarginInfoV2, error) {
func (b *Bitfinex) GetV2MarginInfo(ctx context.Context, symbol string) ([]MarginInfoV2, error) {
var data []interface{}
err := b.SendAuthenticatedHTTPRequestV2(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequestV2(ctx,
exchange.RestSpot, http.MethodPost,
bitfinexV2MarginInfo+symbol,
nil,
&data,
@@ -254,14 +255,14 @@ func (b *Bitfinex) GetV2MarginInfo(symbol string) ([]MarginInfoV2, error) {
}
// GetV2MarginFunding gets borrowing rates for margin trading
func (b *Bitfinex) GetV2MarginFunding(symbol, amount string, period int32) (MarginV2FundingData, error) {
func (b *Bitfinex) GetV2MarginFunding(ctx context.Context, symbol, amount string, period int32) (MarginV2FundingData, error) {
var resp []interface{}
var response MarginV2FundingData
params := make(map[string]interface{})
params["symbol"] = symbol
params["period"] = period
params["amount"] = amount
err := b.SendAuthenticatedHTTPRequestV2(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequestV2(ctx, exchange.RestSpot, http.MethodPost,
bitfinexV2MarginFunding,
params,
&resp,
@@ -287,10 +288,10 @@ func (b *Bitfinex) GetV2MarginFunding(symbol, amount string, period int32) (Marg
}
// GetV2FundingInfo gets funding info for margin pairs
func (b *Bitfinex) GetV2FundingInfo(key string) (MarginFundingDataV2, error) {
func (b *Bitfinex) GetV2FundingInfo(ctx context.Context, key string) (MarginFundingDataV2, error) {
var resp []interface{}
var response MarginFundingDataV2
err := b.SendAuthenticatedHTTPRequestV2(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequestV2(ctx, exchange.RestSpot, http.MethodPost,
fmt.Sprintf(bitfinexV2FundingInfo, key),
nil,
&resp,
@@ -332,10 +333,10 @@ func (b *Bitfinex) GetV2FundingInfo(key string) (MarginFundingDataV2, error) {
}
// GetAccountInfoV2 gets V2 account data
func (b *Bitfinex) GetAccountInfoV2() (AccountV2Data, error) {
func (b *Bitfinex) GetAccountInfoV2(ctx context.Context) (AccountV2Data, error) {
var resp AccountV2Data
var data []interface{}
err := b.SendAuthenticatedHTTPRequestV2(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequestV2(ctx, exchange.RestSpot, http.MethodPost,
bitfinexV2AccountInfo,
nil,
&data,
@@ -377,10 +378,11 @@ func (b *Bitfinex) GetAccountInfoV2() (AccountV2Data, error) {
}
// GetV2Balances gets v2 balances
func (b *Bitfinex) GetV2Balances() ([]WalletDataV2, error) {
func (b *Bitfinex) GetV2Balances(ctx context.Context) ([]WalletDataV2, error) {
var resp []WalletDataV2
var data [][4]interface{}
err := b.SendAuthenticatedHTTPRequestV2(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequestV2(ctx,
exchange.RestSpot, http.MethodPost,
bitfinexV2Balances,
nil,
&data,
@@ -416,10 +418,10 @@ func (b *Bitfinex) GetV2Balances() ([]WalletDataV2, error) {
}
// GetMarginPairs gets pairs that allow margin trading
func (b *Bitfinex) GetMarginPairs() ([]string, error) {
func (b *Bitfinex) GetMarginPairs(ctx context.Context) ([]string, error) {
var resp [][]string
path := bitfinexAPIVersion2 + bitfinexMarginPairs
err := b.SendHTTPRequest(exchange.RestSpot, path, &resp, status)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &resp, status)
if err != nil {
return nil, err
}
@@ -430,7 +432,7 @@ func (b *Bitfinex) GetMarginPairs() ([]string, error) {
}
// GetDerivativeStatusInfo gets status data for the queried derivative
func (b *Bitfinex) GetDerivativeStatusInfo(keys, startTime, endTime string, sort, limit int64) ([]DerivativeDataResponse, error) {
func (b *Bitfinex) GetDerivativeStatusInfo(ctx context.Context, keys, startTime, endTime string, sort, limit int64) ([]DerivativeDataResponse, error) {
var result [][]interface{}
var finalResp []DerivativeDataResponse
@@ -450,7 +452,7 @@ func (b *Bitfinex) GetDerivativeStatusInfo(keys, startTime, endTime string, sort
}
path := bitfinexAPIVersion2 + bitfinexDerivativeData +
params.Encode()
err := b.SendHTTPRequest(exchange.RestSpot, path, &result, status)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &result, status)
if err != nil {
return finalResp, err
}
@@ -500,13 +502,13 @@ func (b *Bitfinex) GetDerivativeStatusInfo(keys, startTime, endTime string, sort
}
// GetTickerBatch returns all supported ticker information
func (b *Bitfinex) GetTickerBatch() (map[string]Ticker, error) {
func (b *Bitfinex) GetTickerBatch(ctx context.Context) (map[string]Ticker, error) {
var response [][]interface{}
path := bitfinexAPIVersion2 + bitfinexTickerBatch +
"?symbols=ALL"
err := b.SendHTTPRequest(exchange.RestSpot, path, &response, tickerBatch)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, tickerBatch)
if err != nil {
return nil, err
}
@@ -549,12 +551,12 @@ func (b *Bitfinex) GetTickerBatch() (map[string]Ticker, error) {
}
// GetTicker returns ticker information for one symbol
func (b *Bitfinex) GetTicker(symbol string) (Ticker, error) {
func (b *Bitfinex) GetTicker(ctx context.Context, symbol string) (Ticker, error) {
var response []interface{}
path := bitfinexAPIVersion2 + bitfinexTicker + symbol
err := b.SendHTTPRequest(exchange.RestSpot, path, &response, tickerFunction)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, tickerFunction)
if err != nil {
return Ticker{}, err
}
@@ -597,7 +599,7 @@ func (b *Bitfinex) GetTicker(symbol string) (Ticker, error) {
// timestampStart is a millisecond timestamp
// timestampEnd is a millisecond timestamp
// reOrderResp reorders the returned data.
func (b *Bitfinex) GetTrades(currencyPair string, limit, timestampStart, timestampEnd int64, reOrderResp bool) ([]Trade, error) {
func (b *Bitfinex) GetTrades(ctx context.Context, currencyPair string, limit, timestampStart, timestampEnd int64, reOrderResp bool) ([]Trade, error) {
v := url.Values{}
if limit > 0 {
v.Set("limit", strconv.FormatInt(limit, 10))
@@ -619,7 +621,7 @@ func (b *Bitfinex) GetTrades(currencyPair string, limit, timestampStart, timesta
path := bitfinexAPIVersion2 + bitfinexTrades + currencyPair + "/hist" + "?" + v.Encode()
var resp [][]interface{}
err := b.SendHTTPRequest(exchange.RestSpot, path, &resp, tradeRateLimit)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &resp, tradeRateLimit)
if err != nil {
return nil, err
}
@@ -663,14 +665,14 @@ func (b *Bitfinex) GetTrades(currencyPair string, limit, timestampStart, timesta
// precision - P0,P1,P2,P3,R0
// Values can contain limit amounts for both the asks and bids - Example
// "len" = 100
func (b *Bitfinex) GetOrderbook(symbol, precision string, limit int64) (Orderbook, error) {
func (b *Bitfinex) GetOrderbook(ctx context.Context, symbol, precision string, limit int64) (Orderbook, error) {
var u = url.Values{}
if limit > 0 {
u.Set("len", strconv.FormatInt(limit, 10))
}
path := bitfinexAPIVersion2 + bitfinexOrderbook + symbol + "/" + precision + "?" + u.Encode()
var response [][]interface{}
err := b.SendHTTPRequest(exchange.RestSpot, path, &response, orderbookFunction)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, orderbookFunction)
if err != nil {
return Orderbook{}, err
}
@@ -739,10 +741,10 @@ func (b *Bitfinex) GetOrderbook(symbol, precision string, limit int64) (Orderboo
}
// GetStats returns various statistics about the requested pair
func (b *Bitfinex) GetStats(symbol string) ([]Stat, error) {
func (b *Bitfinex) GetStats(ctx context.Context, symbol string) ([]Stat, error) {
var response []Stat
path := bitfinexAPIVersion + bitfinexStats + symbol
return response, b.SendHTTPRequest(exchange.RestSpot, path, &response, statsV1)
return response, b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, statsV1)
}
// GetFundingBook the entire margin funding book for both bids and asks sides
@@ -750,11 +752,11 @@ func (b *Bitfinex) GetStats(symbol string) ([]Stat, error) {
// symbol - example "USD"
// WARNING: Orderbook now has this support, will be deprecated once a full
// conversion to full V2 API update is done.
func (b *Bitfinex) GetFundingBook(symbol string) (FundingBook, error) {
func (b *Bitfinex) GetFundingBook(ctx context.Context, symbol string) (FundingBook, error) {
response := FundingBook{}
path := bitfinexAPIVersion + bitfinexLendbook + symbol
if err := b.SendHTTPRequest(exchange.RestSpot, path, &response, fundingbook); err != nil {
if err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, fundingbook); err != nil {
return response, err
}
@@ -765,20 +767,20 @@ func (b *Bitfinex) GetFundingBook(symbol string) (FundingBook, error) {
// currency: total amount provided and Flash Return Rate (in % by 365 days)
// over time
// Symbol - example "USD"
func (b *Bitfinex) GetLends(symbol string, values url.Values) ([]Lends, error) {
func (b *Bitfinex) GetLends(ctx context.Context, symbol string, values url.Values) ([]Lends, error) {
var response []Lends
path := common.EncodeURLValues(bitfinexAPIVersion+
bitfinexLends+
symbol,
values)
return response, b.SendHTTPRequest(exchange.RestSpot, path, &response, lends)
return response, b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, lends)
}
// GetCandles returns candle chart data
// timeFrame values: '1m', '5m', '15m', '30m', '1h', '3h', '6h', '12h', '1D',
// '7D', '14D', '1M'
// section values: last or hist
func (b *Bitfinex) GetCandles(symbol, timeFrame string, start, end int64, limit uint32, historic bool) ([]Candle, error) {
func (b *Bitfinex) GetCandles(ctx context.Context, symbol, timeFrame string, start, end int64, limit uint32, historic bool) ([]Candle, error) {
var fundingPeriod string
if symbol[0] == 'f' {
fundingPeriod = ":p30"
@@ -812,7 +814,7 @@ func (b *Bitfinex) GetCandles(symbol, timeFrame string, start, end int64, limit
}
var response [][]interface{}
err := b.SendHTTPRequest(exchange.RestSpot, path, &response, candle)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, candle)
if err != nil {
return nil, err
}
@@ -835,7 +837,7 @@ func (b *Bitfinex) GetCandles(symbol, timeFrame string, start, end int64, limit
path += "/last"
var response []interface{}
err := b.SendHTTPRequest(exchange.RestSpot, path, &response, candle)
err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &response, candle)
if err != nil {
return nil, err
}
@@ -879,7 +881,7 @@ func (b *Bitfinex) GetLiquidationFeed() error {
// profit
// Allowed time frames are 3h, 1w and 1M
// Allowed symbols are trading pairs (e.g. tBTCUSD, tETHUSD and tGLOBAL:USD)
func (b *Bitfinex) GetLeaderboard(key, timeframe, symbol string, sort, limit int, start, end string) ([]LeaderboardEntry, error) {
func (b *Bitfinex) GetLeaderboard(ctx context.Context, key, timeframe, symbol string, sort, limit int, start, end string) ([]LeaderboardEntry, error) {
validLeaderboardKey := func(input string) bool {
switch input {
case LeaderboardUnrealisedProfitPeriodDelta,
@@ -915,7 +917,7 @@ func (b *Bitfinex) GetLeaderboard(key, timeframe, symbol string, sort, limit int
}
path = common.EncodeURLValues(path, vals)
var resp []interface{}
if err := b.SendHTTPRequest(exchange.RestSpot, path, &resp, leaderBoardReqRate); err != nil {
if err := b.SendHTTPRequest(ctx, exchange.RestSpot, path, &resp, leaderBoardReqRate); err != nil {
return nil, err
}
@@ -953,9 +955,9 @@ func (b *Bitfinex) GetForeignExchangeRate() error {
}
// GetAccountFees returns information about your account trading fees
func (b *Bitfinex) GetAccountFees() ([]AccountInfo, error) {
func (b *Bitfinex) GetAccountFees(ctx context.Context) ([]AccountInfo, error) {
var responses []AccountInfo
return responses, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return responses, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexAccountInfo,
nil,
&responses,
@@ -963,9 +965,9 @@ func (b *Bitfinex) GetAccountFees() ([]AccountInfo, error) {
}
// GetWithdrawalFees - Gets all fee rates for withdrawals
func (b *Bitfinex) GetWithdrawalFees() (AccountFees, error) {
func (b *Bitfinex) GetWithdrawalFees(ctx context.Context) (AccountFees, error) {
response := AccountFees{}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexAccountFees,
nil,
&response,
@@ -974,10 +976,10 @@ func (b *Bitfinex) GetWithdrawalFees() (AccountFees, error) {
// GetAccountSummary returns a 30-day summary of your trading volume and return
// on margin funding
func (b *Bitfinex) GetAccountSummary() (AccountSummary, error) {
func (b *Bitfinex) GetAccountSummary(ctx context.Context) (AccountSummary, error) {
response := AccountSummary{}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexAccountSummary,
nil,
&response,
@@ -989,7 +991,7 @@ func (b *Bitfinex) GetAccountSummary() (AccountSummary, error) {
// “tethers", "ethereumc", "zcash", "monero", "iota", "bcash"
// WalletName - accepted: “trading”, “exchange”, “deposit”
// renew - Default is 0. If set to 1, will return a new unused deposit address
func (b *Bitfinex) NewDeposit(method, walletName string, renew int) (DepositResponse, error) {
func (b *Bitfinex) NewDeposit(ctx context.Context, method, walletName string, renew int) (DepositResponse, error) {
if !common.StringDataCompare(AcceptedWalletNames, walletName) {
return DepositResponse{},
fmt.Errorf("walletname: [%s] is not allowed, supported: %s",
@@ -1003,7 +1005,7 @@ func (b *Bitfinex) NewDeposit(method, walletName string, renew int) (DepositResp
req["wallet_name"] = walletName
req["renew"] = renew
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexDeposit,
req,
&response,
@@ -1012,9 +1014,9 @@ func (b *Bitfinex) NewDeposit(method, walletName string, renew int) (DepositResp
// GetKeyPermissions checks the permissions of the key being used to generate
// this request.
func (b *Bitfinex) GetKeyPermissions() (KeyPermissions, error) {
func (b *Bitfinex) GetKeyPermissions(ctx context.Context) (KeyPermissions, error) {
response := KeyPermissions{}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexKeyPermissions,
nil,
&response,
@@ -1022,9 +1024,9 @@ func (b *Bitfinex) GetKeyPermissions() (KeyPermissions, error) {
}
// GetMarginInfo shows your trading wallet information for margin trading
func (b *Bitfinex) GetMarginInfo() ([]MarginInfo, error) {
func (b *Bitfinex) GetMarginInfo(ctx context.Context) ([]MarginInfo, error) {
var response []MarginInfo
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexMarginInfo,
nil,
&response,
@@ -1032,9 +1034,9 @@ func (b *Bitfinex) GetMarginInfo() ([]MarginInfo, error) {
}
// GetAccountBalance returns full wallet balance information
func (b *Bitfinex) GetAccountBalance() ([]Balance, error) {
func (b *Bitfinex) GetAccountBalance(ctx context.Context) ([]Balance, error) {
var response []Balance
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexBalances,
nil,
&response,
@@ -1046,7 +1048,7 @@ func (b *Bitfinex) GetAccountBalance() ([]Balance, error) {
// Currency - example "BTC"
// WalletFrom - example "exchange"
// WalletTo - example "deposit"
func (b *Bitfinex) WalletTransfer(amount float64, currency, walletFrom, walletTo string) (WalletTransfer, error) {
func (b *Bitfinex) WalletTransfer(ctx context.Context, amount float64, currency, walletFrom, walletTo string) (WalletTransfer, error) {
var response []WalletTransfer
req := make(map[string]interface{})
req["amount"] = strconv.FormatFloat(amount, 'f', -1, 64)
@@ -1054,7 +1056,7 @@ func (b *Bitfinex) WalletTransfer(amount float64, currency, walletFrom, walletTo
req["walletfrom"] = walletFrom
req["walletto"] = walletTo
err := b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexTransfer,
req,
&response,
@@ -1071,7 +1073,7 @@ func (b *Bitfinex) WalletTransfer(amount float64, currency, walletFrom, walletTo
// WithdrawCryptocurrency requests a withdrawal from one of your wallets.
// For FIAT, use WithdrawFIAT
func (b *Bitfinex) WithdrawCryptocurrency(wallet, address, paymentID string, amount float64, c currency.Code) (Withdrawal, error) {
func (b *Bitfinex) WithdrawCryptocurrency(ctx context.Context, wallet, address, paymentID string, amount float64, c currency.Code) (Withdrawal, error) {
var response []Withdrawal
req := make(map[string]interface{})
req["withdraw_type"] = b.ConvertSymbolToWithdrawalType(c)
@@ -1082,7 +1084,7 @@ func (b *Bitfinex) WithdrawCryptocurrency(wallet, address, paymentID string, amo
req["payment_id"] = paymentID
}
err := b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexWithdrawal,
req,
&response,
@@ -1099,7 +1101,7 @@ func (b *Bitfinex) WithdrawCryptocurrency(wallet, address, paymentID string, amo
}
// WithdrawFIAT Sends an authenticated request to withdraw FIAT currency
func (b *Bitfinex) WithdrawFIAT(withdrawalType, walletType string, withdrawRequest *withdraw.Request) (Withdrawal, error) {
func (b *Bitfinex) WithdrawFIAT(ctx context.Context, withdrawalType, walletType string, withdrawRequest *withdraw.Request) (Withdrawal, error) {
var response []Withdrawal
req := make(map[string]interface{})
@@ -1127,7 +1129,7 @@ func (b *Bitfinex) WithdrawFIAT(withdrawalType, walletType string, withdrawReque
req["intermediary_bank_swift"] = withdrawRequest.Fiat.IntermediarySwiftCode
}
err := b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
err := b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexWithdrawal,
req,
&response,
@@ -1145,7 +1147,7 @@ func (b *Bitfinex) WithdrawFIAT(withdrawalType, walletType string, withdrawReque
// NewOrder submits a new order and returns a order information
// Major Upgrade needed on this function to include all query params
func (b *Bitfinex) NewOrder(currencyPair, orderType string, amount, price float64, buy, hidden bool) (Order, error) {
func (b *Bitfinex) NewOrder(ctx context.Context, currencyPair, orderType string, amount, price float64, buy, hidden bool) (Order, error) {
if !common.StringDataCompare(AcceptedOrderType, orderType) {
return Order{}, fmt.Errorf("order type %s not accepted", orderType)
}
@@ -1162,7 +1164,7 @@ func (b *Bitfinex) NewOrder(currencyPair, orderType string, amount, price float6
req["side"] = order.Buy.Lower()
}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderNew,
req,
&response,
@@ -1170,12 +1172,12 @@ func (b *Bitfinex) NewOrder(currencyPair, orderType string, amount, price float6
}
// NewOrderMulti allows several new orders at once
func (b *Bitfinex) NewOrderMulti(orders []PlaceOrder) (OrderMultiResponse, error) {
func (b *Bitfinex) NewOrderMulti(ctx context.Context, orders []PlaceOrder) (OrderMultiResponse, error) {
response := OrderMultiResponse{}
req := make(map[string]interface{})
req["orders"] = orders
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderNewMulti,
req,
&response,
@@ -1183,12 +1185,12 @@ func (b *Bitfinex) NewOrderMulti(orders []PlaceOrder) (OrderMultiResponse, error
}
// CancelExistingOrder cancels a single order by OrderID
func (b *Bitfinex) CancelExistingOrder(orderID int64) (Order, error) {
func (b *Bitfinex) CancelExistingOrder(ctx context.Context, orderID int64) (Order, error) {
response := Order{}
req := make(map[string]interface{})
req["order_id"] = orderID
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderCancel,
req,
&response,
@@ -1196,12 +1198,12 @@ func (b *Bitfinex) CancelExistingOrder(orderID int64) (Order, error) {
}
// CancelMultipleOrders cancels multiple orders
func (b *Bitfinex) CancelMultipleOrders(orderIDs []int64) (string, error) {
func (b *Bitfinex) CancelMultipleOrders(ctx context.Context, orderIDs []int64) (string, error) {
response := GenericResponse{}
req := make(map[string]interface{})
req["order_ids"] = orderIDs
return response.Result, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response.Result, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderCancelMulti,
req,
nil,
@@ -1209,10 +1211,10 @@ func (b *Bitfinex) CancelMultipleOrders(orderIDs []int64) (string, error) {
}
// CancelAllExistingOrders cancels all active and open orders
func (b *Bitfinex) CancelAllExistingOrders() (string, error) {
func (b *Bitfinex) CancelAllExistingOrders(ctx context.Context) (string, error) {
response := GenericResponse{}
return response.Result, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response.Result, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderCancelAll,
nil,
nil,
@@ -1220,7 +1222,7 @@ func (b *Bitfinex) CancelAllExistingOrders() (string, error) {
}
// ReplaceOrder replaces an older order with a new order
func (b *Bitfinex) ReplaceOrder(orderID int64, symbol string, amount, price float64, buy bool, orderType string, hidden bool) (Order, error) {
func (b *Bitfinex) ReplaceOrder(ctx context.Context, orderID int64, symbol string, amount, price float64, buy bool, orderType string, hidden bool) (Order, error) {
response := Order{}
req := make(map[string]interface{})
req["order_id"] = orderID
@@ -1237,7 +1239,7 @@ func (b *Bitfinex) ReplaceOrder(orderID int64, symbol string, amount, price floa
req["side"] = order.Sell.Lower()
}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderCancelReplace,
req,
&response,
@@ -1245,12 +1247,12 @@ func (b *Bitfinex) ReplaceOrder(orderID int64, symbol string, amount, price floa
}
// GetOrderStatus returns order status information
func (b *Bitfinex) GetOrderStatus(orderID int64) (Order, error) {
func (b *Bitfinex) GetOrderStatus(ctx context.Context, orderID int64) (Order, error) {
orderStatus := Order{}
req := make(map[string]interface{})
req["order_id"] = orderID
return orderStatus, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return orderStatus, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderStatus,
req,
&orderStatus,
@@ -1258,12 +1260,12 @@ func (b *Bitfinex) GetOrderStatus(orderID int64) (Order, error) {
}
// GetInactiveOrders returns order status information
func (b *Bitfinex) GetInactiveOrders() ([]Order, error) {
func (b *Bitfinex) GetInactiveOrders(ctx context.Context) ([]Order, error) {
var response []Order
req := make(map[string]interface{})
req["limit"] = "100"
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexInactiveOrders,
req,
&response,
@@ -1271,9 +1273,9 @@ func (b *Bitfinex) GetInactiveOrders() ([]Order, error) {
}
// GetOpenOrders returns all active orders and statuses
func (b *Bitfinex) GetOpenOrders() ([]Order, error) {
func (b *Bitfinex) GetOpenOrders(ctx context.Context) ([]Order, error) {
var response []Order
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrders,
nil,
&response,
@@ -1281,10 +1283,10 @@ func (b *Bitfinex) GetOpenOrders() ([]Order, error) {
}
// GetActivePositions returns an array of active positions
func (b *Bitfinex) GetActivePositions() ([]Position, error) {
func (b *Bitfinex) GetActivePositions(ctx context.Context) ([]Position, error) {
var response []Position
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexPositions,
nil,
&response,
@@ -1292,12 +1294,12 @@ func (b *Bitfinex) GetActivePositions() ([]Position, error) {
}
// ClaimPosition allows positions to be claimed
func (b *Bitfinex) ClaimPosition(positionID int) (Position, error) {
func (b *Bitfinex) ClaimPosition(ctx context.Context, positionID int) (Position, error) {
response := Position{}
req := make(map[string]interface{})
req["position_id"] = positionID
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexClaimPosition,
nil,
nil,
@@ -1305,7 +1307,7 @@ func (b *Bitfinex) ClaimPosition(positionID int) (Position, error) {
}
// GetBalanceHistory returns balance history for the account
func (b *Bitfinex) GetBalanceHistory(symbol string, timeSince, timeUntil time.Time, limit int, wallet string) ([]BalanceHistory, error) {
func (b *Bitfinex) GetBalanceHistory(ctx context.Context, symbol string, timeSince, timeUntil time.Time, limit int, wallet string) ([]BalanceHistory, error) {
var response []BalanceHistory
req := make(map[string]interface{})
req["currency"] = symbol
@@ -1323,7 +1325,7 @@ func (b *Bitfinex) GetBalanceHistory(symbol string, timeSince, timeUntil time.Ti
req["wallet"] = wallet
}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexHistory,
req,
&response,
@@ -1331,7 +1333,7 @@ func (b *Bitfinex) GetBalanceHistory(symbol string, timeSince, timeUntil time.Ti
}
// GetMovementHistory returns an array of past deposits and withdrawals
func (b *Bitfinex) GetMovementHistory(symbol, method string, timeSince, timeUntil time.Time, limit int) ([]MovementHistory, error) {
func (b *Bitfinex) GetMovementHistory(ctx context.Context, symbol, method string, timeSince, timeUntil time.Time, limit int) ([]MovementHistory, error) {
var response []MovementHistory
req := make(map[string]interface{})
req["currency"] = symbol
@@ -1349,7 +1351,7 @@ func (b *Bitfinex) GetMovementHistory(symbol, method string, timeSince, timeUnti
req["limit"] = limit
}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexHistoryMovements,
req,
&response,
@@ -1357,7 +1359,7 @@ func (b *Bitfinex) GetMovementHistory(symbol, method string, timeSince, timeUnti
}
// GetTradeHistory returns past executed trades
func (b *Bitfinex) GetTradeHistory(currencyPair string, timestamp, until time.Time, limit, reverse int) ([]TradeHistory, error) {
func (b *Bitfinex) GetTradeHistory(ctx context.Context, currencyPair string, timestamp, until time.Time, limit, reverse int) ([]TradeHistory, error) {
var response []TradeHistory
req := make(map[string]interface{})
req["currency"] = currencyPair
@@ -1373,7 +1375,7 @@ func (b *Bitfinex) GetTradeHistory(currencyPair string, timestamp, until time.Ti
req["reverse"] = reverse
}
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexTradeHistory,
req,
&response,
@@ -1381,7 +1383,7 @@ func (b *Bitfinex) GetTradeHistory(currencyPair string, timestamp, until time.Ti
}
// NewOffer submits a new offer
func (b *Bitfinex) NewOffer(symbol string, amount, rate float64, period int64, direction string) (Offer, error) {
func (b *Bitfinex) NewOffer(ctx context.Context, symbol string, amount, rate float64, period int64, direction string) (Offer, error) {
response := Offer{}
req := make(map[string]interface{})
req["currency"] = symbol
@@ -1390,7 +1392,7 @@ func (b *Bitfinex) NewOffer(symbol string, amount, rate float64, period int64, d
req["period"] = period
req["direction"] = direction
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOfferNew,
req,
&response,
@@ -1398,12 +1400,12 @@ func (b *Bitfinex) NewOffer(symbol string, amount, rate float64, period int64, d
}
// CancelOffer cancels offer by offerID
func (b *Bitfinex) CancelOffer(offerID int64) (Offer, error) {
func (b *Bitfinex) CancelOffer(ctx context.Context, offerID int64) (Offer, error) {
response := Offer{}
req := make(map[string]interface{})
req["offer_id"] = offerID
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOfferCancel,
req,
&response,
@@ -1412,12 +1414,12 @@ func (b *Bitfinex) CancelOffer(offerID int64) (Offer, error) {
// GetOfferStatus checks offer status whether it has been cancelled, execute or
// is still active
func (b *Bitfinex) GetOfferStatus(offerID int64) (Offer, error) {
func (b *Bitfinex) GetOfferStatus(ctx context.Context, offerID int64) (Offer, error) {
response := Offer{}
req := make(map[string]interface{})
req["offer_id"] = offerID
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOrderStatus,
req,
&response,
@@ -1425,10 +1427,10 @@ func (b *Bitfinex) GetOfferStatus(offerID int64) (Offer, error) {
}
// GetActiveCredits returns all available credits
func (b *Bitfinex) GetActiveCredits() ([]Offer, error) {
func (b *Bitfinex) GetActiveCredits(ctx context.Context) ([]Offer, error) {
var response []Offer
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexActiveCredits,
nil,
&response,
@@ -1436,10 +1438,10 @@ func (b *Bitfinex) GetActiveCredits() ([]Offer, error) {
}
// GetActiveOffers returns all current active offers
func (b *Bitfinex) GetActiveOffers() ([]Offer, error) {
func (b *Bitfinex) GetActiveOffers(ctx context.Context) ([]Offer, error) {
var response []Offer
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexOffers,
nil,
&response,
@@ -1447,10 +1449,10 @@ func (b *Bitfinex) GetActiveOffers() ([]Offer, error) {
}
// GetActiveMarginFunding returns an array of active margin funds
func (b *Bitfinex) GetActiveMarginFunding() ([]MarginFunds, error) {
func (b *Bitfinex) GetActiveMarginFunding(ctx context.Context) ([]MarginFunds, error) {
var response []MarginFunds
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexMarginActiveFunds,
nil,
&response,
@@ -1459,10 +1461,10 @@ func (b *Bitfinex) GetActiveMarginFunding() ([]MarginFunds, error) {
// GetUnusedMarginFunds returns an array of funding borrowed but not currently
// used
func (b *Bitfinex) GetUnusedMarginFunds() ([]MarginFunds, error) {
func (b *Bitfinex) GetUnusedMarginFunds(ctx context.Context) ([]MarginFunds, error) {
var response []MarginFunds
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexMarginUnusedFunds,
nil,
&response,
@@ -1471,10 +1473,10 @@ func (b *Bitfinex) GetUnusedMarginFunds() ([]MarginFunds, error) {
// GetMarginTotalTakenFunds returns an array of active funding used in a
// position
func (b *Bitfinex) GetMarginTotalTakenFunds() ([]MarginTotalTakenFunds, error) {
func (b *Bitfinex) GetMarginTotalTakenFunds(ctx context.Context) ([]MarginTotalTakenFunds, error) {
var response []MarginTotalTakenFunds
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexMarginTotalFunds,
nil,
&response,
@@ -1482,12 +1484,12 @@ func (b *Bitfinex) GetMarginTotalTakenFunds() ([]MarginTotalTakenFunds, error) {
}
// CloseMarginFunding closes an unused or used taken fund
func (b *Bitfinex) CloseMarginFunding(swapID int64) (Offer, error) {
func (b *Bitfinex) CloseMarginFunding(ctx context.Context, swapID int64) (Offer, error) {
response := Offer{}
req := make(map[string]interface{})
req["swap_id"] = swapID
return response, b.SendAuthenticatedHTTPRequest(exchange.RestSpot, http.MethodPost,
return response, b.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost,
bitfinexMarginClose,
req,
&response,
@@ -1495,7 +1497,7 @@ func (b *Bitfinex) CloseMarginFunding(swapID int64) (Offer, error) {
}
// SendHTTPRequest sends an unauthenticated request
func (b *Bitfinex) SendHTTPRequest(ep exchange.URL, path string, result interface{}, e request.EndpointLimit) error {
func (b *Bitfinex) SendHTTPRequest(ctx context.Context, ep exchange.URL, path string, result interface{}, e request.EndpointLimit) error {
endpoint, err := b.API.Endpoints.GetURL(ep)
if err != nil {
return err
@@ -1508,14 +1510,14 @@ func (b *Bitfinex) SendHTTPRequest(ep exchange.URL, path string, result interfac
HTTPDebugging: b.HTTPDebugging,
HTTPRecording: b.HTTPRecording}
return b.SendPayload(context.Background(), e, func() (*request.Item, error) {
return b.SendPayload(ctx, e, func() (*request.Item, error) {
return item, nil
})
}
// SendAuthenticatedHTTPRequest sends an autheticated http request and json
// unmarshals result to a supplied variable
func (b *Bitfinex) SendAuthenticatedHTTPRequest(ep exchange.URL, method, path string, params map[string]interface{}, result interface{}, endpoint request.EndpointLimit) error {
func (b *Bitfinex) SendAuthenticatedHTTPRequest(ctx context.Context, ep exchange.URL, method, path string, params map[string]interface{}, result interface{}, endpoint request.EndpointLimit) error {
if !b.AllowAuthenticatedRequest() {
return fmt.Errorf("%s %w", b.Name, exchange.ErrAuthenticatedRequestWithoutCredentialsSet)
}
@@ -1526,7 +1528,7 @@ func (b *Bitfinex) SendAuthenticatedHTTPRequest(ep exchange.URL, method, path st
}
fullPath := ePoint + bitfinexAPIVersion + path
return b.SendPayload(context.Background(), endpoint, func() (*request.Item, error) {
return b.SendPayload(ctx, endpoint, func() (*request.Item, error) {
n := b.Requester.GetNonce(true)
req := make(map[string]interface{})
req["request"] = bitfinexAPIVersion + path
@@ -1568,7 +1570,7 @@ func (b *Bitfinex) SendAuthenticatedHTTPRequest(ep exchange.URL, method, path st
// SendAuthenticatedHTTPRequestV2 sends an autheticated http request and json
// unmarshals result to a supplied variable
func (b *Bitfinex) SendAuthenticatedHTTPRequestV2(ep exchange.URL, method, path string, params map[string]interface{}, result interface{}, endpoint request.EndpointLimit) error {
func (b *Bitfinex) SendAuthenticatedHTTPRequestV2(ctx context.Context, ep exchange.URL, method, path string, params map[string]interface{}, result interface{}, endpoint request.EndpointLimit) error {
if !b.AllowAuthenticatedRequest() {
return fmt.Errorf("%s %w", b.Name, exchange.ErrAuthenticatedRequestWithoutCredentialsSet)
}
@@ -1577,7 +1579,7 @@ func (b *Bitfinex) SendAuthenticatedHTTPRequestV2(ep exchange.URL, method, path
return err
}
return b.SendPayload(context.Background(), endpoint, func() (*request.Item, error) {
return b.SendPayload(ctx, endpoint, func() (*request.Item, error) {
var body io.Reader
var payload []byte
if len(params) != 0 {
@@ -1623,12 +1625,12 @@ func (b *Bitfinex) SendAuthenticatedHTTPRequestV2(ep exchange.URL, method, path
}
// GetFee returns an estimate of fee based on type of transaction
func (b *Bitfinex) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) {
func (b *Bitfinex) GetFee(ctx context.Context, feeBuilder *exchange.FeeBuilder) (float64, error) {
var fee float64
switch feeBuilder.FeeType {
case exchange.CryptocurrencyTradeFee:
accountInfos, err := b.GetAccountFees()
accountInfos, err := b.GetAccountFees(ctx)
if err != nil {
return 0, err
}
@@ -1644,7 +1646,7 @@ func (b *Bitfinex) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) {
//TODO: fee is charged when < $1000USD is transferred, need to infer value in some way
fee = 0
case exchange.CryptocurrencyWithdrawalFee:
acc, err := b.GetWithdrawalFees()
acc, err := b.GetWithdrawalFees(ctx)
if err != nil {
return 0, err
}
@@ -1761,8 +1763,8 @@ func (b *Bitfinex) ConvertSymbolToWithdrawalType(c currency.Code) string {
}
// ConvertSymbolToDepositMethod returns a converted currency deposit method
func (b *Bitfinex) ConvertSymbolToDepositMethod(c currency.Code) (string, error) {
if err := b.PopulateAcceptableMethods(); err != nil {
func (b *Bitfinex) ConvertSymbolToDepositMethod(ctx context.Context, c currency.Code) (string, error) {
if err := b.PopulateAcceptableMethods(ctx); err != nil {
return "", err
}
method, ok := AcceptableMethods[c.String()]
@@ -1776,10 +1778,10 @@ func (b *Bitfinex) ConvertSymbolToDepositMethod(c currency.Code) (string, error)
// PopulateAcceptableMethods retrieves all accepted currency strings and
// populates a map to check
func (b *Bitfinex) PopulateAcceptableMethods() error {
func (b *Bitfinex) PopulateAcceptableMethods(ctx context.Context) error {
if len(AcceptableMethods) == 0 {
var response [][][2]string
err := b.SendHTTPRequest(exchange.RestSpot,
err := b.SendHTTPRequest(ctx, exchange.RestSpot,
bitfinexAPIVersion2+bitfinexDepositMethod,
&response,
configs)

View File

@@ -1,6 +1,7 @@
package bitfinex
import (
"context"
"log"
"net/http"
"os"
@@ -65,7 +66,7 @@ func TestGetV2MarginFunding(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("api keys are not set or invalid")
}
_, err := b.GetV2MarginFunding("fUSD", "2", 2)
_, err := b.GetV2MarginFunding(context.Background(), "fUSD", "2", 2)
if err != nil {
t.Error(err)
}
@@ -75,15 +76,15 @@ func TestGetV2MarginInfo(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("api keys are not set or invalid")
}
_, err := b.GetV2MarginInfo("base")
_, err := b.GetV2MarginInfo(context.Background(), "base")
if err != nil {
t.Error(err)
}
_, err = b.GetV2MarginInfo("tBTCUSD")
_, err = b.GetV2MarginInfo(context.Background(), "tBTCUSD")
if err != nil {
t.Error(err)
}
_, err = b.GetV2MarginInfo("sym_all")
_, err = b.GetV2MarginInfo(context.Background(), "sym_all")
if err != nil {
t.Error(err)
}
@@ -94,7 +95,7 @@ func TestGetAccountInfoV2(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("api keys are not set or invalid")
}
_, err := b.GetAccountInfoV2()
_, err := b.GetAccountInfoV2(context.Background())
if err != nil {
t.Error(err)
}
@@ -104,7 +105,7 @@ func TestGetV2FundingInfo(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("api keys are not set or invalid")
}
_, err := b.GetV2FundingInfo("fUST")
_, err := b.GetV2FundingInfo(context.Background(), "fUST")
if err != nil {
t.Error(err)
}
@@ -115,7 +116,7 @@ func TestGetV2Balances(t *testing.T) {
if !areTestAPIKeysSet() {
t.Skip("api keys are not set or invalid")
}
_, err := b.GetV2Balances()
_, err := b.GetV2Balances(context.Background())
if err != nil {
t.Error(err)
}
@@ -123,7 +124,7 @@ func TestGetV2Balances(t *testing.T) {
func TestGetDerivativeStatusInfo(t *testing.T) {
t.Parallel()
_, err := b.GetDerivativeStatusInfo("ALL", "", "", 0, 0)
_, err := b.GetDerivativeStatusInfo(context.Background(), "ALL", "", "", 0, 0)
if err != nil {
t.Error(err)
}
@@ -131,7 +132,7 @@ func TestGetDerivativeStatusInfo(t *testing.T) {
func TestGetMarginPairs(t *testing.T) {
t.Parallel()
_, err := b.GetMarginPairs()
_, err := b.GetMarginPairs(context.Background())
if err != nil {
t.Error(err)
}
@@ -162,7 +163,7 @@ func TestAppendOptionalDelimiter(t *testing.T) {
func TestGetPlatformStatus(t *testing.T) {
t.Parallel()
result, err := b.GetPlatformStatus()
result, err := b.GetPlatformStatus(context.Background())
if err != nil {
t.Errorf("TestGetPlatformStatus error: %s", err)
}
@@ -174,7 +175,7 @@ func TestGetPlatformStatus(t *testing.T) {
func TestGetTickerBatch(t *testing.T) {
t.Parallel()
_, err := b.GetTickerBatch()
_, err := b.GetTickerBatch(context.Background())
if err != nil {
t.Error(err)
}
@@ -182,12 +183,12 @@ func TestGetTickerBatch(t *testing.T) {
func TestGetTicker(t *testing.T) {
t.Parallel()
_, err := b.GetTicker("tBTCUSD")
_, err := b.GetTicker(context.Background(), "tBTCUSD")
if err != nil {
t.Error(err)
}
_, err = b.GetTicker("fUSD")
_, err = b.GetTicker(context.Background(), "fUSD")
if err != nil {
t.Error(err)
}
@@ -196,7 +197,7 @@ func TestGetTicker(t *testing.T) {
func TestGetTrades(t *testing.T) {
t.Parallel()
_, err := b.GetTrades("tBTCUSD", 5, 0, 0, false)
_, err := b.GetTrades(context.Background(), "tBTCUSD", 5, 0, 0, false)
if err != nil {
t.Error(err)
}
@@ -204,27 +205,27 @@ func TestGetTrades(t *testing.T) {
func TestGetOrderbook(t *testing.T) {
t.Parallel()
_, err := b.GetOrderbook("tBTCUSD", "R0", 1)
_, err := b.GetOrderbook(context.Background(), "tBTCUSD", "R0", 1)
if err != nil {
t.Error(err)
}
_, err = b.GetOrderbook("fUSD", "R0", 1)
_, err = b.GetOrderbook(context.Background(), "fUSD", "R0", 1)
if err != nil {
t.Error(err)
}
_, err = b.GetOrderbook("tBTCUSD", "P0", 1)
_, err = b.GetOrderbook(context.Background(), "tBTCUSD", "P0", 1)
if err != nil {
t.Error(err)
}
_, err = b.GetOrderbook("fUSD", "P0", 1)
_, err = b.GetOrderbook(context.Background(), "fUSD", "P0", 1)
if err != nil {
t.Error(err)
}
_, err = b.GetOrderbook("tLINK:UST", "P0", 1)
_, err = b.GetOrderbook(context.Background(), "tLINK:UST", "P0", 1)
if err != nil {
t.Error(err)
}
@@ -232,7 +233,7 @@ func TestGetOrderbook(t *testing.T) {
func TestGetStats(t *testing.T) {
t.Parallel()
_, err := b.GetStats("btcusd")
_, err := b.GetStats(context.Background(), "btcusd")
if err != nil {
t.Error(err)
}
@@ -240,7 +241,7 @@ func TestGetStats(t *testing.T) {
func TestGetFundingBook(t *testing.T) {
t.Parallel()
_, err := b.GetFundingBook("usd")
_, err := b.GetFundingBook(context.Background(), "usd")
if err != nil {
t.Error(err)
}
@@ -248,7 +249,7 @@ func TestGetFundingBook(t *testing.T) {
func TestGetLends(t *testing.T) {
t.Parallel()
_, err := b.GetLends("usd", nil)
_, err := b.GetLends(context.Background(), "usd", nil)
if err != nil {
t.Error(err)
}
@@ -256,7 +257,7 @@ func TestGetLends(t *testing.T) {
func TestGetCandles(t *testing.T) {
t.Parallel()
_, err := b.GetCandles("fUSD", "1m", 0, 0, 10, true)
_, err := b.GetCandles(context.Background(), "fUSD", "1m", 0, 0, 10, true)
if err != nil {
t.Fatal(err)
}
@@ -265,12 +266,13 @@ func TestGetCandles(t *testing.T) {
func TestGetLeaderboard(t *testing.T) {
t.Parallel()
// Test invalid key
_, err := b.GetLeaderboard("", "", "", 0, 0, "", "")
_, err := b.GetLeaderboard(context.Background(), "", "", "", 0, 0, "", "")
if err == nil {
t.Error("an error should have been thrown for an invalid key")
}
// Test default
_, err = b.GetLeaderboard(LeaderboardUnrealisedProfitInception,
_, err = b.GetLeaderboard(context.Background(),
LeaderboardUnrealisedProfitInception,
"1M",
"tGLOBAL:USD",
0,
@@ -282,7 +284,8 @@ func TestGetLeaderboard(t *testing.T) {
}
// Test params
var result []LeaderboardEntry
result, err = b.GetLeaderboard(LeaderboardUnrealisedProfitInception,
result, err = b.GetLeaderboard(context.Background(),
LeaderboardUnrealisedProfitInception,
"1M",
"tGLOBAL:USD",
-1,
@@ -303,7 +306,7 @@ func TestGetAccountFees(t *testing.T) {
}
t.Parallel()
_, err := b.UpdateAccountInfo(asset.Spot)
_, err := b.UpdateAccountInfo(context.Background(), asset.Spot)
if err != nil {
t.Error("GetAccountInfo error", err)
}
@@ -314,7 +317,7 @@ func TestGetWithdrawalFee(t *testing.T) {
t.SkipNow()
}
t.Parallel()
_, err := b.GetWithdrawalFees()
_, err := b.GetWithdrawalFees(context.Background())
if err != nil {
t.Error("GetAccountInfo error", err)
}
@@ -326,7 +329,7 @@ func TestGetAccountSummary(t *testing.T) {
}
t.Parallel()
_, err := b.GetAccountSummary()
_, err := b.GetAccountSummary(context.Background())
if err == nil {
t.Error("GetAccountSummary() Expected error")
}
@@ -337,17 +340,17 @@ func TestNewDeposit(t *testing.T) {
t.SkipNow()
}
t.Parallel()
_, err := b.NewDeposit("blabla", "testwallet", 0)
_, err := b.NewDeposit(context.Background(), "blabla", "testwallet", 0)
if err == nil {
t.Error("NewDeposit() Expected error")
}
_, err = b.NewDeposit("bitcoin", "testwallet", 0)
_, err = b.NewDeposit(context.Background(), "bitcoin", "testwallet", 0)
if err == nil {
t.Error("NewDeposit() Expected error")
}
_, err = b.NewDeposit("bitcoin", "exchange", 0)
_, err = b.NewDeposit(context.Background(), "bitcoin", "exchange", 0)
if err != nil {
t.Error(err)
}
@@ -359,7 +362,7 @@ func TestGetKeyPermissions(t *testing.T) {
}
t.Parallel()
_, err := b.GetKeyPermissions()
_, err := b.GetKeyPermissions(context.Background())
if err != nil {
t.Error(err)
}
@@ -371,7 +374,7 @@ func TestGetMarginInfo(t *testing.T) {
}
t.Parallel()
_, err := b.GetMarginInfo()
_, err := b.GetMarginInfo(context.Background())
if err != nil {
t.Error(err)
}
@@ -383,7 +386,7 @@ func TestGetAccountBalance(t *testing.T) {
}
t.Parallel()
_, err := b.GetAccountBalance()
_, err := b.GetAccountBalance(context.Background())
if err != nil {
t.Error(err)
}
@@ -395,7 +398,7 @@ func TestGetAccountInfo(t *testing.T) {
}
t.Parallel()
_, err := b.FetchAccountInfo(asset.Spot)
_, err := b.FetchAccountInfo(context.Background(), asset.Spot)
if err != nil {
t.Error(err)
}
@@ -407,7 +410,7 @@ func TestWalletTransfer(t *testing.T) {
}
t.Parallel()
_, err := b.WalletTransfer(0.01, "btc", "bla", "bla")
_, err := b.WalletTransfer(context.Background(), 0.01, "btc", "bla", "bla")
if err == nil {
t.Error("error cannot be nil")
}
@@ -419,7 +422,8 @@ func TestNewOrder(t *testing.T) {
}
t.Parallel()
_, err := b.NewOrder("BTCUSD",
_, err := b.NewOrder(context.Background(),
"BTCUSD",
order.Limit.Lower(),
-1,
2,
@@ -436,14 +440,14 @@ func TestUpdateTicker(t *testing.T) {
t.Fatal(err)
}
_, err = b.UpdateTicker(pair, asset.Spot)
_, err = b.UpdateTicker(context.Background(), pair, asset.Spot)
if err != nil {
t.Error(err)
}
}
func TestUpdateTickers(t *testing.T) {
err := b.UpdateTickers(asset.Spot)
err := b.UpdateTickers(context.Background(), asset.Spot)
if err != nil {
t.Error(err)
}
@@ -466,7 +470,7 @@ func TestNewOrderMulti(t *testing.T) {
},
}
_, err := b.NewOrderMulti(newOrder)
_, err := b.NewOrderMulti(context.Background(), newOrder)
if err == nil {
t.Error("NewOrderMulti() Expected error")
}
@@ -478,7 +482,7 @@ func TestCancelOrder(t *testing.T) {
}
t.Parallel()
_, err := b.CancelExistingOrder(1337)
_, err := b.CancelExistingOrder(context.Background(), 1337)
if err == nil {
t.Error("CancelExistingOrder() Expected error")
}
@@ -490,7 +494,7 @@ func TestCancelMultipleOrders(t *testing.T) {
}
t.Parallel()
_, err := b.CancelMultipleOrders([]int64{1337, 1336})
_, err := b.CancelMultipleOrders(context.Background(), []int64{1337, 1336})
if err == nil {
t.Error("CancelMultipleOrders() Expected error")
}
@@ -502,7 +506,7 @@ func TestCancelAllOrders(t *testing.T) {
}
t.Parallel()
_, err := b.CancelAllExistingOrders()
_, err := b.CancelAllExistingOrders(context.Background())
if err == nil {
t.Error("CancelAllExistingOrders() Expected error")
}
@@ -514,7 +518,7 @@ func TestReplaceOrder(t *testing.T) {
}
t.Parallel()
_, err := b.ReplaceOrder(1337, "BTCUSD",
_, err := b.ReplaceOrder(context.Background(), 1337, "BTCUSD",
1, 1, true, order.Limit.Lower(), false)
if err == nil {
t.Error("ReplaceOrder() Expected error")
@@ -527,7 +531,7 @@ func TestGetOrderStatus(t *testing.T) {
}
t.Parallel()
_, err := b.GetOrderStatus(1337)
_, err := b.GetOrderStatus(context.Background(), 1337)
if err == nil {
t.Error("GetOrderStatus() Expected error")
}
@@ -539,7 +543,7 @@ func TestGetOpenOrders(t *testing.T) {
}
t.Parallel()
_, err := b.GetOpenOrders()
_, err := b.GetOpenOrders(context.Background())
if err == nil {
t.Error("GetOpenOrders() Expectederror")
}
@@ -551,7 +555,7 @@ func TestGetActivePositions(t *testing.T) {
}
t.Parallel()
_, err := b.GetActivePositions()
_, err := b.GetActivePositions(context.Background())
if err == nil {
t.Error("GetActivePositions() Expected error")
}
@@ -563,7 +567,7 @@ func TestClaimPosition(t *testing.T) {
}
t.Parallel()
_, err := b.ClaimPosition(1337)
_, err := b.ClaimPosition(context.Background(), 1337)
if err == nil {
t.Error("ClaimPosition() Expected error")
}
@@ -574,7 +578,8 @@ func TestGetBalanceHistory(t *testing.T) {
t.SkipNow()
}
t.Parallel()
_, err := b.GetBalanceHistory("USD", time.Time{}, time.Time{}, 1, "deposit")
_, err := b.GetBalanceHistory(context.Background(),
"USD", time.Time{}, time.Time{}, 1, "deposit")
if err == nil {
t.Error("GetBalanceHistory() Expected error")
}
@@ -586,7 +591,7 @@ func TestGetMovementHistory(t *testing.T) {
}
t.Parallel()
_, err := b.GetMovementHistory("USD", "bitcoin", time.Time{}, time.Time{}, 1)
_, err := b.GetMovementHistory(context.Background(), "USD", "bitcoin", time.Time{}, time.Time{}, 1)
if err == nil {
t.Error("GetMovementHistory() Expected error")
}
@@ -597,7 +602,8 @@ func TestGetTradeHistory(t *testing.T) {
t.SkipNow()
}
t.Parallel()
_, err := b.GetTradeHistory("BTCUSD", time.Time{}, time.Time{}, 1, 0)
_, err := b.GetTradeHistory(context.Background(),
"BTCUSD", time.Time{}, time.Time{}, 1, 0)
if err == nil {
t.Error("GetTradeHistory() Expected error")
}
@@ -609,7 +615,7 @@ func TestNewOffer(t *testing.T) {
}
t.Parallel()
_, err := b.NewOffer("BTC", 1, 1, 1, "loan")
_, err := b.NewOffer(context.Background(), "BTC", 1, 1, 1, "loan")
if err == nil {
t.Error("NewOffer() Expected error")
}
@@ -621,7 +627,7 @@ func TestCancelOffer(t *testing.T) {
}
t.Parallel()
_, err := b.CancelOffer(1337)
_, err := b.CancelOffer(context.Background(), 1337)
if err == nil {
t.Error("CancelOffer() Expected error")
}
@@ -633,7 +639,7 @@ func TestGetOfferStatus(t *testing.T) {
}
t.Parallel()
_, err := b.GetOfferStatus(1337)
_, err := b.GetOfferStatus(context.Background(), 1337)
if err == nil {
t.Error("NewOffer() Expected error")
}
@@ -645,7 +651,7 @@ func TestGetActiveCredits(t *testing.T) {
}
t.Parallel()
_, err := b.GetActiveCredits()
_, err := b.GetActiveCredits(context.Background())
if err == nil {
t.Error("GetActiveCredits() Expected error")
}
@@ -657,7 +663,7 @@ func TestGetActiveOffers(t *testing.T) {
}
t.Parallel()
_, err := b.GetActiveOffers()
_, err := b.GetActiveOffers(context.Background())
if err == nil {
t.Error("GetActiveOffers() Expected error")
}
@@ -669,7 +675,7 @@ func TestGetActiveMarginFunding(t *testing.T) {
}
t.Parallel()
_, err := b.GetActiveMarginFunding()
_, err := b.GetActiveMarginFunding(context.Background())
if err == nil {
t.Error("GetActiveMarginFunding() Expected error")
}
@@ -681,7 +687,7 @@ func TestGetUnusedMarginFunds(t *testing.T) {
}
t.Parallel()
_, err := b.GetUnusedMarginFunds()
_, err := b.GetUnusedMarginFunds(context.Background())
if err == nil {
t.Error("GetUnusedMarginFunds() Expected error")
}
@@ -693,7 +699,7 @@ func TestGetMarginTotalTakenFunds(t *testing.T) {
}
t.Parallel()
_, err := b.GetMarginTotalTakenFunds()
_, err := b.GetMarginTotalTakenFunds(context.Background())
if err == nil {
t.Error("GetMarginTotalTakenFunds() Expected error")
}
@@ -705,7 +711,7 @@ func TestCloseMarginFunding(t *testing.T) {
}
t.Parallel()
_, err := b.CloseMarginFunding(1337)
_, err := b.CloseMarginFunding(context.Background(), 1337)
if err == nil {
t.Error("CloseMarginFunding() Expected error")
}
@@ -723,7 +729,7 @@ func setFeeBuilder() *exchange.FeeBuilder {
// TestGetFeeByTypeOfflineTradeFee logic test
func TestGetFeeByTypeOfflineTradeFee(t *testing.T) {
var feeBuilder = setFeeBuilder()
_, err := b.GetFeeByType(feeBuilder)
_, err := b.GetFeeByType(context.Background(), feeBuilder)
if err != nil {
t.Fatal(err)
}
@@ -744,7 +750,7 @@ func TestGetFee(t *testing.T) {
if areTestAPIKeysSet() {
// CryptocurrencyTradeFee Basic
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
@@ -752,28 +758,28 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder()
feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
// CryptocurrencyTradeFee IsMaker
feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
// CryptocurrencyTradeFee Negative purchase price
feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
// CryptocurrencyWithdrawalFee Basic
feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
}
@@ -781,7 +787,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyDepositFee Basic
feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyDepositFee
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
@@ -789,7 +795,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
@@ -797,7 +803,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD
if _, err := b.GetFee(feeBuilder); err != nil {
if _, err := b.GetFee(context.Background(), feeBuilder); err != nil {
t.Error(err)
}
}
@@ -818,7 +824,7 @@ func TestGetActiveOrders(t *testing.T) {
AssetType: asset.Spot,
}
_, err := b.GetActiveOrders(&getOrdersRequest)
_, err := b.GetActiveOrders(context.Background(), &getOrdersRequest)
if areTestAPIKeysSet() && err != nil {
t.Errorf("Could not get open orders: %s", err)
} else if !areTestAPIKeysSet() && err == nil {
@@ -833,7 +839,7 @@ func TestGetOrderHistory(t *testing.T) {
AssetType: asset.Spot,
}
_, err := b.GetOrderHistory(&getOrdersRequest)
_, err := b.GetOrderHistory(context.Background(), &getOrdersRequest)
if areTestAPIKeysSet() && err != nil {
t.Errorf("Could not get order history: %s", err)
} else if !areTestAPIKeysSet() && err == nil {
@@ -865,7 +871,7 @@ func TestSubmitOrder(t *testing.T) {
Amount: 20,
ClientID: "meowOrder",
}
response, err := b.SubmitOrder(orderSubmission)
response, err := b.SubmitOrder(context.Background(), orderSubmission)
if areTestAPIKeysSet() && err != nil {
t.Errorf("Could not place order: %v", err)
@@ -893,7 +899,7 @@ func TestCancelExchangeOrder(t *testing.T) {
AssetType: asset.Spot,
}
err := b.CancelOrder(orderCancellation)
err := b.CancelOrder(context.Background(), orderCancellation)
if !areTestAPIKeysSet() && err == nil {
t.Error("Expecting an error when no keys are set")
}
@@ -917,7 +923,7 @@ func TestCancelAllExchangeOrdera(t *testing.T) {
AssetType: asset.Spot,
}
resp, err := b.CancelAllOrders(orderCancellation)
resp, err := b.CancelAllOrders(context.Background(), orderCancellation)
if !areTestAPIKeysSet() && err == nil {
t.Error("Expecting an error when no keys are set")
@@ -936,7 +942,8 @@ func TestModifyOrder(t *testing.T) {
if areTestAPIKeysSet() && !canManipulateRealOrders {
t.Skip("API keys set, canManipulateRealOrders false, skipping test")
}
_, err := b.ModifyOrder(&order.Modify{AssetType: asset.Spot})
_, err := b.ModifyOrder(context.Background(),
&order.Modify{AssetType: asset.Spot})
if err == nil {
t.Error("ModifyOrder() Expected error")
}
@@ -957,7 +964,8 @@ func TestWithdraw(t *testing.T) {
},
}
_, err := b.WithdrawCryptocurrencyFunds(&withdrawCryptoRequest)
_, err := b.WithdrawCryptocurrencyFunds(context.Background(),
&withdrawCryptoRequest)
if !areTestAPIKeysSet() && err == nil {
t.Error("Expecting an error when no keys are set")
}
@@ -981,7 +989,7 @@ func TestWithdrawFiat(t *testing.T) {
},
}
_, err := b.WithdrawFiatFunds(&withdrawFiatRequest)
_, err := b.WithdrawFiatFunds(context.Background(), &withdrawFiatRequest)
if !areTestAPIKeysSet() && err == nil {
t.Error("Expecting an error when no keys are set")
}
@@ -1013,7 +1021,8 @@ func TestWithdrawInternationalBank(t *testing.T) {
},
}
_, err := b.WithdrawFiatFundsToInternationalBank(&withdrawFiatRequest)
_, err := b.WithdrawFiatFundsToInternationalBank(context.Background(),
&withdrawFiatRequest)
if !areTestAPIKeysSet() && err == nil {
t.Error("Expecting an error when no keys are set")
}
@@ -1025,12 +1034,14 @@ func TestWithdrawInternationalBank(t *testing.T) {
func TestGetDepositAddress(t *testing.T) {
t.Parallel()
if areTestAPIKeysSet() {
_, err := b.GetDepositAddress(currency.BTC, "deposit")
_, err := b.GetDepositAddress(context.Background(),
currency.BTC, "deposit")
if err != nil {
t.Error("GetDepositAddress() error", err)
}
} else {
_, err := b.GetDepositAddress(currency.BTC, "deposit")
_, err := b.GetDepositAddress(context.Background(),
currency.BTC, "deposit")
if err == nil {
t.Error("GetDepositAddress() error cannot be nil")
}
@@ -1194,7 +1205,7 @@ func TestWsCancelOffer(t *testing.T) {
}
func TestConvertSymbolToDepositMethod(t *testing.T) {
s, err := b.ConvertSymbolToDepositMethod(currency.BTC)
s, err := b.ConvertSymbolToDepositMethod(context.Background(), currency.BTC)
if err != nil {
log.Fatal(err)
}
@@ -1202,14 +1213,15 @@ func TestConvertSymbolToDepositMethod(t *testing.T) {
t.Errorf("expected bitcoin but received %s", s)
}
_, err = b.ConvertSymbolToDepositMethod(currency.NewCode("CATS!"))
_, err = b.ConvertSymbolToDepositMethod(context.Background(),
currency.NewCode("CATS!"))
if err == nil {
log.Fatal("error cannot be nil")
}
}
func TestUpdateTradablePairs(t *testing.T) {
err := b.UpdateTradablePairs(false)
err := b.UpdateTradablePairs(context.Background(), false)
if err != nil {
t.Error(err)
}
@@ -1322,12 +1334,14 @@ func TestGetHistoricCandles(t *testing.T) {
}
startTime := time.Now().Add(-time.Hour * 24)
endTime := time.Now().Add(-time.Hour * 20)
_, err = b.GetHistoricCandles(currencyPair, asset.Spot, startTime, endTime, kline.OneHour)
_, err = b.GetHistoricCandles(context.Background(),
currencyPair, asset.Spot, startTime, endTime, kline.OneHour)
if err != nil {
t.Fatal(err)
}
_, err = b.GetHistoricCandles(currencyPair, asset.Spot, startTime, time.Now(), kline.OneMin*1337)
_, err = b.GetHistoricCandles(context.Background(),
currencyPair, asset.Spot, startTime, time.Now(), kline.OneMin*1337)
if err == nil {
t.Fatal(err)
}
@@ -1340,12 +1354,14 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
}
startTime := time.Now().Add(-time.Hour * 24)
endTime := time.Now().Add(-time.Hour * 20)
_, err = b.GetHistoricCandlesExtended(currencyPair, asset.Spot, startTime, endTime, kline.OneHour)
_, err = b.GetHistoricCandlesExtended(context.Background(),
currencyPair, asset.Spot, startTime, endTime, kline.OneHour)
if err != nil {
t.Fatal(err)
}
_, err = b.GetHistoricCandlesExtended(currencyPair, asset.Spot, startTime, endTime, kline.OneMin*1337)
_, err = b.GetHistoricCandlesExtended(context.Background(),
currencyPair, asset.Spot, startTime, endTime, kline.OneMin*1337)
if err == nil {
t.Fatal(err)
}
@@ -1525,7 +1541,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)
}
@@ -1534,7 +1550,7 @@ func TestGetRecentTrades(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetRecentTrades(currencyPair, asset.Margin)
_, err = b.GetRecentTrades(context.Background(), currencyPair, asset.Margin)
if err != nil {
t.Error(err)
}
@@ -1546,13 +1562,17 @@ func TestGetHistoricTrades(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetHistoricTrades(currencyPair, asset.Spot, time.Now().Add(-time.Minute*15), time.Now())
_, err = b.GetHistoricTrades(context.Background(),
currencyPair, asset.Spot, time.Now().Add(-time.Minute*15), time.Now())
if err != nil {
t.Error(err)
}
// longer term test
_, err = b.GetHistoricTrades(currencyPair, asset.Spot, time.Now().Add(-time.Hour*100), time.Now().Add(-time.Hour*99))
_, err = b.GetHistoricTrades(context.Background(),
currencyPair, asset.Spot,
time.Now().Add(-time.Hour*100),
time.Now().Add(-time.Hour*99))
if err != nil {
t.Error(err)
}

View File

@@ -1,6 +1,7 @@
package bitfinex
import (
"context"
"errors"
"fmt"
"sort"
@@ -42,7 +43,7 @@ func (b *Bitfinex) 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
}
@@ -254,7 +255,7 @@ func (b *Bitfinex) 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. Err: %s",
@@ -264,8 +265,8 @@ func (b *Bitfinex) Run() {
}
// FetchTradablePairs returns a list of the exchanges tradable pairs
func (b *Bitfinex) FetchTradablePairs(a asset.Item) ([]string, error) {
items, err := b.GetTickerBatch()
func (b *Bitfinex) FetchTradablePairs(ctx context.Context, a asset.Item) ([]string, error) {
items, err := b.GetTickerBatch(ctx)
if err != nil {
return nil, err
}
@@ -302,10 +303,10 @@ func (b *Bitfinex) FetchTradablePairs(a asset.Item) ([]string, error) {
// UpdateTradablePairs updates the exchanges available pairs and stores
// them in the exchanges config
func (b *Bitfinex) UpdateTradablePairs(forceUpdate bool) error {
func (b *Bitfinex) UpdateTradablePairs(ctx context.Context, forceUpdate bool) error {
assets := b.CurrencyPairs.GetAssetTypes(false)
for i := range assets {
pairs, err := b.FetchTradablePairs(assets[i])
pairs, err := b.FetchTradablePairs(ctx, assets[i])
if err != nil {
return err
}
@@ -324,13 +325,13 @@ func (b *Bitfinex) UpdateTradablePairs(forceUpdate bool) error {
}
// UpdateTickers updates the ticker for all currency pairs of a given asset type
func (b *Bitfinex) UpdateTickers(a asset.Item) error {
func (b *Bitfinex) UpdateTickers(ctx context.Context, a asset.Item) error {
enabledPairs, err := b.GetEnabledPairs(a)
if err != nil {
return err
}
tickerNew, err := b.GetTickerBatch()
tickerNew, err := b.GetTickerBatch(ctx)
if err != nil {
return err
}
@@ -363,8 +364,8 @@ func (b *Bitfinex) UpdateTickers(a asset.Item) error {
}
// UpdateTicker updates and returns the ticker for a currency pair
func (b *Bitfinex) UpdateTicker(p currency.Pair, a asset.Item) (*ticker.Price, error) {
err := b.UpdateTickers(a)
func (b *Bitfinex) UpdateTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error) {
err := b.UpdateTickers(ctx, a)
if err != nil {
return nil, err
}
@@ -372,7 +373,7 @@ func (b *Bitfinex) UpdateTicker(p currency.Pair, a asset.Item) (*ticker.Price, e
}
// FetchTicker returns the ticker for a currency pair
func (b *Bitfinex) FetchTicker(p currency.Pair, a asset.Item) (*ticker.Price, error) {
func (b *Bitfinex) FetchTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error) {
fPair, err := b.FormatExchangeCurrency(p, a)
if err != nil {
return nil, err
@@ -381,13 +382,13 @@ func (b *Bitfinex) FetchTicker(p currency.Pair, a asset.Item) (*ticker.Price, er
b.appendOptionalDelimiter(&fPair)
tick, err := ticker.GetTicker(b.Name, fPair, asset.Spot)
if err != nil {
return b.UpdateTicker(fPair, a)
return b.UpdateTicker(ctx, fPair, a)
}
return tick, nil
}
// FetchOrderbook returns the orderbook for a currency pair
func (b *Bitfinex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
func (b *Bitfinex) FetchOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
@@ -396,13 +397,13 @@ func (b *Bitfinex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*order
b.appendOptionalDelimiter(&fPair)
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(fPair, assetType)
return b.UpdateOrderbook(ctx, fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
func (b *Bitfinex) UpdateOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
o := &orderbook.Base{
Exchange: b.Name,
Pair: p,
@@ -424,7 +425,7 @@ func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
prefix = "f"
}
var orderbookNew Orderbook
orderbookNew, err = b.GetOrderbook(prefix+fPair.String(), "R0", 100)
orderbookNew, err = b.GetOrderbook(ctx, prefix+fPair.String(), "R0", 100)
if err != nil {
return nil, err
}
@@ -471,11 +472,11 @@ func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
// UpdateAccountInfo retrieves balances for all enabled currencies on the
// Bitfinex exchange
func (b *Bitfinex) UpdateAccountInfo(assetType asset.Item) (account.Holdings, error) {
func (b *Bitfinex) UpdateAccountInfo(ctx context.Context, assetType asset.Item) (account.Holdings, error) {
var response account.Holdings
response.Exchange = b.Name
accountBalance, err := b.GetAccountBalance()
accountBalance, err := b.GetAccountBalance(ctx)
if err != nil {
return response, err
}
@@ -511,10 +512,10 @@ func (b *Bitfinex) UpdateAccountInfo(assetType asset.Item) (account.Holdings, er
}
// FetchAccountInfo retrieves balances for all enabled currencies
func (b *Bitfinex) FetchAccountInfo(assetType asset.Item) (account.Holdings, error) {
func (b *Bitfinex) 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
@@ -522,22 +523,22 @@ func (b *Bitfinex) FetchAccountInfo(assetType asset.Item) (account.Holdings, err
// GetFundingHistory returns funding history, deposits and
// withdrawals
func (b *Bitfinex) GetFundingHistory() ([]exchange.FundHistory, error) {
func (b *Bitfinex) GetFundingHistory(ctx context.Context) ([]exchange.FundHistory, error) {
return nil, common.ErrFunctionNotSupported
}
// GetWithdrawalsHistory returns previous withdrawals data
func (b *Bitfinex) GetWithdrawalsHistory(c currency.Code) (resp []exchange.WithdrawalHistory, err error) {
func (b *Bitfinex) 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 *Bitfinex) GetRecentTrades(p currency.Pair, assetType asset.Item) ([]trade.Data, error) {
return b.GetHistoricTrades(p, assetType, time.Now().Add(-time.Minute*15), time.Now())
func (b *Bitfinex) GetRecentTrades(ctx context.Context, p currency.Pair, assetType asset.Item) ([]trade.Data, error) {
return b.GetHistoricTrades(ctx, p, assetType, time.Now().Add(-time.Minute*15), time.Now())
}
// GetHistoricTrades returns historic trade data within the timeframe provided
func (b *Bitfinex) GetHistoricTrades(p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) {
func (b *Bitfinex) GetHistoricTrades(ctx context.Context, p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) {
if assetType == asset.MarginFunding {
return nil, fmt.Errorf("asset type '%v' not supported", assetType)
}
@@ -560,7 +561,8 @@ func (b *Bitfinex) GetHistoricTrades(p currency.Pair, assetType asset.Item, time
allTrades:
for {
var tradeData []Trade
tradeData, err = b.GetTrades(currString, int64(limit), 0, ts.Unix()*1000, false)
tradeData, err = b.GetTrades(ctx,
currString, int64(limit), 0, ts.Unix()*1000, false)
if err != nil {
return nil, err
}
@@ -602,7 +604,7 @@ allTrades:
}
// SubmitOrder submits a new order
func (b *Bitfinex) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
func (b *Bitfinex) SubmitOrder(ctx context.Context, o *order.Submit) (order.SubmitResponse, error) {
var submitOrderResponse order.SubmitResponse
err := o.Validate()
if err != nil {
@@ -633,7 +635,8 @@ func (b *Bitfinex) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
if o.AssetType == asset.Spot {
orderType = "exchange " + orderType
}
response, err = b.NewOrder(fpair.String(),
response, err = b.NewOrder(ctx,
fpair.String(),
orderType,
o.Amount,
o.Price,
@@ -656,7 +659,7 @@ func (b *Bitfinex) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
// ModifyOrder will allow of changing orderbook placement and limit to
// market conversion
func (b *Bitfinex) ModifyOrder(action *order.Modify) (order.Modify, error) {
func (b *Bitfinex) ModifyOrder(ctx context.Context, action *order.Modify) (order.Modify, error) {
if err := action.Validate(); err != nil {
return order.Modify{}, err
}
@@ -689,7 +692,7 @@ func (b *Bitfinex) ModifyOrder(action *order.Modify) (order.Modify, error) {
}
// CancelOrder cancels an order by its corresponding ID number
func (b *Bitfinex) CancelOrder(o *order.Cancel) error {
func (b *Bitfinex) CancelOrder(ctx context.Context, o *order.Cancel) error {
if err := o.Validate(o.StandardCancel()); err != nil {
return err
}
@@ -701,50 +704,50 @@ func (b *Bitfinex) CancelOrder(o *order.Cancel) error {
if b.Websocket.CanUseAuthenticatedWebsocketForWrapper() {
err = b.WsCancelOrder(orderIDInt)
} else {
_, err = b.CancelExistingOrder(orderIDInt)
_, err = b.CancelExistingOrder(ctx, orderIDInt)
}
return err
}
// CancelBatchOrders cancels an orders by their corresponding ID numbers
func (b *Bitfinex) CancelBatchOrders(o []order.Cancel) (order.CancelBatchResponse, error) {
func (b *Bitfinex) CancelBatchOrders(ctx context.Context, o []order.Cancel) (order.CancelBatchResponse, error) {
return order.CancelBatchResponse{}, common.ErrNotYetImplemented
}
// CancelAllOrders cancels all orders associated with a currency pair
func (b *Bitfinex) CancelAllOrders(_ *order.Cancel) (order.CancelAllResponse, error) {
func (b *Bitfinex) CancelAllOrders(ctx context.Context, _ *order.Cancel) (order.CancelAllResponse, error) {
var err error
if b.Websocket.CanUseAuthenticatedWebsocketForWrapper() {
err = b.WsCancelAllOrders()
} else {
_, err = b.CancelAllExistingOrders()
_, err = b.CancelAllExistingOrders(ctx)
}
return order.CancelAllResponse{}, err
}
// GetOrderInfo returns order information based on order ID
func (b *Bitfinex) GetOrderInfo(orderID string, pair currency.Pair, assetType asset.Item) (order.Detail, error) {
func (b *Bitfinex) GetOrderInfo(ctx context.Context, orderID string, pair currency.Pair, assetType asset.Item) (order.Detail, error) {
var orderDetail order.Detail
return orderDetail, common.ErrNotYetImplemented
}
// GetDepositAddress returns a deposit address for a specified currency
func (b *Bitfinex) GetDepositAddress(c currency.Code, accountID string) (string, error) {
func (b *Bitfinex) GetDepositAddress(ctx context.Context, c currency.Code, accountID string) (string, error) {
if accountID == "" {
accountID = "deposit"
}
method, err := b.ConvertSymbolToDepositMethod(c)
method, err := b.ConvertSymbolToDepositMethod(ctx, c)
if err != nil {
return "", err
}
resp, err := b.NewDeposit(method, accountID, 0)
resp, err := b.NewDeposit(ctx, method, accountID, 0)
return resp.Address, err
}
// WithdrawCryptocurrencyFunds returns a withdrawal ID when a withdrawal is submitted
func (b *Bitfinex) WithdrawCryptocurrencyFunds(withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *Bitfinex) WithdrawCryptocurrencyFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
if err := withdrawRequest.Validate(); err != nil {
return nil, err
}
@@ -752,7 +755,8 @@ func (b *Bitfinex) WithdrawCryptocurrencyFunds(withdrawRequest *withdraw.Request
// As this is for trading, I've made the wrapper default 'exchange'
// TODO: Discover an automated way to make the decision for wallet type to withdraw from
walletType := "exchange"
resp, err := b.WithdrawCryptocurrency(walletType,
resp, err := b.WithdrawCryptocurrency(ctx,
walletType,
withdrawRequest.Crypto.Address,
withdrawRequest.Description,
withdrawRequest.Amount,
@@ -769,7 +773,7 @@ func (b *Bitfinex) WithdrawCryptocurrencyFunds(withdrawRequest *withdraw.Request
// WithdrawFiatFunds returns a withdrawal ID when a withdrawal is submitted
// Returns comma delimited withdrawal IDs
func (b *Bitfinex) WithdrawFiatFunds(withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *Bitfinex) WithdrawFiatFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
if err := withdrawRequest.Validate(); err != nil {
return nil, err
}
@@ -778,7 +782,7 @@ func (b *Bitfinex) WithdrawFiatFunds(withdrawRequest *withdraw.Request) (*withdr
// As this is for trading, I've made the wrapper default 'exchange'
// TODO: Discover an automated way to make the decision for wallet type to withdraw from
walletType := "exchange"
resp, err := b.WithdrawFIAT(withdrawalType, walletType, withdrawRequest)
resp, err := b.WithdrawFIAT(ctx, withdrawalType, walletType, withdrawRequest)
if err != nil {
return nil, err
}
@@ -791,11 +795,11 @@ func (b *Bitfinex) WithdrawFiatFunds(withdrawRequest *withdraw.Request) (*withdr
// WithdrawFiatFundsToInternationalBank returns a withdrawal ID when a withdrawal is submitted
// Returns comma delimited withdrawal IDs
func (b *Bitfinex) WithdrawFiatFundsToInternationalBank(withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
func (b *Bitfinex) WithdrawFiatFundsToInternationalBank(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) {
if err := withdrawRequest.Validate(); err != nil {
return nil, err
}
v, err := b.WithdrawFiatFunds(withdrawRequest)
v, err := b.WithdrawFiatFunds(ctx, withdrawRequest)
if err != nil {
return nil, err
}
@@ -806,22 +810,22 @@ func (b *Bitfinex) WithdrawFiatFundsToInternationalBank(withdrawRequest *withdra
}
// GetFeeByType returns an estimate of fee based on type of transaction
func (b *Bitfinex) GetFeeByType(feeBuilder *exchange.FeeBuilder) (float64, error) {
func (b *Bitfinex) 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)
}
// GetActiveOrders retrieves any orders that are active/open
func (b *Bitfinex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, error) {
func (b *Bitfinex) GetActiveOrders(ctx context.Context, req *order.GetOrdersRequest) ([]order.Detail, error) {
if err := req.Validate(); err != nil {
return nil, err
}
var orders []order.Detail
resp, err := b.GetOpenOrders()
resp, err := b.GetOpenOrders(ctx)
if err != nil {
return nil, err
}
@@ -884,13 +888,13 @@ func (b *Bitfinex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
// GetOrderHistory retrieves account order information
// Can Limit response to specific order status
func (b *Bitfinex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, error) {
func (b *Bitfinex) GetOrderHistory(ctx context.Context, req *order.GetOrdersRequest) ([]order.Detail, error) {
if err := req.Validate(); err != nil {
return nil, err
}
var orders []order.Detail
resp, err := b.GetInactiveOrders()
resp, err := b.GetInactiveOrders(ctx)
if err != nil {
return nil, err
}
@@ -954,7 +958,7 @@ func (b *Bitfinex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
}
// AuthenticateWebsocket sends an authentication message to the websocket
func (b *Bitfinex) AuthenticateWebsocket() error {
func (b *Bitfinex) AuthenticateWebsocket(_ context.Context) error {
return b.WsSendAuth()
}
@@ -968,8 +972,8 @@ func (b *Bitfinex) appendOptionalDelimiter(p *currency.Pair) {
// ValidateCredentials validates current credentials used for wrapper
// functionality
func (b *Bitfinex) ValidateCredentials(assetType asset.Item) error {
_, err := b.UpdateAccountInfo(assetType)
func (b *Bitfinex) ValidateCredentials(ctx context.Context, assetType asset.Item) error {
_, err := b.UpdateAccountInfo(ctx, assetType)
return b.CheckTransientError(err)
}
@@ -988,7 +992,7 @@ func (b *Bitfinex) FormatExchangeKlineInterval(in kline.Interval) string {
}
// GetHistoricCandles returns candles between a time period for a set time interval
func (b *Bitfinex) GetHistoricCandles(pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
func (b *Bitfinex) 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
}
@@ -1002,7 +1006,8 @@ func (b *Bitfinex) GetHistoricCandles(pair currency.Pair, a asset.Item, start, e
return kline.Item{}, err
}
candles, err := b.GetCandles(cf, b.FormatExchangeKlineInterval(interval),
candles, err := b.GetCandles(ctx,
cf, b.FormatExchangeKlineInterval(interval),
start.Unix()*1000, end.Unix()*1000,
b.Features.Enabled.Kline.ResultLimit, true)
if err != nil {
@@ -1031,7 +1036,7 @@ func (b *Bitfinex) GetHistoricCandles(pair currency.Pair, a asset.Item, start, e
}
// GetHistoricCandlesExtended returns candles between a time period for a set time interval
func (b *Bitfinex) GetHistoricCandlesExtended(pair currency.Pair, a asset.Item, start, end time.Time, interval kline.Interval) (kline.Item, error) {
func (b *Bitfinex) 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
}
@@ -1054,7 +1059,8 @@ func (b *Bitfinex) GetHistoricCandlesExtended(pair currency.Pair, a asset.Item,
for x := range dates.Ranges {
var candles []Candle
candles, err = b.GetCandles(cf, b.FormatExchangeKlineInterval(interval),
candles, err = b.GetCandles(ctx,
cf, b.FormatExchangeKlineInterval(interval),
dates.Ranges[x].Start.Ticks*1000, dates.Ranges[x].End.Ticks*1000,
b.Features.Enabled.Kline.ResultLimit, true)
if err != nil {