gate-io-api 0.0.84__py3-none-any.whl → 0.0.86__py3-none-any.whl

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.

Potentially problematic release.


This version of gate-io-api might be problematic. Click here for more details.

gate/ccxt/__init__.py CHANGED
@@ -26,7 +26,7 @@ sys.modules['ccxt'] = ccxt_module
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
29
- __version__ = '4.5.2'
29
+ __version__ = '4.5.4'
30
30
 
31
31
  # ----------------------------------------------------------------------------
32
32
 
@@ -8,7 +8,7 @@ sys.modules['ccxt'] = ccxt_module
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
11
- __version__ = '4.5.2'
11
+ __version__ = '4.5.4'
12
12
 
13
13
  # -----------------------------------------------------------------------------
14
14
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.5.2'
5
+ __version__ = '4.5.4'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -708,6 +708,9 @@ class Exchange(BaseExchange):
708
708
  async def un_watch_positions(self, symbols: Strings = None, params={}):
709
709
  raise NotSupported(self.id + ' unWatchPositions() is not supported yet')
710
710
 
711
+ async def un_watch_ticker(self, symbol: str, params={}):
712
+ raise NotSupported(self.id + ' unWatchTicker() is not supported yet')
713
+
711
714
  async def fetch_deposit_addresses(self, codes: Strings = None, params={}):
712
715
  raise NotSupported(self.id + ' fetchDepositAddresses() is not supported yet')
713
716
 
@@ -868,19 +871,19 @@ class Exchange(BaseExchange):
868
871
  async def repay_margin(self, code: str, amount: float, symbol: Str = None, params={}):
869
872
  raise NotSupported(self.id + ' repayMargin is deprecated, please use repayCrossMargin or repayIsolatedMargin instead')
870
873
 
871
- async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
874
+ async def fetch_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
872
875
  message = ''
873
876
  if self.has['fetchTrades']:
874
877
  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'
875
878
  raise NotSupported(self.id + ' fetchOHLCV() is not supported yet' + message)
876
879
 
