ccxt 4.3.46__py2.py3-none-any.whl → 4.3.48__py2.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 ccxt might be problematic. Click here for more details.

ccxt/gate.py CHANGED
@@ -797,6 +797,7 @@ class gate(Exchange, ImplicitAPI):
797
797
  'NOT_ACCEPTABLE': BadRequest,
798
798
  'METHOD_NOT_ALLOWED': BadRequest,
799
799
  'NOT_FOUND': ExchangeError,
800
+ 'AUTHENTICATION_FAILED': AuthenticationError,
800
801
  'INVALID_CREDENTIALS': AuthenticationError,
801
802
  'INVALID_KEY': AuthenticationError,
802
803
  'IP_FORBIDDEN': AuthenticationError,
@@ -3668,17 +3669,14 @@ class gate(Exchange, ImplicitAPI):
3668
3669
  #
3669
3670
  return self.parse_order(response, market)
3670
3671
 
3671
- def create_orders(self, orders: List[OrderRequest], params={}):
3672
- """
3673
- create a list of trade orders
3674
- :see: https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-2
3675
- :see: https://www.gate.io/docs/developers/apiv4/en/#create-a-batch-of-orders
3676
- :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
3677
- :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3678
- """
3679
- self.load_markets()
3672
+ def create_orders_request(self, orders: List[OrderRequest], params={}):
3680
3673
  ordersRequests = []
3681
3674
  orderSymbols = []
3675
+ ordersLength = len(orders)
3676
+ if ordersLength == 0:
3677
+ raise BadRequest(self.id + ' createOrders() requires at least one order')
3678
+ if ordersLength > 10:
3679
+ raise BadRequest(self.id + ' createOrders() accepts a maximum of 10 orders at a time')
3682
3680
  for i in range(0, len(orders)):
3683
3681
  rawOrder = orders[i]
3684
3682
  marketId = self.safe_string(rawOrder, 'symbol')
@@ -3699,6 +3697,21 @@ class gate(Exchange, ImplicitAPI):
3699
3697
  market = self.market(symbols[0])
3700
3698
  if market['future'] or market['option']:
3701
3699
  raise NotSupported(self.id + ' createOrders() does not support futures or options markets')
3700
+ return ordersRequests
3701
+
3702
+ def create_orders(self, orders: List[OrderRequest], params={}):
3703
+ """
3704
+ create a list of trade orders
3705
+ :see: https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-2
3706
+ :see: https://www.gate.io/docs/developers/apiv4/en/#create-a-batch-of-orders
3707
+ :see: https://www.gate.io/docs/developers/apiv4/en/#create-a-batch-of-futures-orders
3708
+ :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
3709
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3710
+ """
3711
+ self.load_markets()
3712
+ ordersRequests = self.create_orders_request(orders, params)
3713
+ firstOrder = orders[0]
3714
+ market = self.market(firstOrder['symbol'])
3702
3715
  response = None
3703
3716
  if market['spot']:
3704
3717
  response = self.privateSpotPostBatchOrders(ordersRequests)
@@ -3929,21 +3942,7 @@ class gate(Exchange, ImplicitAPI):
3929
3942
  params['createMarketBuyOrderRequiresPrice'] = False
3930
3943
  return self.create_order(symbol, 'market', 'buy', cost, None, params)
3931
3944
 
