@anrmk/str-package 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,36 @@
1
+ import { syncBybitServerTime, applyDemoMoney, getAccountInfo, getApiKeyInfo, getClosedPnl, getWalletBalance } from './chunk-CO4XRV62.js';
2
+
3
+ // src/clients/BybitClient.ts
4
+ var BybitClient = class {
5
+ timeOffset = 0;
6
+ ready;
7
+ constructor() {
8
+ this.ready = (async () => {
9
+ this.timeOffset = await syncBybitServerTime();
10
+ })();
11
+ }
12
+ async applyDemoMoney(credentials, payload) {
13
+ await this.ready;
14
+ return await applyDemoMoney(credentials, payload, this.timeOffset);
15
+ }
16
+ async getAccountInfo(credentials) {
17
+ await this.ready;
18
+ return await getAccountInfo(credentials, this.timeOffset);
19
+ }
20
+ async getApiKeyInfo(credentials) {
21
+ await this.ready;
22
+ return await getApiKeyInfo(credentials, this.timeOffset);
23
+ }
24
+ async getClosedPnl(credentials, payload) {
25
+ await this.ready;
26
+ return await getClosedPnl(credentials, payload, this.timeOffset);
27
+ }
28
+ async getWalletBalance(credentials) {
29
+ await this.ready;
30
+ return await getWalletBalance(credentials, this.timeOffset);
31
+ }
32
+ };
33
+
34
+ export { BybitClient };
35
+ //# sourceMappingURL=chunk-6L3IHUQM.js.map
36
+ //# sourceMappingURL=chunk-6L3IHUQM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/clients/BybitClient.ts"],"names":[],"mappings":";;;AAiBO,IAAM,cAAN,MAAkB;AAAA,EACf,UAAA,GAAa,CAAA;AAAA,EACJ,KAAA;AAAA,EAEjB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,YAAY;AACxB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAM,mBAAA,EAAoB;AAAA,IAC9C,CAAA,GAAG;AAAA,EACL;AAAA,EAEA,MAAM,cAAA,CACJ,WAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,CAAK,KAAA;AAEX,IAAA,OAAO,MAAM,cAAA,CAAe,WAAA,EAAa,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,eACJ,WAAA,EACA;AACA,IAAA,MAAM,IAAA,CAAK,KAAA;AACX,IAAA,OAAO,MAAM,cAAA,CAAe,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,cACJ,WAAA,EAC8C;AAC9C,IAAA,MAAM,IAAA,CAAK,KAAA;AACX,IAAA,OAAO,MAAM,aAAA,CAAc,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,YAAA,CACJ,WAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,CAAK,KAAA;AACX,IAAA,OAAO,MAAM,YAAA,CAAa,WAAA,EAAa,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,iBAAiB,WAAA,EAAgC;AACrD,IAAA,MAAM,IAAA,CAAK,KAAA;AACX,IAAA,OAAO,MAAM,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EAC5D;AACF","file":"chunk-6L3IHUQM.js","sourcesContent":["import type {\n IBybitApiKeyInfo,\n IBybitApiResponse,\n IBybitClosedPnlRequest,\n IBybitCredentials,\n IBybitDemoApplyMoneyRequest,\n} from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport {\n getApiKeyInfo,\n getClosedPnl,\n getAccountInfo,\n getWalletBalance,\n applyDemoMoney,\n} from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n ) {\n await this.ready;\n // Implement the logic to apply demo money to the Bybit account using the provided payload\n return await applyDemoMoney(credentials, payload, this.timeOffset);\n }\n\n async getAccountInfo(\n credentials: IBybitCredentials,\n ) {\n await this.ready;\n return await getAccountInfo(credentials, this.timeOffset);\n }\n\n async getApiKeyInfo(\n credentials: IBybitCredentials,\n ): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest\n ) {\n await this.ready;\n return await getClosedPnl(credentials, payload, this.timeOffset);\n }\n\n async getWalletBalance(credentials: IBybitCredentials) {\n await this.ready;\n return await getWalletBalance(credentials, this.timeOffset);\n }\n}\n"]}
@@ -163,7 +163,7 @@ async function getWalletBalance(credentials, timeOffset) {
163
163
  }
164
164
 
165
165
  // src/providers/bybit/get-closed-pnl.ts
