ccxt 4.3.17 → 4.3.19

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 (174) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/ccxt.js +6 -1
  3. package/dist/cjs/src/abstract/woofipro.js +9 -0
  4. package/dist/cjs/src/ascendex.js +3 -4
  5. package/dist/cjs/src/base/Exchange.js +43 -3
  6. package/dist/cjs/src/base/functions/crypto.js +10 -3
  7. package/dist/cjs/src/base/functions/encode.js +6 -3
  8. package/dist/cjs/src/base/functions/number.js +8 -5
  9. package/dist/cjs/src/base/functions/rsa.js +5 -5
  10. package/dist/cjs/src/bigone.js +1 -1
  11. package/dist/cjs/src/binance.js +32 -8
  12. package/dist/cjs/src/bitfinex.js +25 -1
  13. package/dist/cjs/src/bitfinex2.js +59 -51
  14. package/dist/cjs/src/bitget.js +1 -5
  15. package/dist/cjs/src/bitmart.js +3 -3
  16. package/dist/cjs/src/bitstamp.js +1 -3
  17. package/dist/cjs/src/bybit.js +1 -0
  18. package/dist/cjs/src/coinex.js +321 -537
  19. package/dist/cjs/src/coinlist.js +1 -2
  20. package/dist/cjs/src/deribit.js +1 -1
  21. package/dist/cjs/src/hollaex.js +3 -3
  22. package/dist/cjs/src/htx.js +1 -1
  23. package/dist/cjs/src/indodax.js +1 -1
  24. package/dist/cjs/src/latoken.js +1 -1
  25. package/dist/cjs/src/mexc.js +1 -1
  26. package/dist/cjs/src/novadax.js +0 -1
  27. package/dist/cjs/src/okx.js +17 -0
  28. package/dist/cjs/src/poloniex.js +1 -2
  29. package/dist/cjs/src/pro/bitget.js +136 -192
  30. package/dist/cjs/src/pro/bybit.js +4 -2
  31. package/dist/cjs/src/pro/coinbaseinternational.js +9 -1
  32. package/dist/cjs/src/pro/okx.js +85 -0
  33. package/dist/cjs/src/pro/woofipro.js +1263 -0
  34. package/dist/cjs/src/wavesexchange.js +2 -2
  35. package/dist/cjs/src/woo.js +17 -3
  36. package/dist/cjs/src/woofipro.js +2698 -0
  37. package/js/ccxt.d.ts +8 -2
  38. package/js/ccxt.js +6 -2
  39. package/js/src/abstract/bybit.d.ts +1 -0
  40. package/js/src/abstract/okx.d.ts +1 -0
  41. package/js/src/abstract/woofipro.d.ts +122 -0
  42. package/js/src/abstract/woofipro.js +11 -0
  43. package/js/src/ace.d.ts +2 -2
  44. package/js/src/ascendex.d.ts +5 -15
  45. package/js/src/ascendex.js +3 -4
  46. package/js/src/base/Exchange.d.ts +27 -18
  47. package/js/src/base/Exchange.js +43 -3
  48. package/js/src/base/functions/crypto.d.ts +1 -1
  49. package/js/src/base/functions/crypto.js +10 -3
  50. package/js/src/base/functions/encode.d.ts +1 -1
  51. package/js/src/base/functions/encode.js +6 -3
  52. package/js/src/base/functions/number.d.ts +1 -1
  53. package/js/src/base/functions/number.js +8 -5
  54. package/js/src/base/functions/rsa.js +6 -6
  55. package/js/src/base/types.d.ts +4 -0
  56. package/js/src/bigone.d.ts +4 -14
  57. package/js/src/bigone.js +1 -1
  58. package/js/src/binance.d.ts +13 -71
  59. package/js/src/binance.js +32 -8
  60. package/js/src/binancecoinm.d.ts +2 -22
  61. package/js/src/binanceusdm.d.ts +2 -22
  62. package/js/src/bingx.d.ts +4 -14
  63. package/js/src/bit2c.d.ts +2 -2
  64. package/js/src/bitbank.d.ts +2 -2
  65. package/js/src/bitbns.d.ts +2 -2
  66. package/js/src/bitfinex.d.ts +6 -16
  67. package/js/src/bitfinex.js +25 -1
  68. package/js/src/bitfinex2.d.ts +6 -16
  69. package/js/src/bitfinex2.js +59 -51
  70. package/js/src/bitflyer.d.ts +2 -2
  71. package/js/src/bitget.d.ts +7 -17
  72. package/js/src/bitget.js +1 -5
  73. package/js/src/bithumb.d.ts +3 -3
  74. package/js/src/bitmart.d.ts +5 -14
  75. package/js/src/bitmart.js +3 -3
  76. package/js/src/bitmex.d.ts +4 -4
  77. package/js/src/bitopro.d.ts +2 -2
  78. package/js/src/bitrue.d.ts +5 -5
  79. package/js/src/bitso.d.ts +2 -2
  80. package/js/src/bitstamp.d.ts +3 -3
  81. package/js/src/bitstamp.js +1 -3
  82. package/js/src/bitteam.d.ts +2 -2
  83. package/js/src/bitvavo.d.ts +5 -5
  84. package/js/src/bl3p.d.ts +2 -2
  85. package/js/src/blockchaincom.d.ts +2 -2
  86. package/js/src/blofin.d.ts +4 -14
  87. package/js/src/btcalpha.d.ts +2 -2
  88. package/js/src/btcbox.d.ts +2 -2
  89. package/js/src/btcmarkets.d.ts +2 -2
  90. package/js/src/btcturk.d.ts +2 -2
  91. package/js/src/bybit.d.ts +8 -56
  92. package/js/src/bybit.js +1 -0
  93. package/js/src/cex.d.ts +2 -2
  94. package/js/src/coinbase.d.ts +4 -4
  95. package/js/src/coinbasepro.d.ts +3 -3
  96. package/js/src/coincheck.d.ts +2 -2
  97. package/js/src/coinex.d.ts +6 -16
  98. package/js/src/coinex.js +321 -537
  99. package/js/src/coinlist.d.ts +5 -15
  100. package/js/src/coinlist.js +1 -2
  101. package/js/src/coinmate.d.ts +2 -2
  102. package/js/src/coinmetro.d.ts +3 -3
  103. package/js/src/coinone.d.ts +2 -2
  104. package/js/src/coinsph.d.ts +2 -2
  105. package/js/src/coinspot.d.ts +2 -2
  106. package/js/src/cryptocom.d.ts +2 -2
  107. package/js/src/currencycom.d.ts +3 -3
  108. package/js/src/delta.d.ts +5 -43
  109. package/js/src/deribit.d.ts +7 -55
  110. package/js/src/deribit.js +1 -1
  111. package/js/src/digifinex.d.ts +5 -15
  112. package/js/src/exmo.d.ts +2 -2
  113. package/js/src/gate.d.ts +6 -54
  114. package/js/src/gemini.d.ts +2 -2
  115. package/js/src/hitbtc.d.ts +4 -14
  116. package/js/src/hollaex.d.ts +3 -3
  117. package/js/src/hollaex.js +3 -3
  118. package/js/src/htx.d.ts +6 -16
  119. package/js/src/htx.js +1 -1
  120. package/js/src/huobijp.d.ts +4 -4
  121. package/js/src/hyperliquid.d.ts +1 -1
  122. package/js/src/idex.d.ts +3 -3
  123. package/js/src/independentreserve.d.ts +2 -2
  124. package/js/src/indodax.d.ts +2 -2
  125. package/js/src/indodax.js +1 -1
  126. package/js/src/kraken.d.ts +4 -14
  127. package/js/src/krakenfutures.d.ts +4 -14
  128. package/js/src/kucoin.d.ts +5 -15
  129. package/js/src/kucoinfutures.d.ts +4 -14
  130. package/js/src/kuna.d.ts +2 -2
  131. package/js/src/latoken.d.ts +5 -15
  132. package/js/src/latoken.js +1 -1
  133. package/js/src/lbank.d.ts +2 -2
  134. package/js/src/luno.d.ts +2 -2
  135. package/js/src/lykke.d.ts +2 -2
  136. package/js/src/mercado.d.ts +2 -2
  137. package/js/src/mexc.d.ts +8 -28
  138. package/js/src/mexc.js +1 -1
  139. package/js/src/ndax.d.ts +2 -2
  140. package/js/src/novadax.d.ts +4 -15
  141. package/js/src/novadax.js +0 -1
  142. package/js/src/okcoin.d.ts +4 -14
  143. package/js/src/okx.d.ts +10 -68
  144. package/js/src/okx.js +17 -0
  145. package/js/src/onetrading.d.ts +2 -2
  146. package/js/src/paymium.d.ts +4 -14
  147. package/js/src/phemex.d.ts +5 -15
  148. package/js/src/poloniex.d.ts +3 -13
  149. package/js/src/poloniex.js +1 -2
  150. package/js/src/poloniexfutures.d.ts +2 -2
  151. package/js/src/pro/bitget.js +137 -193
  152. package/js/src/pro/bybit.js +4 -2
  153. package/js/src/pro/coinbaseinternational.d.ts +3 -3
  154. package/js/src/pro/coinbaseinternational.js +9 -1
  155. package/js/src/pro/okx.d.ts +4 -1
  156. package/js/src/pro/okx.js +85 -0
  157. package/js/src/pro/woofipro.d.ts +47 -0
  158. package/js/src/pro/woofipro.js +1264 -0
  159. package/js/src/probit.d.ts +3 -3
  160. package/js/src/timex.d.ts +2 -2
  161. package/js/src/tokocrypto.d.ts +3 -3
  162. package/js/src/upbit.d.ts +2 -2
  163. package/js/src/wavesexchange.d.ts +3 -3
  164. package/js/src/wavesexchange.js +2 -2
  165. package/js/src/wazirx.d.ts +2 -2
  166. package/js/src/whitebit.d.ts +3 -13
  167. package/js/src/woo.d.ts +7 -17
  168. package/js/src/woo.js +17 -3
  169. package/js/src/woofipro.d.ts +131 -0
  170. package/js/src/woofipro.js +2699 -0
  171. package/js/src/yobit.d.ts +2 -2
  172. package/js/src/zaif.d.ts +2 -2
  173. package/js/src/zonda.d.ts +4 -14
  174. package/package.json +1 -1
