@anrmk/str-package 0.1.0

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.
Files changed (62) hide show
  1. package/README.md +29 -0
  2. package/dist/TChallengeProgress-DkZ0Q0Zu.d.cts +79 -0
  3. package/dist/TChallengeProgress-e8E5Z7Tn.d.ts +79 -0
  4. package/dist/chunk-CDWBE6PZ.js +264 -0
  5. package/dist/chunk-CDWBE6PZ.js.map +1 -0
  6. package/dist/chunk-GIWOOWDE.js +39 -0
  7. package/dist/chunk-GIWOOWDE.js.map +1 -0
  8. package/dist/chunk-PGGSZUQW.js +98 -0
  9. package/dist/chunk-PGGSZUQW.js.map +1 -0
  10. package/dist/chunk-VPBFPI5B.js +15 -0
  11. package/dist/chunk-VPBFPI5B.js.map +1 -0
  12. package/dist/enums-CvsmYKeP.d.cts +19 -0
  13. package/dist/enums-CvsmYKeP.d.ts +19 -0
  14. package/dist/index.cjs +416 -0
  15. package/dist/index.cjs.map +1 -0
  16. package/dist/index.d.cts +9 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.js +6 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/providers/bybit/index.cjs +279 -0
  21. package/dist/providers/bybit/index.cjs.map +1 -0
  22. package/dist/providers/bybit/index.d.cts +16 -0
  23. package/dist/providers/bybit/index.d.ts +16 -0
  24. package/dist/providers/bybit/index.js +4 -0
  25. package/dist/providers/bybit/index.js.map +1 -0
  26. package/dist/types/bybit/index.cjs +4 -0
  27. package/dist/types/bybit/index.cjs.map +1 -0
  28. package/dist/types/bybit/index.d.cts +211 -0
  29. package/dist/types/bybit/index.d.ts +211 -0
  30. package/dist/types/bybit/index.js +3 -0
  31. package/dist/types/bybit/index.js.map +1 -0
  32. package/dist/types/challenge/index.cjs +4 -0
  33. package/dist/types/challenge/index.cjs.map +1 -0
  34. package/dist/types/challenge/index.d.cts +114 -0
  35. package/dist/types/challenge/index.d.ts +114 -0
  36. package/dist/types/challenge/index.js +3 -0
  37. package/dist/types/challenge/index.js.map +1 -0
  38. package/dist/types/index.cjs +4 -0
  39. package/dist/types/index.cjs.map +1 -0
  40. package/dist/types/index.d.cts +8 -0
  41. package/dist/types/index.d.ts +8 -0
  42. package/dist/types/index.js +3 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/dist/utils/bybitHelper.cjs +17 -0
  45. package/dist/utils/bybitHelper.cjs.map +1 -0
  46. package/dist/utils/bybitHelper.d.cts +6 -0
  47. package/dist/utils/bybitHelper.d.ts +6 -0
  48. package/dist/utils/bybitHelper.js +3 -0
  49. package/dist/utils/bybitHelper.js.map +1 -0
  50. package/dist/utils/challengeHelper.cjs +119 -0
  51. package/dist/utils/challengeHelper.cjs.map +1 -0
  52. package/dist/utils/challengeHelper.d.cts +18 -0
  53. package/dist/utils/challengeHelper.d.ts +18 -0
  54. package/dist/utils/challengeHelper.js +4 -0
  55. package/dist/utils/challengeHelper.js.map +1 -0
  56. package/dist/utils/helper.cjs +43 -0
  57. package/dist/utils/helper.cjs.map +1 -0
  58. package/dist/utils/helper.d.cts +5 -0
  59. package/dist/utils/helper.d.ts +5 -0
  60. package/dist/utils/helper.js +3 -0
  61. package/dist/utils/helper.js.map +1 -0
  62. package/package.json +76 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @anrmk/str-package