3932
- def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3933
- """
3934
- edit a trade order, gate currently only supports the modification of the price or amount fields
3935
- :see: https://www.gate.io/docs/developers/apiv4/en/#amend-an-order
3936
- :see: https://www.gate.io/docs/developers/apiv4/en/#amend-an-order-2
3937
- :param str id: order id
3938
- :param str symbol: unified symbol of the market to create an order in
3939
- :param str type: 'market' or 'limit'
3940
- :param str side: 'buy' or 'sell'
3941
- :param float amount: how much of the currency you want to trade in units of the base currency
3942
- :param float [price]: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
3943
- :param dict [params]: extra parameters specific to the exchange API endpoint
3944
- :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3945
- """
3946
- self.load_markets()
3945
+ def edit_order_request(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3947
3946
  market = self.market(symbol)
3948
3947
  marketType, query = self.handle_market_type_and_params('editOrder', market, params)
3949
3948
  account = self.convert_type_to_account(marketType)
@@ -3953,7 +3952,7 @@ class gate(Exchange, ImplicitAPI):
3953
3952
  # exchange doesn't have market orders for spot
3954
3953
  raise InvalidOrder(self.id + ' editOrder() does not support ' + type + ' orders for ' + marketType + ' markets')
3955
3954
  request: dict = {
3956
- 'order_id': id,
3955
+ 'order_id': str(id),
3957
3956
  'currency_pair': market['id'],
3958
3957
  'account': account,
3959
3958
  }
@@ -3967,12 +3966,32 @@ class gate(Exchange, ImplicitAPI):
3967
3966
  request['size'] = self.amount_to_precision(symbol, amount)
3968
3967
  if price is not None:
3969
3968
  request['price'] = self.price_to_precision(symbol, price)
3969
+ if not market['spot']:
3970
+ request['settle'] = market['settleId']
3971
+ return self.extend(request, query)
3972
+
3973
+ def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3974
+ """
3975
+ edit a trade order, gate currently only supports the modification of the price or amount fields
3976
+ :see: https://www.gate.io/docs/developers/apiv4/en/#amend-an-order
3977
+ :see: https://www.gate.io/docs/developers/apiv4/en/#amend-an-order-2
3978
+ :param str id: order id
3979
+ :param str symbol: unified symbol of the market to create an order in
3980
+ :param str type: 'market' or 'limit'
3981
+ :param str side: 'buy' or 'sell'
3982
+ :param float amount: how much of the currency you want to trade in units of the base currency
3983
+ :param float [price]: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
3984
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3985
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3986
+ """
3987
+ self.load_markets()
3988
+ market = self.market(symbol)
3989
+ extendedRequest = self.edit_order_request(id, symbol, type, side, amount, price, params)
3970
3990
  response = None
3971
3991
  if market['spot']:
3972
- response = self.privateSpotPatchOrdersOrderId(self.extend(request, query))
3992
+ response = self.privateSpotPatchOrdersOrderId(extendedRequest)
3973
3993
  else:
3974
- request['settle'] = market['settleId']
3975
- response = self.privateFuturesPutSettleOrdersOrderId(self.extend(request, query))
3994
+ response = self.privateFuturesPutSettleOrdersOrderId(extendedRequest)
3976
3995
  #
3977
3996
  # {
3978
3997
  # "id": "243233276443",
@@ -4273,6 +4292,23 @@ class gate(Exchange, ImplicitAPI):
4273
4292
  'info': order,
4274
4293
  }, market)
4275
4294
 
4295
+ def fetch_order_request(self, id: str, symbol: Str = None, params={}):
4296
+ market = None if (symbol is None) else self.market(symbol)
4297
+ stop = self.safe_bool_n(params, ['trigger', 'is_stop_order', 'stop'], False)
4298
+ params = self.omit(params, ['is_stop_order', 'stop', 'trigger'])
4299
+ clientOrderId = self.safe_string_2(params, 'text', 'clientOrderId')
4300
+ orderId = id
4301
+ if clientOrderId is not None:
4302
+ params = self.omit(params, ['text', 'clientOrderId'])
4303
+ if clientOrderId[0] != 't':
4304
+ clientOrderId = 't-' + clientOrderId
4305
+ orderId = clientOrderId
4306
+ type, query = self.handle_market_type_and_params('fetchOrder', market, params)
4307
+ contract = (type == 'swap') or (type == 'future') or (type == 'option')
4308
+ request, requestParams = self.prepare_request(market, type, query) if contract else self.spot_order_prepare_request(market, stop, query)
4309
+ request['order_id'] = str(orderId)
4310
+ return [request, requestParams]
4311
+
4276
4312
  def fetch_order(self, id: str, symbol: Str = None, params={}):
4277
4313
  """
4278
4314
  Retrieves information on an order
@@ -4283,27 +4319,18 @@ class gate(Exchange, ImplicitAPI):
4283
4319
  :param str id: Order id
4284
4320
  :param str symbol: Unified market symbol, *required for spot and margin*
4285
4321
  :param dict [params]: Parameters specified by the exchange api
4286
- :param bool [params.stop]: True if the order being fetched is a trigger order
4322
+ :param bool [params.trigger]: True if the order being fetched is a trigger order
4287
4323
  :param str [params.marginMode]: 'cross' or 'isolated' - marginMode for margin trading if not provided self.options['defaultMarginMode'] is used
4288
4324
  :param str [params.type]: 'spot', 'swap', or 'future', if not provided self.options['defaultMarginMode'] is used
4289
4325
  :param str [params.settle]: 'btc' or 'usdt' - settle currency for perpetual swap and future - market settle currency is used if symbol is not None, default="usdt" for swap and "btc" for future
4290
4326
  :returns: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
4291
4327
  """
