package exchange import ( "time" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" ) // Endpoint authentication types const ( RestAuthentication uint8 = 0 WebsocketAuthentication uint8 = 1 ) // FeeType custom type for calculating fees based on method type FeeType uint8 // Const declarations for fee types const ( BankFee FeeType = iota InternationalBankDepositFee InternationalBankWithdrawalFee CryptocurrencyTradeFee CyptocurrencyDepositFee CryptocurrencyWithdrawalFee OfflineTradeFee ) // InternationalBankTransactionType custom type for calculating fees based on fiat transaction types type InternationalBankTransactionType uint8 // Const declarations for international transaction types const ( WireTransfer InternationalBankTransactionType = iota PerfectMoney Neteller AdvCash Payeer Skrill Simplex SEPA Swift RapidTransfer MisterTangoSEPA Qiwi VisaMastercard WebMoney Capitalist WesternUnion MoneyGram Contact ) // 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 } // Definitions for each type of withdrawal method for a given exchange const ( // No withdraw 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" ) // AccountInfo is a Generic type to hold each exchange's holdings in // all enabled currencies type AccountInfo struct { Exchange string Accounts []Account } // Account defines a singular account type with asocciated currencies type Account struct { ID string Currencies []AccountCurrencyInfo } // AccountCurrencyInfo is a sub type to store currency name and value type AccountCurrencyInfo struct { CurrencyName currency.Code TotalValue float64 Hold float64 } // TradeHistory holds exchange history data type TradeHistory struct { Timestamp time.Time TID int64 Price float64 Amount float64 Exchange string Type string Fee float64 Description string } // FundHistory holds exchange funding history data type FundHistory 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 BankTo string BankFrom string } // GenericWithdrawRequestInfo stores genric withdraw request info type GenericWithdrawRequestInfo struct { // General withdraw information Currency currency.Code Description string OneTimePassword int64 AccountID string PIN int64 TradePassword string Amount float64 } // CryptoWithdrawRequest stores the info required for a crypto withdrawal request type CryptoWithdrawRequest struct { GenericWithdrawRequestInfo // Crypto related information Address string AddressTag string FeeAmount float64 } // FiatWithdrawRequest used for fiat withdrawal requests type FiatWithdrawRequest struct { GenericWithdrawRequestInfo // FIAT related information BankAccountName string BankAccountNumber string BankName string BankAddress string BankCity string BankCountry string BankPostalCode string BSB string SwiftCode string IBAN string BankCode float64 IsExpressWire bool // Intermediary bank information RequiresIntermediaryBank bool IntermediaryBankAccountNumber float64 IntermediaryBankName string IntermediaryBankAddress string IntermediaryBankCity string IntermediaryBankCountry string IntermediaryBankPostalCode string IntermediarySwiftCode string IntermediaryBankCode float64 IntermediaryIBAN string WireCurrency string } // Features stores the supported and enabled features // for the exchange type Features struct { Supports FeaturesSupported Enabled FeaturesEnabled } // FeaturesEnabled stores the exchange enabled features type FeaturesEnabled struct { AutoPairUpdates bool } // FeaturesSupported stores the exchanges supported features type FeaturesSupported struct { REST bool RESTCapabilities protocol.Features Websocket bool WebsocketCapabilities protocol.Features WithdrawPermissions uint32 } // API stores the exchange API settings type API struct { AuthenticatedSupport bool AuthenticatedWebsocketSupport bool PEMKeySupport bool Endpoints struct { URL string URLDefault string URLSecondary string URLSecondaryDefault string WebsocketURL string } Credentials struct { Key string Secret string ClientID string PEMKey string } CredentialsValidator struct { // For Huobi (optional) RequiresPEM bool RequiresKey bool RequiresSecret bool RequiresClientID bool RequiresBase64DecodeSecret bool } } // 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 HTTPUserAgent string HTTPRecording bool HTTPDebugging bool WebsocketResponseCheckTimeout time.Duration WebsocketResponseMaxLimit time.Duration WebsocketOrderbookBufferLimit int64 Websocket *wshandler.Websocket *request.Requester Config *config.ExchangeConfig }