mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* port orderbook binance management from draft singular asset (spot) processing add additional updates to buffer management * integrate port * shifted burden of proof to exchange and remove repairing techniques that obfuscate issues and could caause artifacts * WIP * Update exchanges, update tests, update configuration so we can default off on buffer util. * Add buffer enabled switching to all exchanges and some that are missing, default to off. * lbtc set not aggregate books * Addr linter issues * EOD wip * optimization and bug fix pass * clean before test and benchmarking * add testing/benchmarks to sorting/reversing functions, dropped pointer to slice as we aren't changing slice len or cap * Add tests and removed ptr for main book as we just ammend amount * addr exchange test issues * ci issues * addr glorious issues * Addr MCB nits, fixed funding rate book for bitfinex and fixed potential panic on nil book return * addr linter issues * updated mistakes * Fix more tests * revert bypass * Addr mcb nits * fix zero price bug caused by exchange. Filted out bid result rather then unsubscribing. Updated orderbook to L2 so there is no aggregation. * Allow for zero bid and ask books to be loaded and warn if found. * remove authentication subscription conflicts as they do not have a channel ID return * WIP - Batching outbound requests for kraken as they do not give you the partial if you subscribe to do many things. * finalised outbound request for kraken * filter zero value due to invalid returned data from exchange, add in max subscription amount and increased outbound batch limit * expand to max allowed book length & fix issue where they were sending a zero length ask side when we sent a depth of zero * Updated function comments and added in more realistic book sizing for sort cases * change map ordering * amalgamate maps in buffer * Rm ln * fix kraken linter issues * add in buffer initialisation * increase timout by 30seconds * Coinbene: Add websocket orderbook length check. * Engine: Improve switch statement for orderbook summary dissplay. * Binance: Added tests, remove deadlock * Exchanges: Change orderbook field -> IsFundingRate * Orderbook Buffer: Added method to orderbookHolder * Kraken: removed superfluous integer for sleep * Bitmex: fixed error return * cmd/gctcli: force 8 decimal place usage for orderbook streaming * Kraken: Add checksum and fix bug where we were dropping returned data which was causing artifacts * Kraken: As per orderbook documentation added in maxdepth field to update to filter depth that goes beyond current scope * Bitfinex: Tracking down bug on margin-funding, added sequence and checksum validation websocket config on connect (WIP) * Bitfinex: Complete implementation of checksum * Bitfinex: Fix funding book insertion and checksum - Dropped updates and deleting items not on book are continuously occuring from stream * Bitfinex: Fix linter issues * Bitfinex: Fix even more linter issues. * Bitmex: Populate orderbook base identification fields to be passed back when error occurrs * OkGroup: Populate orderbook base identification fields to be passed back when error occurrs * BTSE: Change string check to 'connect success' to capture multiple user successful strings * Bitfinex: Updated handling of funding tickers * Bitfinex: Fix undocumented alignment bug for funding rates * Bitfinex: Updated error return with more information * Bitfinex: Change REST fetching to Raw book to keep it in line with websocket implementation. Fix woopsy. * Localbitcoins: Had to impose a rate limiter to stop errors, fixed return for easier error identification. * Exchanges: Update failing tests * LocalBitcoins: Addr nit and bumped time by 1 second for fetching books * Kraken: Dynamically scale precision based on str return for checksum calculations * Kraken: Add pair and asset type to validateCRC32 error reponse * BTSE: Filter out zero amount orderbook price levels in websocket return * Exchanges: Update orderbook functions to return orderbook base to differentiate errors. * BTSE: Fix spelling * Bitmex: Fix error return string * BTSE: Add orderbook filtering function * Coinbene: Change wording * BTSE: Add test for filtering * Binance: Addr nits, added in variables for buffers and worker amounts and fixed error log messages * GolangCI: Remove excess 0 * Binance: Reduces double ups on asset and pair in errors * Binance: Fix error checking
383 lines
17 KiB
Go
383 lines
17 KiB
Go
package config
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"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"
|
|
)
|
|
|
|
// Constants here hold some messages
|
|
const (
|
|
ErrExchangeNameEmpty = "exchange #%d name is empty"
|
|
ErrExchangeAvailablePairsEmpty = "exchange %s available pairs is empty"
|
|
ErrExchangeEnabledPairsEmpty = "exchange %s enabled pairs is empty"
|
|
ErrExchangeBaseCurrenciesEmpty = "exchange %s base currencies is empty"
|
|
ErrExchangeNotFound = "exchange %s not found"
|
|
ErrNoEnabledExchanges = "no exchanges enabled"
|
|
ErrCryptocurrenciesEmpty = "cryptocurrencies variable is empty"
|
|
ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s"
|
|
ErrCheckingConfigValues = "fatal error checking config values. Error: %s"
|
|
ErrSavingConfigBytesMismatch = "config file %q bytes comparison doesn't match, read %s expected %s"
|
|
WarningWebserverCredentialValuesEmpty = "webserver support disabled due to empty Username/Password values"
|
|
WarningWebserverListenAddressInvalid = "webserver support disabled due to invalid listen address"
|
|
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 = "ExchangeRates"
|
|
)
|
|
|
|
// Variables here are used for configuration
|
|
var (
|
|
Cfg Config
|
|
m sync.Mutex
|
|
)
|
|
|
|
// 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"`
|
|
Profiler Profiler `json:"profiler"`
|
|
NTPClient NTPClientConfig `json:"ntpclient"`
|
|
GCTScript gctscript.Config `json:"gctscript"`
|
|
Currency CurrencyConfig `json:"currencyConfig"`
|
|
Communications 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 *SMSGlobalConfig `json:"smsGlobal,omitempty"`
|
|
// encryption session values
|
|
storedSalt []byte
|
|
sessionDK []byte
|
|
}
|
|
|
|
// 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"`
|
|
WebsocketOrderbookBufferLimit int `json:"websocketOrderbookBufferLimit"`
|
|
WebsocketOrderbookBufferEnabled bool `json:"websocketOrderbookBufferEnabled"`
|
|
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"`
|
|
|
|
// 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"`
|
|
}
|
|
|
|
// 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"`
|
|
}
|
|
|
|
// CommunicationsConfig holds all the information needed for each
|
|
// enabled communication package
|
|
type CommunicationsConfig struct {
|
|
SlackConfig SlackConfig `json:"slack"`
|
|
SMSGlobalConfig SMSGlobalConfig `json:"smsGlobal"`
|
|
SMTPConfig SMTPConfig `json:"smtp"`
|
|
TelegramConfig TelegramConfig `json:"telegram"`
|
|
}
|
|
|
|
// IsAnyEnabled returns whether or any any comms relayers
|
|
// are enabled
|
|
func (c *CommunicationsConfig) IsAnyEnabled() bool {
|
|
if c.SMSGlobalConfig.Enabled ||
|
|
c.SMTPConfig.Enabled ||
|
|
c.SlackConfig.Enabled ||
|
|
c.TelegramConfig.Enabled {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// SlackConfig holds all variables to start and run the Slack package
|
|
type SlackConfig struct {
|
|
Name string `json:"name"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
TargetChannel string `json:"targetChannel"`
|
|
VerificationToken string `json:"verificationToken"`
|
|
}
|
|
|
|
// SMSContact stores the SMS contact info
|
|
type SMSContact struct {
|
|
Name string `json:"name"`
|
|
Number string `json:"number"`
|
|
Enabled bool `json:"enabled"`
|
|
}
|
|
|
|
// SMSGlobalConfig structure holds all the variables you need for instant
|
|
// messaging and broadcast used by SMSGlobal
|
|
type SMSGlobalConfig struct {
|
|
Name string `json:"name"`
|
|
From string `json:"from"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
Contacts []SMSContact `json:"contacts"`
|
|
}
|
|
|
|
// SMTPConfig holds all variables to start and run the SMTP package
|
|
type SMTPConfig struct {
|
|
Name string `json:"name"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
Host string `json:"host"`
|
|
Port string `json:"port"`
|
|
AccountName string `json:"accountName"`
|
|
AccountPassword string `json:"accountPassword"`
|
|
From string `json:"from"`
|
|
RecipientList string `json:"recipientList"`
|
|
}
|
|
|
|
// TelegramConfig holds all variables to start and run the Telegram package
|
|
type TelegramConfig struct {
|
|
Name string `json:"name"`
|
|
Enabled bool `json:"enabled"`
|
|
Verbose bool `json:"verbose"`
|
|
VerificationToken string `json:"verificationToken"`
|
|
}
|
|
|
|
// 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"`
|
|
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"`
|
|
|
|
Endpoints APIEndpointsConfig `json:"endpoints"`
|
|
Credentials APICredentialsConfig `json:"credentials"`
|
|
CredentialsValidator *APICredentialsValidatorConfig `json:"credentialsValidator,omitempty"`
|
|
}
|