4292
4328
  self.load_markets()
4293
- stop = self.safe_value_2(params, 'is_stop_order', 'stop', False)
4294
- params = self.omit(params, ['is_stop_order', 'stop'])
4295
- clientOrderId = self.safe_string_2(params, 'text', 'clientOrderId')
4296
- orderId = id
4297
- if clientOrderId is not None:
4298
- params = self.omit(params, ['text', 'clientOrderId'])
4299
- if clientOrderId[0] != 't':
4300
- clientOrderId = 't-' + clientOrderId
4301
- orderId = clientOrderId
4302
4329
  market = None if (symbol is None) else self.market(symbol)
4303
- type, query = self.handle_market_type_and_params('fetchOrder', market, params)
4304
- contract = (type == 'swap') or (type == 'future') or (type == 'option')
4305
- request, requestParams = self.prepare_request(market, type, query) if contract else self.spot_order_prepare_request(market, stop, query)
4306
- request['order_id'] = orderId
4330
+ result = self.handle_market_type_and_params('fetchOrder', market, params)
4331
+ type = self.safe_string(result, 0)
4332
+ stop = self.safe_bool_n(params, ['trigger', 'is_stop_order', 'stop'], False)
4333
+ request, requestParams = self.fetch_order_request(id, symbol, params)
4307
4334
  response = None
4308
4335
  if type == 'spot' or type == 'margin':
4309
4336
  if stop:
@@ -4362,14 +4389,13 @@ class gate(Exchange, ImplicitAPI):
4362
4389
  """
4363
4390
  return self.fetch_orders_by_status('finished', symbol, since, limit, params)
4364
4391
 
4365
- def fetch_orders_by_status(self, status, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
4366
- self.load_markets()
4392
+ def fetch_orders_by_status_request(self, status, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
4367
4393
  market = None
4368
4394
  if symbol is not None:
4369
4395
  market = self.market(symbol)
4370
4396
  symbol = market['symbol']
4371
- stop = self.safe_value(params, 'stop')
4372
- params = self.omit(params, 'stop')
4397
+ stop = self.safe_bool_2(params, 'stop', 'trigger')
4398
+ params = self.omit(params, ['stop', 'trigger'])
4373
4399
  type, query = self.handle_market_type_and_params('fetchOrdersByStatus', market, params)
4374
4400
  spot = (type == 'spot') or (type == 'margin')
4375
4401
  request, requestParams = self.multi_order_spot_prepare_request(market, stop, query) if spot else self.prepare_request(market, type, query)
@@ -4380,6 +4406,24 @@ class gate(Exchange, ImplicitAPI):
4380
4406
  request['limit'] = limit
4381
4407
  if since is not None and spot:
4382
4408
  request['from'] = self.parse_to_int(since / 1000)
4409
+ lastId, finalParams = self.handle_param_string_2(requestParams, 'lastId', 'last_id')
4410
+ if lastId is not None:
4411
+ request['last_id'] = lastId
4412
+ return [request, finalParams]
4413
+
4414
+ def fetch_orders_by_status(self, status, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
4415
+ self.load_markets()
4416
+ market = None
4417
+ if symbol is not None:
4418
+ market = self.market(symbol)
4419
+ symbol = market['symbol']
4420
+ stop = self.safe_bool_2(params, 'stop', 'trigger')
4421
+ params = self.omit(params, ['trigger', 'stop'])
4422
+ res = self.handle_market_type_and_params('fetchOrdersByStatus', market, params)
4423
+ type = self.safe_string(res, 0)
4424
+ params['type'] = type
4425
+ request, requestParams = self.fetch_orders_by_status_request(status, symbol, since, limit, params)
4426
+ spot = (type == 'spot') or (type == 'margin')
4383
4427
  openSpotOrders = spot and (status == 'open') and not stop
4384
4428
  response = None
4385
4429
  if type == 'spot' or type == 'margin':
@@ -4573,8 +4617,8 @@ class gate(Exchange, ImplicitAPI):
4573
4617
  """
4574
4618
  self.load_markets()
4575
4619
  market = None if (symbol is None) else self.market(symbol)
4576
- stop = self.safe_value_2(params, 'is_stop_order', 'stop', False)
4577
- params = self.omit(params, ['is_stop_order', 'stop'])
4620
+ stop = self.safe_bool_n(params, ['is_stop_order', 'stop', 'trigger'], False)
4621
+ params = self.omit(params, ['is_stop_order', 'stop', 'trigger'])
4578
4622
  type, query = self.handle_market_type_and_params('cancelOrder', market, params)
