diff --git a/src/inverse-client.ts b/src/inverse-client.ts index f88842d..21f9d80 100644 --- a/src/inverse-client.ts +++ b/src/inverse-client.ts @@ -145,7 +145,7 @@ export class InverseClient extends BaseRestClient { */ getApiKeyInfo(): GenericAPIResponse { - return this.requestWrapper.get('v2/private/account/api-key'); + return this.getPrivate('v2/private/account/api-key'); } /** @@ -155,21 +155,21 @@ export class InverseClient extends BaseRestClient { */ getWalletBalance(params?: Partial): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/balance', params); + return this.getPrivate('v2/private/wallet/balance', params); } getWalletFundRecords(params?: WalletFundRecordsReq): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/fund/records', params); + return this.getPrivate('v2/private/wallet/fund/records', params); } getWithdrawRecords(params?: WithdrawRecordsReq): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/withdraw/list', params); + return this.getPrivate('v2/private/wallet/withdraw/list', params); } getAssetExchangeRecords( params?: AssetExchangeRecordsReq ): GenericAPIResponse { - return this.requestWrapper.get('v2/private/exchange-order/list', params); + return this.getPrivate('v2/private/exchange-order/list', params); } /** @@ -221,7 +221,7 @@ export class InverseClient extends BaseRestClient { limit?: number; cursor?: string; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/order/list', params); + return this.getPrivate('v2/private/order/list', params); } cancelActiveOrder(params: { @@ -255,7 +255,7 @@ export class InverseClient extends BaseRestClient { order_link_id?: string; symbol: string; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/order', params); + return this.getPrivate('v2/private/order', params); } /** @@ -286,7 +286,7 @@ export class InverseClient extends BaseRestClient { limit?: number; cursor?: string; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/stop-order/list', params); + return this.getPrivate('v2/private/stop-order/list', params); } cancelConditionalOrder(params: { @@ -317,7 +317,7 @@ export class InverseClient extends BaseRestClient { stop_order_id?: string; order_link_id?: string; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/stop-order', params); + return this.getPrivate('v2/private/stop-order', params); } /** @@ -325,7 +325,7 @@ export class InverseClient extends BaseRestClient { */ getPosition(params?: Partial): GenericAPIResponse { - return this.requestWrapper.get('v2/private/position/list', params); + return this.getPrivate('v2/private/position/list', params); } changePositionMargin(params: { @@ -366,7 +366,7 @@ export class InverseClient extends BaseRestClient { limit?: number; order?: string; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/execution/list', params); + return this.getPrivate('v2/private/execution/list', params); } getClosedPnl(params: { @@ -377,7 +377,7 @@ export class InverseClient extends BaseRestClient { page?: number; limit?: number; }): GenericAPIResponse { - return this.requestWrapper.get('v2/private/trade/closed-pnl/list', params); + return this.getPrivate('v2/private/trade/closed-pnl/list', params); } setPositionMode(params: { symbol: string; mode: 0 | 3 }): GenericAPIResponse { @@ -427,14 +427,11 @@ export class InverseClient extends BaseRestClient { } getMyLastFundingFee(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get('v2/private/funding/prev-funding', params); + return this.getPrivate('v2/private/funding/prev-funding', params); } getPredictedFunding(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get( - 'v2/private/funding/predicted-funding', - params - ); + return this.getPrivate('v2/private/funding/predicted-funding', params); } /** @@ -442,6 +439,6 @@ export class InverseClient extends BaseRestClient { */ getLcpInfo(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get('v2/private/account/lcp', params); + return this.getPrivate('v2/private/account/lcp', params); } } diff --git a/src/inverse-futures-client.ts b/src/inverse-futures-client.ts index 836867c..d3feb21 100644 --- a/src/inverse-futures-client.ts +++ b/src/inverse-futures-client.ts @@ -6,11 +6,9 @@ import { } from './util/requestUtils'; import RequestWrapper from './util/requestWrapper'; import { - APIResponse, APIResponseWithTime, AssetExchangeRecordsReq, CoinParam, - SymbolFromLimitParam, SymbolInfo, SymbolIntervalFromLimitParam, SymbolLimitParam, @@ -148,7 +146,7 @@ export class InverseFuturesClient extends BaseRestClient { */ getApiKeyInfo(): GenericAPIResponse { - return this.requestWrapper.get('v2/private/account/api-key'); + return this.getPrivate('v2/private/account/api-key'); } /** @@ -158,21 +156,21 @@ export class InverseFuturesClient extends BaseRestClient { */ getWalletBalance(params?: Partial): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/balance', params); + return this.getPrivate('v2/private/wallet/balance', params); } getWalletFundRecords(params?: WalletFundRecordsReq): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/fund/records', params); + return this.getPrivate('v2/private/wallet/fund/records', params); } - getWithdrawRecords(params: WithdrawRecordsReq): GenericAPIResponse { - return this.requestWrapper.get('v2/private/wallet/withdraw/list', params); + getWithdrawRecords(params?: WithdrawRecordsReq): GenericAPIResponse { + return this.getPrivate('v2/private/wallet/withdraw/list', params); } getAssetExchangeRecords( params?: AssetExchangeRecordsReq ): GenericAPIResponse { - return this.requestWrapper.get('v2/private/exchange-order/list', params); + return this.getPrivate('v2/private/exchange-order/list', params); } /** @@ -225,7 +223,7 @@ export class InverseFuturesClient extends BaseRestClient { limit?: number; cursor?: string; }): GenericAPIResponse { - return this.requestWrapper.get('futures/private/order/list', params); + return this.getPrivate('futures/private/order/list', params); } cancelActiveOrder(params: { @@ -255,7 +253,7 @@ export class InverseFuturesClient extends BaseRestClient { order_link_id?: string; symbol: string; }): GenericAPIResponse { - return this.requestWrapper.get('futures/private/order', params); + return this.getPrivate('futures/private/order', params); } /** @@ -288,7 +286,7 @@ export class InverseFuturesClient extends BaseRestClient { limit?: number; cursor?: string; }): GenericAPIResponse { - return this.requestWrapper.get('futures/private/stop-order/list', params); + return this.getPrivate('futures/private/stop-order/list', params); } cancelConditionalOrder(params: { @@ -328,7 +326,7 @@ export class InverseFuturesClient extends BaseRestClient { stop_order_id?: string; order_link_id?: string; }): GenericAPIResponse { - return this.requestWrapper.get('futures/private/stop-order', params); + return this.getPrivate('futures/private/stop-order', params); } /** @@ -339,7 +337,7 @@ export class InverseFuturesClient extends BaseRestClient { * Get position list */ getPosition(params?: Partial): GenericAPIResponse { - return this.requestWrapper.get('futures/private/position/list', params); + return this.getPrivate('futures/private/position/list', params); } changePositionMargin(params: { @@ -414,7 +412,7 @@ export class InverseFuturesClient extends BaseRestClient { limit?: number; order?: string; }): GenericAPIResponse { - return this.requestWrapper.get('futures/private/execution/list', params); + return this.getPrivate('futures/private/execution/list', params); } getClosedPnl(params: { @@ -425,10 +423,7 @@ export class InverseFuturesClient extends BaseRestClient { page?: number; limit?: number; }): GenericAPIResponse { - return this.requestWrapper.get( - 'futures/private/trade/closed-pnl/list', - params - ); + return this.getPrivate('futures/private/trade/closed-pnl/list', params); } /** @@ -439,7 +434,7 @@ export class InverseFuturesClient extends BaseRestClient { * Risk Limit */ getRiskLimitList(): GenericAPIResponse { - return this.requestWrapper.get('open-api/wallet/risk-limit/list'); + return this.getPrivate('open-api/wallet/risk-limit/list'); } setRiskLimit(params: { @@ -454,21 +449,15 @@ export class InverseFuturesClient extends BaseRestClient { */ getLastFundingRate(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get( - 'v2/public/funding/prev-funding-rate', - params - ); + return this.get('v2/public/funding/prev-funding-rate', params); } getMyLastFundingFee(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get('v2/private/funding/prev-funding', params); + return this.getPrivate('v2/private/funding/prev-funding', params); } getPredictedFunding(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get( - 'v2/private/funding/predicted-funding', - params - ); + return this.getPrivate('v2/private/funding/predicted-funding', params); } /** @@ -476,6 +465,6 @@ export class InverseFuturesClient extends BaseRestClient { */ getLcpInfo(params: SymbolParam): GenericAPIResponse { - return this.requestWrapper.get('v2/private/account/lcp', params); + return this.getPrivate('v2/private/account/lcp', params); } } diff --git a/src/util/node-support.ts b/src/util/node-support.ts index 7561ca4..bc3b159 100644 --- a/src/util/node-support.ts +++ b/src/util/node-support.ts @@ -1,7 +1,8 @@ import { createHmac } from 'crypto'; -export async function signMessage(message: string, secret: string): Promise { - return createHmac('sha256', secret) - .update(message) - .digest('hex'); -}; +export async function signMessage( + message: string, + secret: string +): Promise { + return createHmac('sha256', secret).update(message).digest('hex'); +} diff --git a/src/util/requestUtils.ts b/src/util/requestUtils.ts index 6342621..2ff11af 100644 --- a/src/util/requestUtils.ts +++ b/src/util/requestUtils.ts @@ -59,11 +59,18 @@ export function getRestBaseUrl( } export function isPublicEndpoint(endpoint: string): boolean { - if (endpoint.startsWith('v2/public')) { - return true; - } - if (endpoint.startsWith('public/linear')) { - return true; + const publicPrefixes = [ + 'v2/public', + 'public/linear', + 'spot/quote/v1', + 'spot/v1/symbols', + 'spot/v1/time', + ]; + + for (const prefix of publicPrefixes) { + if (endpoint.startsWith(prefix)) { + return true; + } } return false; } diff --git a/test/inverse-futures/private.read.test.ts b/test/inverse-futures/private.read.test.ts new file mode 100644 index 0000000..78feceb --- /dev/null +++ b/test/inverse-futures/private.read.test.ts @@ -0,0 +1,113 @@ +import { InverseFuturesClient } from '../../src/inverse-futures-client'; +import { + notAuthenticatedError, + successResponseList, + successResponseObject, +} from '../response.util'; + +describe('Public Inverse Futures REST API Endpoints', () => { + const useLivenet = true; + const API_KEY = process.env.API_KEY_COM; + const API_SECRET = process.env.API_SECRET_COM; + + const api = new InverseFuturesClient(API_KEY, API_SECRET, useLivenet, { + disable_time_sync: true, + }); + + // Warning: if some of these start to fail with 10001 params error, it's probably that this future expired and a newer one exists with a different symbol! + const symbol = 'BTCUSDU22'; + + describe('Inverse-Futures only private GET endpoints', () => { + it('getApiKeyInfo()', async () => { + expect(await api.getApiKeyInfo()).toMatchObject(successResponseObject()); + }); + + it('getWalletBalance()', async () => { + expect(await api.getWalletBalance()).toMatchObject( + successResponseObject() + ); + }); + + it('getWalletFundRecords()', async () => { + expect(await api.getWalletFundRecords()).toMatchObject( + successResponseObject() + ); + }); + + it('getWithdrawRecords()', async () => { + expect(await api.getWithdrawRecords()).toMatchObject( + successResponseObject() + ); + }); + + it('getAssetExchangeRecords()', async () => { + expect(await api.getAssetExchangeRecords()).toMatchObject( + successResponseList() + ); + }); + + it('getActiveOrderList()', async () => { + expect(await api.getActiveOrderList({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('queryActiveOrder()', async () => { + expect(await api.queryActiveOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('getConditionalOrder()', async () => { + expect(await api.getConditionalOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('queryConditionalOrder()', async () => { + expect(await api.queryConditionalOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('getPosition()', async () => { + expect(await api.getPosition()).toMatchObject(successResponseObject()); + }); + + it('getTradeRecords()', async () => { + expect(await api.getTradeRecords({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('getClosedPnl()', async () => { + expect(await api.getClosedPnl({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('getRiskLimitList()', async () => { + expect(await api.getRiskLimitList()).toMatchObject( + successResponseList('ok') + ); + }); + + it('getMyLastFundingFee()', async () => { + expect(await api.getMyLastFundingFee({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + + it('getPredictedFunding()', async () => { + expect(await api.getPredictedFunding({ symbol: 'BTCUSD' })).toMatchObject( + successResponseObject() + ); + }); + + it('getLcpInfo()', async () => { + expect(await api.getLcpInfo({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); + }); +});