ccxt 4.3.4 → 4.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/ccxt.js +1 -1
  3. package/dist/cjs/src/base/Exchange.js +299 -6
  4. package/dist/cjs/src/binance.js +24 -17
  5. package/dist/cjs/src/bingx.js +45 -0
  6. package/dist/cjs/src/bitmex.js +24 -0
  7. package/dist/cjs/src/bybit.js +86 -0
  8. package/dist/cjs/src/coinbase.js +5 -4
  9. package/dist/cjs/src/coinex.js +30 -32
  10. package/dist/cjs/src/cryptocom.js +32 -0
  11. package/dist/cjs/src/htx.js +28 -0
  12. package/dist/cjs/src/hyperliquid.js +40 -0
  13. package/dist/cjs/src/kraken.js +30 -0
  14. package/dist/cjs/src/krakenfutures.js +28 -0
  15. package/dist/cjs/src/kucoin.js +53 -3
  16. package/dist/cjs/src/kucoinfutures.js +2 -2
  17. package/dist/cjs/src/okx.js +113 -0
  18. package/dist/cjs/src/pro/binance.js +439 -75
  19. package/dist/cjs/src/pro/bitget.js +1 -1
  20. package/dist/cjs/src/pro/woo.js +0 -1
  21. package/dist/cjs/src/whitebit.js +174 -2
  22. package/dist/cjs/src/woo.js +29 -0
  23. package/js/ccxt.d.ts +1 -1
  24. package/js/ccxt.js +1 -1
  25. package/js/src/abstract/binance.d.ts +1 -0
  26. package/js/src/abstract/binancecoinm.d.ts +1 -0
  27. package/js/src/abstract/binanceus.d.ts +1 -0
  28. package/js/src/abstract/binanceusdm.d.ts +1 -0
  29. package/js/src/abstract/bingx.d.ts +1 -0
  30. package/js/src/abstract/whitebit.d.ts +21 -0
  31. package/js/src/abstract/woo.d.ts +1 -0
  32. package/js/src/base/Exchange.d.ts +52 -3
  33. package/js/src/base/Exchange.js +299 -6
  34. package/js/src/binance.d.ts +4 -0
  35. package/js/src/binance.js +24 -17
  36. package/js/src/bingx.d.ts +1 -0
  37. package/js/src/bingx.js +45 -0
  38. package/js/src/bitmex.d.ts +1 -0
  39. package/js/src/bitmex.js +24 -0
  40. package/js/src/bybit.d.ts +2 -1
  41. package/js/src/bybit.js +86 -0
  42. package/js/src/coinbase.js +5 -4
  43. package/js/src/coinex.js +30 -32
  44. package/js/src/cryptocom.d.ts +2 -1
  45. package/js/src/cryptocom.js +32 -0
  46. package/js/src/htx.d.ts +1 -0
  47. package/js/src/htx.js +28 -0
  48. package/js/src/hyperliquid.d.ts +1 -0
  49. package/js/src/hyperliquid.js +40 -0
  50. package/js/src/kraken.d.ts +1 -0
  51. package/js/src/kraken.js +30 -0
  52. package/js/src/krakenfutures.d.ts +1 -0
  53. package/js/src/krakenfutures.js +28 -0
  54. package/js/src/kucoin.d.ts +1 -0
  55. package/js/src/kucoin.js +53 -3
  56. package/js/src/kucoinfutures.js +2 -2
  57. package/js/src/okx.d.ts +3 -1
  58. package/js/src/okx.js +113 -0
  59. package/js/src/pro/binance.d.ts +9 -1
  60. package/js/src/pro/binance.js +439 -75
  61. package/js/src/pro/bitget.d.ts +1 -1
  62. package/js/src/pro/bitget.js +1 -1
  63. package/js/src/pro/cex.d.ts +1 -1
  64. package/js/src/pro/lbank.d.ts +1 -1
  65. package/js/src/pro/woo.js +0 -1
  66. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +1 -1
  67. package/js/src/whitebit.d.ts +3 -0
  68. package/js/src/whitebit.js +174 -2
  69. package/js/src/woo.d.ts +2 -1
  70. package/js/src/woo.js +29 -0
  71. package/package.json +1 -1
