Skip to content

support /fapi/v3/account #698

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions v2/futures/account_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,76 @@ type AccountPosition struct {
AskNotional string `json:"askNotional"`
UpdateTime int64 `json:"updateTime"`
}

// GetAccountV3Service get account info
type GetAccountV3Service struct {
c *Client
}

// Do send request
func (s *GetAccountV3Service) Do(ctx context.Context, opts ...RequestOption) (res *AccountV3, err error) {
r := &request{
method: http.MethodGet,
endpoint: "/fapi/v3/account",
secType: secTypeSigned,
}
data, _, err := s.c.callAPI(ctx, r, opts...)
if err != nil {
return nil, err
}
res = new(AccountV3)
err = json.Unmarshal(data, res)
if err != nil {
return nil, err
}
return res, nil
}

// AccountV3 define account info
type AccountV3 struct {
TotalInitialMargin string `json:"totalInitialMargin"`
TotalMaintMargin string `json:"totalMaintMargin"`
TotalWalletBalance string `json:"totalWalletBalance"`
TotalUnrealizedProfit string `json:"totalUnrealizedProfit"`
TotalMarginBalance string `json:"totalMarginBalance"`
TotalPositionInitialMargin string `json:"totalPositionInitialMargin"`
TotalOpenOrderInitialMargin string `json:"totalOpenOrderInitialMargin"`
TotalCrossWalletBalance string `json:"totalCrossWalletBalance"`
TotalCrossUnPnl string `json:"totalCrossUnPnl"`
AvailableBalance string `json:"availableBalance"`
MaxWithdrawAmount string `json:"maxWithdrawAmount"`
Assets []*AccountAssetV3 `json:"assets"`
Positions []*AccountPositionV3 `json:"positions"`
}

// AccountAssetV3 define account asset
type AccountAssetV3 struct {
Asset string `json:"asset"`
WalletBalance string `json:"walletBalance"`
UnrealizedProfit string `json:"unrealizedProfit"`
MarginBalance string `json:"marginBalance"`
MaintMargin string `json:"maintMargin"`
InitialMargin string `json:"initialMargin"`
PositionInitialMargin string `json:"positionInitialMargin"`
OpenOrderInitialMargin string `json:"openOrderInitialMargin"`
CrossWalletBalance string `json:"crossWalletBalance"`
CrossUnPnl string `json:"crossUnPnl"`
AvailableBalance string `json:"availableBalance"`
MaxWithdrawAmount string `json:"maxWithdrawAmount"`
MarginAvailable bool `json:"marginAvailable"`
UpdateTime int64 `json:"updateTime"`
}

// AccountPositionV3 define account position
type AccountPositionV3 struct {
Symbol string `json:"symbol"`
PositionSide string `json:"positionSide"`
PositionAmt string `json:"positionAmt"`
UnrealizedProfit string `json:"unrealizedProfit"`
IsolatedMargin string `json:"isolatedMargin"`
Notional string `json:"notional"`
IsolatedWallet string `json:"isolatedWallet"`
InitialMargin string `json:"initialMargin"`
MaintMargin string `json:"maintMargin"`
UpdateTime int64 `json:"updateTime"`
}
185 changes: 185 additions & 0 deletions v2/futures/account_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,188 @@ func (s *accountServiceTestSuite) assertAccountEqual(e, a *Account) {
r.Equal(e.Positions[i].UpdateTime, a.Positions[i].UpdateTime, "UpdateTime")
}
}

