From 929957cbd65af88598561bc5296be1ae11ced1e9 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara-Reid Date: Tue, 21 Nov 2023 12:45:08 +1100 Subject: [PATCH] kucoin: Fix fetching fee rates for multiple pairs (#1370) * kucoin: Fix fetching fee rates for multiple pairs * Update exchanges/kucoin/kucoin_test.go Co-authored-by: Adrian Gallagher * NITS: WOW * glorious: nits --------- Co-authored-by: Ryan O'Hara-Reid Co-authored-by: Adrian Gallagher --- exchanges/kucoin/kucoin.go | 11 +++++---- exchanges/kucoin/kucoin_test.go | 38 ++++++++++++++++++++++++++++-- exchanges/kucoin/kucoin_types.go | 9 ++++--- exchanges/kucoin/kucoin_wrapper.go | 2 +- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/exchanges/kucoin/kucoin.go b/exchanges/kucoin/kucoin.go index 8bd3494f..2c71d13c 100644 --- a/exchanges/kucoin/kucoin.go +++ b/exchanges/kucoin/kucoin.go @@ -1647,13 +1647,14 @@ func (ku *Kucoin) GetBasicFee(ctx context.Context, currencyType string) (*Fees, } // GetTradingFee get fee rate of trading pairs -func (ku *Kucoin) GetTradingFee(ctx context.Context, symbols string) ([]Fees, error) { - params := url.Values{} - if symbols != "" { - params.Set("symbols", symbols) +// WARNING: There is a limit of 10 currency pairs allowed to be requested per call. +func (ku *Kucoin) GetTradingFee(ctx context.Context, pairs currency.Pairs) ([]Fees, error) { + if len(pairs) == 0 { + return nil, currency.ErrCurrencyPairsEmpty } + path := kucoinTradingFee + "?symbols=" + pairs.Upper().Join() var resp []Fees - return resp, ku.SendAuthHTTPRequest(ctx, exchange.RestSpot, defaultSpotEPL, http.MethodGet, common.EncodeURLValues(kucoinTradingFee, params), nil, &resp) + return resp, ku.SendAuthHTTPRequest(ctx, exchange.RestSpot, defaultSpotEPL, http.MethodGet, path, nil, &resp) } // SendHTTPRequest sends an unauthenticated HTTP request diff --git a/exchanges/kucoin/kucoin_test.go b/exchanges/kucoin/kucoin_test.go index 9694507f..e954fefc 100644 --- a/exchanges/kucoin/kucoin_test.go +++ b/exchanges/kucoin/kucoin_test.go @@ -1096,11 +1096,45 @@ func TestGetBasicFee(t *testing.T) { func TestGetTradingFee(t *testing.T) { t.Parallel() + + _, err := ku.GetTradingFee(context.Background(), nil) + if !errors.Is(err, currency.ErrCurrencyPairsEmpty) { + t.Fatalf("received %v, expected %v", err, currency.ErrCurrencyPairsEmpty) + } + sharedtestvalues.SkipTestIfCredentialsUnset(t, ku) - _, err := ku.GetTradingFee(context.Background(), "BTC-USDT") + avail, err := ku.GetAvailablePairs(asset.Spot) if err != nil { - t.Error("GetTradingFee() error", err) + t.Fatal(err) + } + + pairs := currency.Pairs{avail[0]} + btcusdTradingFee, err := ku.GetTradingFee(context.Background(), pairs) + if !errors.Is(err, nil) { + t.Fatalf("received %v, expected %v", err, nil) + } + + if len(btcusdTradingFee) != 1 { + t.Error("GetTradingFee() error, expected 1 pair") + } + + // NOTE: Test below will error out from an external call as this will exceed + // the allowed pairs. If this does not error then this endpoint will allow + // more items to be requested. + pairs = append(pairs, avail[1:11]...) + _, err = ku.GetTradingFee(context.Background(), pairs) + if errors.Is(err, nil) { + t.Fatalf("received %v, expected %v", err, "code: 200000 message: symbols size invalid.") + } + + got, err := ku.GetTradingFee(context.Background(), pairs[:10]) + if !errors.Is(err, nil) { + t.Fatalf("received %v, expected %v", err, nil) + } + + if len(got) != 10 { + t.Error("GetTradingFee() error, expected 10 pairs") } } diff --git a/exchanges/kucoin/kucoin_types.go b/exchanges/kucoin/kucoin_types.go index af5a1fae..45419bc0 100644 --- a/exchanges/kucoin/kucoin_types.go +++ b/exchanges/kucoin/kucoin_types.go @@ -56,11 +56,14 @@ func (e Error) GetError() error { return err } switch code { - case 200000, 200: + case 200: return nil - default: - return fmt.Errorf("code: %s message: %s", e.Code, e.Msg) + case 200000: + if e.Msg == "" { + return nil + } } + return fmt.Errorf("code: %s message: %s", e.Code, e.Msg) } // SymbolInfo stores symbol information diff --git a/exchanges/kucoin/kucoin_wrapper.go b/exchanges/kucoin/kucoin_wrapper.go index 98906dd5..d9919ffe 100644 --- a/exchanges/kucoin/kucoin_wrapper.go +++ b/exchanges/kucoin/kucoin_wrapper.go @@ -1351,7 +1351,7 @@ func (ku *Kucoin) GetFeeByType(ctx context.Context, feeBuilder *exchange.FeeBuil switch feeBuilder.FeeType { case exchange.CryptocurrencyWithdrawalFee, exchange.CryptocurrencyTradeFee: - fee, err := ku.GetTradingFee(ctx, feeBuilder.Pair.String()) + fee, err := ku.GetTradingFee(ctx, currency.Pairs{feeBuilder.Pair}) if err != nil { return 0, err }