4579
4623
  request, requestParams = self.spot_order_prepare_request(market, stop, query) if (type == 'spot' or type == 'margin') else self.prepare_request(market, type, query)
4580
4624
  request['order_id'] = id
ccxt/hyperliquid.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.hyperliquid import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Trade, Transaction, TransferEntry
8
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Trade, Transaction, TransferEntry
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import ArgumentsRequired
@@ -2341,6 +2341,33 @@ class hyperliquid(Exchange, ImplicitAPI):
2341
2341
  response = self.privatePostExchange(self.extend(request, params))
2342
2342
  return self.parse_transaction(response)
2343
2343
 
2344
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2345
+ #
2346
+ # {status: 'ok', response: {type: 'default'}}
2347
+ #
2348
+ return {
2349
+ 'info': transaction,
2350
+ 'id': None,
2351
+ 'txid': None,
2352
+ 'timestamp': None,
2353
+ 'datetime': None,
2354
+ 'network': None,
2355
+ 'address': None,
2356
+ 'addressTo': None,
2357
+ 'addressFrom': None,
2358
+ 'tag': None,
2359
+ 'tagTo': None,
2360
+ 'tagFrom': None,
2361
+ 'type': None,
2362
+ 'amount': None,
2363
+ 'currency': None,
2364
+ 'status': self.safe_string(transaction, 'status'),
2365
+ 'updated': None,
2366
+ 'comment': None,
2367
+ 'internal': None,
2368
+ 'fee': None,
2369
+ }
2370
+
2344
2371
  def format_vault_address(self, address: Str = None):
2345
2372
  if address is None:
2346
2373
  return None
ccxt/krakenfutures.py CHANGED
@@ -136,6 +136,8 @@ class krakenfutures(Exchange, ImplicitAPI):
136
136
  'transfers',
137
137
  'leveragepreferences',
138
138
  'pnlpreferences',
139
+ 'assignmentprogram/current',
140
+ 'assignmentprogram/history',
139
141
  ],
140
142
  'post': [
141
143
  'sendorder',
@@ -146,6 +148,8 @@ class krakenfutures(Exchange, ImplicitAPI):
146
148
  'cancelallorders',
147
149
  'cancelallordersafter',
148
150
  'withdrawal', # for futures wallet -> kraken spot wallet
151
+ 'assignmentprogram/add',
152
+ 'assignmentprogram/delete',
149
153
  ],
150
154
  'put': [
151
155
  'leveragepreferences',
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.46'
7
+ __version__ = '4.3.48'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/bingx.py CHANGED
@@ -693,14 +693,14 @@ class bingx(ccxt.async_support.bingx):
693
693
  # ]
694
694
  # }
695
695
  #
696
- data = self.safe_list(message, 'data', [])
696
+ isSwap = client.url.find('swap') >= 0
697
697
  candles = None
698
- if isinstance(data, list):
699
- candles = data
698
+ if isSwap:
699
+ candles = self.safe_list(message, 'data', [])
700
700
  else:
701
- candles = [self.safe_list(data, 'K', [])]
701
+ data = self.safe_dict(message, 'data', {})
702
+ candles = [self.safe_dict(data, 'K', {})]
702
703
  dataType = self.safe_string(message, 'dataType')
703
- isSwap = client.url.find('swap') >= 0
704
704
  parts = dataType.split('@')
705
705
  firstPart = parts[0]
706
706
  isAllEndpoint = (firstPart == 'all')
ccxt/pro/coinex.py CHANGED
@@ -631,12 +631,13 @@ class coinex(ccxt.async_support.coinex):
631
631
  # "id": null
632
632
  # }
633
633
  #
634
+ isSwap = client.url.find('perpetual') >= 0
635
+ marketType = 'swap' if isSwap else 'spot'
634
636
  params = self.safe_value(message, 'params', [])
635
637
  fullOrderBook = self.safe_value(params, 0)
636
638
  orderbook = self.safe_value(params, 1)
637
639
  marketId = self.safe_string(params, 2)
638
- defaultType = self.safe_string(self.options, 'defaultType')
639
- market = self.safe_market(marketId, None, None, defaultType)
640
+ market = self.safe_market(marketId, None, None, marketType)
640
641
  symbol = market['symbol']
641
642
  name = 'orderbook'
642
643
  messageHash = name + ':' + symbol