ccxt 4.4.26 → 4.4.27

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 (99) hide show
  1. package/README.md +133 -132
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/ace.js +1 -1
  5. package/dist/cjs/src/alpaca.js +194 -5
  6. package/dist/cjs/src/ascendex.js +1 -1
  7. package/dist/cjs/src/base/Exchange.js +18 -0
  8. package/dist/cjs/src/bequant.js +1 -1
  9. package/dist/cjs/src/bigone.js +1 -1
  10. package/dist/cjs/src/binance.js +1 -1
  11. package/dist/cjs/src/binancecoinm.js +1 -1
  12. package/dist/cjs/src/binanceus.js +1 -1
  13. package/dist/cjs/src/binanceusdm.js +1 -1
  14. package/dist/cjs/src/bingx.js +25 -36
  15. package/dist/cjs/src/bit2c.js +1 -1
  16. package/dist/cjs/src/bitbank.js +1 -1
  17. package/dist/cjs/src/bitbns.js +1 -1
  18. package/dist/cjs/src/bitfinex.js +1 -1
  19. package/dist/cjs/src/bitfinex2.js +1 -1
  20. package/dist/cjs/src/bitflyer.js +1 -1
  21. package/dist/cjs/src/bitget.js +1 -1
  22. package/dist/cjs/src/bithumb.js +1 -1
  23. package/dist/cjs/src/bitmart.js +1 -1
  24. package/dist/cjs/src/bitmex.js +1 -1
  25. package/dist/cjs/src/bitopro.js +1 -1
  26. package/dist/cjs/src/bitrue.js +1 -1
  27. package/dist/cjs/src/bitso.js +1 -1
  28. package/dist/cjs/src/bitstamp.js +1 -1
  29. package/dist/cjs/src/bitteam.js +1 -1
  30. package/dist/cjs/src/bitvavo.js +1 -1
  31. package/dist/cjs/src/bl3p.js +1 -1
  32. package/dist/cjs/src/blockchaincom.js +1 -1
  33. package/dist/cjs/src/blofin.js +1 -1
  34. package/dist/cjs/src/btcalpha.js +1 -1
  35. package/dist/cjs/src/btcbox.js +1 -1
  36. package/dist/cjs/src/btcmarkets.js +1 -1
  37. package/dist/cjs/src/btcturk.js +1 -1
  38. package/dist/cjs/src/bybit.js +5 -1
  39. package/dist/cjs/src/coinbase.js +97 -11
  40. package/dist/cjs/src/coinex.js +1 -1
  41. package/dist/cjs/src/gate.js +22 -16
  42. package/dist/cjs/src/hyperliquid.js +21 -1
  43. package/dist/cjs/src/lbank.js +100 -1
  44. package/dist/cjs/src/pro/binance.js +1 -1
  45. package/dist/cjs/src/pro/lbank.js +9 -4
  46. package/dist/cjs/src/wavesexchange.js +13 -2
  47. package/examples/js/cli.js +23 -3
  48. package/js/ccxt.d.ts +1 -1
  49. package/js/ccxt.js +1 -1
  50. package/js/src/abstract/alpaca.d.ts +2 -0
  51. package/js/src/ace.js +1 -1
  52. package/js/src/alpaca.d.ts +9 -1
  53. package/js/src/alpaca.js +194 -5
  54. package/js/src/ascendex.js +1 -1
  55. package/js/src/base/Exchange.d.ts +6 -0
  56. package/js/src/base/Exchange.js +18 -0
  57. package/js/src/bequant.js +1 -1
  58. package/js/src/bigone.js +1 -1
  59. package/js/src/binance.js +1 -1
  60. package/js/src/binancecoinm.js +1 -1
  61. package/js/src/binanceus.js +1 -1
  62. package/js/src/binanceusdm.js +1 -1
  63. package/js/src/bingx.js +25 -36
  64. package/js/src/bit2c.js +1 -1
  65. package/js/src/bitbank.js +1 -1
  66. package/js/src/bitbns.js +1 -1
  67. package/js/src/bitfinex.js +1 -1
  68. package/js/src/bitfinex2.js +1 -1
  69. package/js/src/bitflyer.js +1 -1
  70. package/js/src/bitget.js +1 -1
  71. package/js/src/bithumb.js +1 -1
  72. package/js/src/bitmart.js +1 -1
  73. package/js/src/bitmex.js +1 -1
  74. package/js/src/bitopro.js +1 -1
  75. package/js/src/bitrue.js +1 -1
  76. package/js/src/bitso.js +1 -1
  77. package/js/src/bitstamp.js +1 -1
  78. package/js/src/bitteam.js +1 -1
  79. package/js/src/bitvavo.js +1 -1
  80. package/js/src/bl3p.js +1 -1
  81. package/js/src/blockchaincom.js +1 -1
  82. package/js/src/blofin.js +1 -1
  83. package/js/src/btcalpha.js +1 -1
  84. package/js/src/btcbox.js +1 -1
  85. package/js/src/btcmarkets.js +1 -1
  86. package/js/src/btcturk.js +1 -1
  87. package/js/src/bybit.js +5 -1
  88. package/js/src/coinbase.d.ts +1 -0
  89. package/js/src/coinbase.js +97 -11
  90. package/js/src/coinex.js +1 -1
  91. package/js/src/gate.js +22 -16
  92. package/js/src/hyperliquid.d.ts +1 -0
  93. package/js/src/hyperliquid.js +21 -1
  94. package/js/src/lbank.d.ts +4 -1
  95. package/js/src/lbank.js +100 -1
  96. package/js/src/pro/binance.js +1 -1
  97. package/js/src/pro/lbank.js +9 -4
  98. package/js/src/wavesexchange.js +13 -2
  99. package/package.json +1 -1
