@anrmk/str-package 0.1.30 → 0.2.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.
- package/README.md +125 -125
- package/dist/{chunk-K6EB3UPO.js → chunk-2KHIGJJV.js} +2 -2
- package/dist/{chunk-K6EB3UPO.js.map → chunk-2KHIGJJV.js.map} +1 -1
- package/dist/{utils/challengeHelper.cjs → chunk-6R5UUXX4.js} +21 -8
- package/dist/chunk-6R5UUXX4.js.map +1 -0
- package/dist/{chunk-OUSNG5OG.js → chunk-KS5SEPFJ.js} +11 -10
- package/dist/chunk-KS5SEPFJ.js.map +1 -0
- package/dist/chunk-MBPFU27I.js +36 -0
- package/dist/chunk-MBPFU27I.js.map +1 -0
- package/dist/clients/index.cjs +334 -0
- package/dist/clients/index.cjs.map +1 -0
- package/dist/clients/index.d.cts +15 -0
- package/dist/clients/index.d.ts +15 -0
- package/dist/clients/index.js +4 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/index.cjs +28 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -19
- package/dist/index.d.ts +3 -19
- package/dist/index.js +4 -33
- package/dist/index.js.map +1 -1
- package/dist/providers/bybit/index.cjs +9 -8
- 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 +1 -0
- package/dist/types/challenge/index.d.ts +1 -0
- package/dist/utils/index.cjs +222 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/{challengeHelper.d.cts → index.d.cts} +13 -1
- package/dist/utils/{challengeHelper.d.ts → index.d.ts} +13 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +86 -86
- package/dist/chunk-OUSNG5OG.js.map +0 -1
- package/dist/chunk-SJEPOLDP.js +0 -99
- package/dist/chunk-SJEPOLDP.js.map +0 -1
- package/dist/chunk-VHXAJWKR.js +0 -39
- package/dist/chunk-VHXAJWKR.js.map +0 -1
- package/dist/utils/bybitHelper.cjs +0 -85
- package/dist/utils/bybitHelper.cjs.map +0 -1
- package/dist/utils/bybitHelper.d.cts +0 -11
- package/dist/utils/bybitHelper.d.ts +0 -11
- package/dist/utils/bybitHelper.js +0 -3
- package/dist/utils/bybitHelper.js.map +0 -1
- package/dist/utils/challengeHelper.cjs.map +0 -1
- package/dist/utils/challengeHelper.js +0 -5
- package/dist/utils/challengeHelper.js.map +0 -1
- package/dist/utils/helper.cjs +0 -43
- package/dist/utils/helper.cjs.map +0 -1
- package/dist/utils/helper.d.cts +0 -5
- package/dist/utils/helper.d.ts +0 -5
- package/dist/utils/helper.js +0 -3
- package/dist/utils/helper.js.map +0 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var crypto = require('crypto');
|
|
4
|
+
var process$1 = require('process');
|
|
5
|
+
|
|
6
|
+
// src/utils/bybitHelper.ts
|
|
7
|
+
|
|
8
|
+
// src/providers/bybit/constants.ts
|
|
9
|
+
var BYBIT_CONSTANTS = {
|
|
10
|
+
baseUrl: process.env.BYBIT_BASE_URL || "https://api-demo.bybit.com",
|
|
11
|
+
fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 1e4,
|
|
12
|
+
recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || "20000"
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// src/providers/bybit/get-api-key-info.ts
|
|
16
|
+
async function getApiKeyInfo(credentials, timeOffset) {
|
|
17
|
+
const { signature, timestamp } = signBybitRequest({
|
|
18
|
+
credentials,
|
|
19
|
+
timeOffset
|
|
20
|
+
});
|
|
21
|
+
let bybitRes;
|
|
22
|
+
try {
|
|
23
|
+
bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/user/query-api`, {
|
|
24
|
+
headers: {
|
|
25
|
+
"X-BAPI-API-KEY": credentials.apiKey,
|
|
26
|
+
"X-BAPI-SIGN": signature,
|
|
27
|
+
"X-BAPI-SIGN-TYPE": "2",
|
|
28
|
+
"X-BAPI-TIMESTAMP": timestamp,
|
|
29
|
+
"X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
|
|
30
|
+
},
|
|
31
|
+
//signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
|
|
32
|
+
cache: "no-store"
|
|
33
|
+
});
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error("ByBit API Key Info network error", error);
|
|
36
|
+
throw new Error("ByBit API Key Info network error", { cause: error });
|
|
37
|
+
}
|
|
38
|
+
if (!bybitRes.ok) {
|
|
39
|
+
console.error("ByBit API Key Info request failed", bybitRes);
|
|
40
|
+
throw new Error("ByBit API Key Info request failed");
|
|
41
|
+
}
|
|
42
|
+
const bybitJson = await bybitRes.json();
|
|
43
|
+
if (bybitJson.retCode !== 0) {
|
|
44
|
+
console.error("ByBit API Key Info API error", bybitJson);
|
|
45
|
+
throw new Error(bybitJson.retMsg ?? "ByBit error");
|
|
46
|
+
}
|
|
47
|
+
if (!bybitJson) {
|
|
48
|
+
console.error("Invalid ByBit API Key Info response", bybitJson);
|
|
49
|
+
throw new Error("Invalid ByBit API Key Info response");
|
|
50
|
+
}
|
|
51
|
+
return bybitJson;
|
|
52
|
+
}
|
|
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 } = credentials;
|
|
197
|
+
const requestBody = JSON.stringify(payload);
|
|
198
|
+
const { signature, timestamp } = signBybitRequest({
|
|
199
|
+
credentials,
|
|
200
|
+
queryString: requestBody,
|
|
201
|
+
timeOffset
|
|
202
|
+
});
|
|
203
|
+
let bybitRes;
|
|
204
|
+
try {
|
|
205
|
+
bybitRes = await fetch(
|
|
206
|
+
`${BYBIT_CONSTANTS.baseUrl}/v5/account/demo-apply-money`,
|
|
207
|
+
{
|
|
208
|
+
method: "POST",
|
|
209
|
+
headers: {
|
|
210
|
+
"Content-Type": "application/json",
|
|
211
|
+
"X-BAPI-API-KEY": apiKey,
|
|
212
|
+
"X-BAPI-SIGN": signature,
|
|
213
|
+
"X-BAPI-SIGN-TYPE": "2",
|
|
214
|
+
"X-BAPI-TIMESTAMP": timestamp,
|
|
215
|
+
"X-BAPI-RECV-WINDOW": BYBIT_CONSTANTS.recvWindowTimeoutMs
|
|
216
|
+
},
|
|
217
|
+
body: requestBody,
|
|
218
|
+
signal: AbortSignal.timeout(BYBIT_CONSTANTS.fetchTimeoutMs),
|
|
219
|
+
cache: "no-store"
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
} catch (error) {
|
|
223
|
+
throw new Error("ByBit Apply Money API network error", { cause: error });
|
|
224
|
+
}
|
|
225
|
+
if (!bybitRes.ok) {
|
|
226
|
+
throw new Error("ByBit Apply Money API request failed");
|
|
227
|
+
}
|
|
228
|
+
const bybitJson = await bybitRes.json();
|
|
229
|
+
if (bybitJson.retCode !== 0) {
|
|
230
|
+
throw new Error(bybitJson.retMsg ?? "ByBit error");
|
|
231
|
+
}
|
|
232
|
+
return bybitJson;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// src/providers/bybit/get-server-time.ts
|
|
236
|
+
async function getServerTime() {
|
|
237
|
+
let bybitRes;
|
|
238
|
+
try {
|
|
239
|
+
bybitRes = await fetch(
|
|
240
|
+
`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,
|
|
241
|
+
{
|
|
242
|
+
cache: "no-store"
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error("ByBit Server Time network error", error);
|
|
247
|
+
throw new Error("ByBit Server Time network error", { cause: error });
|
|
248
|
+
}
|
|
249
|
+
if (!bybitRes.ok) {
|
|
250
|
+
console.error("ByBit Server Time request failed", bybitRes.status, bybitRes.statusText);
|
|
251
|
+
throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);
|
|
252
|
+
}
|
|
253
|
+
let bybitJson;
|
|
254
|
+
try {
|
|
255
|
+
bybitJson = await bybitRes.json();
|
|
256
|
+
} catch (error) {
|
|
257
|
+
console.error("Invalid ByBit Server Time response", error);
|
|
258
|
+
throw new Error("Invalid ByBit Server Time response", { cause: error });
|
|
259
|
+
}
|
|
260
|
+
if (!bybitJson) {
|
|
261
|
+
throw new Error("Invalid ByBit Server Time response");
|
|
262
|
+
}
|
|
263
|
+
if (bybitJson.retCode !== 0) {
|
|
264
|
+
console.error("ByBit Server Time API error", bybitJson);
|
|
265
|
+
throw new Error(bybitJson.retMsg ?? "ByBit server time error");
|
|
266
|
+
}
|
|
267
|
+
return bybitJson;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// src/utils/bybitHelper.ts
|
|
271
|
+
var BYBIT_RECV_WINDOW_TIMEOUT_MS = process$1.env.NEXT_PUBLIC_BYBIT_RECV_WINDOW_TIMEOUT_MS ?? "20000";
|
|
272
|
+
function signBybitRequest(request) {
|
|
273
|
+
const { credentials, queryString, timeOffset } = request;
|
|
274
|
+
const { apiSecret, apiKey } = credentials;
|
|
275
|
+
const timestamp = getBybitTimestamp(timeOffset);
|
|
276
|
+
console.log("Bybit server time timestamp:", timestamp);
|
|
277
|
+
const payload = `${timestamp}${apiKey}${BYBIT_RECV_WINDOW_TIMEOUT_MS}${queryString ?? ""}`;
|
|
278
|
+
const signature = crypto.createHmac("sha256", apiSecret).update(payload).digest("hex");
|
|
279
|
+
return { signature, timestamp };
|
|
280
|
+
}
|
|
281
|
+
async function syncBybitServerTime() {
|
|
282
|
+
const requestStart = Date.now();
|
|
283
|
+
const { result } = await getServerTime();
|
|
284
|
+
const requestEnd = Date.now();
|
|
285
|
+
const serverTime = Number(result.timeSecond) * 1e3;
|
|
286
|
+
const localMidpoint = requestStart + (requestEnd - requestStart) / 2;
|
|
287
|
+
const bybitTimeOffset = serverTime - localMidpoint;
|
|
288
|
+
console.log({
|
|
289
|
+
serverTime,
|
|
290
|
+
requestStart,
|
|
291
|
+
requestEnd,
|
|
292
|
+
latency: requestEnd - requestStart,
|
|
293
|
+
bybitTimeOffset
|
|
294
|
+
});
|
|
295
|
+
return bybitTimeOffset;
|
|
296
|
+
}
|
|
297
|
+
function getBybitTimestamp(timeOffset = 0) {
|
|
298
|
+
return String(Date.now() + timeOffset - 250);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// src/clients/BybitClient.ts
|
|
302
|
+
var BybitClient = class {
|
|
303
|
+
timeOffset = 0;
|
|
304
|
+
ready;
|
|
305
|
+
constructor() {
|
|
306
|
+
this.ready = (async () => {
|
|
307
|
+
this.timeOffset = await syncBybitServerTime();
|
|
308
|
+
})();
|
|
309
|
+
}
|
|
310
|
+
async applyDemoMoney(credentials, payload) {
|
|
311
|
+
await this.ready;
|
|
312
|
+
return await applyDemoMoney(credentials, payload, this.timeOffset);
|
|
313
|
+
}
|
|
314
|
+
async getAccountInfo(credentials) {
|
|
315
|
+
await this.ready;
|
|
316
|
+
return await getAccountInfo(credentials, this.timeOffset);
|
|
317
|
+
}
|
|
318
|
+
async getApiKeyInfo(credentials) {
|
|
319
|
+
await this.ready;
|
|
320
|
+
return await getApiKeyInfo(credentials, this.timeOffset);
|
|
321
|
+
}
|
|
322
|
+
async getClosedPnl(credentials, payload) {
|
|
323
|
+
await this.ready;
|
|
324
|
+
return await getClosedPnl(credentials, payload, this.timeOffset);
|
|
325
|
+
}
|
|
326
|
+
async getWalletBalance(credentials) {
|
|
327
|
+
await this.ready;
|
|
328
|
+
return await getWalletBalance(credentials, this.timeOffset);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
exports.BybitClient = BybitClient;
|
|
333
|
+
//# sourceMappingURL=index.cjs.map
|
|
334
|
+
//# sourceMappingURL=index.cjs.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/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 } = credentials;\n\n const requestBody = JSON.stringify(payload);\n const { signature, timestamp } = signBybitRequest({\n credentials,\n queryString: requestBody,\n timeOffset \n });\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"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IBybitCredentials, IBybitDemoApplyMoneyRequest, IBybitApiResponse, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitAccountInfo, IBybitApiKeyInfo, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitWalletAccount } from '../types/bybit/index.cjs';
|
|
2
|
+
import '../enums--bdw39rp.cjs';
|
|
3
|
+
|
|
4
|
+
declare class BybitClient {
|
|
5
|
+
private timeOffset;
|
|
6
|
+
private readonly ready;
|
|
7
|
+
constructor();
|
|
8
|
+
applyDemoMoney(credentials: IBybitCredentials, payload: IBybitDemoApplyMoneyRequest): Promise<IBybitApiResponse<IBybitDemoApplyMoney>>;
|
|
9
|
+
getAccountInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitAccountInfo>>;
|
|
10
|
+
getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
|
|
11
|
+
getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
|
|
12
|
+
getWalletBalance(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitWalletAccount>>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { BybitClient };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IBybitCredentials, IBybitDemoApplyMoneyRequest, IBybitApiResponse, IBybitDemoApplyMoneyResponse as IBybitDemoApplyMoney, IBybitAccountInfo, IBybitApiKeyInfo, IBybitClosedPnlRequest, IBybitApiResponseList, IBybitClosedPnl, IBybitWalletAccount } from '../types/bybit/index.js';
|
|
2
|
+
import '../enums--bdw39rp.js';
|
|
3
|
+
|
|
4
|
+
declare class BybitClient {
|
|
5
|
+
private timeOffset;
|
|
6
|
+
private readonly ready;
|
|
7
|
+
constructor();
|
|
8
|
+
applyDemoMoney(credentials: IBybitCredentials, payload: IBybitDemoApplyMoneyRequest): Promise<IBybitApiResponse<IBybitDemoApplyMoney>>;
|
|
9
|
+
getAccountInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitAccountInfo>>;
|
|
10
|
+
getApiKeyInfo(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitApiKeyInfo>>;
|
|
11
|
+
getClosedPnl(credentials: IBybitCredentials, payload: IBybitClosedPnlRequest): Promise<IBybitApiResponse<IBybitApiResponseList<IBybitClosedPnl>>>;
|
|
12
|
+
getWalletBalance(credentials: IBybitCredentials): Promise<IBybitApiResponse<IBybitWalletAccount>>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { BybitClient };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
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, 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({
|
|
@@ -247,10 +247,11 @@ 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
|
|
250
|
+
const { apiKey } = credentials;
|
|
251
251
|
const requestBody = JSON.stringify(payload);
|
|
252
252
|
const { signature, timestamp } = signBybitRequest({
|
|
253
253
|
credentials,
|
|
254
|
+
queryString: requestBody,
|
|
254
255
|
timeOffset
|
|
255
256
|
});
|
|
256
257
|
let bybitRes;
|
|
@@ -351,29 +352,34 @@ function getBybitTimestamp(timeOffset = 0) {
|
|
|
351
352
|
return String(Date.now() + timeOffset - 250);
|
|
352
353
|
}
|
|
353
354
|
|
|
354
|
-
// src/
|
|
355
|
+
// src/clients/BybitClient.ts
|
|
355
356
|
var BybitClient = class {
|
|
356
|
-
credentials;
|
|
357
357
|
timeOffset = 0;
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
(async () => {
|
|
358
|
+
ready;
|
|
359
|
+
constructor() {
|
|
360
|
+
this.ready = (async () => {
|
|
361
361
|
this.timeOffset = await syncBybitServerTime();
|
|
362
362
|
})();
|
|
363
363
|
}
|
|
364
|
-
async applyDemoMoney() {
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
async applyDemoMoney(credentials, payload) {
|
|
365
|
+
await this.ready;
|
|
366
|
+
return await applyDemoMoney(credentials, payload, this.timeOffset);
|
|
367
367
|
}
|
|
368
|
-
async
|
|
369
|
-
|
|
370
|
-
return await
|
|
368
|
+
async getAccountInfo(credentials) {
|
|
369
|
+
await this.ready;
|
|
370
|
+
return await getAccountInfo(credentials, this.timeOffset);
|
|
371
371
|
}
|
|
372
|
-
async
|
|
372
|
+
async getApiKeyInfo(credentials) {
|
|
373
|
+
await this.ready;
|
|
374
|
+
return await getApiKeyInfo(credentials, this.timeOffset);
|
|
373
375
|
}
|
|
374
|
-
async
|
|
376
|
+
async getClosedPnl(credentials, payload) {
|
|
377
|
+
await this.ready;
|
|
378
|
+
return await getClosedPnl(credentials, payload, this.timeOffset);
|
|
375
379
|
}
|
|
376
|
-
async getWalletBalance() {
|
|
380
|
+
async getWalletBalance(credentials) {
|
|
381
|
+
await this.ready;
|
|
382
|
+
return await getWalletBalance(credentials, this.timeOffset);
|
|
377
383
|
}
|
|
378
384
|
};
|
|
379
385
|
|