Files
gocryptotrader/exchanges/bitfinex/ratelimit.go
Adrian Gallagher a79e0d2b3e qa/spelling: Add Codespell support (#1121)
* Add codespell support

* Fix paths

* Add HTML files to exclusion list
2023-01-30 12:36:56 +11:00

491 lines
19 KiB
Go

package bitfinex
import (
"context"
"errors"
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"golang.org/x/time/rate"
)
const (
// Bitfinex rate limits - Public
requestLimitInterval = time.Minute
platformStatusReqRate = 15
tickerBatchReqRate = 30
tickerReqRate = 30
tradeReqRate = 30
orderbookReqRate = 30
statsReqRate = 90
candleReqRate = 60
configsReqRate = 15
statusReqRate = 15 // This is not specified just inputted WCS
liquidReqRate = 15 // This is not specified just inputted WCS
leaderBoardReqRate = 90
marketAveragePriceReqRate = 20
fxReqRate = 20
// Bitfinex rate limits - Authenticated
// Wallets -
accountWalletBalanceReqRate = 45
accountWalletHistoryReqRate = 45
// Orders -
retrieveOrderReqRate = 45
submitOrderReqRate = 45 // This is not specified just inputted above
updateOrderReqRate = 45 // This is not specified just inputted above
cancelOrderReqRate = 45 // This is not specified just inputted above
orderBatchReqRate = 45 // This is not specified just inputted above
cancelBatchReqRate = 45 // This is not specified just inputted above
orderHistoryReqRate = 45
getOrderTradesReqRate = 45
getTradesReqRate = 45
getLedgersReqRate = 45
// Positions -
getAccountMarginInfoReqRate = 45
getActivePositionsReqRate = 45
claimPositionReqRate = 45 // This is not specified just inputted above
getPositionHistoryReqRate = 45
getPositionAuditReqRate = 45
updateCollateralOnPositionReqRate = 45 // This is not specified just inputted above
// Margin funding -
getMarginInfoRate = 90
getActiveFundingOffersReqRate = 45
submitFundingOfferReqRate = 45 // This is not specified just inputted above
cancelFundingOfferReqRate = 45
cancelAllFundingOfferReqRate = 45 // This is not specified just inputted above
closeFundingReqRate = 45 // This is not specified just inputted above
fundingAutoRenewReqRate = 45 // This is not specified just inputted above
keepFundingReqRate = 45 // This is not specified just inputted above
getOffersHistoryReqRate = 45
getFundingLoansReqRate = 45
getFundingLoanHistoryReqRate = 45
getFundingCreditsReqRate = 45
getFundingCreditsHistoryReqRate = 45
getFundingTradesReqRate = 45
getFundingInfoReqRate = 45
// Account actions
getUserInfoReqRate = 45
transferBetweenWalletsReqRate = 45 // This is not specified just inputted above
getDepositAddressReqRate = 45 // This is not specified just inputted above
withdrawalReqRate = 45 // This is not specified just inputted above
getMovementsReqRate = 45
getAlertListReqRate = 45
setPriceAlertReqRate = 45 // This is not specified just inputted above
deletePriceAlertReqRate = 45 // This is not specified just inputted above
getBalanceForOrdersOffersReqRate = 30
userSettingsWriteReqRate = 45 // This is not specified just inputted general count
userSettingsReadReqRate = 45
userSettingsDeleteReqRate = 45 // This is not specified just inputted above
// Account V1 endpoints
getAccountFeesReqRate = 5
getWithdrawalFeesReqRate = 5
getAccountSummaryReqRate = 5 // This is not specified just inputted above
newDepositAddressReqRate = 5 // This is not specified just inputted above
getKeyPermissionsReqRate = 5 // This is not specified just inputted above
getMarginInfoReqRate = 5 // This is not specified just inputted above
getAccountBalanceReqRate = 10
walletTransferReqRate = 10 // This is not specified just inputted above
withdrawV1ReqRate = 10 // This is not specified just inputted above
orderV1ReqRate = 10 // This is not specified just inputted above
orderMultiReqRate = 10 // This is not specified just inputted above
statsV1ReqRate = 10
fundingbookReqRate = 15
lendsReqRate = 30
// Rate limit endpoint functionality declaration
platformStatus request.EndpointLimit = iota
tickerBatch
tickerFunction
tradeRateLimit
orderbookFunction
stats
candle
configs
status
liquid
leaderBoard
marketAveragePrice
fx
// Bitfinex rate limits - Authenticated
// Wallets -
accountWalletBalance
accountWalletHistory
// Orders -
retrieveOrder
submitOrder
updateOrder
cancelOrder
orderBatch
cancelBatch
orderHistory
getOrderTrades
getTrades
getLedgers
// Positions -
getAccountMarginInfo
getActivePositions
claimPosition
getPositionHistory
getPositionAudit
updateCollateralOnPosition
// Margin funding -
getActiveFundingOffers
submitFundingOffer
cancelFundingOffer
cancelAllFundingOffer
closeFunding
fundingAutoRenew
keepFunding
getOffersHistory
getFundingLoans
getFundingLoanHistory
getFundingCredits
getFundingCreditsHistory
getFundingTrades
getFundingInfo
// Account actions
getUserInfo
transferBetweenWallets
getDepositAddress
withdrawal
getMovements
getAlertList
setPriceAlert
deletePriceAlert
getBalanceForOrdersOffers
userSettingsWrite
userSettingsRead
userSettingsDelete
// Account V1 endpoints
getAccountFees
getWithdrawalFees
getAccountSummary
newDepositAddress
getKeyPermissions
getMarginInfo
getAccountBalance
walletTransfer
withdrawV1
orderV1
orderMulti
statsV1
fundingbook
lends
)
// RateLimit implements the rate.Limiter interface
type RateLimit struct {
PlatformStatus *rate.Limiter
TickerBatch *rate.Limiter
Ticker *rate.Limiter
Trade *rate.Limiter
Orderbook *rate.Limiter
Stats *rate.Limiter
Candle *rate.Limiter
Configs *rate.Limiter
Status *rate.Limiter
Liquid *rate.Limiter
LeaderBoard *rate.Limiter
MarketAveragePrice *rate.Limiter
Fx *rate.Limiter
AccountWalletBalance *rate.Limiter
AccountWalletHistory *rate.Limiter
// Orders -
RetrieveOrder *rate.Limiter
SubmitOrder *rate.Limiter
UpdateOrder *rate.Limiter
CancelOrder *rate.Limiter
OrderBatch *rate.Limiter
CancelBatch *rate.Limiter
OrderHistory *rate.Limiter
GetOrderTrades *rate.Limiter
GetTrades *rate.Limiter
GetLedgers *rate.Limiter
// Positions -
GetAccountMarginInfo *rate.Limiter
GetActivePositions *rate.Limiter
ClaimPosition *rate.Limiter
GetPositionHistory *rate.Limiter
GetPositionAudit *rate.Limiter
UpdateCollateralOnPosition *rate.Limiter
// Margin funding -
GetActiveFundingOffers *rate.Limiter
SubmitFundingOffer *rate.Limiter
CancelFundingOffer *rate.Limiter
CancelAllFundingOffer *rate.Limiter
CloseFunding *rate.Limiter
FundingAutoRenew *rate.Limiter
KeepFunding *rate.Limiter
GetOffersHistory *rate.Limiter
GetFundingLoans *rate.Limiter
GetFundingLoanHistory *rate.Limiter
GetFundingCredits *rate.Limiter
GetFundingCreditsHistory *rate.Limiter
GetFundingTrades *rate.Limiter
GetFundingInfo *rate.Limiter
// Account actions
GetUserInfo *rate.Limiter
TransferBetweenWallets *rate.Limiter
GetDepositAddress *rate.Limiter
Withdrawal *rate.Limiter
GetMovements *rate.Limiter
GetAlertList *rate.Limiter
SetPriceAlert *rate.Limiter
DeletePriceAlert *rate.Limiter
GetBalanceForOrdersOffers *rate.Limiter
UserSettingsWrite *rate.Limiter
UserSettingsRead *rate.Limiter
UserSettingsDelete *rate.Limiter
// Account V1 endpoints
GetAccountFees *rate.Limiter
GetWithdrawalFees *rate.Limiter
GetAccountSummary *rate.Limiter
NewDepositAddress *rate.Limiter
GetKeyPermissions *rate.Limiter
GetMarginInfo *rate.Limiter
GetAccountBalance *rate.Limiter
WalletTransfer *rate.Limiter
WithdrawV1 *rate.Limiter
OrderV1 *rate.Limiter
OrderMulti *rate.Limiter
StatsV1 *rate.Limiter
Fundingbook *rate.Limiter
Lends *rate.Limiter
}
// Limit limits outbound requests
func (r *RateLimit) Limit(ctx context.Context, f request.EndpointLimit) error {
switch f {
case platformStatus:
return r.PlatformStatus.Wait(ctx)
case tickerBatch:
return r.TickerBatch.Wait(ctx)
case tickerFunction:
return r.Ticker.Wait(ctx)
case tradeRateLimit:
return r.Trade.Wait(ctx)
case orderbookFunction:
return r.Orderbook.Wait(ctx)
case stats:
return r.Stats.Wait(ctx)
case candle:
return r.Candle.Wait(ctx)
case configs:
return r.Configs.Wait(ctx)
case status:
return r.Stats.Wait(ctx)
case liquid:
return r.Liquid.Wait(ctx)
case leaderBoard:
return r.LeaderBoard.Wait(ctx)
case marketAveragePrice:
return r.MarketAveragePrice.Wait(ctx)
case fx:
return r.Fx.Wait(ctx)
case accountWalletBalance:
return r.AccountWalletBalance.Wait(ctx)
case accountWalletHistory:
return r.AccountWalletHistory.Wait(ctx)
case retrieveOrder:
return r.RetrieveOrder.Wait(ctx)
case submitOrder:
return r.SubmitOrder.Wait(ctx)
case updateOrder:
return r.UpdateOrder.Wait(ctx)
case cancelOrder:
return r.CancelOrder.Wait(ctx)
case orderBatch:
return r.OrderBatch.Wait(ctx)
case cancelBatch:
return r.CancelBatch.Wait(ctx)
case orderHistory:
return r.OrderHistory.Wait(ctx)
case getOrderTrades:
return r.GetOrderTrades.Wait(ctx)
case getTrades:
return r.GetTrades.Wait(ctx)
case getLedgers:
return r.GetLedgers.Wait(ctx)
case getAccountMarginInfo:
return r.GetAccountMarginInfo.Wait(ctx)
case getActivePositions:
return r.GetActivePositions.Wait(ctx)
case claimPosition:
return r.ClaimPosition.Wait(ctx)
case getPositionHistory:
return r.GetPositionHistory.Wait(ctx)
case getPositionAudit:
return r.GetPositionAudit.Wait(ctx)
case updateCollateralOnPosition:
return r.UpdateCollateralOnPosition.Wait(ctx)
case getActiveFundingOffers:
return r.GetActiveFundingOffers.Wait(ctx)
case submitFundingOffer:
return r.SubmitFundingOffer.Wait(ctx)
case cancelFundingOffer:
return r.CancelFundingOffer.Wait(ctx)
case cancelAllFundingOffer:
return r.CancelAllFundingOffer.Wait(ctx)
case closeFunding:
return r.CloseFunding.Wait(ctx)
case fundingAutoRenew:
return r.FundingAutoRenew.Wait(ctx)
case keepFunding:
return r.KeepFunding.Wait(ctx)
case getOffersHistory:
return r.GetOffersHistory.Wait(ctx)
case getFundingLoans:
return r.GetFundingLoans.Wait(ctx)
case getFundingLoanHistory:
return r.GetFundingLoanHistory.Wait(ctx)
case getFundingCredits:
return r.GetFundingCredits.Wait(ctx)
case getFundingCreditsHistory:
return r.GetFundingCreditsHistory.Wait(ctx)
case getFundingTrades:
return r.GetFundingTrades.Wait(ctx)
case getFundingInfo:
return r.GetFundingInfo.Wait(ctx)
case getUserInfo:
return r.GetUserInfo.Wait(ctx)
case transferBetweenWallets:
return r.TransferBetweenWallets.Wait(ctx)
case getDepositAddress:
return r.GetDepositAddress.Wait(ctx)
case withdrawal:
return r.Withdrawal.Wait(ctx)
case getMovements:
return r.GetMovements.Wait(ctx)
case getAlertList:
return r.GetAlertList.Wait(ctx)
case setPriceAlert:
return r.SetPriceAlert.Wait(ctx)
case deletePriceAlert:
return r.DeletePriceAlert.Wait(ctx)
case getBalanceForOrdersOffers:
return r.GetBalanceForOrdersOffers.Wait(ctx)
case userSettingsWrite:
return r.UserSettingsWrite.Wait(ctx)
case userSettingsRead:
return r.UserSettingsRead.Wait(ctx)
case userSettingsDelete:
return r.UserSettingsDelete.Wait(ctx)
// Bitfinex V1 API
case getAccountFees:
return r.GetAccountFees.Wait(ctx)
case getWithdrawalFees:
return r.GetWithdrawalFees.Wait(ctx)
case getAccountSummary:
return r.GetAccountSummary.Wait(ctx)
case newDepositAddress:
return r.NewDepositAddress.Wait(ctx)
case getKeyPermissions:
return r.GetKeyPermissions.Wait(ctx)
case getMarginInfo:
return r.GetMarginInfo.Wait(ctx)
case getAccountBalance:
return r.GetAccountBalance.Wait(ctx)
case walletTransfer:
return r.WalletTransfer.Wait(ctx)
case withdrawV1:
return r.WithdrawV1.Wait(ctx)
case orderV1:
return r.OrderV1.Wait(ctx)
case orderMulti:
return r.OrderMulti.Wait(ctx)
case statsV1:
return r.Stats.Wait(ctx)
case fundingbook:
return r.Fundingbook.Wait(ctx)
case lends:
return r.Lends.Wait(ctx)
default:
return errors.New("endpoint rate limit functionality not found")
}
}
// SetRateLimit returns the rate limit for the exchange
func SetRateLimit() *RateLimit {
return &RateLimit{
PlatformStatus: request.NewRateLimit(requestLimitInterval, platformStatusReqRate),
TickerBatch: request.NewRateLimit(requestLimitInterval, tickerBatchReqRate),
Ticker: request.NewRateLimit(requestLimitInterval, tickerReqRate),
Trade: request.NewRateLimit(requestLimitInterval, tradeReqRate),
Orderbook: request.NewRateLimit(requestLimitInterval, orderbookReqRate),
Stats: request.NewRateLimit(requestLimitInterval, statsReqRate),
Candle: request.NewRateLimit(requestLimitInterval, candleReqRate),
Configs: request.NewRateLimit(requestLimitInterval, configsReqRate),
Status: request.NewRateLimit(requestLimitInterval, statusReqRate),
Liquid: request.NewRateLimit(requestLimitInterval, liquidReqRate),
LeaderBoard: request.NewRateLimit(requestLimitInterval, leaderBoardReqRate),
MarketAveragePrice: request.NewRateLimit(requestLimitInterval, marketAveragePriceReqRate),
Fx: request.NewRateLimit(requestLimitInterval, fxReqRate),
AccountWalletBalance: request.NewRateLimit(requestLimitInterval, accountWalletBalanceReqRate),
AccountWalletHistory: request.NewRateLimit(requestLimitInterval, accountWalletHistoryReqRate),
// Orders -
RetrieveOrder: request.NewRateLimit(requestLimitInterval, retrieveOrderReqRate),
SubmitOrder: request.NewRateLimit(requestLimitInterval, submitOrderReqRate),
UpdateOrder: request.NewRateLimit(requestLimitInterval, updateOrderReqRate),
CancelOrder: request.NewRateLimit(requestLimitInterval, cancelOrderReqRate),
OrderBatch: request.NewRateLimit(requestLimitInterval, orderBatchReqRate),
CancelBatch: request.NewRateLimit(requestLimitInterval, cancelBatchReqRate),
OrderHistory: request.NewRateLimit(requestLimitInterval, orderHistoryReqRate),
GetOrderTrades: request.NewRateLimit(requestLimitInterval, getOrderTradesReqRate),
GetTrades: request.NewRateLimit(requestLimitInterval, getTradesReqRate),
GetLedgers: request.NewRateLimit(requestLimitInterval, getLedgersReqRate),
// Positions -
GetAccountMarginInfo: request.NewRateLimit(requestLimitInterval, getAccountMarginInfoReqRate),
GetActivePositions: request.NewRateLimit(requestLimitInterval, getActivePositionsReqRate),
ClaimPosition: request.NewRateLimit(requestLimitInterval, claimPositionReqRate),
GetPositionHistory: request.NewRateLimit(requestLimitInterval, getPositionAuditReqRate),
GetPositionAudit: request.NewRateLimit(requestLimitInterval, getPositionAuditReqRate),
UpdateCollateralOnPosition: request.NewRateLimit(requestLimitInterval, updateCollateralOnPositionReqRate),
// Margin funding -
GetActiveFundingOffers: request.NewRateLimit(requestLimitInterval, getActiveFundingOffersReqRate),
SubmitFundingOffer: request.NewRateLimit(requestLimitInterval, submitFundingOfferReqRate),
CancelFundingOffer: request.NewRateLimit(requestLimitInterval, cancelFundingOfferReqRate),
CancelAllFundingOffer: request.NewRateLimit(requestLimitInterval, cancelAllFundingOfferReqRate),
CloseFunding: request.NewRateLimit(requestLimitInterval, closeFundingReqRate),
FundingAutoRenew: request.NewRateLimit(requestLimitInterval, fundingAutoRenewReqRate),
KeepFunding: request.NewRateLimit(requestLimitInterval, keepFundingReqRate),
GetOffersHistory: request.NewRateLimit(requestLimitInterval, getOffersHistoryReqRate),
GetFundingLoans: request.NewRateLimit(requestLimitInterval, getOffersHistoryReqRate),
GetFundingLoanHistory: request.NewRateLimit(requestLimitInterval, getFundingLoanHistoryReqRate),
GetFundingCredits: request.NewRateLimit(requestLimitInterval, getFundingCreditsReqRate),
GetFundingCreditsHistory: request.NewRateLimit(requestLimitInterval, getFundingCreditsHistoryReqRate),
GetFundingTrades: request.NewRateLimit(requestLimitInterval, getFundingTradesReqRate),
GetFundingInfo: request.NewRateLimit(requestLimitInterval, getFundingInfoReqRate),
// Account actions
GetUserInfo: request.NewRateLimit(requestLimitInterval, getUserInfoReqRate),
TransferBetweenWallets: request.NewRateLimit(requestLimitInterval, transferBetweenWalletsReqRate),
GetDepositAddress: request.NewRateLimit(requestLimitInterval, getDepositAddressReqRate),
Withdrawal: request.NewRateLimit(requestLimitInterval, withdrawalReqRate),
GetMovements: request.NewRateLimit(requestLimitInterval, getMovementsReqRate),
GetAlertList: request.NewRateLimit(requestLimitInterval, getAlertListReqRate),
SetPriceAlert: request.NewRateLimit(requestLimitInterval, setPriceAlertReqRate),
DeletePriceAlert: request.NewRateLimit(requestLimitInterval, deletePriceAlertReqRate),
GetBalanceForOrdersOffers: request.NewRateLimit(requestLimitInterval, getBalanceForOrdersOffersReqRate),
UserSettingsWrite: request.NewRateLimit(requestLimitInterval, userSettingsWriteReqRate),
UserSettingsRead: request.NewRateLimit(requestLimitInterval, userSettingsReadReqRate),
UserSettingsDelete: request.NewRateLimit(requestLimitInterval, userSettingsDeleteReqRate),
// Account V1 endpoints
GetAccountFees: request.NewRateLimit(requestLimitInterval, getAccountFeesReqRate),
GetWithdrawalFees: request.NewRateLimit(requestLimitInterval, getWithdrawalFeesReqRate),
GetAccountSummary: request.NewRateLimit(requestLimitInterval, getAccountSummaryReqRate),
NewDepositAddress: request.NewRateLimit(requestLimitInterval, newDepositAddressReqRate),
GetKeyPermissions: request.NewRateLimit(requestLimitInterval, getKeyPermissionsReqRate),
GetMarginInfo: request.NewRateLimit(requestLimitInterval, getMarginInfoReqRate),
GetAccountBalance: request.NewRateLimit(requestLimitInterval, getAccountBalanceReqRate),
WalletTransfer: request.NewRateLimit(requestLimitInterval, walletTransferReqRate),
WithdrawV1: request.NewRateLimit(requestLimitInterval, withdrawV1ReqRate),
OrderV1: request.NewRateLimit(requestLimitInterval, orderV1ReqRate),
OrderMulti: request.NewRateLimit(requestLimitInterval, orderMultiReqRate),
StatsV1: request.NewRateLimit(requestLimitInterval, statsV1ReqRate),
Fundingbook: request.NewRateLimit(requestLimitInterval, fundingbookReqRate),
Lends: request.NewRateLimit(requestLimitInterval, lendsReqRate),
}
}