@@ -6,7 +6,7 @@ import asTable from 'as-table'
6
6
  import ololog from 'ololog'
7
7
  import ccxt from '../../js/ccxt.js'
8
8
  import { Agent } from 'https'
9
-
9
+ import add_static_result from '../../utils/update-static-request-response.js'
10
10
  const fsPromises = fs.promises;
11
11
  ansi.nice
12
12
  const log = ololog.configure ({ locate: false }).unlimited
@@ -38,12 +38,19 @@ let [processPath, , exchangeId, methodName, ... params] = process.argv.filter (x
38
38
  , isSwap = process.argv.includes ('--swap')
39
39
  , isFuture = process.argv.includes ('--future')
40
40
  , isOption = process.argv.includes ('--option')
41
- , shouldCreateRequestReport = process.argv.includes ('--report')
41
+ , shouldCreateRequestReport = process.argv.includes ('--report') || process.argv.includes ('--request')
42
42
  , shouldCreateResponseReport = process.argv.includes ('--response')
43
43
  , shouldCreateBoth = process.argv.includes ('--static')
44
44
  , raw = process.argv.includes ('--raw')
45
45
  , noKeys = process.argv.includes ('--no-keys')
46
46
 
47
+ let foundDescription = undefined;
48
+ for (let i = 0; i < process.argv.length; i++) {
49
+ if (process.argv[i] === '--name') {
50
+ foundDescription = process.argv[i + 1];
51
+ break;
52
+ }
53
+ }
47
54
  //-----------------------------------------------------------------------------
48
55
  if (!raw) {
49
56
  log ((new Date ()).toISOString())
@@ -154,6 +161,12 @@ function createRequestTemplate(exchange, methodName, args, result) {
154
161
  log.green('-------------------------------------------')
155
162
  log (JSON.stringify (final, null, 2))
156
163
  log.green('-------------------------------------------')
164
+
165
+ if (foundDescription !== undefined) {
166
+ final.description = foundDescription;
167
+ log.green('auto-saving static result');
168
+ add_static_result('request', exchange.id, methodName, final);
169
+ }
157
170
  }
158
171
 
159
172
  //-----------------------------------------------------------------------------
@@ -170,6 +183,12 @@ function createResponseTemplate(exchange, methodName, args, result) {
170
183
  log.green('-------------------------------------------')
171
184
  log (jsonStringify (final, 2))
172
185
  log.green('-------------------------------------------')
186
+
187
+ if (foundDescription !== undefined) {
188
+ final.description = foundDescription;
189
+ log.green('auto-saving static result');
190
+ add_static_result('response', exchange.id, methodName, final);
191
+ }
173
192
  }
174
193
 
175
194
  //-----------------------------------------------------------------------------
@@ -237,7 +256,8 @@ const printHumanReadable = (exchange, result) => {
237
256
  return String (x)
238
257
  }
239
258
  })
