ccxt 4.4.25 → 4.4.26

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 (67) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/alpaca.js +257 -11
  5. package/dist/cjs/src/base/Exchange.js +14 -1
  6. package/dist/cjs/src/binance.js +2 -3
  7. package/dist/cjs/src/bingx.js +7 -1
  8. package/dist/cjs/src/bitget.js +2 -2
  9. package/dist/cjs/src/bitmart.js +3 -3
  10. package/dist/cjs/src/bybit.js +3 -14
  11. package/dist/cjs/src/cex.js +40 -0
  12. package/dist/cjs/src/coinex.js +2 -4
  13. package/dist/cjs/src/digifinex.js +2 -2
  14. package/dist/cjs/src/exmo.js +1 -0
  15. package/dist/cjs/src/gate.js +3 -3
  16. package/dist/cjs/src/htx.js +2 -3
  17. package/dist/cjs/src/hyperliquid.js +14 -4
  18. package/dist/cjs/src/kucoin.js +2 -2
  19. package/dist/cjs/src/okx.js +3 -2
  20. package/dist/cjs/src/phemex.js +4 -2
  21. package/dist/cjs/src/pro/exmo.js +216 -3
  22. package/dist/cjs/src/whitebit.js +2 -2
  23. package/dist/cjs/src/xt.js +39 -27
  24. package/js/ccxt.d.ts +1 -1
  25. package/js/ccxt.js +1 -1
  26. package/js/src/abstract/alpaca.d.ts +1 -0
  27. package/js/src/abstract/bingx.d.ts +1 -0
  28. package/js/src/abstract/okx.d.ts +1 -0
  29. package/js/src/abstract/phemex.d.ts +1 -0
  30. package/js/src/alpaca.d.ts +6 -1
  31. package/js/src/alpaca.js +258 -12
  32. package/js/src/base/Exchange.d.ts +7 -6
  33. package/js/src/base/Exchange.js +14 -1
  34. package/js/src/base/types.d.ts +3 -3
  35. package/js/src/binance.d.ts +3 -14
  36. package/js/src/binance.js +2 -3
  37. package/js/src/bingx.js +7 -1
  38. package/js/src/bitget.d.ts +3 -13
  39. package/js/src/bitget.js +2 -2
  40. package/js/src/bitmart.d.ts +3 -13
  41. package/js/src/bitmart.js +3 -3
  42. package/js/src/bybit.d.ts +3 -14
  43. package/js/src/bybit.js +3 -14
  44. package/js/src/cex.d.ts +2 -0
  45. package/js/src/cex.js +40 -0
  46. package/js/src/coinex.d.ts +3 -15
  47. package/js/src/coinex.js +2 -4
  48. package/js/src/digifinex.d.ts +3 -13
  49. package/js/src/digifinex.js +2 -2
  50. package/js/src/exmo.js +1 -0
  51. package/js/src/gate.d.ts +3 -13
  52. package/js/src/gate.js +3 -3
  53. package/js/src/htx.d.ts +3 -14
  54. package/js/src/htx.js +2 -3
  55. package/js/src/hyperliquid.js +14 -4
  56. package/js/src/kucoin.d.ts +3 -13
  57. package/js/src/kucoin.js +2 -2
  58. package/js/src/okx.d.ts +3 -13
  59. package/js/src/okx.js +3 -2
  60. package/js/src/phemex.js +4 -2
  61. package/js/src/pro/exmo.d.ts +5 -1
  62. package/js/src/pro/exmo.js +216 -3
  63. package/js/src/whitebit.d.ts +3 -13
  64. package/js/src/whitebit.js +2 -2
  65. package/js/src/woo.d.ts +1 -1
  66. package/js/src/xt.js +39 -27
  67. package/package.json +1 -1
package/js/src/alpaca.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import Exchange from './abstract/alpaca.js';
9
- import { ExchangeError, BadRequest, PermissionDenied, BadSymbol, NotSupported, InsufficientFunds, InvalidOrder, RateLimitExceeded } from './base/errors.js';
9
+ import { ExchangeError, BadRequest, PermissionDenied, BadSymbol, NotSupported, InsufficientFunds, InvalidOrder, RateLimitExceeded, ArgumentsRequired } from './base/errors.js';
10
10
  import { TICK_SIZE } from './base/functions/number.js';