166
- async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset) {
166
+ async function getClosedPnl(credentials, payload, timeOffset) {
167
167
  const { apiKey, apiSecret } = credentials;
168
168
  const query = new URLSearchParams({
169
169
  category: "linear",
@@ -171,14 +171,14 @@ async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset)
171
171
  limit: "50"
172
172
  //default limit
173
173
  });
174
- if (typeof startTime === "number") {
175
- query.set("startTime", String(startTime));
174
+ if (typeof payload.startTime === "number") {
175
+ query.set("startTime", String(payload.startTime));
176
176
  }
177
- if (typeof endTime === "number") {
178
- query.set("endTime", String(endTime));
177
+ if (typeof payload.endTime === "number") {
178
+ query.set("endTime", String(payload.endTime));
179
179
  }
180
- if (typeof cursor === "string") {
181
- query.set("cursor", String(cursor));
180
+ if (typeof payload.cursor === "string") {
181
+ query.set("cursor", String(payload.cursor));
182
182
  }
183
183
  const queryString = query.toString();
184
184
  const { signature, timestamp } = signBybitRequest({
@@ -346,5 +346,5 @@ async function getServerTime() {
346
346
  }
347
347
 
348
348
  export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getBybitTimestamp, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance, signBybitRequest, syncBybitServerTime };
349
- //# sourceMappingURL=chunk-Q6DF2HKM.js.map
350
- //# sourceMappingURL=chunk-Q6DF2HKM.js.map
349
+ //# sourceMappingURL=chunk-CO4XRV62.js.map
350
+ //# sourceMappingURL=chunk-CO4XRV62.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/bybit/constants.ts","../src/utils/bybitHelper.ts","../src/providers/bybit/get-api-key-info.ts","../src/providers/bybit/get-account-info.ts","../src/providers/bybit/get-wallet-balance.ts","../src/providers/bybit/get-closed-pnl.ts","../src/providers/bybit/get-position-info.ts","../src/providers/bybit/apply-demo-money.ts","../src/providers/bybit/get-server-time.ts"],"names":[],"mappings":"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","file":"chunk-CO4XRV62.js","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl, IBybitClosedPnlRequest } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof payload.startTime === \"number\") {\n query.set(\"startTime\", String(payload.startTime));\n }\n\n if (typeof payload.endTime === \"number\") {\n query.set(\"endTime\", String(payload.endTime));\n }\n\n if (typeof payload.cursor === \"string\") {\n query.set(\"cursor\", String(payload.cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}"]}
@@ -51,6 +51,186 @@ async function getApiKeyInfo(credentials, timeOffset) {
51
51
  return bybitJson;
52
52
  }
53
53
 
54
+ // src/providers/bybit/get-account-info.ts
55
+ async function getAccountInfo(credentials, timeOffset) {
56
+ const { apiKey, apiSecret } = credentials;
57
+ const queryString = "accountType=UNIFIED";
58
+ const { signature, timestamp } = signBybitRequest({
59
+ credentials,
60
+ queryString,
61
+ timeOffset
62
+ });
63
+ let bybitRes;
64
+ try {
65
+ bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {
66
+ headers: {
67
+ "X-BAPI-API-KEY": apiKey,
68
+ "X-BAPI-SIGN": signature,
69
+ "X-BAPI-SIGN-TYPE": "2",
70
+ "X-BAPI-TIMESTAMP": timestamp,
71
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
72
+ },
73
+ signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
74
+ cache: "no-store"
75
+ });
76
+ } catch (error) {
77
+ console.error("ByBit Account API network error", error);
78
+ throw new Error("ByBit Account API network error", { cause: error });
79
+ }
80
+ if (!bybitRes.ok) {
81
+ console.error("ByBit Account API request failed", bybitRes);
82
+ throw new Error("ByBit Account API request failed");
83
+ }
84
+ const bybitJson = await bybitRes.json();
85
+ if (bybitJson.retCode !== 0) {
86
+ console.error("ByBit Account API error", bybitJson);
87
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
88
+ }
89
+ const raw = bybitJson.result?.list?.[0];
90
+ if (!raw) {
91
+ console.error("No account info returned", bybitJson);
92
+ throw new Error("No account info returned");
93
+ }
94
+ return bybitJson;
95
+ }
96
+
97
+ // src/providers/bybit/get-wallet-balance.ts
98
+ async function getWalletBalance(credentials, timeOffset) {
99
+ const { apiKey, apiSecret } = credentials;
100
+ const query = new URLSearchParams({
101
+ accountType: "UNIFIED",
102
+ coin: "USDT"
103
+ });
104
+ const queryString = query.toString();
105
+ const { signature, timestamp } = signBybitRequest({
106
+ credentials,
107
+ queryString,
108
+ timeOffset
109
+ });
110
+ let bybitRes;
111
+ try {
112
+ bybitRes = await fetch(
113
+ `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,
114
+ {
115
+ headers: {
116
+ "X-BAPI-API-KEY": apiKey,
117
+ "X-BAPI-SIGN": signature,
118
+ "X-BAPI-SIGN-TYPE": "2",
119
+ "X-BAPI-TIMESTAMP": timestamp,
120
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
121
+ }
122
+ }
123
+ );
124
+ } catch (error) {
125
+ console.error("ByBit Wallet API network error", error);
126
+ throw new Error("ByBit Wallet API network error", { cause: error });
127
+ }
128
+ if (!bybitRes.ok) {
129
+ console.error("ByBit Wallet API request failed", bybitRes);
130
+ throw new Error("ByBit Wallet API request failed: " + bybitRes.statusText);
131
+ }
132
+ const bybitJson = await bybitRes.json();
133
+ if (bybitJson.retCode !== 0) {
134
+ console.error("ByBit Wallet API error", bybitJson);
135
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
136
+ }
137
+ return bybitJson;
138
+ }
139
+
140
+ // src/providers/bybit/get-closed-pnl.ts
141
+ async function getClosedPnl(credentials, payload, timeOffset) {
142
+ const { apiKey, apiSecret } = credentials;
143
+ const query = new URLSearchParams({
144
+ category: "linear",
145
+ //symbol: "BTCUSDT",
146
+ limit: "50"
147
+ //default limit
148
+ });
149
+ if (typeof payload.startTime === "number") {
150
+ query.set("startTime", String(payload.startTime));
151
+ }
152
+ if (typeof payload.endTime === "number") {
153
+ query.set("endTime", String(payload.endTime));
154
+ }
155
+ if (typeof payload.cursor === "string") {
156
+ query.set("cursor", String(payload.cursor));
157
+ }
158
+ const queryString = query.toString();
159
+ const { signature, timestamp } = signBybitRequest({
160
+ credentials,
161
+ queryString,
162
+ timeOffset
163
+ });
164
+ let bybitRes;
165
+ try {
166
+ bybitRes = await fetch(
167
+ `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,
168
+ {
169
+ headers: {
170
+ "X-BAPI-API-KEY": apiKey,
171
+ "X-BAPI-SIGN": signature,
172
+ "X-BAPI-SIGN-TYPE": "2",
173
+ "X-BAPI-TIMESTAMP": timestamp,
174
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
175
+ }
176
+ }
177
+ );
178
+ } catch (error) {
179
+ console.error("ByBit Closed PNL API network error", error);
180
+ throw new Error("ByBit Closed PNL API network error", { cause: error });
181
+ }
182
+ if (!bybitRes.ok) {
183
+ console.error("ByBit Closed PNL API request failed", bybitRes);
184
+ throw new Error("ByBit Closed PNL API request failed");
185
+ }
186
+ const bybitJson = await bybitRes.json();
187
+ if (bybitJson.retCode !== 0) {
188
+ console.error("ByBit Closed PNL API error", bybitJson);
189
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
190
+ }
191
+ return bybitJson;
192
+ }
193
+
194
+ // src/providers/bybit/apply-demo-money.ts
195
+ async function applyDemoMoney(credentials, payload, timeOffset) {
196
+ const { apiKey, apiSecret } = credentials;
197
+ const requestBody = JSON.stringify(payload);
198
+ const { signature, timestamp } = signBybitRequest({
199
+ credentials,
200
+ timeOffset
201
+ });
202
+ let bybitRes;
203
+ try {
204
+ bybitRes = await fetch(
205
+ `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,
206
+ {
207
+ method: "POST",
208
+ headers: {
209
+ "Content-Type": "application/json",
210
+ "X-BAPI-API-KEY": apiKey,
211
+ "X-BAPI-SIGN": signature,
212
+ "X-BAPI-SIGN-TYPE": "2",
213
+ "X-BAPI-TIMESTAMP": timestamp,
214
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
215
+ },
216
+ body: requestBody,
217
+ signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
218
+ cache: "no-store"
219
+ }
220
+ );
221
+ } catch (error) {
222
+ throw new Error("ByBit Apply Money API network error", { cause: error });
223
+ }
224
+ if (!bybitRes.ok) {
225
+ throw new Error("ByBit Apply Money API request failed");
226
+ }
227
+ const bybitJson = await bybitRes.json();
228
+ if (bybitJson.retCode !== 0) {
229
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
230
+ }
231
+ return bybitJson;
232
+ }
233
+
54
234
  // src/providers/bybit/get-server-time.ts
55
235
  async function getServerTime() {
56
236
  let bybitRes;
@@ -126,20 +306,25 @@ var BybitClient = class {
126
306
  this.timeOffset = await syncBybitServerTime();
127
307
  })();
128
308
  }
129
- async applyDemoMoney() {
309
+ async applyDemoMoney(credentials, payload) {
310
+ await this.ready;
311
+ return await applyDemoMoney(credentials, payload, this.timeOffset);
130
312
  }
131
- async getAccountInfo() {
313
+ async getAccountInfo(credentials) {
314
+ await this.ready;
315
+ return await getAccountInfo(credentials, this.timeOffset);
132
316
  }
133
317
  async getApiKeyInfo(credentials) {
134
318
  await this.ready;
135
- console.log(credentials, this.timeOffset);
136
319
  return await getApiKeyInfo(credentials, this.timeOffset);
137
320
  }
138
- async getClosedPnl() {
139
- }
140
- async getPositionInfo() {
321
+ async getClosedPnl(credentials, payload) {
322
+ await this.ready;
323
+ return await getClosedPnl(credentials, payload, this.timeOffset);
141
324
  }
142
- async getWalletBalance() {
325
+ async getWalletBalance(credentials) {
326
+ await this.ready;
327
+ return await getWalletBalance(credentials, this.timeOffset);
143
328
  }
144
329
  };
145
330
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/bybit/constants.ts","../../src/providers/bybit/get-api-key-info.ts","../../src/providers/bybit/get-server-time.ts","../../src/utils/bybitHelper.ts","../../src/clients/BybitClient.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { IBybitApiKeyInfo, IBybitApiResponse, IBybitCredentials } from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport { getApiKeyInfo } from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney() {\n // Implement the logic to apply demo money to the Bybit account\n }\n\n async getAccountInfo() {\n // Implement the logic to get account info from Bybit API\n }\n\n async getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n console.log(credentials, this.timeOffset);\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl() {\n // Implement the logic to get closed PnL from Bybit API\n }\n\n async getPositionInfo() {\n // Implement the logic to get position info from Bybit API\n }\n\n async getWalletBalance() {\n // Implement the logic to get wallet balance from Bybit API\n }\n}"]}
1
+ {"version":3,"sources":["../../src/providers/bybit/constants.ts","../../src/providers/bybit/get-api-key-info.ts","../../src/providers/bybit/get-account-info.ts","../../src/providers/bybit/get-wallet-balance.ts","../../src/providers/bybit/get-closed-pnl.ts","../../src/providers/bybit/apply-demo-money.ts","../../src/providers/bybit/get-server-time.ts","../../src/utils/bybitHelper.ts","../../src/clients/BybitClient.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl, IBybitClosedPnlRequest } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof payload.startTime === \"number\") {\n query.set(\"startTime\", String(payload.startTime));\n }\n\n if (typeof payload.endTime === \"number\") {\n query.set(\"endTime\", String(payload.endTime));\n }\n\n if (typeof payload.cursor === \"string\") {\n query.set(\"cursor\", String(payload.cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import type {\n IBybitApiKeyInfo,\n IBybitApiResponse,\n IBybitClosedPnlRequest,\n IBybitCredentials,\n IBybitDemoApplyMoneyRequest,\n} from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport {\n getApiKeyInfo,\n getClosedPnl,\n getAccountInfo,\n getWalletBalance,\n applyDemoMoney,\n} from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n ) {\n await this.ready;\n // Implement the logic to apply demo money to the Bybit account using the provided payload\n return await applyDemoMoney(credentials, payload, this.timeOffset);\n }\n\n async getAccountInfo(\n credentials: IBybitCredentials,\n ) {\n await this.ready;\n return await getAccountInfo(credentials, this.timeOffset);\n }\n\n async getApiKeyInfo(\n credentials: IBybitCredentials,\n ): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest\n ) {\n await this.ready;\n return await getClosedPnl(credentials, payload, this.timeOffset);\n }\n\n async getWalletBalance(credentials: IBybitCredentials) {\n await this.ready;\n return await getWalletBalance(credentials, this.timeOffset);\n }\n}\n"]}
@@ -1,16 +1,15 @@
1
- import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo } from '../types/bybit/index.cjs';
1
+ import { IBybitCredentials, IBybitDemoApplyMoneyRequest, IBybitApiResponse, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitAccountInfo, IBybitApiKeyInfo, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitWalletAccount } from '../types/bybit/index.cjs';
2
2
  import '../enums--bdw39rp.cjs';
3
3
 
4
4
  declare class BybitClient {
5
5
  private timeOffset;
6
6
  private readonly ready;
7
7
  constructor();
8
- applyDemoMoney(): Promise<void>;
9
- getAccountInfo(): Promise<void>;
8
+ applyDemoMoney(credentials: IBybitCredentials, payload: IBybitDemoApplyMoneyRequest): Promise<IBybitApiResponse<IBybitDemoApplyMoney>>;
9
+ getAccountInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitAccountInfo>>;
10
10
  getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
11
- getClosedPnl(): Promise<void>;
12
- getPositionInfo(): Promise<void>;
13
- getWalletBalance(): Promise<void>;
11
+ getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
12
+ getWalletBalance(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitWalletAccount>>;
14
13
  }
15
14
 
16
15
  export { BybitClient };
@@ -1,16 +1,15 @@
1
- import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo } from '../types/bybit/index.js';
1
+ import { IBybitCredentials, IBybitDemoApplyMoneyRequest, IBybitApiResponse, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitAccountInfo, IBybitApiKeyInfo, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitWalletAccount } from '../types/bybit/index.js';
2
2
  import '../enums--bdw39rp.js';
3
3
 
4
4
  declare class BybitClient {
5
5
  private timeOffset;
6
6
  private readonly ready;
7
7
  constructor();
8
- applyDemoMoney(): Promise<void>;
9
- getAccountInfo(): Promise<void>;
8
+ applyDemoMoney(credentials: IBybitCredentials, payload: IBybitDemoApplyMoneyRequest): Promise<IBybitApiResponse<IBybitDemoApplyMoney>>;
9
+ getAccountInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitAccountInfo>>;
10
10
  getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
11
- getClosedPnl(): Promise<void>;
12
- getPositionInfo(): Promise<void>;
13
- getWalletBalance(): Promise<void>;
11
+ getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
12
+ getWalletBalance(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitWalletAccount>>;
14
13
  }
15
14
 
16
15
  export { BybitClient };
@@ -1,4 +1,4 @@
1
- export { BybitClient } from '../chunk-5RNRRRGO.js';
2
- import '../chunk-Q6DF2HKM.js';
1
+ export { BybitClient } from '../chunk-6L3IHUQM.js';
2
+ import '../chunk-CO4XRV62.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.cjs CHANGED
@@ -138,7 +138,7 @@ async function getWalletBalance(credentials, timeOffset) {
138
138
  }
139
139
 
140
140
  // src/providers/bybit/get-closed-pnl.ts
141
- async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset) {
141
+ async function getClosedPnl(credentials, payload, timeOffset) {
142
142
  const { apiKey, apiSecret } = credentials;
143
143
  const query = new URLSearchParams({
144
144
  category: "linear",
@@ -146,14 +146,14 @@ async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset)
146
146
  limit: "50"
147
147
  //default limit
148
148
  });
149
- if (typeof startTime === "number") {
150
- query.set("startTime", String(startTime));
149
+ if (typeof payload.startTime === "number") {
150
+ query.set("startTime", String(payload.startTime));
151
151
  }
152
- if (typeof endTime === "number") {
153
- query.set("endTime", String(endTime));
152
+ if (typeof payload.endTime === "number") {
153
+ query.set("endTime", String(payload.endTime));
154
154
  }
155
- if (typeof cursor === "string") {
156
- query.set("cursor", String(cursor));
155
+ if (typeof payload.cursor === "string") {
156
+ query.set("cursor", String(payload.cursor));
157
157
  }
158
158
  const queryString = query.toString();
159
159
  const { signature, timestamp } = signBybitRequest({
@@ -360,20 +360,25 @@ var BybitClient = class {
360
360
  this.timeOffset = await syncBybitServerTime();
361
361
  })();
362
362
  }
363
- async applyDemoMoney() {
363
+ async applyDemoMoney(credentials, payload) {
364
+ await this.ready;
365
+ return await applyDemoMoney(credentials, payload, this.timeOffset);
364
366
  }
365
- async getAccountInfo() {
367
+ async getAccountInfo(credentials) {
368
+ await this.ready;
369
+ return await getAccountInfo(credentials, this.timeOffset);
366
370
  }
367
371
  async getApiKeyInfo(credentials) {
368
372
  await this.ready;
369
- console.log(credentials, this.timeOffset);
370
373
  return await getApiKeyInfo(credentials, this.timeOffset);
371
374
  }
372
- async getClosedPnl() {
373
- }
374
- async getPositionInfo() {
375
+ async getClosedPnl(credentials, payload) {
376
+ await this.ready;
377
+ return await getClosedPnl(credentials, payload, this.timeOffset);
375
378
  }
376
- async getWalletBalance() {
379
+ async getWalletBalance(credentials) {
380
+ await this.ready;
381
+ return await getWalletBalance(credentials, this.timeOffset);
377
382
  }
378
383
  };
379
384
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/bybit/constants.ts","../src/providers/bybit/get-api-key-info.ts","../src/providers/bybit/get-account-info.ts","../src/providers/bybit/get-wallet-balance.ts","../src/providers/bybit/get-closed-pnl.ts","../src/providers/bybit/get-position-info.ts","../src/providers/bybit/apply-demo-money.ts","../src/providers/bybit/get-server-time.ts","../src/utils/bybitHelper.ts","../src/clients/BybitClient.ts","../src/utils/helper.ts","../src/utils/challengeHelper.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n startTime?: number,\n endTime?: number,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof startTime === \"number\") {\n query.set(\"startTime\", String(startTime));\n }\n\n if (typeof endTime === \"number\") {\n query.set(\"endTime\", String(endTime));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { IBybitApiKeyInfo, IBybitApiResponse, IBybitCredentials } from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport { getApiKeyInfo } from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney() {\n // Implement the logic to apply demo money to the Bybit account\n }\n\n async getAccountInfo() {\n // Implement the logic to get account info from Bybit API\n }\n\n async getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n console.log(credentials, this.timeOffset);\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl() {\n // Implement the logic to get closed PnL from Bybit API\n }\n\n async getPositionInfo() {\n // Implement the logic to get position info from Bybit API\n }\n\n async getWalletBalance() {\n // Implement the logic to get wallet balance from Bybit API\n }\n}","export const parseNumber = (\n value: number | string | null | undefined,\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nexport const toIsoDate = (\n value: string | number | null | undefined,\n): string | null => {\n const parsed = parseNumber(value);\n if (parsed === null || parsed <= 0) {\n return null;\n }\n\n const date = new Date(parsed);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nexport const isSameUtcDay = (\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean => {\n if (!left || !right) {\n return false;\n }\n\n const normalizedLeft = left.trim();\n const normalizedRight = right.trim();\n\n if (!normalizedLeft || !normalizedRight) {\n return false;\n }\n\n const leftDate = new Date(normalizedLeft);\n const rightDate = new Date(normalizedRight);\n\n if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {\n return false;\n }\n\n return (\n leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10)\n );\n};\n","import {\n TChallengeClosedPnl,\n TChallengeProgress,\n TChallengeWalletBalance,\n} from \"../types/challenge\";\nimport { IBybitAccountType, IBybitCoinType } from \"../types/bybit/enums\";\nimport { isSameUtcDay } from \"./helper\";\n\nexport const createDefaultWallet = (\n challengeId: string = \"\",\n capital: number = 0,\n): TChallengeWalletBalance =>\n ({\n challengeId,\n accountType: IBybitAccountType.UNIFIED,\n totalEquity: 0,\n totalPerpUpl: 0,\n totalWalletBalance: 0,\n totalAvailableBalance: 0,\n capital,\n\n equity: 0,\n usdValue: 0,\n unrealisedPnl: 0,\n walletBalance: 0,\n availableToWithdraw: 0,\n coin: IBybitCoinType.USDT,\n updatedAt: new Date().toISOString(),\n }) as TChallengeWalletBalance;\n\nexport const createDefaultProgress = (\n challengeId: string = \"\",\n currentEquity: number = 0,\n): TChallengeProgress =>\n ({\n id: new Date().getTime().toString(),\n challengeId,\n currentEquity,\n totalLoss: 0,\n tradingDays: 0,\n dailyDrawdown: 0,\n profitTarget: 0,\n dailyStartingEquity: 0,\n dailyStartingUpdatedAt: new Date().toISOString(),\n dailyMaxEquity: 0,\n dailyMinEquity: 0,\n dailyMaxUpdatedAt: new Date().toISOString(),\n dailyMinUpdatedAt: new Date().toISOString(),\n }) as TChallengeProgress;\n\n // A trading day counts if you open and close at least one trade \n// that day with a position size ≥ 5% of the initial balance and a PnL of ±1% or more.\nexport const tradingDaysCountCalculation = async (\n closedPnlData: TChallengeClosedPnl[] | null,\n minPositionSize: number,\n): Promise<number> => {\n if (!closedPnlData || closedPnlData.length === 0) {\n return 0;\n }\n\n const closedPnlGrouped = closedPnlData.reduce(\n (acc, trade) => {\n const day = trade.updatedTime.split(\"T\")[0];\n if (!acc[day]) {\n acc[day] = [];\n }\n acc[day].push(trade);\n return acc;\n },\n {} as Record<string, TChallengeClosedPnl[]>,\n );\n\n return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {\n // Check if any trade closed today met the minimum size requirement\n const hasQualifyingTrade = dayTrades.some((trade) => {\n const entryValue = trade.cumEntryValue;\n const closedPnL = trade.closedPnl;\n\n // 1. Position size must be >= 5% of initial balance\n const passesSize = entryValue >= minPositionSize;\n\n // 2. PnL must be >= 1% of the position size itself\n const minRequiredPnL = entryValue * 0.01;\n const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;\n\n return passesSize && passesPnL;\n });\n\n return hasQualifyingTrade ? count + 1 : count;\n }, 0);\n};\n\nexport const currentDailyEquity = (\n wallet: TChallengeWalletBalance,\n progress: TChallengeProgress\n) => {\n const today = new Date().toISOString();\n const startDate = new Date().setUTCHours(0, 0, 0, 0);\n const startDateStr = new Date(startDate).toISOString();\n\n const { equity, unrealisedPnl } = wallet;\n const { dailyStartingEquity, dailyMaxEquity, dailyMinEquity, \n dailyStartingUpdatedAt, dailyMaxUpdatedAt, dailyMinUpdatedAt } = progress;\n \n // Determine if the daily starting equity should be updated based on whether it's a new day\n let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr)\n const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;\n const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;\n\n // Determine if the max and min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);\n let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;\n const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity , equity);\n \n // Determine if the min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);\n const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;\n const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);\n\n //Trailing Drawdown: The difference between the day’s highest equity and the lowest equity reached afterward, both including unrealized P&L.\n const dailyEquityDrawdown = equity - newdailyMaxEquity;\n \n return {\n currentEquity: equity,\n dailyDrawdown: dailyEquityDrawdown,\n\n dailyStartingEquity: newDailyStartingEquity,\n dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),\n\n dailyMaxEquity: newdailyMaxEquity,\n dailyMaxUpdatedAt: newMaxUpdatedAt,\n\n dailyMinEquity: newdailyMinEquity,\n dailyMinUpdatedAt: newMinUpdatedAt,\n };\n};"]}
1
+ {"version":3,"sources":["../src/providers/bybit/constants.ts","../src/providers/bybit/get-api-key-info.ts","../src/providers/bybit/get-account-info.ts","../src/providers/bybit/get-wallet-balance.ts","../src/providers/bybit/get-closed-pnl.ts","../src/providers/bybit/get-position-info.ts","../src/providers/bybit/apply-demo-money.ts","../src/providers/bybit/get-server-time.ts","../src/utils/bybitHelper.ts","../src/clients/BybitClient.ts","../src/utils/helper.ts","../src/utils/challengeHelper.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl, IBybitClosedPnlRequest } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof payload.startTime === \"number\") {\n query.set(\"startTime\", String(payload.startTime));\n }\n\n if (typeof payload.endTime === \"number\") {\n query.set(\"endTime\", String(payload.endTime));\n }\n\n if (typeof payload.cursor === \"string\") {\n query.set(\"cursor\", String(payload.cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import type {\n IBybitApiKeyInfo,\n IBybitApiResponse,\n IBybitClosedPnlRequest,\n IBybitCredentials,\n IBybitDemoApplyMoneyRequest,\n} from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport {\n getApiKeyInfo,\n getClosedPnl,\n getAccountInfo,\n getWalletBalance,\n applyDemoMoney,\n} from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n ) {\n await this.ready;\n // Implement the logic to apply demo money to the Bybit account using the provided payload\n return await applyDemoMoney(credentials, payload, this.timeOffset);\n }\n\n async getAccountInfo(\n credentials: IBybitCredentials,\n ) {\n await this.ready;\n return await getAccountInfo(credentials, this.timeOffset);\n }\n\n async getApiKeyInfo(\n credentials: IBybitCredentials,\n ): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest\n ) {\n await this.ready;\n return await getClosedPnl(credentials, payload, this.timeOffset);\n }\n\n async getWalletBalance(credentials: IBybitCredentials) {\n await this.ready;\n return await getWalletBalance(credentials, this.timeOffset);\n }\n}\n","export const parseNumber = (\n value: number | string | null | undefined,\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nexport const toIsoDate = (\n value: string | number | null | undefined,\n): string | null => {\n const parsed = parseNumber(value);\n if (parsed === null || parsed <= 0) {\n return null;\n }\n\n const date = new Date(parsed);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nexport const isSameUtcDay = (\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean => {\n if (!left || !right) {\n return false;\n }\n\n const normalizedLeft = left.trim();\n const normalizedRight = right.trim();\n\n if (!normalizedLeft || !normalizedRight) {\n return false;\n }\n\n const leftDate = new Date(normalizedLeft);\n const rightDate = new Date(normalizedRight);\n\n if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {\n return false;\n }\n\n return (\n leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10)\n );\n};\n","import {\n TChallengeClosedPnl,\n TChallengeProgress,\n TChallengeWalletBalance,\n} from \"../types/challenge\";\nimport { IBybitAccountType, IBybitCoinType } from \"../types/bybit/enums\";\nimport { isSameUtcDay } from \"./helper\";\n\nexport const createDefaultWallet = (\n challengeId: string = \"\",\n capital: number = 0,\n): TChallengeWalletBalance =>\n ({\n challengeId,\n accountType: IBybitAccountType.UNIFIED,\n totalEquity: 0,\n totalPerpUpl: 0,\n totalWalletBalance: 0,\n totalAvailableBalance: 0,\n capital,\n\n equity: 0,\n usdValue: 0,\n unrealisedPnl: 0,\n walletBalance: 0,\n availableToWithdraw: 0,\n coin: IBybitCoinType.USDT,\n updatedAt: new Date().toISOString(),\n }) as TChallengeWalletBalance;\n\nexport const createDefaultProgress = (\n challengeId: string = \"\",\n currentEquity: number = 0,\n): TChallengeProgress =>\n ({\n id: new Date().getTime().toString(),\n challengeId,\n currentEquity,\n totalLoss: 0,\n tradingDays: 0,\n dailyDrawdown: 0,\n profitTarget: 0,\n dailyStartingEquity: 0,\n dailyStartingUpdatedAt: new Date().toISOString(),\n dailyMaxEquity: 0,\n dailyMinEquity: 0,\n dailyMaxUpdatedAt: new Date().toISOString(),\n dailyMinUpdatedAt: new Date().toISOString(),\n }) as TChallengeProgress;\n\n // A trading day counts if you open and close at least one trade \n// that day with a position size ≥ 5% of the initial balance and a PnL of ±1% or more.\nexport const tradingDaysCountCalculation = async (\n closedPnlData: TChallengeClosedPnl[] | null,\n minPositionSize: number,\n): Promise<number> => {\n if (!closedPnlData || closedPnlData.length === 0) {\n return 0;\n }\n\n const closedPnlGrouped = closedPnlData.reduce(\n (acc, trade) => {\n const day = trade.updatedTime.split(\"T\")[0];\n if (!acc[day]) {\n acc[day] = [];\n }\n acc[day].push(trade);\n return acc;\n },\n {} as Record<string, TChallengeClosedPnl[]>,\n );\n\n return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {\n // Check if any trade closed today met the minimum size requirement\n const hasQualifyingTrade = dayTrades.some((trade) => {\n const entryValue = trade.cumEntryValue;\n const closedPnL = trade.closedPnl;\n\n // 1. Position size must be >= 5% of initial balance\n const passesSize = entryValue >= minPositionSize;\n\n // 2. PnL must be >= 1% of the position size itself\n const minRequiredPnL = entryValue * 0.01;\n const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;\n\n return passesSize && passesPnL;\n });\n\n return hasQualifyingTrade ? count + 1 : count;\n }, 0);\n};\n\nexport const currentDailyEquity = (\n wallet: TChallengeWalletBalance,\n progress: TChallengeProgress\n) => {\n const today = new Date().toISOString();\n const startDate = new Date().setUTCHours(0, 0, 0, 0);\n const startDateStr = new Date(startDate).toISOString();\n\n const { equity, unrealisedPnl } = wallet;\n const { dailyStartingEquity, dailyMaxEquity, dailyMinEquity, \n dailyStartingUpdatedAt, dailyMaxUpdatedAt, dailyMinUpdatedAt } = progress;\n \n // Determine if the daily starting equity should be updated based on whether it's a new day\n let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr)\n const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;\n const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;\n\n // Determine if the max and min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);\n let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;\n const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity , equity);\n \n // Determine if the min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);\n const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;\n const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);\n\n //Trailing Drawdown: The difference between the day’s highest equity and the lowest equity reached afterward, both including unrealized P&L.\n const dailyEquityDrawdown = equity - newdailyMaxEquity;\n \n return {\n currentEquity: equity,\n dailyDrawdown: dailyEquityDrawdown,\n\n dailyStartingEquity: newDailyStartingEquity,\n dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),\n\n dailyMaxEquity: newdailyMaxEquity,\n dailyMaxUpdatedAt: newMaxUpdatedAt,\n\n dailyMinEquity: newdailyMinEquity,\n dailyMinUpdatedAt: newMinUpdatedAt,\n };\n};"]}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { createDefaultProgress, createDefaultWallet, currentDailyEquity, isSameUtcDay, parseNumber, toIsoDate, tradingDaysCountCalculation } from './chunk-6R5UUXX4.js';
2
2
  import './chunk-2KHIGJJV.js';
3
- export { BybitClient } from './chunk-5RNRRRGO.js';
4
- export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getBybitTimestamp, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance, signBybitRequest, syncBybitServerTime } from './chunk-Q6DF2HKM.js';
3
+ export { BybitClient } from './chunk-6L3IHUQM.js';
4
+ export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getBybitTimestamp, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance, signBybitRequest, syncBybitServerTime } from './chunk-CO4XRV62.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
@@ -149,7 +149,7 @@ async function getWalletBalance(credentials, timeOffset) {
149
149
  }
150
150
 
151
151
  // src/providers/bybit/get-closed-pnl.ts
152
- async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset) {
152
+ async function getClosedPnl(credentials, payload, timeOffset) {
153
153
  const { apiKey, apiSecret } = credentials;
154
154
  const query = new URLSearchParams({
155
155
  category: "linear",
@@ -157,14 +157,14 @@ async function getClosedPnl(credentials, startTime, endTime, cursor, timeOffset)
157
157
  limit: "50"
158
158
  //default limit
159
159
  });
160
- if (typeof startTime === "number") {
161
- query.set("startTime", String(startTime));
160
+ if (typeof payload.startTime === "number") {
161
+ query.set("startTime", String(payload.startTime));
162
162
  }
163
- if (typeof endTime === "number") {
164
- query.set("endTime", String(endTime));
163
+ if (typeof payload.endTime === "number") {
164
+ query.set("endTime", String(payload.endTime));
165
165
  }
166
- if (typeof cursor === "string") {
167
- query.set("cursor", String(cursor));
166
+ if (typeof payload.cursor === "string") {
167
+ query.set("cursor", String(payload.cursor));
168
168
  }
169
169
  const queryString = query.toString();
170
170
  const { signature, timestamp } = signBybitRequest({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/bybit/constants.ts","../../../src/utils/bybitHelper.ts","../../../src/providers/bybit/get-api-key-info.ts","../../../src/providers/bybit/get-account-info.ts","../../../src/providers/bybit/get-wallet-balance.ts","../../../src/providers/bybit/get-closed-pnl.ts","../../../src/providers/bybit/get-position-info.ts","../../../src/providers/bybit/apply-demo-money.ts","../../../src/providers/bybit/get-server-time.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n startTime?: number,\n endTime?: number,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof startTime === \"number\") {\n query.set(\"startTime\", String(startTime));\n }\n\n if (typeof endTime === \"number\") {\n query.set(\"endTime\", String(endTime));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}"]}
1
+ {"version":3,"sources":["../../../src/providers/bybit/constants.ts","../../../src/utils/bybitHelper.ts","../../../src/providers/bybit/get-api-key-info.ts","../../../src/providers/bybit/get-account-info.ts","../../../src/providers/bybit/get-wallet-balance.ts","../../../src/providers/bybit/get-closed-pnl.ts","../../../src/providers/bybit/get-position-info.ts","../../../src/providers/bybit/apply-demo-money.ts","../../../src/providers/bybit/get-server-time.ts"],"names":["env","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl, IBybitClosedPnlRequest } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n payload: IBybitClosedPnlRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof payload.startTime === \"number\") {\n query.set(\"startTime\", String(payload.startTime));\n }\n\n if (typeof payload.endTime === \"number\") {\n query.set(\"endTime\", String(payload.endTime));\n }\n\n if (typeof payload.cursor === \"string\") {\n query.set(\"cursor\", String(payload.cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}"]}
@@ -1,4 +1,4 @@
1
- import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo, IBybitAccountInfo, IBybitWalletAccount, IBybitApiResponseList, IBybitClosedPnl, IBybitPositionInfo, IBybitDemoApplyMoneyRequest, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitServerTime } from '../../types/bybit/index.cjs';
1
+ import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo, IBybitAccountInfo, IBybitWalletAccount, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitPositionInfo, IBybitDemoApplyMoneyRequest, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitServerTime } from '../../types/bybit/index.cjs';
2
2
  import '../../enums--bdw39rp.cjs';
3
3
 
4
4
  declare function getApiKeyInfo(credentials: IBybitCredentials, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
@@ -7,7 +7,7 @@ declare function getAccountInfo(credentials: IBybitCredentials, timeOffset?: num
7
7
 
8
8
  declare function getWalletBalance(credentials: IBybitCredentials, timeOffset?: number): Promise<IBybitApiResponse<IBybitWalletAccount>>;
9
9
 
10
- declare function getClosedPnl(credentials: IBybitCredentials, startTime?: number, endTime?: number, cursor?: string, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
10
+ declare function getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
11
11
 
12
12
  declare function getPositionInfo(credentials: IBybitCredentials, category?: string, symbol?: string, settleCoin?: string, cursor?: string, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>>;
13
13
 
@@ -1,4 +1,4 @@
1
- import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo, IBybitAccountInfo, IBybitWalletAccount, IBybitApiResponseList, IBybitClosedPnl, IBybitPositionInfo, IBybitDemoApplyMoneyRequest, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitServerTime } from '../../types/bybit/index.js';
1
+ import { IBybitCredentials, IBybitApiResponse, IBybitApiKeyInfo, IBybitAccountInfo, IBybitWalletAccount, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitPositionInfo, IBybitDemoApplyMoneyRequest, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitServerTime } from '../../types/bybit/index.js';
2
2
  import '../../enums--bdw39rp.js';
3
3
 
4
4
  declare function getApiKeyInfo(credentials: IBybitCredentials, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
@@ -7,7 +7,7 @@ declare function getAccountInfo(credentials: IBybitCredentials, timeOffset?: num
7
7
 
8
8
  declare function getWalletBalance(credentials: IBybitCredentials, timeOffset?: number): Promise<IBybitApiResponse<IBybitWalletAccount>>;
9
9
 
10
- declare function getClosedPnl(credentials: IBybitCredentials, startTime?: number, endTime?: number, cursor?: string, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
10
+ declare function getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
11
11
 
12
12
  declare function getPositionInfo(credentials: IBybitCredentials, category?: string, symbol?: string, settleCoin?: string, cursor?: string, timeOffset?: number): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>>;
13
13
 
@@ -1,3 +1,3 @@
1
- export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance } from '../../chunk-Q6DF2HKM.js';
1
+ export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance } from '../../chunk-CO4XRV62.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  export { createDefaultProgress, createDefaultWallet, currentDailyEquity, isSameUtcDay, parseNumber, toIsoDate, tradingDaysCountCalculation } from '../chunk-6R5UUXX4.js';
2
2
  import '../chunk-2KHIGJJV.js';
3
- export { getBybitTimestamp, signBybitRequest, syncBybitServerTime } from '../chunk-Q6DF2HKM.js';
3
+ export { getBybitTimestamp, signBybitRequest, syncBybitServerTime } from '../chunk-CO4XRV62.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anrmk/str-package",
3
- "version": "0.1.27",
3
+ "version": "0.1.28",
4
4
  "description": "Shared providers, types, and utils for STR services",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,31 +0,0 @@
1
- import { syncBybitServerTime, getApiKeyInfo } from './chunk-Q6DF2HKM.js';
2
-
3
- // src/clients/BybitClient.ts
4
- var BybitClient = class {
5
- timeOffset = 0;
6
- ready;
7
- constructor() {
8
- this.ready = (async () => {
9
- this.timeOffset = await syncBybitServerTime();
10
- })();
11
- }
12
- async applyDemoMoney() {
13
- }
14
- async getAccountInfo() {
15
- }
16
- async getApiKeyInfo(credentials) {
17
- await this.ready;
18
- console.log(credentials, this.timeOffset);
19
- return await getApiKeyInfo(credentials, this.timeOffset);
20
- }
21
- async getClosedPnl() {
22
- }
23
- async getPositionInfo() {
24
- }
25
- async getWalletBalance() {
26
- }
27
- };
28
-
29
- export { BybitClient };
30
- //# sourceMappingURL=chunk-5RNRRRGO.js.map
31
- //# sourceMappingURL=chunk-5RNRRRGO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/clients/BybitClient.ts"],"names":[],"mappings":";;;AAKO,IAAM,cAAN,MAAkB;AAAA,EACb,UAAA,GAAa,CAAA;AAAA,EACJ,KAAA;AAAA,EAEjB,WAAA,GAAc;AACV,IAAA,IAAA,CAAK,SAAS,YAAY;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAM,mBAAA,EAAoB;AAAA,IAChD,CAAA,GAAG;AAAA,EACP;AAAA,EAEA,MAAM,cAAA,GAAiB;AAAA,EAEvB;AAAA,EAEA,MAAM,cAAA,GAAiB;AAAA,EAEvB;AAAA,EAEA,MAAM,cAAc,WAAA,EAA8E;AAC9F,IAAA,MAAM,IAAA,CAAK,KAAA;AACX,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA;AACxC,IAAA,OAAO,MAAM,aAAA,CAAc,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,YAAA,GAAe;AAAA,EAErB;AAAA,EAEA,MAAM,eAAA,GAAkB;AAAA,EAExB;AAAA,EAEA,MAAM,gBAAA,GAAmB;AAAA,EAEzB;AACJ","file":"chunk-5RNRRRGO.js","sourcesContent":["import { IBybitApiKeyInfo, IBybitApiResponse, IBybitCredentials } from \"../types/bybit\";\nimport { syncBybitServerTime } from \"../utils/bybitHelper\";\n\nimport { getApiKeyInfo } from \"../providers/bybit\";\n\nexport class BybitClient {\n private timeOffset = 0;\n private readonly ready: Promise<void>;\n\n constructor() {\n this.ready = (async () => {\n this.timeOffset = await syncBybitServerTime();\n })();\n }\n\n async applyDemoMoney() {\n // Implement the logic to apply demo money to the Bybit account\n }\n\n async getAccountInfo() {\n // Implement the logic to get account info from Bybit API\n }\n\n async getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n await this.ready;\n console.log(credentials, this.timeOffset);\n return await getApiKeyInfo(credentials, this.timeOffset);\n }\n\n async getClosedPnl() {\n // Implement the logic to get closed PnL from Bybit API\n }\n\n async getPositionInfo() {\n // Implement the logic to get position info from Bybit API\n }\n\n async getWalletBalance() {\n // Implement the logic to get wallet balance from Bybit API\n }\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/bybit/constants.ts","../src/utils/bybitHelper.ts","../src/providers/bybit/get-api-key-info.ts","../src/providers/bybit/get-account-info.ts","../src/providers/bybit/get-wallet-balance.ts","../src/providers/bybit/get-closed-pnl.ts","../src/providers/bybit/get-position-info.ts","../src/providers/bybit/apply-demo-money.ts","../src/providers/bybit/get-server-time.ts"],"names":[],"mappings":"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","file":"chunk-Q6DF2HKM.js","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\n\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n console.log(\"Bybit server time timestamp:\", timestamp);\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const requestStart = Date.now();\n const { result } = await getServerTime();\n const requestEnd = Date.now();\n const serverTime = Number(result.timeSecond) * 1000;\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\n\n const bybitTimeOffset = serverTime - localMidpoint;\n\n console.log({\n serverTime,\n requestStart,\n requestEnd,\n latency: requestEnd - requestStart,\n bybitTimeOffset,\n });\n\n return bybitTimeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n // Small safety margin: keep request slightly behind server.\n return String(Date.now() + timeOffset - 250);\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\nexport async function getApiKeyInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit API Key Info network error\", error);\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit API Key Info request failed\", bybitRes);\n throw new Error(\"ByBit API Key Info request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit API Key Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!bybitJson) {\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\n throw new Error(\"Invalid ByBit API Key Info response\");\n }\n\n return bybitJson;\n}\n","import {\n IBybitCredentials,\n IBybitAccountInfo,\n IBybitApiResponse,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { BYBIT_CONSTANTS } from \"./constants\";\n\nexport async function getAccountInfo(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n \n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n });\n } catch (error) {\n console.error(\"ByBit Account API network error\", error);\n throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Account API request failed\", bybitRes);\n throw new Error(\"ByBit Account API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Account API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\n console.error(\"No account info returned\", bybitJson);\n throw new Error(\"No account info returned\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getWalletBalance(\n credentials: IBybitCredentials,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\n const { apiKey, apiSecret } = credentials;\n\n const query = new URLSearchParams({\n accountType: \"UNIFIED\",\n coin: \"USDT\",\n });\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Wallet API network error\", error);\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Wallet API request failed\", bybitRes);\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Wallet API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl } from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\nexport async function getClosedPnl(\n credentials: IBybitCredentials,\n startTime?: number,\n endTime?: number,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\n const { apiKey, apiSecret } = credentials;\n const query = new URLSearchParams({\n category: \"linear\",\n //symbol: \"BTCUSDT\",\n limit: \"50\", //default limit\n });\n\n if (typeof startTime === \"number\") {\n query.set(\"startTime\", String(startTime));\n }\n\n if (typeof endTime === \"number\") {\n query.set(\"endTime\", String(endTime));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n },\n );\n } catch (error) {\n console.error(\"ByBit Closed PNL API network error\", error);\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Closed PNL API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitApiResponseList,\n IBybitPositionInfo,\n} from \"../../types/bybit\";\n\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\n\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\nexport async function getPositionInfo(\n credentials: IBybitCredentials,\n category?: string,\n symbol?: string,\n settleCoin?: string,\n cursor?: string,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const query = new URLSearchParams({\n category: category ?? \"linear\",\n limit: \"50\", //default limit\n });\n\n if (typeof symbol === \"string\") {\n query.set(\"symbol\", String(symbol));\n }\n\n if (typeof settleCoin === \"string\") {\n query.set(\"settleCoin\", String(settleCoin));\n }\n\n if (typeof cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString,\n timeOffset,\n });\n\n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\n {\n headers: {\n \"X-BAPI-API-KEY\": credentials.apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n console.error(\"ByBit Position Info API network error\", { cause: error });\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Position Info API request failed\", bybitRes);\n throw new Error(\"ByBit Position Info API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\n \n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Position Info API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\n\nimport {\n IBybitCredentials,\n IBybitApiResponse,\n IBybitAccountInfo,\n IBybitDemoApplyMoneyRequest,\n} from \"../../types/bybit\";\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\n\n// POST /api/bybit/apply-money\nexport async function applyDemoMoney(\n credentials: IBybitCredentials,\n payload: IBybitDemoApplyMoneyRequest,\n timeOffset?: number,\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n timeOffset \n });\n\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\n \n let bybitRes: Response;\n try {\n bybitRes = await fetch(\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-BAPI-API-KEY\": apiKey,\n \"X-BAPI-SIGN\": signature,\n \"X-BAPI-SIGN-TYPE\": \"2\",\n \"X-BAPI-TIMESTAMP\": timestamp,\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\n },\n body: requestBody,\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\n cache: \"no-store\",\n },\n );\n } catch (error) {\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Apply Money API request failed\");\n }\n\n const bybitJson =\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\n\n if (bybitJson.retCode !== 0) {\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n return bybitJson;\n}\n","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}"]}