240
- log (result.length > 0 ? configuredAsTable (result.map (element => {
259
+ log (result.length > 0 ? configuredAsTable (result.map (rawElement => {
260
+ const element = Object.assign ({}, rawElement)
241
261
  let keys = Object.keys (element)
242
262
  delete element['info']
243
263
  keys.forEach (key => {
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 { Int, int, Str, Strings, Num, Bool, IndexType, OrderSide, OrderType, MarketType, SubType, Dict, NullableDict, List, NullableList, Fee, OHLCV, OHLCVC, implicitReturnType, Market, Currency, Dictionary, MinMax, FeeInterface, TradingFeeInterface, MarketInterface, Trade, Order, OrderBook, Ticker, Transaction, Tickers, CurrencyInterface, Balance, BalanceAccount, Account, PartialBalances, Balances, DepositAddress, WithdrawalResponse, DepositAddressResponse, FundingRate, FundingRates, Position, BorrowInterest, LeverageTier, LedgerEntry, DepositWithdrawFeeNetwork, DepositWithdrawFee, TransferEntry, CrossBorrowRate, IsolatedBorrowRate, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, CancellationRequest, FundingHistory, MarketMarginModes, MarginMode, Greeks, Conversion, Option, LastPrice, Leverage, MarginModification, Leverages, LastPrices, Currencies, TradingFees, MarginModes, OptionChain, IsolatedBorrowRates, CrossBorrowRates, LeverageTiers, LongShortRatio } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, AuthenticationError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, OperationRejected, NoChange, MarginModeAlreadySet, MarketClosed, ManualInteractionNeeded, InsufficientFunds, InvalidAddress, AddressPending, InvalidOrder, OrderNotFound, OrderNotCached, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, ContractUnavailable, NotSupported, InvalidProxySettings, ExchangeClosedByUser, OperationFailed, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, ChecksumError, RequestTimeout, BadResponse, NullResponse, CancelPending, UnsubscribeError } from './src/base/errors.js';
7
- declare const version = "4.4.25";
7
+ declare const version = "4.4.26";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, AuthenticationError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, OperationRejected, NoChange, MarginModeAlreadySet, MarketClosed, ManualInteractionNeeded, InsufficientFunds, InvalidAddress, AddressPending, InvalidOrder, OrderNotFound, OrderNotCached, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, ContractUnavailable, NotSupported, InvalidProxySettings, ExchangeClosedByUser, OperationFailed, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, ChecksumError, RequestTimeout, BadResponse, NullResponse, CancelPending, UnsubscribeError } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.4.26';
41
+ const version = '4.4.27';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
@@ -20,10 +20,12 @@ interface Exchange {
20
20
  traderPrivateGetV2CorporateActionsAnnouncementsId(params?: {}): Promise<implicitReturnType>;
21
21
  traderPrivateGetV2CorporateActionsAnnouncements(params?: {}): Promise<implicitReturnType>;
22
22
  traderPrivateGetV2Wallets(params?: {}): Promise<implicitReturnType>;
23
+ traderPrivateGetV2WalletsTransfers(params?: {}): Promise<implicitReturnType>;
23
24
  traderPrivatePostV2Orders(params?: {}): Promise<implicitReturnType>;
24
25
  traderPrivatePostV2Watchlists(params?: {}): Promise<implicitReturnType>;
25
26
  traderPrivatePostV2WatchlistsWatchlistId(params?: {}): Promise<implicitReturnType>;
26
27
  traderPrivatePostV2WatchlistsByName(params?: {}): Promise<implicitReturnType>;
28
+ traderPrivatePostV2WalletsTransfers(params?: {}): Promise<implicitReturnType>;
27
29
  traderPrivatePutV2WatchlistsWatchlistId(params?: {}): Promise<implicitReturnType>;
28
30
  traderPrivatePutV2WatchlistsByName(params?: {}): Promise<implicitReturnType>;
29
31
  traderPrivatePatchV2OrdersOrderId(params?: {}): Promise<implicitReturnType>;
package/js/src/ace.js CHANGED
@@ -106,7 +106,7 @@ export default class ace extends Exchange {
106
106
  '1M': 31,
107
107
  },
108
108
  'urls': {
109
- 'logo': 'https://user-images.githubusercontent.com/1294454/216908003-fb314cf6-e66e-471c-b91d-1d86e4baaa90.jpg',
109
+ 'logo': 'https://github.com/user-attachments/assets/115f1e4a-0fd0-4b76-85d5-a49ebf64d1c8',
110
110
  'api': {
111
111
  'public': 'https://ace.io/polarisex',
112
112
  'private': 'https://ace.io/polarisex/open',
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/alpaca.js';
2
- import type { Dict, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Trade, int, Strings, Ticker, Tickers, Currency, DepositAddress } from './base/types.js';
2
+ import type { Dict, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Trade, int, Strings, Ticker, Tickers, Currency, DepositAddress, Transaction } from './base/types.js';
3
3
  /**
4
4
  * @class alpaca
5
5
  * @augments Exchange
@@ -29,6 +29,14 @@ export default class alpaca extends Exchange {
29
29
  parseTrade(trade: Dict, market?: Market): Trade;
30
30
  fetchDepositAddress(code: string, params?: {}): Promise<DepositAddress>;
31
31
  parseDepositAddress(depositAddress: any, currency?: Currency): DepositAddress;
32
+ withdraw(code: string, amount: number, address: string, tag?: any, params?: {}): Promise<Transaction>;
33
+ fetchTransactionsHelper(type: any, code: any, since: any, limit: any, params: any): Promise<Transaction[]>;
34
+ fetchDepositsWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
35
+ fetchDeposits(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
36
+ fetchWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
37
+ parseTransaction(transaction: Dict, currency?: Currency): Transaction;
38
+ parseTransactionStatus(status: Str): string;
39
+ parseTransactionType(type: any): string;
32
40
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
33
41
  url: string;
34
42
  method: string;
package/js/src/alpaca.js CHANGED
@@ -26,7 +26,7 @@ export default class alpaca extends Exchange {
26
26
  'hostname': 'alpaca.markets',
27
27
  'pro': true,
28
28
  'urls': {
29
- 'logo': 'https://user-images.githubusercontent.com/1294454/187234005-b864db3d-f1e3-447a-aaf9-a9fc7b955d07.jpg',
29
+ 'logo': 'https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b',
30
30
  'www': 'https://alpaca.markets',
31
31
  'api': {
32
32
  'broker': 'https://broker-api.{hostname}',
@@ -59,8 +59,8 @@ export default class alpaca extends Exchange {
59
59
  'fetchCurrencies': false,
60
60
  'fetchDepositAddress': true,
61
61
  'fetchDepositAddressesByNetwork': false,
62
- 'fetchDeposits': false,
63
- 'fetchDepositsWithdrawals': false,
62
+ 'fetchDeposits': true,
63
+ 'fetchDepositsWithdrawals': true,
64
64
  'fetchFundingHistory': false,
65
65
  'fetchFundingRate': false,
66
66
  'fetchFundingRateHistory': false,
@@ -92,12 +92,12 @@ export default class alpaca extends Exchange {
92
92
  'fetchTransactionFees': false,
93
93
  'fetchTransactions': false,
94
94
  'fetchTransfers': false,
95
- 'fetchWithdrawals': false,
95
+ 'fetchWithdrawals': true,
96
96
  'sandbox': true,
97
97
  'setLeverage': false,
98
98
  'setMarginMode': false,
99
99
  'transfer': false,
100
- 'withdraw': false,
100
+ 'withdraw': true,
101
101
  },
102
102
  'api': {
103
103
  'broker': {},
@@ -123,12 +123,14 @@ export default class alpaca extends Exchange {
123
123
  'v2/corporate_actions/announcements/{id}',
124
124
  'v2/corporate_actions/announcements',
125
125
  'v2/wallets',
126
+ 'v2/wallets/transfers',
126
127
  ],
127
128
  'post': [
128
129
  'v2/orders',
129
130
  'v2/watchlists',
130
131
  'v2/watchlists/{watchlist_id}',
131
132
  'v2/watchlists:by_name',
133
+ 'v2/wallets/transfers',
132
134
  ],
133
135
  'put': [
134
136
  'v2/watchlists/{watchlist_id}',
@@ -1342,6 +1344,193 @@ export default class alpaca extends Exchange {
1342
1344
  'tag': undefined,
1343
1345
  };
1344
1346
  }
1347
+ async withdraw(code, amount, address, tag = undefined, params = {}) {
1348
+ /**
1349
+ * @method
1350
+ * @name alpaca#withdraw
1351
+ * @description make a withdrawal
1352
+ * @see https://docs.alpaca.markets/reference/createcryptotransferforaccount
1353
+ * @param {string} code unified currency code
1354
+ * @param {float} amount the amount to withdraw
1355
+ * @param {string} address the address to withdraw to
1356
+ * @param {string} tag a memo for the transaction
1357
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1358
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
1359
+ */
1360
+ [tag, params] = this.handleWithdrawTagAndParams(tag, params);
1361
+ this.checkAddress(address);
1362
+ await this.loadMarkets();
1363
+ const currency = this.currency(code);
1364
+ if (tag) {
1365
+ address = address + ':' + tag;
1366
+ }
1367
+ const request = {
1368
+ 'asset': currency['id'],
1369
+ 'address': address,
1370
+ 'amount': this.numberToString(amount),
1371
+ };
1372
+ const response = await this.traderPrivatePostV2WalletsTransfers(this.extend(request, params));
1373
+ //
1374
+ // {
1375
+ // "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1376
+ // "tx_hash": "string",
1377
+ // "direction": "INCOMING",
1378
+ // "status": "PROCESSING",
1379
+ // "amount": "string",
1380
+ // "usd_value": "string",
1381
+ // "network_fee": "string",
1382
+ // "fees": "string",
1383
+ // "chain": "string",
1384
+ // "asset": "string",
1385
+ // "from_address": "string",
1386
+ // "to_address": "string",
1387
+ // "created_at": "2024-11-02T07:42:48.402Z"
1388
+ // }
1389
+ //
1390
+ return this.parseTransaction(response, currency);
1391
+ }
1392
+ async fetchTransactionsHelper(type, code, since, limit, params) {
1393
+ await this.loadMarkets();
1394
+ let currency = undefined;
1395
+ if (code !== undefined) {
1396
+ currency = this.currency(code);
1397
+ }
1398
+ const response = await this.traderPrivateGetV2WalletsTransfers(params);
1399
+ //
1400
+ // {
1401
+ // "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1402
+ // "tx_hash": "string",
1403
+ // "direction": "INCOMING",
1404
+ // "status": "PROCESSING",
1405
+ // "amount": "string",
1406
+ // "usd_value": "string",
1407
+ // "network_fee": "string",
1408
+ // "fees": "string",
1409
+ // "chain": "string",
1410
+ // "asset": "string",
1411
+ // "from_address": "string",
1412
+ // "to_address": "string",
1413
+ // "created_at": "2024-11-02T07:42:48.402Z"
1414
+ // }
1415
+ //
1416
+ const results = [];
1417
+ for (let i = 0; i < response.length; i++) {
1418
+ const entry = response[i];
1419
+ const direction = this.safeString(entry, 'direction');
1420
+ if (direction === type) {
1421
+ results.push(entry);
1422
+ }
1423
+ else if (direction === 'BOTH') {
1424
+ results.push(entry);
1425
+ }
1426
+ }
1427
+ return this.parseTransactions(results, currency, since, limit, params);
1428
+ }
1429
+ async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
1430
+ /**
1431
+ * @method
1432
+ * @name alpaca#fetchDepositsWithdrawals
1433
+ * @description fetch history of deposits and withdrawals
1434
+ * @see https://docs.alpaca.markets/reference/listcryptofundingtransfers
1435
+ * @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
1436
+ * @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
1437
+ * @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
1438
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1439
+ * @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
1440
+ */
1441
+ return await this.fetchTransactionsHelper('BOTH', code, since, limit, params);
1442
+ }
1443
+ async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
1444
+ /**
1445
+ * @method
1446
+ * @name alpaca#fetchDeposits
1447
+ * @description fetch all deposits made to an account
1448
+ * @see https://docs.alpaca.markets/reference/listcryptofundingtransfers
1449
+ * @param {string} [code] unified currency code
1450
+ * @param {int} [since] the earliest time in ms to fetch deposits for
1451
+ * @param {int} [limit] the maximum number of deposit structures to retrieve
1452
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1453
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
1454
+ */
1455
+ return await this.fetchTransactionsHelper('INCOMING', code, since, limit, params);
1456
+ }
1457
+ async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
1458
+ /**
1459
+ * @method
1460
+ * @name alpaca#fetchWithdrawals
1461
+ * @description fetch all withdrawals made from an account
1462
+ * @see https://docs.alpaca.markets/reference/listcryptofundingtransfers
1463
+ * @param {string} [code] unified currency code
1464
+ * @param {int} [since] the earliest time in ms to fetch withdrawals for
1465
+ * @param {int} [limit] the maximum number of withdrawal structures to retrieve
1466
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1467
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
1468
+ */
1469
+ return await this.fetchTransactionsHelper('OUTGOING', code, since, limit, params);
1470
+ }
1471
+ parseTransaction(transaction, currency = undefined) {
1472
+ //
1473
+ // {
1474
+ // "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1475
+ // "tx_hash": "string",
1476
+ // "direction": "INCOMING",
1477
+ // "status": "PROCESSING",
1478
+ // "amount": "string",
1479
+ // "usd_value": "string",
1480
+ // "network_fee": "string",
1481
+ // "fees": "string",
1482
+ // "chain": "string",
1483
+ // "asset": "string",
1484
+ // "from_address": "string",
1485
+ // "to_address": "string",
1486
+ // "created_at": "2024-11-02T07:42:48.402Z"
1487
+ // }
1488
+ //
1489
+ const datetime = this.safeString(transaction, 'created_at');
1490
+ const currencyId = this.safeString(transaction, 'asset');
1491
+ const code = this.safeCurrencyCode(currencyId, currency);
1492
+ const fee = {
1493
+ 'cost': this.safeNumber(transaction, 'fees'),
1494
+ 'currency': code,
1495
+ };
1496
+ return {
1497
+ 'info': transaction,
1498
+ 'id': this.safeString(transaction, 'id'),
1499
+ 'txid': this.safeString(transaction, 'tx_hash'),
1500
+ 'timestamp': this.parse8601(datetime),
1501
+ 'datetime': datetime,
1502
+ 'network': this.safeString(transaction, 'chain'),
1503
+ 'address': this.safeString(transaction, 'to_address'),
1504
+ 'addressTo': this.safeString(transaction, 'to_address'),
1505
+ 'addressFrom': this.safeString(transaction, 'from_address'),
1506
+ 'tag': undefined,
1507
+ 'tagTo': undefined,
1508
+ 'tagFrom': undefined,
1509
+ 'type': this.parseTransactionType(this.safeString(transaction, 'direction')),
1510
+ 'amount': this.safeNumber(transaction, 'amount'),
1511
+ 'currency': code,
1512
+ 'status': this.parseTransactionStatus(this.safeString(transaction, 'status')),
1513
+ 'updated': undefined,
1514
+ 'fee': fee,
1515
+ 'comment': undefined,
1516
+ 'internal': undefined,
1517
+ };
1518
+ }
1519
+ parseTransactionStatus(status) {
1520
+ const statuses = {
1521
+ 'PROCESSING': 'pending',
1522
+ // 'FAILED': 'failed',
1523
+ // 'SUCCESS': 'ok',
1524
+ };
1525
+ return this.safeString(statuses, status, status);
1526
+ }
1527
+ parseTransactionType(type) {
1528
+ const types = {
1529
+ 'INCOMING': 'deposit',
1530
+ 'OUTGOING': 'withdrawal',
1531
+ };
1532
+ return this.safeString(types, type, type);
1533
+ }
1345
1534
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
1346
1535
  let endpoint = '/' + this.implodeParams(path, params);
1347
1536
  let url = this.implodeHostname(this.urls['api'][api[0]]);
@@ -116,7 +116,7 @@ export default class ascendex extends Exchange {
116
116
  },
117
117
  'version': 'v2',
118
118
  'urls': {
119
- 'logo': 'https://user-images.githubusercontent.com/1294454/112027508-47984600-8b48-11eb-9e17-d26459cc36c6.jpg',
119
+ 'logo': 'https://github.com/user-attachments/assets/55bab6b9-d4ca-42a8-a0e6-fac81ae557f1',
120
120
  'api': {
121
121
  'rest': 'https://ascendex.com',
122
122
  },
@@ -743,17 +743,22 @@ export default class Exchange {
743
743
  watchMyLiquidations(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Liquidation[]>;
744
744
  watchMyLiquidationsForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Liquidation[]>;
745
745
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
746
+ unWatchTrades(symbol: string, params?: {}): Promise<any>;
746
747
  watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
748
+ unWatchTradesForSymbols(symbols: string[], params?: {}): Promise<any>;
747
749
  watchMyTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
748
750
  watchOrdersForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
749
751
  watchOHLCVForSymbols(symbolsAndTimeframes: string[][], since?: Int, limit?: Int, params?: {}): Promise<Dictionary<Dictionary<OHLCV[]>>>;
752
+ unWatchOHLCVForSymbols(symbolsAndTimeframes: string[][], params?: {}): Promise<any>;
750
753
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
754
+ unWatchOrderBookForSymbols(symbols: string[], params?: {}): Promise<any>;
751
755
  fetchDepositAddresses(codes?: Strings, params?: {}): Promise<DepositAddress[]>;
752
756
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
753
757
  fetchMarginMode(symbol: string, params?: {}): Promise<MarginMode>;
754
758
  fetchMarginModes(symbols?: Strings, params?: {}): Promise<MarginModes>;
755
759
  fetchRestOrderBookSafe(symbol: any, limit?: any, params?: {}): Promise<OrderBook>;
756
760
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
761
+ unWatchOrderBook(symbol: string, params?: {}): Promise<any>;
757
762
  fetchTime(params?: {}): Promise<Int>;
758
763
  fetchTradingLimits(symbols?: Strings, params?: {}): Promise<{}>;
759
764
  parseCurrency(rawCurrency: Dict): Currency;
@@ -985,6 +990,7 @@ export default class Exchange {
985
990
  fetchOrderBooks(symbols?: Strings, limit?: Int, params?: {}): Promise<Dictionary<OrderBook>>;
986
991
  watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
987
992
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
993
+ unWatchTickers(symbols?: Strings, params?: {}): Promise<any>;
988
994
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
989
995
  fetchOrderWs(id: string, symbol?: Str, params?: {}): Promise<Order>;
990
996
  fetchOrderStatus(id: string, symbol?: Str, params?: {}): Promise<string>;
@@ -2019,9 +2019,15 @@ export default class Exchange {
2019
2019
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
2020
2020
  throw new NotSupported(this.id + ' watchTrades() is not supported yet');
2021
2021
  }
2022
+ async unWatchTrades(symbol, params = {}) {
2023
+ throw new NotSupported(this.id + ' unWatchTrades() is not supported yet');
2024
+ }
2022
2025
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
2023
2026
  throw new NotSupported(this.id + ' watchTradesForSymbols() is not supported yet');
2024
2027
  }
2028
+ async unWatchTradesForSymbols(symbols, params = {}) {
2029
+ throw new NotSupported(this.id + ' unWatchTradesForSymbols() is not supported yet');
2030
+ }
2025
2031
  async watchMyTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
2026
2032
  throw new NotSupported(this.id + ' watchMyTradesForSymbols() is not supported yet');
2027
2033
  }
@@ -2031,9 +2037,15 @@ export default class Exchange {
2031
2037
  async watchOHLCVForSymbols(symbolsAndTimeframes, since = undefined, limit = undefined, params = {}) {
2032
2038
  throw new NotSupported(this.id + ' watchOHLCVForSymbols() is not supported yet');
2033
2039
  }
2040
+ async unWatchOHLCVForSymbols(symbolsAndTimeframes, params = {}) {
2041
+ throw new NotSupported(this.id + ' unWatchOHLCVForSymbols() is not supported yet');
2042
+ }
2034
2043
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
2035
2044
  throw new NotSupported(this.id + ' watchOrderBookForSymbols() is not supported yet');
2036
2045
  }
2046
+ async unWatchOrderBookForSymbols(symbols, params = {}) {
2047
+ throw new NotSupported(this.id + ' unWatchOrderBookForSymbols() is not supported yet');
2048
+ }
2037
2049
  async fetchDepositAddresses(codes = undefined, params = {}) {
2038
2050
  throw new NotSupported(this.id + ' fetchDepositAddresses() is not supported yet');
2039
2051
  }
@@ -2070,6 +2082,9 @@ export default class Exchange {
2070
2082
  async watchOrderBook(symbol, limit = undefined, params = {}) {
2071
2083
  throw new NotSupported(this.id + ' watchOrderBook() is not supported yet');
2072
2084
  }
2085
+ async unWatchOrderBook(symbol, params = {}) {
2086
+ throw new NotSupported(this.id + ' unWatchOrderBook() is not supported yet');
2087
+ }
2073
2088
  async fetchTime(params = {}) {
2074
2089
  throw new NotSupported(this.id + ' fetchTime() is not supported yet');
2075
2090
  }
@@ -4498,6 +4513,9 @@ export default class Exchange {
4498
4513
  async watchTickers(symbols = undefined, params = {}) {
4499
4514
  throw new NotSupported(this.id + ' watchTickers() is not supported yet');
4500
4515
  }
4516
+ async unWatchTickers(symbols = undefined, params = {}) {
4517
+ throw new NotSupported(this.id + ' unWatchTickers() is not supported yet');
4518
+ }
4501
4519
  async fetchOrder(id, symbol = undefined, params = {}) {
4502
4520
  throw new NotSupported(this.id + ' fetchOrder() is not supported yet');
4503
4521
  }
package/js/src/bequant.js CHANGED
@@ -15,7 +15,7 @@ export default class bequant extends hitbtc {
15
15
  'countries': ['MT'],
16
16
  'pro': true,
17
17
  'urls': {
18
- 'logo': 'https://user-images.githubusercontent.com/1294454/55248342-a75dfe00-525a-11e9-8aa2-05e9dca943c6.jpg',
18
+ 'logo': 'https://github.com/user-attachments/assets/0583ef1f-29fe-4b7c-8189-63565a0e2867',
19
19
  'api': {
20
20
  'public': 'https://api.bequant.io/api/3',
21
21
  'private': 'https://api.bequant.io/api/3',
package/js/src/bigone.js CHANGED
@@ -86,7 +86,7 @@ export default class bigone extends Exchange {
86
86
  },
87
87
  'hostname': 'big.one',
88
88
  'urls': {
89
- 'logo': 'https://user-images.githubusercontent.com/1294454/69354403-1d532180-0c91-11ea-88ed-44c06cefdf87.jpg',
89
+ 'logo': 'https://github.com/user-attachments/assets/4e5cfd53-98cc-4b90-92cd-0d7b512653d1',
90
90
  'api': {
91
91
  'public': 'https://{hostname}/api/v3',
92
92
  'private': 'https://{hostname}/api/v3/viewer',
package/js/src/binance.js CHANGED
@@ -191,7 +191,7 @@ export default class binance extends Exchange {
191
191
  '1M': '1M',
192
192
  },
193
193
  'urls': {
194
- 'logo': 'https://user-images.githubusercontent.com/1294454/29604020-d5483cdc-87ee-11e7-94c7-d1a8d9169293.jpg',
194
+ 'logo': 'https://github.com/user-attachments/assets/e9419b93-ccb0-46aa-9bff-c883f096274b',
195
195
  'test': {
196
196
  'dapiPublic': 'https://testnet.binancefuture.com/dapi/v1',
197
197
  'dapiPrivate': 'https://testnet.binancefuture.com/dapi/v1',
@@ -13,7 +13,7 @@ export default class binancecoinm extends binance {
13
13
  'id': 'binancecoinm',
14
14
  'name': 'Binance COIN-M',
15
15
  'urls': {
16
- 'logo': 'https://user-images.githubusercontent.com/1294454/117738721-668c8d80-b205-11eb-8c49-3fad84c4a07f.jpg',
16
+ 'logo': 'https://github.com/user-attachments/assets/387cfc4e-5f33-48cd-8f5c-cd4854dabf0c',
17
17
  'doc': [
18
18
  'https://binance-docs.github.io/apidocs/delivery/en/',
19
19
  'https://binance-docs.github.io/apidocs/spot/en',
@@ -18,7 +18,7 @@ export default class binanceus extends binance {
18
18
  'certified': false,
19
19
  'pro': true,
20
20
  'urls': {
21
- 'logo': 'https://user-images.githubusercontent.com/1294454/65177307-217b7c80-da5f-11e9-876e-0b748ba0a358.jpg',
21
+ 'logo': 'https://github.com/user-attachments/assets/a9667919-b632-4d52-a832-df89f8a35e8c',
22
22
  'api': {
23
23
  'web': 'https://www.binance.us',
24
24
  'public': 'https://api.binance.us/api/v3',
@@ -14,7 +14,7 @@ export default class binanceusdm extends binance {
14
14
  'id': 'binanceusdm',
15
15
  'name': 'Binance USDⓈ-M',
16
16
  'urls': {
17
- 'logo': 'https://user-images.githubusercontent.com/1294454/117738721-668c8d80-b205-11eb-8c49-3fad84c4a07f.jpg',
17
+ 'logo': 'https://github.com/user-attachments/assets/871cbea7-eebb-4b28-b260-c1c91df0487a',
18
18
  'doc': [
19
19
  'https://binance-docs.github.io/apidocs/futures/en/',
20
20
  'https://binance-docs.github.io/apidocs/spot/en',
package/js/src/bingx.js CHANGED
@@ -2863,19 +2863,12 @@ export default class bingx extends Exchange {
2863
2863
  */
2864
2864
  await this.loadMarkets();
2865
2865
  const ordersRequests = [];
2866
- let symbol = undefined;
2866
+ const marketIds = [];
2867
2867
  for (let i = 0; i < orders.length; i++) {
2868
2868
  const rawOrder = orders[i];
2869
2869
  const marketId = this.safeString(rawOrder, 'symbol');
2870
- if (symbol === undefined) {
2871
- symbol = marketId;
2872
- }
2873
- else {
2874
- if (symbol !== marketId) {
2875
- throw new BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
2876
- }
2877
- }
2878
2870
  const type = this.safeString(rawOrder, 'type');
2871
+ marketIds.push(marketId);
2879
2872
  const side = this.safeString(rawOrder, 'side');
2880
2873
  const amount = this.safeNumber(rawOrder, 'amount');
2881
2874
  const price = this.safeNumber(rawOrder, 'price');
@@ -2883,10 +2876,15 @@ export default class bingx extends Exchange {
2883
2876
  const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
2884
2877
  ordersRequests.push(orderRequest);
2885
2878
  }
2886
- const market = this.market(symbol);
2879
+ const symbols = this.marketSymbols(marketIds, undefined, false, true, true);
2880
+ const symbolsLength = symbols.length;
2881
+ const market = this.market(symbols[0]);
2887
2882
  const request = {};
2888
2883
  let response = undefined;
2889
2884
  if (market['swap']) {
2885
+ if (symbolsLength > 5) {
2886
+ throw new InvalidOrder(this.id + ' createOrders() can not create more than 5 orders at once for swap markets');
2887
+ }
2890
2888
  request['batchOrders'] = this.json(ordersRequests);
2891
2889
  response = await this.swapV2PrivatePostTradeBatchOrders(request);
2892
2890
  }
@@ -2943,6 +2941,13 @@ export default class bingx extends Exchange {
2943
2941
  // }
2944
2942
  // }
2945
2943
  //
2944
+ if (typeof response === 'string') {
2945
+ // broken api engine : order-ids are too long numbers (i.e. 1742930526912864656)
2946
+ // and JSON.parse can not handle them in JS, so we have to use .parseJson
2947
+ // however, when order has an attached SL/TP, their value types need extra parsing
2948
+ response = this.fixStringifiedJsonMembers(response);
2949
+ response = this.parseJson(response);
2950
+ }
2946
2951
  const data = this.safeDict(response, 'data', {});
2947
2952
  const result = this.safeList(data, 'orders', []);
2948
2953
  return this.parseOrders(result, market);
@@ -4583,37 +4588,21 @@ export default class bingx extends Exchange {
4583
4588
  }
4584
4589
  parseDepositAddress(depositAddress, currency = undefined) {
4585
4590
  //
4586
- // {
4587
- // "coinId": "799",
4588
- // "coin": "USDT",
4589
- // "network": "BEP20",
4590
- // "address": "6a7eda2817462dabb6493277a2cfe0f5c3f2550b",
4591
- // "tag": ''
4592
- // }
4591
+ // {
4592
+ // "coinId":"4",
4593
+ // "coin":"USDT",
4594
+ // "network":"OMNI",
4595
+ // "address":"1HXyx8HVQRY7Nhqz63nwnRB7SpS9xQPzLN",
4596
+ // "addressWithPrefix":"1HXyx8HVQRY7Nhqz63nwnRB7SpS9xQPzLN"
4597
+ // }
4593
4598
  //
4594
- let address = this.safeString(depositAddress, 'address');
4595
4599
  const tag = this.safeString(depositAddress, 'tag');
4596
4600
  const currencyId = this.safeString(depositAddress, 'coin');
4597
4601
  currency = this.safeCurrency(currencyId, currency);
4598
4602
  const code = currency['code'];
4599
- // the exchange API returns deposit addresses without the leading '0x' prefix
4600
- // however, the exchange API does require the 0x prefix to withdraw
4601
- // so we append the prefix before returning the address to the user
4602
- // that is only if the underlying contract address has the 0x prefix as well
4603
- const networkCode = this.safeString(depositAddress, 'network');
4604
- if (networkCode !== undefined) {
4605
- if (networkCode in currency['networks']) {
4606
- const network = currency['networks'][networkCode];
4607
- const contractAddress = this.safeString(network['info'], 'contractAddress');
4608
- if (contractAddress !== undefined) {
4609
- if (contractAddress[0] === '0' && contractAddress[1] === 'x') {
4610
- if (address[0] !== '0' || address[1] !== 'x') {
4611
- address = '0x' + address;
4612
- }
4613
- }
4614
- }
4615
- }
4616
- }
4603
+ const address = this.safeString(depositAddress, 'addressWithPrefix');
4604
+ const networkdId = this.safeString(depositAddress, 'network');
4605
+ const networkCode = this.networkIdToCode(networkdId, code);
4617
4606
  this.checkAddress(address);
4618
4607
  return {
4619
4608
  'info': depositAddress,