From c191dfc66674f2ad53384a36b1ab0f8d41b1e9c3 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara-Reid Date: Mon, 26 Aug 2019 15:06:50 +1000 Subject: [PATCH] Bugfix: Bitstamp race condition and ANX format directive issue (#342) * Fix issue for ANX live testing, incorrect format directive * Used cpy of Balances as param for Bitstamp function, added space for ANX fatal error. * Fix linter issue * Drop struct field for balance and localised a variable in each individual getfee call as needed --- exchanges/anx/anx_live_test.go | 2 +- exchanges/bitstamp/bitstamp.go | 23 +++++++++++------------ exchanges/bitstamp/bitstamp_test.go | 14 ++++++++------ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/exchanges/anx/anx_live_test.go b/exchanges/anx/anx_live_test.go index d0abe9ce..8a442e2d 100644 --- a/exchanges/anx/anx_live_test.go +++ b/exchanges/anx/anx_live_test.go @@ -20,7 +20,7 @@ func TestMain(m *testing.M) { cfg.LoadConfig("../../testdata/configtest.json") anxConfig, err := cfg.GetExchangeConfig("ANX") if err != nil { - log.Fatalf("Test Failed - ANX Setup() init error", err) + log.Fatal("Test Failed - ANX Setup() init error ", err) } anxConfig.AuthenticatedAPISupport = true anxConfig.APIKey = apiKey diff --git a/exchanges/bitstamp/bitstamp.go b/exchanges/bitstamp/bitstamp.go index baf74d30..d1d198cf 100644 --- a/exchanges/bitstamp/bitstamp.go +++ b/exchanges/bitstamp/bitstamp.go @@ -63,7 +63,6 @@ const ( // Bitstamp is the overarching type across the bitstamp package type Bitstamp struct { exchange.Base - Balance Balances WebsocketConn *wshandler.WebsocketConnection } @@ -176,15 +175,15 @@ func (b *Bitstamp) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) { switch feeBuilder.FeeType { case exchange.CryptocurrencyTradeFee: - var err error - b.Balance, err = b.GetBalance() + balance, err := b.GetBalance() if err != nil { return 0, err } fee = b.CalculateTradingFee(feeBuilder.Pair.Base, feeBuilder.Pair.Quote, feeBuilder.PurchasePrice, - feeBuilder.Amount) + feeBuilder.Amount, + balance) case exchange.CyptocurrencyDepositFee: fee = 0 case exchange.InternationalBankDepositFee: @@ -229,20 +228,20 @@ func getInternationalBankDepositFee(amount float64) float64 { } // CalculateTradingFee returns fee on a currency pair -func (b *Bitstamp) CalculateTradingFee(base, quote currency.Code, purchasePrice, amount float64) float64 { +func (b *Bitstamp) CalculateTradingFee(base, quote currency.Code, purchasePrice, amount float64, balances *Balances) float64 { var fee float64 switch base.String() + quote.String() { case currency.BTC.String() + currency.USD.String(): - fee = b.Balance.BTCUSDFee + fee = balances.BTCUSDFee case currency.BTC.String() + currency.EUR.String(): - fee = b.Balance.BTCEURFee + fee = balances.BTCEURFee case currency.XRP.String() + currency.EUR.String(): - fee = b.Balance.XRPEURFee + fee = balances.XRPEURFee case currency.XRP.String() + currency.USD.String(): - fee = b.Balance.XRPUSDFee + fee = balances.XRPUSDFee case currency.EUR.String() + currency.USD.String(): - fee = b.Balance.EURUSDFee + fee = balances.EURUSDFee default: fee = 0 } @@ -367,9 +366,9 @@ func (b *Bitstamp) GetEURUSDConversionRate() (EURUSDConversionRate, error) { } // GetBalance returns full balance of currency held on the exchange -func (b *Bitstamp) GetBalance() (Balances, error) { +func (b *Bitstamp) GetBalance() (*Balances, error) { var balance Balances - return balance, + return &balance, b.SendAuthenticatedHTTPRequest(bitstampAPIBalance, true, nil, &balance) } diff --git a/exchanges/bitstamp/bitstamp_test.go b/exchanges/bitstamp/bitstamp_test.go index c4bf2298..d6364750 100644 --- a/exchanges/bitstamp/bitstamp_test.go +++ b/exchanges/bitstamp/bitstamp_test.go @@ -145,21 +145,23 @@ func TestGetFee(t *testing.T) { func TestCalculateTradingFee(t *testing.T) { t.Parallel() - b.Balance.BTCUSDFee = 1 - b.Balance.BTCEURFee = 0 - if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 0, 0); resp != 0 { + var newBalance = new(Balances) + newBalance.BTCUSDFee = 1 + newBalance.BTCEURFee = 0 + + if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 0, 0, newBalance); resp != 0 { t.Error("Test Failed - GetFee() error") } - if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 2, 2); resp != float64(4) { + if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 2, 2, newBalance); resp != float64(4) { t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(4), resp) } - if resp := b.CalculateTradingFee(currency.BTC, currency.EUR, 2, 2); resp != float64(0) { + if resp := b.CalculateTradingFee(currency.BTC, currency.EUR, 2, 2, newBalance); resp != float64(0) { t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) } dummy1, dummy2 := currency.NewCode(""), currency.NewCode("") - if resp := b.CalculateTradingFee(dummy1, dummy2, 0, 0); resp != 0 { + if resp := b.CalculateTradingFee(dummy1, dummy2, 0, 0, newBalance); resp != 0 { t.Error("Test Failed - GetFee() error") } }