877
- async def fetch_ohlcv_ws(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
880
+ async def fetch_ohlcv_ws(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
878
881
  message = ''
879
882
  if self.has['fetchTradesWs']:
880
883
  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'
881
884
  raise NotSupported(self.id + ' fetchOHLCVWs() is not supported yet. Try using fetchOHLCV instead.' + message)
882
885
 
883
- async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
886
+ async def watch_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
884
887
  raise NotSupported(self.id + ' watchOHLCV() is not supported yet')
885
888
 
886
889
  async def fetch_web_endpoint(self, method, endpointMethod, returnAsJson, startRegex=None, endRegex=None):
@@ -1850,7 +1853,7 @@ class Exchange(BaseExchange):
1850
1853
  else:
1851
1854
  raise NotSupported(self.id + ' fetchFundingInterval() is not supported yet')
1852
1855
 
1853
- async def fetch_mark_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
1856
+ async def fetch_mark_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
1854
1857
  """
1855
1858
  fetches historical mark price candlestick data containing the open, high, low, and close price of a market
1856
1859
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -1868,7 +1871,7 @@ class Exchange(BaseExchange):
1868
1871
  else:
1869
1872
  raise NotSupported(self.id + ' fetchMarkOHLCV() is not supported yet')
1870
1873
 
1871
- async def fetch_index_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
1874
+ async def fetch_index_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
1872
1875
  """
1873
1876
  fetches historical index price candlestick data containing the open, high, low, and close price of a market
1874
1877
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -1886,7 +1889,7 @@ class Exchange(BaseExchange):
1886
1889
  else:
1887
1890
  raise NotSupported(self.id + ' fetchIndexOHLCV() is not supported yet')
1888
1891
 
1889
- async def fetch_premium_index_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
1892
+ async def fetch_premium_index_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
1890
1893
  """
1891
1894
  fetches historical premium index price candlestick data containing the open, high, low, and close price of a market
1892
1895
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -72,14 +72,24 @@ class gate(Exchange, ImplicitAPI):
72
72
  },
73
73
  'test': {
74
74
  'public': {
75
- 'futures': 'https://fx-api-testnet.gateio.ws/api/v4',
76
- 'delivery': 'https://fx-api-testnet.gateio.ws/api/v4',
77
- 'options': 'https://fx-api-testnet.gateio.ws/api/v4',
75
+ 'futures': 'https://api-testnet.gateapi.io/api/v4',
76
+ 'delivery': 'https://api-testnet.gateapi.io/api/v4',
77
+ 'options': 'https://api-testnet.gateapi.io/api/v4',
78
+ 'spot': 'https://api-testnet.gateapi.io/api/v4',
79
+ 'wallet': 'https://api-testnet.gateapi.io/api/v4',
80
+ 'margin': 'https://api-testnet.gateapi.io/api/v4',
81
+ 'sub_accounts': 'https://api-testnet.gateapi.io/api/v4',
82
+ 'account': 'https://api-testnet.gateapi.io/api/v4',
78
83
  },
79
84
  'private': {
80
- 'futures': 'https://fx-api-testnet.gateio.ws/api/v4',
81
- 'delivery': 'https://fx-api-testnet.gateio.ws/api/v4',
82
- 'options': 'https://fx-api-testnet.gateio.ws/api/v4',
85
+ 'futures': 'https://api-testnet.gateapi.io/api/v4',
86
+ 'delivery': 'https://api-testnet.gateapi.io/api/v4',
87
+ 'options': 'https://api-testnet.gateapi.io/api/v4',
88
+ 'spot': 'https://api-testnet.gateapi.io/api/v4',
89
+ 'wallet': 'https://api-testnet.gateapi.io/api/v4',
90
+ 'margin': 'https://api-testnet.gateapi.io/api/v4',
91
+ 'sub_accounts': 'https://api-testnet.gateapi.io/api/v4',
92
+ 'account': 'https://api-testnet.gateapi.io/api/v4',
83
93
  },
84
94
  },
85
95
  'referral': {
@@ -1238,15 +1248,15 @@ class gate(Exchange, ImplicitAPI):
1238
1248
  if self.check_required_credentials(False):
1239
1249
  await self.load_unified_status()
1240
1250
  rawPromises = []
1241
- sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
1242
1251
  fetchMarketsOptions = self.safe_dict(self.options, 'fetchMarkets')
1243
1252
  types = self.safe_list(fetchMarketsOptions, 'types', ['spot', 'swap', 'future', 'option'])
1244
1253
  for i in range(0, len(types)):
1245
1254
  marketType = types[i]
1246
1255
  if marketType == 'spot':
1247
- if not sandboxMode:
1248
- # gate doesn't have a sandbox for spot markets
1249
- rawPromises.append(self.fetch_spot_markets(params))
1256
+ # if not sandboxMode:
1257
+ # gate doesn't have a sandbox for spot markets
1258
+ rawPromises.append(self.fetch_spot_markets(params))
1259
+ # }
1250
1260
  elif marketType == 'swap':
1251
1261
  rawPromises.append(self.fetch_swap_markets(params))
1252
1262
  elif marketType == 'future':
@@ -1372,6 +1382,8 @@ class gate(Exchange, ImplicitAPI):
1372
1382
  async def fetch_swap_markets(self, params={}):
1373
1383
  result = []
1374
1384
  swapSettlementCurrencies = self.get_settlement_currencies('swap', 'fetchMarkets')
1385
+ if self.options['sandboxMode']:
1386
+ swapSettlementCurrencies = ['usdt'] # gate sandbox only has usdt-margined swaps
1375
1387
  for c in range(0, len(swapSettlementCurrencies)):
1376
1388
  settleId = swapSettlementCurrencies[c]
1377
1389
  request: dict = {
@@ -1384,6 +1396,8 @@ class gate(Exchange, ImplicitAPI):
1384
1396
  return result
1385
1397
 
1386
1398
  async def fetch_future_markets(self, params={}):
1399
+ if self.options['sandboxMode']:
1400
+ return [] # right now sandbox does not have inverse swaps
1387
1401
  result = []
1388
1402
  futureSettlementCurrencies = self.get_settlement_currencies('future', 'fetchMarkets')
1389
1403
  for c in range(0, len(futureSettlementCurrencies)):
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.5.2'
7
+ __version__ = '4.5.4'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -1309,6 +1309,10 @@ class Exchange(object):
1309
1309
  elif algoType == 'ES':
1310
1310
  rawSignature = Exchange.ecdsa(token, secret, 'p256', algorithm)
1311
1311
  signature = Exchange.base16_to_binary(rawSignature['r'].rjust(64, "0") + rawSignature['s'].rjust(64, "0"))
1312
+ elif algoType == 'Ed':
1313
+ signature = Exchange.eddsa(token.encode('utf-8'), secret, 'ed25519', True)
1314
+ # here the signature is already a urlencoded base64-encoded string
1315
+ return token + '.' + signature
1312
1316
  else:
1313
1317
  signature = Exchange.hmac(Exchange.encode(token), secret, algos[algorithm], 'binary')
1314
1318
  return token + '.' + Exchange.urlencode_base64(signature)
@@ -1442,12 +1446,22 @@ class Exchange(object):
1442
1446
  'v': v,
1443
1447
  }
1444
1448
 
1449
+
1450
+ @staticmethod
1451
+ def binary_to_urlencoded_base64(data: bytes) -> str:
1452
+ encoded = base64.urlsafe_b64encode(data).decode("utf-8")
1453
+ return encoded.rstrip("=")
1454
+
1445
1455
  @staticmethod
1446
- def eddsa(request, secret, curve='ed25519'):
1456
+ def eddsa(request, secret, curve='ed25519', url_encode=False):
1447
1457
  if isinstance(secret, str):
1448
1458
  secret = Exchange.encode(secret)
1449
1459
  private_key = ed25519.Ed25519PrivateKey.from_private_bytes(secret) if len(secret) == 32 else load_pem_private_key(secret, None)
1450
- return Exchange.binary_to_base64(private_key.sign(request))
1460
+ signature = private_key.sign(request)
1461
+ if url_encode:
1462
+ return Exchange.binary_to_urlencoded_base64(signature)
1463
+
1464
+ return Exchange.binary_to_base64(signature)
1451
1465
 
1452
1466
  @staticmethod
1453
1467
  def axolotl(request, secret, curve='ed25519'):
@@ -2641,6 +2655,9 @@ class Exchange(object):
2641
2655
  def un_watch_positions(self, symbols: Strings = None, params={}):
2642
2656
  raise NotSupported(self.id + ' unWatchPositions() is not supported yet')
2643
2657
 
2658
+ def un_watch_ticker(self, symbol: str, params={}):
2659
+ raise NotSupported(self.id + ' unWatchTicker() is not supported yet')
2660
+
2644
2661
  def fetch_deposit_addresses(self, codes: Strings = None, params={}):
2645
2662
  raise NotSupported(self.id + ' fetchDepositAddresses() is not supported yet')
2646
2663
 
@@ -2862,9 +2879,9 @@ class Exchange(object):
2862
2879
  def parse_to_numeric(self, number):
2863
2880
  stringVersion = self.number_to_string(number) # self will convert 1.0 and 1 to "1" and 1.1 to "1.1"
2864
2881
  # keep self in mind:
2865
- # in JS: 1 == 1.0 is True; 1 == 1.0 is True
2882
+ # in JS: 1 == 1.0 is True
2866
2883
  # in Python: 1 == 1.0 is True
2867
- # in PHP 1 == 1.0 is True, but 1 == 1.0 is False.
2884
+ # in PHP: 1 == 1.0 is True, but 1 == 1.0 is False.
2868
2885
  if stringVersion.find('.') >= 0:
2869
2886
  return float(stringVersion)
2870
2887
  return int(stringVersion)
@@ -3310,6 +3327,24 @@ class Exchange(object):
3310
3327
  self.codes = list(currenciesSortedByCode.keys())
3311
3328
  return self.markets
3312
3329
 
3330
+ def set_markets_from_exchange(self, sourceExchange):
3331
+ # Validate that both exchanges are of the same type
3332
+ if self.id != sourceExchange.id:
3333
+ raise ArgumentsRequired(self.id + ' shareMarkets() can only share markets with exchanges of the same type(got ' + sourceExchange['id'] + ')')
3334
+ # Validate that source exchange has loaded markets
3335
+ if not sourceExchange.markets:
3336
+ raise ExchangeError('setMarketsFromExchange() source exchange must have loaded markets first. Can call by using loadMarkets function')
3337
+ # Set all market-related data
3338
+ self.markets = sourceExchange.markets
3339
+ self.markets_by_id = sourceExchange.markets_by_id
3340
+ self.symbols = sourceExchange.symbols
3341
+ self.ids = sourceExchange.ids
3342
+ self.currencies = sourceExchange.currencies
3343
+ self.baseCurrencies = sourceExchange.baseCurrencies
3344
+ self.quoteCurrencies = sourceExchange.quoteCurrencies
3345
+ self.codes = sourceExchange.codes
3346
+ return self
3347
+
3313
3348
  def get_describe_for_extended_ws_exchange(self, currentRestInstance: Any, parentRestInstance: Any, wsBaseDescribe: dict):
3314
3349
  extendedRestDescribe = self.deep_extend(parentRestInstance.describe(), currentRestInstance.describe())
3315
3350
  superWithRestDescribe = self.deep_extend(extendedRestDescribe, wsBaseDescribe)
@@ -3948,19 +3983,19 @@ class Exchange(object):
3948
3983
  def repay_margin(self, code: str, amount: float, symbol: Str = None, params={}):
3949
3984
  raise NotSupported(self.id + ' repayMargin is deprecated, please use repayCrossMargin or repayIsolatedMargin instead')
3950
3985
 
3951
- def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
3986
+ def fetch_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
3952
3987
  message = ''
3953
3988
  if self.has['fetchTrades']:
3954
3989
  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'
3955
3990
  raise NotSupported(self.id + ' fetchOHLCV() is not supported yet' + message)
3956
3991
 
3957
- def fetch_ohlcv_ws(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
3992
+ def fetch_ohlcv_ws(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
3958
3993
  message = ''
3959
3994
  if self.has['fetchTradesWs']:
3960
3995
  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'
3961
3996
  raise NotSupported(self.id + ' fetchOHLCVWs() is not supported yet. Try using fetchOHLCV instead.' + message)
3962
3997
 
3963
- def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
3998
+ def watch_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
3964
3999
  raise NotSupported(self.id + ' watchOHLCV() is not supported yet')
3965
4000
 
3966
4001
  def convert_trading_view_to_ohlcv(self, ohlcvs: List[List[float]], timestamp='t', open='o', high='h', low='l', close='c', volume='v', ms=False):
@@ -4372,16 +4407,27 @@ class Exchange(object):
4372
4407
  result.append(account)
4373
4408
  return result
4374
4409
 
4375
- def parse_trades(self, trades: List[Any], market: Market = None, since: Int = None, limit: Int = None, params={}):
4410
+ def parse_trades_helper(self, isWs: bool, trades: List[Any], market: Market = None, since: Int = None, limit: Int = None, params={}):
4376
4411
  trades = self.to_array(trades)
4377
4412
  result = []
4378
4413
  for i in range(0, len(trades)):
4379
- trade = self.extend(self.parse_trade(trades[i], market), params)
4414
+ parsed = None
4415
+ if isWs:
4416
+ parsed = self.parse_ws_trade(trades[i], market)
4417
+ else:
4418
+ parsed = self.parse_trade(trades[i], market)
4419
+ trade = self.extend(parsed, params)
4380
4420
  result.append(trade)
4381
4421
  result = self.sort_by_2(result, 'timestamp', 'id')
4382
4422
  symbol = market['symbol'] if (market is not None) else None
4383
4423
  return self.filter_by_symbol_since_limit(result, symbol, since, limit)
4384
4424
 
4425
+ def parse_trades(self, trades: List[Any], market: Market = None, since: Int = None, limit: Int = None, params={}):
4426
+ return self.parse_trades_helper(False, trades, market, since, limit, params)
4427
+
4428
+ def parse_ws_trades(self, trades: List[Any], market: Market = None, since: Int = None, limit: Int = None, params={}):
4429
+ return self.parse_trades_helper(True, trades, market, since, limit, params)
4430
+
4385
4431
  def parse_transactions(self, transactions: List[Any], currency: Currency = None, since: Int = None, limit: Int = None, params={}):
4386
4432
  transactions = self.to_array(transactions)
4387
4433
  result = []
@@ -4763,6 +4809,11 @@ class Exchange(object):
4763
4809
  return market
4764
4810
  return result
4765
4811
 
4812
+ def market_or_null(self, symbol: str):
4813
+ if symbol is None:
4814
+ return None
4815
+ return self.market(symbol)
4816
+
4766
4817
  def check_required_credentials(self, error=True):
4767
4818
  """
4768
4819
  @ignore
@@ -6048,6 +6099,29 @@ class Exchange(object):
6048
6099
  symbol = None if (market is None) else market['symbol']
6049
6100
  return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
6050
6101
 
6102
+ def handle_trigger_prices_and_params(self, symbol, params, omitParams=True):
6103
+ #
6104
+ triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
6105
+ triggerPriceStr: Str = None
6106
+ stopLossPrice = self.safe_string(params, 'stopLossPrice')
6107
+ stopLossPriceStr: Str = None
6108
+ takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
6109
+ takeProfitPriceStr: Str = None
6110
+ #
6111
+ if triggerPrice is not None:
6112
+ if omitParams:
6113
+ params = self.omit(params, ['triggerPrice', 'stopPrice'])
6114
+ triggerPriceStr = self.price_to_precision(symbol, float(triggerPrice))
6115
+ if stopLossPrice is not None:
6116
+ if omitParams:
6117
+ params = self.omit(params, 'stopLossPrice')
6118
+ stopLossPriceStr = self.price_to_precision(symbol, float(stopLossPrice))
6119
+ if takeProfitPrice is not None:
6120
+ if omitParams:
6121
+ params = self.omit(params, 'takeProfitPrice')
6122
+ takeProfitPriceStr = self.price_to_precision(symbol, float(takeProfitPrice))
6123
+ return [triggerPriceStr, stopLossPriceStr, takeProfitPriceStr, params]
6124
+
6051
6125
  def handle_trigger_direction_and_params(self, params, exchangeSpecificKey: Str = None, allowEmpty: Bool = False):
6052
6126
  """
6053
6127
  @ignore
@@ -6201,7 +6275,7 @@ class Exchange(object):
6201
6275
  else:
6202
6276
  raise NotSupported(self.id + ' fetchFundingInterval() is not supported yet')
6203
6277
 
6204
- def fetch_mark_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
6278
+ def fetch_mark_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
6205
6279
  """
6206
6280
  fetches historical mark price candlestick data containing the open, high, low, and close price of a market
6207
6281
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -6219,7 +6293,7 @@ class Exchange(object):
6219
6293
  else:
6220
6294
  raise NotSupported(self.id + ' fetchMarkOHLCV() is not supported yet')
6221
6295
 
6222
- def fetch_index_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
6296
+ def fetch_index_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
6223
6297
  """
6224
6298
  fetches historical index price candlestick data containing the open, high, low, and close price of a market
6225
6299
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -6237,7 +6311,7 @@ class Exchange(object):
6237
6311
  else:
6238
6312
  raise NotSupported(self.id + ' fetchIndexOHLCV() is not supported yet')
6239
6313
 
6240
- def fetch_premium_index_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}):
6314
+ def fetch_premium_index_ohlcv(self, symbol: str, timeframe: str = '1m', since: Int = None, limit: Int = None, params={}):
6241
6315
  """
6242
6316
  fetches historical premium index price candlestick data containing the open, high, low, and close price of a market
6243
6317
  :param str symbol: unified symbol of the market to fetch OHLCV data for
@@ -7036,7 +7110,7 @@ class Exchange(object):
7036
7110
  clients = list(self.clients.values())
7037
7111
  for i in range(0, len(clients)):
7038
7112
  client = clients[i]
7039
- futures = self.safe_dict(client, 'futures')
7113
+ futures = client.futures
7040
7114
  if (futures is not None) and ('fetchPositionsSnapshot' in futures):
7041
7115
  del futures['fetchPositionsSnapshot']
7042
7116
  elif topic == 'ticker' and (self.tickers is not None):
gate/ccxt/gate.py CHANGED
@@ -71,14 +71,24 @@ class gate(Exchange, ImplicitAPI):
71
71
  },
72
72
  'test': {
73
73
  'public': {
74
- 'futures': 'https://fx-api-testnet.gateio.ws/api/v4',
75
- 'delivery': 'https://fx-api-testnet.gateio.ws/api/v4',
76
- 'options': 'https://fx-api-testnet.gateio.ws/api/v4',
74
+ 'futures': 'https://api-testnet.gateapi.io/api/v4',
75
+ 'delivery': 'https://api-testnet.gateapi.io/api/v4',
76
+ 'options': 'https://api-testnet.gateapi.io/api/v4',
77
+ 'spot': 'https://api-testnet.gateapi.io/api/v4',
78
+ 'wallet': 'https://api-testnet.gateapi.io/api/v4',
79
+ 'margin': 'https://api-testnet.gateapi.io/api/v4',
80
+ 'sub_accounts': 'https://api-testnet.gateapi.io/api/v4',
81
+ 'account': 'https://api-testnet.gateapi.io/api/v4',
77
82
  },
78
83
  'private': {
79
- 'futures': 'https://fx-api-testnet.gateio.ws/api/v4',
80
- 'delivery': 'https://fx-api-testnet.gateio.ws/api/v4',
81
- 'options': 'https://fx-api-testnet.gateio.ws/api/v4',
84
+ 'futures': 'https://api-testnet.gateapi.io/api/v4',
85
+ 'delivery': 'https://api-testnet.gateapi.io/api/v4',
86
+ 'options': 'https://api-testnet.gateapi.io/api/v4',
87
+ 'spot': 'https://api-testnet.gateapi.io/api/v4',
88
+ 'wallet': 'https://api-testnet.gateapi.io/api/v4',
89
+ 'margin': 'https://api-testnet.gateapi.io/api/v4',
90
+ 'sub_accounts': 'https://api-testnet.gateapi.io/api/v4',
91
+ 'account': 'https://api-testnet.gateapi.io/api/v4',
82
92
  },
83
93
  },
84
94
  'referral': {
@@ -1237,15 +1247,15 @@ class gate(Exchange, ImplicitAPI):
1237
1247
  if self.check_required_credentials(False):
1238
1248
  self.load_unified_status()
1239
1249
  rawPromises = []
1240
- sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
1241
1250
  fetchMarketsOptions = self.safe_dict(self.options, 'fetchMarkets')
1242
1251
  types = self.safe_list(fetchMarketsOptions, 'types', ['spot', 'swap', 'future', 'option'])
1243
1252
  for i in range(0, len(types)):
1244
1253
  marketType = types[i]
1245
1254
  if marketType == 'spot':
1246
- if not sandboxMode:
1247
- # gate doesn't have a sandbox for spot markets
1248
- rawPromises.append(self.fetch_spot_markets(params))
1255
+ # if not sandboxMode:
1256
+ # gate doesn't have a sandbox for spot markets
1257
+ rawPromises.append(self.fetch_spot_markets(params))
1258
+ # }
1249
1259
  elif marketType == 'swap':
1250
1260
  rawPromises.append(self.fetch_swap_markets(params))
1251
1261
  elif marketType == 'future':
@@ -1371,6 +1381,8 @@ class gate(Exchange, ImplicitAPI):
1371
1381
  def fetch_swap_markets(self, params={}):
1372
1382
  result = []
1373
1383
  swapSettlementCurrencies = self.get_settlement_currencies('swap', 'fetchMarkets')
1384
+ if self.options['sandboxMode']:
1385
+ swapSettlementCurrencies = ['usdt'] # gate sandbox only has usdt-margined swaps
1374
1386
  for c in range(0, len(swapSettlementCurrencies)):
1375
1387
  settleId = swapSettlementCurrencies[c]
1376
1388
  request: dict = {
@@ -1383,6 +1395,8 @@ class gate(Exchange, ImplicitAPI):
1383
1395
  return result
1384
1396
 
1385
1397
  def fetch_future_markets(self, params={}):
1398
+ if self.options['sandboxMode']:
1399
+ return [] # right now sandbox does not have inverse swaps
1386
1400
  result = []
1387
1401
  futureSettlementCurrencies = self.get_settlement_currencies('future', 'fetchMarkets')
1388
1402
  for c in range(0, len(futureSettlementCurrencies)):
gate/ccxt/pro/__init__.py CHANGED
@@ -8,7 +8,7 @@ sys.modules['ccxt'] = ccxt_module
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
11
- __version__ = '4.5.2'
11
+ __version__ = '4.5.4'
12
12
 
13
13
  # ----------------------------------------------------------------------------
14
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gate-io-api
3
- Version: 0.0.84
3
+ Version: 0.0.86
4
4
  Summary: gate crypto exchange api client
5
5
  Project-URL: Homepage, https://github.com/ccxt/ccxt
6
6
  Project-URL: Issues, https://github.com/ccxt/ccxt
@@ -1,11 +1,11 @@
1
1
  gate/__init__.py,sha256=rmRavmagjlyk7Z5zGWWJiY8tfYIPsk04hRzC4SYJOzA,222
2
- gate/ccxt/__init__.py,sha256=WyC_SJwe5GgrTc5Kx6xHDwQiQOGlHx6JQ_SsSKWF9S4,6126
3
- gate/ccxt/gate.py,sha256=AePkMpd4rKP4GoxClgM4qJ6fCrszgTzwrl_ZmJw6Yig,353292
2
+ gate/ccxt/__init__.py,sha256=i3CZmpHc7MyEMUCc7MAmDc_pBJlNJCUi_x1fBJTW-PM,6126
3
+ gate/ccxt/gate.py,sha256=zCZJMYkxUE3qsy2q8Mo--ketScdWr7cmMji8hLduaj8,354225
4
4
  gate/ccxt/abstract/gate.py,sha256=MrRMycFEpZKJ6yC7qi0p_qcwZtU9WJi5bBbVllskGoA,45044
5
- gate/ccxt/async_support/__init__.py,sha256=9ELjudik66YzAut2maSgKLtmervdpvnKqbjXmtr_EkA,4859
6
- gate/ccxt/async_support/gate.py,sha256=t5iTFzkJVS14V9Prgoqi6achMXMlKKLZ7TQwP2zphxw,355257
5
+ gate/ccxt/async_support/__init__.py,sha256=PwMxJHb_0srPtajXR1qR2ykJurEZYeycFSV07Cot1Eg,4859
6
+ gate/ccxt/async_support/gate.py,sha256=JkMRmZsHy5HesfqJUjJBqWlAydRsuJxJBLoPv2uwUPQ,356190
7
7
  gate/ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
8
- gate/ccxt/async_support/base/exchange.py,sha256=f8NMSn7dvE2ZuL71iRKyinVbyafvacm5Zj4WcQ4TWck,121268
8
+ gate/ccxt/async_support/base/exchange.py,sha256=yg4s0ITgw7YAAbfTHxBzRQo2cZtJj7BCvaUgMiUuvnw,121450
9
9
  gate/ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
10
10
  gate/ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
11
11
  gate/ccxt/async_support/base/ws/cache.py,sha256=xf2VOtfUwloxSlIQ39M1RGZHWQzyS9IGhB5NX6cDcAc,8370
@@ -17,10 +17,10 @@ gate/ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9prod
17
17
  gate/ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
18
18
  gate/ccxt/base/decimal_to_precision.py,sha256=3XI30u9YudHbTA438397u5rkdlXa3atxwZEfUus3C4k,6803
19
19
  gate/ccxt/base/errors.py,sha256=OGhWNvNtRlJOzFx-n1x3ZjTnaPpfWH0Vc0xACS-MeDw,5012
20
- gate/ccxt/base/exchange.py,sha256=wXcblsdBqxUWtSbKu1hDTey2mOUhXe05MT7b91Mztno,334337
20
+ gate/ccxt/base/exchange.py,sha256=-Kn1sp6UDgjrpACqsX-mYpp-e3amK3UoMFSCai7exkM,337938
21
21
  gate/ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
22
22
  gate/ccxt/base/types.py,sha256=Gvbogh9i7pPH7Z18xesYeDPribqqwq8uKpOv-YODFBs,11505
23
- gate/ccxt/pro/__init__.py,sha256=S41XtrjNFIgY-zKbomDvs6PyXygjG5duGmSickegQoc,4173
23
+ gate/ccxt/pro/__init__.py,sha256=zBEzY7j6U6HBke9SVEgGNrQOoSRkmkL0839vvneyUbI,4173
24
24
  gate/ccxt/pro/gate.py,sha256=Pl64TJO43NcLrqDGs2oU16bPfFqIjOHllJTkpGMuErI,89805
25
25
  gate/ccxt/static_dependencies/README.md,sha256=3TCvhhn09_Cqf9BDDpao1V7EfKHDpQ6k9oWRsLFixpU,18
26
26
  gate/ccxt/static_dependencies/__init__.py,sha256=tzFje8cloqmiIE6kola3EaYC0SnD1izWnri69hzHsSw,168
@@ -281,6 +281,6 @@ gate/ccxt/static_dependencies/toolz/curried/exceptions.py,sha256=gKFOHDIayAWnX2u
281
281
  gate/ccxt/static_dependencies/toolz/curried/operator.py,sha256=ML92mknkAwzBl2NCm-4werSUmJEtSHNY9NSzhseNM9s,525
282
282
  gate/ccxt/static_dependencies/typing_inspect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
283
283
  gate/ccxt/static_dependencies/typing_inspect/typing_inspect.py,sha256=5gIWomLPfuDpgd3gX1GlnX0MuXM3VorR4j2W2qXORiQ,28269
284
- gate_io_api-0.0.84.dist-info/METADATA,sha256=-_DbJzKbBVgXWeHC5SOkdaYBxrpPDi1kQ8ZB9sGy0QQ,26827
285
- gate_io_api-0.0.84.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
286
- gate_io_api-0.0.84.dist-info/RECORD,,
284
+ gate_io_api-0.0.86.dist-info/METADATA,sha256=wmI2e9jhHn2-9ytaUHrGSxQWbjMR5QWbMjcOWa-WjRM,26827
285
+ gate_io_api-0.0.86.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
286
+ gate_io_api-0.0.86.dist-info/RECORD,,