@anrmk/str-package 0.1.29 → 0.1.30
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.
- package/README.md +125 -125
- package/dist/{chunk-2KHIGJJV.js → chunk-K6EB3UPO.js} +2 -2
- package/dist/{chunk-2KHIGJJV.js.map → chunk-K6EB3UPO.js.map} +1 -1
- package/dist/{chunk-KS5SEPFJ.js → chunk-OUSNG5OG.js} +10 -11
- package/dist/chunk-OUSNG5OG.js.map +1 -0
- package/dist/chunk-SJEPOLDP.js +99 -0
- package/dist/chunk-SJEPOLDP.js.map +1 -0
- package/dist/chunk-VHXAJWKR.js +39 -0
- package/dist/chunk-VHXAJWKR.js.map +1 -0
- package/dist/index.cjs +22 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -3
- package/dist/index.d.ts +19 -3
- package/dist/index.js +33 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/bybit/index.cjs +8 -9
- package/dist/providers/bybit/index.cjs.map +1 -1
- package/dist/providers/bybit/index.d.cts +2 -2
- package/dist/providers/bybit/index.d.ts +2 -2
- package/dist/providers/bybit/index.js +1 -1
- package/dist/types/bybit/index.cjs.map +1 -1
- package/dist/types/bybit/index.js +1 -1
- package/dist/types/challenge/index.d.cts +0 -1
- package/dist/types/challenge/index.d.ts +0 -1
- package/dist/utils/bybitHelper.cjs +85 -0
- package/dist/utils/bybitHelper.cjs.map +1 -0
- package/dist/utils/bybitHelper.d.cts +11 -0
- package/dist/utils/bybitHelper.d.ts +11 -0
- package/dist/utils/bybitHelper.js +3 -0
- package/dist/utils/bybitHelper.js.map +1 -0
- package/dist/{chunk-6R5UUXX4.js → utils/challengeHelper.cjs} +8 -21
- package/dist/utils/challengeHelper.cjs.map +1 -0
- package/dist/utils/{index.d.cts → challengeHelper.d.cts} +1 -13
- package/dist/utils/{index.d.ts → challengeHelper.d.ts} +1 -13
- package/dist/utils/challengeHelper.js +5 -0
- package/dist/utils/challengeHelper.js.map +1 -0
- package/dist/utils/helper.cjs +43 -0
- package/dist/utils/helper.cjs.map +1 -0
- package/dist/utils/helper.d.cts +5 -0
- package/dist/utils/helper.d.ts +5 -0
- package/dist/utils/helper.js +3 -0
- package/dist/utils/helper.js.map +1 -0
- package/package.json +86 -86
- package/dist/chunk-6R5UUXX4.js.map +0 -1
- package/dist/chunk-KS5SEPFJ.js.map +0 -1
- package/dist/chunk-MBPFU27I.js +0 -36
- package/dist/chunk-MBPFU27I.js.map +0 -1
- package/dist/clients/index.cjs +0 -334
- package/dist/clients/index.cjs.map +0 -1
- package/dist/clients/index.d.cts +0 -15
- package/dist/clients/index.d.ts +0 -15
- package/dist/clients/index.js +0 -4
- package/dist/clients/index.js.map +0 -1
- package/dist/utils/index.cjs +0 -222
- package/dist/utils/index.cjs.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
# @anrmk/str-package
|
|
2
|
-
|
|
3
|
-
Shared npm package for STR projects.
|
|
4
|
-
|
|
5
|
-
This library contains reusable Bybit providers, shared TypeScript types, and utility helpers used by `str` and `str-worker`.
|
|
6
|
-
|
|
7
|
-
## What Is Included
|
|
8
|
-
|
|
9
|
-
### Providers
|
|
10
|
-
|
|
11
|
-
- `@anrmk/str-package/providers/bybit`
|
|
12
|
-
|
|
13
|
-
### Types
|
|
14
|
-
|
|
15
|
-
- `@anrmk/str-package/types`
|
|
16
|
-
- `@anrmk/str-package/types/bybit`
|
|
17
|
-
- `@anrmk/str-package/types/challenge`
|
|
18
|
-
|
|
19
|
-
### Utilities
|
|
20
|
-
|
|
21
|
-
- `@anrmk/str-package/utils/bybitHelper`
|
|
22
|
-
- `@anrmk/str-package/utils/challengeHelper`
|
|
23
|
-
- `@anrmk/str-package/utils/helper`
|
|
24
|
-
|
|
25
|
-
## Install
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npm install @anrmk/str-package
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Usage
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
import { getApiKeyInfo } from "@anrmk/str-package/providers/bybit";
|
|
35
|
-
import type { TChallengeItem } from "@anrmk/str-package/types/challenge";
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Use In A Project
|
|
39
|
-
|
|
40
|
-
1. Install dependency:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
npm install @anrmk/str-package
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
2. Import from package subpaths in your app code:
|
|
47
|
-
|
|
48
|
-
```ts
|
|
49
|
-
import { applyDemoMoney } from "@anrmk/str-package/providers/bybit";
|
|
50
|
-
import type { IBybitApiResponse } from "@anrmk/str-package/types/bybit";
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Development
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
npm install
|
|
57
|
-
npm run build
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Publish Updates (Push)
|
|
61
|
-
|
|
62
|
-
When you change the package code and want consumers to receive updates, you need to ensure that the new code is compatible with the existing system.
|
|
63
|
-
|
|
64
|
-
Bump package version:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
npm version patch
|
|
68
|
-
```
|
|
69
|
-
2. Make sure your account is valid and you have an access
|
|
70
|
-
|
|
71
|
-
Fix npm cache ownership (one time)
|
|
72
|
-
```
|
|
73
|
-
sudo chown -R 501:20 /Users/anrmk/.npm
|
|
74
|
-
```
|
|
75
|
-
Re-authenticate as your npm account
|
|
76
|
-
```
|
|
77
|
-
npm logout
|
|
78
|
-
npm login
|
|
79
|
-
npm whoami
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Use `minor` or `major` when needed.
|
|
83
|
-
|
|
84
|
-
3. Build and publish:
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
npm run build
|
|
88
|
-
npm publish --access public
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
4. Push git commit and tags:
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
git push origin main --tags
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Note: npm does not allow publishing the same version twice.
|
|
98
|
-
|
|
99
|
-
## Get Updates In Consumers (Pull)
|
|
100
|
-
|
|
101
|
-
In `str` or `str-worker`, fetch latest package version:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
npm install @anrmk/str-package@latest
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
or
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
npm update @anrmk/str-package
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Verify installed version:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
npm list @anrmk/str-package
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Recommended Release Flow
|
|
120
|
-
|
|
121
|
-
1. Update code in this repo.
|
|
122
|
-
2. Run tests/build.
|
|
123
|
-
3. Bump version.
|
|
124
|
-
4. Publish to npm.
|
|
125
|
-
5. Update package in consumer repos.
|
|
1
|
+
# @anrmk/str-package
|
|
2
|
+
|
|
3
|
+
Shared npm package for STR projects.
|
|
4
|
+
|
|
5
|
+
This library contains reusable Bybit providers, shared TypeScript types, and utility helpers used by `str` and `str-worker`.
|
|
6
|
+
|
|
7
|
+
## What Is Included
|
|
8
|
+
|
|
9
|
+
### Providers
|
|
10
|
+
|
|
11
|
+
- `@anrmk/str-package/providers/bybit`
|
|
12
|
+
|
|
13
|
+
### Types
|
|
14
|
+
|
|
15
|
+
- `@anrmk/str-package/types`
|
|
16
|
+
- `@anrmk/str-package/types/bybit`
|
|
17
|
+
- `@anrmk/str-package/types/challenge`
|
|
18
|
+
|
|
19
|
+
### Utilities
|
|
20
|
+
|
|
21
|
+
- `@anrmk/str-package/utils/bybitHelper`
|
|
22
|
+
- `@anrmk/str-package/utils/challengeHelper`
|
|
23
|
+
- `@anrmk/str-package/utils/helper`
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install @anrmk/str-package
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { getApiKeyInfo } from "@anrmk/str-package/providers/bybit";
|
|
35
|
+
import type { TChallengeItem } from "@anrmk/str-package/types/challenge";
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Use In A Project
|
|
39
|
+
|
|
40
|
+
1. Install dependency:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install @anrmk/str-package
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. Import from package subpaths in your app code:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { applyDemoMoney } from "@anrmk/str-package/providers/bybit";
|
|
50
|
+
import type { IBybitApiResponse } from "@anrmk/str-package/types/bybit";
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Development
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install
|
|
57
|
+
npm run build
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Publish Updates (Push)
|
|
61
|
+
|
|
62
|
+
When you change the package code and want consumers to receive updates, you need to ensure that the new code is compatible with the existing system.
|
|
63
|
+
|
|
64
|
+
Bump package version:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm version patch
|
|
68
|
+
```
|
|
69
|
+
2. Make sure your account is valid and you have an access
|
|
70
|
+
|
|
71
|
+
Fix npm cache ownership (one time)
|
|
72
|
+
```
|
|
73
|
+
sudo chown -R 501:20 /Users/anrmk/.npm
|
|
74
|
+
```
|
|
75
|
+
Re-authenticate as your npm account
|
|
76
|
+
```
|
|
77
|
+
npm logout
|
|
78
|
+
npm login
|
|
79
|
+
npm whoami
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Use `minor` or `major` when needed.
|
|
83
|
+
|
|
84
|
+
3. Build and publish:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm run build
|
|
88
|
+
npm publish --access public
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
4. Push git commit and tags:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
git push origin main --tags
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Note: npm does not allow publishing the same version twice.
|
|
98
|
+
|
|
99
|
+
## Get Updates In Consumers (Pull)
|
|
100
|
+
|
|
101
|
+
In `str` or `str-worker`, fetch latest package version:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npm install @anrmk/str-package@latest
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
or
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npm update @anrmk/str-package
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Verify installed version:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm list @anrmk/str-package
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Recommended Release Flow
|
|
120
|
+
|
|
121
|
+
1. Update code in this repo.
|
|
122
|
+
2. Run tests/build.
|
|
123
|
+
3. Bump version.
|
|
124
|
+
4. Publish to npm.
|
|
125
|
+
5. Update package in consumer repos.
|
|
126
126
|
6. Validate and deploy.
|
|
@@ -22,5 +22,5 @@ var IBybitApiKeyVipLevel = /* @__PURE__ */ ((IBybitApiKeyVipLevel2) => {
|
|
|
22
22
|
})(IBybitApiKeyVipLevel || {});
|
|
23
23
|
|
|
24
24
|
export { IBybitAccountType, IBybitApiKeyVipLevel, IBybitCoinType };
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-K6EB3UPO.js.map
|
|
26
|
+
//# sourceMappingURL=chunk-K6EB3UPO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/bybit/enums.ts"],"names":["IBybitAccountType","IBybitCoinType","IBybitApiKeyVipLevel"],"mappings":";AAAO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AAFG,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAKL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,gBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AAJG,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAoBL,IAAK,oBAAA,qBAAAC,qBAAAA,KAAL;AACL,EAAAA,sBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AANE,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/types/bybit/enums.ts"],"names":["IBybitAccountType","IBybitCoinType","IBybitApiKeyVipLevel"],"mappings":";AAAO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AAFG,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAKL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,gBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AAJG,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAoBL,IAAK,oBAAA,qBAAAC,qBAAAA,KAAL;AACL,EAAAA,sBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AANE,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"chunk-K6EB3UPO.js","sourcesContent":["export enum IBybitAccountType {\r\n UNIFIED = \"UNIFIED\",\r\n FUND = \"FUND\",\r\n}\r\n\r\nexport enum IBybitCoinType {\r\n BTC = \"BTC\",\r\n ETH = \"ETH\",\r\n USDT = \"USDT\",\r\n USDC = \"USDC\",\r\n}\r\n\r\nexport enum IBybitOrderType {\r\n MARKET = \"Market\",\r\n LIMIT = \"Limit\",\r\n}\r\n\r\nexport enum IBybitUnifiedMarginStatus {\r\n CLASSIC_ACCOUNT = 1,\r\n UNIFIED_TRADING_ACCOUNT_1_0 = 3,\r\n UNIFIED_TRADING_ACCOUNT_1_0_PRO = 4,\r\n UNIFIED_TRADING_ACCOUNT_2_0 = 5,\r\n UNIFIED_TRADING_ACCOUNT_2_0_PRO = 6,\r\n}\r\n\r\nexport enum IBybitApiKeyVipLevel {\r\n NO_VIP = \"No VIP\",\r\n VIP_1 = \"VIP 1\",\r\n VIP_2 = \"VIP 2\",\r\n VIP_3 = \"VIP 3\",\r\n VIP_4 = \"VIP 4\",\r\n VIP_5 = \"VIP 5\",\r\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,
|
|
166
|
+
async function getClosedPnl(credentials, startTime, endTime, cursor, 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, payload, timeOffset) {
|
|
|
171
171
|
limit: "50"
|
|
172
172
|
//default limit
|
|
173
173
|
});
|
|
174
|
-
if (typeof
|
|
175
|
-
query.set("startTime", String(
|
|
174
|
+
if (typeof startTime === "number") {
|
|
175
|
+
query.set("startTime", String(startTime));
|
|
176
176
|
}
|
|
177
|
-
if (typeof
|
|
178
|
-
query.set("endTime", String(
|
|
177
|
+
if (typeof endTime === "number") {
|
|
178
|
+
query.set("endTime", String(endTime));
|
|
179
179
|
}
|
|
180
|
-
if (typeof
|
|
181
|
-
query.set("cursor", String(
|
|
180
|
+
if (typeof cursor === "string") {
|
|
181
|
+
query.set("cursor", String(cursor));
|
|
182
182
|
}
|
|
183
183
|
const queryString = query.toString();
|
|
184
184
|
const { signature, timestamp } = signBybitRequest({
|
|
@@ -272,11 +272,10 @@ async function getPositionInfo(credentials, category, symbol, settleCoin, cursor
|
|
|
272
272
|
|
|
273
273
|
// src/providers/bybit/apply-demo-money.ts
|
|
274
274
|
async function applyDemoMoney(credentials, payload, timeOffset) {
|
|
275
|
-
const { apiKey } = credentials;
|
|
275
|
+
const { apiKey, apiSecret } = credentials;
|
|
276
276
|
const requestBody = JSON.stringify(payload);
|
|
277
277
|
const { signature, timestamp } = signBybitRequest({
|
|
278
278
|
credentials,
|
|
279
|
-
queryString: requestBody,
|
|
280
279
|
timeOffset
|
|
281
280
|
});
|
|
282
281
|
let bybitRes;
|
|
@@ -347,5 +346,5 @@ async function getServerTime() {
|
|
|
347
346
|
}
|
|
348
347
|
|
|
349
348
|
export { applyDemoMoney, getAccountInfo, getApiKeyInfo, getBybitTimestamp, getClosedPnl, getPositionInfo, getServerTime, getWalletBalance, signBybitRequest, syncBybitServerTime };
|
|
350
|
-
//# sourceMappingURL=chunk-
|
|
351
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-OUSNG5OG.js.map
|
|
350
|
+
//# sourceMappingURL=chunk-OUSNG5OG.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-OUSNG5OG.js","sourcesContent":["export const BYBIT_CONSTANTS = {\r\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\r\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\r\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"20000\",\r\n}","import { createHmac } from \"crypto\";\r\nimport { env } from \"node:process\";\r\nimport { getServerTime } from \"../providers/bybit\";\r\nimport type { IBybitServerTime, IBybitSignRequest } from \"../types/bybit\";\r\n\r\nconst BYBIT_RECV_WINDOW_TIMEOUT_MS =\r\n env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? \"20000\";\r\n\r\nexport function signBybitRequest(request: IBybitSignRequest) {\r\n const { credentials, queryString, timeOffset } = request;\r\n const { apiSecret, apiKey } = credentials;\r\n\r\n const timestamp = getBybitTimestamp(timeOffset);\r\n console.log(\"Bybit server time timestamp:\", timestamp);\r\n const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? \"\"}`;\r\n const signature = createHmac(\"sha256\", apiSecret)\r\n .update(payload)\r\n .digest(\"hex\");\r\n\r\n return { signature, timestamp };\r\n}\r\n\r\nexport async function syncBybitServerTime(): Promise<number> {\r\n const requestStart = Date.now();\r\n const { result } = await getServerTime();\r\n const requestEnd = Date.now();\r\n const serverTime = Number(result.timeSecond) * 1000;\r\n\r\n // Estimate the local time at which Bybit generated\r\n // the response by using the midpoint.\r\n const localMidpoint = requestStart + (requestEnd - requestStart) / 2;\r\n\r\n const bybitTimeOffset = serverTime - localMidpoint;\r\n\r\n console.log({\r\n serverTime,\r\n requestStart,\r\n requestEnd,\r\n latency: requestEnd - requestStart,\r\n bybitTimeOffset,\r\n });\r\n\r\n return bybitTimeOffset;\r\n}\r\n\r\nexport function getBybitTimestamp(timeOffset: number = 0): string {\r\n // Small safety margin: keep request slightly behind server.\r\n return String(Date.now() + timeOffset - 250);\r\n}","import { BYBIT_CONSTANTS } from \"./constants\";\r\nimport { IBybitCredentials, IBybitApiKeyInfo, IBybitApiResponse} from \"../../types/bybit\";\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\n\r\nexport async function getApiKeyInfo(\r\n credentials: IBybitCredentials,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitApiKeyInfo>> {\r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n timeOffset,\r\n });\r\n\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {\r\n headers: {\r\n \"X-BAPI-API-KEY\": credentials.apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n //signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\r\n cache: \"no-store\",\r\n });\r\n } catch (error) {\r\n console.error(\"ByBit API Key Info network error\", error);\r\n throw new Error(\"ByBit API Key Info network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit API Key Info request failed\", bybitRes);\r\n throw new Error(\"ByBit API Key Info request failed\");\r\n }\r\n\r\n const bybitJson =\r\n (await bybitRes.json()) as IBybitApiResponse<IBybitApiKeyInfo>;\r\n\r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit API Key Info API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n if (!bybitJson) {\r\n console.error(\"Invalid ByBit API Key Info response\", bybitJson);\r\n throw new Error(\"Invalid ByBit API Key Info response\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import {\r\n IBybitCredentials,\r\n IBybitAccountInfo,\r\n IBybitApiResponse,\r\n} from \"../../types/bybit\";\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\nimport { BYBIT_CONSTANTS } from \"./constants\";\r\n\r\nexport async function getAccountInfo(\r\n credentials: IBybitCredentials,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitAccountInfo>> {\r\n const { apiKey, apiSecret } = credentials;\r\n const queryString = \"accountType=UNIFIED\";\r\n \r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n queryString,\r\n timeOffset\r\n });\r\n\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/account/info`, {\r\n headers: {\r\n \"X-BAPI-API-KEY\": apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\r\n cache: \"no-store\",\r\n });\r\n } catch (error) {\r\n console.error(\"ByBit Account API network error\", error);\r\n throw new Error(\"ByBit Account API network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit Account API request failed\", bybitRes);\r\n throw new Error(\"ByBit Account API request failed\");\r\n }\r\n\r\n const bybitJson =\r\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\r\n\r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit Account API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n const raw = bybitJson.result?.list?.[0];\r\n\r\n if (!raw) {\r\n console.error(\"No account info returned\", bybitJson);\r\n throw new Error(\"No account info returned\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import { BYBIT_CONSTANTS } from \"./constants\";\r\nimport { IBybitApiResponse, IBybitWalletAccount, IBybitCredentials } from \"../../types/bybit\";\r\n\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\n\r\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\r\nexport async function getWalletBalance(\r\n credentials: IBybitCredentials,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitWalletAccount>> {\r\n const { apiKey, apiSecret } = credentials;\r\n\r\n const query = new URLSearchParams({\r\n accountType: \"UNIFIED\",\r\n coin: \"USDT\",\r\n });\r\n const queryString = query.toString();\r\n\r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n queryString,\r\n timeOffset,\r\n });\r\n\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(\r\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/wallet-balance?${queryString}`,\r\n {\r\n headers: {\r\n \"X-BAPI-API-KEY\": apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n },\r\n );\r\n } catch (error) {\r\n console.error(\"ByBit Wallet API network error\", error);\r\n throw new Error(\"ByBit Wallet API network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit Wallet API request failed\", bybitRes);\r\n throw new Error(\"ByBit Wallet API request failed: \" + bybitRes.statusText);\r\n }\r\n\r\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitWalletAccount>;\r\n\r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit Wallet API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import { BYBIT_CONSTANTS } from \"./constants\";\r\nimport { IBybitCredentials, IBybitApiResponse, IBybitApiResponseList, IBybitClosedPnl } from \"../../types/bybit\";\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\n\r\n// GET /api/bybit/wallet-balance?accountType=UNIFIED\r\nexport async function getClosedPnl(\r\n credentials: IBybitCredentials,\r\n startTime?: number,\r\n endTime?: number,\r\n cursor?: string,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>> {\r\n const { apiKey, apiSecret } = credentials;\r\n const query = new URLSearchParams({\r\n category: \"linear\",\r\n //symbol: \"BTCUSDT\",\r\n limit: \"50\", //default limit\r\n });\r\n\r\n if (typeof startTime === \"number\") {\r\n query.set(\"startTime\", String(startTime));\r\n }\r\n\r\n if (typeof endTime === \"number\") {\r\n query.set(\"endTime\", String(endTime));\r\n }\r\n\r\n if (typeof cursor === \"string\") {\r\n query.set(\"cursor\", String(cursor));\r\n }\r\n\r\n const queryString = query.toString();\r\n\r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n queryString,\r\n timeOffset,\r\n });\r\n\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(\r\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/closed-pnl?${queryString}`,\r\n {\r\n headers: {\r\n \"X-BAPI-API-KEY\": apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n },\r\n );\r\n } catch (error) {\r\n console.error(\"ByBit Closed PNL API network error\", error);\r\n throw new Error(\"ByBit Closed PNL API network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit Closed PNL API request failed\", bybitRes);\r\n throw new Error(\"ByBit Closed PNL API request failed\");\r\n }\r\n\r\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>;\r\n\r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit Closed PNL API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import { BYBIT_CONSTANTS } from \"./constants\";\r\nimport {\r\n IBybitCredentials,\r\n IBybitApiResponse,\r\n IBybitApiResponseList,\r\n IBybitPositionInfo,\r\n} from \"../../types/bybit\";\r\n\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\n\r\n// Query real-time position data, such as position size, cumulative realized PNL, etc.\r\nexport async function getPositionInfo(\r\n credentials: IBybitCredentials,\r\n category?: string,\r\n symbol?: string,\r\n settleCoin?: string,\r\n cursor?: string,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>> {\r\n const query = new URLSearchParams({\r\n category: category ?? \"linear\",\r\n limit: \"50\", //default limit\r\n });\r\n\r\n if (typeof symbol === \"string\") {\r\n query.set(\"symbol\", String(symbol));\r\n }\r\n\r\n if (typeof settleCoin === \"string\") {\r\n query.set(\"settleCoin\", String(settleCoin));\r\n }\r\n\r\n if (typeof cursor === \"string\") {\r\n query.set(\"cursor\", String(cursor));\r\n }\r\n\r\n const queryString = query.toString();\r\n\r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n queryString,\r\n timeOffset,\r\n });\r\n\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(\r\n `${BYBIT_CONSTANTS.baseUrl}/v5/position/list?${queryString}`,\r\n {\r\n headers: {\r\n \"X-BAPI-API-KEY\": credentials.apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\r\n cache: \"no-store\",\r\n },\r\n );\r\n } catch (error) {\r\n console.error(\"ByBit Position Info API network error\", { cause: error });\r\n throw new Error(\"ByBit Position Info API network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit Position Info API request failed\", bybitRes);\r\n throw new Error(\"ByBit Position Info API request failed\");\r\n }\r\n\r\n const bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitApiResponseList<IBybitPositionInfo>>;\r\n \r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit Position Info API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import { BYBIT_CONSTANTS } from \"./constants\";\r\n\r\nimport {\r\n IBybitCredentials,\r\n IBybitApiResponse,\r\n IBybitAccountInfo,\r\n IBybitDemoApplyMoneyRequest,\r\n} from \"../../types/bybit\";\r\nimport { signBybitRequest } from \"../../utils/bybitHelper\";\r\nimport { IBybitDemoApplyMoney } from \"../../types/bybit/IBybitDemoApplyMoney\";\r\n\r\n// POST /api/bybit/apply-money\r\nexport async function applyDemoMoney(\r\n credentials: IBybitCredentials,\r\n payload: IBybitDemoApplyMoneyRequest,\r\n timeOffset?: number,\r\n): Promise<IBybitApiResponse<IBybitDemoApplyMoney>> {\r\n const { apiKey, apiSecret } = credentials;\r\n\r\n const requestBody = JSON.stringify(payload);\r\n const { signature, timestamp } = signBybitRequest({\r\n credentials,\r\n timeOffset \r\n });\r\n\r\n //const { signature, timestamp } = signBybitRequest(apiSecret, apiKey, requestBody);\r\n \r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(\r\n `${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-BAPI-API-KEY\": apiKey,\r\n \"X-BAPI-SIGN\": signature,\r\n \"X-BAPI-SIGN-TYPE\": \"2\",\r\n \"X-BAPI-TIMESTAMP\": timestamp,\r\n \"X-BAPI-RECV-WINDOW\": BYBIT_CONSTANTS.recvWindowTimeoutMs,\r\n },\r\n body: requestBody,\r\n signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),\r\n cache: \"no-store\",\r\n },\r\n );\r\n } catch (error) {\r\n throw new Error(\"ByBit Apply Money API network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n throw new Error(\"ByBit Apply Money API request failed\");\r\n }\r\n\r\n const bybitJson =\r\n (await bybitRes.json()) as IBybitApiResponse<IBybitAccountInfo>;\r\n\r\n if (bybitJson.retCode !== 0) {\r\n throw new Error(bybitJson.retMsg ?? \"ByBit error\");\r\n }\r\n\r\n return bybitJson;\r\n}\r\n","import { BYBIT_CONSTANTS } from \"./constants\";\r\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\r\n\r\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\r\n let bybitRes: Response;\r\n try {\r\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\r\n {\r\n cache: \"no-store\",\r\n }\r\n );\r\n } catch (error) {\r\n console.error(\"ByBit Server Time network error\", error);\r\n throw new Error(\"ByBit Server Time network error\", { cause: error });\r\n }\r\n\r\n if (!bybitRes.ok) {\r\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\r\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\r\n }\r\n\r\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\r\n\r\n try {\r\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\r\n } catch (error) {\r\n console.error(\"Invalid ByBit Server Time response\", error);\r\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\r\n }\r\n\r\n if (!bybitJson) {\r\n throw new Error(\"Invalid ByBit Server Time response\");\r\n }\r\n\r\n if (bybitJson.retCode !== 0) {\r\n console.error(\"ByBit Server Time API error\", bybitJson);\r\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\r\n }\r\n\r\n return bybitJson;\r\n}"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { isSameUtcDay } from './chunk-VHXAJWKR.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
|
+
id: (/* @__PURE__ */ new Date()).getTime().toString(),
|
|
22
|
+
challengeId,
|
|
23
|
+
currentEquity,
|
|
24
|
+
totalLoss: 0,
|
|
25
|
+
tradingDays: 0,
|
|
26
|
+
dailyDrawdown: 0,
|
|
27
|
+
profitTarget: 0,
|
|
28
|
+
dailyStartingEquity: 0,
|
|
29
|
+
dailyStartingUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
30
|
+
dailyMaxEquity: 0,
|
|
31
|
+
dailyMinEquity: 0,
|
|
32
|
+
dailyMaxUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
33
|
+
dailyMinUpdatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
34
|
+
});
|
|
35
|
+
var tradingDaysCountCalculation = async (closedPnlData, minPositionSize) => {
|
|
36
|
+
if (!closedPnlData || closedPnlData.length === 0) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const closedPnlGrouped = closedPnlData.reduce(
|
|
40
|
+
(acc, trade) => {
|
|
41
|
+
const day = trade.updatedTime.split("T")[0];
|
|
42
|
+
if (!acc[day]) {
|
|
43
|
+
acc[day] = [];
|
|
44
|
+
}
|
|
45
|
+
acc[day].push(trade);
|
|
46
|
+
return acc;
|
|
47
|
+
},
|
|
48
|
+
{}
|
|
49
|
+
);
|
|
50
|
+
return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {
|
|
51
|
+
const hasQualifyingTrade = dayTrades.some((trade) => {
|
|
52
|
+
const entryValue = trade.cumEntryValue;
|
|
53
|
+
const closedPnL = trade.closedPnl;
|
|
54
|
+
const passesSize = entryValue >= minPositionSize;
|
|
55
|
+
const minRequiredPnL = entryValue * 0.01;
|
|
56
|
+
const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;
|
|
57
|
+
return passesSize && passesPnL;
|
|
58
|
+
});
|
|
59
|
+
return hasQualifyingTrade ? count + 1 : count;
|
|
60
|
+
}, 0);
|
|
61
|
+
};
|
|
62
|
+
var currentDailyEquity = (wallet, progress) => {
|
|
63
|
+
const today = (/* @__PURE__ */ new Date()).toISOString();
|
|
64
|
+
const startDate = (/* @__PURE__ */ new Date()).setUTCHours(0, 0, 0, 0);
|
|
65
|
+
const startDateStr = new Date(startDate).toISOString();
|
|
66
|
+
const { equity, unrealisedPnl } = wallet;
|
|
67
|
+
const {
|
|
68
|
+
dailyStartingEquity,
|
|
69
|
+
dailyMaxEquity,
|
|
70
|
+
dailyMinEquity,
|
|
71
|
+
dailyStartingUpdatedAt,
|
|
72
|
+
dailyMaxUpdatedAt,
|
|
73
|
+
dailyMinUpdatedAt
|
|
74
|
+
} = progress;
|
|
75
|
+
let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr);
|
|
76
|
+
const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;
|
|
77
|
+
const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;
|
|
78
|
+
isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);
|
|
79
|
+
let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;
|
|
80
|
+
const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity, equity);
|
|
81
|
+
isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);
|
|
82
|
+
const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;
|
|
83
|
+
const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);
|
|
84
|
+
const dailyEquityDrawdown = equity - newdailyMaxEquity;
|
|
85
|
+
return {
|
|
86
|
+
currentEquity: equity,
|
|
87
|
+
dailyDrawdown: dailyEquityDrawdown,
|
|
88
|
+
dailyStartingEquity: newDailyStartingEquity,
|
|
89
|
+
dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),
|
|
90
|
+
dailyMaxEquity: newdailyMaxEquity,
|
|
91
|
+
dailyMaxUpdatedAt: newMaxUpdatedAt,
|
|
92
|
+
dailyMinEquity: newdailyMinEquity,
|
|
93
|
+
dailyMinUpdatedAt: newMinUpdatedAt
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { createDefaultProgress, createDefaultWallet, currentDailyEquity, tradingDaysCountCalculation };
|
|
98
|
+
//# sourceMappingURL=chunk-SJEPOLDP.js.map
|
|
99
|
+
//# sourceMappingURL=chunk-SJEPOLDP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/challengeHelper.ts"],"names":[],"mappings":"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","file":"chunk-SJEPOLDP.js","sourcesContent":["import {\r\n TChallengeClosedPnl,\r\n TChallengeProgress,\r\n TChallengeWalletBalance,\r\n} from \"../types/challenge\";\r\nimport { IBybitAccountType, IBybitCoinType } from \"../types/bybit/enums\";\r\nimport { isSameUtcDay } from \"./helper\";\r\n\r\nexport const createDefaultWallet = (\r\n challengeId: string = \"\",\r\n capital: number = 0,\r\n): TChallengeWalletBalance =>\r\n ({\r\n challengeId,\r\n accountType: IBybitAccountType.UNIFIED,\r\n totalEquity: 0,\r\n totalPerpUpl: 0,\r\n totalWalletBalance: 0,\r\n totalAvailableBalance: 0,\r\n capital,\r\n\r\n equity: 0,\r\n usdValue: 0,\r\n unrealisedPnl: 0,\r\n walletBalance: 0,\r\n availableToWithdraw: 0,\r\n coin: IBybitCoinType.USDT,\r\n updatedAt: new Date().toISOString(),\r\n }) as TChallengeWalletBalance;\r\n\r\nexport const createDefaultProgress = (\r\n challengeId: string = \"\",\r\n currentEquity: number = 0,\r\n): TChallengeProgress =>\r\n ({\r\n id: new Date().getTime().toString(),\r\n challengeId,\r\n currentEquity,\r\n totalLoss: 0,\r\n tradingDays: 0,\r\n dailyDrawdown: 0,\r\n profitTarget: 0,\r\n dailyStartingEquity: 0,\r\n dailyStartingUpdatedAt: new Date().toISOString(),\r\n dailyMaxEquity: 0,\r\n dailyMinEquity: 0,\r\n dailyMaxUpdatedAt: new Date().toISOString(),\r\n dailyMinUpdatedAt: new Date().toISOString(),\r\n }) as TChallengeProgress;\r\n\r\n // A trading day counts if you open and close at least one trade \r\n// that day with a position size ≥ 5% of the initial balance and a PnL of ±1% or more.\r\nexport const tradingDaysCountCalculation = async (\r\n closedPnlData: TChallengeClosedPnl[] | null,\r\n minPositionSize: number,\r\n): Promise<number> => {\r\n if (!closedPnlData || closedPnlData.length === 0) {\r\n return 0;\r\n }\r\n\r\n const closedPnlGrouped = closedPnlData.reduce(\r\n (acc, trade) => {\r\n const day = trade.updatedTime.split(\"T\")[0];\r\n if (!acc[day]) {\r\n acc[day] = [];\r\n }\r\n acc[day].push(trade);\r\n return acc;\r\n },\r\n {} as Record<string, TChallengeClosedPnl[]>,\r\n );\r\n\r\n return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {\r\n // Check if any trade closed today met the minimum size requirement\r\n const hasQualifyingTrade = dayTrades.some((trade) => {\r\n const entryValue = trade.cumEntryValue;\r\n const closedPnL = trade.closedPnl;\r\n\r\n // 1. Position size must be >= 5% of initial balance\r\n const passesSize = entryValue >= minPositionSize;\r\n\r\n // 2. PnL must be >= 1% of the position size itself\r\n const minRequiredPnL = entryValue * 0.01;\r\n const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;\r\n\r\n return passesSize && passesPnL;\r\n });\r\n\r\n return hasQualifyingTrade ? count + 1 : count;\r\n }, 0);\r\n};\r\n\r\nexport const currentDailyEquity = (\r\n wallet: TChallengeWalletBalance,\r\n progress: TChallengeProgress\r\n) => {\r\n const today = new Date().toISOString();\r\n const startDate = new Date().setUTCHours(0, 0, 0, 0);\r\n const startDateStr = new Date(startDate).toISOString();\r\n\r\n const { equity, unrealisedPnl } = wallet;\r\n const { dailyStartingEquity, dailyMaxEquity, dailyMinEquity, \r\n dailyStartingUpdatedAt, dailyMaxUpdatedAt, dailyMinUpdatedAt } = progress;\r\n \r\n // Determine if the daily starting equity should be updated based on whether it's a new day\r\n let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr)\r\n const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;\r\n const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;\r\n\r\n // Determine if the max and min daily equity should be updated based on whether it's a new day\r\n isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);\r\n let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;\r\n const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity , equity);\r\n \r\n // Determine if the min daily equity should be updated based on whether it's a new day\r\n isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);\r\n const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;\r\n const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);\r\n\r\n //Trailing Drawdown: The difference between the day’s highest equity and the lowest equity reached afterward, both including unrealized P&L.\r\n const dailyEquityDrawdown = equity - newdailyMaxEquity;\r\n \r\n return {\r\n currentEquity: equity,\r\n dailyDrawdown: dailyEquityDrawdown,\r\n\r\n dailyStartingEquity: newDailyStartingEquity,\r\n dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),\r\n\r\n dailyMaxEquity: newdailyMaxEquity,\r\n dailyMaxUpdatedAt: newMaxUpdatedAt,\r\n\r\n dailyMinEquity: newdailyMinEquity,\r\n dailyMinUpdatedAt: newMinUpdatedAt,\r\n };\r\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-VHXAJWKR.js.map
|
|
39
|
+
//# sourceMappingURL=chunk-VHXAJWKR.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-VHXAJWKR.js","sourcesContent":["export const parseNumber = (\r\n value: number | string | null | undefined,\r\n): number | null => {\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n};\r\n\r\nexport const toIsoDate = (\r\n value: string | number | null | undefined,\r\n): string | null => {\r\n const parsed = parseNumber(value);\r\n if (parsed === null || parsed <= 0) {\r\n return null;\r\n }\r\n\r\n const date = new Date(parsed);\r\n if (Number.isNaN(date.getTime())) {\r\n return null;\r\n }\r\n\r\n return date.toISOString();\r\n};\r\n\r\nexport const isSameUtcDay = (\r\n left: string | null | undefined,\r\n right: string | null | undefined,\r\n): boolean => {\r\n if (!left || !right) {\r\n return false;\r\n }\r\n\r\n const normalizedLeft = left.trim();\r\n const normalizedRight = right.trim();\r\n\r\n if (!normalizedLeft || !normalizedRight) {\r\n return false;\r\n }\r\n\r\n const leftDate = new Date(normalizedLeft);\r\n const rightDate = new Date(normalizedRight);\r\n\r\n if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {\r\n return false;\r\n }\r\n\r\n return (\r\n leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10)\r\n );\r\n};\r\n"]}
|
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,
|
|
141
|
+
async function getClosedPnl(credentials, startTime, endTime, cursor, 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, payload, timeOffset) {
|
|
|
146
146
|
limit: "50"
|
|
147
147
|
//default limit
|
|
148
148
|
});
|
|
149
|
-
if (typeof
|
|
150
|
-
query.set("startTime", String(
|
|
149
|
+
if (typeof startTime === "number") {
|
|
150
|
+
query.set("startTime", String(startTime));
|
|
151
151
|
}
|
|
152
|
-
if (typeof
|
|
153
|
-
query.set("endTime", String(
|
|
152
|
+
if (typeof endTime === "number") {
|
|
153
|
+
query.set("endTime", String(endTime));
|
|
154
154
|
}
|
|
155
|
-
if (typeof
|
|
156
|
-
query.set("cursor", String(
|
|
155
|
+
if (typeof cursor === "string") {
|
|
156
|
+
query.set("cursor", String(cursor));
|
|
157
157
|
}
|
|
158
158
|
const queryString = query.toString();
|
|
159
159
|
const { signature, timestamp } = signBybitRequest({
|
|
@@ -247,11 +247,10 @@ async function getPositionInfo(credentials, category, symbol, settleCoin, cursor
|
|
|
247
247
|
|
|
248
248
|
// src/providers/bybit/apply-demo-money.ts
|
|
249
249
|
async function applyDemoMoney(credentials, payload, timeOffset) {
|
|
250
|
-
const { apiKey } = credentials;
|
|
250
|
+
const { apiKey, apiSecret } = credentials;
|
|
251
251
|
const requestBody = JSON.stringify(payload);
|
|
252
252
|
const { signature, timestamp } = signBybitRequest({
|
|
253
253
|
credentials,
|
|
254
|
-
queryString: requestBody,
|
|
255
254
|
timeOffset
|
|
256
255
|
});
|
|
257
256
|
let bybitRes;
|
|
@@ -352,34 +351,29 @@ function getBybitTimestamp(timeOffset = 0) {
|
|
|
352
351
|
return String(Date.now() + timeOffset - 250);
|
|
353
352
|
}
|
|
354
353
|
|
|
355
|
-
// src/
|
|
354
|
+
// src/client/BybitClient.ts
|
|
356
355
|
var BybitClient = class {
|
|
356
|
+
credentials;
|
|
357
357
|
timeOffset = 0;
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
358
|
+
constructor(credentials) {
|
|
359
|
+
this.credentials = credentials;
|
|
360
|
+
(async () => {
|
|
361
361
|
this.timeOffset = await syncBybitServerTime();
|
|
362
362
|
})();
|
|
363
363
|
}
|
|
364
|
-
async applyDemoMoney(
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
async applyDemoMoney() {
|
|
365
|
+
}
|
|
366
|
+
async getAccountInfo() {
|
|
367
367
|
}
|
|
368
|
-
async
|
|
369
|
-
|
|
370
|
-
return await
|
|
368
|
+
async getApiKeyInfo() {
|
|
369
|
+
console.log(this.credentials, this.timeOffset);
|
|
370
|
+
return await getApiKeyInfo(this.credentials, this.timeOffset);
|
|
371
371
|
}
|
|
372
|
-
async
|
|
373
|
-
await this.ready;
|
|
374
|
-
return await getApiKeyInfo(credentials, this.timeOffset);
|
|
372
|
+
async getClosedPnl() {
|
|
375
373
|
}
|
|
376
|
-
async
|
|
377
|
-
await this.ready;
|
|
378
|
-
return await getClosedPnl(credentials, payload, this.timeOffset);
|
|
374
|
+
async getPositionInfo() {
|
|
379
375
|
}
|
|
380
|
-
async getWalletBalance(
|
|
381
|
-
await this.ready;
|
|
382
|
-
return await getWalletBalance(credentials, this.timeOffset);
|
|
376
|
+
async getWalletBalance() {
|
|
383
377
|
}
|
|
384
378
|
};
|
|
385
379
|
|