From 1daaa66830b9d3b967d4f2e6c3f220622502bde7 Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Mon, 24 Jun 2019 17:34:07 +1000 Subject: [PATCH] Engine changes Add addr helpers (will be split off into own package) Engine status updates (log and data dir display) Use GetPairFormat for various exchanges instead of calling the config QA fixes Implement GCTRPC exchange deposit address handling --- engine/addr_helpers.go | 100 ++++++++++++++++++ engine/addr_helpers_test.go | 64 +++++++++++ engine/engine.go | 52 ++++----- engine/engine_types.go | 1 + engine/helpers.go | 58 +++++----- engine/orders.go | 2 - engine/rpcserver.go | 5 +- exchanges/anx/anx_wrapper.go | 4 +- exchanges/bithumb/bithumb_wrapper.go | 4 +- exchanges/bitmex/bitmex_wrapper.go | 4 +- exchanges/bitstamp/bitstamp.go | 19 ++-- exchanges/btcmarkets/btcmarkets_wrapper.go | 5 +- exchanges/gemini/gemini_wrapper.go | 2 +- .../localbitcoins/localbitcoins_wrapper.go | 4 +- main.go | 1 + 15 files changed, 247 insertions(+), 78 deletions(-) create mode 100644 engine/addr_helpers.go create mode 100644 engine/addr_helpers_test.go diff --git a/engine/addr_helpers.go b/engine/addr_helpers.go new file mode 100644 index 00000000..e78ab109 --- /dev/null +++ b/engine/addr_helpers.go @@ -0,0 +1,100 @@ +package engine + +import ( + "errors" + "strings" + "sync" + + "github.com/thrasher-/gocryptotrader/currency" +) + +// DepositAddressStore stores a list of exchange deposit addresses +type DepositAddressStore struct { + m sync.Mutex + Store map[string]map[string]string +} + +// DepositAddressManager manages the exchange deposit address store +type DepositAddressManager struct { + Store DepositAddressStore +} + +// vars related to the deposit address helpers +var ( + ErrDepositAddressStoreIsNil = errors.New("deposit address store is nil") + ErrDepositAddressNotFound = errors.New("deposit address does not exist") +) + +// Seed seeds the deposit address store +func (d *DepositAddressStore) Seed(coinData map[string]map[string]string) { + d.m.Lock() + defer d.m.Unlock() + if d.Store == nil { + d.Store = make(map[string]map[string]string) + } + + for k, v := range coinData { + r := make(map[string]string) + for w, x := range v { + r[strings.ToUpper(w)] = x + } + d.Store[strings.ToUpper(k)] = r + } +} + +// GetDepositAddress returns a deposit address based on the specified item +func (d *DepositAddressStore) GetDepositAddress(exchName string, item currency.Code) (string, error) { + d.m.Lock() + defer d.m.Unlock() + + if len(d.Store) == 0 { + return "", ErrDepositAddressStoreIsNil + } + + r, ok := d.Store[strings.ToUpper(exchName)] + if !ok { + return "", ErrExchangeNotFound + } + + addr, ok := r[strings.ToUpper(item.String())] + if !ok { + return "", ErrDepositAddressNotFound + } + + return addr, nil +} + +// GetDepositAddresses returns a list of stored deposit addresses +func (d *DepositAddressStore) GetDepositAddresses(exchName string) (map[string]string, error) { + d.m.Lock() + defer d.m.Unlock() + + if len(d.Store) == 0 { + return nil, ErrDepositAddressStoreIsNil + } + + r, ok := d.Store[strings.ToUpper(exchName)] + if !ok { + return nil, ErrDepositAddressNotFound + } + + return r, nil +} + +// GetDepositAddressByExchange returns a deposit address for the specified exchange and cryptocurrency +// if it exists +func (d *DepositAddressManager) GetDepositAddressByExchange(exchName string, currencyItem currency.Code) (string, error) { + return d.Store.GetDepositAddress(exchName, currencyItem) +} + +// GetDepositAddressesByExchange returns a list of cryptocurrency addresses for the specified +// exchange if they exist +func (d *DepositAddressManager) GetDepositAddressesByExchange(exchName string) (map[string]string, error) { + return d.Store.GetDepositAddresses(exchName) +} + +// Sync synchronises all deposit addresses +func (d *DepositAddressManager) Sync() { + result := GetExchangeCryptocurrencyDepositAddresses() + d.Store.Seed(result) +} diff --git a/engine/addr_helpers_test.go b/engine/addr_helpers_test.go new file mode 100644 index 00000000..34f29a25 --- /dev/null +++ b/engine/addr_helpers_test.go @@ -0,0 +1,64 @@ +package engine + +import ( + "testing" + + "github.com/thrasher-/gocryptotrader/currency" +) + +const ( + testBTCAddress = "1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX" +) + +func TestSeed(t *testing.T) { + var d DepositAddressStore + u := map[string]map[string]string{ + "BITSTAMP": map[string]string{ + "BTC": testBTCAddress, + }, + } + + d.Seed(u) + r, err := d.GetDepositAddress("BITSTAMP", currency.BTC) + if err != nil { + t.Error("unexpected result") + } + + if r != testBTCAddress { + t.Error("unexpected result") + } +} + +func TestGetDepositAddress(t *testing.T) { + var d DepositAddressStore + _, err := d.GetDepositAddress("", currency.BTC) + if err != ErrDepositAddressStoreIsNil { + t.Error("non-error on non-existent exchange") + } + + d.Store = map[string]map[string]string{ + "BITSTAMP": map[string]string{ + "BTC": testBTCAddress, + }, + } + + _, err = d.GetDepositAddress("", currency.BTC) + if err != ErrExchangeNotFound { + t.Error("non-error on non-existent exchange") + } + + var r string + r, err = d.GetDepositAddress("BiTStAmP", currency.NewCode("bTC")) + if err != nil { + t.Error("unexpected err: ", err) + } + + if r != testBTCAddress { + t.Error("unexpected BTC address: ", r) + } + + _, err = d.GetDepositAddress("BiTStAmP", currency.LTC) + if err != ErrDepositAddressNotFound { + t.Error("unexpected err: ", err) + } +} diff --git a/engine/engine.go b/engine/engine.go index 15f803c4..8c3d654e 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "os/signal" - "path" "sync" "syscall" "time" @@ -25,20 +24,20 @@ import ( // Engine contains configuration, portfolio, exchange & ticker data and is the // overarching type across this code base. type Engine struct { - Config *config.Config - Portfolio *portfolio.Base - Exchanges []exchange.IBotExchange - ExchangeCurrencyPairManager *ExchangeCurrencyPairSyncer - NTPManager ntpManager - ConnectionManager connectionManager - OrderManager orderManager - PortfolioManager portfolioManager - CommsManager commsManager - Shutdown chan struct{} - Settings Settings - CryptocurrencyDepositAddresses map[string]map[string]string - Uptime time.Time - ServicesWG sync.WaitGroup + Config *config.Config + Portfolio *portfolio.Base + Exchanges []exchange.IBotExchange + ExchangeCurrencyPairManager *ExchangeCurrencyPairSyncer + NTPManager ntpManager + ConnectionManager connectionManager + OrderManager orderManager + PortfolioManager portfolioManager + CommsManager commsManager + DepositAddressManager *DepositAddressManager + Shutdown chan struct{} + Settings Settings + Uptime time.Time + ServicesWG sync.WaitGroup } // Vars for engine @@ -62,8 +61,6 @@ func New() (*Engine, error) { return nil, fmt.Errorf("failed to load config. Err: %s", err) } - b.CryptocurrencyDepositAddresses = make(map[string]map[string]string) - return &b, nil } @@ -75,7 +72,7 @@ func NewFromSettings(settings *Settings) (*Engine, error) { var b Engine b.Config = &config.Cfg - log.Debugf("Loading config file %s..\n", settings.ConfigFile) + log.Debugf("Loading config file %s...\n", settings.ConfigFile) err := b.Config.LoadConfig(settings.ConfigFile) if err != nil { return nil, fmt.Errorf("failed to load config. Err: %s", err) @@ -93,8 +90,11 @@ func NewFromSettings(settings *Settings) (*Engine, error) { b.Settings.ConfigFile = settings.ConfigFile b.Settings.DataDir = settings.DataDir - b.Settings.LogFile = path.Join(log.LogPath, log.Logger.File) - b.CryptocurrencyDepositAddresses = make(map[string]map[string]string) + + if *log.Logger.Enabled { + b.Settings.LogFile = log.LogPath + log.Debugf("Using log file: %s.\n", log.LogPath) + } err = utils.AdjustGoMaxProcs(settings.GoMaxProcs) if err != nil { @@ -102,9 +102,7 @@ func NewFromSettings(settings *Settings) (*Engine, error) { } b.handleInterrupt() - ValidateSettings(&b, settings) - return &b, nil } @@ -157,6 +155,7 @@ func ValidateSettings(b *Engine, s *Settings) { b.Settings.EnableNTPClient = s.EnableNTPClient b.Settings.EnableOrderManager = s.EnableOrderManager b.Settings.EnableExchangeSyncManager = s.EnableExchangeSyncManager + b.Settings.EnableDepositAddressManager = s.EnableDepositAddressManager b.Settings.EnableTickerSyncing = s.EnableTickerSyncing b.Settings.EnableOrderbookSyncing = s.EnableOrderbookSyncing b.Settings.EnableExchangeAutoPairUpdates = s.EnableExchangeAutoPairUpdates @@ -228,6 +227,7 @@ func PrintSettings(s *Settings) { log.Debugf("\t Event manager sleep delay: %v", s.EventManagerDelay) log.Debugf("\t Enable order manager: %v", s.EnableOrderManager) log.Debugf("\t Enable exchange sync manager: %v", s.EnableExchangeSyncManager) + log.Debugf("\t Enable deposit address manager: %v\n", s.EnableDepositAddressManager) log.Debugf("\t Enable ticker syncing: %v", s.EnableTickerSyncing) log.Debugf("\t Enable orderbook syncing: %v", s.EnableOrderbookSyncing) log.Debugf("\t Enable websocket routine: %v\n", s.EnableWebsocketRoutine) @@ -277,6 +277,7 @@ func (e *Engine) Start() { e.Uptime = time.Now() log.Debugf("Bot '%s' started.\n", e.Config.Name) + log.Debugf("Using data dir: %s\n", e.Settings.DataDir) enabledExchanges := e.Config.CountEnabledExchanges() if e.Settings.EnableAllExchanges { @@ -331,8 +332,6 @@ func (e *Engine) Start() { log.Warn("currency updater system failed to start", err) } - e.CryptocurrencyDepositAddresses = GetExchangeCryptocurrencyDepositAddresses() - if e.Settings.EnableGRPC { go StartRPCServer() } @@ -352,6 +351,11 @@ func (e *Engine) Start() { } } + if e.Settings.EnableDepositAddressManager { + e.DepositAddressManager = new(DepositAddressManager) + e.DepositAddressManager.Sync() + } + if e.Settings.EnableOrderManager { if err = e.OrderManager.Start(); err != nil { log.Errorf("Order manager unable to start: %v", err) diff --git a/engine/engine_types.go b/engine/engine_types.go index 32728c93..accad577 100644 --- a/engine/engine_types.go +++ b/engine/engine_types.go @@ -21,6 +21,7 @@ type Settings struct { EnableDeprecatedRPC bool EnableCommsRelayer bool EnableExchangeSyncManager bool + EnableDepositAddressManager bool EnableTickerSyncing bool EnableOrderbookSyncing bool EnableEventManager bool diff --git a/engine/helpers.go b/engine/helpers.go index c97122ab..a1f98ad1 100644 --- a/engine/helpers.go +++ b/engine/helpers.go @@ -629,15 +629,34 @@ func GetCryptocurrenciesByExchange(exchangeName string, enabledExchangesOnly, en return cryptocurrencies, nil } +// GetCryptocurrencyDepositAddressesByExchange returns the cryptocurrency deposit addresses for a particular exchange +func GetCryptocurrencyDepositAddressesByExchange(exchName string) (map[string]string, error) { + if Bot.DepositAddressManager != nil { + return Bot.DepositAddressManager.GetDepositAddressesByExchange(exchName) + } + + result := GetExchangeCryptocurrencyDepositAddresses() + r, ok := result[exchName] + if !ok { + return nil, ErrExchangeNotFound + } + + return r, nil +} + // GetExchangeCryptocurrencyDepositAddress returns the cryptocurrency deposit address for a particular // exchange -func GetExchangeCryptocurrencyDepositAddress(exchName string, item currency.Code) (string, error) { +func GetExchangeCryptocurrencyDepositAddress(exchName, accountID string, item currency.Code) (string, error) { + if Bot.DepositAddressManager != nil { + return Bot.DepositAddressManager.GetDepositAddressByExchange(exchName, item) + } + exch := GetExchangeByName(exchName) if exch == nil { return "", ErrExchangeNotFound } - return exch.GetDepositAddress(item, "") + return exch.GetDepositAddress(item, accountID) } // GetExchangeCryptocurrencyDepositAddresses obtains an exchanges deposit cryptocurrency list @@ -649,7 +668,6 @@ func GetExchangeCryptocurrencyDepositAddresses() map[string]map[string]string { continue } exchName := Bot.Exchanges[x].GetName() - if !Bot.Exchanges[x].GetAuthenticatedAPISupport(exchange.RestAuthentication) { if Bot.Settings.Verbose { log.Debugf("GetExchangeCryptocurrencyDepositAddresses: Skippping %s due to disabled authenticated API support.", exchName) @@ -679,40 +697,18 @@ func GetExchangeCryptocurrencyDepositAddresses() map[string]map[string]string { return result } -// GetDepositAddressByExchange returns a deposit address for the specified exchange and cryptocurrency -// if it exists -func GetDepositAddressByExchange(exchName string, currencyItem currency.Code) string { - for x, y := range Bot.CryptocurrencyDepositAddresses { - if exchName == x { - addr, ok := y[currencyItem.String()] - if ok { - return addr - } - } - } - return "" -} - -// GetDepositAddressesByExchange returns a list of cryptocurrency addresses for the specified -// exchange if they exist -func GetDepositAddressesByExchange(exchName string) map[string]string { - for x, y := range Bot.CryptocurrencyDepositAddresses { - if exchName == x { - return y - } - } - return nil -} - // WithdrawCryptocurrencyFundsByExchange withdraws the desired cryptocurrency and amount to a desired cryptocurrency address -func WithdrawCryptocurrencyFundsByExchange(exchName string) (string, error) { +func WithdrawCryptocurrencyFundsByExchange(exchName string, req *exchange.CryptoWithdrawRequest) (string, error) { + if req == nil { + return "", errors.New("crypto withdraw request param is nil") + } + exch := GetExchangeByName(exchName) if exch == nil { return "", ErrExchangeNotFound } - // TO-DO: FILL - return exch.WithdrawCryptocurrencyFunds(&exchange.CryptoWithdrawRequest{}) + return exch.WithdrawCryptocurrencyFunds(req) } // FormatCurrency is a method that formats and returns a currency pair diff --git a/engine/orders.go b/engine/orders.go index 07aa93b1..9f6a8177 100644 --- a/engine/orders.go +++ b/engine/orders.go @@ -64,8 +64,6 @@ func (o *orderManager) Start() error { log.Debugln("Order manager starting...") - // test param - o.cfg.CancelOrdersOnShutdown = true o.shutdown = make(chan struct{}) o.orderStore.Orders = make(map[string][]exchange.OrderDetail) go o.run() diff --git a/engine/rpcserver.go b/engine/rpcserver.go index 473f5007..6ea39dc9 100644 --- a/engine/rpcserver.go +++ b/engine/rpcserver.go @@ -727,7 +727,8 @@ func (s *RPCServer) GetCryptocurrencyDepositAddresses(ctx context.Context, r *gc return nil, errors.New("exchange is not loaded/doesn't exist") } - return &gctrpc.GetCryptocurrencyDepositAddressesResponse{}, common.ErrNotYetImplemented + result, err := GetCryptocurrencyDepositAddressesByExchange(r.Exchange) + return &gctrpc.GetCryptocurrencyDepositAddressesResponse{Addresses: result}, err } // GetCryptocurrencyDepositAddress returns a cryptocurrency deposit address @@ -738,7 +739,7 @@ func (s *RPCServer) GetCryptocurrencyDepositAddress(ctx context.Context, r *gctr return nil, errors.New("exchange is not loaded/doesn't exist") } - addr, err := exch.GetDepositAddress(currency.NewCode(r.Cryptocurrency), "") + addr, err := GetExchangeCryptocurrencyDepositAddress(r.Exchange, "", currency.NewCode(r.Cryptocurrency)) return &gctrpc.GetCryptocurrencyDepositAddressResponse{Address: addr}, err } diff --git a/exchanges/anx/anx_wrapper.go b/exchanges/anx/anx_wrapper.go index 70705718..e0472ab8 100644 --- a/exchanges/anx/anx_wrapper.go +++ b/exchanges/anx/anx_wrapper.go @@ -485,7 +485,7 @@ func (a *ANX) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([]ex Amount: resp[i].TradedCurrencyAmount, CurrencyPair: currency.NewPairWithDelimiter(resp[i].TradedCurrency, resp[i].SettlementCurrency, - a.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + a.GetPairFormat(asset.Spot, false).Delimiter), OrderDate: orderDate, Exchange: a.Name, ID: resp[i].OrderID, @@ -527,7 +527,7 @@ func (a *ANX) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([]ex Status: resp[i].OrderStatus, CurrencyPair: currency.NewPairWithDelimiter(resp[i].TradedCurrency, resp[i].SettlementCurrency, - a.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + a.GetPairFormat(asset.Spot, false).Delimiter), } orders = append(orders, orderDetail) diff --git a/exchanges/bithumb/bithumb_wrapper.go b/exchanges/bithumb/bithumb_wrapper.go index 6836b8ea..e84c4cd2 100644 --- a/exchanges/bithumb/bithumb_wrapper.go +++ b/exchanges/bithumb/bithumb_wrapper.go @@ -447,7 +447,7 @@ func (b *Bithumb) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ( Status: string(exchange.ActiveOrderStatus), CurrencyPair: currency.NewPairWithDelimiter(resp.Data[i].OrderCurrency, resp.Data[i].PaymentCurrency, - b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + b.GetPairFormat(asset.Spot, false).Delimiter), } if resp.Data[i].Type == "bid" { @@ -490,7 +490,7 @@ func (b *Bithumb) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ( RemainingAmount: resp.Data[i].UnitsRemaining, CurrencyPair: currency.NewPairWithDelimiter(resp.Data[i].OrderCurrency, resp.Data[i].PaymentCurrency, - b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + b.GetPairFormat(asset.Spot, false).Delimiter), } if resp.Data[i].Type == "bid" { diff --git a/exchanges/bitmex/bitmex_wrapper.go b/exchanges/bitmex/bitmex_wrapper.go index f62a4335..a86b9a92 100644 --- a/exchanges/bitmex/bitmex_wrapper.go +++ b/exchanges/bitmex/bitmex_wrapper.go @@ -519,7 +519,7 @@ func (b *Bitmex) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([ Status: resp[i].OrdStatus, CurrencyPair: currency.NewPairWithDelimiter(resp[i].Symbol, resp[i].SettlCurrency, - b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + b.GetPairFormat(asset.PerpetualContract, false).Delimiter), } orders = append(orders, orderDetail) @@ -561,7 +561,7 @@ func (b *Bitmex) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([ Status: resp[i].OrdStatus, CurrencyPair: currency.NewPairWithDelimiter(resp[i].Symbol, resp[i].SettlCurrency, - b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + b.GetPairFormat(asset.PerpetualContract, false).Delimiter), } orders = append(orders, orderDetail) diff --git a/exchanges/bitstamp/bitstamp.go b/exchanges/bitstamp/bitstamp.go index 91dc3a0f..6787ff52 100644 --- a/exchanges/bitstamp/bitstamp.go +++ b/exchanges/bitstamp/bitstamp.go @@ -505,6 +505,9 @@ func (b *Bitstamp) OpenInternationalBankWithdrawal(amount float64, currency, // crypto - example "btc", "ltc", "eth", "xrp" or "bch" func (b *Bitstamp) GetCryptoDepositAddress(crypto currency.Code) (string, error) { var resp string + v2Resp := struct { + Address string `json:"address"` + }{} switch crypto { case currency.BTC: @@ -512,20 +515,20 @@ func (b *Bitstamp) GetCryptoDepositAddress(crypto currency.Code) (string, error) b.SendAuthenticatedHTTPRequest(bitstampAPIBitcoinDeposit, false, nil, &resp) case currency.LTC: - return resp, - b.SendAuthenticatedHTTPRequest(bitstampAPILitecoinDeposit, true, nil, &resp) + return v2Resp.Address, + b.SendAuthenticatedHTTPRequest(bitstampAPILitecoinDeposit, true, nil, &v2Resp) case currency.ETH: - return resp, - b.SendAuthenticatedHTTPRequest(bitstampAPIEthereumDeposit, true, nil, &resp) + return v2Resp.Address, + b.SendAuthenticatedHTTPRequest(bitstampAPIEthereumDeposit, true, nil, &v2Resp) case currency.XRP: - return resp, - b.SendAuthenticatedHTTPRequest(bitstampAPIXrpDeposit, true, nil, &resp) + return v2Resp.Address, + b.SendAuthenticatedHTTPRequest(bitstampAPIXrpDeposit, true, nil, &v2Resp) case currency.BCH: - return resp, - b.SendAuthenticatedHTTPRequest(bitstampAPIBitcoinCashDeposit, true, nil, &resp) + return v2Resp.Address, + b.SendAuthenticatedHTTPRequest(bitstampAPIBitcoinCashDeposit, true, nil, &v2Resp) default: return resp, fmt.Errorf("unsupported cryptocurrency string %s", crypto) diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index 51626680..75231916 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -473,7 +473,8 @@ func (b *BTCMarkets) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest Price: resp[i].Price, Status: resp[i].Status, CurrencyPair: currency.NewPairWithDelimiter(resp[i].Instrument, - resp[i].Currency, "-"), + resp[i].Currency, + b.GetPairFormat(asset.Spot, false).Delimiter), } for j := range resp[i].Trades { @@ -542,7 +543,7 @@ func (b *BTCMarkets) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest Status: respOrders[i].Status, CurrencyPair: currency.NewPairWithDelimiter(respOrders[i].Instrument, respOrders[i].Currency, - b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + b.GetPairFormat(asset.Spot, false).Delimiter), } for j := range respOrders[i].Trades { diff --git a/exchanges/gemini/gemini_wrapper.go b/exchanges/gemini/gemini_wrapper.go index eb765659..11bb0c2c 100644 --- a/exchanges/gemini/gemini_wrapper.go +++ b/exchanges/gemini/gemini_wrapper.go @@ -459,7 +459,7 @@ func (g *Gemini) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([ Price: trades[i].Price, CurrencyPair: currency.NewPairWithDelimiter(trades[i].BaseCurrency, trades[i].QuoteCurrency, - g.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + g.GetPairFormat(asset.Spot, false).Delimiter), }) } diff --git a/exchanges/localbitcoins/localbitcoins_wrapper.go b/exchanges/localbitcoins/localbitcoins_wrapper.go index 9ca6b872..b977c30a 100644 --- a/exchanges/localbitcoins/localbitcoins_wrapper.go +++ b/exchanges/localbitcoins/localbitcoins_wrapper.go @@ -443,7 +443,7 @@ func (l *LocalBitcoins) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequ OrderSide: side, CurrencyPair: currency.NewPairWithDelimiter(currency.BTC.String(), resp[i].Data.Currency, - l.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + l.GetPairFormat(asset.Spot, false).Delimiter), Exchange: l.Name, }) } @@ -516,7 +516,7 @@ func (l *LocalBitcoins) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequ Status: status, CurrencyPair: currency.NewPairWithDelimiter(currency.BTC.String(), allTrades[i].Data.Currency, - l.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter), + l.GetPairFormat(asset.Spot, false).Delimiter), Exchange: l.Name, }) } diff --git a/main.go b/main.go index 1ce4b8fd..5ffba2af 100644 --- a/main.go +++ b/main.go @@ -46,6 +46,7 @@ func main() { flag.BoolVar(&settings.EnableCoinmarketcapAnalysis, "coinmarketcap", false, "overrides config and runs currency analysis") flag.BoolVar(&settings.EnableEventManager, "eventmanager", true, "enables the event manager") flag.BoolVar(&settings.EnableOrderManager, "ordermanager", true, "enables the order manager") + flag.BoolVar(&settings.EnableDepositAddressManager, "depositaddressmanager", true, "enables the deposit address manager") flag.BoolVar(&settings.EnableConnectivityMonitor, "connectivitymonitor", true, "enables the connectivity monitor") flag.DurationVar(&settings.EventManagerDelay, "eventmanagerdelay", time.Duration(0), "sets the event managers sleep delay between event checking") flag.BoolVar(&settings.EnableNTPClient, "ntpclient", true, "enables the NTP client to check system clock drift")