ccxt 4.2.75 → 4.2.77
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 +5 -5
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +1004 -616
- package/dist/ccxt.browser.min.js +7 -7
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +6 -0
- package/dist/cjs/src/binance.js +504 -443
- package/dist/cjs/src/bingx.js +13 -15
- package/dist/cjs/src/blofin.js +14 -2
- package/dist/cjs/src/bybit.js +102 -59
- package/dist/cjs/src/coinbase.js +19 -3
- package/dist/cjs/src/coinbaseinternational.js +1 -1
- package/dist/cjs/src/delta.js +66 -49
- package/dist/cjs/src/gate.js +1 -0
- package/dist/cjs/src/htx.js +1 -0
- package/dist/cjs/src/hyperliquid.js +1 -1
- package/dist/cjs/src/kraken.js +8 -8
- package/dist/cjs/src/kucoin.js +152 -5
- package/dist/cjs/src/pro/ascendex.js +1 -1
- package/dist/cjs/src/pro/bitvavo.js +1 -1
- package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
- package/dist/cjs/src/pro/coinex.js +20 -14
- package/dist/cjs/src/pro/deribit.js +1 -1
- package/dist/cjs/src/pro/exmo.js +1 -1
- package/dist/cjs/src/pro/krakenfutures.js +1 -1
- package/dist/cjs/src/pro/phemex.js +1 -1
- package/dist/cjs/src/pro/poloniex.js +1 -1
- package/dist/cjs/src/pro/probit.js +1 -1
- package/dist/cjs/src/pro/woo.js +61 -6
- package/dist/cjs/src/woo.js +25 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/binance.d.ts +1 -0
- package/js/src/abstract/binancecoinm.d.ts +1 -0
- package/js/src/abstract/binanceus.d.ts +1 -0
- package/js/src/abstract/binanceusdm.d.ts +1 -0
- package/js/src/abstract/bingx.d.ts +2 -0
- package/js/src/abstract/kucoin.d.ts +1 -0
- package/js/src/abstract/kucoinfutures.d.ts +1 -0
- package/js/src/base/Exchange.d.ts +3 -3
- package/js/src/base/Exchange.js +6 -0
- package/js/src/base/types.d.ts +1 -1
- package/js/src/binance.d.ts +2 -2
- package/js/src/binance.js +504 -443
- package/js/src/bingx.js +13 -15
- package/js/src/bitflyer.d.ts +2 -2
- package/js/src/bithumb.d.ts +2 -2
- package/js/src/blofin.js +14 -2
- package/js/src/bybit.d.ts +1 -1
- package/js/src/bybit.js +102 -59
- package/js/src/coinbase.js +19 -3
- package/js/src/coinbaseinternational.js +1 -1
- package/js/src/delta.d.ts +2 -1
- package/js/src/delta.js +66 -49
- package/js/src/deribit.d.ts +1 -1
- package/js/src/gate.d.ts +1 -1
- package/js/src/gate.js +1 -0
- package/js/src/htx.js +1 -0
- package/js/src/hyperliquid.js +1 -1
- package/js/src/kraken.js +8 -8
- package/js/src/kucoin.d.ts +4 -1
- package/js/src/kucoin.js +152 -5
- package/js/src/okx.d.ts +1 -1
- package/js/src/pro/ascendex.js +1 -1
- package/js/src/pro/bitvavo.js +1 -1
- package/js/src/pro/coinbaseinternational.js +1 -1
- package/js/src/pro/coinex.js +20 -14
- package/js/src/pro/deribit.js +1 -1
- package/js/src/pro/exmo.js +1 -1
- package/js/src/pro/krakenfutures.js +1 -1
- package/js/src/pro/phemex.js +1 -1
- package/js/src/pro/poloniex.js +1 -1
- package/js/src/pro/probit.js +1 -1
- package/js/src/pro/woo.d.ts +1 -0
- package/js/src/pro/woo.js +61 -6
- package/js/src/woo.js +25 -0
- package/package.json +1 -1
- package/skip-tests.json +1 -2
package/js/src/kucoin.js
CHANGED
|
@@ -55,8 +55,8 @@ export default class kucoin extends Exchange {
|
|
|
55
55
|
'fetchAccounts': true,
|
|
56
56
|
'fetchBalance': true,
|
|
57
57
|
'fetchBorrowInterest': true,
|
|
58
|
-
'fetchBorrowRateHistories':
|
|
59
|
-
'fetchBorrowRateHistory':
|
|
58
|
+
'fetchBorrowRateHistories': true,
|
|
59
|
+
'fetchBorrowRateHistory': true,
|
|
60
60
|
'fetchClosedOrders': true,
|
|
61
61
|
'fetchCrossBorrowRate': false,
|
|
62
62
|
'fetchCrossBorrowRates': false,
|
|
@@ -230,6 +230,7 @@ export default class kucoin extends Exchange {
|
|
|
230
230
|
'isolated/account/{symbol}': 50,
|
|
231
231
|
'margin/borrow': 15,
|
|
232
232
|
'margin/repay': 15,
|
|
233
|
+
'margin/interest': 20,
|
|
233
234
|
'project/list': 10,
|
|
234
235
|
'project/marketInterestRate': 7.5,
|
|
235
236
|
'redeem/orders': 10,
|
|
@@ -591,6 +592,7 @@ export default class kucoin extends Exchange {
|
|
|
591
592
|
'margin/currencies': 'v3',
|
|
592
593
|
'margin/borrow': 'v3',
|
|
593
594
|
'margin/repay': 'v3',
|
|
595
|
+
'margin/interest': 'v3',
|
|
594
596
|
'project/list': 'v3',
|
|
595
597
|
'project/marketInterestRate': 'v3',
|
|
596
598
|
'redeem/orders': 'v3',
|
|
@@ -4045,12 +4047,19 @@ export default class kucoin extends Exchange {
|
|
|
4045
4047
|
// "timestamp": 1658531274508488480
|
|
4046
4048
|
// },
|
|
4047
4049
|
//
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
+
// {
|
|
4051
|
+
// "createdAt": 1697783812257,
|
|
4052
|
+
// "currency": "XMR",
|
|
4053
|
+
// "interestAmount": "0.1",
|
|
4054
|
+
// "dayRatio": "0.001"
|
|
4055
|
+
// }
|
|
4056
|
+
//
|
|
4057
|
+
const timestampId = this.safeString2(info, 'createdAt', 'timestamp');
|
|
4058
|
+
const timestamp = this.parseToInt(timestampId.slice(0, 13));
|
|
4050
4059
|
const currencyId = this.safeString(info, 'currency');
|
|
4051
4060
|
return {
|
|
4052
4061
|
'currency': this.safeCurrencyCode(currencyId, currency),
|
|
4053
|
-
'rate': this.
|
|
4062
|
+
'rate': this.safeNumber2(info, 'dailyIntRate', 'dayRatio'),
|
|
4054
4063
|
'period': 86400000,
|
|
4055
4064
|
'timestamp': timestamp,
|
|
4056
4065
|
'datetime': this.iso8601(timestamp),
|
|
@@ -4234,6 +4243,144 @@ export default class kucoin extends Exchange {
|
|
|
4234
4243
|
'info': info,
|
|
4235
4244
|
};
|
|
4236
4245
|
}
|
|
4246
|
+
async fetchBorrowRateHistories(codes = undefined, since = undefined, limit = undefined, params = {}) {
|
|
4247
|
+
/**
|
|
4248
|
+
* @method
|
|
4249
|
+
* @name kucoin#fetchBorrowRateHistories
|
|
4250
|
+
* @description retrieves a history of a multiple currencies borrow interest rate at specific time slots, returns all currencies if no symbols passed, default is undefined
|
|
4251
|
+
* @see https://www.kucoin.com/docs/rest/margin-trading/margin-trading-v3-/get-cross-isolated-margin-interest-records
|
|
4252
|
+
* @param {string[]|undefined} codes list of unified currency codes, default is undefined
|
|
4253
|
+
* @param {int} [since] timestamp in ms of the earliest borrowRate, default is undefined
|
|
4254
|
+
* @param {int} [limit] max number of borrow rate prices to return, default is undefined
|
|
4255
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
4256
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated' default is 'cross'
|
|
4257
|
+
* @param {int} [params.until] the latest time in ms to fetch entries for
|
|
4258
|
+
* @returns {object} a dictionary of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} indexed by the market symbol
|
|
4259
|
+
*/
|
|
4260
|
+
await this.loadMarkets();
|
|
4261
|
+
const marginResult = this.handleMarginModeAndParams('fetchBorrowRateHistories', params);
|
|
4262
|
+
const marginMode = this.safeString(marginResult, 0, 'cross');
|
|
4263
|
+
const isIsolated = (marginMode === 'isolated'); // true-isolated, false-cross
|
|
4264
|
+
let request = {
|
|
4265
|
+
'isIsolated': isIsolated,
|
|
4266
|
+
};
|
|
4267
|
+
if (since !== undefined) {
|
|
4268
|
+
request['startTime'] = since;
|
|
4269
|
+
}
|
|
4270
|
+
[request, params] = this.handleUntilOption('endTime', request, params);
|
|
4271
|
+
if (limit !== undefined) {
|
|
4272
|
+
request['pageSize'] = limit; // default:50, min:10, max:500
|
|
4273
|
+
}
|
|
4274
|
+
const response = await this.privateGetMarginInterest(this.extend(request, params));
|
|
4275
|
+
//
|
|
4276
|
+
// {
|
|
4277
|
+
// "code": "200000",
|
|
4278
|
+
// "data": {
|
|
4279
|
+
// "timestamp": 1710829939673,
|
|
4280
|
+
// "currentPage": 1,
|
|
4281
|
+
// "pageSize": 50,
|
|
4282
|
+
// "totalNum": 0,
|
|
4283
|
+
// "totalPage": 0,
|
|
4284
|
+
// "items": [
|
|
4285
|
+
// {
|
|
4286
|
+
// "createdAt": 1697783812257,
|
|
4287
|
+
// "currency": "XMR",
|
|
4288
|
+
// "interestAmount": "0.1",
|
|
4289
|
+
// "dayRatio": "0.001"
|
|
4290
|
+
// }
|
|
4291
|
+
// ]
|
|
4292
|
+
// }
|
|
4293
|
+
// }
|
|
4294
|
+
//
|
|
4295
|
+
const data = this.safeDict(response, 'data');
|
|
4296
|
+
const rows = this.safeList(data, 'items');
|
|
4297
|
+
return this.parseBorrowRateHistories(rows, codes, since, limit);
|
|
4298
|
+
}
|
|
4299
|
+
async fetchBorrowRateHistory(code, since = undefined, limit = undefined, params = {}) {
|
|
4300
|
+
/**
|
|
4301
|
+
* @method
|
|
4302
|
+
* @name kucoin#fetchBorrowRateHistory
|
|
4303
|
+
* @description retrieves a history of a currencies borrow interest rate at specific time slots
|
|
4304
|
+
* @see https://www.kucoin.com/docs/rest/margin-trading/margin-trading-v3-/get-cross-isolated-margin-interest-records
|
|
4305
|
+
* @param {string} code unified currency code
|
|
4306
|
+
* @param {int} [since] timestamp for the earliest borrow rate
|
|
4307
|
+
* @param {int} [limit] the maximum number of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} to retrieve
|
|
4308
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
4309
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated' default is 'cross'
|
|
4310
|
+
* @param {int} [params.until] the latest time in ms to fetch entries for
|
|
4311
|
+
* @returns {object[]} an array of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure}
|
|
4312
|
+
*/
|
|
4313
|
+
await this.loadMarkets();
|
|
4314
|
+
const marginResult = this.handleMarginModeAndParams('fetchBorrowRateHistories', params);
|
|
4315
|
+
const marginMode = this.safeString(marginResult, 0, 'cross');
|
|
4316
|
+
const isIsolated = (marginMode === 'isolated'); // true-isolated, false-cross
|
|
4317
|
+
const currency = this.currency(code);
|
|
4318
|
+
let request = {
|
|
4319
|
+
'isIsolated': isIsolated,
|
|
4320
|
+
'currency': currency['id'],
|
|
4321
|
+
};
|
|
4322
|
+
if (since !== undefined) {
|
|
4323
|
+
request['startTime'] = since;
|
|
4324
|
+
}
|
|
4325
|
+
[request, params] = this.handleUntilOption('endTime', request, params);
|
|
4326
|
+
if (limit !== undefined) {
|
|
4327
|
+
request['pageSize'] = limit; // default:50, min:10, max:500
|
|
4328
|
+
}
|
|
4329
|
+
const response = await this.privateGetMarginInterest(this.extend(request, params));
|
|
4330
|
+
//
|
|
4331
|
+
// {
|
|
4332
|
+
// "code": "200000",
|
|
4333
|
+
// "data": {
|
|
4334
|
+
// "timestamp": 1710829939673,
|
|
4335
|
+
// "currentPage": 1,
|
|
4336
|
+
// "pageSize": 50,
|
|
4337
|
+
// "totalNum": 0,
|
|
4338
|
+
// "totalPage": 0,
|
|
4339
|
+
// "items": [
|
|
4340
|
+
// {
|
|
4341
|
+
// "createdAt": 1697783812257,
|
|
4342
|
+
// "currency": "XMR",
|
|
4343
|
+
// "interestAmount": "0.1",
|
|
4344
|
+
// "dayRatio": "0.001"
|
|
4345
|
+
// }
|
|
4346
|
+
// ]
|
|
4347
|
+
// }
|
|
4348
|
+
// }
|
|
4349
|
+
//
|
|
4350
|
+
const data = this.safeDict(response, 'data');
|
|
4351
|
+
const rows = this.safeList(data, 'items');
|
|
4352
|
+
return this.parseBorrowRateHistory(rows, code, since, limit);
|
|
4353
|
+
}
|
|
4354
|
+
parseBorrowRateHistories(response, codes, since, limit) {
|
|
4355
|
+
//
|
|
4356
|
+
// [
|
|
4357
|
+
// {
|
|
4358
|
+
// "createdAt": 1697783812257,
|
|
4359
|
+
// "currency": "XMR",
|
|
4360
|
+
// "interestAmount": "0.1",
|
|
4361
|
+
// "dayRatio": "0.001"
|
|
4362
|
+
// }
|
|
4363
|
+
// ]
|
|
4364
|
+
//
|
|
4365
|
+
const borrowRateHistories = {};
|
|
4366
|
+
for (let i = 0; i < response.length; i++) {
|
|
4367
|
+
const item = response[i];
|
|
4368
|
+
const code = this.safeCurrencyCode(this.safeString(item, 'currency'));
|
|
4369
|
+
if (codes === undefined || this.inArray(code, codes)) {
|
|
4370
|
+
if (!(code in borrowRateHistories)) {
|
|
4371
|
+
borrowRateHistories[code] = [];
|
|
4372
|
+
}
|
|
4373
|
+
const borrowRateStructure = this.parseBorrowRate(item);
|
|
4374
|
+
borrowRateHistories[code].push(borrowRateStructure);
|
|
4375
|
+
}
|
|
4376
|
+
}
|
|
4377
|
+
const keys = Object.keys(borrowRateHistories);
|
|
4378
|
+
for (let i = 0; i < keys.length; i++) {
|
|
4379
|
+
const code = keys[i];
|
|
4380
|
+
borrowRateHistories[code] = this.filterByCurrencySinceLimit(borrowRateHistories[code], code, since, limit);
|
|
4381
|
+
}
|
|
4382
|
+
return borrowRateHistories;
|
|
4383
|
+
}
|
|
4237
4384
|
async borrowCrossMargin(code, amount, params = {}) {
|
|
4238
4385
|
/**
|
|
4239
4386
|
* @method
|
package/js/src/okx.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export default class okx extends Exchange {
|
|
|
10
10
|
convertToInstrumentType(type: any): string;
|
|
11
11
|
convertExpireDate(date: any): string;
|
|
12
12
|
createExpiredOptionMarket(symbol: string): MarketInterface;
|
|
13
|
-
safeMarket(marketId?:
|
|
13
|
+
safeMarket(marketId?: Str, market?: Market, delimiter?: Str, marketType?: Str): MarketInterface;
|
|
14
14
|
fetchStatus(params?: {}): Promise<{
|
|
15
15
|
updated: any;
|
|
16
16
|
status: string;
|
package/js/src/pro/ascendex.js
CHANGED
|
@@ -964,7 +964,7 @@ export default class ascendex extends ascendexRest {
|
|
|
964
964
|
'key': this.apiKey,
|
|
965
965
|
'sig': signature,
|
|
966
966
|
};
|
|
967
|
-
future = this.watch(url, messageHash, this.extend(request, params));
|
|
967
|
+
future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
968
968
|
client.subscriptions[messageHash] = future;
|
|
969
969
|
}
|
|
970
970
|
return future;
|
package/js/src/pro/bitvavo.js
CHANGED
|
@@ -1215,7 +1215,7 @@ export default class bitvavo extends bitvavoRest {
|
|
|
1215
1215
|
'timestamp': timestamp,
|
|
1216
1216
|
};
|
|
1217
1217
|
const message = this.extend(request, params);
|
|
1218
|
-
future = this.watch(url, messageHash, message);
|
|
1218
|
+
future = await this.watch(url, messageHash, message, messageHash);
|
|
1219
1219
|
client.subscriptions[messageHash] = future;
|
|
1220
1220
|
}
|
|
1221
1221
|
return future;
|
package/js/src/pro/coinex.js
CHANGED
|
@@ -1019,8 +1019,12 @@ export default class coinex extends coinexRest {
|
|
|
1019
1019
|
//
|
|
1020
1020
|
const messageHashSpot = 'authenticated:spot';
|
|
1021
1021
|
const messageHashSwap = 'authenticated:swap';
|
|
1022
|
-
client.resolve(message, messageHashSpot);
|
|
1023
|
-
client.resolve(message, messageHashSwap);
|
|
1022
|
+
// client.resolve (message, messageHashSpot);
|
|
1023
|
+
// client.resolve (message, messageHashSwap);
|
|
1024
|
+
const spotFuture = this.safeValue(client.futures, messageHashSpot);
|
|
1025
|
+
spotFuture.resolve(true);
|
|
1026
|
+
const swapFutures = this.safeValue(client.futures, messageHashSwap);
|
|
1027
|
+
swapFutures.resolve(true);
|
|
1024
1028
|
return message;
|
|
1025
1029
|
}
|
|
1026
1030
|
handleSubscriptionStatus(client, message) {
|
|
@@ -1045,16 +1049,20 @@ export default class coinex extends coinexRest {
|
|
|
1045
1049
|
const url = this.urls['api']['ws'][type];
|
|
1046
1050
|
const client = this.client(url);
|
|
1047
1051
|
const time = this.milliseconds();
|
|
1052
|
+
const isSpot = (type === 'spot');
|
|
1053
|
+
const spotMessageHash = 'authenticated:spot';
|
|
1054
|
+
const swapMessageHash = 'authenticated:swap';
|
|
1055
|
+
const messageHash = isSpot ? spotMessageHash : swapMessageHash;
|
|
1056
|
+
const future = client.future(messageHash);
|
|
1057
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
1048
1058
|
if (type === 'spot') {
|
|
1049
|
-
|
|
1050
|
-
let future = this.safeValue(client.subscriptions, messageHash);
|
|
1051
|
-
if (future !== undefined) {
|
|
1059
|
+
if (authenticated !== undefined) {
|
|
1052
1060
|
return await future;
|
|
1053
1061
|
}
|
|
1054
1062
|
const requestId = this.requestId();
|
|
1055
1063
|
const subscribe = {
|
|
1056
1064
|
'id': requestId,
|
|
1057
|
-
'future':
|
|
1065
|
+
'future': spotMessageHash,
|
|
1058
1066
|
};
|
|
1059
1067
|
const signData = 'access_id=' + this.apiKey + '&tonce=' + this.numberToString(time) + '&secret_key=' + this.secret;
|
|
1060
1068
|
const hash = this.hash(this.encode(signData), md5);
|
|
@@ -1067,20 +1075,18 @@ export default class coinex extends coinexRest {
|
|
|
1067
1075
|
],
|
|
1068
1076
|
'id': requestId,
|
|
1069
1077
|
};
|
|
1070
|
-
|
|
1071
|
-
client.subscriptions[messageHash] =
|
|
1078
|
+
this.watch(url, messageHash, request, requestId, subscribe);
|
|
1079
|
+
client.subscriptions[messageHash] = true;
|
|
1072
1080
|
return await future;
|
|
1073
1081
|
}
|
|
1074
1082
|
else {
|
|
1075
|
-
|
|
1076
|
-
let future = this.safeValue(client.subscriptions, messageHash);
|
|
1077
|
-
if (future !== undefined) {
|
|
1083
|
+
if (authenticated !== undefined) {
|
|
1078
1084
|
return await future;
|
|
1079
1085
|
}
|
|
1080
1086
|
const requestId = this.requestId();
|
|
1081
1087
|
const subscribe = {
|
|
1082
1088
|
'id': requestId,
|
|
1083
|
-
'future':
|
|
1089
|
+
'future': swapMessageHash,
|
|
1084
1090
|
};
|
|
1085
1091
|
const signData = 'access_id=' + this.apiKey + '×tamp=' + this.numberToString(time) + '&secret_key=' + this.secret;
|
|
1086
1092
|
const hash = this.hash(this.encode(signData), sha256, 'hex');
|
|
@@ -1093,8 +1099,8 @@ export default class coinex extends coinexRest {
|
|
|
1093
1099
|
],
|
|
1094
1100
|
'id': requestId,
|
|
1095
1101
|
};
|
|
1096
|
-
|
|
1097
|
-
client.subscriptions[messageHash] =
|
|
1102
|
+
this.watch(url, messageHash, request, requestId, subscribe);
|
|
1103
|
+
client.subscriptions[messageHash] = true;
|
|
1098
1104
|
return await future;
|
|
1099
1105
|
}
|
|
1100
1106
|
}
|
package/js/src/pro/deribit.js
CHANGED
|
@@ -937,7 +937,7 @@ export default class deribit extends deribitRest {
|
|
|
937
937
|
'data': '',
|
|
938
938
|
},
|
|
939
939
|
};
|
|
940
|
-
future = this.watch(url, messageHash, this.extend(request, params));
|
|
940
|
+
future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
941
941
|
client.subscriptions[messageHash] = future;
|
|
942
942
|
}
|
|
943
943
|
return future;
|
package/js/src/pro/exmo.js
CHANGED
|
@@ -653,7 +653,7 @@ export default class exmo extends exmoRest {
|
|
|
653
653
|
'nonce': time,
|
|
654
654
|
};
|
|
655
655
|
const message = this.extend(request, query);
|
|
656
|
-
future = this.watch(url, messageHash, message);
|
|
656
|
+
future = await this.watch(url, messageHash, message, messageHash);
|
|
657
657
|
client.subscriptions[messageHash] = future;
|
|
658
658
|
}
|
|
659
659
|
return future;
|
|
@@ -89,7 +89,7 @@ export default class krakenfutures extends krakenfuturesRest {
|
|
|
89
89
|
'api_key': this.apiKey,
|
|
90
90
|
};
|
|
91
91
|
const message = this.extend(request, params);
|
|
92
|
-
future = await this.watch(url, messageHash, message);
|
|
92
|
+
future = await this.watch(url, messageHash, message, messageHash);
|
|
93
93
|
client.subscriptions[messageHash] = future;
|
|
94
94
|
}
|
|
95
95
|
return future;
|
package/js/src/pro/phemex.js
CHANGED
|
@@ -1509,7 +1509,7 @@ export default class phemex extends phemexRest {
|
|
|
1509
1509
|
if (!(messageHash in client.subscriptions)) {
|
|
1510
1510
|
client.subscriptions[subscriptionHash] = this.handleAuthenticate;
|
|
1511
1511
|
}
|
|
1512
|
-
future = this.watch(url, messageHash, message);
|
|
1512
|
+
future = await this.watch(url, messageHash, message, messageHash);
|
|
1513
1513
|
client.subscriptions[messageHash] = future;
|
|
1514
1514
|
}
|
|
1515
1515
|
return future;
|
package/js/src/pro/poloniex.js
CHANGED
|
@@ -106,7 +106,7 @@ export default class poloniex extends poloniexRest {
|
|
|
106
106
|
},
|
|
107
107
|
};
|
|
108
108
|
const message = this.extend(request, params);
|
|
109
|
-
future = await this.watch(url, messageHash, message);
|
|
109
|
+
future = await this.watch(url, messageHash, message, messageHash);
|
|
110
110
|
//
|
|
111
111
|
// {
|
|
112
112
|
// "data": {
|
package/js/src/pro/probit.js
CHANGED
|
@@ -583,7 +583,7 @@ export default class probit extends probitRest {
|
|
|
583
583
|
'type': 'authorization',
|
|
584
584
|
'token': accessToken,
|
|
585
585
|
};
|
|
586
|
-
future = this.watch(url, messageHash, this.extend(request, params));
|
|
586
|
+
future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
587
587
|
client.subscriptions[messageHash] = future;
|
|
588
588
|
}
|
|
589
589
|
return future;
|
package/js/src/pro/woo.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export default class woo extends wooRest {
|
|
|
30
30
|
handlePositions(client: any, message: any): void;
|
|
31
31
|
watchBalance(params?: {}): Promise<Balances>;
|
|
32
32
|
handleBalance(client: any, message: any): void;
|
|
33
|
+
handleErrorMessage(client: Client, message: any): boolean;
|
|
33
34
|
handleMessage(client: Client, message: any): void;
|
|
34
35
|
ping(client: Client): {
|
|
35
36
|
event: string;
|
package/js/src/pro/woo.js
CHANGED
|
@@ -58,6 +58,13 @@ export default class woo extends wooRest {
|
|
|
58
58
|
'ping': this.ping,
|
|
59
59
|
'keepAlive': 10000,
|
|
60
60
|
},
|
|
61
|
+
'exceptions': {
|
|
62
|
+
'ws': {
|
|
63
|
+
'exact': {
|
|
64
|
+
'Auth is needed.': AuthenticationError,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
61
68
|
});
|
|
62
69
|
}
|
|
63
70
|
requestId(url) {
|
|
@@ -419,8 +426,9 @@ export default class woo extends wooRest {
|
|
|
419
426
|
const client = this.client(url);
|
|
420
427
|
const messageHash = 'authenticated';
|
|
421
428
|
const event = 'auth';
|
|
422
|
-
|
|
423
|
-
|
|
429
|
+
const future = client.future(messageHash);
|
|
430
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
431
|
+
if (authenticated === undefined) {
|
|
424
432
|
const ts = this.nonce().toString();
|
|
425
433
|
const auth = '|' + ts;
|
|
426
434
|
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256);
|
|
@@ -433,10 +441,9 @@ export default class woo extends wooRest {
|
|
|
433
441
|
},
|
|
434
442
|
};
|
|
435
443
|
const message = this.extend(request, params);
|
|
436
|
-
|
|
437
|
-
client.subscriptions[messageHash] = future;
|
|
444
|
+
this.watch(url, messageHash, message, messageHash);
|
|
438
445
|
}
|
|
439
|
-
return future;
|
|
446
|
+
return await future;
|
|
440
447
|
}
|
|
441
448
|
async watchPrivate(messageHash, message, params = {}) {
|
|
442
449
|
await this.authenticate(params);
|
|
@@ -449,6 +456,16 @@ export default class woo extends wooRest {
|
|
|
449
456
|
return await this.watch(url, messageHash, request, messageHash, subscribe);
|
|
450
457
|
}
|
|
451
458
|
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
459
|
+
/**
|
|
460
|
+
* @method
|
|
461
|
+
* @name woo#watchOrders
|
|
462
|
+
* @description watches information on multiple orders made by the user
|
|
463
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
464
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
465
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
466
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
467
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
468
|
+
*/
|
|
452
469
|
await this.loadMarkets();
|
|
453
470
|
const topic = 'executionreport';
|
|
454
471
|
let messageHash = topic;
|
|
@@ -801,7 +818,43 @@ export default class woo extends wooRest {
|
|
|
801
818
|
this.balance = this.safeBalance(this.balance);
|
|
802
819
|
client.resolve(this.balance, 'balance');
|
|
803
820
|
}
|
|
821
|
+
handleErrorMessage(client, message) {
|
|
822
|
+
//
|
|
823
|
+
// {"id":"1","event":"subscribe","success":false,"ts":1710780997216,"errorMsg":"Auth is needed."}
|
|
824
|
+
//
|
|
825
|
+
if (!('success' in message)) {
|
|
826
|
+
return false;
|
|
827
|
+
}
|
|
828
|
+
const success = this.safeBool(message, 'success');
|
|
829
|
+
if (success) {
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
const errorMessage = this.safeString(message, 'errorMsg');
|
|
833
|
+
try {
|
|
834
|
+
if (errorMessage !== undefined) {
|
|
835
|
+
const feedback = this.id + ' ' + this.json(message);
|
|
836
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorMessage, feedback);
|
|
837
|
+
}
|
|
838
|
+
return false;
|
|
839
|
+
}
|
|
840
|
+
catch (error) {
|
|
841
|
+
if (error instanceof AuthenticationError) {
|
|
842
|
+
const messageHash = 'authenticated';
|
|
843
|
+
client.reject(error, messageHash);
|
|
844
|
+
if (messageHash in client.subscriptions) {
|
|
845
|
+
delete client.subscriptions[messageHash];
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
else {
|
|
849
|
+
client.reject(error);
|
|
850
|
+
}
|
|
851
|
+
return true;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
804
854
|
handleMessage(client, message) {
|
|
855
|
+
if (this.handleErrorMessage(client, message)) {
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
805
858
|
const methods = {
|
|
806
859
|
'ping': this.handlePing,
|
|
807
860
|
'pong': this.handlePong,
|
|
@@ -884,7 +937,9 @@ export default class woo extends wooRest {
|
|
|
884
937
|
const messageHash = 'authenticated';
|
|
885
938
|
const success = this.safeValue(message, 'success');
|
|
886
939
|
if (success) {
|
|
887
|
-
client.resolve(message, messageHash);
|
|
940
|
+
// client.resolve (message, messageHash);
|
|
941
|
+
const future = this.safeValue(client.futures, 'authenticated');
|
|
942
|
+
future.resolve(true);
|
|
888
943
|
}
|
|
889
944
|
else {
|
|
890
945
|
const error = new AuthenticationError(this.json(message));
|
package/js/src/woo.js
CHANGED
|
@@ -1370,9 +1370,15 @@ export default class woo extends Exchange {
|
|
|
1370
1370
|
* @param {boolean} [params.isTriggered] whether the order has been triggered (false by default)
|
|
1371
1371
|
* @param {string} [params.side] 'buy' or 'sell'
|
|
1372
1372
|
* @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
|
|
1373
|
+
* @param {boolean} [params.paginate] set to true if you want to fetch orders with pagination
|
|
1373
1374
|
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1374
1375
|
*/
|
|
1375
1376
|
await this.loadMarkets();
|
|
1377
|
+
let paginate = false;
|
|
1378
|
+
[paginate, params] = this.handleOptionAndParams(params, 'fetchOrders', 'paginate');
|
|
1379
|
+
if (paginate) {
|
|
1380
|
+
return await this.fetchPaginatedCallIncremental('fetchOrders', symbol, since, limit, params, 'page', 500);
|
|
1381
|
+
}
|
|
1376
1382
|
const request = {};
|
|
1377
1383
|
let market = undefined;
|
|
1378
1384
|
const stop = this.safeBool2(params, 'stop', 'trigger');
|
|
@@ -1390,6 +1396,12 @@ export default class woo extends Exchange {
|
|
|
1390
1396
|
request['start_t'] = since;
|
|
1391
1397
|
}
|
|
1392
1398
|
}
|
|
1399
|
+
if (limit !== undefined) {
|
|
1400
|
+
request['size'] = limit;
|
|
1401
|
+
}
|
|
1402
|
+
else {
|
|
1403
|
+
request['size'] = 500;
|
|
1404
|
+
}
|
|
1393
1405
|
if (stop) {
|
|
1394
1406
|
request['algoType'] = 'stop';
|
|
1395
1407
|
}
|
|
@@ -1755,14 +1767,21 @@ export default class woo extends Exchange {
|
|
|
1755
1767
|
/**
|
|
1756
1768
|
* @method
|
|
1757
1769
|
* @name woo#fetchMyTrades
|
|
1770
|
+
* @see https://docs.woo.org/#get-trades
|
|
1758
1771
|
* @description fetch all trades made by the user
|
|
1759
1772
|
* @param {string} symbol unified market symbol
|
|
1760
1773
|
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
1761
1774
|
* @param {int} [limit] the maximum number of trades structures to retrieve
|
|
1762
1775
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1776
|
+
* @param {boolean} [params.paginate] set to true if you want to fetch trades with pagination
|
|
1763
1777
|
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
1764
1778
|
*/
|
|
1765
1779
|
await this.loadMarkets();
|
|
1780
|
+
let paginate = false;
|
|
1781
|
+
[paginate, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'paginate');
|
|
1782
|
+
if (paginate) {
|
|
1783
|
+
return await this.fetchPaginatedCallIncremental('fetchMyTrades', symbol, since, limit, params, 'page', 500);
|
|
1784
|
+
}
|
|
1766
1785
|
const request = {};
|
|
1767
1786
|
let market = undefined;
|
|
1768
1787
|
if (symbol !== undefined) {
|
|
@@ -1772,6 +1791,12 @@ export default class woo extends Exchange {
|
|
|
1772
1791
|
if (since !== undefined) {
|
|
1773
1792
|
request['start_t'] = since;
|
|
1774
1793
|
}
|
|
1794
|
+
if (limit !== undefined) {
|
|
1795
|
+
request['size'] = limit;
|
|
1796
|
+
}
|
|
1797
|
+
else {
|
|
1798
|
+
request['size'] = 500;
|
|
1799
|
+
}
|
|
1775
1800
|
const response = await this.v1PrivateGetClientTrades(this.extend(request, params));
|
|
1776
1801
|
// {
|
|
1777
1802
|
// "success": true,
|
package/package.json
CHANGED
package/skip-tests.json
CHANGED
|
@@ -719,8 +719,7 @@
|
|
|
719
719
|
}
|
|
720
720
|
},
|
|
721
721
|
"delta": {
|
|
722
|
-
"
|
|
723
|
-
"until": "2024-03-19",
|
|
722
|
+
"skipCSharp": "frequent timeouts https://app.travis-ci.com/github/ccxt/ccxt/builds/269273148#L4301 https://app.travis-ci.com/github/ccxt/ccxt/builds/269533613#L3622",
|
|
724
723
|
"skipMethods": {
|
|
725
724
|
"loadMarkets": "expiryDatetime must be equal to expiry in iso8601 format",
|
|
726
725
|
"orderBook": {
|