ccxt 4.2.19 → 4.2.21

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 (64) hide show
  1. package/README.md +98 -98
  2. package/dist/ccxt.browser.js +1119 -364
  3. package/dist/ccxt.browser.min.js +6 -6
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/base/Exchange.js +47 -4
  6. package/dist/cjs/src/base/ws/WsClient.js +3 -1
  7. package/dist/cjs/src/binance.js +2 -1
  8. package/dist/cjs/src/binanceus.js +17 -0
  9. package/dist/cjs/src/bingx.js +2 -1
  10. package/dist/cjs/src/bitget.js +25 -31
  11. package/dist/cjs/src/bitteam.js +1 -1
  12. package/dist/cjs/src/bitvavo.js +271 -172
  13. package/dist/cjs/src/blockchaincom.js +3 -1
  14. package/dist/cjs/src/bybit.js +0 -28
  15. package/dist/cjs/src/delta.js +0 -18
  16. package/dist/cjs/src/gate.js +32 -26
  17. package/dist/cjs/src/kucoinfutures.js +9 -9
  18. package/dist/cjs/src/novadax.js +26 -22
  19. package/dist/cjs/src/okx.js +0 -18
  20. package/dist/cjs/src/phemex.js +2 -1
  21. package/dist/cjs/src/pro/bitopro.js +7 -3
  22. package/dist/cjs/src/pro/bitvavo.js +668 -22
  23. package/dist/cjs/src/pro/lbank.js +1 -1
  24. package/js/ccxt.d.ts +1 -1
  25. package/js/ccxt.js +1 -1
  26. package/js/src/abstract/binance.d.ts +1 -0
  27. package/js/src/abstract/binancecoinm.d.ts +1 -0
  28. package/js/src/abstract/binanceus.d.ts +1 -0
  29. package/js/src/abstract/binanceusdm.d.ts +1 -0
  30. package/js/src/abstract/bitpanda.js +11 -0
  31. package/js/src/abstract/gate.d.ts +1 -0
  32. package/js/src/abstract/gateio.d.ts +1 -0
  33. package/js/src/abstract/novadax.d.ts +5 -1
  34. package/js/src/abstract/phemex.d.ts +1 -0
  35. package/js/src/base/Exchange.d.ts +15 -1
  36. package/js/src/base/Exchange.js +47 -4
  37. package/js/src/base/ws/WsClient.js +3 -2
  38. package/js/src/binance.js +2 -1
  39. package/js/src/binanceus.js +17 -0
  40. package/js/src/bingx.js +2 -1
  41. package/js/src/bitget.d.ts +1 -1
  42. package/js/src/bitget.js +25 -31
  43. package/js/src/bitteam.js +1 -1
  44. package/js/src/bitvavo.d.ts +14 -2
  45. package/js/src/bitvavo.js +271 -172
  46. package/js/src/blockchaincom.js +3 -1
  47. package/js/src/bybit.d.ts +0 -1
  48. package/js/src/bybit.js +1 -29
  49. package/js/src/delta.d.ts +0 -1
  50. package/js/src/delta.js +0 -18
  51. package/js/src/gate.d.ts +1 -1
  52. package/js/src/gate.js +32 -26
  53. package/js/src/kucoinfutures.d.ts +6 -6
  54. package/js/src/kucoinfutures.js +9 -9
  55. package/js/src/novadax.js +26 -22
  56. package/js/src/okx.d.ts +0 -1
  57. package/js/src/okx.js +0 -18
  58. package/js/src/phemex.js +2 -1
  59. package/js/src/pro/bitopro.js +7 -3
  60. package/js/src/pro/bitvavo.d.ts +35 -2
  61. package/js/src/pro/bitvavo.js +669 -23
  62. package/js/src/pro/lbank.js +1 -1
  63. package/package.json +1 -1
  64. package/skip-tests.json +2 -1
package/dist/cjs/ccxt.js CHANGED
@@ -174,7 +174,7 @@ var woo$1 = require('./src/pro/woo.js');
174
174
 
175
175
  //-----------------------------------------------------------------------------
176
176
  // this is updated by vss.js when building
177
- const version = '4.2.19';
177
+ const version = '4.2.21';
178
178
  Exchange["default"].ccxtVersion = version;