func (s *accountServiceTestSuite) TestGetAccountV3() {
data := []byte(`{
"totalInitialMargin": "0.00000000",
"totalMaintMargin": "0.00000000",
"totalWalletBalance": "126.72469206",
"totalUnrealizedProfit": "0.00000000",
"totalMarginBalance": "126.72469206",
"totalPositionInitialMargin": "0.00000000",
"totalOpenOrderInitialMargin": "0.00000000",
"totalCrossWalletBalance": "126.72469206",
"totalCrossUnPnl": "0.00000000",
"availableBalance": "126.72469206",
"maxWithdrawAmount": "126.72469206",
"assets": [
{
"asset": "USDT",
"walletBalance": "23.72469206",
"unrealizedProfit": "0.00000000",
"marginBalance": "23.72469206",
"maintMargin": "0.00000000",
"initialMargin": "0.00000000",
"positionInitialMargin": "0.00000000",
"openOrderInitialMargin": "0.00000000",
"crossWalletBalance": "23.72469206",
"crossUnPnl": "0.00000000",
"availableBalance": "126.72469206",
"maxWithdrawAmount": "23.72469206",
"marginAvailable": true,
"updateTime": 1625474304765
},
{
"asset": "BUSD",
"walletBalance": "103.12345678",
"unrealizedProfit": "0.00000000",
"marginBalance": "103.12345678",
"maintMargin": "0.00000000",
"initialMargin": "0.00000000",
"positionInitialMargin": "0.00000000",
"openOrderInitialMargin": "0.00000000",
"crossWalletBalance": "103.12345678",
"crossUnPnl": "0.00000000",
"availableBalance": "126.72469206",
"maxWithdrawAmount": "103.12345678",
"marginAvailable": true,
"updateTime": 1625474304765
}
],
"positions": [
{
"symbol": "BTCUSDT",
"positionSide": "BOTH",
"positionAmt": "1.000",
"unrealizedProfit": "0.00000000",
"isolatedMargin": "0.00000000",
"notional": "0",
"isolatedWallet": "0",
"initialMargin": "0",
"maintMargin": "0",
"updateTime": 0
}
]
}`)
s.mockDo(data, nil)
defer s.assertDo()

s.assertReq(func(r *request) {
expected := newSignedRequest()
s.assertRequestEqual(expected, r)
})

res, err := s.client.NewGetAccountV3Service().Do(newContext())
s.r().NoError(err)

expected := &AccountV3{
TotalInitialMargin: "0.00000000",
TotalMaintMargin: "0.00000000",
TotalWalletBalance: "126.72469206",
TotalUnrealizedProfit: "0.00000000",
TotalMarginBalance: "126.72469206",
TotalPositionInitialMargin: "0.00000000",
TotalOpenOrderInitialMargin: "0.00000000",
TotalCrossWalletBalance: "126.72469206",
TotalCrossUnPnl: "0.00000000",
AvailableBalance: "126.72469206",
MaxWithdrawAmount: "126.72469206",
Assets: []*AccountAssetV3{
{
Asset: "USDT",
WalletBalance: "23.72469206",
UnrealizedProfit: "0.00000000",
MarginBalance: "23.72469206",
MaintMargin: "0.00000000",
InitialMargin: "0.00000000",
PositionInitialMargin: "0.00000000",
OpenOrderInitialMargin: "0.00000000",
CrossWalletBalance: "23.72469206",
CrossUnPnl: "0.00000000",
AvailableBalance: "126.72469206",
MaxWithdrawAmount: "23.72469206",
MarginAvailable: true,
UpdateTime: 1625474304765,
},
{
Asset: "BUSD",
WalletBalance: "103.12345678",
UnrealizedProfit: "0.00000000",
MarginBalance: "103.12345678",
MaintMargin: "0.00000000",
InitialMargin: "0.00000000",
PositionInitialMargin: "0.00000000",
OpenOrderInitialMargin: "0.00000000",
CrossWalletBalance: "103.12345678",
CrossUnPnl: "0.00000000",
AvailableBalance: "126.72469206",
MaxWithdrawAmount: "103.12345678",
MarginAvailable: true,
UpdateTime: 1625474304765,
},
},
Positions: []*AccountPositionV3{
{
Symbol: "BTCUSDT",
PositionSide: "BOTH",
PositionAmt: "1.000",
UnrealizedProfit: "0.00000000",
IsolatedMargin: "0.00000000",
Notional: "0",
IsolatedWallet: "0",
InitialMargin: "0",
MaintMargin: "0",
UpdateTime: 0,
},
},
}

s.assertAccountV3Equal(expected, res)
}

