From e78bfa1d4047a9d39945d7bab83096c703247225 Mon Sep 17 00:00:00 2001 From: wuhewuhe Date: Mon, 6 Nov 2023 01:08:54 +0100 Subject: [PATCH] broker c2c --- broker.go | 35 ++++ bybit_api_client.go | 18 ++ examples/broker/broker_earn.go | 22 +++ examples/lending/lending_coin.go | 22 +++ examples/user/create_sub_user.go | 23 ++- lending.go | 145 +++++++++++++++++ models/brokerResponse.go | 18 ++ models/lendingResponse.go | 62 +++++++ models/userResponse.go | 18 ++ user.go | 271 +++++++++++++++++++++++++++++++ 10 files changed, 633 insertions(+), 1 deletion(-) create mode 100644 broker.go create mode 100644 examples/broker/broker_earn.go create mode 100644 examples/lending/lending_coin.go create mode 100644 lending.go create mode 100644 models/brokerResponse.go create mode 100644 models/lendingResponse.go create mode 100644 models/userResponse.go diff --git a/broker.go b/broker.go new file mode 100644 index 0000000..ec61864 --- /dev/null +++ b/broker.go @@ -0,0 +1,35 @@ +package bybit_connector + +import ( + "context" + "encoding/json" + "github.com/wuhewuhe/bybit.go.api/handlers" + "net/http" +) + +type BrokerServiceClient struct { + c *Client + params map[string]interface{} +} + +func (s *BrokerServiceClient) GetBrokerEarning(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodGet, + endpoint: "/v5/broker/earning-record", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/bybit_api_client.go b/bybit_api_client.go index e19ecb9..5948fd0 100644 --- a/bybit_api_client.go +++ b/bybit_api_client.go @@ -274,3 +274,21 @@ func (c *Client) NewAssetService(params map[string]interface{}) *AssetClient { c: c, } } + +func (c *Client) NewUserService(params map[string]interface{}) *UserServiceClient { + return &UserServiceClient{ + c: c, + } +} + +func (c *Client) NewBrokerService(params map[string]interface{}) *BrokerServiceClient { + return &BrokerServiceClient{ + c: c, + } +} + +func (c *Client) NewLendingService(params map[string]interface{}) *LendingServiceClient { + return &LendingServiceClient{ + c: c, + } +} diff --git a/examples/broker/broker_earn.go b/examples/broker/broker_earn.go new file mode 100644 index 0000000..3808e4c --- /dev/null +++ b/examples/broker/broker_earn.go @@ -0,0 +1,22 @@ +package main + +import ( + "context" + "fmt" + bybit "github.com/wuhewuhe/bybit.go.api" +) + +func main() { + PlaceTrade() +} + +func PlaceTrade() { + client := bybit.NewBybitHttpClient("8wYkmpLsMg10eNQyPm", "Ouxc34myDnXvei54XsBZgoQzfGxO4bkr2Zsj", bybit.WithBaseURL(bybit.TESTNET)) + params := map[string]interface{}{} + orderResult, err := client.NewBrokerService(params).GetBrokerEarning(context.Background()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(bybit.PrettyPrint(orderResult)) +} diff --git a/examples/lending/lending_coin.go b/examples/lending/lending_coin.go new file mode 100644 index 0000000..7503d86 --- /dev/null +++ b/examples/lending/lending_coin.go @@ -0,0 +1,22 @@ +package main + +import ( + "context" + "fmt" + bybit "github.com/wuhewuhe/bybit.go.api" +) + +func main() { + PlaceTrade() +} + +func PlaceTrade() { + client := bybit.NewBybitHttpClient("8wYkmpLsMg10eNQyPm", "Ouxc34myDnXvei54XsBZgoQzfGxO4bkr2Zsj", bybit.WithBaseURL(bybit.TESTNET)) + params := map[string]interface{}{"coin": "USDT"} + orderResult, err := client.NewLendingService(params).GetC2cLendingCoinInfo(context.Background()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(bybit.PrettyPrint(orderResult)) +} diff --git a/examples/user/create_sub_user.go b/examples/user/create_sub_user.go index a00006b..a408f0c 100644 --- a/examples/user/create_sub_user.go +++ b/examples/user/create_sub_user.go @@ -1 +1,22 @@ -package user +package main + +import ( + "context" + "fmt" + bybit "github.com/wuhewuhe/bybit.go.api" +) + +func main() { + PlaceTrade() +} + +func PlaceTrade() { + client := bybit.NewBybitHttpClient("8wYkmpLsMg10eNQyPm", "Ouxc34myDnXvei54XsBZgoQzfGxO4bkr2Zsj", bybit.WithBaseURL(bybit.TESTNET)) + params := map[string]interface{}{"username": "wuhe06112023Vic", "memberType": 1} + userResult, err := client.NewUserService(params).CreateSubMember(context.Background()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(bybit.PrettyPrint(userResult)) +} diff --git a/lending.go b/lending.go new file mode 100644 index 0000000..631dc25 --- /dev/null +++ b/lending.go @@ -0,0 +1,145 @@ +package bybit_connector + +import ( + "context" + "encoding/json" + "github.com/wuhewuhe/bybit.go.api/handlers" + "net/http" +) + +type LendingServiceClient struct { + c *Client + params map[string]interface{} +} + +func (s *LendingServiceClient) GetC2cLendingCoinInfo(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodGet, + endpoint: "/v5/lending/info", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *LendingServiceClient) GetC2cLendingOrders(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodGet, + endpoint: "/v5/lending/history-order", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *LendingServiceClient) GetC2cLendingAccountInfo(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodGet, + endpoint: "/v5/lending/account", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *LendingServiceClient) C2cDepositFunds(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/lending/purchase", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *LendingServiceClient) C2cRedeemFunds(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/lending/redeem", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *LendingServiceClient) C2cCancelRedeemFunds(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/lending/redeem-cancel", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/models/brokerResponse.go b/models/brokerResponse.go new file mode 100644 index 0000000..f096c2a --- /dev/null +++ b/models/brokerResponse.go @@ -0,0 +1,18 @@ +package models + +// BrokerEarningInfo represents an individual record of broker earnings. +type BrokerEarningInfo struct { + UserId string `json:"userId"` + BizType string `json:"bizType"` + Symbol string `json:"symbol"` + Coin string `json:"coin"` + Earning string `json:"earning"` + OrderId string `json:"orderId"` + ExecTime string `json:"execTime"` +} + +// BrokerEarningResult represents the paginated result of broker earnings. +type BrokerEarningResult struct { + List []BrokerEarningInfo `json:"list"` + NextPageCursor string `json:"nextPageCursor"` +} diff --git a/models/lendingResponse.go b/models/lendingResponse.go new file mode 100644 index 0000000..c42c255 --- /dev/null +++ b/models/lendingResponse.go @@ -0,0 +1,62 @@ +package models + +// LendingCoin represents information about a specific coin available for lending. +type LendingCoin struct { + Coin string `json:"coin"` + MaxRedeemQty string `json:"maxRedeemQty"` + MinPurchaseQty string `json:"minPurchaseQty"` + Precision string `json:"precision"` + Rate string `json:"rate"` + LoanToPoolRatio string `json:"loanToPoolRatio"` + ActualApy string `json:"actualApy"` +} + +// LendingCoinInfoResult represents the list of coins available for lending. +type LendingCoinInfoResult struct { + List []LendingCoin `json:"list"` +} + +// DepositFund represents the status of a deposit into a lending product. +type DepositFund struct { + Coin string `json:"coin"` + CreatedTime string `json:"createdTime"` + OrderId string `json:"orderId"` + Quantity string `json:"quantity"` + SerialNo string `json:"serialNo"` + Status string `json:"status"` + UpdatedTime string `json:"updatedTime"` +} + +// RedeemFund represents the status of a redemption request from a lending product. +type RedeemFund struct { + Coin string `json:"coin"` + CreatedTime string `json:"createdTime"` + OrderId string `json:"orderId"` + PrincipalQty string `json:"principalQty"` + SerialNo string `json:"serialNo"` + Status string `json:"status"` + UpdatedTime string `json:"updatedTime"` +} + +// CancelRedeemFund represents the status of a cancelled redemption request from a lending product. +type CancelRedeemFund struct { + OrderId string `json:"orderId"` + SerialNo string `json:"serialNo"` + UpdatedTime string `json:"updatedTime"` +} + +// LendingOrderRecord represents an individual lending order record. +type LendingOrderRecord struct { + Coin string `json:"coin"` + CreatedTime string `json:"createdTime"` + OrderId string `json:"orderId"` + Quantity string `json:"quantity"` + SerialNo string `json:"serialNo"` + Status string `json:"status"` + UpdatedTime string `json:"updatedTime"` +} + +// LendingOrdersRecordsResult represents the result of a query for lending order records. +type LendingOrdersRecordsResult struct { + List []LendingOrderRecord `json:"list"` +} diff --git a/models/userResponse.go b/models/userResponse.go new file mode 100644 index 0000000..4e249d3 --- /dev/null +++ b/models/userResponse.go @@ -0,0 +1,18 @@ +package models + +// UserVolumeInfo represents the structure for a user's trading and deposit volume information. +type UserVolumeInfo struct { + UID string `json:"uid"` + VipLevel string `json:"vipLevel"` + TakerVol30Day string `json:"takerVol30Day"` + MakerVol30Day string `json:"makerVol30Day"` + TradeVol30Day string `json:"tradeVol30Day"` + DepositAmount30Day string `json:"depositAmount30Day"` + TakerVol365Day string `json:"takerVol365Day"` + MakerVol365Day string `json:"makerVol365Day"` + TradeVol365Day string `json:"tradeVol365Day"` + DepositAmount365Day string `json:"depositAmount365Day"` + TotalWalletBalance string `json:"totalWalletBalance"` // This should be an integer value representing a range, not a string. + DepositUpdateTime string `json:"depositUpdateTime"` + VolUpdateTime string `json:"volUpdateTime"` +} diff --git a/user.go b/user.go index 4fca008..7242b95 100644 --- a/user.go +++ b/user.go @@ -1,6 +1,277 @@ package bybit_connector +import ( + "context" + "encoding/json" + "github.com/wuhewuhe/bybit.go.api/handlers" + "net/http" +) + type UserServiceClient struct { c *Client params map[string]interface{} } + +func (s *UserServiceClient) CreateSubMember(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/create-sub-member", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) CreateSubApiKey(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/create-sub-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) FreezeSubUID(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/frozen-sub-member", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) ModifyMasterAPIKey(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/update-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) ModifySubAPIKey(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/update-sub-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) DeleteSubUID(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/del-submember", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) DeleteMasterAPIKey(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/delete-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) DeleteSubAPIKey(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/delete-sub-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) GetSubUidList(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/query-sub-members", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) GetAPIKeyInfo(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/query-api", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) GetUidWalletType(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/get-member-type", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +} + +func (s *UserServiceClient) GetAffiliateUserInfo(ctx context.Context, opts ...RequestOption) (res *ServerResponse, err error) { + if err = handlers.ValidateParams(s.params); err != nil { + return nil, err + } + r := &request{ + method: http.MethodPost, + endpoint: "/v5/user/aff-customer-info", + secType: secTypeSigned, + } + r.setParams(s.params) + data, err := s.c.callAPI(ctx, r, opts...) + if err != nil { + return nil, err + } + res = new(ServerResponse) + err = json.Unmarshal(data, res) + if err != nil { + return nil, err + } + return res, nil +}