11
11
  // ---------------------------------------------------------------------------xs
12
12
  /**
@@ -57,7 +57,7 @@ export default class alpaca extends Exchange {
57
57
  'fetchBidsAsks': false,
58
58
  'fetchClosedOrders': true,
59
59
  'fetchCurrencies': false,
60
- 'fetchDepositAddress': false,
60
+ 'fetchDepositAddress': true,
61
61
  'fetchDepositAddressesByNetwork': false,
62
62
  'fetchDeposits': false,
63
63
  'fetchDepositsWithdrawals': false,
@@ -68,7 +68,7 @@ export default class alpaca extends Exchange {
68
68
  'fetchL1OrderBook': true,
69
69
  'fetchL2OrderBook': false,
70
70
  'fetchMarkets': true,
71
- 'fetchMyTrades': false,
71
+ 'fetchMyTrades': true,
72
72
  'fetchOHLCV': true,
73
73
  'fetchOpenOrder': false,
74
74
  'fetchOpenOrders': true,
@@ -83,8 +83,8 @@ export default class alpaca extends Exchange {
83
83
  'fetchPositionsHistory': false,
84
84
  'fetchPositionsRisk': false,
85
85
  'fetchStatus': false,
86
- 'fetchTicker': false,
87
- 'fetchTickers': false,
86
+ 'fetchTicker': true,
87
+ 'fetchTickers': true,
88
88
  'fetchTime': true,
89
89
  'fetchTrades': true,
90
90
  'fetchTradingFee': false,
@@ -122,6 +122,7 @@ export default class alpaca extends Exchange {
122
122
  'v2/assets/{symbol_or_asset_id}',
123
123
  'v2/corporate_actions/announcements/{id}',
124
124
  'v2/corporate_actions/announcements',
125
+ 'v2/wallets',
125
126
  ],
126
127
  'post': [
127
128
  'v2/orders',
@@ -685,6 +686,136 @@ export default class alpaca extends Exchange {
685
686
  this.safeNumber(ohlcv, 'v'), // volume
686
687
  ];
687
688
  }
689
+ async fetchTicker(symbol, params = {}) {
690
+ /**
691
+ * @method
692
+ * @name alpaca#fetchTicker
693
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
694
+ * @see https://docs.alpaca.markets/reference/cryptosnapshots-1
695
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
696
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
697
+ * @param {string} [params.loc] crypto location, default: us
698
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
699
+ */
700
+ await this.loadMarkets();
701
+ symbol = this.symbol(symbol);
702
+ const tickers = await this.fetchTickers([symbol], params);
703
+ return this.safeDict(tickers, symbol);
704
+ }
705
+ async fetchTickers(symbols = undefined, params = {}) {
706
+ /**
707
+ * @method
708
+ * @name alpaca#fetchTickers
709
+ * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
710
+ * @see https://docs.alpaca.markets/reference/cryptosnapshots-1
711
+ * @param {string[]} symbols unified symbols of the markets to fetch tickers for
712
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
713
+ * @param {string} [params.loc] crypto location, default: us
714
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
715
+ */
716
+ if (symbols === undefined) {
717
+ throw new ArgumentsRequired(this.id + ' fetchTickers() requires a symbols argument');
718
+ }
719
+ await this.loadMarkets();
720
+ symbols = this.marketSymbols(symbols);
721
+ const loc = this.safeString(params, 'loc', 'us');
722
+ const ids = this.marketIds(symbols);
723
+ const request = {
724
+ 'symbols': ids.join(','),
725
+ 'loc': loc,
726
+ };
727
+ params = this.omit(params, 'loc');
728
+ const response = await this.marketPublicGetV1beta3CryptoLocSnapshots(this.extend(request, params));
729
+ //
730
+ // {
731
+ // "snapshots": {
732
+ // "BTC/USD": {
733
+ // "dailyBar": {
734
+ // "c": 69403.554,
735
+ // "h": 69609.6515,
736
+ // "l": 69013.26,
737
+ // "n": 9,
738
+ // "o": 69536.7,
739
+ // "t": "2024-11-01T05:00:00Z",
740
+ // "v": 0.210809181,
741
+ // "vw": 69327.655393908
742
+ // },
743
+ // "latestQuote": {
744
+ // "ap": 69424.19,
745
+ // "as": 0.68149,
746
+ // "bp": 69366.086,
747
+ // "bs": 0.68312,
748
+ // "t": "2024-11-01T08:31:41.880246926Z"
749
+ // },
750
+ // "latestTrade": {
751
+ // "i": 5272941104897543146,
752
+ // "p": 69416.9,
753
+ // "s": 0.014017324,
754
+ // "t": "2024-11-01T08:14:28.245088803Z",
755
+ // "tks": "B"
756
+ // },
757
+ // "minuteBar": {
758
+ // "c": 69403.554,
759
+ // "h": 69403.554,
760
+ // "l": 69399.125,
761
+ // "n": 0,
762
+ // "o": 69399.125,
763
+ // "t": "2024-11-01T08:30:00Z",
764
+ // "v": 0,
765
+ // "vw": 0
766
+ // },
767
+ // "prevDailyBar": {
768
+ // "c": 69515.1415,
769
+ // "h": 72668.837,
770
+ // "l": 68796.85,
771
+ // "n": 129,
772
+ // "o": 72258.9,
773
+ // "t": "2024-10-31T05:00:00Z",
774
+ // "v": 2.217683307,
775
+ // "vw": 70782.6811608144
776
+ // }
777
+ // },
778
+ // }
779
+ // }
780
+ //
781
+ const results = [];
782
+ const snapshots = this.safeDict(response, 'snapshots', {});
783
+ const marketIds = Object.keys(snapshots);
784
+ for (let i = 0; i < marketIds.length; i++) {
785
+ const marketId = marketIds[i];
786
+ const market = this.safeMarket(marketId);
787
+ const entry = this.safeDict(snapshots, marketId);
788
+ const dailyBar = this.safeDict(entry, 'dailyBar', {});
789
+ const prevDailyBar = this.safeDict(entry, 'prevDailyBar', {});
790
+ const latestQuote = this.safeDict(entry, 'latestQuote', {});
791
+ const latestTrade = this.safeDict(entry, 'latestTrade', {});
792
+ const datetime = this.safeString(latestQuote, 't');
793
+ const ticker = this.safeTicker({
794
+ 'info': entry,
795
+ 'symbol': market['symbol'],
796
+ 'timestamp': this.parse8601(datetime),
797
+ 'datetime': datetime,
798
+ 'high': this.safeString(dailyBar, 'h'),
799
+ 'low': this.safeString(dailyBar, 'l'),
800
+ 'bid': this.safeString(latestQuote, 'bp'),
801
+ 'bidVolume': this.safeString(latestQuote, 'bs'),
802
+ 'ask': this.safeString(latestQuote, 'ap'),
803
+ 'askVolume': this.safeString(latestQuote, 'as'),
804
+ 'vwap': this.safeString(dailyBar, 'vw'),
805
+ 'open': this.safeString(dailyBar, 'o'),
806
+ 'close': this.safeString(dailyBar, 'c'),
807
+ 'last': this.safeString(latestTrade, 'p'),
808
+ 'previousClose': this.safeString(prevDailyBar, 'c'),
809
+ 'change': undefined,
810
+ 'percentage': undefined,
811
+ 'average': undefined,
812
+ 'baseVolume': this.safeString(dailyBar, 'v'),
813
+ 'quoteVolume': this.safeString(dailyBar, 'n'),
814
+ }, market);
815
+ results.push(ticker);
816
+ }
817
+ return this.filterByArray(results, 'symbol', symbols);
818
+ }
688
819
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
689
820
  /**
690
821
  * @method
@@ -1055,7 +1186,59 @@ export default class alpaca extends Exchange {
1055
1186
  };
1056
1187
  return this.safeString(timeInForces, timeInForce, timeInForce);
1057
1188
  }
1189
+ async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1190
+ /**
1191
+ * @method
1192
+ * @name alpaca#fetchMyTrades
1193
+ * @description fetch all trades made by the user
1194
+ * @see https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
1195
+ * @param {string} [symbol] unified market symbol
1196
+ * @param {int} [since] the earliest time in ms to fetch trades for
1197
+ * @param {int} [limit] the maximum number of trade structures to retrieve
1198
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1199
+ * @param {int} [params.until] the latest time in ms to fetch trades for
1200
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1201
+ */
1202
+ await this.loadMarkets();
1203
+ let market = undefined;
1204
+ let request = {
1205
+ 'activity_type': 'FILL',
1206
+ };
1207
+ if (symbol !== undefined) {
1208
+ market = this.market(symbol);
1209
+ }
1210
+ if (since !== undefined) {
1211
+ request['after'] = since;
1212
+ }
1213
+ if (limit !== undefined) {
1214
+ request['page_size'] = limit;
1215
+ }
1216
+ [request, params] = this.handleUntilOption('until', request, params);
1217
+ const response = await this.traderPrivateGetV2AccountActivitiesActivityType(this.extend(request, params));
1218
+ //
1219
+ // [
1220
+ // {
1221
+ // "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1222
+ // "activity_type": "FILL",
1223
+ // "transaction_time": "2022-12-28T12:19:29.579352Z",
1224
+ // "type": "fill",
1225
+ // "price": "67.31",
1226
+ // "qty": "0.07",
1227
+ // "side": "sell",
1228
+ // "symbol": "LTC/USD",
1229
+ // "leaves_qty": "0",
1230
+ // "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1231
+ // "cum_qty": "0.07",
1232
+ // "order_status": "filled",
1233
+ // "swap_rate": "1"
1234
+ // },
1235
+ // ]
1236
+ //
1237
+ return this.parseTrades(response, market, since, limit);
1238
+ }
1058
1239
  parseTrade(trade, market = undefined) {
1240
+ //
1241
+ // fetchTrades
1059
1242
  //
1060
1243
  // {
1061
1244
  // "t":"2022-06-14T05:00:00.027869Z",
@@ -1066,27 +1249,45 @@ export default class alpaca extends Exchange {
1066
1249
  // "i":"355681339"
1067
1250
  // }
1068
1251
  //
1069
- const marketId = this.safeString(trade, 'S');
1252
+ // fetchMyTrades
1253
+ //
1254
+ // {
1255
+ // "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
1256
+ // "activity_type": "FILL",
1257
+ // "transaction_time": "2022-12-28T12:19:29.579352Z",
1258
+ // "type": "fill",
1259
+ // "price": "67.31",
1260
+ // "qty": "0.07",
1261
+ // "side": "sell",
1262
+ // "symbol": "LTC/USD",
1263
+ // "leaves_qty": "0",
1264
+ // "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
1265
+ // "cum_qty": "0.07",
1266
+ // "order_status": "filled",
1267
+ // "swap_rate": "1"
1268
+ // },
1269
+ //
1270
+ const marketId = this.safeString2(trade, 'S', 'symbol');
1070
1271
  const symbol = this.safeSymbol(marketId, market);
1071
- const datetime = this.safeString(trade, 't');
1272
+ const datetime = this.safeString2(trade, 't', 'transaction_time');
1072
1273
  const timestamp = this.parse8601(datetime);
1073
1274
  const alpacaSide = this.safeString(trade, 'tks');
1074
- let side;
1275
+ let side = this.safeString(trade, 'side');
1075
1276
  if (alpacaSide === 'B') {
1076
1277
  side = 'buy';
1077
1278
  }
1078
1279
  else if (alpacaSide === 'S') {
1079
1280
  side = 'sell';
1080
1281
  }
1081
- const priceString = this.safeString(trade, 'p');
1082
- const amountString = this.safeString(trade, 's');
1282
+ const priceString = this.safeString2(trade, 'p', 'price');
1283
+ const amountString = this.safeString2(trade, 's', 'qty');
1083
1284
  return this.safeTrade({
1084
1285
  'info': trade,
1085
- 'id': this.safeString(trade, 'i'),
1286
+ 'id': this.safeString2(trade, 'i', 'id'),
1086
1287
  'timestamp': timestamp,
1087
1288
  'datetime': this.iso8601(timestamp),
1088
1289
  'symbol': symbol,
1089
- 'order': undefined,
1290
+ 'order': this.safeString(trade, 'order_id'),
1090
1291
  'type': undefined,
1091
1292
  'side': side,
1092
1293
  'takerOrMaker': 'taker',
@@ -1096,6 +1297,51 @@ export default class alpaca extends Exchange {
1096
1297
  'fee': undefined,
1097
1298
  }, market);
1098
1299
  }
1300
+ async fetchDepositAddress(code, params = {}) {
1301
+ /**
1302
+ * @method
1303
+ * @name alpaca#fetchDepositAddress
1304
+ * @description fetch the deposit address for a currency associated with this account
1305
+ * @see https://docs.alpaca.markets/reference/listcryptofundingwallets
1306
+ * @param {string} code unified currency code
1307
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1308
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
1309
+ */
1310
+ await this.loadMarkets();
1311
+ const currency = this.currency(code);
1312
+ const request = {
1313
+ 'asset': currency['id'],
1314
+ };
1315
+ const response = await this.traderPrivateGetV2Wallets(this.extend(request, params));
1316
+ //
1317
+ // {
1318
+ // "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1319
+ // "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1320
+ // "created_at": "2024-11-03T07:30:05.609976344Z"
1321
+ // }
1322
+ //
1323
+ return this.parseDepositAddress(response, currency);
1324
+ }
1325
+ parseDepositAddress(depositAddress, currency = undefined) {
1326
+ //
1327
+ // {
1328
+ // "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
1329
+ // "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
1330
+ // "created_at": "2024-11-03T07:30:05.609976344Z"
1331
+ // }
1332
+ //
1333
+ let parsedCurrency = undefined;
1334
+ if (currency !== undefined) {
1335
+ parsedCurrency = currency['id'];
1336
+ }
1337
+ return {
1338
+ 'info': depositAddress,
1339
+ 'currency': parsedCurrency,
1340
+ 'network': undefined,
1341
+ 'address': this.safeString(depositAddress, 'address'),
1342
+ 'tag': undefined,
1343
+ };
1344
+ }
1099
1345
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
1100
1346
  let endpoint = '/' + this.implodeParams(path, params);
1101
1347
  let url = this.implodeHostname(this.urls['api'][api[0]]);
@@ -15,6 +15,7 @@ export default class Exchange {
15
15
  options: {
16
16
  [key: string]: any;
17
17
  };
18
+ isSandboxModeEnabled: boolean;
18
19
  throttleProp: any;
19
20
  sleep: (ms: any) => Promise<unknown>;
20
21
  api: any;
@@ -864,13 +865,13 @@ export default class Exchange {
864
865
  invertFlatStringDictionary(dict: any): {};
865
866
  reduceFeesByCurrency(fees: any): any[];
866
867
  safeTicker(ticker: Dict, market?: Market): Ticker;
867
- fetchBorrowRate(code: string, amount: any, params?: {}): Promise<{}>;
868
- repayCrossMargin(code: string, amount: any, params?: {}): Promise<{}>;
869
- repayIsolatedMargin(symbol: string, code: string, amount: any, params?: {}): Promise<{}>;
868
+ fetchBorrowRate(code: string, amount: number, params?: {}): Promise<{}>;
869
+ repayCrossMargin(code: string, amount: number, params?: {}): Promise<{}>;
870
+ repayIsolatedMargin(symbol: string, code: string, amount: number, params?: {}): Promise<{}>;
870
871
  borrowCrossMargin(code: string, amount: number, params?: {}): Promise<{}>;
871
872
  borrowIsolatedMargin(symbol: string, code: string, amount: number, params?: {}): Promise<{}>;
872
- borrowMargin(code: string, amount: any, symbol?: Str, params?: {}): Promise<{}>;
873
- repayMargin(code: string, amount: any, symbol?: Str, params?: {}): Promise<{}>;
873
+ borrowMargin(code: string, amount: number, symbol?: Str, params?: {}): Promise<{}>;
874
+ repayMargin(code: string, amount: number, symbol?: Str, params?: {}): Promise<{}>;
874
875
  fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
875
876
  fetchOHLCVWs(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
876
877
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
@@ -1097,7 +1098,7 @@ export default class Exchange {
1097
1098
  parseLastPrices(pricesData: any, symbols?: string[], params?: {}): LastPrices;
1098
1099
  parseTickers(tickers: any, symbols?: Strings, params?: {}): Tickers;
1099
1100
  parseDepositAddresses(addresses: any, codes?: Strings, indexed?: boolean, params?: {}): DepositAddress[];
1100
- parseBorrowInterests(response: any, market?: Market): any[];
1101
+ parseBorrowInterests(response: any, market?: Market): BorrowInterest[];
1101
1102
  parseBorrowRate(info: any, currency?: Currency): Dict;
1102
1103
  parseBorrowRateHistory(response: any, code: Str, since: Int, limit: Int): any;
1103
1104
  parseIsolatedBorrowRates(info: any): IsolatedBorrowRates;
@@ -32,6 +32,7 @@ import * as Starknet from '../static_dependencies/starknet/index.js';
32
32
  */
33
33
  export default class Exchange {
34
34
  constructor(userConfig = {}) {
35
+ this.isSandboxModeEnabled = false;
35
36
  this.throttleProp = undefined;
36
37
  this.sleep = sleep;
37
38
  this.api = undefined;
@@ -792,7 +793,15 @@ export default class Exchange {
792
793
  }
793
794
  else {
794
795
  try {
795
- return this.number(value);
796
+ // we should handle scientific notation here
797
+ // so if the exchanges returns 1e-8
798
+ // this function will return 0.00000001
799
+ // check https://github.com/ccxt/ccxt/issues/24135
800
+ const numberNormalized = this.numberToString(value);
801
+ if (numberNormalized.indexOf('e-') > -1) {
802
+ return this.number(numberToString(parseFloat(numberNormalized)));
803
+ }
804
+ return this.number(numberNormalized);
796
805
  }
797
806
  catch (e) {
798
807
  return d;
@@ -1961,6 +1970,8 @@ export default class Exchange {
1961
1970
  else {
1962
1971
  throw new NotSupported(this.id + ' does not have a sandbox URL');
1963
1972
  }
1973
+ // set flag
1974
+ this.isSandboxModeEnabled = true;
1964
1975
  }
1965
1976
  else if ('apiBackup' in this.urls) {
1966
1977
  if (typeof this.urls['api'] === 'string') {
@@ -1971,6 +1982,8 @@ export default class Exchange {
1971
1982
  }
1972
1983
  const newUrls = this.omit(this.urls, 'apiBackup');
1973
1984
  this.urls = newUrls;
1985
+ // set flag
1986
+ this.isSandboxModeEnabled = false;
1974
1987
  }
1975
1988
  }
1976
1989
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
@@ -309,15 +309,15 @@ export interface Position {
309
309
  percentage?: number;
310
310
  }
311
311
  export interface BorrowInterest {
312
- account?: Str;
312
+ info: any;
313
+ symbol?: Str;
313
314
  currency?: Str;
314
315
  interest?: number;
315
316
  interestRate?: number;
316
317
  amountBorrowed?: number;
317
318
  marginMode?: Str;
318
- timestamp?: number;
319
+ timestamp?: Int;
319
320
  datetime?: Str;
320
- info: any;
321
321
  }
322
322
  export interface LeverageTier {
323
323
  tier?: number;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/binance.js';
2
- import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRates, IsolatedBorrowRate, Dict, LeverageTier, LeverageTiers, int, LedgerEntry, FundingRate, FundingRates, DepositAddress, LongShortRatio } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRates, IsolatedBorrowRate, Dict, LeverageTier, LeverageTiers, int, LedgerEntry, FundingRate, FundingRates, DepositAddress, LongShortRatio, BorrowInterest } from './base/types.js';
3
3
  /**
4
4
  * @class binance
5
5
  * @augments Exchange
@@ -247,19 +247,8 @@ export default class binance extends Exchange {
247
247
  }>;
248
248
  redeemGiftCode(giftcardCode: any, params?: {}): Promise<any>;
249
249
  verifyGiftCode(id: string, params?: {}): Promise<any>;
250
- fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
251
- parseBorrowInterest(info: Dict, market?: Market): {
252
- account: string;
253
- symbol: string;
254
- marginMode: string;
255
- currency: string;
256
- interest: number;
257
- interestRate: number;
258
- amountBorrowed: number;
259
- timestamp: number;
260
- datetime: string;
261
- info: Dict;
262
- };
250
+ fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
251
+ parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
263
252
  repayCrossMargin(code: string, amount: any, params?: {}): Promise<{
264
253
  id: number;
265
254
  currency: string;
package/js/src/binance.js CHANGED
@@ -12378,16 +12378,15 @@ export default class binance extends Exchange {
12378
12378
  const timestamp = this.safeInteger(info, 'interestAccuredTime');
12379
12379
  const marginMode = (symbol === undefined) ? 'cross' : 'isolated';
12380
12380
  return {
12381
- 'account': (symbol === undefined) ? 'cross' : symbol,
12381
+ 'info': info,
12382
12382
  'symbol': symbol,
12383
- 'marginMode': marginMode,
12384
12383
  'currency': this.safeCurrencyCode(this.safeString(info, 'asset')),
12385
12384
  'interest': this.safeNumber(info, 'interest'),
12386
12385
  'interestRate': this.safeNumber(info, 'interestRate'),
12387
12386
  'amountBorrowed': this.safeNumber(info, 'principal'),
12387
+ 'marginMode': marginMode,
12388
12388
  'timestamp': timestamp,
12389
12389
  'datetime': this.iso8601(timestamp),
12390
- 'info': info,
12391
12390
  };
12392
12391
  }
12393
12392
  async repayCrossMargin(code, amount, params = {}) {
package/js/src/bingx.js CHANGED
@@ -207,6 +207,7 @@ export default class bingx extends Exchange {
207
207
  'market/markPriceKlines': 1,
208
208
  'trade/batchCancelReplace': 5,
209
209
  'trade/fullOrder': 2,
210
+ 'positionMargin/history': 2,
210
211
  },
211
212
  'post': {
212
213
  'trade/cancelReplace': 2,
@@ -2857,6 +2858,7 @@ export default class bingx extends Exchange {
2857
2858
  * @see https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Bulk%20order
2858
2859
  * @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
2859
2860
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2861
+ * @param {boolean} [params.sync] *spot only* if true, multiple orders are ordered serially and all orders do not require the same symbol/side/type
2860
2862
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2861
2863
  */
2862
2864
  await this.loadMarkets();
@@ -2889,6 +2891,10 @@ export default class bingx extends Exchange {
2889
2891
  response = await this.swapV2PrivatePostTradeBatchOrders(request);
2890
2892
  }
2891
2893
  else {
2894
+ const sync = this.safeBool(params, 'sync', false);
2895
+ if (sync) {
2896
+ request['sync'] = true;
2897
+ }
2892
2898
  request['data'] = this.json(ordersRequests);
2893
2899
  response = await this.spotV1PrivatePostTradeBatchOrders(request);
2894
2900
  }
@@ -3342,7 +3348,7 @@ export default class bingx extends Exchange {
3342
3348
  'cost': Precise.stringAbs(feeCost),
3343
3349
  },
3344
3350
  'trades': undefined,
3345
- 'reduceOnly': this.safeBool(order, 'reduceOnly'),
3351
+ 'reduceOnly': this.safeBool2(order, 'reduceOnly', 'ro'),
3346
3352
  }, market);
3347
3353
  }
3348
3354
  parseOrderStatus(status) {
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitget.js';
2
- import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Balances, Str, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Liquidation, TransferEntry, Leverage, MarginMode, Num, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRate, Dict, LeverageTier, int, LedgerEntry, FundingRate, DepositAddress, LongShortRatio } from './base/types.js';
2
+ import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Balances, Str, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Liquidation, TransferEntry, Leverage, MarginMode, Num, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRate, Dict, LeverageTier, int, LedgerEntry, FundingRate, DepositAddress, LongShortRatio, BorrowInterest } from './base/types.js';
3
3
  /**
4
4
  * @class bitget
5
5
  * @augments Exchange
@@ -154,18 +154,8 @@ export default class bitget extends Exchange {
154
154
  datetime: string;
155
155
  info: any;
156
156
  };
157
- fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
158
- parseBorrowInterest(info: Dict, market?: Market): {
159
- symbol: string;
160
- marginMode: string;
161
- currency: string;
162
- interest: number;
163
- interestRate: number;
164
- amountBorrowed: any;
165
- timestamp: number;
166
- datetime: string;
167
- info: Dict;
168
- };
157
+ fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
158
+ parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
169
159
  closePosition(symbol: string, side?: OrderSide, params?: {}): Promise<Order>;
170
160
  closeAllPositions(params?: {}): Promise<Position[]>;
171
161
  fetchMarginMode(symbol: string, params?: {}): Promise<MarginMode>;
package/js/src/bitget.js CHANGED
@@ -8352,15 +8352,15 @@ export default class bitget extends Exchange {
8352
8352
  const marginMode = (marketId !== undefined) ? 'isolated' : 'cross';
8353
8353
  const timestamp = this.safeInteger(info, 'cTime');
8354
8354
  return {
8355
+ 'info': info,
8355
8356
  'symbol': this.safeString(market, 'symbol'),
8356
- 'marginMode': marginMode,
8357
8357
  'currency': this.safeCurrencyCode(this.safeString(info, 'interestCoin')),
8358
8358
  'interest': this.safeNumber(info, 'interestAmount'),
8359
8359
  'interestRate': this.safeNumber(info, 'dailyInterestRate'),
8360
8360
  'amountBorrowed': undefined,
8361
+ 'marginMode': marginMode,
8361
8362
  'timestamp': timestamp,
8362
8363
  'datetime': this.iso8601(timestamp),
8363
- 'info': info,
8364
8364
  };
8365
8365
  }
8366
8366
  async closePosition(symbol, side = undefined, params = {}) {
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitmart.js';
2
- import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, OrderRequest, int, FundingRate, DepositAddress } from './base/types.js';
2
+ import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, OrderRequest, int, FundingRate, DepositAddress, BorrowInterest } from './base/types.js';
3
3
  /**
4
4
  * @class bitmart
5
5
  * @augments Exchange
@@ -97,18 +97,8 @@ export default class bitmart extends Exchange {
97
97
  parseTransferFromAccount(type: any): string;
98
98
  parseTransfer(transfer: Dict, currency?: Currency): TransferEntry;
99
99
  fetchTransfers(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<TransferEntry[]>;
100
- fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
101
- parseBorrowInterest(info: Dict, market?: Market): {
102
- symbol: string;
103
- marginMode: string;
104
- currency: string;
105
- interest: number;
106
- interestRate: number;
107
- amountBorrowed: number;
108
- timestamp: number;
109
- datetime: string;
110
- info: Dict;
111
- };
100
+ fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
101
+ parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
112
102
  fetchOpenInterest(symbol: string, params?: {}): Promise<import("./base/types.js").OpenInterest>;
113
103
  parseOpenInterest(interest: any, market?: Market): import("./base/types.js").OpenInterest;
114
104
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
package/js/src/bitmart.js CHANGED
@@ -1858,7 +1858,7 @@ export default class bitmart extends Exchange {
1858
1858
  }
1859
1859
  }
1860
1860
  else {
1861
- const maxLimit = 1200;
1861
+ const maxLimit = 500;
1862
1862
  if (limit === undefined) {
1863
1863
  limit = maxLimit;
1864
1864
  }
@@ -4339,15 +4339,15 @@ export default class bitmart extends Exchange {
4339
4339
  market = this.safeMarket(marketId, market);
4340
4340
  const timestamp = this.safeInteger(info, 'create_time');
4341
4341
  return {
4342
+ 'info': info,
4342
4343
  'symbol': this.safeString(market, 'symbol'),
4343
- 'marginMode': 'isolated',
4344
4344
  'currency': this.safeCurrencyCode(this.safeString(info, 'currency')),
4345
4345
  'interest': this.safeNumber(info, 'interest_amount'),
4346
4346
  'interestRate': this.safeNumber(info, 'hourly_interest'),
4347
4347
  'amountBorrowed': this.safeNumber(info, 'borrow_amount'),
4348
+ 'marginMode': 'isolated',
4348
4349
  'timestamp': timestamp,
4349
4350
  'datetime': this.iso8601(timestamp),
4350
- 'info': info,
4351
4351
  };
4352
4352
  }
4353
4353
  async fetchOpenInterest(symbol, params = {}) {