package/js/src/kucoin.js CHANGED
@@ -1152,8 +1152,10 @@ export default class kucoin extends Exchange {
1152
1152
  // "chains":[
1153
1153
  // {
1154
1154
  // "chainName":"ERC20",
1155
- // "chain":"eth",
1155
+ // "chainId": "eth"
1156
1156
  // "withdrawalMinSize":"2999",
1157
+ // "depositMinSize":null,
1158
+ // "withdrawFeeRate":"0",
1157
1159
  // "withdrawalMinFee":"2999",
1158
1160
  // "isWithdrawEnabled":false,
1159
1161
  // "isDepositEnabled":false,
@@ -1261,7 +1263,7 @@ export default class kucoin extends Exchange {
1261
1263
  'max': undefined,
1262
1264
  },
1263
1265
  'deposit': {
1264
- 'min': this.safeNumber(chainExtraData, 'depositMinSize'),
1266
+ 'min': this.safeNumber(chain, 'depositMinSize'),
1265
1267
  'max': undefined,
1266
1268
  },
1267
1269
  },
@@ -3204,7 +3206,6 @@ export default class kucoin extends Exchange {
3204
3206
  const request = {
3205
3207
  'currency': currency['id'],
3206
3208
  'address': address,
3207
- 'amount': amount,
3208
3209
  // 'memo': tag,
3209
3210
  // 'isInner': false, // internal transfer or external withdrawal
3210
3211
  // 'remark': 'optional',
@@ -3218,6 +3219,8 @@ export default class kucoin extends Exchange {
3218
3219
  if (networkCode !== undefined) {
3219
3220
  request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
3220
3221
  }
3222
+ await this.loadCurrencyPrecision(currency, networkCode);
3223
+ request['amount'] = this.currencyToPrecision(code, amount, networkCode);
3221
3224
  let includeFee = undefined;
3222
3225
  [includeFee, params] = this.handleOptionAndParams(params, 'withdraw', 'includeFee', false);
3223
3226
  if (includeFee) {
@@ -3237,6 +3240,53 @@ export default class kucoin extends Exchange {
3237
3240
  const data = this.safeDict(response, 'data', {});
3238
3241
  return this.parseTransaction(data, currency);
3239
3242
  }
3243
+ async loadCurrencyPrecision(currency, networkCode = undefined) {
3244
+ // as kucoin might not have network specific precisions defined in fetchCurrencies (because of webapi failure)
3245
+ // we should check and refetch precision once-per-instance for that specific currency & network
3246
+ // so avoids thorwing exceptions and burden to users
3247
+ // Note: this needs to be executed only if networkCode was provided
3248
+ if (networkCode !== undefined) {
3249
+ const networks = currency['networks'];
3250
+ const network = this.safeDict(networks, networkCode);
3251
+ if (this.safeNumber(network, 'precision') !== undefined) {
3252
+ // if precision exists, no need to refetch
3253
+ return;
3254
+ }
3255
+ // otherwise try to fetch and store in instance
3256
+ const request = {
3257
+ 'currency': currency['id'],
3258
+ 'chain': this.networkCodeToId(networkCode).toLowerCase(),
3259
+ };
3260
+ const response = await this.privateGetWithdrawalsQuotas(request);
3261
+ //
3262
+ // {
3263
+ // "code": "200000",
3264
+ // "data": {
3265
+ // "currency": "USDT",
3266
+ // "limitBTCAmount": "14.24094850",
3267
+ // "usedBTCAmount": "0.00000000",
3268
+ // "quotaCurrency": "USDT",
3269
+ // "limitQuotaCurrencyAmount": "999999.00000000",
3270
+ // "usedQuotaCurrencyAmount": "0",
3271
+ // "remainAmount": "999999.0000",
3272
+ // "availableAmount": "10.77545071",
3273
+ // "withdrawMinFee": "1",
3274
+ // "innerWithdrawMinFee": "0",
3275
+ // "withdrawMinSize": "10",
3276
+ // "isWithdrawEnabled": true,
3277
+ // "precision": 4,
3278
+ // "chain": "EOS",
3279
+ // "reason": null,
3280
+ // "lockedAmount": "0"
3281
+ // }
3282
+ // }
3283
+ //
3284
+ const data = this.safeDict(response, 'data', {});
3285
+ const precision = this.parseNumber(this.parsePrecision(this.safeString(data, 'precision')));
3286
+ const code = currency['code'];
3287
+ this.currencies[code]['networks'][networkCode]['precision'] = precision;
3288
+ }
3289
+ }
3240
3290
  parseTransactionStatus(status) {
3241
3291
  const statuses = {
3242
3292
  'SUCCESS': 'ok',
@@ -2198,8 +2198,8 @@ export default class kucoinfutures extends kucoin {
2198
2198
  // symbol (String) [optional] Symbol of the contract
2199
2199
  // side (String) [optional] buy or sell
2200
2200
  // type (String) [optional] limit, market, limit_stop or market_stop
2201
- // startAt (long) [optional] Start time (milisecond)
2202
- // endAt (long) [optional] End time (milisecond)
2201
+ // startAt (long) [optional] Start time (millisecond)
2202
+ // endAt (long) [optional] End time (millisecond)
2203
2203
  };
2204
2204
  let market = undefined;
2205
2205
  if (symbol !== undefined) {
package/js/src/okx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/okx.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion, CancellationRequest } from './base/types.js';
3
3
  /**
4
4
  * @class okx
5
5
  * @augments Exchange
@@ -49,6 +49,8 @@ export default class okx extends Exchange {
49
49
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
50
50
  parseIds(ids: any): any;
51
51
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
52
+ cancelOrdersForSymbols(orders: CancellationRequest[], params?: {}): Promise<Order[]>;
53
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
52
54
  parseOrderStatus(status: any): string;
53
55
  parseOrder(order: any, market?: Market): Order;
54
56
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
package/js/src/okx.js CHANGED
@@ -34,8 +34,10 @@ export default class okx extends Exchange {
34
34
  'option': true,
35
35
  'addMargin': true,
36
36
  'cancelAllOrders': false,
37
+ 'cancelAllOrdersAfter': true,
37
38
  'cancelOrder': true,
38
39
  'cancelOrders': true,
40
+ 'cancelOrdersForSymbols': true,
39
41
  'closeAllPositions': false,
40
42
  'closePosition': true,
41
43
  'createConvertTrade': true,
@@ -3285,6 +3287,117 @@ export default class okx extends Exchange {
3285
3287
  const ordersData = this.safeList(response, 'data', []);
3286
3288
  return this.parseOrders(ordersData, market, undefined, undefined, params);
3287
3289
  }
3290
+ async cancelOrdersForSymbols(orders, params = {}) {
3291
+ /**
3292
+ * @method
3293
+ * @name okx#cancelOrdersForSymbols
3294
+ * @description cancel multiple orders for multiple symbols
3295
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-post-cancel-multiple-orders
3296
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-post-cancel-algo-order
3297
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol
3298
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3299
+ * @param {boolean} [params.trigger] whether the order is a stop/trigger order
3300
+ * @param {boolean} [params.trailing] set to true if you want to cancel trailing orders
3301
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3302
+ */
3303
+ await this.loadMarkets();
3304
+ const request = [];
3305
+ const options = this.safeDict(this.options, 'cancelOrders', {});
3306
+ const defaultMethod = this.safeString(options, 'method', 'privatePostTradeCancelBatchOrders');
3307
+ let method = this.safeString(params, 'method', defaultMethod);
3308
+ const stop = this.safeBool2(params, 'stop', 'trigger');
3309
+ const trailing = this.safeBool(params, 'trailing', false);
3310
+ const isStopOrTrailing = stop || trailing;
3311
+ if (isStopOrTrailing) {
3312
+ method = 'privatePostTradeCancelAlgos';
3313
+ }
3314
+ for (let i = 0; i < orders.length; i++) {
3315
+ const order = orders[i];
3316
+ const id = this.safeString(order, 'id');
3317
+ const clientOrderId = this.safeString2(order, 'clOrdId', 'clientOrderId');
3318
+ const symbol = this.safeString(order, 'symbol');
3319
+ const market = this.market(symbol);
3320
+ let idKey = 'ordId';
3321
+ if (isStopOrTrailing) {
3322
+ idKey = 'algoId';
3323
+ }
3324
+ else if (clientOrderId !== undefined) {
3325
+ idKey = 'clOrdId';
3326
+ }
3327
+ const requestItem = {
3328
+ 'instId': market['id'],
3329
+ };
3330
+ requestItem[idKey] = (clientOrderId !== undefined) ? clientOrderId : id;
3331
+ request.push(requestItem);
3332
+ }
3333
+ let response = undefined;
3334
+ if (method === 'privatePostTradeCancelAlgos') {
3335
+ response = await this.privatePostTradeCancelAlgos(request); // * dont extend with params, otherwise ARRAY will be turned into OBJECT
3336
+ }
3337
+ else {
3338
+ response = await this.privatePostTradeCancelBatchOrders(request); // * dont extend with params, otherwise ARRAY will be turned into OBJECT
3339
+ }
3340
+ //
3341
+ // {
3342
+ // "code": "0",
3343
+ // "data": [
3344
+ // {
3345
+ // "clOrdId": "e123456789ec4dBC1123456ba123b45e",
3346
+ // "ordId": "405071912345641543",
3347
+ // "sCode": "0",
3348
+ // "sMsg": ""
3349
+ // },
3350
+ // ...
3351
+ // ],
3352
+ // "msg": ""
3353
+ // }
3354
+ //
3355
+ // Algo order
3356
+ //
3357
+ // {
3358
+ // "code": "0",
3359
+ // "data": [
3360
+ // {
3361
+ // "algoId": "431375349042380800",
3362
+ // "sCode": "0",
3363
+ // "sMsg": ""
3364
+ // }
3365
+ // ],
3366
+ // "msg": ""
3367
+ // }
3368
+ //
3369
+ const ordersData = this.safeList(response, 'data', []);
3370
+ return this.parseOrders(ordersData, undefined, undefined, undefined, params);
3371
+ }
3372
+ async cancelAllOrdersAfter(timeout, params = {}) {
3373
+ /**
3374
+ * @method
3375
+ * @name okx#cancelAllOrdersAfter
3376
+ * @description dead man's switch, cancel all orders after the given timeout
3377
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-post-cancel-all-after
3378
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
3379
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3380
+ * @returns {object} the api result
3381
+ */
3382
+ await this.loadMarkets();
3383
+ const request = {
3384
+ 'timeOut': (timeout > 0) ? this.parseToInt(timeout / 1000) : 0,
3385
+ };
3386
+ const response = await this.privatePostTradeCancelAllAfter(this.extend(request, params));
3387
+ //
3388
+ // {
3389
+ // "code":"0",
3390
+ // "msg":"",
3391
+ // "data":[
3392
+ // {
3393
+ // "triggerTime":"1587971460",
3394
+ // "ts":"1587971400"
3395
+ // }
3396
+ // ]
3397
+ // }
3398
+ //
3399
+ return response;
3400
+ }
3288
3401
  parseOrderStatus(status) {
3289
3402
  const statuses = {
3290
3403
  'canceled': 'canceled',
@@ -7,6 +7,8 @@ export default class binance extends binanceRest {
7
7
  stream(type: any, subscriptionHash: any, numSubscriptions?: number): string;
8
8
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
9
9
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
10
+ fetchOrderBookWs(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
11
+ handleFetchOrderBook(client: Client, message: any): void;
10
12
  fetchOrderBookSnapshot(client: any, message: any, subscription: any): Promise<void>;
11
13
  handleDelta(bookside: any, delta: any): void;
12
14
  handleDeltas(bookside: any, deltas: any): void;
@@ -20,6 +22,7 @@ export default class binance extends binanceRest {
20
22
  handleTrade(client: Client, message: any): void;
21
23
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
22
24
  handleOHLCV(client: Client, message: any): void;
25
+ fetchTickerWs(symbol: string, params?: {}): Promise<Ticker>;
23
26
  fetchOHLCVWs(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
24
27
  handleFetchOHLCV(client: Client, message: any): void;
25
28
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
@@ -27,6 +30,7 @@ export default class binance extends binanceRest {
27
30
  watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
28
31
  watchMultiTickerHelper(methodName: any, channelName: string, symbols?: Strings, params?: {}): Promise<any>;
29
32
  parseWsTicker(message: any, marketType: any): Ticker;
33
+ handleTickerWs(client: Client, message: any): void;
30
34
  handleBidsAsks(client: Client, message: any): void;
31
35
  handleTickers(client: Client, message: any): void;
32
36
  handleTickersAndBidsAsks(client: Client, message: any, methodType: any): void;
@@ -38,9 +42,13 @@ export default class binance extends binanceRest {
38
42
  loadBalanceSnapshot(client: any, messageHash: any, type: any, isPortfolioMargin: any): Promise<void>;
39
43
  fetchBalanceWs(params?: {}): Promise<Balances>;
40
44
  handleBalanceWs(client: Client, message: any): void;
45
+ handleAccountStatusWs(client: Client, message: any): void;
46
+ fetchPositionWs(symbol: string, params?: {}): Promise<Position[]>;
47
+ fetchPositionsWs(symbols?: Strings, params?: {}): Promise<Position[]>;
48
+ handlePositionsWs(client: Client, message: any): void;
41
49
  watchBalance(params?: {}): Promise<Balances>;
42
50
  handleBalance(client: Client, message: any): void;
43
- checkIsSpot(method: string, symbol: string, params?: {}): void;
51
+ getMarketType(method: any, market: any, params?: {}): any;
44
52
  createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
45
53
  handleOrderWs(client: Client, message: any): void;
46
54
  handleOrdersWs(client: Client, message: any): void;