2
+
3
+ Shared providers, types, and utility helpers used by STR projects.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @anrmk/str-package
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { getApiKeyInfo } from "@anrmk/str-package/providers/bybit";
15
+ import type { TChallengeItem } from "@anrmk/str-package/types/challenge";
16
+ ```
17
+
18
+ ## Development
19
+
20
+ ```bash
21
+ npm install
22
+ npm run build
23
+ ```
24
+
25
+ ## Publish
26
+
27
+ ```bash
28
+ npm publish --access public
29
+ ```
@@ -0,0 +1,79 @@
1
+ import { I as IBybitAccountType } from './enums-CvsmYKeP.cjs';
2
+
3
+ type TChallengeClosedPnl = {
4
+ challengeId: string;
5
+ symbol: string;
6
+ orderId: string;
7
+ side: string;
8
+ qty: number;
9
+ orderPrice: string;
10
+ orderType: string;
11
+ execType: string;
12
+ closedSize: number;
13
+ cumEntryValue: number;
14
+ avgEntryPrice: number;
15
+ cumExitValue: number;
16
+ avgExitPrice: number;
17
+ closedPnl: number;
18
+ fillCount: number;
19
+ leverage: number;
20
+ createdTime: string;
21
+ updatedTime: string;
22
+ updatedAt: string;
23
+ };
24
+ type TChallengeClosedPnlStatistics = {
25
+ totalClosedTradesCount: number;
26
+ totalClosedTrades: number;
27
+ totalLongTrades: number;
28
+ totalLongTradesCount: number;
29
+ totalLongWins: number;
30
+ totalShortTrades: number;
31
+ totalShortTradesCount: number;
32
+ totalShortWins: number;
33
+ totalWins: number;
34
+ totalLosses: number;
35
+ winRate: number;
36
+ loosesRate: number;
37
+ totalCumEntryValue: number;
38
+ totalCumExitValue: number;
39
+ };
40
+
41
+ type TChallengeWalletBalance = {
42
+ challengeId: string;
43
+ accountType: IBybitAccountType;
44
+ totalEquity: number;
45
+ totalPerpUpl: number;
46
+ totalWalletBalance: number;
47
+ totalAvailableBalance: number;
48
+ capital: number;
49
+ /** Coin-specific balance details */
50
+ equity: number;
51
+ totalPositionMm?: number;
52
+ totalPositionIm?: number;
53
+ usdValue: number;
54
+ unrealisedPnl: number;
55
+ walletBalance: number;
56
+ availableToWithdraw: number;
57
+ cumRealisedPnl?: number;
58
+ bonus?: number;
59
+ coin: string;
60
+ updatedAt: string;
61
+ };
62
+
63
+ type TChallengeProgress = {
64
+ id: string | null;
65
+ challengeId: string;
66
+ currentEquity: number;
67
+ currentTotalLoss: number;
68
+ currentTradingDays: number;
69
+ currentDailyDrawdown: number;
70
+ currentProfitTarget: number;
71
+ dailyStartingEquity: number;
72
+ dailyStartingUpdatedAt: string;
73
+ maxDailyEquity: number;
74
+ minDailyEquity: number;
75
+ maxUpdatedAt: string;
76
+ minUpdatedAt: string;
77
+ };
78
+
79
+ export type { TChallengeClosedPnl as T, TChallengeClosedPnlStatistics as a, TChallengeProgress as b, TChallengeWalletBalance as c };
@@ -0,0 +1,79 @@
1
+ import { I as IBybitAccountType } from './enums-CvsmYKeP.js';
2
+
3
+ type TChallengeClosedPnl = {
4
+ challengeId: string;
5
+ symbol: string;
6
+ orderId: string;
7
+ side: string;
8
+ qty: number;
9
+ orderPrice: string;
10
+ orderType: string;
11
+ execType: string;
12
+ closedSize: number;
13
+ cumEntryValue: number;
14
+ avgEntryPrice: number;
15
+ cumExitValue: number;
16
+ avgExitPrice: number;
17
+ closedPnl: number;
18
+ fillCount: number;
19
+ leverage: number;
20
+ createdTime: string;
21
+ updatedTime: string;
22
+ updatedAt: string;
23
+ };
24
+ type TChallengeClosedPnlStatistics = {
25
+ totalClosedTradesCount: number;
26
+ totalClosedTrades: number;
27
+ totalLongTrades: number;
28
+ totalLongTradesCount: number;
29
+ totalLongWins: number;
30
+ totalShortTrades: number;
31
+ totalShortTradesCount: number;
32
+ totalShortWins: number;
33
+ totalWins: number;
34
+ totalLosses: number;
35
+ winRate: number;
36
+ loosesRate: number;
37
+ totalCumEntryValue: number;
38
+ totalCumExitValue: number;
39
+ };
40
+
41
+ type TChallengeWalletBalance = {
42
+ challengeId: string;
43
+ accountType: IBybitAccountType;
44
+ totalEquity: number;
45
+ totalPerpUpl: number;
46
+ totalWalletBalance: number;
47
+ totalAvailableBalance: number;
48
+ capital: number;
49
+ /** Coin-specific balance details */
50
+ equity: number;
51
+ totalPositionMm?: number;
52
+ totalPositionIm?: number;
53
+ usdValue: number;
54
+ unrealisedPnl: number;
55
+ walletBalance: number;
56
+ availableToWithdraw: number;
57
+ cumRealisedPnl?: number;
58
+ bonus?: number;
59
+ coin: string;
60
+ updatedAt: string;
61
+ };
62
+
63
+ type TChallengeProgress = {
64
+ id: string | null;
65
+ challengeId: string;
66
+ currentEquity: number;
67
+ currentTotalLoss: number;
68
+ currentTradingDays: number;
69
+ currentDailyDrawdown: number;
70
+ currentProfitTarget: number;
71
+ dailyStartingEquity: number;
72
+ dailyStartingUpdatedAt: string;
73
+ maxDailyEquity: number;
74
+ minDailyEquity: number;
75
+ maxUpdatedAt: string;
76
+ minUpdatedAt: string;
77
+ };
78
+
79
+ export type { TChallengeClosedPnl as T, TChallengeClosedPnlStatistics as a, TChallengeProgress as b, TChallengeWalletBalance as c };
@@ -0,0 +1,264 @@
1
+ import { signBybitRequest } from './chunk-VPBFPI5B.js';
2
+
3
+ // src/providers/bybit/constants.ts
4
+ var BYBIT_CONSTANTS = {
5
+ baseUrl: process.env.BYBIT_BASE_URL || "https://api-demo.bybit.com",
6
+ fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 1e4,
7
+ recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || "20000"
8
+ };
9
+
10
+ // src/providers/bybit/get-api-key-info.ts
11
+ async function getApiKeyInfo(credentials) {
12
+ const { apiKey, apiSecret } = credentials;
13
+ if (!apiKey || !apiSecret) {
14
+ throw new Error("ByBit API key and API secret are required");
15
+ }
16
+ const { signature, timestamp } = signBybitRequest(apiSecret, apiKey);
17
+ let bybitRes;
18
+ try {
19
+ bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {
20
+ headers: {
21
+ "X-BAPI-API-KEY": apiKey,
22
+ "X-BAPI-SIGN": signature,
23
+ "X-BAPI-SIGN-TYPE": "2",
24
+ "X-BAPI-TIMESTAMP": timestamp,
25
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
26
+ },
27
+ //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
28
+ cache: "no-store"
29
+ });
30
+ } catch (error) {
31
+ throw new Error("ByBit API Key Info network error", { cause: error });
32
+ }
33
+ if (!bybitRes.ok) {
34
+ throw new Error("ByBit API Key Info request failed");
35
+ }
36
+ const bybitJson = await bybitRes.json();
37
+ if (bybitJson.retCode !== 0) {
38
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
39
+ }
40
+ if (!bybitJson) {
41
+ throw new Error("Invalid ByBit API Key Info response");
42
+ }
43
+ return bybitJson;
44
+ }
45
+
46
+ // src/providers/bybit/get-account-info.ts
47
+ async function getAccountInfo(credentials) {
48
+ const { apiKey, apiSecret } = credentials;
49
+ const queryString = "accountType=UNIFIED";
50
+ const { signature, timestamp } = signBybitRequest(
51
+ apiSecret,
52
+ apiKey,
53
+ queryString
54
+ );
55
+ let bybitRes;
56
+ try {
57
+ bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {
58
+ headers: {
59
+ "X-BAPI-API-KEY": apiKey,
60
+ "X-BAPI-SIGN": signature,
61
+ "X-BAPI-SIGN-TYPE": "2",
62
+ "X-BAPI-TIMESTAMP": timestamp,
63
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
64
+ },
65
+ signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
66
+ cache: "no-store"
67
+ });
68
+ } catch (error) {
69
+ throw new Error("ByBit Account API network error", { cause: error });
70
+ }
71
+ if (!bybitRes.ok) {
72
+ throw new Error("ByBit Account API request failed");
73
+ }
74
+ const bybitJson = await bybitRes.json();
75
+ if (bybitJson.retCode !== 0) {
76
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
77
+ }
78
+ const raw = bybitJson.result?.list?.[0];
79
+ if (!raw) {
80
+ throw new Error("No account info returned");
81
+ }
82
+ return bybitJson;
83
+ }
84
+
85
+ // src/providers/bybit/get-wallet-balance.ts
86
+ async function getWalletBalance(credentials) {
87
+ const { apiKey, apiSecret } = credentials;
88
+ const query = new URLSearchParams({
89
+ accountType: "UNIFIED",
90
+ coin: "USDT"
91
+ });
92
+ const queryString = query.toString();
93
+ const { signature, timestamp } = signBybitRequest(
94
+ apiSecret,
95
+ apiKey,
96
+ queryString
97
+ );
98
+ let bybitRes;
99
+ try {
100
+ bybitRes = await fetch(
101
+ `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,
102
+ {
103
+ headers: {
104
+ "X-BAPI-API-KEY": apiKey,
105
+ "X-BAPI-SIGN": signature,
106
+ "X-BAPI-SIGN-TYPE": "2",
107
+ "X-BAPI-TIMESTAMP": timestamp,
108
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
109
+ }
110
+ }
111
+ );
112
+ } catch (error) {
113
+ throw new Error("ByBit Wallet API network error", { cause: error });
114
+ }
115
+ if (!bybitRes.ok) {
116
+ throw new Error("ByBit Wallet API request failed: " + bybitRes.statusText);
117
+ }
118
+ const bybitJson = await bybitRes.json();
119
+ if (bybitJson.retCode !== 0) {
120
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
121
+ }
122
+ return bybitJson;
123
+ }
124
+
125
+ // src/providers/bybit/get-closed-pnl.ts
126
+ async function getClosedPnl(credentials, startTime, cursor) {
127
+ const { apiKey, apiSecret } = credentials;
128
+ const query = new URLSearchParams({
129
+ category: "linear",
130
+ //symbol: "BTCUSDT",
131
+ limit: "50"
132
+ //default limit
133
+ });
134
+ if (typeof startTime === "number") {
135
+ query.set("startTime", String(startTime));
136
+ }
137
+ if (typeof cursor === "string") {
138
+ query.set("cursor", String(cursor));
139
+ }
140
+ const queryString = query.toString();
141
+ const { signature, timestamp } = signBybitRequest(
142
+ apiSecret,
143
+ apiKey,
144
+ queryString
145
+ );
146
+ let bybitRes;
147
+ try {
148
+ bybitRes = await fetch(
149
+ `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,
150
+ {
151
+ headers: {
152
+ "X-BAPI-API-KEY": apiKey,
153
+ "X-BAPI-SIGN": signature,
154
+ "X-BAPI-SIGN-TYPE": "2",
155
+ "X-BAPI-TIMESTAMP": timestamp,
156
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
157
+ }
158
+ }
159
+ );
160
+ } catch (error) {
161
+ throw new Error("ByBit Closed PNL API network error", { cause: error });
162
+ }
163
+ if (!bybitRes.ok) {
164
+ throw new Error("ByBit Closed PNL API request failed");
165
+ }
166
+ const bybitJson = await bybitRes.json();
167
+ if (bybitJson.retCode !== 0) {
168
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
169
+ }
170
+ return bybitJson;
171
+ }
172
+
173
+ // src/providers/bybit/get-position-info.ts
174
+ async function getPositionInfo(credentials, category, symbol, settleCoin, cursor) {
175
+ const { apiKey, apiSecret } = credentials;
176
+ const query = new URLSearchParams({
177
+ category: category ?? "linear",
178
+ limit: "50"
179
+ //default limit
180
+ });
181
+ if (typeof symbol === "string") {
182
+ query.set("symbol", String(symbol));
183
+ }
184
+ if (typeof settleCoin === "string") {
185
+ query.set("settleCoin", String(settleCoin));
186
+ }
187
+ if (typeof cursor === "string") {
188
+ query.set("cursor", String(cursor));
189
+ }
190
+ const queryString = query.toString();
191
+ const { signature, timestamp } = signBybitRequest(
192
+ apiSecret,
193
+ apiKey,
194
+ queryString
195
+ );
196
+ let bybitRes;
197
+ try {
198
+ bybitRes = await fetch(
199
+ `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,
200
+ {
201
+ headers: {
202
+ "X-BAPI-API-KEY": apiKey,
203
+ "X-BAPI-SIGN": signature,
204
+ "X-BAPI-SIGN-TYPE": "2",
205
+ "X-BAPI-TIMESTAMP": timestamp,
206
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
207
+ },
208
+ signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
209
+ cache: "no-store"
210
+ }
211
+ );
212
+ } catch (error) {
213
+ throw new Error("ByBit Closed PNL API network error", { cause: error });
214
+ }
215
+ if (!bybitRes.ok) {
216
+ throw new Error("ByBit Closed PNL API request failed");
217
+ }
218
+ const bybitJson = await bybitRes.json();
219
+ if (bybitJson.retCode !== 0) {
220
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
221
+ }
222
+ return bybitJson;
223
+ }
224
+
225
+ // src/providers/bybit/apply-demo-money.ts
226
+ async function applyDemoMoney(credentials, payload) {
227
+ const { apiKey, apiSecret } = credentials;
228
+ const { signature, timestamp } = signBybitRequest(apiSecret, apiKey);
229
+ const requestBody = JSON.stringify(payload);
230
+ let bybitRes;
231
+ try {
232
+ bybitRes = await fetch(
233
+ `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,
234
+ {
235
+ method: "POST",
236
+ headers: {
237
+ "Content-Type": "application/json",
238
+ "X-BAPI-API-KEY": apiKey,
239
+ "X-BAPI-SIGN": signature,
240
+ "X-BAPI-SIGN-TYPE": "2",
241
+ "X-BAPI-TIMESTAMP": timestamp,
242
+ "X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
243
+ },
244
+ body: requestBody,
245
+ signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
246
+ cache: "no-store"
247
+ }
248
+ );
249
+ } catch (error) {
250
+ throw new Error("ByBit Apply Money API network error", { cause: error });
251
+ }
252
+ if (!bybitRes.ok) {
253
+ throw new Error("ByBit Apply Money API request failed");
254
+ }
255
+ const bybitJson = await bybitRes.json();
256
+ if (bybitJson.retCode !== 0) {
257
+ throw new Error(bybitJson.retMsg ?? "ByBit error");
258
+ }
259
+ return bybitJson;
260
+ }
261
+
262
+ export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getClosedPnl, getPositionInfo, getWalletBalance };
263
+ //# sourceMappingURL=chunk-CDWBE6PZ.js.map
264
+ //# sourceMappingURL=chunk-CDWBE6PZ.js.map
@@ -0,0 +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"],"names":[],"mappings":"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","file":"chunk-CDWBE6PZ.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 { 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): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\n const { apiKey, apiSecret } = credentials;\n\n if (!apiKey || !apiSecret) {\n throw new Error(\"ByBit API key and API secret are required\");\n }\n\n const { signature, timestamp } = signBybitRequest(apiSecret, apiKey);\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\": 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 throw new Error(\"ByBit API Key Info network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\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 throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n if (!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): Promise<IBybitApiResponse<IBybitAccountInfo>> {\n const { apiKey, apiSecret } = credentials;\n const queryString = \"accountType=UNIFIED\";\n const { signature, timestamp } = signBybitRequest(\n apiSecret,\n apiKey,\n queryString,\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 throw new Error(\"ByBit Account API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\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 throw new Error(bybitJson.retMsg ?? \"ByBit error\");\n }\n\n const raw = bybitJson.result?.list?.[0];\n\n if (!raw) {\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): 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 apiSecret,\n apiKey,\n queryString,\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 throw new Error(\"ByBit Wallet API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\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 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 cursor?: string,\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 cursor === \"string\") {\n query.set(\"cursor\", String(cursor));\n }\n\n const queryString = query.toString();\n\n const { signature, timestamp } = signBybitRequest(\n apiSecret,\n apiKey,\n queryString,\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 throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\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 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): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\n const { apiKey, apiSecret } = credentials;\n\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 apiSecret,\n apiKey,\n queryString,\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\": 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 throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n throw new Error(\"ByBit Closed PNL API request failed\");\n }\n\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\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\";\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): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\n const { apiKey, apiSecret } = credentials;\n const { signature, timestamp } = signBybitRequest(apiSecret, apiKey);\n\n const requestBody = JSON.stringify(payload);\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"]}
@@ -0,0 +1,39 @@
1
+ // src/utils/helper.ts
2
+ var parseNumber = (value) => {
3
+ if (value === null || value === void 0) {
4
+ return null;
5
+ }
6
+ const parsed = Number(value);
7
+ return Number.isFinite(parsed) ? parsed : null;
8
+ };
9
+ var toIsoDate = (value) => {
10
+ const parsed = parseNumber(value);
11
+ if (parsed === null || parsed <= 0) {
12
+ return null;
13
+ }
14
+ const date = new Date(parsed);
15
+ if (Number.isNaN(date.getTime())) {
16
+ return null;
17
+ }
18
+ return date.toISOString();
19
+ };
20
+ var isSameUtcDay = (left, right) => {
21
+ if (!left || !right) {
22
+ return false;
23
+ }
24
+ const normalizedLeft = left.trim();
25
+ const normalizedRight = right.trim();
26
+ if (!normalizedLeft || !normalizedRight) {
27
+ return false;
28
+ }
29
+ const leftDate = new Date(normalizedLeft);
30
+ const rightDate = new Date(normalizedRight);
31
+ if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {
32
+ return false;
33
+ }
34
+ return leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10);
35
+ };
36
+
37
+ export { isSameUtcDay, parseNumber, toIsoDate };
38
+ //# sourceMappingURL=chunk-GIWOOWDE.js.map
39
+ //# sourceMappingURL=chunk-GIWOOWDE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/helper.ts"],"names":[],"mappings":";AAAO,IAAM,WAAA,GAAc,CACzB,KAAA,KACkB;AAClB,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAC5C;AAEO,IAAM,SAAA,GAAY,CACvB,KAAA,KACkB;AAClB,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAK,WAAA,EAAY;AAC1B;AAEO,IAAM,YAAA,GAAe,CAC1B,IAAA,EACA,KAAA,KACY;AACZ,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,EAAK;AACjC,EAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,EAAK;AAEnC,EAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,eAAA,EAAiB;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,cAAc,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,eAAe,CAAA;AAE1C,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OACE,QAAA,CAAS,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,KAAM,SAAA,CAAU,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAE/E","file":"chunk-GIWOOWDE.js","sourcesContent":["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"]}
@@ -0,0 +1,98 @@
1
+ import { isSameUtcDay } from './chunk-GIWOOWDE.js';
2
+
3
+ // src/utils/challengeHelper.ts
4
+ var createDefaultWallet = (challengeId = "", capital = 0) => ({
5
+ challengeId,
6
+ accountType: "UNIFIED" /* UNIFIED */,
7
+ totalEquity: 0,
8
+ totalPerpUpl: 0,
9
+ totalWalletBalance: 0,
10
+ totalAvailableBalance: 0,
11
+ capital,
12
+ equity: 0,
13
+ usdValue: 0,
14
+ unrealisedPnl: 0,
15
+ walletBalance: 0,
16
+ availableToWithdraw: 0,
17
+ coin: "USDT" /* USDT */,
18
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
19
+ });
20
+ var createDefaultProgress = (challengeId = "", currentEquity = 0) => ({
21
+ challengeId,
22
+ currentEquity,
23
+ currentTotalLoss: 0,
24
+ currentTradingDays: 0,
25
+ currentDailyDrawdown: 0,
26
+ currentProfitTarget: 0,
27
+ dailyStartingEquity: 0,
28
+ dailyStartingUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
29
+ maxDailyEquity: 0,
30
+ minDailyEquity: 0,
31
+ maxUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
32
+ minUpdatedAt: (/* @__PURE__ */ new Date()).toISOString()
33
+ });
34
+ var currentTradingDaysCountCalculation = async (closedPnlData, minPositionSize) => {
35
+ if (!closedPnlData || closedPnlData.length === 0) {
36
+ return 0;
37
+ }
38
+ const closedPnlGrouped = closedPnlData.reduce(
39
+ (acc, trade) => {
40
+ const day = trade.updatedTime.split("T")[0];
41
+ if (!acc[day]) {
42
+ acc[day] = [];
43
+ }
44
+ acc[day].push(trade);
45
+ return acc;
46
+ },
47
+ {}
48
+ );
49
+ return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {
50
+ const hasQualifyingTrade = dayTrades.some((trade) => {
51
+ const entryValue = trade.cumEntryValue;
52
+ const closedPnL = trade.closedPnl;
53
+ const passesSize = entryValue >= minPositionSize;
54
+ const minRequiredPnL = entryValue * 0.01;
55
+ const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;
56
+ return passesSize && passesPnL;
57
+ });
58
+ return hasQualifyingTrade ? count + 1 : count;
59
+ }, 0);
60
+ };
61
+ var currentDailyEquity = (wallet, progress) => {
62
+ const today = (/* @__PURE__ */ new Date()).toISOString();
63
+ const startDate = (/* @__PURE__ */ new Date()).setUTCHours(0, 0, 0, 0);
64
+ const startDateStr = new Date(startDate).toISOString();
65
+ const { equity, unrealisedPnl } = wallet;
66
+ const {
67
+ dailyStartingEquity,
68
+ maxDailyEquity,
69
+ minDailyEquity,
70
+ dailyStartingUpdatedAt,
71
+ maxUpdatedAt,
72
+ minUpdatedAt
73
+ } = progress;
74
+ let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr);
75
+ const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;
76
+ const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;
77
+ isSameDay = isSameUtcDay(maxUpdatedAt, today);
78
+ let newMaxUpdatedAt = isSameDay ? maxUpdatedAt : today;
79
+ const newMaxDailyEquity = Math.max(isSameDay ? maxDailyEquity : equity, equity);
80
+ isSameDay = isSameUtcDay(minUpdatedAt, today);
81
+ const newMinUpdatedAt = isSameDay ? minUpdatedAt : today;
82
+ const newMinDailyEquity = Math.min(isSameDay ? minDailyEquity : equity, equity);
83
+ const dailyEquityDrawdown = equity - newMaxDailyEquity;
84
+ return {
85
+ currentEquity: equity,
86
+ currentDailyDrawdown: dailyEquityDrawdown,
87
+ dailyStartingEquity: newDailyStartingEquity,
88
+ dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),
89
+ maxDailyEquity: newMaxDailyEquity,
90
+ maxUpdatedAt: newMaxUpdatedAt,
91
+ minDailyEquity: newMinDailyEquity,
92
+ minUpdatedAt: newMinUpdatedAt
93
+ };
94
+ };
95
+
96
+ export { createDefaultProgress, createDefaultWallet, currentDailyEquity, currentTradingDaysCountCalculation };
97
+ //# sourceMappingURL=chunk-PGGSZUQW.js.map
98
+ //# sourceMappingURL=chunk-PGGSZUQW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/challengeHelper.ts"],"names":[],"mappings":"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","file":"chunk-PGGSZUQW.js","sourcesContent":["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 challengeId,\n currentEquity,\n currentTotalLoss: 0,\n currentTradingDays: 0,\n currentDailyDrawdown: 0,\n currentProfitTarget: 0,\n dailyStartingEquity: 0,\n dailyStartingUpdatedAt: new Date().toISOString(),\n maxDailyEquity: 0,\n minDailyEquity: 0,\n maxUpdatedAt: new Date().toISOString(),\n minUpdatedAt: 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 currentTradingDaysCountCalculation = 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, maxDailyEquity, minDailyEquity, \n dailyStartingUpdatedAt, maxUpdatedAt, minUpdatedAt } = 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(maxUpdatedAt, today);\n let newMaxUpdatedAt = isSameDay ? maxUpdatedAt : today;\n const newMaxDailyEquity = Math.max(isSameDay ? maxDailyEquity : equity , equity);\n \n // Determine if the min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(minUpdatedAt, today);\n const newMinUpdatedAt = isSameDay ? minUpdatedAt : today;\n const newMinDailyEquity = Math.min(isSameDay ? minDailyEquity : 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 - newMaxDailyEquity;\n \n return {\n currentEquity: equity,\n currentDailyDrawdown: dailyEquityDrawdown,\n\n dailyStartingEquity: newDailyStartingEquity,\n dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),\n\n maxDailyEquity: newMaxDailyEquity,\n maxUpdatedAt: newMaxUpdatedAt,\n\n minDailyEquity: newMinDailyEquity,\n minUpdatedAt: newMinUpdatedAt,\n };\n};"]}
@@ -0,0 +1,15 @@
1
+ import { createHmac } from 'crypto';
2
+ import { env } from 'process';
3
+
4
+ // src/utils/bybitHelper.ts
5
+ var BYBIT_RECV_WINDOW_TIMEOUT_MS = env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? "5000";
6
+ function signBybitRequest(apiSecret, apiKey, queryString) {
7
+ const timestamp = Date.now().toString();
8
+ const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? ""}`;
9
+ const signature = createHmac("sha256", apiSecret).update(payload).digest("hex");
10
+ return { signature, timestamp };
11
+ }
12
+
13
+ export { signBybitRequest };
14
+ //# sourceMappingURL=chunk-VPBFPI5B.js.map
15
+ //# sourceMappingURL=chunk-VPBFPI5B.js.map