diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..a228bf0 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,84 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.linting.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: [ + '@typescript-eslint/eslint-plugin', + // 'simple-import-sort', + // 'require-extensions', + ], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + // 'plugin:require-extensions/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/dot-notation': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + + '@typescript-eslint/no-unused-expressions': 'error', + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/promise-function-async': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + + 'no-dupe-class-members': 'off', + 'no-param-reassign': ['error'], + 'array-bracket-spacing': ['error', 'never'], + indent: ['off'], + 'linebreak-style': ['error', 'unix'], + 'lines-between-class-members': ['warn', 'always'], + semi: 'off', + '@typescript-eslint/semi': ['error'], + 'new-cap': 'off', + 'no-console': 'off', + 'no-debugger': 'off', + 'no-mixed-spaces-and-tabs': 2, + 'no-use-before-define': [2, 'nofunc'], + 'no-unreachable': ['warn'], + 'no-unused-vars': ['warn'], + 'no-extra-parens': ['off'], + 'no-mixed-operators': ['off'], + quotes: [2, 'single', 'avoid-escape'], + 'block-scoped-var': 2, + 'brace-style': [2, '1tbs', { allowSingleLine: true }], + 'computed-property-spacing': [2, 'never'], + 'keyword-spacing': 2, + 'space-unary-ops': 2, + 'sort-imports': [ + 'error', + { + ignoreCase: false, + ignoreDeclarationSort: true, + ignoreMemberSort: false, + memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], + allowSeparatedGroups: false, + }, + ], + 'max-len': ['warn', { code: 140 }], + + // newer rules + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + // 'simple-import-sort/imports': 'error', + // 'simple-import-sort/exports': 'error', + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 2147a38..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "env": { - "es6": true, - "node": true - }, - "extends": ["eslint:recommended"], - "parser": "@typescript-eslint/parser", - "root": true, - "plugins": ["@typescript-eslint"], - "overrides": [ - { - "files": ["**/*.ts", "**/*.tsx"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "parserOptions": { - "projecasdft": true, - "project": [ - "./tsconfig.json", - "./tsconfig.build.json", - "./tsconfig.examples.json", - "./test/tsconfig.test.json" - ] - }, - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/dot-notation": "off", - "@typescript-eslint/no-unused-vars": "warn", - - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-floating-promises": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/promise-function-async": "off", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-ts-comment": "off", - - "no-dupe-class-members": "off", - "no-param-reassign": ["error"], - "array-bracket-spacing": ["error", "never"], - "indent": ["off"], - "linebreak-style": ["error", "unix"], - "lines-between-class-members": ["warn", "always"], - "semi": "off", - "@typescript-eslint/semi": ["error"], - "new-cap": "off", - "no-console": "off", - "no-debugger": "off", - "no-mixed-spaces-and-tabs": 2, - "no-use-before-define": [2, "nofunc"], - "no-unreachable": ["warn"], - "no-unused-vars": ["warn"], - "no-extra-parens": ["off"], - "no-mixed-operators": ["off"], - "quotes": [2, "single", "avoid-escape"], - "block-scoped-var": 2, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "computed-property-spacing": [2, "never"], - "keyword-spacing": 2, - "space-unary-ops": 2, - "sort-imports": [ - "error", - { - "ignoreCase": false, - "ignoreDeclarationSort": true, - "ignoreMemberSort": false, - "memberSyntaxSortOrder": ["none", "all", "multiple", "single"], - "allowSeparatedGroups": false - } - ], - "max-len": ["warn", { "code": 140 }] - } - }, - { - "files": ["examples/*.js"], - "extends": ["eslint:recommended"] - } - ] -} diff --git a/package-lock.json b/package-lock.json index 8bc1d5b..1d68ead 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bybit-api", - "version": "3.10.23", + "version": "3.10.27", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bybit-api", - "version": "3.10.23", + "version": "3.10.27", "license": "MIT", "dependencies": { "axios": "^1.6.6", diff --git a/src/account-asset-client-v3.ts b/src/account-asset-client-v3.ts index 6b3106d..9b1adb1 100644 --- a/src/account-asset-client-v3.ts +++ b/src/account-asset-client-v3.ts @@ -43,6 +43,10 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client for Account Asset V3 APIs + * @deprecated WARNING + * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024. + * They may stop working at any point before then. + * Please update your code as soon as possible to use the V5 APIs instead. */ export class AccountAssetClientV3 extends BaseRestClient { getClientType() { @@ -67,20 +71,20 @@ export class AccountAssetClientV3 extends BaseRestClient { */ createInternalTransfer( - params: InternalTransferRequestV3 + params: InternalTransferRequestV3, ): Promise> { return this.postPrivate( '/asset/v3/private/transfer/inter-transfer', - params + params, ); } getInternalTransfers( - params: QueryInternalTransfersRequestV3 + params: QueryInternalTransfersRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/inter-transfer/list/query', - params + params, ); } @@ -93,16 +97,16 @@ export class AccountAssetClientV3 extends BaseRestClient { }): Promise> { return this.postPrivate( '/asset/v3/private/transfer/sub-member-transfer', - params + params, ); } getSubAccountTransfers( - params?: SubAccountTransferRequestV3 + params?: SubAccountTransferRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/sub-member-transfer/list/query', - params + params, ); } @@ -120,61 +124,61 @@ export class AccountAssetClientV3 extends BaseRestClient { }): Promise> { return this.postPrivate( '/asset/v3/private/transfer/transfer-sub-member-save', - params + params, ); } createUniversalTransfer( - params: UniversalTransferRequestV3 + params: UniversalTransferRequestV3, ): Promise> { return this.postPrivate( '/asset/v3/private/transfer/universal-transfer', - params + params, ); } getUniversalTransfers( - params: UniversalTransferListRequestV3 + params: UniversalTransferListRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/universal-transfer/list/query', - params + params, ); } getTransferableCoinList( - params: TransferCoinListRequestV3 + params: TransferCoinListRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/transfer-coin/list/query', - params + params, ); } getAccountCoinBalance( - params: SingleAccountCoinBalanceRequestV3 + params: SingleAccountCoinBalanceRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/account-coin/balance/query', - params + params, ); } getAccountCoinBalances( - params: AccountCoinBalancesRequestV3 + params: AccountCoinBalancesRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/account-coins/balance/query', - params + params, ); } getAssetInfo( - params?: AssetInfoRequestV3 + params?: AssetInfoRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/transfer/asset-info/query', - params + params, ); } @@ -186,49 +190,49 @@ export class AccountAssetClientV3 extends BaseRestClient { /** Get Deposit Spec */ getSupportedDepositList( - params?: SupportedDepositListRequestV3 + params?: SupportedDepositListRequestV3, ): Promise> { return this.get( '/asset/v3/public/deposit/allowed-deposit-list/query', - params + params, ); } getDepositRecords( - params?: DepositRecordQueryRequestV3 + params?: DepositRecordQueryRequestV3, ): Promise> { return this.getPrivate('/asset/v3/private/deposit/record/query', params); } getSubDepositRecords( - params: SubDepositRecordQueryRequestV3 + params: SubDepositRecordQueryRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/deposit/sub-member-record/query', - params + params, ); } getWithdrawRecords( - params?: WithdrawRecordQueryRequestV3 + params?: WithdrawRecordQueryRequestV3, ): Promise> { return this.getPrivate('/asset/v3/private/withdraw/record/query', params); } getCoinInformation( - coin?: string + coin?: string, ): Promise> { return this.getPrivate('/asset/v3/private/coin-info/query', { coin }); } submitWithdrawal( - params: WithdrawCreateRequestV3 + params: WithdrawCreateRequestV3, ): Promise> { return this.postPrivate('/asset/v3/private/withdraw/create', params); } cancelWithdrawal( - withdrawalId: number + withdrawalId: number, ): Promise> { return this.postPrivate('/asset/v3/private/withdraw/create', { withdrawalId, @@ -236,28 +240,28 @@ export class AccountAssetClientV3 extends BaseRestClient { } getMasterAccountDepositAddress( - params?: QueryDepositAddressRequestV3 + params?: QueryDepositAddressRequestV3, ): Promise> { return this.getPrivate('/asset/v3/private/deposit/address/query', params); } getSubAccountDepositAddress( - params: QuerySubAccountDepositAddressRequestV3 + params: QuerySubAccountDepositAddressRequestV3, ): Promise> { return this.getPrivate( '/asset/v3/private/deposit/sub-member-address/query', - params + params, ); } createSubMember( - params: CreateSubMemberRequestV3 + params: CreateSubMemberRequestV3, ): Promise> { return this.postPrivate('/user/v3/private/create-sub-member', params); } createSubAPIKey( - params: CreateSubAPIKeyRequestV3 + params: CreateSubAPIKeyRequestV3, ): Promise> { return this.postPrivate('/user/v3/private/create-sub-api', params); } @@ -274,7 +278,7 @@ export class AccountAssetClientV3 extends BaseRestClient { */ freezeSubMember( subuid: number, - frozenStatus: 0 | 1 + frozenStatus: 0 | 1, ): Promise> { return this.postPrivate('/user/v3/private/frozen-sub-member', { subuid, @@ -287,13 +291,13 @@ export class AccountAssetClientV3 extends BaseRestClient { } modifyMasterAPIKey( - params: ModifyAPIKeyRequestV3 + params: ModifyAPIKeyRequestV3, ): Promise> { return this.postPrivate('/user/v3/private/update-api', params); } modifySubAPIKey( - params: ModifyAPIKeyRequestV3 + params: ModifyAPIKeyRequestV3, ): Promise> { return this.postPrivate('/user/v3/private/update-sub-api', params); } diff --git a/src/contract-client.ts b/src/contract-client.ts index b5df43c..fb31fbd 100644 --- a/src/contract-client.ts +++ b/src/contract-client.ts @@ -32,6 +32,10 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client for Derivatives V3 Contract APIs + * @deprecated WARNING + * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024. + * They may stop working at any point before then. + * Please update your code as soon as possible to use the V5 APIs instead. */ export class ContractClient extends BaseRestClient { getClientType() { diff --git a/src/copy-trading-client.ts b/src/copy-trading-client.ts index c8425d3..1fa226f 100644 --- a/src/copy-trading-client.ts +++ b/src/copy-trading-client.ts @@ -14,6 +14,10 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client for USDC Perpetual APIs + * @deprecated WARNING + * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024. + * They may stop working at any point before then. + * Please update your code as soon as possible to use the V5 APIs instead. */ export class CopyTradingClient extends BaseRestClient { getClientType() { @@ -82,7 +86,10 @@ export class CopyTradingClient extends BaseRestClient { ); } - /** Close Order. This endpoint's rate_limit will decrease by 10 per request; ie, one request to this endpoint consumes 10 from the limit allowed per minute. */ + /** Close Order. + * This endpoint's rate_limit will decrease by 10 per request; + * ie, one request to this endpoint consumes 10 from the limit allowed per minute. + */ closeOrder( params: CopyTradingCloseOrderRequest, ): Promise> { diff --git a/src/rest-client-v5.ts b/src/rest-client-v5.ts index 8bde06d..2b4f7e8 100644 --- a/src/rest-client-v5.ts +++ b/src/rest-client-v5.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { APIResponseV3, @@ -242,7 +243,7 @@ export class RestClientV5 extends BaseRestClient { console.log(result); console.log( - `Your approximate latency to exchange server: + `Your approximate latency to exchange server: One way: ${estimatedOneWayLatency}ms. Round trip: ${roundTripTime}ms. `, diff --git a/src/spot-client-v3.ts b/src/spot-client-v3.ts index 029b92d..4bc1e8f 100644 --- a/src/spot-client-v3.ts +++ b/src/spot-client-v3.ts @@ -17,6 +17,10 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client for newer Spot V3 APIs. + * @deprecated WARNING + * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024. + * They may stop working at any point before then. + * Please update your code as soon as possible to use the V5 APIs instead. */ export class SpotClientV3 extends BaseRestClient { getClientType() { @@ -49,7 +53,7 @@ export class SpotClientV3 extends BaseRestClient { getMergedOrderBook( symbol: string, scale?: number, - limit?: number + limit?: number, ): Promise> { return this.get('/spot/v3/public/quote/depth/merged', { symbol, @@ -69,7 +73,7 @@ export class SpotClientV3 extends BaseRestClient { interval: KlineInterval, limit?: number, startTime?: number, - endTime?: number + endTime?: number, ): Promise> { return this.get('/spot/v3/public/quote/kline', { symbol, @@ -120,7 +124,7 @@ export class SpotClientV3 extends BaseRestClient { /** Batch cancel orders */ cancelOrderBatch( - params: SpotCancelOrderBatchRequest + params: SpotCancelOrderBatchRequest, ): Promise> { const orderTypes = params.orderTypes ? params.orderTypes.join(',') @@ -145,7 +149,7 @@ export class SpotClientV3 extends BaseRestClient { symbol?: string, orderId?: string, limit?: number, - orderCategory?: 0 | 1 + orderCategory?: 0 | 1, ): Promise> { return this.getPrivate('/spot/v3/private/open-orders', { symbol, @@ -160,7 +164,7 @@ export class SpotClientV3 extends BaseRestClient { symbol?: string, orderId?: string, limit?: number, - orderCategory?: 0 | 1 + orderCategory?: 0 | 1, ): Promise> { return this.getPrivate('/spot/v3/private/history-orders', { symbol, @@ -220,7 +224,7 @@ export class SpotClientV3 extends BaseRestClient { purchaseLeveragedToken( ltCode: string, ltAmount: string, - serialNo?: string + serialNo?: string, ): Promise> { return this.postPrivate('/spot/v3/private/purchase', { ltCode, @@ -233,7 +237,7 @@ export class SpotClientV3 extends BaseRestClient { redeemLeveragedToken( ltCode: string, ltAmount: string, - serialNo?: string + serialNo?: string, ): Promise> { return this.postPrivate('/spot/v3/private/redeem', { ltCode, @@ -244,7 +248,7 @@ export class SpotClientV3 extends BaseRestClient { /** Get leveraged token purchase/redemption history */ getLeveragedTokenPRHistory( - params?: SpotLeveragedTokenPRHistoryRequest + params?: SpotLeveragedTokenPRHistoryRequest, ): Promise> { return this.getPrivate('/spot/v3/private/record', params); } @@ -258,7 +262,7 @@ export class SpotClientV3 extends BaseRestClient { /** Borrow margin loan */ borrowCrossMarginLoan( coin: string, - qty: string + qty: string, ): Promise> { return this.postPrivate('/spot/v3/private/cross-margin-loan', { coin, @@ -276,7 +280,7 @@ export class SpotClientV3 extends BaseRestClient { /** Query borrowing info */ getCrossMarginBorrowingInfo( - params?: SpotCrossMarginBorrowingInfoRequest + params?: SpotCrossMarginBorrowingInfoRequest, ): Promise> { return this.getPrivate('/spot/v3/private/cross-margin-orders', params); } @@ -293,11 +297,11 @@ export class SpotClientV3 extends BaseRestClient { /** Query repayment history */ getCrossMarginRepaymentHistory( - params?: SpotCrossMarginRepaymentHistoryRequest + params?: SpotCrossMarginRepaymentHistoryRequest, ): Promise> { return this.getPrivate( '/spot/v3/private/cross-margin-repay-history', - params + params, ); } } diff --git a/src/types/request/linear.ts b/src/types/request/linear.ts index 3ec68fe..4e35455 100644 --- a/src/types/request/linear.ts +++ b/src/types/request/linear.ts @@ -133,12 +133,12 @@ export interface LinearSetMarginSwitchRequest { export interface LinearSetPositionModeRequest { symbol: string; - mode: typeof linearPositionModeEnum[keyof typeof linearPositionModeEnum]; + mode: (typeof linearPositionModeEnum)[keyof typeof linearPositionModeEnum]; } export interface LinearSetPositionTpSlModeRequest { symbol: string; - tp_sl_mode: typeof positionTpSlModeEnum[keyof typeof positionTpSlModeEnum]; + tp_sl_mode: (typeof positionTpSlModeEnum)[keyof typeof positionTpSlModeEnum]; } export interface LinearSetAddReduceMarginRequest { diff --git a/src/types/response/v5-market.ts b/src/types/response/v5-market.ts index 29ac3ff..a5529fb 100644 --- a/src/types/response/v5-market.ts +++ b/src/types/response/v5-market.ts @@ -293,6 +293,7 @@ export interface RiskLimitV5 { section: any; isLowestRisk: 0 | 1; maxLeverage: string; + mmDeduction: string; } /** @deprecated use DeliveryPriceV5 instead */ diff --git a/src/types/v5-shared.ts b/src/types/v5-shared.ts index 1cc8f95..514111f 100644 --- a/src/types/v5-shared.ts +++ b/src/types/v5-shared.ts @@ -11,7 +11,6 @@ export type InstrumentStatusV5 = | 'Settling' | 'Delivering' | 'Closed'; - export type MarginTradingV5 = 'none' | 'both' | 'utaOnly' | 'normalSpotOnly'; @@ -156,7 +155,7 @@ export type PositionIdx = 0 | 1 | 2; /** * Position status. - * + * * - 'Normal' * - 'Liq' in the liquidation progress * - 'Adl' in the auto-deleverage progress @@ -175,7 +174,10 @@ export type OptionTypeV5 = 'Call' | 'Put'; export type TradeModeV5 = 0 | 1; export type TPSLModeV5 = 'Full' | 'Partial'; -export type AccountMarginModeV5 = 'ISOLATED_MARGIN' | 'REGULAR_MARGIN' | 'PORTFOLIO_MARGIN'; +export type AccountMarginModeV5 = + | 'ISOLATED_MARGIN' + | 'REGULAR_MARGIN' + | 'PORTFOLIO_MARGIN'; export type UnifiedUpdateStatusV5 = 'FAIL' | 'PROCESS' | 'SUCCESS'; export type AccountTypeV5 = diff --git a/src/types/websocket.events.ts b/src/types/websocket.events.ts index cb11da5..8c57f7a 100644 --- a/src/types/websocket.events.ts +++ b/src/types/websocket.events.ts @@ -60,7 +60,11 @@ export interface WSOrderbookV5 { seq: number; } -export type WSOrderbookEventV5 = WSPublicTopicEventV5; +export type WSOrderbookEventV5 = WSPublicTopicEventV5< + string, + 'delta' | 'snapshot', + WSOrderbookV5[] +>; export interface WSPositionV5 { category: string; @@ -103,7 +107,10 @@ export interface WSPositionV5 { seq: number; } -export type WSPositionEventV5 = WSPrivateTopicEventV5<'position', WSPositionV5[]>; +export type WSPositionEventV5 = WSPrivateTopicEventV5< + 'position', + WSPositionV5[] +>; export interface WSAccountOrderV5 { category: CategoryV5; @@ -126,6 +133,7 @@ export interface WSAccountOrderV5 { cumExecQty: string; cumExecValue: string; cumExecFee: string; + closedPnl: string; feeCurrency: string; timeInForce: OrderTimeInForceV5; orderType: OrderTypeV5; @@ -154,7 +162,10 @@ export interface WSAccountOrderV5 { updatedTime: string; } -export type WSAccountOrderEventV5 = WSPrivateTopicEventV5<'order', WSAccountOrderV5[]>; +export type WSAccountOrderEventV5 = WSPrivateTopicEventV5< + 'order', + WSAccountOrderV5[] +>; export interface WSExecutionV5 { category: CategoryV5; @@ -189,4 +200,7 @@ export interface WSExecutionV5 { marketUnit: string; } -export type WSExecutionEventV5 = WSPrivateTopicEventV5<'execution', WSExecutionV5[]>; \ No newline at end of file +export type WSExecutionEventV5 = WSPrivateTopicEventV5< + 'execution', + WSExecutionV5[] +>; diff --git a/src/unified-margin-client.ts b/src/unified-margin-client.ts index 0e172ef..bbfce4a 100644 --- a/src/unified-margin-client.ts +++ b/src/unified-margin-client.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { APIResponseV3, @@ -36,6 +37,10 @@ import BaseRestClient from './util/BaseRestClient'; /** * REST API client for Derivatives V3 unified margin APIs + * @deprecated WARNING + * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024. + * They may stop working at any point before then. + * Please update your code as soon as possible to use the V5 APIs instead. */ export class UnifiedMarginClient extends BaseRestClient { getClientType() { diff --git a/src/usdc-perpetual-client.ts b/src/usdc-perpetual-client.ts index 58ab690..0c76819 100644 --- a/src/usdc-perpetual-client.ts +++ b/src/usdc-perpetual-client.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { APIResponseV3, @@ -133,7 +134,10 @@ export class USDCPerpetualClient extends BaseRestClient { ); } - /** Active order parameters (such as quantity, price) and stop order parameters cannot be modified in one request at the same time. Please request modification separately. */ + /** + * Active order parameters (such as quantity, price) and stop order parameters cannot be modified in one request at the same time. + * Please request modification separately. + */ modifyOrder(params: USDCPerpModifyOrderRequest): Promise> { return this.postPrivate( '/perpetual/usdc/openapi/private/v1/replace-order', diff --git a/src/util/WsStore.ts b/src/util/WsStore.ts index 024022d..9ca4698 100644 --- a/src/util/WsStore.ts +++ b/src/util/WsStore.ts @@ -71,7 +71,7 @@ export default class WsStore { if (this.hasExistingActiveConnection(key)) { this.logger.warning( 'WsStore setConnection() overwriting existing open connection: ', - this.getWs(key) + this.getWs(key), ); } this.wsState[key] = { @@ -86,7 +86,7 @@ export default class WsStore { const ws = this.getWs(key); this.logger.warning( 'WsStore deleting state for connection still open: ', - ws + ws, ); ws?.close(); } @@ -107,7 +107,7 @@ export default class WsStore { if (this.isWsOpen(key)) { this.logger.warning( 'WsStore setConnection() overwriting existing open connection: ', - this.getWs(key) + this.getWs(key), ); } this.get(key, true)!.ws = wsConnection; diff --git a/src/util/browser-support.ts b/src/util/browser-support.ts index a7e0980..280ce37 100644 --- a/src/util/browser-support.ts +++ b/src/util/browser-support.ts @@ -1,6 +1,6 @@ export async function signMessage( message: string, - secret: string + secret: string, ): Promise { const encoder = new TextEncoder(); // eslint-disable-next-line no-undef @@ -9,21 +9,21 @@ export async function signMessage( encoder.encode(secret), { name: 'HMAC', hash: { name: 'SHA-256' } }, false, - ['sign'] + ['sign'], ); // eslint-disable-next-line no-undef const signature = await window.crypto.subtle.sign( 'HMAC', key, - encoder.encode(message) + encoder.encode(message), ); return Array.prototype.map .call( new Uint8Array(signature), (x: { toString: (arg0: number) => string }) => - ('00' + x.toString(16)).slice(-2) + ('00' + x.toString(16)).slice(-2), ) .join(''); } diff --git a/src/util/node-support.ts b/src/util/node-support.ts index bbbf8bd..0d352d7 100644 --- a/src/util/node-support.ts +++ b/src/util/node-support.ts @@ -3,7 +3,7 @@ import { createHmac } from 'crypto'; /** This is async because the browser version uses a promise (browser-support) */ export async function signMessage( message: string, - secret: string + secret: string, ): Promise { return createHmac('sha256', secret).update(message).digest('hex'); } diff --git a/src/util/typeGuards.ts b/src/util/typeGuards.ts index 44308f8..dbe78ab 100644 --- a/src/util/typeGuards.ts +++ b/src/util/typeGuards.ts @@ -2,7 +2,12 @@ * Use type guards to narrow down types with minimal efforts. */ -import { WSAccountOrderEventV5, WSExecutionEventV5, WSOrderbookEventV5, WSPositionEventV5 } from '../types/websocket.events'; +import { + WSAccountOrderEventV5, + WSExecutionEventV5, + WSOrderbookEventV5, + WSPositionEventV5, +} from '../types/websocket.events'; /** * Type guard to detect a V5 orderbook event (delta & snapshots) @@ -30,7 +35,7 @@ export function isWsOrderbookEventV5( /** * Type guard to detect a V5 position event. - * + * * @param event * @returns */ @@ -86,4 +91,4 @@ export function isWsExecutionEventV5( } return event['topic'] === 'execution'; -} \ No newline at end of file +} diff --git a/src/websocket-client.ts b/src/websocket-client.ts index 816524c..1a76fc5 100644 --- a/src/websocket-client.ts +++ b/src/websocket-client.ts @@ -4,18 +4,12 @@ import { EventEmitter } from 'events'; import WebSocket from 'isomorphic-ws'; +import { ContractClient } from './contract-client'; import { InverseClient } from './inverse-client'; import { LinearClient } from './linear-client'; -import { SpotClientV3 } from './spot-client-v3'; +import { RestClientV5 } from './rest-client-v5'; import { SpotClient } from './spot-client'; -import { USDCOptionClient } from './usdc-option-client'; -import { USDCPerpetualClient } from './usdc-perpetual-client'; -import { UnifiedMarginClient } from './unified-margin-client'; -import { ContractClient } from './contract-client'; - -import { signMessage } from './util/node-support'; -import WsStore from './util/WsStore'; - +import { SpotClientV3 } from './spot-client-v3'; import { APIMarket, CategoryV5, @@ -26,7 +20,10 @@ import { WsKey, WsTopic, } from './types'; - +import { WebsocketTopicSubscriptionConfirmationEvent } from './types/ws-events/topic-subscription-confirmation'; +import { UnifiedMarginClient } from './unified-margin-client'; +import { USDCOptionClient } from './usdc-option-client'; +import { USDCPerpetualClient } from './usdc-perpetual-client'; import { DefaultLogger, PUBLIC_WS_KEYS, @@ -44,8 +41,8 @@ import { safeTerminateWs, serializeParams, } from './util'; -import { RestClientV5 } from './rest-client-v5'; -import { WebsocketTopicSubscriptionConfirmationEvent } from './types/ws-events/topic-subscription-confirmation'; +import { signMessage } from './util/node-support'; +import WsStore from './util/WsStore'; const loggerCategory = { category: 'bybit-ws' }; diff --git a/test/response.util.ts b/test/response.util.ts index 9b24a7f..f107cf2 100644 --- a/test/response.util.ts +++ b/test/response.util.ts @@ -47,7 +47,7 @@ export function successEmptyResponseObjectV3() { export function errorResponseObject( result: null | any = null, ret_code: number, - ret_msg: string + ret_msg: string, ) { return { result, @@ -58,7 +58,7 @@ export function errorResponseObject( export function errorResponseObjectV3( result: null | any = null, - retCode: number + retCode: number, ) { return { result, diff --git a/test/v5/private.read.test.ts b/test/v5/private.read.test.ts index 7282081..5161550 100644 --- a/test/v5/private.read.test.ts +++ b/test/v5/private.read.test.ts @@ -1,6 +1,6 @@ import { API_ERROR_CODE, RestClientV5 } from '../../src'; -import { successResponseObjectV3 } from '../response.util'; import { getTestProxy } from '../proxy.util'; +import { successResponseObjectV3 } from '../response.util'; describe('Private READ V5 REST API Endpoints', () => { const API_KEY = process.env.API_KEY_COM; @@ -22,6 +22,7 @@ describe('Private READ V5 REST API Endpoints', () => { const settleCoin = 'USDT'; const linearSymbol = 'BTCUSDT'; + const accountType = 'UNIFIED'; describe('misc endpoints', () => { it('fetchServerTime()', async () => { @@ -84,21 +85,19 @@ describe('Private READ V5 REST API Endpoints', () => { describe('Account APIs', () => { it('getWalletBalance()', async () => { expect( - await api.getWalletBalance({ accountType: 'CONTRACT' }), + await api.getWalletBalance({ accountType: accountType }), ).toMatchObject({ ...successResponseObjectV3() }); }); it('getBorrowHistory()', async () => { expect(await api.getBorrowHistory()).toMatchObject({ ...successResponseObjectV3(), - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }); }); it('getCollateralInfo()', async () => { expect(await api.getCollateralInfo()).toMatchObject({ ...successResponseObjectV3(), - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }); }); @@ -127,7 +126,7 @@ describe('Private READ V5 REST API Endpoints', () => { it('getTransactionLog()', async () => { expect(await api.getTransactionLog()).toMatchObject({ ...successResponseObjectV3(), - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, + // retMsg: '', }); }); @@ -151,7 +150,7 @@ describe('Private READ V5 REST API Endpoints', () => { expect(await api.getDeliveryRecord({ category: 'option' })).toMatchObject( { ...successResponseObjectV3(), - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, + // retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }, ); }); @@ -161,7 +160,7 @@ describe('Private READ V5 REST API Endpoints', () => { await api.getSettlementRecords({ category: 'linear' }), ).toMatchObject({ ...successResponseObjectV3(), - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, + // retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }); }); @@ -173,13 +172,19 @@ describe('Private READ V5 REST API Endpoints', () => { it('getAllCoinsBalance()', async () => { expect( - await api.getAllCoinsBalance({ accountType: 'SPOT' }), - ).toMatchObject({ ...successResponseObjectV3() }); + await api.getAllCoinsBalance({ accountType: accountType }), + ).toMatchObject({ + ...successResponseObjectV3(), + // retMsg: '', + }); }); it('getCoinBalance()', async () => { expect( - await api.getCoinBalance({ accountType: 'SPOT', coin: settleCoin }), + await api.getCoinBalance({ + accountType: accountType, + coin: settleCoin, + }), ).toMatchObject({ ...successResponseObjectV3() }); }); diff --git a/test/v5/private.write.test.ts b/test/v5/private.write.test.ts index c228245..d115116 100644 --- a/test/v5/private.write.test.ts +++ b/test/v5/private.write.test.ts @@ -199,7 +199,8 @@ describe('Private WRITE V5 REST API Endpoints', () => { }); }); - it('switchIsolatedMargin()', async () => { + // Not compatible with account mode + it.skip('switchIsolatedMargin()', async () => { expect( await api.switchIsolatedMargin({ category: 'linear', @@ -211,7 +212,7 @@ describe('Private WRITE V5 REST API Endpoints', () => { }), ).toMatchObject({ // ...successResponseObjectV3(), - // retMsg: '', + retMsg: '', retCode: API_ERROR_CODE.V5_CROSS_ISOLATED_MARGIN_NOT_CHANGED, }); }); @@ -275,7 +276,8 @@ describe('Private WRITE V5 REST API Endpoints', () => { }); }); - it('setAutoAddMargin()', async () => { + // Not compatible with account mode + it.skip('setAutoAddMargin()', async () => { expect( await api.setAutoAddMargin({ category: 'linear', @@ -284,8 +286,8 @@ describe('Private WRITE V5 REST API Endpoints', () => { positionIdx: 0, }), ).toMatchObject({ - // ...successResponseObjectV3(), - // retMsg: '', + ...successResponseObjectV3(), + retMsg: '', retCode: API_ERROR_CODE.V5_AUTO_ADD_MARGIN_NOT_CHANGED, }); }); @@ -294,9 +296,9 @@ describe('Private WRITE V5 REST API Endpoints', () => { describe('Account APIs', () => { it('setMarginMode()', async () => { expect(await api.setMarginMode('REGULAR_MARGIN')).toMatchObject({ - // ...successResponseObjectV3(), + ...successResponseObjectV3(), // retMsg: '', - retCode: API_ERROR_CODE.V5_MARGIN_MODE_NOT_CHANGED, + // retCode: API_ERROR_CODE.V5_MARGIN_MODE_NOT_CHANGED, }); }); @@ -468,17 +470,17 @@ describe('Private WRITE V5 REST API Endpoints', () => { describe('Spot Margin APIs', () => { it('toggleSpotMarginTrade()', async () => { expect(await api.toggleSpotMarginTrade('1')).toMatchObject({ - // ...successResponseObjectV3(), + ...successResponseObjectV3(), // retMsg: '', - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, + // retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }); }); it('setSpotMarginLeverage()', async () => { expect(await api.setSpotMarginLeverage('2')).toMatchObject({ - // ...successResponseObjectV3(), + ...successResponseObjectV3(), // retMsg: '', - retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, + // retCode: API_ERROR_CODE.INCORRECT_API_KEY_PERMISSIONS, }); }); }); diff --git a/tsconfig.linting.json b/tsconfig.linting.json new file mode 100644 index 0000000..cc3794b --- /dev/null +++ b/tsconfig.linting.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "target": "esnext", + "rootDir": "../", + "allowJs": true + }, + "include": [ + "src/**/*.*", + "test/**/*.*", + "examples/**/*.*", + ".eslintrc.cjs", + "jest.config.ts" + ] +}