func (s *accountServiceTestSuite) assertAccountV3Equal(expected, actual *AccountV3) {
r := s.r()
r.Equal(expected.TotalInitialMargin, actual.TotalInitialMargin, "TotalInitialMargin")
r.Equal(expected.TotalMaintMargin, actual.TotalMaintMargin, "TotalMaintMargin")
r.Equal(expected.TotalWalletBalance, actual.TotalWalletBalance, "TotalWalletBalance")
r.Equal(expected.TotalUnrealizedProfit, actual.TotalUnrealizedProfit, "TotalUnrealizedProfit")
r.Equal(expected.TotalMarginBalance, actual.TotalMarginBalance, "TotalMarginBalance")
r.Equal(expected.TotalPositionInitialMargin, actual.TotalPositionInitialMargin, "TotalPositionInitialMargin")
r.Equal(expected.TotalOpenOrderInitialMargin, actual.TotalOpenOrderInitialMargin, "TotalOpenOrderInitialMargin")
r.Equal(expected.TotalCrossWalletBalance, actual.TotalCrossWalletBalance, "TotalCrossWalletBalance")
r.Equal(expected.TotalCrossUnPnl, actual.TotalCrossUnPnl, "TotalCrossUnPnl")
r.Equal(expected.AvailableBalance, actual.AvailableBalance, "AvailableBalance")
r.Equal(expected.MaxWithdrawAmount, actual.MaxWithdrawAmount, "MaxWithdrawAmount")

r.Len(actual.Assets, len(expected.Assets))
for i := 0; i < len(expected.Assets); i++ {
r.Equal(expected.Assets[i].Asset, actual.Assets[i].Asset, "Asset")
r.Equal(expected.Assets[i].WalletBalance, actual.Assets[i].WalletBalance, "WalletBalance")
r.Equal(expected.Assets[i].UnrealizedProfit, actual.Assets[i].UnrealizedProfit, "UnrealizedProfit")
r.Equal(expected.Assets[i].MarginBalance, actual.Assets[i].MarginBalance, "MarginBalance")
r.Equal(expected.Assets[i].MaintMargin, actual.Assets[i].MaintMargin, "MaintMargin")
r.Equal(expected.Assets[i].InitialMargin, actual.Assets[i].InitialMargin, "InitialMargin")
r.Equal(expected.Assets[i].PositionInitialMargin, actual.Assets[i].PositionInitialMargin, "PositionInitialMargin")
r.Equal(expected.Assets[i].OpenOrderInitialMargin, actual.Assets[i].OpenOrderInitialMargin, "OpenOrderInitialMargin")
r.Equal(expected.Assets[i].CrossWalletBalance, actual.Assets[i].CrossWalletBalance, "CrossWalletBalance")
r.Equal(expected.Assets[i].CrossUnPnl, actual.Assets[i].CrossUnPnl, "CrossUnPnl")
r.Equal(expected.Assets[i].AvailableBalance, actual.Assets[i].AvailableBalance, "AvailableBalance")
r.Equal(expected.Assets[i].MaxWithdrawAmount, actual.Assets[i].MaxWithdrawAmount, "MaxWithdrawAmount")
r.Equal(expected.Assets[i].MarginAvailable, actual.Assets[i].MarginAvailable, "MarginAvailable")
r.Equal(expected.Assets[i].UpdateTime, actual.Assets[i].UpdateTime, "UpdateTime")
}

r.Len(actual.Positions, len(expected.Positions))
for i := 0; i < len(expected.Positions); i++ {
r.Equal(expected.Positions[i].Symbol, actual.Positions[i].Symbol, "Symbol")
r.Equal(expected.Positions[i].PositionSide, actual.Positions[i].PositionSide, "PositionSide")
r.Equal(expected.Positions[i].PositionAmt, actual.Positions[i].PositionAmt, "PositionAmt")
r.Equal(expected.Positions[i].UnrealizedProfit, actual.Positions[i].UnrealizedProfit, "UnrealizedProfit")
r.Equal(expected.Positions[i].IsolatedMargin, actual.Positions[i].IsolatedMargin, "IsolatedMargin")
r.Equal(expected.Positions[i].Notional, actual.Positions[i].Notional, "Notional")
r.Equal(expected.Positions[i].IsolatedWallet, actual.Positions[i].IsolatedWallet, "IsolatedWallet")
r.Equal(expected.Positions[i].InitialMargin, actual.Positions[i].InitialMargin, "InitialMargin")
r.Equal(expected.Positions[i].MaintMargin, actual.Positions[i].MaintMargin, "MaintMargin")
r.Equal(expected.Positions[i].UpdateTime, actual.Positions[i].UpdateTime, "UpdateTime")
}
}
5 changes: 5 additions & 0 deletions v2/futures/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,11 @@ func (c *Client) NewGetAccountService() *GetAccountService {
return &GetAccountService{c: c}
}

// NewGetAccountV3Service init getting account service
func (c *Client) NewGetAccountV3Service() *GetAccountV3Service {
return &GetAccountV3Service{c: c}
}

// NewGetBalanceService init getting balance service
func (c *Client) NewGetBalanceService() *GetBalanceService {
return &GetBalanceService{c: c}
Expand Down