179
179
  const exchanges = {
180
180
  'ace': ace,
@@ -394,16 +394,19 @@ class Exchange {
394
394
  'fetchBorrowInterest': undefined,
395
395
  'fetchBorrowRateHistory': undefined,
396
396
  'fetchCanceledOrders': undefined,
397
+ 'fetchCanceledAndClosedOrders': undefined,
397
398
  'fetchClosedOrder': undefined,
398
399
  'fetchClosedOrders': undefined,
399
400
  'fetchCrossBorrowRate': undefined,
400
401
  'fetchCrossBorrowRates': undefined,
401
402
  'fetchCurrencies': 'emulated',
403
+ 'fetchCurrenciesWs': 'emulated',
402
404
  'fetchDeposit': undefined,
403
405
  'fetchDepositAddress': undefined,
404
406
  'fetchDepositAddresses': undefined,
405
407
  'fetchDepositAddressesByNetwork': undefined,
406
408
  'fetchDeposits': undefined,
409
+ 'fetchDepositsWs': undefined,
407
410
  'fetchDepositsWithdrawals': undefined,
408
411
  'fetchTransactionFee': undefined,
409
412
  'fetchTransactionFees': undefined,
@@ -421,9 +424,11 @@ class Exchange {
421
424
  'fetchLeverageTiers': undefined,
422
425
  'fetchMarketLeverageTiers': undefined,
423
426
  'fetchMarkets': true,
427
+ 'fetchMarketsWs': undefined,
424
428
  'fetchMarkOHLCV': undefined,
425
429
  'fetchMyTrades': undefined,
426
430
  'fetchOHLCV': undefined,
431
+ 'fetchOHLCVWs': undefined,
427
432
  'fetchOpenInterest': undefined,
428
433
  'fetchOpenInterestHistory': undefined,
429
434
  'fetchOpenOrder': undefined,
@@ -446,12 +451,14 @@ class Exchange {
446
451
  'fetchTrades': true,
447
452
  'fetchTradingFee': undefined,
448
453
  'fetchTradingFees': undefined,
454
+ 'fetchTradingFeesWs': undefined,
449
455
  'fetchTradingLimits': undefined,
450
456
  'fetchTransactions': undefined,
451
457
  'fetchTransfers': undefined,
452
458
  'fetchWithdrawAddresses': undefined,
453
459
  'fetchWithdrawal': undefined,
454
460
  'fetchWithdrawals': undefined,
461
+ 'fetchWithdrawalsWs': undefined,
455
462
  'reduceMargin': undefined,
456
463
  'setLeverage': undefined,
457
464
  'setMargin': undefined,
@@ -971,6 +978,13 @@ class Exchange {
971
978
  // and may be changed for consistency later
972
979
  return new Promise((resolve, reject) => resolve(this.currencies));
973
980
  }
981
+ fetchCurrenciesWs(params = {}) {
982
+ // markets are returned as a list
983
+ // currencies are returned as a dict
984
+ // this is for historical reasons
985
+ // and may be changed for consistency later
986
+ return new Promise((resolve, reject) => resolve(this.currencies));
987
+ }
974
988
  fetchMarkets(params = {}) {
975
989
  // markets are returned as a list
976
990
  // currencies are returned as a dict
@@ -978,6 +992,13 @@ class Exchange {
978
992
  // and may be changed for consistency later
979
993
  return new Promise((resolve, reject) => resolve(Object.values(this.markets)));
980
994
  }
995
+ fetchMarketsWs(params = {}) {
996
+ // markets are returned as a list
997
+ // currencies are returned as a dict
998
+ // this is for historical reasons
999
+ // and may be changed for consistency later
1000
+ return new Promise((resolve, reject) => resolve(Object.values(this.markets)));
1001
+ }
981
1002
  checkRequiredDependencies() {
982
1003
  return;
983
1004
  }
@@ -2756,6 +2777,13 @@ class Exchange {
2756
2777
  }
2757
2778
  throw new errors.NotSupported(this.id + ' fetchOHLCV() is not supported yet' + message);
2758
2779
  }
2780
+ async fetchOHLCVWs(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
2781
+ let message = '';
2782
+ if (this.has['fetchTradesWs']) {
2783
+ message = '. If you want to build OHLCV candles from trade executions data, visit https://github.com/ccxt/ccxt/tree/master/examples/ and see "build-ohlcv-bars" file';
2784
+ }
2785
+ throw new errors.NotSupported(this.id + ' fetchOHLCVWs() is not supported yet. Try using fetchOHLCV instead.' + message);
2786
+ }
2759
2787
  async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
2760
2788
  throw new errors.NotSupported(this.id + ' watchOHLCV() is not supported yet');
2761
2789
  }
@@ -3115,7 +3143,7 @@ class Exchange {
3115
3143
  for (let i = 0; i < response.length; i++) {
3116
3144
  const item = response[i];
3117
3145
  const id = this.safeString(item, marketIdKey);
3118
- const market = this.safeMarket(id, undefined, undefined, this.safeString(this.options, 'defaultType'));
3146
+ const market = this.safeMarket(id, undefined, undefined, 'swap');
3119
3147
  const symbol = market['symbol'];
3120
3148
  const contract = this.safeValue(market, 'contract', false);
3121
3149
  if (contract && ((symbols === undefined) || this.inArray(symbol, symbols))) {
@@ -4084,6 +4112,9 @@ class Exchange {
4084
4112
  }
4085
4113
  throw new errors.NotSupported(this.id + ' fetchClosedOrders() is not supported yet');
4086
4114
  }
4115
+ async fetchCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
4116
+ throw new errors.NotSupported(this.id + ' fetchCanceledAndClosedOrders() is not supported yet');
4117
+ }
4087
4118
  async fetchClosedOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
4088
4119
  if (this.has['fetchOrdersWs']) {
4089
4120
  const orders = await this.fetchOrdersWs(symbol, since, limit, params);
@@ -4106,9 +4137,6 @@ class Exchange {
4106
4137
  async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
4107
4138
  throw new errors.NotSupported(this.id + ' watchMyTrades() is not supported yet');
4108
4139
  }
4109
- async fetchOHLCVWs(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
4110
- throw new errors.NotSupported(this.id + ' fetchOHLCVWs() is not supported yet');
4111
- }
4112
4140
  async fetchGreeks(symbol, params = {}) {
4113
4141
  throw new errors.NotSupported(this.id + ' fetchGreeks() is not supported yet');
4114
4142
  }
@@ -4128,9 +4156,15 @@ class Exchange {
4128
4156
  async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
4129
4157
  throw new errors.NotSupported(this.id + ' fetchDeposits() is not supported yet');
4130
4158
  }
4159
+ async fetchDepositsWs(code = undefined, since = undefined, limit = undefined, params = {}) {
4160
+ throw new errors.NotSupported(this.id + ' fetchDepositsWs() is not supported yet');
4161
+ }
4131
4162
  async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
4132
4163
  throw new errors.NotSupported(this.id + ' fetchWithdrawals() is not supported yet');
4133
4164
  }
4165
+ async fetchWithdrawalsWs(code = undefined, since = undefined, limit = undefined, params = {}) {
4166
+ throw new errors.NotSupported(this.id + ' fetchWithdrawalsWs() is not supported yet');
4167
+ }
4134
4168
  async fetchOpenInterest(symbol, params = {}) {
4135
4169
  throw new errors.NotSupported(this.id + ' fetchOpenInterest() is not supported yet');
4136
4170
  }
@@ -4212,8 +4246,14 @@ class Exchange {
4212
4246
  }
4213
4247
  return markets[0];
4214
4248
  }
4249
+ else if ((symbol.endsWith('-C')) || (symbol.endsWith('-P')) || (symbol.startsWith('C-')) || (symbol.startsWith('P-'))) {
4250
+ return this.createExpiredOptionMarket(symbol);
4251
+ }
4215
4252
  throw new errors.BadSymbol(this.id + ' does not have market symbol ' + symbol);
4216
4253
  }
4254
+ createExpiredOptionMarket(symbol) {
4255
+ throw new errors.NotSupported(this.id + ' createExpiredOptionMarket () is not supported yet');
4256
+ }
4217
4257
  handleWithdrawTagAndParams(tag, params) {
4218
4258
  if (typeof tag === 'object') {
4219
4259
  params = this.extend(tag, params);
@@ -4604,6 +4644,9 @@ class Exchange {
4604
4644
  async fetchTradingFees(params = {}) {
4605
4645
  throw new errors.NotSupported(this.id + ' fetchTradingFees() is not supported yet');
4606
4646
  }
4647
+ async fetchTradingFeesWs(params = {}) {
4648
+ throw new errors.NotSupported(this.id + ' fetchTradingFeesWs() is not supported yet');
4649
+ }
4607
4650
  async fetchTradingFee(symbol, params = {}) {
4608
4651
  if (!this.has['fetchTradingFees']) {
4609
4652
  throw new errors.NotSupported(this.id + ' fetchTradingFee() is not supported yet');
@@ -1,17 +1,19 @@
1
1
  'use strict';
2
2
 
3
+ var WebSocket = require('ws');
3
4
  var Client = require('./Client.js');
4
5
  var platform = require('../functions/platform.js');
5
6
  require('../functions/encode.js');
6
7
  require('../functions/crypto.js');
7
8
  var time = require('../functions/time.js');
8
- var WebSocket = require('ws');
9
9
  var Future = require('./Future.js');
10
10
 
11
11
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
12
 
13
13
  var WebSocket__default = /*#__PURE__*/_interopDefaultLegacy(WebSocket);
14
14
 
15
+ // eslint-disable-next-line no-shadow
16
+ // eslint-disable-next-line no-restricted-globals
15
17
  const WebSocketPlatform = platform.isNode ? WebSocket__default["default"] : self.WebSocket;
16
18
  class WsClient extends Client {
17
19
  createConnection() {
@@ -952,6 +952,7 @@ class binance extends binance$1 {
952
952
  },
953
953
  'papi': {
954
954
  'get': {
955
+ 'ping': 1,
955
956
  'um/order': 1,
956
957
  'um/openOrder': 1,
957
958
  'um/openOrders': 1,
@@ -8697,7 +8698,7 @@ class binance extends binance$1 {
8697
8698
  throw new errors.AuthenticationError(this.id + ' userDataStream endpoint requires `apiKey` credential');
8698
8699
  }
8699
8700
  }
8700
- else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === 'dapiPrivate') || (api === 'dapiPrivateV2') || (api === 'fapiPrivate') || (api === 'fapiPrivateV2') || (api === 'papi')) {
8701
+ else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === 'dapiPrivate') || (api === 'dapiPrivateV2') || (api === 'fapiPrivate') || (api === 'fapiPrivateV2') || (api === 'papi' && path !== 'ping')) {
8701
8702
  this.checkRequiredCredentials();
8702
8703
  if (method === 'POST' && ((path === 'order') || (path === 'sor/order'))) {
8703
8704
  // inject in implicit API calls
@@ -81,7 +81,24 @@ class binanceus extends binance {
81
81
  'api': {
82
82
  'public': {
83
83
  'get': {
84
+ 'exchangeInfo': 10,
85
+ 'ping': 1,
86
+ 'time': 1,
87
+ 'depth': { 'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10], [5000, 50]] },
88
+ 'trades': 1,
89
+ 'aggTrades': 1,
90
+ 'historicalTrades': 5,
91
+ 'klines': 1,
84
92
  'ticker/price': { 'cost': 1, 'noSymbol': 2 },
93
+ 'avgPrice': 1,
94
+ 'ticker/bookTicker': { 'cost': 1, 'noSymbol': 2 },
95
+ 'ticker/24hr': { 'cost': 1, 'noSymbol': 40 },
96
+ 'ticker': { 'cost': 2, 'noSymbol': 100 },
97
+ },
98
+ },
99
+ 'private': {
100
+ 'get': {
101
+ 'status': 1,
85
102
  },
86
103
  },
87
104
  },
@@ -366,7 +366,8 @@ class bingx extends bingx$1 {
366
366
  '80017': errors.OrderNotFound,
367
367
  '100414': errors.AccountSuspended,
368
368
  '100419': errors.PermissionDenied,
369
- '100437': errors.BadRequest, // {"code":100437,"msg":"The withdrawal amount is lower than the minimum limit, please re-enter.","timestamp":1689258588845}
369
+ '100437': errors.BadRequest,
370
+ '101204': errors.InsufficientFunds, // bingx {"code":101204,"msg":"","data":{}}
370
371
  },
371
372
  'broad': {},
372
373
  },
@@ -54,6 +54,7 @@ class bitget extends bitget$1 {
54
54
  'fetchBorrowInterest': true,
55
55
  'fetchBorrowRateHistories': false,
56
56
  'fetchBorrowRateHistory': false,
57
+ 'fetchCanceledAndClosedOrders': true,
57
58
  'fetchCanceledOrders': true,
58
59
  'fetchClosedOrders': true,
59
60
  'fetchCrossBorrowRate': true,
@@ -5394,20 +5395,8 @@ class bitget extends bitget$1 {
5394
5395
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5395
5396
  */
5396
5397
  await this.loadMarkets();
5397
- let market = undefined;
5398
- if (symbol !== undefined) {
5399
- market = this.market(symbol);
5400
- }
5401
- const response = await this.fetchCanceledAndClosedOrders(symbol, since, limit, params);
5402
- const result = [];
5403
- for (let i = 0; i < response.length; i++) {
5404
- const entry = response[i];
5405
- const status = this.parseOrderStatus(this.safeStringN(entry, ['state', 'status', 'planStatus']));
5406
- if (status === 'closed') {
5407
- result.push(entry);
5408
- }
5409
- }
5410
- return this.parseOrders(result, market, since, limit);
5398
+ const orders = await this.fetchCanceledAndClosedOrders(symbol, since, limit, params);
5399
+ return this.filterBy(orders, 'status', 'closed');
5411
5400
  }
5412
5401
  async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
5413
5402
  /**
@@ -5432,22 +5421,26 @@ class bitget extends bitget$1 {
5432
5421
  * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5433
5422
  */
5434
5423
  await this.loadMarkets();
5435
- let market = undefined;
5436
- if (symbol !== undefined) {
5437
- market = this.market(symbol);
5438
- }
5439
- const response = await this.fetchCanceledAndClosedOrders(symbol, since, limit, params);
5440
- const result = [];
5441
- for (let i = 0; i < response.length; i++) {
5442
- const entry = response[i];
5443
- const status = this.parseOrderStatus(this.safeStringN(entry, ['state', 'status', 'planStatus']));
5444
- if (status === 'canceled') {
5445
- result.push(entry);
5446
- }
5447
- }
5448
- return this.parseOrders(result, market, since, limit);
5424
+ const orders = await this.fetchCanceledAndClosedOrders(symbol, since, limit, params);
5425
+ return this.filterBy(orders, 'status', 'canceled');
5449
5426
  }
5450
5427
  async fetchCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
5428
+ /**
5429
+ * @method
5430
+ * @name bitget#fetchCanceledAndClosedOrders
5431
+ * @see https://www.bitget.com/api-doc/spot/trade/Get-History-Orders
5432
+ * @see https://www.bitget.com/api-doc/spot/plan/Get-History-Plan-Order
5433
+ * @see https://www.bitget.com/api-doc/contract/trade/Get-Orders-History
5434
+ * @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
5435
+ * @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
5436
+ * @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
5437
+ * @description fetches information on multiple canceled and closed orders made by the user
5438
+ * @param {string} symbol unified market symbol of the market orders were made in
5439
+ * @param {int} [since] the earliest time in ms to fetch orders for
5440
+ * @param {int} [limit] the maximum number of order structures to retrieve
5441
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
5442
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
5443
+ */
5451
5444
  await this.loadMarkets();
5452
5445
  const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
5453
5446
  let market = undefined;
@@ -5732,16 +5725,17 @@ class bitget extends bitget$1 {
5732
5725
  const data = this.safeValue(response, 'data', {});
5733
5726
  if (marketType === 'spot') {
5734
5727
  if ((marginMode !== undefined) || stop) {
5735
- return this.safeValue(data, 'orderList', []);
5728
+ return this.parseOrders(this.safeValue(data, 'orderList', []), market, since, limit);
5736
5729
  }
5737
5730
  }
5738
5731
  else {
5739
- return this.safeValue(data, 'entrustedList', []);
5732
+ return this.parseOrders(this.safeValue(data, 'entrustedList', []), market, since, limit);
5740
5733
  }
5741
5734
  if (typeof response === 'string') {
5742
5735
  response = JSON.parse(response);
5743
5736
  }
5744
- return this.safeValue(response, 'data', []);
5737
+ const orders = this.safeValue(response, 'data', []);
5738
+ return this.parseOrders(orders, market, since, limit);
5745
5739
  }
5746
5740
  async fetchLedger(code = undefined, since = undefined, limit = undefined, params = {}) {
5747
5741
  /**
@@ -124,7 +124,7 @@ class bitteam extends bitteam$1 {
124
124
  '1d': '1D',
125
125
  },
126
126
  'urls': {
127
- 'logo': 'https://private-user-images.githubusercontent.com/43336371/291263231-aa2e0d61-edba-44a8-b9bf-68797dc417bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTEiLCJleHAiOjE3MDMwOTE4NTYsIm5iZiI6MTcwMzA5MTU1NiwicGF0aCI6Ii80MzMzNjM3MS8yOTEyNjMyMzEtYWEyZTBkNjEtZWRiYS00NGE4LWI5YmYtNjg3OTdkYzQxN2JkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFJV05KWUFYNENTVkVINTNBJTJGMjAyMzEyMjAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjMxMjIwVDE2NTkxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVkOGE5YmY3ZDMzMWY4YzVjODYzYWJjNjE1MGFkNTRkNzVlMDJmNWE1ZTgwNGQ2NzVkMzkyZTFhOTc4OTNjMWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.B-ySU5Uo6vz53-iDe08tTQmJH6QOzUA9Jcbj-kZc2wg',
127
+ 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/cf71fe3d-b8b4-40f2-a906-907661b28793',
128
128
  'api': {
129
129
  'history': 'https://history.bit.team',
130
130
  'public': 'https://bit.team',