From 62aad4e2b8a54a468e87a15bd9104ce4015c4c57 Mon Sep 17 00:00:00 2001 From: Tiago Siebler Date: Mon, 13 Nov 2023 17:31:18 +0000 Subject: [PATCH] feat(): add V2 REST client with initial endpoints --- src/rest-client-v2.ts | 890 +++++++++++++++++++++++++++++++++++ src/spot-client.ts | 3 +- src/types/request/shared.ts | 5 + src/types/response/shared.ts | 4 +- src/util/requestUtils.ts | 1 + src/util/type-guards.ts | 11 + src/util/websocket-util.ts | 29 +- 7 files changed, 938 insertions(+), 5 deletions(-) create mode 100644 src/rest-client-v2.ts diff --git a/src/rest-client-v2.ts b/src/rest-client-v2.ts new file mode 100644 index 0000000..5b3232f --- /dev/null +++ b/src/rest-client-v2.ts @@ -0,0 +1,890 @@ +import { + NewBatchSpotOrder, + NewSpotOrder, + NewWalletTransfer, + Pagination, + APIResponse, + CoinBalance, + SymbolRules, + NewSpotSubTransfer, + NewSpotWithdraw, + CancelSpotOrderV2, + BatchCancelSpotOrderV2, + SpotOrderResult, + NewSpotPlanOrder, + ModifySpotPlanOrder, + CancelSpotPlanOrderParams, + GetSpotPlanOrdersParams, + SpotPlanOrder, + GetHistoricPlanOrdersParams, + SpotMarketTrade, + GetHistoricTradesParams, + VIPFeeRate, + SpotKlineInterval, + MarginType, +} from './types'; +import { REST_CLIENT_TYPE_ENUM, assertMarginType } from './util'; +import BaseRestClient from './util/BaseRestClient'; + +/** + * REST API client for all V2 endpoints + */ +export class RestClientV2 extends BaseRestClient { + getClientType() { + return REST_CLIENT_TYPE_ENUM.v2; + } + + async fetchServerTime(): Promise { + const res = await this.getServerTime(); + return Number(res.data); + } + + /** + * + * + * Common + * + * + */ + + /** + * + * * Common | Notice + * + */ + + getAnnouncements(): Promise> { + return this.get(`/api/v2/public/annoucements`); + } + + /** + * + * * Common | Public + * + */ + + getServerTime(): Promise> { + return this.get(`/api/v2/public/time`); + } + + getTradeRate(params: object): Promise> { + return this.getPrivate(`/api/v2/common/trade-rate`, params); + } + + /** + * + * * Common | Tax + * + */ + + getSpotTransactionRecords(params: object): Promise> { + return this.getPrivate(`/api/v2/tax/spot-record`, params); + } + + getFuturesTransactionRecords(params: object): Promise> { + return this.getPrivate(`/api/v2/tax/future-record`, params); + } + + getMarginTransactionRecords(params: object): Promise> { + return this.getPrivate(`/api/v2/tax/margin-record`, params); + } + + getP2PTransactionRecords(params: object): Promise> { + return this.getPrivate(`/api/v2/tax/p2p-record`, params); + } + + /** + * + * * Common | P2P + * + */ + + getP2PMerchantList(params?: object): Promise> { + return this.getPrivate(`/api/v2/p2p/merchantList`, params); + } + + getP2PMerchantInfo(): Promise> { + return this.getPrivate(`/api/v2/p2p/merchantInfo`); + } + + getP2PMerchantOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/p2p/orderList`, params); + } + + getP2PMerchantAdvertisementList(params: object): Promise> { + return this.getPrivate(`/api/v2/p2p/advList`, params); + } + + /** + * + * * Common | Virtual Subaccount + * + */ + + createVirtualSubaccount(params: object): Promise> { + return this.postPrivate(`/api/v2/user/create-virtual-subaccount`, params); + } + + modifyVirtualSubaccount(params: object): Promise> { + return this.postPrivate(`/api/v2/user/modify-virtual-subaccount`, params); + } + + batchCreateVirtualSubaccountAndAPIKey( + params: object, + ): Promise> { + return this.postPrivate( + '/api/v2/user/batch-create-subaccount-and-apikey', + params, + ); + } + + getVirtualSubaccounts(params?: object): Promise> { + return this.getPrivate(`/api/v2/user/virtual-subaccount-list`, params); + } + + createVirtualSubaccountAPIKey(params: object): Promise> { + return this.postPrivate( + '/api/v2/user/create-virtual-subaccount-apikey', + params, + ); + } + + modifyVirtualSubaccountAPIKey(params: object): Promise> { + return this.postPrivate( + '/api/v2/user/modify-virtual-subaccount-apikey', + params, + ); + } + + getVirtualSubaccountAPIKeys(params: object): Promise> { + return this.getPrivate( + '/api/v2/user/virtual-subaccount-apikey-list', + params, + ); + } + + /** + * + * * Common | Convert + * + */ + + getConvertCoins(): Promise> { + return this.getPrivate(`/api/v2/convert/currencies`); + } + + getConvertQuotedPrice(params: object): Promise> { + return this.getPrivate(`/api/v2/convert/quoted-price`, params); + } + + convert(params: object): Promise> { + return this.postPrivate(`/api/v2/convert/trade`, params); + } + + getConvertHistory(params: object): Promise> { + return this.getPrivate(`/api/v2/convert/convert-record`, params); + } + + /** + * + * + * Spot + * + * + */ + + /** + * + * * Spot | Market + * + */ + + getSpotCoinInfo(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/public/coins`, params); + } + + getSpotSymbolInfo(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/public/symbols`, params); + } + + getSpotVIPFeeRate(): Promise> { + return this.getPrivate(`/api/v2/spot/market/vip-fee-rate`); + } + + getSpotTicker(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/tickers`, params); + } + + getSpotMergeDepth(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/merge-depth`, params); + } + + getSpotOrderBookDepth(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/orderbook`, params); + } + + getSpotCandlestickData(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/candles`, params); + } + + getSpotHistoricCandlestickData(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/history-candles`, params); + } + + getSpotRecentTrades(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/fills`, params); + } + + getSpotHistoricTrades(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/market/fills-history`, params); + } + + /** + * + * * Spot | Trade + * + */ + + spotSubmitOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/place-order`, params); + } + + spotCancelOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/cancel-order`, params); + } + + spotBatchSubmitOrders(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/batch-orders`, params); + } + + spotBatchCancelOrders(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/batch-cancel-order`, params); + } + + spotCancelSymbolOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/cancel-symbol-order`, params); + } + + getSpotOrder(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/orderInfo`, params); + } + + getSpotOpenOrders(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/unfilled-orders`, params); + } + + getSpotHistoricOrders(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/history-orders`, params); + } + + getSpotFills(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/fills`, params); + } + + /** + * + * * Spot | Trigger Orders + * + */ + + spotSubmitPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/place-plan-order`, params); + } + + spotModifyPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/modify-plan-order`, params); + } + + spotCancelPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/trade/cancel-plan-order`, params); + } + + getSpotCurrentPlanOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/current-plan-order`, params); + } + + getSpotHistoricPlanOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/trade/history-plan-order`, params); + } + + spotCancelPlanOrders(params?: object): Promise> { + return this.postPrivate( + '/api/v2/spot/trade/batch-cancel-plan-order', + params, + ); + } + + /** + * + * * Spot | Account + * + */ + + getSpotAccount(): Promise> { + return this.getPrivate(`/api/v2/spot/account/info`); + } + + getSpotAccountAssets(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/account/assets`, params); + } + + getSpotSubAccountAssets(): Promise> { + return this.getPrivate(`/api/v2/spot/account/subaccount-assets`); + } + + getSpotAccountBills(params?: object): Promise> { + return this.getPrivate(`/api/v2/spot/account/bills`, params); + } + + spotTransfer(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/wallet/transfer`, params); + } + + spotSubTransfer(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/wallet/subaccount-transfer`, params); + } + + getSpotTransferHistory(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/account/transferRecords`, params); + } + + spotWithdraw(params: object): Promise> { + return this.postPrivate(`/api/v2/spot/wallet/withdrawal`, params); + } + + getSpotDepositAddress(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/wallet/deposit-address`, params); + } + + getSpotDepositHistory(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/wallet/deposit-records`, params); + } + + getSpotWithdrawalHistory(params: object): Promise> { + return this.getPrivate(`/api/v2/spot/wallet/withdrawal-records`, params); + } + + /** + * + * + * Futures + * + * + */ + + /** + * + * * Futures | Market + * + */ + + getFuturesVIPFeeRate(): Promise> { + return this.get(`/api/v2/mix/market/vip-fee-rate`); + } + + getFuturesMergeDepth(params: object): Promise> { + return this.get(`/api/v2/mix/market/merge-depth`, params); + } + + getFuturesTicker(params: object): Promise> { + return this.get(`/api/v2/mix/market/ticker`, params); + } + + getFuturesAllTickers(params: object): Promise> { + return this.get(`/api/v2/mix/market/tickers`, params); + } + + getFuturesRecentTrades(params: object): Promise> { + return this.get(`/api/v2/mix/market/fills`, params); + } + + getFuturesHistoricTrades(params: object): Promise> { + return this.get(`/api/v2/mix/market/fills-history`, params); + } + + getFuturesCandlestickData(params: object): Promise> { + return this.get(`/api/v2/mix/market/candles`, params); + } + + getFuturesHistoricCandlestickData(params: object): Promise> { + return this.get(`/api/v2/mix/market/history-candles`, params); + } + + getFuturesHistoricIndexPriceCandlestick( + params: object, + ): Promise> { + return this.get(`/api/v2/mix/market/history-index-candles`, params); + } + + getFuturesHistoricMarkPriceCandlestick( + params: object, + ): Promise> { + return this.get(`/api/v2/mix/market/history-mark-candles`, params); + } + + getFuturesOpenInterest(params: object): Promise> { + return this.get(`/api/v2/mix/market/open-interest`, params); + } + + getFuturesNextFundingTime(params: object): Promise> { + return this.get(`/api/v2/mix/market/funding-time`, params); + } + + getFuturesSymbolPrice(params: object): Promise> { + return this.get(`/api/v2/mix/market/symbol-price`, params); + } + + getFuturesHistoricFundingRates(params: object): Promise> { + return this.get(`/api/v2/mix/market/history-fund-rate`, params); + } + + getFuturesCurrentFundingRate(params: object): Promise> { + return this.get(`/api/v2/mix/market/current-fund-rate`, params); + } + + getFuturesContractConfig(params: object): Promise> { + return this.get(`/api/v2/mix/market/contracts`, params); + } + + /** + * + * * Futures | Account + * + */ + + getFuturesAccountAsset(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/account/account`, params); + } + + getFuturesAccountAssets(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/account/accounts`, params); + } + + getFuturesSubAccountAssets(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/account/sub-account-assets`, params); + } + + getFuturesOpenCount(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/account/open-count`, params); + } + + setFuturesLeverage(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/account/set-leverage`, params); + } + + adjustFuturesPositionMargin(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/account/set-margin`, params); + } + + setFuturesMarginMode(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/account/set-margin-mode`, params); + } + + setFuturesPositionMode(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/account/set-position-mode`, params); + } + + getFuturesAccountBills(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/account/bill`, params); + } + + /** + * + * * Futures | Position + * + */ + + getFuturesPositionTier(params: object): Promise> { + return this.get(`/api/v2/mix/market/query-position-lever`, params); + } + + getFuturesPosition(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/position/single-position`, params); + } + + getFuturesPositions(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/position/all-position`, params); + } + + getFuturesHistoricPositions(params?: object): Promise> { + return this.getPrivate(`/api/v2/mix/position/history-position`, params); + } + + /** + * + * * Futures | Trade + * + */ + + futuresSubmitOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/place-order`, params); + } + + futuresSubmitReverseal(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/click-backhand`, params); + } + + futuresBatchSubmitOrders(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/batch-place-order`, params); + } + + futuresModifyOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/modify-order`, params); + } + + futuresCancelOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/cancel-order`, params); + } + + futuresBatchCancelOrders(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/batch-cancel-orders`, params); + } + + futuresFlashClosePositions(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/close-positions`, params); + } + + getFuturesOrderDetail(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/detail`, params); + } + + getFuturesOrderFillDetails(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/fills`, params); + } + + getFuturesHistoricOrderFills(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/fill-history`, params); + } + + getFuturesOpenOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/orders-pending`, params); + } + + getFuturesHistoricOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/orders-history`, params); + } + + /** + * + * * Futures | Trigger Orders + * + */ + + futuresSubmitTPSLOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/place-tpsl-order`, params); + } + + futuresSubmitPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/place-plan-order`, params); + } + + futuresModifyTPSLPOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/modify-tpsl-order`, params); + } + + futuresModifyPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/modify-plan-order`, params); + } + + futuresCancelPlanOrder(params: object): Promise> { + return this.postPrivate(`/api/v2/mix/order/cancel-plan-order`, params); + } + + getFuturesPlanOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/orders-plan-pending`, params); + } + + getFuturesHistoricPlanOrders(params: object): Promise> { + return this.getPrivate(`/api/v2/mix/order/orders-plan-history`, params); + } + + /** + * + * + * Broker + * + * + */ + + // TODO: not yet implemented + + /** + * + * + * Margin + * + * + */ + + /** + * + * * Margin | Common + * + */ + + getMarginCurrencies(): Promise> { + return this.get(`/api/v2/margin/currencies`); + } + + /** + * + * * Margin | Cross/Isolated | Order Record + * + */ + + getMarginBorrowHistory( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/borrow-history`, + params, + ); + } + + getMarginRepayHistory( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/repay-history`, + params, + ); + } + + getMarginInterestHistory( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/interest-history`, + params, + ); + } + + getMarginLiquidationHistory( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/liquidation-history`, + params, + ); + } + + getMarginFinancialHistory( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/financial-records`, + params, + ); + } + + /** + * + * * Margin | Cross/Isolated | Account + * + */ + + getMarginAccountAssets( + marginType: MarginType, + params?: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/account/assets`, + params, + ); + } + + marginBorrow( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + `/api/v2/margin/${marginType}/account/borrow`, + params, + ); + } + + marginRepay( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + `/api/v2/margin/${marginType}/account/repay`, + params, + ); + } + + getMarginRiskRate(marginType: MarginType): Promise> { + assertMarginType(marginType); + return this.getPrivate(`/api/v2/margin/${marginType}/account/risk-rate`); + } + + getMarginMaxBorrowable( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + '/api/v2/margin/${marginType}/account/max-borrowable-amount', + params, + ); + } + + getMarginMaxTransferable( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + '/api/v2/margin/${marginType}/account/max-transfer-out-amount', + params, + ); + } + + getMarginInterestRateAndMaxBorrowable( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + '/api/v2/margin/${marginType}/interest-rate-and-limit', + params, + ); + } + + getMarginTierConfiguration( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate(`/api/v2/margin/${marginType}/tier-data`, params); + } + + marginFlashRepay( + marginType: MarginType, + params?: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + '/api/v2/margin/${marginType}/account/flash-repay', + params, + ); + } + + getMarginFlashRepayResult( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + '/api/v2/margin/${marginType}/account/query-flash-repay-status', + params, + ); + } + + /** + * + * * Margin | Cross/Isolated | Trade + * + */ + + marginSubmitOrder( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate(`/api/v2/margin/${marginType}/place-order`, params); + } + + marginBatchSubmitOrders( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + `/api/v2/margin/${marginType}/batch-place-order`, + params, + ); + } + + marginCancelOrder( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + `/api/v2/margin/${marginType}/cancel-order`, + params, + ); + } + + marginBatchCancelOrders( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.postPrivate( + '/api/v2/margin/${marginType}/batch-cancel-order', + params, + ); + } + + getMarginOpenOrders( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate(`/api/v2/margin/${marginType}/open-orders`, params); + } + + getMarginHistoricOrders( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate( + `/api/v2/margin/${marginType}/history-orders`, + params, + ); + } + + getMarginHistoricOrderFills( + marginType: MarginType, + params: object, + ): Promise> { + assertMarginType(marginType); + return this.getPrivate(`/api/v2/margin/${marginType}/fills`, params); + } + + /** + * + * + * Copy Trading + * + * + */ + + // TODO: not yet implemented + + /** + * + * + * Earn + * + * + */ + + // TODO: not yet implemented +} diff --git a/src/spot-client.ts b/src/spot-client.ts index 97b6257..69b72f9 100644 --- a/src/spot-client.ts +++ b/src/spot-client.ts @@ -27,6 +27,8 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client + * + * @deprecated use RestClientV2 instead */ export class SpotClient extends BaseRestClient { getClientType() { @@ -43,7 +45,6 @@ export class SpotClient extends BaseRestClient { * Public * */ - /** Get Server Time */ getServerTime(): Promise> { return this.get('/api/spot/v1/public/time'); diff --git a/src/types/request/shared.ts b/src/types/request/shared.ts index 3a63c26..6d21f7a 100644 --- a/src/types/request/shared.ts +++ b/src/types/request/shared.ts @@ -17,3 +17,8 @@ export interface GetHistoricTradesParams { startTime?: string; endTime?: string; } + +/** + * The margin type, used directly in building the endpoint URL + */ +export type MarginType = 'crossed' | 'isolated'; diff --git a/src/types/response/shared.ts b/src/types/response/shared.ts index d99b11c..e59ec99 100644 --- a/src/types/response/shared.ts +++ b/src/types/response/shared.ts @@ -1,8 +1,8 @@ export interface APIResponse { code: string; - data: T; - msg: 'success' | string; requestTime: number; + msg: 'success' | string; + data: T; } export interface VIPFeeRate { diff --git a/src/util/requestUtils.ts b/src/util/requestUtils.ts index d93f396..6f831f0 100644 --- a/src/util/requestUtils.ts +++ b/src/util/requestUtils.ts @@ -98,4 +98,5 @@ export const REST_CLIENT_TYPE_ENUM = { spot: 'spot', futures: 'futures', broker: 'broker', + v2: 'v2', } as const; diff --git a/src/util/type-guards.ts b/src/util/type-guards.ts index b74709a..fbf9967 100644 --- a/src/util/type-guards.ts +++ b/src/util/type-guards.ts @@ -1,4 +1,5 @@ import { + MarginType, WsAccountSnapshotUMCBL, WsBaseEvent, WSPositionSnapshotUMCBL, @@ -71,3 +72,13 @@ export function isWsFuturesPositionsSnapshotEvent( ): event is WSPositionSnapshotUMCBL { return isWsPositionsSnapshotEvent(event) && event.arg.instType === 'umcbl'; } + +/** + * Simple guard for non-TypeScript users, throw a runtime error if value doesn't match type + */ +export function assertMarginType(marginType: string): marginType is MarginType { + if (marginType !== 'isolated' && marginType !== 'crossed') { + throw new Error(`MarginType should be one of: crossed | isolated`); + } + return true; +} diff --git a/src/util/websocket-util.ts b/src/util/websocket-util.ts index 6b9645b..2637169 100644 --- a/src/util/websocket-util.ts +++ b/src/util/websocket-util.ts @@ -19,17 +19,40 @@ type NetworkMap< export const WS_BASE_URL_MAP: Record< WsKey, - Record<'all', NetworkMap<'livenet'>> + Record<'all' | 'public' | 'private', NetworkMap<'livenet'>> > = { mixv1: { all: { livenet: 'wss://ws.bitget.com/mix/v1/stream', }, + public: { + livenet: 'N/A', + }, + private: { + livenet: 'N/A', + }, }, spotv1: { all: { livenet: 'wss://ws.bitget.com/spot/v1/stream', }, + public: { + livenet: 'N/A', + }, + private: { + livenet: 'N/A', + }, + }, + v2: { + all: { + livenet: 'N/A', + }, + public: { + livenet: 'wss://ws.bitget.com/v2/ws/public', + }, + private: { + livenet: 'wss://ws.bitget.com/v2/ws/private', + }, }, }; @@ -37,6 +60,7 @@ export const WS_BASE_URL_MAP: Record< export const WS_KEY_MAP = { spotv1: 'spotv1', mixv1: 'mixv1', + v2: 'v2', } as const; /** Any WS keys in this list will trigger auth on connect, if credentials are available */ @@ -88,7 +112,8 @@ export function getWsKeyForTopic( export function getMaxTopicsPerSubscribeEvent(wsKey: WsKey): number | null { switch (wsKey) { case 'mixv1': - case 'spotv1': { + case 'spotv1': + case 'v2': { // Technically there doesn't seem to be a documented cap, but there is a size limit per request. Doesn't hurt to batch requests. return 15; }