ccxt 4.2.28 → 4.2.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.
Files changed (158) hide show
  1. package/CONTRIBUTING.md +4 -1
  2. package/README.md +6 -6
  3. package/dist/ccxt.browser.js +1865 -558
  4. package/dist/ccxt.browser.min.js +7 -7
  5. package/dist/cjs/ccxt.js +3 -1
  6. package/dist/cjs/src/ascendex.js +5 -5
  7. package/dist/cjs/src/base/Exchange.js +114 -21
  8. package/dist/cjs/src/base/errors.js +3 -3
  9. package/dist/cjs/src/base/functions/type.js +12 -0
  10. package/dist/cjs/src/bigone.js +2 -2
  11. package/dist/cjs/src/binance.js +896 -217
  12. package/dist/cjs/src/bingx.js +1 -1
  13. package/dist/cjs/src/bitfinex.js +1 -1
  14. package/dist/cjs/src/bitfinex2.js +52 -62
  15. package/dist/cjs/src/bitget.js +8 -4
  16. package/dist/cjs/src/bitmart.js +3 -3
  17. package/dist/cjs/src/bitmex.js +9 -6
  18. package/dist/cjs/src/bitrue.js +1 -1
  19. package/dist/cjs/src/bitso.js +1 -1
  20. package/dist/cjs/src/bitteam.js +2 -2
  21. package/dist/cjs/src/btcalpha.js +1 -1
  22. package/dist/cjs/src/bybit.js +28 -12
  23. package/dist/cjs/src/coinbase.js +12 -5
  24. package/dist/cjs/src/coincheck.js +1 -1
  25. package/dist/cjs/src/coinex.js +2 -2
  26. package/dist/cjs/src/coinlist.js +1 -1
  27. package/dist/cjs/src/coinmate.js +1 -1
  28. package/dist/cjs/src/coinmetro.js +12 -6
  29. package/dist/cjs/src/coinsph.js +1 -1
  30. package/dist/cjs/src/cryptocom.js +3 -3
  31. package/dist/cjs/src/digifinex.js +6 -4
  32. package/dist/cjs/src/exmo.js +2 -2
  33. package/dist/cjs/src/gate.js +5 -5
  34. package/dist/cjs/src/gemini.js +3 -3
  35. package/dist/cjs/src/hitbtc.js +14 -20
  36. package/dist/cjs/src/hollaex.js +2 -2
  37. package/dist/cjs/src/htx.js +5 -5
  38. package/dist/cjs/src/huobijp.js +1 -1
  39. package/dist/cjs/src/krakenfutures.js +1 -1
  40. package/dist/cjs/src/kucoin.js +17 -17
  41. package/dist/cjs/src/kucoinfutures.js +3 -3
  42. package/dist/cjs/src/lbank.js +1 -1
  43. package/dist/cjs/src/mexc.js +7 -7
  44. package/dist/cjs/src/novadax.js +1 -1
  45. package/dist/cjs/src/okcoin.js +2 -2
  46. package/dist/cjs/src/okx.js +24 -10
  47. package/dist/cjs/src/p2b.js +1 -0
  48. package/dist/cjs/src/phemex.js +3 -3
  49. package/dist/cjs/src/poloniexfutures.js +3 -3
  50. package/dist/cjs/src/pro/alpaca.js +1 -1
  51. package/dist/cjs/src/pro/binance.js +4 -4
  52. package/dist/cjs/src/pro/bitget.js +1 -1
  53. package/dist/cjs/src/pro/bitmart.js +1 -1
  54. package/dist/cjs/src/pro/bitmex.js +49 -6
  55. package/dist/cjs/src/pro/bitvavo.js +1 -1
  56. package/dist/cjs/src/pro/bybit.js +2 -2
  57. package/dist/cjs/src/pro/cex.js +2 -2
  58. package/dist/cjs/src/pro/coinbase.js +1 -1
  59. package/dist/cjs/src/pro/independentreserve.js +1 -1
  60. package/dist/cjs/src/pro/okx.js +1 -1
  61. package/dist/cjs/src/pro/onetrading.js +2 -2
  62. package/dist/cjs/src/pro/p2b.js +432 -0
  63. package/dist/cjs/src/pro/probit.js +5 -5
  64. package/dist/cjs/src/pro/whitebit.js +1 -1
  65. package/dist/cjs/src/probit.js +1 -1
  66. package/dist/cjs/src/timex.js +1 -1
  67. package/dist/cjs/src/tokocrypto.js +3 -3
  68. package/dist/cjs/src/wavesexchange.js +2 -2
  69. package/dist/cjs/src/whitebit.js +2 -2
  70. package/dist/cjs/src/woo.js +3 -3
  71. package/dist/cjs/src/yobit.js +1 -1
  72. package/dist/cjs/src/zaif.js +1 -1
  73. package/dist/cjs/src/zonda.js +3 -3
  74. package/js/ccxt.d.ts +4 -1
  75. package/js/ccxt.js +3 -1
  76. package/js/src/abstract/bybit.d.ts +2 -2
  77. package/js/src/abstract/okx.d.ts +1 -0
  78. package/js/src/ascendex.js +5 -5
  79. package/js/src/base/Exchange.d.ts +10 -1
  80. package/js/src/base/Exchange.js +114 -21
  81. package/js/src/base/errorHierarchy.d.ts +7 -6
  82. package/js/src/base/errorHierarchy.js +7 -6
  83. package/js/src/base/errors.d.ts +3 -3
  84. package/js/src/base/errors.js +3 -3
  85. package/js/src/base/functions/type.js +12 -0
  86. package/js/src/bigone.js +2 -2
  87. package/js/src/binance.d.ts +1 -0
  88. package/js/src/binance.js +897 -218
  89. package/js/src/bingx.js +1 -1
  90. package/js/src/bitfinex.js +1 -1
  91. package/js/src/bitfinex2.js +52 -62
  92. package/js/src/bitget.js +8 -4
  93. package/js/src/bitmart.js +3 -3
  94. package/js/src/bitmex.js +9 -6
  95. package/js/src/bitrue.js +1 -1
  96. package/js/src/bitso.d.ts +1 -1
  97. package/js/src/bitso.js +1 -1
  98. package/js/src/bitteam.js +2 -2
  99. package/js/src/btcalpha.js +1 -1
  100. package/js/src/bybit.js +28 -12
  101. package/js/src/coinbase.js +12 -5
  102. package/js/src/coincheck.js +1 -1
  103. package/js/src/coinex.js +2 -2
  104. package/js/src/coinlist.js +1 -1
  105. package/js/src/coinmate.js +1 -1
  106. package/js/src/coinmetro.d.ts +1 -1
  107. package/js/src/coinmetro.js +12 -6
  108. package/js/src/coinsph.js +1 -1
  109. package/js/src/cryptocom.js +3 -3
  110. package/js/src/digifinex.js +6 -4
  111. package/js/src/exmo.js +2 -2
  112. package/js/src/gate.js +5 -5
  113. package/js/src/gemini.d.ts +1 -1
  114. package/js/src/gemini.js +3 -3
  115. package/js/src/hitbtc.js +14 -20
  116. package/js/src/hollaex.js +2 -2
  117. package/js/src/htx.js +5 -5
  118. package/js/src/huobijp.js +1 -1
  119. package/js/src/krakenfutures.js +1 -1
  120. package/js/src/kucoin.js +17 -17
  121. package/js/src/kucoinfutures.js +3 -3
  122. package/js/src/lbank.js +1 -1
  123. package/js/src/mexc.js +7 -7
  124. package/js/src/novadax.js +1 -1
  125. package/js/src/okcoin.js +2 -2
  126. package/js/src/okx.js +24 -10
  127. package/js/src/p2b.js +1 -0
  128. package/js/src/phemex.js +3 -3
  129. package/js/src/poloniexfutures.js +3 -3
  130. package/js/src/pro/alpaca.js +1 -1
  131. package/js/src/pro/binance.js +4 -4
  132. package/js/src/pro/bitget.js +1 -1
  133. package/js/src/pro/bitmart.js +1 -1
  134. package/js/src/pro/bitmex.d.ts +2 -1
  135. package/js/src/pro/bitmex.js +49 -6
  136. package/js/src/pro/bitvavo.js +1 -1
  137. package/js/src/pro/bybit.js +2 -2
  138. package/js/src/pro/cex.js +2 -2
  139. package/js/src/pro/coinbase.js +2 -2
  140. package/js/src/pro/independentreserve.js +1 -1
  141. package/js/src/pro/okx.js +1 -1
  142. package/js/src/pro/onetrading.js +2 -2
  143. package/js/src/pro/p2b.d.ts +23 -0
  144. package/js/src/pro/p2b.js +433 -0
  145. package/js/src/pro/probit.js +5 -5
  146. package/js/src/pro/whitebit.js +1 -1
  147. package/js/src/probit.js +1 -1
  148. package/js/src/timex.js +1 -1
  149. package/js/src/tokocrypto.js +3 -3
  150. package/js/src/wavesexchange.js +2 -2
  151. package/js/src/whitebit.js +2 -2
  152. package/js/src/woo.js +3 -3
  153. package/js/src/yobit.js +1 -1
  154. package/js/src/zaif.js +1 -1
  155. package/js/src/zonda.d.ts +1 -1
  156. package/js/src/zonda.js +3 -3
  157. package/package.json +1 -1
  158. package/skip-tests.json +3 -10
