mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-16 07:26:47 +00:00
* Exchanges: Remove example BespokeGenerateMessageID * Okx: Replace conn.RequestIDGenerator with MesssageID Continued overall direction to remove the closed-loop of e => conn => e roundtrip for message ids * Exchanges: Add MessageSequence This method removes the either/or nature of message id generation. We don't tie the message ids to connections, or to anything. Consumers just call whichever they want, or even combine them as they want. Anything more complicated will need a separate installation anyway * GateIO: Split usage of MessageID and MessageSequence * Binance: Switch to UUID message IDs * Kraken: Switch to e.MessageSequence * Kucoin: Switch to MessageID * HitBTC: Switch to UUIDv7 for ws message ID * Bybit: Switch to UUIDv7 for ws message ID * Bitfinex: Switch to UUIDv7 and MessageSequence Tested CID - It accepts 53 bits only for an int, so MessageSequence makes sense. Can't use MessageID * Websocket: Remove now unused MessageID function Moved all MessageID usage into funcs and onto base methods, to remove the closed loop of message IDs * Docs: Update guidance for message signatures
346 lines
12 KiB
Go
346 lines
12 KiB
Go
package exchange
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/common"
|
|
"github.com/thrasher-corp/gocryptotrader/config"
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/exchange/websocket"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/account"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/currencystate"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/kline"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/subscription"
|
|
)
|
|
|
|
// Endpoint authentication types
|
|
const (
|
|
// Repeated exchange strings
|
|
// FeeType custom type for calculating fees based on method
|
|
WireTransfer InternationalBankTransactionType = iota
|
|
PerfectMoney
|
|
Neteller
|
|
AdvCash
|
|
Payeer
|
|
Skrill
|
|
Simplex
|
|
SEPA
|
|
Swift
|
|
RapidTransfer
|
|
MisterTangoSEPA
|
|
Qiwi
|
|
VisaMastercard
|
|
WebMoney
|
|
Capitalist
|
|
WesternUnion
|
|
MoneyGram
|
|
Contact
|
|
// Const declarations for fee types
|
|
BankFee FeeType = iota
|
|
InternationalBankDepositFee
|
|
InternationalBankWithdrawalFee
|
|
CryptocurrencyTradeFee
|
|
CryptocurrencyDepositFee
|
|
CryptocurrencyWithdrawalFee
|
|
OfflineTradeFee
|
|
// Definitions for each type of withdrawal method for a given exchange
|
|
NoAPIWithdrawalMethods uint32 = 0
|
|
NoAPIWithdrawalMethodsText string = "NONE, WEBSITE ONLY"
|
|
AutoWithdrawCrypto uint32 = (1 << 0)
|
|
AutoWithdrawCryptoWithAPIPermission uint32 = (1 << 1)
|
|
AutoWithdrawCryptoWithSetup uint32 = (1 << 2)
|
|
AutoWithdrawCryptoText string = "AUTO WITHDRAW CRYPTO"
|
|
AutoWithdrawCryptoWithAPIPermissionText string = "AUTO WITHDRAW CRYPTO WITH API PERMISSION"
|
|
AutoWithdrawCryptoWithSetupText string = "AUTO WITHDRAW CRYPTO WITH SETUP"
|
|
WithdrawCryptoWith2FA uint32 = (1 << 3)
|
|
WithdrawCryptoWithSMS uint32 = (1 << 4)
|
|
WithdrawCryptoWithEmail uint32 = (1 << 5)
|
|
WithdrawCryptoWithWebsiteApproval uint32 = (1 << 6)
|
|
WithdrawCryptoWithAPIPermission uint32 = (1 << 7)
|
|
WithdrawCryptoWith2FAText string = "WITHDRAW CRYPTO WITH 2FA"
|
|
WithdrawCryptoWithSMSText string = "WITHDRAW CRYPTO WITH SMS"
|
|
WithdrawCryptoWithEmailText string = "WITHDRAW CRYPTO WITH EMAIL"
|
|
WithdrawCryptoWithWebsiteApprovalText string = "WITHDRAW CRYPTO WITH WEBSITE APPROVAL"
|
|
WithdrawCryptoWithAPIPermissionText string = "WITHDRAW CRYPTO WITH API PERMISSION"
|
|
AutoWithdrawFiat uint32 = (1 << 8)
|
|
AutoWithdrawFiatWithAPIPermission uint32 = (1 << 9)
|
|
AutoWithdrawFiatWithSetup uint32 = (1 << 10)
|
|
AutoWithdrawFiatText string = "AUTO WITHDRAW FIAT"
|
|
AutoWithdrawFiatWithAPIPermissionText string = "AUTO WITHDRAW FIAT WITH API PERMISSION"
|
|
AutoWithdrawFiatWithSetupText string = "AUTO WITHDRAW FIAT WITH SETUP"
|
|
WithdrawFiatWith2FA uint32 = (1 << 11)
|
|
WithdrawFiatWithSMS uint32 = (1 << 12)
|
|
WithdrawFiatWithEmail uint32 = (1 << 13)
|
|
WithdrawFiatWithWebsiteApproval uint32 = (1 << 14)
|
|
WithdrawFiatWithAPIPermission uint32 = (1 << 15)
|
|
WithdrawFiatWith2FAText string = "WITHDRAW FIAT WITH 2FA"
|
|
WithdrawFiatWithSMSText string = "WITHDRAW FIAT WITH SMS"
|
|
WithdrawFiatWithEmailText string = "WITHDRAW FIAT WITH EMAIL"
|
|
WithdrawFiatWithWebsiteApprovalText string = "WITHDRAW FIAT WITH WEBSITE APPROVAL"
|
|
WithdrawFiatWithAPIPermissionText string = "WITHDRAW FIAT WITH API PERMISSION"
|
|
WithdrawCryptoViaWebsiteOnly uint32 = (1 << 16)
|
|
WithdrawFiatViaWebsiteOnly uint32 = (1 << 17)
|
|
WithdrawCryptoViaWebsiteOnlyText string = "WITHDRAW CRYPTO VIA WEBSITE ONLY"
|
|
WithdrawFiatViaWebsiteOnlyText string = "WITHDRAW FIAT VIA WEBSITE ONLY"
|
|
NoFiatWithdrawals uint32 = (1 << 18)
|
|
NoFiatWithdrawalsText string = "NO FIAT WITHDRAWAL"
|
|
UnknownWithdrawalTypeText string = "UNKNOWN"
|
|
)
|
|
|
|
// FeeType is the type for holding a custom fee type (International withdrawal fee)
|
|
type FeeType uint8
|
|
|
|
// InternationalBankTransactionType custom type for calculating fees based on fiat transaction types
|
|
type InternationalBankTransactionType uint8
|
|
|
|
// FeeBuilder is the type which holds all parameters required to calculate a fee
|
|
// for an exchange
|
|
type FeeBuilder struct {
|
|
FeeType FeeType
|
|
// Used for calculating crypto trading fees, deposits & withdrawals
|
|
Pair currency.Pair
|
|
IsMaker bool
|
|
// Fiat currency used for bank deposits & withdrawals
|
|
FiatCurrency currency.Code
|
|
BankTransactionType InternationalBankTransactionType
|
|
// Used to multiply for fee calculations
|
|
PurchasePrice float64
|
|
Amount float64
|
|
}
|
|
|
|
// FundingHistory holds exchange funding history data
|
|
type FundingHistory struct {
|
|
ExchangeName string
|
|
Status string
|
|
TransferID string
|
|
Description string
|
|
Timestamp time.Time
|
|
Currency string
|
|
Amount float64
|
|
Fee float64
|
|
TransferType string
|
|
CryptoToAddress string
|
|
CryptoFromAddress string
|
|
CryptoTxID string
|
|
CryptoChain string
|
|
BankTo string
|
|
BankFrom string
|
|
}
|
|
|
|
// WithdrawalHistory holds exchange Withdrawal history data
|
|
type WithdrawalHistory struct {
|
|
Status string
|
|
TransferID string
|
|
Description string
|
|
Timestamp time.Time
|
|
Currency string
|
|
Amount float64
|
|
Fee float64
|
|
TransferType string
|
|
CryptoToAddress string
|
|
CryptoTxID string
|
|
CryptoChain string
|
|
BankTo string
|
|
}
|
|
|
|
// Features stores the supported and enabled features
|
|
// for the exchange
|
|
type Features struct {
|
|
Supports FeaturesSupported
|
|
Enabled FeaturesEnabled
|
|
Subscriptions subscription.List
|
|
CurrencyTranslations currency.Translations
|
|
TradingRequirements protocol.TradingRequirements
|
|
}
|
|
|
|
// FeaturesEnabled stores the exchange enabled features
|
|
type FeaturesEnabled struct {
|
|
AutoPairUpdates bool
|
|
Kline kline.ExchangeCapabilitiesEnabled
|
|
SaveTradeData bool
|
|
TradeFeed bool
|
|
FillsFeed bool
|
|
}
|
|
|
|
// FeaturesSupported stores the exchanges supported features
|
|
type FeaturesSupported struct {
|
|
REST bool
|
|
RESTCapabilities protocol.Features
|
|
Websocket bool
|
|
WebsocketCapabilities protocol.Features
|
|
WithdrawPermissions uint32
|
|
Kline kline.ExchangeCapabilitiesSupported
|
|
MaximumOrderHistory time.Duration
|
|
FuturesCapabilities FuturesCapabilities
|
|
OfflineFuturesCapabilities FuturesCapabilities
|
|
}
|
|
|
|
// FuturesCapabilities stores the exchange's futures capabilities
|
|
type FuturesCapabilities struct {
|
|
FundingRates bool
|
|
MaximumFundingRateHistory time.Duration
|
|
FundingRateBatching map[asset.Item]bool
|
|
SupportedFundingRateFrequencies map[kline.Interval]bool
|
|
Positions bool
|
|
OrderManagerPositionTracking bool
|
|
Collateral bool
|
|
CollateralMode bool
|
|
Leverage bool
|
|
OpenInterest OpenInterestSupport
|
|
}
|
|
|
|
// OpenInterestSupport helps breakdown a feature and how it is supported
|
|
type OpenInterestSupport struct {
|
|
Supported bool
|
|
SupportedViaTicker bool
|
|
SupportsRestBatch bool
|
|
}
|
|
|
|
// MarginCapabilities stores the exchange's margin capabilities
|
|
type MarginCapabilities struct {
|
|
SetMarginType bool
|
|
ChangePositionMargin bool
|
|
GetMarginRateHistory bool
|
|
}
|
|
|
|
// Endpoints stores running url endpoints for exchanges
|
|
type Endpoints struct {
|
|
Exchange string
|
|
defaults map[string]string
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// API stores the exchange API settings
|
|
type API struct {
|
|
AuthenticatedSupport bool
|
|
AuthenticatedWebsocketSupport bool
|
|
PEMKeySupport bool
|
|
|
|
Endpoints *Endpoints
|
|
|
|
credentials account.Credentials
|
|
credMu sync.RWMutex
|
|
|
|
CredentialsValidator config.APICredentialsValidatorConfig
|
|
}
|
|
|
|
// Base stores the individual exchange information
|
|
type Base struct {
|
|
Name string
|
|
Enabled bool
|
|
Verbose bool
|
|
LoadedByConfig bool
|
|
SkipAuthCheck bool
|
|
API API
|
|
BaseCurrencies currency.Currencies
|
|
CurrencyPairs currency.PairsManager
|
|
Features Features
|
|
HTTPTimeout time.Duration
|
|
HTTPRecording bool
|
|
HTTPMockDataSliceLimit int // Use with HTTPRecording to reduce the size of recorded mock data
|
|
HTTPDebugging bool
|
|
BypassConfigFormatUpgrades bool
|
|
WebsocketResponseCheckTimeout time.Duration
|
|
WebsocketResponseMaxLimit time.Duration
|
|
WebsocketOrderbookBufferLimit int64
|
|
Websocket *websocket.Manager
|
|
*request.Requester
|
|
Config *config.Exchange
|
|
settingsMutex sync.RWMutex
|
|
// ValidateOrderbook determines if the orderbook verification can be bypassed,
|
|
// increasing potential update speed but decreasing confidence in orderbook
|
|
// integrity.
|
|
ValidateOrderbook bool
|
|
|
|
AssetWebsocketSupport
|
|
*currencystate.States
|
|
messageSequence common.Counter
|
|
}
|
|
|
|
// url lookup consts
|
|
const (
|
|
Invalid URL = iota
|
|
RestSpot
|
|
RestSpotSupplementary
|
|
RestUSDTMargined
|
|
RestCoinMargined
|
|
RestFutures
|
|
RestFuturesSupplementary
|
|
RestUSDCMargined
|
|
RestSwap
|
|
RestSandbox
|
|
WebsocketSpot
|
|
WebsocketCoinMargined
|
|
WebsocketUSDTMargined
|
|
WebsocketUSDCMargined
|
|
WebsocketOptions
|
|
WebsocketTrade
|
|
WebsocketPrivate
|
|
WebsocketSpotSupplementary
|
|
ChainAnalysis
|
|
EdgeCase1
|
|
EdgeCase2
|
|
EdgeCase3
|
|
|
|
restSpotURL = "RestSpotURL"
|
|
restSpotSupplementaryURL = "RestSpotSupplementaryURL"
|
|
restUSDTMarginedFuturesURL = "RestUSDTMarginedFuturesURL"
|
|
restCoinMarginedFuturesURL = "RestCoinMarginedFuturesURL"
|
|
restUSDCMarginedFuturesURL = "RestUSDCMarginedFuturesURL"
|
|
restFuturesURL = "RestFuturesURL"
|
|
restFuturesSupplementaryURL = "RestFuturesSupplementaryURL"
|
|
restSandboxURL = "RestSandboxURL"
|
|
restSwapURL = "RestSwapURL"
|
|
websocketSpotURL = "WebsocketSpotURL"
|
|
websocketCoinMarginedURL = "WebsocketCoinMarginedURL"
|
|
websocketUSDTMarginedURL = "WebsocketUSDTMarginedURL"
|
|
websocketUSDCMarginedURL = "WebsocketUSDCMarginedURL"
|
|
websocketOptionsURL = "WebsocketOptionsURL"
|
|
websocketTradeURL = "WebsocketTradeURL"
|
|
websocketPrivateURL = "WebsocketPrivateURL"
|
|
websocketSpotSupplementaryURL = "WebsocketSpotSupplementaryURL"
|
|
chainAnalysisURL = "ChainAnalysisURL"
|
|
edgeCase1URL = "EdgeCase1URL"
|
|
edgeCase2URL = "EdgeCase2URL"
|
|
edgeCase3URL = "EdgeCase3URL"
|
|
)
|
|
|
|
var keyURLs = []URL{
|
|
RestSpot,
|
|
RestSpotSupplementary,
|
|
RestUSDTMargined,
|
|
RestCoinMargined,
|
|
RestFutures,
|
|
RestFuturesSupplementary,
|
|
RestUSDCMargined,
|
|
RestSwap,
|
|
RestSandbox,
|
|
WebsocketSpot,
|
|
WebsocketCoinMargined,
|
|
WebsocketUSDTMargined,
|
|
WebsocketUSDCMargined,
|
|
WebsocketOptions,
|
|
WebsocketTrade,
|
|
WebsocketPrivate,
|
|
WebsocketSpotSupplementary,
|
|
ChainAnalysis,
|
|
EdgeCase1,
|
|
EdgeCase2,
|
|
EdgeCase3,
|
|
}
|
|
|
|
// URL stores uint conversions
|
|
type URL uint16
|
|
|
|
// AssetWebsocketSupport defines the availability of websocket functionality to
|
|
// the specific asset type. TODO: Deprecate as this is a temp item to address
|
|
// certain limitations quickly.
|
|
type AssetWebsocketSupport struct {
|
|
unsupported map[asset.Item]bool
|
|
m sync.RWMutex
|
|
}
|