mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* state: Add management system (init) * linter: fix * engine: gofmt * gct: after merge fixup * documentation: add * rpc: implement services for testing * gctcli: gofmt state_management.go * documentation: reinstate lost information * state: Add pair check to determine trading operation * exchanges: add interface for specific state scoped subsystem functionality * engine/order_man: reduce code footprint using new method * RPC: implement pair trading request and change exported name to something specific to state * engine: add tests * engine: Add to withdraw manager * documentation: reinstate soxipy in contrib. list * engine: const fake name * Glorious: NITERINOS * merge: fix issues * engine: csm incorporate service name into log output * engine: fix linter issues * gct: fix tests * currencystate: remove management type * rpc: fix tests * backtester: fix tests * Update engine/currency_state_manager.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update engine/currency_state_manager.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/currencystate/currency_state.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/alert/alert.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/alert/alert.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits * config: integrate with config and remove flag delay adjustment * gctcli: fix issues after name changes * engine: gofmt manager file * Update engine/rpcserver.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * engine: Add enable/disable manager functions, add default popoulation for potential assets * linter: fix * engine/test: bump subsystem count * Update engine/currency_state_manager.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/bithumb/bithumb.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits addressed * alert: fix commenting for its generalized purpose * glorious: nits * engine: use standard string in log output * bitfinex: apply patch, thanks @thrasher- * bitfinex: fix spelling * engine/currencystate: Add logs/fix logs Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
338 lines
16 KiB
Go
338 lines
16 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/communications/base"
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/database"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
|
|
gctscript "github.com/thrasher-corp/gocryptotrader/gctscript/vm"
|
|
"github.com/thrasher-corp/gocryptotrader/log"
|
|
"github.com/thrasher-corp/gocryptotrader/portfolio"
|
|
"github.com/thrasher-corp/gocryptotrader/portfolio/banking"
|
|
)
|
|
|
|
// Constants declared here are filename strings and test strings
|
|
const (
|
|
FXProviderFixer = "fixer"
|
|
EncryptedFile = "config.dat"
|
|
File = "config.json"
|
|
TestFile = "../testdata/configtest.json"
|
|
fileEncryptionPrompt = 0
|
|
fileEncryptionEnabled = 1
|
|
fileEncryptionDisabled = -1
|
|
pairsLastUpdatedWarningThreshold = 30 // 30 days
|
|
defaultHTTPTimeout = time.Second * 15
|
|
defaultWebsocketResponseCheckTimeout = time.Millisecond * 30
|
|
defaultWebsocketResponseMaxLimit = time.Second * 7
|
|
defaultWebsocketOrderbookBufferLimit = 5
|
|
defaultWebsocketTrafficTimeout = time.Second * 30
|
|
maxAuthFailures = 3
|
|
defaultNTPAllowedDifference = 50000000
|
|
defaultNTPAllowedNegativeDifference = 50000000
|
|
DefaultAPIKey = "Key"
|
|
DefaultAPISecret = "Secret"
|
|
DefaultAPIClientID = "ClientID"
|
|
defaultDataHistoryMonitorCheckTimer = time.Minute
|
|
defaultCurrencyStateManagerDelay = time.Minute
|
|
defaultMaxJobsPerCycle = 5
|
|
)
|
|
|
|
// Constants here hold some messages
|
|
const (
|
|
ErrExchangeNameEmpty = "exchange #%d name is empty"
|
|
ErrNoEnabledExchanges = "no exchanges enabled"
|
|
ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s"
|
|
ErrCheckingConfigValues = "fatal error checking config values. Error: %s"
|
|
WarningExchangeAuthAPIDefaultOrEmptyValues = "exchange %s authenticated API support disabled due to default/empty APIKey/Secret/ClientID values"
|
|
WarningPairsLastUpdatedThresholdExceeded = "exchange %s last manual update of available currency pairs has exceeded %d days. Manual update required!"
|
|
)
|
|
|
|
// Constants here define unset default values displayed in the config.json
|
|
// file
|
|
const (
|
|
APIURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API"
|
|
WebsocketURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API"
|
|
DefaultUnsetAPIKey = "Key"
|
|
DefaultUnsetAPISecret = "Secret"
|
|
DefaultUnsetAccountPlan = "accountPlan"
|
|
DefaultForexProviderExchangeRatesAPI = "ExchangeRateHost"
|
|
)
|
|
|
|
// Variables here are used for configuration
|
|
var (
|
|
Cfg Config
|
|
m sync.Mutex
|
|
ErrExchangeNotFound = errors.New("exchange not found")
|
|
)
|
|
|
|
// Config is the overarching object that holds all the information for
|
|
// prestart management of Portfolio, Communications, Webserver and Enabled
|
|
// Exchanges
|
|
type Config struct {
|
|
Name string `json:"name"`
|
|
DataDirectory string `json:"dataDirectory"`
|
|
EncryptConfig int `json:"encryptConfig"`
|
|
GlobalHTTPTimeout time.Duration `json:"globalHTTPTimeout"`
|
|
Database database.Config `json:"database"`
|
|
Logging log.Config `json:"logging"`
|
|
ConnectionMonitor ConnectionMonitorConfig `json:"connectionMonitor"`
|
|
DataHistoryManager DataHistoryManager `json:"dataHistoryManager"`
|
|
CurrencyStateManager CurrencyStateManager `json:"currencyStateManager"`
|
|
Profiler Profiler `json:"profiler"`
|
|
NTPClient NTPClientConfig `json:"ntpclient"`
|
|
GCTScript gctscript.Config `json:"gctscript"`
|
|
Currency CurrencyConfig `json:"currencyConfig"`
|
|
Communications base.CommunicationsConfig `json:"communications"`
|
|
RemoteControl RemoteControlConfig `json:"remoteControl"`
|
|
Portfolio portfolio.Base `json:"portfolioAddresses"`
|
|
Exchanges []ExchangeConfig `json:"exchanges"`
|
|
BankAccounts []banking.Account `json:"bankAccounts"`
|
|
|
|
// Deprecated config settings, will be removed at a future date
|
|
Webserver *WebserverConfig `json:"webserver,omitempty"`
|
|
CurrencyPairFormat *CurrencyPairFormatConfig `json:"currencyPairFormat,omitempty"`
|
|
FiatDisplayCurrency *currency.Code `json:"fiatDispayCurrency,omitempty"`
|
|
Cryptocurrencies *currency.Currencies `json:"cryptocurrencies,omitempty"`
|
|
SMS *base.SMSGlobalConfig `json:"smsGlobal,omitempty"`
|
|
// encryption session values
|
|
storedSalt []byte
|
|
sessionDK []byte
|
|
}
|
|
|
|
// DataHistoryManager holds all information required for the data history manager
|
|
type DataHistoryManager struct {
|
|
Enabled bool `json:"enabled"`
|
|
CheckInterval time.Duration `json:"checkInterval"`
|
|
MaxJobsPerCycle int64 `json:"maxJobsPerCycle"`
|
|
MaxResultInsertions int64 `json:"maxResultInsertions"`
|
|
Verbose bool `json:"verbose"`
|
|
}
|
|
|
|
// CurrencyStateManager defines a set of configuration options for the currency
|
|
// state manager
|
|
type CurrencyStateManager struct {
|
|
Enabled *bool `json:"enabled"`
|
|
Delay time.Duration `json:"delay"`
|
|
}
|
|
|
|
// ConnectionMonitorConfig defines the connection monitor variables to ensure
|
|
// that there is internet connectivity
|
|
type ConnectionMonitorConfig struct {
|
|
DNSList []string `json:"preferredDNSList"`
|
|
PublicDomainList []string `json:"preferredDomainList"`
|
|
CheckInterval time.Duration `json:"checkInterval"`
|
|
}
|
|
|
|
// ExchangeConfig holds all the information needed for each enabled Exchange.
|
|
type ExchangeConfig struct {
|
|
Name string `json:"name"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
UseSandbox bool `json:"useSandbox,omitempty"`
|
|
HTTPTimeout time.Duration `json:"httpTimeout"`
|
|
HTTPUserAgent string `json:"httpUserAgent,omitempty"`
|
|
HTTPDebugging bool `json:"httpDebugging,omitempty"`
|
|
WebsocketResponseCheckTimeout time.Duration `json:"websocketResponseCheckTimeout"`
|
|
WebsocketResponseMaxLimit time.Duration `json:"websocketResponseMaxLimit"`
|
|
WebsocketTrafficTimeout time.Duration `json:"websocketTrafficTimeout"`
|
|
ProxyAddress string `json:"proxyAddress,omitempty"`
|
|
BaseCurrencies currency.Currencies `json:"baseCurrencies"`
|
|
CurrencyPairs *currency.PairsManager `json:"currencyPairs"`
|
|
API APIConfig `json:"api"`
|
|
Features *FeaturesConfig `json:"features"`
|
|
BankAccounts []banking.Account `json:"bankAccounts,omitempty"`
|
|
OrderbookConfig `json:"orderbook"`
|
|
|
|
// Deprecated settings which will be removed in a future update
|
|
AvailablePairs *currency.Pairs `json:"availablePairs,omitempty"`
|
|
EnabledPairs *currency.Pairs `json:"enabledPairs,omitempty"`
|
|
AssetTypes *string `json:"assetTypes,omitempty"`
|
|
PairsLastUpdated *int64 `json:"pairsLastUpdated,omitempty"`
|
|
ConfigCurrencyPairFormat *currency.PairFormat `json:"configCurrencyPairFormat,omitempty"`
|
|
RequestCurrencyPairFormat *currency.PairFormat `json:"requestCurrencyPairFormat,omitempty"`
|
|
AuthenticatedAPISupport *bool `json:"authenticatedApiSupport,omitempty"`
|
|
AuthenticatedWebsocketAPISupport *bool `json:"authenticatedWebsocketApiSupport,omitempty"`
|
|
APIKey *string `json:"apiKey,omitempty"`
|
|
APISecret *string `json:"apiSecret,omitempty"`
|
|
APIAuthPEMKeySupport *bool `json:"apiAuthPemKeySupport,omitempty"`
|
|
APIAuthPEMKey *string `json:"apiAuthPemKey,omitempty"`
|
|
APIURL *string `json:"apiUrl,omitempty"`
|
|
APIURLSecondary *string `json:"apiUrlSecondary,omitempty"`
|
|
ClientID *string `json:"clientId,omitempty"`
|
|
SupportsAutoPairUpdates *bool `json:"supportsAutoPairUpdates,omitempty"`
|
|
Websocket *bool `json:"websocket,omitempty"`
|
|
WebsocketURL *string `json:"websocketUrl,omitempty"`
|
|
}
|
|
|
|
// Profiler defines the profiler configuration to enable pprof
|
|
type Profiler struct {
|
|
Enabled bool `json:"enabled"`
|
|
MutexProfileFraction int `json:"mutex_profile_fraction"`
|
|
}
|
|
|
|
// NTPClientConfig defines a network time protocol configuration to allow for
|
|
// positive and negative differences
|
|
type NTPClientConfig struct {
|
|
Level int `json:"enabled"`
|
|
Pool []string `json:"pool"`
|
|
AllowedDifference *time.Duration `json:"allowedDifference"`
|
|
AllowedNegativeDifference *time.Duration `json:"allowedNegativeDifference"`
|
|
}
|
|
|
|
// GRPCConfig stores the gRPC settings
|
|
type GRPCConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
ListenAddress string `json:"listenAddress"`
|
|
GRPCProxyEnabled bool `json:"grpcProxyEnabled"`
|
|
GRPCProxyListenAddress string `json:"grpcProxyListenAddress"`
|
|
TimeInNanoSeconds bool `json:"timeInNanoSeconds"`
|
|
}
|
|
|
|
// DepcrecatedRPCConfig stores the deprecatedRPCConfig settings
|
|
type DepcrecatedRPCConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
ListenAddress string `json:"listenAddress"`
|
|
}
|
|
|
|
// WebsocketRPCConfig stores the websocket config info
|
|
type WebsocketRPCConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
ListenAddress string `json:"listenAddress"`
|
|
ConnectionLimit int `json:"connectionLimit"`
|
|
MaxAuthFailures int `json:"maxAuthFailures"`
|
|
AllowInsecureOrigin bool `json:"allowInsecureOrigin"`
|
|
}
|
|
|
|
// RemoteControlConfig stores the RPC services config
|
|
type RemoteControlConfig struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
|
|
GRPC GRPCConfig `json:"gRPC"`
|
|
DeprecatedRPC DepcrecatedRPCConfig `json:"deprecatedRPC"`
|
|
WebsocketRPC WebsocketRPCConfig `json:"websocketRPC"`
|
|
}
|
|
|
|
// WebserverConfig stores the old webserver config
|
|
type WebserverConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
AdminUsername string `json:"adminUsername"`
|
|
AdminPassword string `json:"adminPassword"`
|
|
ListenAddress string `json:"listenAddress"`
|
|
WebsocketConnectionLimit int `json:"websocketConnectionLimit"`
|
|
WebsocketMaxAuthFailures int `json:"websocketMaxAuthFailures"`
|
|
WebsocketAllowInsecureOrigin bool `json:"websocketAllowInsecureOrigin"`
|
|
}
|
|
|
|
// Post holds the bot configuration data
|
|
type Post struct {
|
|
Data Config `json:"data"`
|
|
}
|
|
|
|
// CurrencyPairFormatConfig stores the users preferred currency pair display
|
|
type CurrencyPairFormatConfig struct {
|
|
Uppercase bool `json:"uppercase"`
|
|
Delimiter string `json:"delimiter,omitempty"`
|
|
Separator string `json:"separator,omitempty"`
|
|
Index string `json:"index,omitempty"`
|
|
}
|
|
|
|
// BankTransaction defines a related banking transaction
|
|
type BankTransaction struct {
|
|
ReferenceNumber string `json:"referenceNumber"`
|
|
TransactionNumber string `json:"transactionNumber"`
|
|
PaymentInstructions string `json:"paymentInstructions"`
|
|
}
|
|
|
|
// CurrencyConfig holds all the information needed for currency related manipulation
|
|
type CurrencyConfig struct {
|
|
ForexProviders []currency.FXSettings `json:"forexProviders"`
|
|
CryptocurrencyProvider CryptocurrencyProvider `json:"cryptocurrencyProvider"`
|
|
Cryptocurrencies currency.Currencies `json:"cryptocurrencies"`
|
|
CurrencyPairFormat *CurrencyPairFormatConfig `json:"currencyPairFormat"`
|
|
FiatDisplayCurrency currency.Code `json:"fiatDisplayCurrency"`
|
|
CurrencyFileUpdateDuration time.Duration `json:"currencyFileUpdateDuration"`
|
|
ForeignExchangeUpdateDuration time.Duration `json:"foreignExchangeUpdateDuration"`
|
|
}
|
|
|
|
// CryptocurrencyProvider defines coinmarketcap tools
|
|
type CryptocurrencyProvider struct {
|
|
Name string `json:"name"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
APIkey string `json:"apiKey"`
|
|
AccountPlan string `json:"accountPlan"`
|
|
}
|
|
|
|
// FeaturesSupportedConfig stores the exchanges supported features
|
|
type FeaturesSupportedConfig struct {
|
|
REST bool `json:"restAPI"`
|
|
RESTCapabilities protocol.Features `json:"restCapabilities,omitempty"`
|
|
Websocket bool `json:"websocketAPI"`
|
|
WebsocketCapabilities protocol.Features `json:"websocketCapabilities,omitempty"`
|
|
}
|
|
|
|
// FeaturesEnabledConfig stores the exchanges enabled features
|
|
type FeaturesEnabledConfig struct {
|
|
AutoPairUpdates bool `json:"autoPairUpdates"`
|
|
Websocket bool `json:"websocketAPI"`
|
|
SaveTradeData bool `json:"saveTradeData"`
|
|
}
|
|
|
|
// FeaturesConfig stores the exchanges supported and enabled features
|
|
type FeaturesConfig struct {
|
|
Supports FeaturesSupportedConfig `json:"supports"`
|
|
Enabled FeaturesEnabledConfig `json:"enabled"`
|
|
}
|
|
|
|
// APIEndpointsConfig stores the API endpoint addresses
|
|
type APIEndpointsConfig struct {
|
|
URL string `json:"url"`
|
|
URLSecondary string `json:"urlSecondary"`
|
|
WebsocketURL string `json:"websocketURL"`
|
|
}
|
|
|
|
// APICredentialsConfig stores the API credentials
|
|
type APICredentialsConfig struct {
|
|
Key string `json:"key,omitempty"`
|
|
Secret string `json:"secret,omitempty"`
|
|
ClientID string `json:"clientID,omitempty"`
|
|
Subaccount string `json:"subaccount,omitempty"`
|
|
PEMKey string `json:"pemKey,omitempty"`
|
|
OTPSecret string `json:"otpSecret,omitempty"`
|
|
}
|
|
|
|
// APICredentialsValidatorConfig stores the API credentials validator settings
|
|
type APICredentialsValidatorConfig struct {
|
|
// For Huobi (optional)
|
|
RequiresPEM bool `json:"requiresPEM,omitempty"`
|
|
|
|
RequiresKey bool `json:"requiresKey,omitempty"`
|
|
RequiresSecret bool `json:"requiresSecret,omitempty"`
|
|
RequiresClientID bool `json:"requiresClientID,omitempty"`
|
|
RequiresBase64DecodeSecret bool `json:"requiresBase64DecodeSecret,omitempty"`
|
|
}
|
|
|
|
// APIConfig stores the exchange API config
|
|
type APIConfig struct {
|
|
AuthenticatedSupport bool `json:"authenticatedSupport"`
|
|
AuthenticatedWebsocketSupport bool `json:"authenticatedWebsocketApiSupport"`
|
|
PEMKeySupport bool `json:"pemKeySupport,omitempty"`
|
|
|
|
Credentials APICredentialsConfig `json:"credentials"`
|
|
CredentialsValidator *APICredentialsValidatorConfig `json:"credentialsValidator,omitempty"`
|
|
OldEndPoints *APIEndpointsConfig `json:"endpoints,omitempty"`
|
|
Endpoints map[string]string `json:"urlEndpoints"`
|
|
}
|
|
|
|
// OrderbookConfig stores the orderbook configuration variables
|
|
type OrderbookConfig struct {
|
|
VerificationBypass bool `json:"verificationBypass"`
|
|
WebsocketBufferLimit int `json:"websocketBufferLimit"`
|
|
WebsocketBufferEnabled bool `json:"websocketBufferEnabled"`
|
|
}
|