package/js/ccxt.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
4
4
  import * as errors from './src/base/errors.js';
5
5
  import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
7
- declare const version = "4.2.27";
7
+ declare const version = "4.2.29";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
@@ -157,6 +157,7 @@ import ndaxPro from './src/pro/ndax.js';
157
157
  import okcoinPro from './src/pro/okcoin.js';
158
158
  import okxPro from './src/pro/okx.js';
159
159
  import onetradingPro from './src/pro/onetrading.js';
160
+ import p2bPro from './src/pro/p2b.js';
160
161
  import phemexPro from './src/pro/phemex.js';
161
162
  import poloniexPro from './src/pro/poloniex.js';
162
163
  import poloniexfuturesPro from './src/pro/poloniexfutures.js';
@@ -320,6 +321,7 @@ declare const pro: {
320
321
  okcoin: typeof okcoinPro;
321
322
  okx: typeof okxPro;
322
323
  onetrading: typeof onetradingPro;
324
+ p2b: typeof p2bPro;
323
325
  phemex: typeof phemexPro;
324
326
  poloniex: typeof poloniexPro;
325
327
  poloniexfutures: typeof poloniexfuturesPro;
@@ -387,6 +389,7 @@ declare const ccxt: {
387
389
  okcoin: typeof okcoinPro;
388
390
  okx: typeof okxPro;
389
391
  onetrading: typeof onetradingPro;
392
+ p2b: typeof p2bPro;
390
393
  phemex: typeof phemexPro;
391
394
  poloniex: typeof poloniexPro;
392
395
  poloniexfutures: typeof poloniexfuturesPro;
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.2.28';
41
+ const version = '4.2.30';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
@@ -194,6 +194,7 @@ import ndaxPro from './src/pro/ndax.js';
194
194
  import okcoinPro from './src/pro/okcoin.js';
195
195
  import okxPro from './src/pro/okx.js';
196
196
  import onetradingPro from './src/pro/onetrading.js';
197
+ import p2bPro from './src/pro/p2b.js';
197
198
  import phemexPro from './src/pro/phemex.js';
198
199
  import poloniexPro from './src/pro/poloniex.js';
199
200
  import poloniexfuturesPro from './src/pro/poloniexfutures.js';
@@ -357,6 +358,7 @@ const pro = {
357
358
  'okcoin': okcoinPro,
358
359
  'okx': okxPro,
359
360
  'onetrading': onetradingPro,
361
+ 'p2b': p2bPro,
360
362
  'phemex': phemexPro,
361
363
  'poloniex': poloniexPro,
362
364
  'poloniexfutures': poloniexfuturesPro,
@@ -122,8 +122,6 @@ interface Exchange {
122
122
  privateGetV5PreUpgradeAssetSettlementRecord(params?: {}): Promise<implicitReturnType>;
123
123
  privateGetV5AccountWalletBalance(params?: {}): Promise<implicitReturnType>;
124
124
  privateGetV5AccountBorrowHistory(params?: {}): Promise<implicitReturnType>;
125
- privateGetV5AccountSetCollateralSwitch(params?: {}): Promise<implicitReturnType>;
126
- privateGetV5AccountSetCollateralSwitchBatch(params?: {}): Promise<implicitReturnType>;
127
125
  privateGetV5AccountCollateralInfo(params?: {}): Promise<implicitReturnType>;
128
126
  privateGetV5AssetCoinGreeks(params?: {}): Promise<implicitReturnType>;
129
127
  privateGetV5AccountFeeRate(params?: {}): Promise<implicitReturnType>;
@@ -290,6 +288,8 @@ interface Exchange {
290
288
  privatePostV5LendingPurchase(params?: {}): Promise<implicitReturnType>;
291
289
  privatePostV5LendingRedeem(params?: {}): Promise<implicitReturnType>;
292
290
  privatePostV5LendingRedeemCancel(params?: {}): Promise<implicitReturnType>;
291
+ privatePostV5AccountSetCollateralSwitch(params?: {}): Promise<implicitReturnType>;
292
+ privatePostV5AccountSetCollateralSwitchBatch(params?: {}): Promise<implicitReturnType>;
293
293
  }
294
294
  declare abstract class Exchange extends _Exchange {
295
295
  }
@@ -1,6 +1,7 @@
1
1
  import { implicitReturnType } from '../base/types.js';
2
2
  import { Exchange as _Exchange } from '../base/Exchange.js';
3
3
  interface Exchange {
4
+ publicGetMarketBooksFull(params?: {}): Promise<implicitReturnType>;
4
5
  publicGetMarketTickers(params?: {}): Promise<implicitReturnType>;
5
6
  publicGetMarketTicker(params?: {}): Promise<implicitReturnType>;
6
7
  publicGetMarketIndexTickers(params?: {}): Promise<implicitReturnType>;
@@ -622,7 +622,7 @@ export default class ascendex extends Exchange {
622
622
  symbol = base + '/' + quote + ':' + settle;
623
623
  }
624
624
  const fee = this.safeNumber(market, 'commissionReserveRate');
625
- const marginTradable = this.safeValue(market, 'marginTradable', false);
625
+ const marginTradable = this.safeBool(market, 'marginTradable', false);
626
626
  result.push({
627
627
  'id': id,
628
628
  'symbol': symbol,
@@ -817,7 +817,7 @@ export default class ascendex extends Exchange {
817
817
  let marginMode = undefined;
818
818
  [marketType, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
819
819
  [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
820
- const isMargin = this.safeValue(params, 'margin', false);
820
+ const isMargin = this.safeBool(params, 'margin', false);
821
821
  const isCross = marginMode === 'cross';
822
822
  marketType = (isMargin || isCross) ? 'margin' : marketType;
823
823
  params = this.omit(params, 'margin');
@@ -1177,7 +1177,7 @@ export default class ascendex extends Exchange {
1177
1177
  const timestamp = this.safeInteger(trade, 'ts');
1178
1178
  const priceString = this.safeString2(trade, 'price', 'p');
1179
1179
  const amountString = this.safeString(trade, 'q');
1180
- const buyerIsMaker = this.safeValue(trade, 'bm', false);
1180
+ const buyerIsMaker = this.safeBool(trade, 'bm', false);
1181
1181
  const side = buyerIsMaker ? 'sell' : 'buy';
1182
1182
  market = this.safeMarket(undefined, market);
1183
1183
  return this.safeTrade({
@@ -1521,7 +1521,7 @@ export default class ascendex extends Exchange {
1521
1521
  const isLimitOrder = ((type === 'limit') || (type === 'stop_limit'));
1522
1522
  const timeInForce = this.safeString(params, 'timeInForce');
1523
1523
  const postOnly = this.isPostOnly(isMarketOrder, false, params);
1524
- const reduceOnly = this.safeValue(params, 'reduceOnly', false);
1524
+ const reduceOnly = this.safeBool(params, 'reduceOnly', false);
1525
1525
  const stopPrice = this.safeValue2(params, 'triggerPrice', 'stopPrice');
1526
1526
  if (isLimitOrder) {
1527
1527
  request['orderPrice'] = this.priceToPrecision(symbol, price);
@@ -3164,7 +3164,7 @@ export default class ascendex extends Exchange {
3164
3164
  // { "code": "0" }
3165
3165
  //
3166
3166
  const transferOptions = this.safeValue(this.options, 'transfer', {});
3167
- const fillResponseFromRequest = this.safeValue(transferOptions, 'fillResponseFromRequest', true);
3167
+ const fillResponseFromRequest = this.safeBool(transferOptions, 'fillResponseFromRequest', true);
3168
3168
  const transfer = this.parseTransfer(response, currency);
3169
3169
  if (fillResponseFromRequest) {
3170
3170
  transfer['fromAccount'] = fromAccount;
@@ -570,6 +570,15 @@ export default class Exchange {
570
570
  setProperty(obj: any, property: any, defaultValue?: any): void;
571
571
  axolotl(payload: any, hexKey: any, ed25519: any): string;
572
572
  fixStringifiedJsonMembers(content: any): any;
573
+ safeBoolN(dictionaryOrList: any, keys: IndexType[], defaultValue?: boolean): boolean | undefined;
574
+ safeBool2(dictionary: any, key1: IndexType, key2: IndexType, defaultValue?: boolean): boolean | undefined;
575
+ safeBool(dictionary: any, key: IndexType, defaultValue?: boolean): boolean | undefined;
576
+ safeDictN(dictionaryOrList: any, keys: IndexType[], defaultValue?: Dictionary<any>): Dictionary<any> | undefined;
577
+ safeDict(dictionary: any, key: IndexType, defaultValue?: Dictionary<any>): Dictionary<any> | undefined;
578
+ safeDict2(dictionary: any, key1: IndexType, key2: string, defaultValue?: Dictionary<any>): Dictionary<any> | undefined;
579
+ safeListN(dictionaryOrList: any, keys: IndexType[], defaultValue?: any[]): any[] | undefined;
580
+ safeList2(dictionaryOrList: any, key1: IndexType, key2: string, defaultValue?: any[]): any[] | undefined;
581
+ safeList(dictionaryOrList: any, key: IndexType, defaultValue?: any[]): any[] | undefined;
573
582
  handleDeltas(orderbook: any, deltas: any): void;
574
583
  handleDelta(bookside: any, delta: any): void;
575
584
  getCacheIndex(orderbook: any, deltas: any): number;
@@ -659,7 +668,7 @@ export default class Exchange {
659
668
  after: number;
660
669
  status: string;
661
670
  fee: any;
662
- info: any;
671
+ info: Dictionary<any>;
663
672
  };
664
673
  safeCurrencyStructure(currency: object): any;
665
674
  safeMarketStructure(market?: any): MarketInterface;
@@ -1403,6 +1403,99 @@ export default class Exchange {
1403
1403
  // ########################################################################
1404
1404
  // ------------------------------------------------------------------------
1405
1405
  // METHODS BELOW THIS LINE ARE TRANSPILED FROM JAVASCRIPT TO PYTHON AND PHP
1406
+ safeBoolN(dictionaryOrList, keys, defaultValue = undefined) {
1407
+ /**
1408
+ * @ignore
1409
+ * @method
1410
+ * @description safely extract boolean value from dictionary or list
1411
+ * @returns {bool | undefined}
1412
+ */
1413
+ const value = this.safeValueN(dictionaryOrList, keys, defaultValue);
1414
+ if (typeof value === 'boolean') {
1415
+ return value;
1416
+ }
1417
+ return defaultValue;
1418
+ }
1419
+ safeBool2(dictionary, key1, key2, defaultValue = undefined) {
1420
+ /**
1421
+ * @ignore
1422
+ * @method
1423
+ * @description safely extract boolean value from dictionary or list
1424
+ * @returns {bool | undefined}
1425
+ */
1426
+ return this.safeBoolN(dictionary, [key1, key2], defaultValue);
1427
+ }
1428
+ safeBool(dictionary, key, defaultValue = undefined) {
1429
+ /**
1430
+ * @ignore
1431
+ * @method
1432
+ * @description safely extract boolean value from dictionary or list
1433
+ * @returns {bool | undefined}
1434
+ */
1435
+ return this.safeBoolN(dictionary, [key], defaultValue);
1436
+ }
1437
+ safeDictN(dictionaryOrList, keys, defaultValue = undefined) {
1438
+ /**
1439
+ * @ignore
1440
+ * @method
1441
+ * @description safely extract a dictionary from dictionary or list
1442
+ * @returns {object | undefined}
1443
+ */
1444
+ const value = this.safeValueN(dictionaryOrList, keys, defaultValue);
1445
+ if (typeof value === 'object') {
1446
+ return value;
1447
+ }
1448
+ return defaultValue;
1449
+ }
1450
+ safeDict(dictionary, key, defaultValue = undefined) {
1451
+ /**
1452
+ * @ignore
1453
+ * @method
1454
+ * @description safely extract a dictionary from dictionary or list
1455
+ * @returns {object | undefined}
1456
+ */
1457
+ return this.safeDictN(dictionary, [key], defaultValue);
1458
+ }
1459
+ safeDict2(dictionary, key1, key2, defaultValue = undefined) {
1460
+ /**
1461
+ * @ignore
1462
+ * @method
1463
+ * @description safely extract a dictionary from dictionary or list
1464
+ * @returns {object | undefined}
1465
+ */
1466
+ return this.safeDictN(dictionary, [key1, key2], defaultValue);
1467
+ }
1468
+ safeListN(dictionaryOrList, keys, defaultValue = undefined) {
1469
+ /**
1470
+ * @ignore
1471
+ * @method
1472
+ * @description safely extract an Array from dictionary or list
1473
+ * @returns {Array | undefined}
1474
+ */
1475
+ const value = this.safeValueN(dictionaryOrList, keys, defaultValue);
1476
+ if (Array.isArray(value)) {
1477
+ return value;
1478
+ }
1479
+ return defaultValue;
1480
+ }
1481
+ safeList2(dictionaryOrList, key1, key2, defaultValue = undefined) {
1482
+ /**
1483
+ * @ignore
1484
+ * @method
1485
+ * @description safely extract an Array from dictionary or list
1486
+ * @returns {Array | undefined}
1487
+ */
1488
+ return this.safeListN(dictionaryOrList, [key1, key2], defaultValue);
1489
+ }
1490
+ safeList(dictionaryOrList, key, defaultValue = undefined) {
1491
+ /**
1492
+ * @ignore
1493
+ * @method
1494
+ * @description safely extract an Array from dictionary or list
1495
+ * @returns {Array | undefined}
1496
+ */
1497
+ return this.safeListN(dictionaryOrList, [key], defaultValue);
1498
+ }
1406
1499
  handleDeltas(orderbook, deltas) {
1407
1500
  for (let i = 0; i < deltas.length; i++) {
1408
1501
  this.handleDelta(orderbook, deltas[i]);
@@ -1887,7 +1980,7 @@ export default class Exchange {
1887
1980
  fee['cost'] = this.safeNumber(fee, 'cost');
1888
1981
  }
1889
1982
  const timestamp = this.safeInteger(entry, 'timestamp');
1890
- const info = this.safeValue(entry, 'info', {});
1983
+ const info = this.safeDict(entry, 'info', {});
1891
1984
  return {
1892
1985
  'id': this.safeString(entry, 'id'),
1893
1986
  'timestamp': timestamp,
@@ -2059,7 +2152,7 @@ export default class Exchange {
2059
2152
  for (let i = 0; i < values.length; i++) {
2060
2153
  const market = values[i];
2061
2154
  const defaultCurrencyPrecision = (this.precisionMode === DECIMAL_PLACES) ? 8 : this.parseNumber('1e-8');
2062
- const marketPrecision = this.safeValue(market, 'precision', {});
2155
+ const marketPrecision = this.safeDict(market, 'precision', {});
2063
2156
  if ('base' in market) {
2064
2157
  const currency = this.safeCurrencyStructure({
2065
2158
  'id': this.safeString2(market, 'baseId', 'base'),
@@ -2089,7 +2182,7 @@ export default class Exchange {
2089
2182
  const resultingCurrencies = [];
2090
2183
  for (let i = 0; i < codes.length; i++) {
2091
2184
  const code = codes[i];
2092
- const groupedCurrenciesCode = this.safeValue(groupedCurrencies, code, []);
2185
+ const groupedCurrenciesCode = this.safeList(groupedCurrencies, code, []);
2093
2186
  let highestPrecisionCurrency = this.safeValue(groupedCurrenciesCode, 0);
2094
2187
  for (let j = 1; j < groupedCurrenciesCode.length; j++) {
2095
2188
  const currentCurrency = groupedCurrenciesCode[j];
@@ -2172,7 +2265,7 @@ export default class Exchange {
2172
2265
  const parseSymbol = symbol === undefined;
2173
2266
  const parseSide = side === undefined;
2174
2267
  const shouldParseFees = parseFee || parseFees;
2175
- const fees = this.safeValue(order, 'fees', []);
2268
+ const fees = this.safeList(order, 'fees', []);
2176
2269
  let trades = [];
2177
2270
  if (parseFilled || parseCost || shouldParseFees) {
2178
2271
  const rawTrades = this.safeValue(order, 'trades', trades);
@@ -2306,7 +2399,7 @@ export default class Exchange {
2306
2399
  }
2307
2400
  }
2308
2401
  // ensure that the average field is calculated correctly
2309
- const inverse = this.safeValue(market, 'inverse', false);
2402
+ const inverse = this.safeBool(market, 'inverse', false);
2310
2403
  const contractSize = this.numberToString(this.safeValue(market, 'contractSize', 1));
2311
2404
  // inverse
2312
2405
  // price = filled * contract size / cost
@@ -2360,12 +2453,12 @@ export default class Exchange {
2360
2453
  entry['amount'] = this.safeNumber(entry, 'amount');
2361
2454
  entry['price'] = this.safeNumber(entry, 'price');
2362
2455
  entry['cost'] = this.safeNumber(entry, 'cost');
2363
- const tradeFee = this.safeValue(entry, 'fee', {});
2456
+ const tradeFee = this.safeDict(entry, 'fee', {});
2364
2457
  tradeFee['cost'] = this.safeNumber(tradeFee, 'cost');
2365
2458
  if ('rate' in tradeFee) {
2366
2459
  tradeFee['rate'] = this.safeNumber(tradeFee, 'rate');
2367
2460
  }
2368
- const entryFees = this.safeValue(entry, 'fees', []);
2461
+ const entryFees = this.safeList(entry, 'fees', []);
2369
2462
  for (let j = 0; j < entryFees.length; j++) {
2370
2463
  entryFees[j]['cost'] = this.safeNumber(entryFees[j], 'cost');
2371
2464
  }
@@ -2540,7 +2633,7 @@ export default class Exchange {
2540
2633
  const contractSize = this.safeString(market, 'contractSize');
2541
2634
  let multiplyPrice = price;
2542
2635
  if (contractSize !== undefined) {
2543
- const inverse = this.safeValue(market, 'inverse', false);
2636
+ const inverse = this.safeBool(market, 'inverse', false);
2544
2637
  if (inverse) {
2545
2638
  multiplyPrice = Precise.stringDiv('1', price);
2546
2639
  }
@@ -2783,12 +2876,12 @@ export default class Exchange {
2783
2876
  }
2784
2877
  convertTradingViewToOHLCV(ohlcvs, timestamp = 't', open = 'o', high = 'h', low = 'l', close = 'c', volume = 'v', ms = false) {
2785
2878
  const result = [];
2786
- const timestamps = this.safeValue(ohlcvs, timestamp, []);
2787
- const opens = this.safeValue(ohlcvs, open, []);
2788
- const highs = this.safeValue(ohlcvs, high, []);
2789
- const lows = this.safeValue(ohlcvs, low, []);
2790
- const closes = this.safeValue(ohlcvs, close, []);
2791
- const volumes = this.safeValue(ohlcvs, volume, []);
2879
+ const timestamps = this.safeList(ohlcvs, timestamp, []);
2880
+ const opens = this.safeList(ohlcvs, open, []);
2881
+ const highs = this.safeList(ohlcvs, high, []);
2882
+ const lows = this.safeList(ohlcvs, low, []);
2883
+ const closes = this.safeList(ohlcvs, close, []);
2884
+ const volumes = this.safeList(ohlcvs, volume, []);
2792
2885
  for (let i = 0; i < timestamps.length; i++) {
2793
2886
  result.push([
2794
2887
  ms ? this.safeInteger(timestamps, i) : this.safeTimestamp(timestamps, i),
@@ -2823,10 +2916,10 @@ export default class Exchange {
2823
2916
  async fetchWebEndpoint(method, endpointMethod, returnAsJson, startRegex = undefined, endRegex = undefined) {
2824
2917
  let errorMessage = '';
2825
2918
  const options = this.safeValue(this.options, method, {});
2826
- const muteOnFailure = this.safeValue(options, 'webApiMuteFailure', true);
2919
+ const muteOnFailure = this.safeBool(options, 'webApiMuteFailure', true);
2827
2920
  try {
2828
2921
  // if it was not explicitly disabled, then don't fetch
2829
- if (this.safeValue(options, 'webApiEnable', true) !== true) {
2922
+ if (this.safeBool(options, 'webApiEnable', true) !== true) {
2830
2923
  return undefined;
2831
2924
  }
2832
2925
  const maxRetries = this.safeValue(options, 'webApiRetries', 10);
@@ -3037,7 +3130,7 @@ export default class Exchange {
3037
3130
  if (currencyCode !== undefined) {
3038
3131
  const defaultNetworkCodeReplacements = this.safeValue(this.options, 'defaultNetworkCodeReplacements', {});
3039
3132
  if (currencyCode in defaultNetworkCodeReplacements) {
3040
- const replacementObject = this.safeValue(defaultNetworkCodeReplacements, currencyCode, {});
3133
+ const replacementObject = this.safeDict(defaultNetworkCodeReplacements, currencyCode, {});
3041
3134
  networkCode = this.safeString(replacementObject, networkCode, networkCode);
3042
3135
  }
3043
3136
  }
@@ -3139,7 +3232,7 @@ export default class Exchange {
3139
3232
  const id = this.safeString(item, marketIdKey);
3140
3233
  const market = this.safeMarket(id, undefined, undefined, 'swap');
3141
3234
  const symbol = market['symbol'];
3142
- const contract = this.safeValue(market, 'contract', false);
3235
+ const contract = this.safeBool(market, 'contract', false);
3143
3236
  if (contract && ((symbols === undefined) || this.inArray(symbol, symbols))) {
3144
3237
  tiers[symbol] = this.parseMarketLeverageTiers(item, market);
3145
3238
  }
@@ -4310,8 +4403,8 @@ export default class Exchange {
4310
4403
  const currency = this.currencies[code];
4311
4404
  let precision = this.safeValue(currency, 'precision');
4312
4405
  if (networkCode !== undefined) {
4313
- const networks = this.safeValue(currency, 'networks', {});
4314
- const networkItem = this.safeValue(networks, networkCode, {});
4406
+ const networks = this.safeDict(currency, 'networks', {});
4407
+ const networkItem = this.safeDict(networks, networkCode, {});
4315
4408
  precision = this.safeValue(networkItem, 'precision', precision);
4316
4409
  }
4317
4410
  if (precision === undefined) {
@@ -4613,7 +4706,7 @@ export default class Exchange {
4613
4706
  * @returns {Array}
4614
4707
  */
4615
4708
  const timeInForce = this.safeStringUpper(params, 'timeInForce');
4616
- let postOnly = this.safeValue(params, 'postOnly', false);
4709
+ let postOnly = this.safeBool(params, 'postOnly', false);
4617
4710
  const ioc = timeInForce === 'IOC';
4618
4711
  const fok = timeInForce === 'FOK';
4619
4712
  const po = timeInForce === 'PO';
@@ -10,9 +10,11 @@ declare const errorHierarchy: {
10
10
  ArgumentsRequired: {};
11
11
  BadRequest: {
12
12
  BadSymbol: {};
13
- MarginModeAlreadySet: {};
14
- NoChange: {};
15
- OperationRejected: {};
13
+ };
14
+ OperationRejected: {
15
+ NoChange: {
16
+ MarginModeAlreadySet: {};
17
+ };
16
18
  };
17
19
  BadResponse: {
18
20
  NullResponse: {};
@@ -35,9 +37,8 @@ declare const errorHierarchy: {
35
37
  };
36
38
  OperationFailed: {
37
39
  NetworkError: {
38
- DDoSProtection: {
39
- RateLimitExceeded: {};
40
- };
40
+ DDoSProtection: {};
41
+ RateLimitExceeded: {};
41
42
  ExchangeNotAvailable: {
42
43
  OnMaintenance: {};
43
44
  };
@@ -16,9 +16,11 @@ const errorHierarchy = {
16
16
  'ArgumentsRequired': {},
17
17
  'BadRequest': {
18
18
  'BadSymbol': {},
19
- 'MarginModeAlreadySet': {},
20
- 'NoChange': {},
21
- 'OperationRejected': {},
19
+ },
20
+ 'OperationRejected': {
21
+ 'NoChange': {
22
+ 'MarginModeAlreadySet': {},
23
+ },
22
24
  },
23
25
  'BadResponse': {
24
26
  'NullResponse': {},
@@ -41,9 +43,8 @@ const errorHierarchy = {
41
43
  },
42
44
  'OperationFailed': {
43
45
  'NetworkError': {
44
- 'DDoSProtection': {
45
- 'RateLimitExceeded': {},
46
- },
46
+ 'DDoSProtection': {},
47
+ 'RateLimitExceeded': {},
47
48
  'ExchangeNotAvailable': {
48
49
  'OnMaintenance': {},
49
50
  },
@@ -25,13 +25,13 @@ declare class ArgumentsRequired extends ExchangeError {
25
25
  declare class BadRequest extends ExchangeError {
26
26
  constructor(message: any);
27
27
  }
28
- declare class OperationRejected extends BadRequest {
28
+ declare class OperationRejected extends ExchangeError {
29
29
  constructor(message: any);
30
30
  }
31
31
  declare class BadSymbol extends BadRequest {
32
32
  constructor(message: any);
33
33
  }
34
- declare class NoChange extends BadRequest {
34
+ declare class NoChange extends OperationRejected {
35
35
  constructor(message: any);
36
36
  }
37
37
  declare class MarginModeAlreadySet extends NoChange {
@@ -91,7 +91,7 @@ declare class NetworkError extends OperationFailed {
91
91
  declare class DDoSProtection extends NetworkError {
92
92
  constructor(message: any);
93
93
  }
94
- declare class RateLimitExceeded extends DDoSProtection {
94
+ declare class RateLimitExceeded extends NetworkError {
95
95
  constructor(message: any);
96
96
  }
97
97
  declare class ExchangeNotAvailable extends NetworkError {
@@ -90,7 +90,7 @@ class BadRequest extends ExchangeError {
90
90
  this.name = 'BadRequest';
91
91
  }
92
92
  }
93
- class OperationRejected extends BadRequest {
93
+ class OperationRejected extends ExchangeError {
94
94
  constructor(message) {
95
95
  super(message);
96
96
  this.name = 'OperationRejected';
@@ -102,7 +102,7 @@ class BadSymbol extends BadRequest {
102
102
  this.name = 'BadSymbol';
103
103
  }
104
104
  }
105
- class NoChange extends BadRequest {
105
+ class NoChange extends OperationRejected {
106
106
  constructor(message) {
107
107
  super(message);
108
108
  this.name = 'NoChange';
@@ -223,7 +223,7 @@ class DDoSProtection extends NetworkError {
223
223
  this.name = 'DDoSProtection';
224
224
  }
225
225
  }
226
- class RateLimitExceeded extends DDoSProtection {
226
+ class RateLimitExceeded extends NetworkError {
227
227
  constructor(message) {
228
228
  super(message);
229
229
  this.name = 'RateLimitExceeded';
@@ -98,6 +98,9 @@ const safeFloatN = (o, k, $default) => {
98
98
  return isNumber(n) ? n : $default;
99
99
  };
100
100
  const safeIntegerN = (o, k, $default) => {
101
+ if (o === undefined) {
102
+ return $default;
103
+ }
101
104
  const n = asInteger(getValueFromKeysInArray(o, k));
102
105
  return isNumber(n) ? n : $default;
103
106
  };
@@ -110,14 +113,23 @@ const safeTimestampN = (o, k, $default) => {
110
113
  return isNumber(n) ? parseInt(n * 1000) : $default;
111
114
  };
112
115
  const safeValueN = (o, k, $default) => {
116
+ if (o === undefined) {
117
+ return $default;
118
+ }
113
119
  const x = getValueFromKeysInArray(o, k);
114
120
  return hasProps(x) ? x : $default;
115
121
  };
116
122
  const safeStringN = (o, k, $default) => {
123
+ if (o === undefined) {
124
+ return $default;
125
+ }
117
126
  const x = getValueFromKeysInArray(o, k);
118
127
  return isStringCoercible(x) ? String(x) : $default;
119
128
  };
120
129
  const safeStringLowerN = (o, k, $default) => {
130
+ if (o === undefined) {
131
+ return $default;
132
+ }
121
133
  const x = getValueFromKeysInArray(o, k);
122
134
  return isStringCoercible(x) ? String(x).toLowerCase() : $default;
123
135
  };
package/js/src/bigone.js CHANGED
@@ -1472,7 +1472,7 @@ export default class bigone extends Exchange {
1472
1472
  const requestSide = isBuy ? 'BID' : 'ASK';
1473
1473
  let uppercaseType = type.toUpperCase();
1474
1474
  const isLimit = uppercaseType === 'LIMIT';
1475
- const exchangeSpecificParam = this.safeValue(params, 'post_only', false);
1475
+ const exchangeSpecificParam = this.safeBool(params, 'post_only', false);
1476
1476
  let postOnly = undefined;
1477
1477
  [postOnly, params] = this.handlePostOnly((uppercaseType === 'MARKET'), exchangeSpecificParam, params);
1478
1478
  const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stopPrice', 'stop_price']);
@@ -2104,7 +2104,7 @@ export default class bigone extends Exchange {
2104
2104
  //
2105
2105
  const transfer = this.parseTransfer(response, currency);
2106
2106
  const transferOptions = this.safeValue(this.options, 'transfer', {});
2107
- const fillResponseFromRequest = this.safeValue(transferOptions, 'fillResponseFromRequest', true);
2107
+ const fillResponseFromRequest = this.safeBool(transferOptions, 'fillResponseFromRequest', true);
2108
2108
  if (fillResponseFromRequest) {
2109
2109
  transfer['fromAccount'] = fromAccount;
2110
2110
  transfer['toAccount'] = toAccount;
@@ -307,6 +307,7 @@ export default class binance extends Exchange {
307
307
  body: any;
308
308
  headers: any;
309
309
  };
310
+ getExceptionsByUrl(url: any, exactOrBroad: any): any;
310
311
  handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
311
312
  calculateRateLimiterCost(api: any, method: any, path: any, params: any, config?: {}): any;
312
313
  request(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any, config?: {}, context?: {}): Promise<any>;