@@ -1729,10 +1729,9 @@ class coinlist extends coinlist$1 {
1729
1729
  */
1730
1730
  await this.loadMarkets();
1731
1731
  const currency = this.currency(code);
1732
- amount = this.currencyToPrecision(code, amount);
1733
1732
  const request = {
1734
1733
  'asset': currency['id'],
1735
- 'amount': amount,
1734
+ 'amount': this.currencyToPrecision(code, amount),
1736
1735
  };
1737
1736
  const accountsByType = this.safeValue(this.options, 'accountsByType', {});
1738
1737
  const fromAcc = this.safeString(accountsByType, fromAccount, fromAccount);
@@ -2887,7 +2887,7 @@ class deribit extends deribit$1 {
2887
2887
  'id': this.safeString(transfer, 'id'),
2888
2888
  'status': this.parseTransferStatus(status),
2889
2889
  'amount': this.safeNumber(transfer, 'amount'),
2890
- 'code': this.safeCurrencyCode(currencyId, currency),
2890
+ 'currency': this.safeCurrencyCode(currencyId, currency),
2891
2891
  'fromAccount': direction !== 'payment' ? account : undefined,
2892
2892
  'toAccount': direction === 'payment' ? account : undefined,
2893
2893
  'timestamp': timestamp,
@@ -534,12 +534,12 @@ class hollaex extends hollaex$1 {
534
534
  //
535
535
  return this.parseTickers(response, symbols);
536
536
  }
537
- parseTickers(response, symbols = undefined, params = {}) {
537
+ parseTickers(tickers, symbols = undefined, params = {}) {
538
538
  const result = {};
539
- const keys = Object.keys(response);
539
+ const keys = Object.keys(tickers);
540
540
  for (let i = 0; i < keys.length; i++) {
541
541
  const key = keys[i];
542
- const ticker = response[key];
542
+ const ticker = tickers[key];
543
543
  const marketId = this.safeString(ticker, 'symbol', key);
544
544
  const market = this.safeMarket(marketId, undefined, '-');
545
545
  const symbol = market['symbol'];
@@ -3303,7 +3303,7 @@ class htx extends htx$1 {
3303
3303
  }
3304
3304
  return result;
3305
3305
  }
3306
- networkIdToCode(networkId, currencyCode = undefined) {
3306
+ networkIdToCode(networkId = undefined, currencyCode = undefined) {
3307
3307
  // here network-id is provided as a pair of currency & chain (i.e. trc20usdt)
3308
3308
  const keys = Object.keys(this.options['networkNamesByChainIds']);
3309
3309
  const keysLength = keys.length;
@@ -510,7 +510,7 @@ class indodax extends indodax$1 {
510
510
  // }
511
511
  //
512
512
  const response = await this.publicGetApiTickerAll(params);
513
- const tickers = this.safeList(response, 'tickers');
513
+ const tickers = this.safeDict(response, 'tickers', {});
514
514
  return this.parseTickers(tickers, symbols);
515
515
  }
516
516
  parseTrade(trade, market = undefined) {
@@ -616,7 +616,7 @@ class latoken extends latoken$1 {
616
616
  //
617
617
  const marketId = this.safeString(ticker, 'symbol');
618
618
  const last = this.safeString(ticker, 'lastPrice');
619
- const timestamp = this.safeInteger(ticker, 'updateTimestamp');
619
+ const timestamp = this.safeIntegerOmitZero(ticker, 'updateTimestamp'); // sometimes latoken provided '0' ts from /ticker endpoint
620
620
  return this.safeTicker({
621
621
  'symbol': this.safeSymbol(marketId, market),
622
622
  'timestamp': timestamp,
@@ -4967,7 +4967,7 @@ class mexc extends mexc$1 {
4967
4967
  'lastUpdateTimestamp': undefined,
4968
4968
  });
4969
4969
  }
4970
- async fetchTransfer(id, since = undefined, limit = undefined, params = {}) {
4970
+ async fetchTransfer(id, code = undefined, params = {}) {
4971
4971
  const [marketType, query] = this.handleMarketTypeAndParams('fetchTransfer', undefined, params);
4972
4972
  await this.loadMarkets();
4973
4973
  if (marketType === 'spot') {
@@ -1189,7 +1189,6 @@ class novadax extends novadax$1 {
1189
1189
  'info': transfer,
1190
1190
  'id': id,
1191
1191
  'amount': undefined,
1192
- 'code': currencyCode,
1193
1192
  'currency': currencyCode,
1194
1193
  'fromAccount': undefined,
1195
1194
  'toAccount': undefined,
@@ -480,6 +480,7 @@ class okx extends okx$1 {
480
480
  'tradingBot/grid/compute-margin-balance': 1,
481
481
  'tradingBot/grid/margin-balance': 1,
482
482
  'tradingBot/grid/min-investment': 1,
483
+ 'tradingBot/grid/adjust-investment': 1,
483
484
  'tradingBot/signal/create-signal': 1,
484
485
  'tradingBot/signal/order-algo': 1,
485
486
  'tradingBot/signal/stop-order-algo': 1,
@@ -6010,6 +6011,22 @@ class okx extends okx$1 {
6010
6011
  // "nextFundingRate": "0.00017",
6011
6012
  // "nextFundingTime": "1634284800000"
6012
6013
  // }
6014
+ // ws
6015
+ // {
6016
+ // "fundingRate":"0.0001875391284828",
6017
+ // "fundingTime":"1700726400000",
6018
+ // "instId":"BTC-USD-SWAP",
6019
+ // "instType":"SWAP",
6020
+ // "method": "next_period",
6021
+ // "maxFundingRate":"0.00375",
6022
+ // "minFundingRate":"-0.00375",
6023
+ // "nextFundingRate":"0.0002608059239328",
6024
+ // "nextFundingTime":"1700755200000",
6025
+ // "premium": "0.0001233824646391",
6026
+ // "settFundingRate":"0.0001699799259033",
6027
+ // "settState":"settled",
6028
+ // "ts":"1700724675402"
6029
+ // }
6013
6030
  //
6014
6031
  // in the response above nextFundingRate is actually two funding rates from now
6015
6032
  //
@@ -1846,12 +1846,11 @@ class poloniex extends poloniex$1 {
1846
1846
  */
1847
1847
  await this.loadMarkets();
1848
1848
  const currency = this.currency(code);
1849
- amount = this.currencyToPrecision(code, amount);
1850
1849
  const accountsByType = this.safeValue(this.options, 'accountsByType', {});
1851
1850
  const fromId = this.safeString(accountsByType, fromAccount, fromAccount);
1852
1851
  const toId = this.safeString(accountsByType, toAccount, fromAccount);
1853
1852
  const request = {
1854
- 'amount': amount,
1853
+ 'amount': this.currencyToPrecision(code, amount),
1855
1854
  'currency': currency['id'],
1856
1855
  'fromAccount': fromId,
1857
1856
  'toAccount': toId,
@@ -972,9 +972,9 @@ class bitget extends bitget$1 {
972
972
  await this.loadMarkets();
973
973
  let market = undefined;
974
974
  let marketId = undefined;
975
- const isStop = this.safeBool(params, 'stop', false);
976
- params = this.omit(params, 'stop');
977
- let messageHash = (isStop) ? 'triggerOrder' : 'order';
975
+ let isTrigger = undefined;
976
+ [isTrigger, params] = this.isTriggerOrder(params);
977
+ let messageHash = (isTrigger) ? 'triggerOrder' : 'order';
978
978
  let subscriptionHash = 'order:trades';
979
979
  if (symbol !== undefined) {
980
980
  market = this.market(symbol);
@@ -987,19 +987,16 @@ class bitget extends bitget$1 {
987
987
  if ((type === 'spot') && (symbol === undefined)) {
988
988
  throw new errors.ArgumentsRequired(this.id + ' watchOrders requires a symbol argument for ' + type + ' markets.');
989
989
  }
990
- if (isStop && type === 'spot') {
991
- throw new errors.NotSupported(this.id + ' watchOrders does not support stop orders for ' + type + ' markets.');
992
- }
993
990
  let instType = undefined;
994
991
  [instType, params] = this.getInstType(market, params);
995
992
  if (type === 'spot') {
996
993
  subscriptionHash = subscriptionHash + ':' + symbol;
997
994
  }
998
- if (isStop) {
995
+ if (isTrigger) {
999
996
  subscriptionHash = subscriptionHash + ':stop'; // we don't want to re-use the same subscription hash for stop orders
1000
997
  }
1001
998
  const instId = (type === 'spot') ? marketId : 'default'; // different from other streams here the 'rest' id is required for spot markets, contract markets require default here
1002
- let channel = isStop ? 'orders-algo' : 'orders';
999
+ let channel = isTrigger ? 'orders-algo' : 'orders';
1003
1000
  let marginMode = undefined;
1004
1001
  [marginMode, params] = this.handleMarginModeAndParams('watchOrders', params);
1005
1002
  if (marginMode !== undefined) {
@@ -1030,25 +1027,7 @@ class bitget extends bitget$1 {
1030
1027
  // "action": "snapshot",
1031
1028
  // "arg": { "instType": "SPOT", "channel": "orders", "instId": "BTCUSDT" },
1032
1029
  // "data": [
1033
- // {
1034
- // "instId": "BTCUSDT",
1035
- // "orderId": "1116512721422422017",
1036
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1037
- // "price": "35000.00",
1038
- // "size": "7.0000",
1039
- // "newSize": "500.0000",
1040
- // "notional": "7.000000",
1041
- // "orderType": "limit",
1042
- // "force": "gtc",
1043
- // "side": "buy",
1044
- // "accBaseVolume": "0.0000",
1045
- // "priceAvg": "0.00",
1046
- // "status": "live",
1047
- // "cTime": "1701923297267",
1048
- // "uTime": "1701923297267",
1049
- // "feeDetail": [],
1050
- // "enterPointSource": "WEB"
1051
- // }
1030
+ // // see all examples in parseWsOrder
1052
1031
  // ],
1053
1032
  // "ts": 1701923297285
1054
1033
  // }
@@ -1059,98 +1038,18 @@ class bitget extends bitget$1 {
1059
1038
  // "action": "snapshot",
1060
1039
  // "arg": { "instType": "USDT-FUTURES", "channel": "orders", "instId": "default" },
1061
1040
  // "data": [
1062
- // {
1063
- // "accBaseVolume": "0",
1064
- // "cTime": "1701920553759",
1065
- // "clientOid": "1116501214318198793",
1066
- // "enterPointSource": "WEB",
1067
- // "feeDetail": [{
1068
- // "feeCoin": "USDT",
1069
- // "fee": "-0.162003"
1070
- // }],
1071
- // "force": "gtc",
1072
- // "instId": "BTCUSDT",
1073
- // "leverage": "20",
1074
- // "marginCoin": "USDT",
1075
- // "marginMode": "isolated",
1076
- // "notionalUsd": "105",
1077
- // "orderId": "1116501214293032964",
1078
- // "orderType": "limit",
1079
- // "posMode": "hedge_mode",
1080
- // "posSide": "long",
1081
- // "price": "35000",
1082
- // "reduceOnly": "no",
1083
- // "side": "buy",
1084
- // "size": "0.003",
1085
- // "status": "canceled",
1086
- // "tradeSide": "open",
1087
- // "uTime": "1701920595866"
1088
- // }
1041
+ // // see all examples in parseWsOrder
1089
1042
  // ],
1090
1043
  // "ts": 1701920595879
1091
1044
  // }
1092
1045
  //
1093
- // trigger
1094
- //
1095
- // {
1096
- // "action": "snapshot",
1097
- // "arg": {
1098
- // "instType": "USDT-FUTURES",
1099
- // "channel": "orders-algo",
1100
- // "instId": "default"
1101
- // },
1102
- // "data": [
1103
- // {
1104
- // "instId": "BTCUSDT",
1105
- // "orderId": "1116508960750899201",
1106
- // "clientOid": "1116508960750899200",
1107
- // "triggerPrice": "35000.000000000",
1108
- // "triggerType": "mark_price",
1109
- // "triggerTime": "1701922464373",
1110
- // "planType": "pl",
1111
- // "price": "35000.000000000",
1112
- // "size": "0.001000000",
1113
- // "actualSize": "0.000000000",
1114
- // "orderType": "limit",
1115
- // "side": "buy",
1116
- // "tradeSide": "open",
1117
- // "posSide": "long",
1118
- // "marginCoin": "USDT",
1119
- // "status": "cancelled",
1120
- // "posMode": "hedge_mode",
1121
- // "enterPointSource": "api",
1122
- // "stopSurplusTriggerType": "fill_price",
1123
- // "stopLossTriggerType": "fill_price",
1124
- // "cTime": "1701922400653",
1125
- // "uTime": "1701922464373"
1126
- // }
1127
- // ],
1128
- // "ts": 1701922464417
1129
- // }
1130
- //
1131
1046
  // isolated and cross margin
1132
1047
  //
1133
1048
  // {
1134
1049
  // "action": "snapshot",
1135
1050
  // "arg": { "instType": "MARGIN", "channel": "orders-crossed", "instId": "BTCUSDT" },
1136
1051
  // "data": [
1137
- // {
1138
- // "enterPointSource": "web",
1139
- // "force": "gtc",
1140
- // "orderType": "limit",
1141
- // "price": "35000.000000000",
1142
- // "quoteSize": "10.500000000",
1143
- // "side": "buy",
1144
- // "status": "live",
1145
- // "baseSize": "0.000300000",
1146
- // "cTime": "1701923982427",
1147
- // "clientOid": "4902047879864dc980c4840e9906db4e",
1148
- // "fillPrice": "0.000000000",
1149
- // "baseVolume": "0.000000000",
1150
- // "fillTotalAmount": "0.000000000",
1151
- // "loanType": "auto-loan-and-repay",
1152
- // "orderId": "1116515595178356737"
1153
- // }
1052
+ // // see examples in parseWsOrder
1154
1053
  // ],
1155
1054
  // "ts": 1701923982497
1156
1055
  // }
@@ -1174,8 +1073,9 @@ class bitget extends bitget$1 {
1174
1073
  this.orders = new Cache.ArrayCacheBySymbolById(limit);
1175
1074
  this.triggerOrders = new Cache.ArrayCacheBySymbolById(limit);
1176
1075
  }
1177
- const stored = (channel === 'ordersAlgo') ? this.triggerOrders : this.orders;
1178
- const messageHash = (channel === 'ordersAlgo') ? 'triggerOrder' : 'order';
1076
+ const isTrigger = (channel === 'orders-algo') || (channel === 'ordersAlgo');
1077
+ const stored = isTrigger ? this.triggerOrders : this.orders;
1078
+ const messageHash = isTrigger ? 'triggerOrder' : 'order';
1179
1079
  const marketSymbols = {};
1180
1080
  for (let i = 0; i < data.length; i++) {
1181
1081
  const order = data[i];
@@ -1198,81 +1098,90 @@ class bitget extends bitget$1 {
1198
1098
  //
1199
1099
  // spot
1200
1100
  //
1201
- // {
1202
- // "instId": "BTCUSDT",
1203
- // "orderId": "1116512721422422017",
1204
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1205
- // "price": "35000.00",
1206
- // "size": "7.0000",
1207
- // "newSize": "500.0000",
1208
- // "notional": "7.000000",
1209
- // "orderType": "limit",
1210
- // "force": "gtc",
1211
- // "side": "buy",
1212
- // "accBaseVolume": "0.0000",
1213
- // "priceAvg": "0.00",
1214
- // "status": "live",
1215
- // "cTime": "1701923297267",
1216
- // "uTime": "1701923297267",
1217
- // "feeDetail": [],
1218
- // "enterPointSource": "WEB"
1219
- // }
1101
+ // {
1102
+ // instId: 'EOSUSDT',
1103
+ // orderId: '1171779081105780739',
1104
+ // price: '0.81075', // limit price, field not present for market orders
1105
+ // clientOid: 'a2330139-1d04-4d78-98be-07de3cfd1055',
1106
+ // notional: '5.675250', // this is not cost! but notional
1107
+ // newSize: '7.0000', // this is not cost! quanity (for limit order or market sell) or cost (for market buy order)
1108
+ // size: '5.6752', // this is not cost, neither quanity, but notional! this field for "spot" can be ignored at all
1109
+ // // Note: for limit order (even filled) we don't have cost value in response, only in market order
1110
+ // orderType: 'limit', // limit, market
1111
+ // force: 'gtc',
1112
+ // side: 'buy',
1113
+ // accBaseVolume: '0.0000', // in case of 'filled', this would be set (for limit orders, this is the only indicator of the amount filled)
1114
+ // priceAvg: '0.00000', // in case of 'filled', this would be set
1115
+ // status: 'live', // live, filled, partially_filled
1116
+ // cTime: '1715099824215',
1117
+ // uTime: '1715099824215',
1118
+ // feeDetail: [],
1119
+ // enterPointSource: 'API'
1120
+ // #### trigger order has these additional fields: ####
1121
+ // "triggerPrice": "35100",
1122
+ // "price": "35100", // this is same as trigger price
1123
+ // "executePrice": "35123", // this is limit price
1124
+ // "triggerType": "fill_price",
1125
+ // "planType": "amount",
1126
+ // #### in case order had fill: ####
1127
+ // fillPrice: '35123',
1128
+ // tradeId: '1171775539946528779',
1129
+ // baseVolume: '7', // field present in market order
1130
+ // fillTime: '1715098979937',
1131
+ // fillFee: '-0.0069987',
1132
+ // fillFeeCoin: 'BTC',
1133
+ // tradeScope: 'T',
1134
+ // }
1220
1135
  //
1221
1136
  // contract
1222
1137
  //
1223
1138
  // {
1224
- // "accBaseVolume": "0",
1225
- // "cTime": "1701920553759",
1226
- // "clientOid": "1116501214318198793",
1227
- // "enterPointSource": "WEB",
1228
- // "feeDetail": [{
1139
+ // accBaseVolume: '0', // total amount filled during lifetime for order
1140
+ // cTime: '1715065875539',
1141
+ // clientOid: '1171636690041344003',
1142
+ // enterPointSource: 'API',
1143
+ // feeDetail: [ {
1229
1144
  // "feeCoin": "USDT",
1230
1145
  // "fee": "-0.162003"
1231
- // }],
1232
- // "force": "gtc",
1233
- // "instId": "BTCUSDT",
1234
- // "leverage": "20",
1235
- // "marginCoin": "USDT",
1236
- // "marginMode": "isolated",
1237
- // "notionalUsd": "105",
1238
- // "orderId": "1116501214293032964",
1239
- // "orderType": "limit",
1240
- // "posMode": "hedge_mode",
1241
- // "posSide": "long",
1242
- // "price": "35000",
1243
- // "reduceOnly": "no",
1244
- // "side": "buy",
1245
- // "size": "0.003",
1246
- // "status": "canceled",
1247
- // "tradeSide": "open",
1248
- // "uTime": "1701920595866"
1249
- // }
1250
- //
1251
- // trigger
1252
- //
1253
- // {
1254
- // "instId": "BTCUSDT",
1255
- // "orderId": "1116508960750899201",
1256
- // "clientOid": "1116508960750899200",
1257
- // "triggerPrice": "35000.000000000",
1146
+ // } ],
1147
+ // force: 'gtc',
1148
+ // instId: 'SEOSSUSDT',
1149
+ // leverage: '10',
1150
+ // marginCoin: 'USDT',
1151
+ // marginMode: 'crossed',
1152
+ // notionalUsd: '10.4468',
1153
+ // orderId: '1171636690028761089',
1154
+ // orderType: 'market',
1155
+ // posMode: 'hedge_mode', // one_way_mode, hedge_mode
1156
+ // posSide: 'short', // short, long, net
1157
+ // price: '0', // zero for market order
1158
+ // reduceOnly: 'no',
1159
+ // side: 'sell',
1160
+ // size: '13', // this is contracts amount
1161
+ // status: 'live', // live, filled, cancelled
1162
+ // tradeSide: 'open',
1163
+ // uTime: '1715065875539'
1164
+ // #### when filled order is incoming, these additional fields are present too: ###
1165
+ // baseVolume: '9', // amount filled for the incoming update/trade
1166
+ // accBaseVolume: '13', // i.e. 9 has been filled from 13 amount (this value is same as 'size')
1167
+ // fillFee: '-0.0062712',
1168
+ // fillFeeCoin: 'SUSDT',
1169
+ // fillNotionalUsd: '10.452',
1170
+ // fillPrice: '0.804',
1171
+ // fillTime: '1715065875605',
1172
+ // pnl: '0',
1173
+ // priceAvg: '0.804',
1174
+ // tradeId: '1171636690314407937',
1175
+ // tradeScope: 'T',
1176
+ // #### trigger order has these additional fields:
1177
+ // "triggerPrice": "0.800000000",
1178
+ // "price": "0.800000000", // <-- this is same as trigger price, actual limit-price is not present in initial response
1258
1179
  // "triggerType": "mark_price",
1259
- // "triggerTime": "1701922464373",
1180
+ // "triggerTime": "1715082796679",
1260
1181
  // "planType": "pl",
1261
- // "price": "35000.000000000",
1262
- // "size": "0.001000000",
1263
1182
  // "actualSize": "0.000000000",
1264
- // "orderType": "limit",
1265
- // "side": "buy",
1266
- // "tradeSide": "open",
1267
- // "posSide": "long",
1268
- // "marginCoin": "USDT",
1269
- // "status": "cancelled",
1270
- // "posMode": "hedge_mode",
1271
- // "enterPointSource": "api",
1272
1183
  // "stopSurplusTriggerType": "fill_price",
1273
1184
  // "stopLossTriggerType": "fill_price",
1274
- // "cTime": "1701922400653",
1275
- // "uTime": "1701922464373"
1276
1185
  // }
1277
1186
  //
1278
1187
  // isolated and cross margin
@@ -1280,6 +1189,7 @@ class bitget extends bitget$1 {
1280
1189
  // {
1281
1190
  // "enterPointSource": "web",
1282
1191
  // "force": "gtc",
1192
+ // "feeDetail": [],
1283
1193
  // "orderType": "limit",
1284
1194
  // "price": "35000.000000000",
1285
1195
  // "quoteSize": "10.500000000",
@@ -1295,6 +1205,8 @@ class bitget extends bitget$1 {
1295
1205
  // "orderId": "1116515595178356737"
1296
1206
  // }
1297
1207
  //
1208
+ const isSpot = !('posMode' in order);
1209
+ const isMargin = ('loanType' in order);
1298
1210
  const marketId = this.safeString(order, 'instId');
1299
1211
  market = this.safeMarket(marketId, market);
1300
1212
  const timestamp = this.safeInteger(order, 'cTime');
@@ -1312,24 +1224,54 @@ class bitget extends bitget$1 {
1312
1224
  };
1313
1225
  }
1314
1226
  const triggerPrice = this.safeNumber(order, 'triggerPrice');
1315
- const price = this.safeString(order, 'price');
1227
+ const isTriggerOrder = (triggerPrice !== undefined);
1228
+ let price = undefined;
1229
+ if (!isTriggerOrder) {
1230
+ price = this.safeNumber(order, 'price');
1231
+ }
1232
+ else if (isSpot && isTriggerOrder) {
1233
+ // for spot trigger order, limit price is this
1234
+ price = this.safeNumber(order, 'executePrice');
1235
+ }
1316
1236
  const avgPrice = this.omitZero(this.safeString2(order, 'priceAvg', 'fillPrice'));
1317
- let cost = this.safeStringN(order, ['notional', 'notionalUsd', 'quoteSize']);
1318
1237
  const side = this.safeString(order, 'side');
1319
1238
  const type = this.safeString(order, 'orderType');
1320
- if (side === 'buy' && market['spot'] && (type === 'market')) {
1321
- cost = this.safeString(order, 'newSize', cost);
1322
- }
1323
- const filled = this.safeString2(order, 'accBaseVolume', 'baseVolume');
1324
- // if (market['spot'] && (rawStatus !== 'live')) {
1325
- // filled = Precise.stringDiv (cost, avgPrice);
1326
- // }
1327
- let amount = this.safeString(order, 'baseVolume');
1328
- if (!market['spot'] || !(side === 'buy' && type === 'market')) {
1329
- amount = this.safeString(order, 'newSize', amount);
1239
+ const accBaseVolume = this.omitZero(this.safeString(order, 'accBaseVolume'));
1240
+ const newSizeValue = this.omitZero(this.safeString(order, 'newSize'));
1241
+ const isMarketOrder = (type === 'market');
1242
+ const isBuy = (side === 'buy');
1243
+ let totalAmount = undefined;
1244
+ let filledAmount = undefined;
1245
+ let cost = undefined;
1246
+ if (isSpot) {
1247
+ if (isMargin) {
1248
+ filledAmount = this.omitZero(this.safeString(order, 'fillTotalAmount'));
1249
+ totalAmount = this.omitZero(this.safeString(order, 'baseSize')); // for margin trading
1250
+ cost = this.safeString(order, 'quoteSize');
1251
+ }
1252
+ else {
1253
+ filledAmount = this.omitZero(this.safeString2(order, 'accBaseVolume', 'baseVolume'));
1254
+ if (isMarketOrder) {
1255
+ if (isBuy) {
1256
+ totalAmount = accBaseVolume;
1257
+ cost = newSizeValue;
1258
+ }
1259
+ else {
1260
+ totalAmount = newSizeValue;
1261
+ // we don't have cost for market-sell order
1262
+ }
1263
+ }
1264
+ else {
1265
+ totalAmount = this.safeString(order, 'newSize');
1266
+ // we don't have cost for limit order
1267
+ }
1268
+ }
1330
1269
  }
1331
- if (market['swap'] && (amount === undefined)) {
1332
- amount = this.safeString(order, 'size');
1270
+ else {
1271
+ // baseVolume should not be used for "amount" for contracts !
1272
+ filledAmount = this.safeString(order, 'baseVolume');
1273
+ totalAmount = this.safeString(order, 'size');
1274
+ cost = this.safeString(order, 'fillNotionalUsd');
1333
1275
  }
1334
1276
  return this.safeOrder({
1335
1277
  'info': order,
@@ -1344,12 +1286,11 @@ class bitget extends bitget$1 {
1344
1286
  'postOnly': undefined,
1345
1287
  'side': side,
1346
1288
  'price': price,
1347
- 'stopPrice': triggerPrice,
1348
1289
  'triggerPrice': triggerPrice,
1349
- 'amount': amount,
1290
+ 'amount': totalAmount,
1350
1291
  'cost': cost,
1351
1292
  'average': avgPrice,
1352
- 'filled': filled,
1293
+ 'filled': filledAmount,
1353
1294
  'remaining': undefined,
1354
1295
  'status': this.parseWsOrderStatus(rawStatus),
1355
1296
  'fee': feeObject,
@@ -1774,6 +1715,9 @@ class bitget extends bitget$1 {
1774
1715
  'fill': this.handleMyTrades,
1775
1716
  'orders': this.handleOrder,
1776
1717
  'ordersAlgo': this.handleOrder,
1718
+ 'orders-algo': this.handleOrder,
1719
+ 'orders-crossed': this.handleOrder,
1720
+ 'orders-isolated': this.handleOrder,
1777
1721
  'account': this.handleBalance,
1778
1722
  'positions': this.handlePositions,
1779
1723
  'account-isolated': this.handleBalance,
@@ -50,7 +50,7 @@ class bybit extends bybit$1 {
50
50
  },
51
51
  'contract': 'wss://stream.{hostname}/v5/private',
52
52
  'usdc': 'wss://stream.{hostname}/trade/option/usdc/private/v1',
53
- 'trade': 'wss://stream-testnet.bybit.com/v5/trade',
53
+ 'trade': 'wss://stream.bybit.com/v5/trade',
54
54
  },
55
55
  },
56
56
  },
@@ -284,7 +284,9 @@ class bybit extends bybit$1 {
284
284
  const url = this.urls['api']['ws']['private']['trade'];
285
285
  await this.authenticate(url);
286
286
  const requestId = this.requestId().toString();
287
- delete orderRequest['orderFilter'];
287
+ if ('orderFilter' in orderRequest) {
288
+ delete orderRequest['orderFilter'];
289
+ }
288
290
  const request = {
289
291
  'op': 'order.cancel',
290
292
  'reqId': requestId,
@@ -172,7 +172,14 @@ class coinbaseinternational extends coinbaseinternational$1 {
172
172
  * @param {object} [params] extra parameters specific to the exchange API endpoint
173
173
  * @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
174
174
  */
175
- return await this.subscribeMultiple('RISK', symbols, params);
175
+ const fundingRate = await this.subscribeMultiple('RISK', symbols, params);
176
+ const symbol = this.safeString(fundingRate, 'symbol');
177
+ if (this.newUpdates) {
178
+ const result = {};
179
+ result[symbol] = fundingRate;
180
+ return result;
181
+ }
182
+ return this.filterByArray(this.fundingRates, 'symbol', symbols);
176
183
  }
177
184
  async watchTicker(symbol, params = {}) {
178
185
  /**
@@ -588,6 +595,7 @@ class coinbaseinternational extends coinbaseinternational$1 {
588
595
  //
589
596
  const channel = this.safeString(message, 'channel');
590
597
  const fundingRate = this.parseFundingRate(message);
598
+ this.fundingRates[fundingRate['symbol']] = fundingRate;
591
599
  client.resolve(fundingRate, channel + '::' + fundingRate['symbol']);
592
600
  }
593
601
  handleErrorMessage(client, message) {