diff --git a/exchanges/ftx/ftx.go b/exchanges/ftx/ftx.go index 3c768d74..b6ca0fc3 100644 --- a/exchanges/ftx/ftx.go +++ b/exchanges/ftx/ftx.go @@ -129,6 +129,12 @@ const ( spotString = "spot" futuresString = "future" + // Referral endpoints + customReferralCodes = "/custom_referral_codes" + referralRebates = "/referral_rebates" + referralRebateHistory = "/referral_rebate_history" + referralRebateRate = "/referral_rebate_rate" + ratePeriod = time.Second rateLimit = 30 ) @@ -1785,3 +1791,35 @@ func (c CollateralWeightHolder) load(code string, total, initial, imfFactor floa InitialMarginFractionFactor: imfFactor, } } + +// GetCustomReferralCodes returns the user's custom referral codes. +func (f *FTX) GetCustomReferralCodes(ctx context.Context) ([]CustomReferralCode, error) { + resp := struct { + Data []CustomReferralCode `json:"result"` + }{} + return resp.Data, f.SendAuthHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, customReferralCodes, nil, &resp) +} + +// GetReferralRebates returns the user's referral rebates grouped by account ID. +func (f *FTX) GetReferralRebates(ctx context.Context) ([]ReferralRebate, error) { + resp := struct { + Data []ReferralRebate `json:"result"` + }{} + return resp.Data, f.SendAuthHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, referralRebates, nil, &resp) +} + +// GetReferralRebateHistory returns the users daily referral rebate history. +func (f *FTX) GetReferralRebateHistory(ctx context.Context) ([]ReferralRebateHistory, error) { + resp := struct { + Data []ReferralRebateHistory `json:"result"` + }{} + return resp.Data, f.SendAuthHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, referralRebateHistory, nil, &resp) +} + +// GetReferralRebateRate returns the referral rebate rate. +func (f *FTX) GetReferralRebateRate(ctx context.Context) (float64, error) { + resp := struct { + Rate float64 `json:"result"` + }{} + return resp.Rate, f.SendAuthHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, referralRebateRate, nil, &resp) +} diff --git a/exchanges/ftx/ftx_test.go b/exchanges/ftx/ftx_test.go index a685a9ee..e3b75916 100644 --- a/exchanges/ftx/ftx_test.go +++ b/exchanges/ftx/ftx_test.go @@ -2746,3 +2746,51 @@ func TestGetFundingPayments(t *testing.T) { t.Errorf("should have thrown errStartTimeCannotBeAfterEndTime, got %v", err) } } + +func TestGetCustomReferralCodes(t *testing.T) { + t.Parallel() + + if !areTestAPIKeysSet() { + t.Skip() + } + + if _, err := f.GetCustomReferralCodes(context.Background()); err != nil { + t.Fatal(err) + } +} + +func TestGetReferralRebates(t *testing.T) { + t.Parallel() + + if !areTestAPIKeysSet() { + t.Skip() + } + + if _, err := f.GetReferralRebates(context.Background()); err != nil { + t.Fatal(err) + } +} + +func TestGetReferralRebateHistory(t *testing.T) { + t.Parallel() + + if !areTestAPIKeysSet() { + t.Skip() + } + + if _, err := f.GetReferralRebateHistory(context.Background()); err != nil { + t.Fatal(err) + } +} + +func TestGetReferralRebateRate(t *testing.T) { + t.Parallel() + + if !areTestAPIKeysSet() { + t.Skip() + } + + if _, err := f.GetReferralRebateRate(context.Background()); err != nil { + t.Fatal(err) + } +} diff --git a/exchanges/ftx/ftx_types.go b/exchanges/ftx/ftx_types.go index e87e06c0..dfa7374a 100644 --- a/exchanges/ftx/ftx_types.go +++ b/exchanges/ftx/ftx_types.go @@ -937,3 +937,22 @@ type CollateralPosition struct { RequiredMargin decimal.Decimal `json:"requiredMargin"` CollateralUsed decimal.Decimal `json:"totalCollateralUsed"` } + +// CustomReferralCode stores custom referral code info +type CustomReferralCode struct { + Code string `json:"code"` + ID int64 `json:"id"` +} + +// ReferralRebate stores the referral rebate info by account ID +type ReferralRebate struct { + RefereeAccountID int64 `json:"refereeAccountId"` + TotalSize float64 `json:"totalSize"` +} + +// ReferralRebateHistory stores the daily referral rebate history info +type ReferralRebateHistory struct { + Subaccount string `json:"subaccount"` + Size float64 `json:"size"` + Day time.Time `json:"day"` +}