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")