ccxt 4.2.85 → 4.2.87

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 +5 -5
  2. package/dist/ccxt.browser.js +1132 -432
  3. package/dist/ccxt.browser.min.js +3 -3
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ascendex.js +11 -1
  6. package/dist/cjs/src/binance.js +14 -1
  7. package/dist/cjs/src/bingx.js +71 -20
  8. package/dist/cjs/src/bitbank.js +19 -23
  9. package/dist/cjs/src/bitfinex.js +3 -0
  10. package/dist/cjs/src/bitfinex2.js +16 -1
  11. package/dist/cjs/src/bitflyer.js +19 -0
  12. package/dist/cjs/src/bitget.js +15 -1
  13. package/dist/cjs/src/bitopro.js +3 -0
  14. package/dist/cjs/src/bitrue.js +13 -7
  15. package/dist/cjs/src/bitvavo.js +3 -0
  16. package/dist/cjs/src/btcmarkets.js +1 -1
  17. package/dist/cjs/src/btcturk.js +2 -1
  18. package/dist/cjs/src/coinex.js +576 -302
  19. package/dist/cjs/src/currencycom.js +1 -1
  20. package/dist/cjs/src/delta.js +3 -1
  21. package/dist/cjs/src/digifinex.js +4 -2
  22. package/dist/cjs/src/exmo.js +11 -12
  23. package/dist/cjs/src/gate.js +5 -2
  24. package/dist/cjs/src/hitbtc.js +26 -2
  25. package/dist/cjs/src/htx.js +2 -2
  26. package/dist/cjs/src/huobijp.js +1 -1
  27. package/dist/cjs/src/hyperliquid.js +249 -12
  28. package/dist/cjs/src/idex.js +11 -12
  29. package/dist/cjs/src/krakenfutures.js +2 -6
  30. package/dist/cjs/src/lbank.js +3 -0
  31. package/dist/cjs/src/oceanex.js +1 -1
  32. package/dist/cjs/src/okcoin.js +3 -1
  33. package/dist/cjs/src/okx.js +24 -10
  34. package/dist/cjs/src/phemex.js +3 -1
  35. package/dist/cjs/src/pro/bitget.js +1 -0
  36. package/dist/cjs/src/pro/kucoin.js +11 -6
  37. package/dist/cjs/src/wazirx.js +1 -1
  38. package/dist/cjs/src/zonda.js +3 -0
  39. package/examples/js/benchmark.js +104 -0
  40. package/examples/ts/benchmark.ts +134 -0
  41. package/js/ccxt.d.ts +1 -1
  42. package/js/ccxt.js +1 -1
  43. package/js/src/abstract/coinex.d.ts +232 -123
  44. package/js/src/ascendex.d.ts +5 -12
  45. package/js/src/ascendex.js +11 -1
  46. package/js/src/base/Exchange.d.ts +13 -13
  47. package/js/src/base/types.d.ts +11 -0
  48. package/js/src/binance.d.ts +4 -11
  49. package/js/src/binance.js +14 -1
  50. package/js/src/bingx.d.ts +5 -2
  51. package/js/src/bingx.js +71 -20
  52. package/js/src/bitbank.js +19 -23
  53. package/js/src/bitfinex.js +3 -0
  54. package/js/src/bitfinex2.d.ts +3 -17
  55. package/js/src/bitfinex2.js +16 -1
  56. package/js/src/bitflyer.d.ts +1 -0
  57. package/js/src/bitflyer.js +20 -1
  58. package/js/src/bitget.d.ts +5 -12
  59. package/js/src/bitget.js +15 -1
  60. package/js/src/bitopro.js +3 -0
  61. package/js/src/bitrue.d.ts +3 -17
  62. package/js/src/bitrue.js +13 -7
  63. package/js/src/bitvavo.js +3 -0
  64. package/js/src/btcmarkets.js +1 -1
  65. package/js/src/btcturk.js +2 -1
  66. package/js/src/coinex.d.ts +5 -12
  67. package/js/src/coinex.js +576 -302
  68. package/js/src/currencycom.js +1 -1
  69. package/js/src/delta.d.ts +5 -37
  70. package/js/src/delta.js +3 -1
  71. package/js/src/digifinex.d.ts +5 -13
  72. package/js/src/digifinex.js +4 -2
  73. package/js/src/exmo.d.ts +5 -37
  74. package/js/src/exmo.js +11 -12
  75. package/js/src/gate.d.ts +5 -33
  76. package/js/src/gate.js +5 -2
  77. package/js/src/hitbtc.d.ts +5 -12
  78. package/js/src/hitbtc.js +26 -2
  79. package/js/src/htx.js +2 -2
  80. package/js/src/huobijp.js +1 -1
  81. package/js/src/hyperliquid.d.ts +7 -4
  82. package/js/src/hyperliquid.js +249 -12
  83. package/js/src/idex.js +11 -12
  84. package/js/src/krakenfutures.js +2 -6
  85. package/js/src/kucoinfutures.d.ts +2 -2
  86. package/js/src/lbank.js +3 -0
  87. package/js/src/mexc.d.ts +3 -3
  88. package/js/src/oceanex.js +1 -1
  89. package/js/src/okcoin.js +3 -1
  90. package/js/src/okx.d.ts +5 -33
  91. package/js/src/okx.js +24 -10
  92. package/js/src/phemex.d.ts +3 -11
  93. package/js/src/phemex.js +3 -1
  94. package/js/src/pro/bitget.js +1 -0
  95. package/js/src/pro/kucoin.js +11 -6
  96. package/js/src/wazirx.js +1 -1
  97. package/js/src/zonda.js +3 -0
  98. package/package.json +3 -2
  99. package/skip-tests.json +7 -3
package/js/src/coinex.js CHANGED
@@ -31,6 +31,7 @@ export default class coinex extends Exchange {
31
31
  // 60 per 2 seconds => 30 per second => weight = 13.334
32
32
  // 40 per 2 seconds => 20 per second => weight = 20
33
33
  // 20 per 2 seconds => 10 per second => weight = 40
34
+ // v1 is per 2 seconds and v2 is per 1 second
34
35
  'rateLimit': 2.5,
35
36
  'pro': true,
36
37
  'certified': true,
@@ -137,156 +138,279 @@ export default class coinex extends Exchange {
137
138
  'perpetualPrivate': 'https://api.coinex.com/perpetual',
138
139
  },
139
140
  'www': 'https://www.coinex.com',
140
- 'doc': 'https://viabtc.github.io/coinex_api_en_doc',
141
+ 'doc': 'https://docs.coinex.com/api/v2',
141
142
  'fees': 'https://www.coinex.com/fees',
142
143
  'referral': 'https://www.coinex.com/register?refer_code=yw5fz',
143
144
  },
144
145
  'api': {
145
- 'public': {
146
- 'get': {
147
- 'amm/market': 1,
148
- 'common/currency/rate': 1,
149
- 'common/asset/config': 1,
150
- 'common/maintain/info': 1,
151
- 'common/temp-maintain/info': 1,
152
- 'margin/market': 1,
153
- 'market/info': 1,
154
- 'market/list': 1,
155
- 'market/ticker': 1,
156
- 'market/ticker/all': 1,
157
- 'market/depth': 1,
158
- 'market/deals': 1,
159
- 'market/kline': 1,
160
- 'market/detail': 1,
161
- },
162
- },
163
- 'private': {
164
- 'get': {
165
- 'account/amm/balance': 40,
166
- 'account/investment/balance': 40,
167
- 'account/balance/history': 40,
168
- 'account/market/fee': 40,
169
- 'balance/coin/deposit': 40,
170
- 'balance/coin/withdraw': 40,
171
- 'balance/info': 40,
172
- 'balance/deposit/address/{coin_type}': 40,
173
- 'contract/transfer/history': 40,
174
- 'credit/info': 40,
175
- 'credit/balance': 40,
176
- 'investment/transfer/history': 40,
177
- 'margin/account': 1,
178
- 'margin/config': 1,
179
- 'margin/loan/history': 40,
180
- 'margin/transfer/history': 40,
181
- 'order/deals': 40,
182
- 'order/finished': 40,
183
- 'order/pending': 8,
184
- 'order/status': 8,
185
- 'order/status/batch': 8,
186
- 'order/user/deals': 40,
187
- 'order/stop/finished': 40,
188
- 'order/stop/pending': 8,
189
- 'order/user/trade/fee': 1,
190
- 'order/market/trade/info': 1,
191
- 'sub_account/balance': 1,
192
- 'sub_account/transfer/history': 40,
193
- 'sub_account/auth/api': 40,
194
- 'sub_account/auth/api/{user_auth_id}': 40,
195
- },
196
- 'post': {
197
- 'balance/coin/withdraw': 40,
198
- 'contract/balance/transfer': 40,
199
- 'margin/flat': 40,
200
- 'margin/loan': 40,
201
- 'margin/transfer': 40,
202
- 'order/limit/batch': 40,
203
- 'order/ioc': 13.334,
204
- 'order/limit': 13.334,
205
- 'order/market': 13.334,
206
- 'order/modify': 13.334,
207
- 'order/stop/limit': 13.334,
208
- 'order/stop/market': 13.334,
209
- 'order/stop/modify': 13.334,
210
- 'sub_account/transfer': 40,
211
- 'sub_account/register': 1,
212
- 'sub_account/unfrozen': 40,
213
- 'sub_account/frozen': 40,
214
- 'sub_account/auth/api': 40,
146
+ 'v1': {
147
+ 'public': {
148
+ 'get': {
149
+ 'amm/market': 1,
150
+ 'common/currency/rate': 1,
151
+ 'common/asset/config': 1,
152
+ 'common/maintain/info': 1,
153
+ 'common/temp-maintain/info': 1,
154
+ 'margin/market': 1,
155
+ 'market/info': 1,
156
+ 'market/list': 1,
157
+ 'market/ticker': 1,
158
+ 'market/ticker/all': 1,
159
+ 'market/depth': 1,
160
+ 'market/deals': 1,
161
+ 'market/kline': 1,
162
+ 'market/detail': 1,
163
+ },
215
164
  },
216
- 'put': {
217
- 'balance/deposit/address/{coin_type}': 40,
218
- 'sub_account/unfrozen': 40,
219
- 'sub_account/frozen': 40,
220
- 'sub_account/auth/api/{user_auth_id}': 40,
221
- 'v1/account/settings': 40,
165
+ 'private': {
166
+ 'get': {
167
+ 'account/amm/balance': 40,
168
+ 'account/investment/balance': 40,
169
+ 'account/balance/history': 40,
170
+ 'account/market/fee': 40,
171
+ 'balance/coin/deposit': 40,
172
+ 'balance/coin/withdraw': 40,
173
+ 'balance/info': 40,
174
+ 'balance/deposit/address/{coin_type}': 40,
175
+ 'contract/transfer/history': 40,
176
+ 'credit/info': 40,
177
+ 'credit/balance': 40,
178
+ 'investment/transfer/history': 40,
179
+ 'margin/account': 1,
180
+ 'margin/config': 1,
181
+ 'margin/loan/history': 40,
182
+ 'margin/transfer/history': 40,
183
+ 'order/deals': 40,
184
+ 'order/finished': 40,
185
+ 'order/pending': 8,
186
+ 'order/status': 8,
187
+ 'order/status/batch': 8,
188
+ 'order/user/deals': 40,
189
+ 'order/stop/finished': 40,
190
+ 'order/stop/pending': 8,
191
+ 'order/user/trade/fee': 1,
192
+ 'order/market/trade/info': 1,
193
+ 'sub_account/balance': 1,
194
+ 'sub_account/transfer/history': 40,
195
+ 'sub_account/auth/api': 40,
196
+ 'sub_account/auth/api/{user_auth_id}': 40,
197
+ },
198
+ 'post': {
199
+ 'balance/coin/withdraw': 40,
200
+ 'contract/balance/transfer': 40,
201
+ 'margin/flat': 40,
202
+ 'margin/loan': 40,
203
+ 'margin/transfer': 40,
204
+ 'order/limit/batch': 40,
205
+ 'order/ioc': 13.334,
206
+ 'order/limit': 13.334,
207
+ 'order/market': 13.334,
208
+ 'order/modify': 13.334,
209
+ 'order/stop/limit': 13.334,
210
+ 'order/stop/market': 13.334,
211
+ 'order/stop/modify': 13.334,
212
+ 'sub_account/transfer': 40,
213
+ 'sub_account/register': 1,
214
+ 'sub_account/unfrozen': 40,
215
+ 'sub_account/frozen': 40,
216
+ 'sub_account/auth/api': 40,
217
+ },
218
+ 'put': {
219
+ 'balance/deposit/address/{coin_type}': 40,
220
+ 'sub_account/unfrozen': 40,
221
+ 'sub_account/frozen': 40,
222
+ 'sub_account/auth/api/{user_auth_id}': 40,
223
+ 'v1/account/settings': 40,
224
+ },
225
+ 'delete': {
226
+ 'balance/coin/withdraw': 40,
227
+ 'order/pending/batch': 40,
228
+ 'order/pending': 13.334,
229
+ 'order/stop/pending': 40,
230
+ 'order/stop/pending/{id}': 13.334,
231
+ 'order/pending/by_client_id': 40,
232
+ 'order/stop/pending/by_client_id': 40,
233
+ 'sub_account/auth/api/{user_auth_id}': 40,
234
+ 'sub_account/authorize/{id}': 40,
235
+ },
222
236
  },
223
- 'delete': {
224
- 'balance/coin/withdraw': 40,
225
- 'order/pending/batch': 40,
226
- 'order/pending': 13.334,
227
- 'order/stop/pending': 40,
228
- 'order/stop/pending/{id}': 13.334,
229
- 'order/pending/by_client_id': 40,
230
- 'order/stop/pending/by_client_id': 40,
231
- 'sub_account/auth/api/{user_auth_id}': 40,
232
- 'sub_account/authorize/{id}': 40,
237
+ 'perpetualPublic': {
238
+ 'get': {
239
+ 'ping': 1,
240
+ 'time': 1,
241
+ 'market/list': 1,
242
+ 'market/limit_config': 1,
243
+ 'market/ticker': 1,
244
+ 'market/ticker/all': 1,
245
+ 'market/depth': 1,
246
+ 'market/deals': 1,
247
+ 'market/funding_history': 1,
248
+ 'market/kline': 1,
249
+ },
233
250
  },
234
- },
235
- 'perpetualPublic': {
236
- 'get': {
237
- 'ping': 1,
238
- 'time': 1,
239
- 'market/list': 1,
240
- 'market/limit_config': 1,
241
- 'market/ticker': 1,
242
- 'market/ticker/all': 1,
243
- 'market/depth': 1,
244
- 'market/deals': 1,
245
- 'market/funding_history': 1,
246
- 'market/kline': 1,
251
+ 'perpetualPrivate': {
252
+ 'get': {
253
+ 'market/user_deals': 1,
254
+ 'asset/query': 40,
255
+ 'order/pending': 8,
256
+ 'order/finished': 40,
257
+ 'order/stop_finished': 40,
258
+ 'order/stop_pending': 8,
259
+ 'order/status': 8,
260
+ 'order/stop_status': 8,
261
+ 'position/finished': 40,
262
+ 'position/pending': 40,
263
+ 'position/funding': 40,
264
+ 'position/adl_history': 40,
265
+ 'market/preference': 40,
266
+ 'position/margin_history': 40,
267
+ 'position/settle_history': 40,
268
+ },
269
+ 'post': {
270
+ 'market/adjust_leverage': 1,
271
+ 'market/position_expect': 1,
272
+ 'order/put_limit': 20,
273
+ 'order/put_market': 20,
274
+ 'order/put_stop_limit': 20,
275
+ 'order/put_stop_market': 20,
276
+ 'order/modify': 20,
277
+ 'order/modify_stop': 20,
278
+ 'order/cancel': 20,
279
+ 'order/cancel_all': 40,
280
+ 'order/cancel_batch': 40,
281
+ 'order/cancel_stop': 20,
282
+ 'order/cancel_stop_all': 40,
283
+ 'order/close_limit': 20,
284
+ 'order/close_market': 20,
285
+ 'position/adjust_margin': 20,
286
+ 'position/stop_loss': 20,
287
+ 'position/take_profit': 20,
288
+ 'position/market_close': 20,
289
+ 'order/cancel/by_client_id': 20,
290
+ 'order/cancel_stop/by_client_id': 20,
291
+ 'market/preference': 20,
292
+ },
247
293
  },
248
294
  },
249
- 'perpetualPrivate': {
250
- 'get': {
251
- 'market/user_deals': 1,
252
- 'asset/query': 40,
253
- 'order/pending': 8,
254
- 'order/finished': 40,
255
- 'order/stop_finished': 40,
256
- 'order/stop_pending': 8,
257
- 'order/status': 8,
258
- 'order/stop_status': 8,
259
- 'position/finished': 40,
260
- 'position/pending': 40,
261
- 'position/funding': 40,
262
- 'position/adl_history': 40,
263
- 'market/preference': 40,
264
- 'position/margin_history': 40,
265
- 'position/settle_history': 40,
295
+ 'v2': {
296
+ 'public': {
297
+ 'get': {
298
+ 'maintain-info': 1,
299
+ 'ping': 1,
300
+ 'time': 1,
301
+ 'spot/market': 1,
302
+ 'spot/ticker': 1,
303
+ 'spot/depth': 1,
304
+ 'spot/deals': 1,
305
+ 'spot/kline': 1,
306
+ 'spot/index': 1,
307
+ 'futures/market': 1,
308
+ 'futures/ticker': 1,
309
+ 'futures/depth': 1,
310
+ 'futures/deals': 1,
311
+ 'futures/kline': 1,
312
+ 'futures/index': 1,
313
+ 'futures/funding-rate': 1,
314
+ 'futures/funding-rate-history': 1,
315
+ 'futures/position-level': 1,
316
+ 'futures/liquidation-history': 1,
317
+ 'futures/basis-history': 1,
318
+ },
266
319
  },
267
- 'post': {
268
- 'market/adjust_leverage': 1,
269
- 'market/position_expect': 1,
270
- 'order/put_limit': 20,
271
- 'order/put_market': 20,
272
- 'order/put_stop_limit': 20,
273
- 'order/put_stop_market': 20,
274
- 'order/modify': 20,
275
- 'order/modify_stop': 20,
276
- 'order/cancel': 20,
277
- 'order/cancel_all': 40,
278
- 'order/cancel_batch': 40,
279
- 'order/cancel_stop': 20,
280
- 'order/cancel_stop_all': 40,
281
- 'order/close_limit': 20,
282
- 'order/close_market': 20,
283
- 'position/adjust_margin': 20,
284
- 'position/stop_loss': 20,
285
- 'position/take_profit': 20,
286
- 'position/market_close': 20,
287
- 'order/cancel/by_client_id': 20,
288
- 'order/cancel_stop/by_client_id': 20,
289
- 'market/preference': 20,
320
+ 'private': {
321
+ 'get': {
322
+ 'account/subs': 1,
323
+ 'account/subs/api-detail': 40,
324
+ 'account/subs/info': 1,
325
+ 'account/subs/api': 40,
326
+ 'account/subs/transfer-history': 40,
327
+ 'account/subs/spot-balance': 1,
328
+ 'account/trade-fee-rate': 40,
329
+ 'assets/spot/balance': 40,
330
+ 'assets/futures/balance': 40,
331
+ 'assets/margin/balance': 1,
332
+ 'assets/financial/balance': 40,
333
+ 'assets/amm/liquidity': 40,
334
+ 'assets/credit/info': 40,
335
+ 'assets/margin/borrow-history': 40,
336
+ 'assets/margin/interest-limit': 1,
337
+ 'assets/deposit-address': 40,
338
+ 'assets/deposit-history': 40,
339
+ 'assets/withdraw': 40,
340
+ 'assets/deposit-withdraw-config': 1,
341
+ 'assets/transfer-history': 40,
342
+ 'spot/order-status': 8,
343
+ 'spot/batch-order-status': 8,
344
+ 'spot/pending-order': 8,
345
+ 'spot/finished-order': 40,
346
+ 'spot/pending-stop-order': 8,
347
+ 'spot/finished-stop-order': 40,
348
+ 'spot/user-deals': 40,
349
+ 'spot/order-deals': 40,
350
+ 'futures/order-status': 8,
351
+ 'futures/batch-order-status': 1,
352
+ 'futures/pending-order': 8,
353
+ 'futures/finished-order': 40,
354
+ 'futures/pending-stop-order': 8,
355
+ 'futures/finished-stop-order': 40,
356
+ 'futures/user-deals': 1,
357
+ 'futures/order-deals': 1,
358
+ 'futures/pending-position': 40,
359
+ 'futures/finished-position': 1,
360
+ 'futures/position-margin-history': 1,
361
+ 'futures/position-funding-history': 40,
362
+ 'futures/position-adl-history': 1,
363
+ 'futures/position-settle-history': 1,
364
+ },
365
+ 'post': {
366
+ 'account/subs': 40,
367
+ 'account/subs/frozen': 40,
368
+ 'account/subs/unfrozen': 40,
369
+ 'account/subs/api': 40,
370
+ 'account/subs/edit-api': 40,
371
+ 'account/subs/delete-api': 40,
372
+ 'account/subs/transfer': 40,
373
+ 'account/settings': 40,
374
+ 'assets/margin/borrow': 40,
375
+ 'assets/margin/repay': 40,
376
+ 'assets/renewal-deposit-address': 40,
377
+ 'assets/withdraw': 40,
378
+ 'assets/cancel-withdraw': 40,
379
+ 'assets/transfer': 40,
380
+ 'assets/amm/add-liquidity': 1,
381
+ 'assets/amm/remove-liquidity': 1,
382
+ 'spot/order': 13.334,
383
+ 'spot/stop-order': 13.334,
384
+ 'spot/batch-order': 40,
385
+ 'spot/batch-stop-order': 1,
386
+ 'spot/modify-order': 13.334,
387
+ 'spot/modify-stop-order': 13.334,
388
+ 'spot/cancel-all-order': 1,
389
+ 'spot/cancel-order': 6.667,
390
+ 'spot/cancel-stop-order': 6.667,
391
+ 'spot/cancel-batch-order': 10,
392
+ 'spot/cancel-batch-stop-order': 10,
393
+ 'spot/cancel-order-by-client-id': 1,
394
+ 'spot/cancel-stop-order-by-client-id': 1,
395
+ 'futures/order': 20,
396
+ 'futures/stop-order': 20,
397
+ 'futures/batch-order': 1,
398
+ 'futures/batch-stop-order': 1,
399
+ 'futures/modify-order': 20,
400
+ 'futures/modify-stop-order': 20,
401
+ 'futures/cancel-all-order': 1,
402
+ 'futures/cancel-order': 10,
403
+ 'futures/cancel-stop-order': 10,
404
+ 'futures/cancel-batch-order': 20,
405
+ 'futures/cancel-batch-stop-order': 20,
406
+ 'futures/cancel-order-by-client-id': 1,
407
+ 'futures/cancel-stop-order-by-client-id': 1,
408
+ 'futures/close-position': 20,
409
+ 'futures/adjust-position-margin': 20,
410
+ 'futures/adjust-position-leverage': 20,
411
+ 'futures/set-position-stop-loss': 20,
412
+ 'futures/set-position-take-profit': 20,
413
+ },
290
414
  },
291
415
  },
292
416
  },
@@ -357,7 +481,7 @@ export default class coinex extends Exchange {
357
481
  });
358
482
  }
359
483
  async fetchCurrencies(params = {}) {
360
- const response = await this.publicGetCommonAssetConfig(params);
484
+ const response = await this.v1PublicGetCommonAssetConfig(params);
361
485
  // {
362
486
  // "code": 0,
363
487
  // "data": {
@@ -505,7 +629,7 @@ export default class coinex extends Exchange {
505
629
  return this.arrayConcat(spotMarkets, swapMarkets);
506
630
  }
507
631
  async fetchSpotMarkets(params) {
508
- const response = await this.publicGetMarketInfo(params);
632
+ const response = await this.v1PublicGetMarketInfo(params);
509
633
  //
510
634
  // {
511
635
  // "code": 0,
@@ -594,7 +718,7 @@ export default class coinex extends Exchange {
594
718
  return result;
595
719
  }
596
720
  async fetchContractMarkets(params) {
597
- const response = await this.perpetualPublicGetMarketList(params);
721
+ const response = await this.v1PerpetualPublicGetMarketList(params);
598
722
  //
599
723
  // {
600
724
  // "code": 0,
@@ -776,10 +900,10 @@ export default class coinex extends Exchange {
776
900
  };
777
901
  let response = undefined;
778
902
  if (market['swap']) {
779
- response = await this.perpetualPublicGetMarketTicker(this.extend(request, params));
903
+ response = await this.v1PerpetualPublicGetMarketTicker(this.extend(request, params));
780
904
  }
781
905
  else {
782
- response = await this.publicGetMarketTicker(this.extend(request, params));
906
+ response = await this.v1PublicGetMarketTicker(this.extend(request, params));
783
907
  }
784
908
  //
785
909
  // Spot
@@ -858,10 +982,10 @@ export default class coinex extends Exchange {
858
982
  const [marketType, query] = this.handleMarketTypeAndParams('fetchTickers', market, params);
859
983
  let response = undefined;
860
984
  if (marketType === 'swap') {
861
- response = await this.perpetualPublicGetMarketTickerAll(query);
985
+ response = await this.v1PerpetualPublicGetMarketTickerAll(query);
862
986
  }
863
987
  else {
864
- response = await this.publicGetMarketTickerAll();
988
+ response = await this.v1PublicGetMarketTickerAll();
865
989
  }
866
990
  //
867
991
  // Spot
@@ -944,19 +1068,22 @@ export default class coinex extends Exchange {
944
1068
  * @method
945
1069
  * @name coinex#fetchTime
946
1070
  * @description fetches the current integer timestamp in milliseconds from the exchange server
947
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http005_system_time
1071
+ * @see https://docs.coinex.com/api/v2/common/http/time
948
1072
  * @param {object} [params] extra parameters specific to the exchange API endpoint
949
1073
  * @returns {int} the current integer timestamp in milliseconds from the exchange server
950
1074
  */
951
- const response = await this.perpetualPublicGetTime(params);
1075
+ const response = await this.v2PublicGetTime(params);
952
1076
  //
953
1077
  // {
954
- // "code": "0",
955
- // "data": "1653261274414",
1078
+ // "code": 0,
1079
+ // "data": {
1080
+ // "timestamp": 1711699867777
1081
+ // },
956
1082
  // "message": "OK"
957
1083
  // }
958
1084
  //
959
- return this.safeInteger(response, 'data');
1085
+ const data = this.safeDict(response, 'data', {});
1086
+ return this.safeInteger(data, 'timestamp');
960
1087
  }
961
1088
  async fetchOrderBook(symbol, limit = 20, params = {}) {
962
1089
  /**
@@ -982,10 +1109,10 @@ export default class coinex extends Exchange {
982
1109
  };
983
1110
  let response = undefined;
984
1111
  if (market['swap']) {
985
- response = await this.perpetualPublicGetMarketDepth(this.extend(request, params));
1112
+ response = await this.v1PerpetualPublicGetMarketDepth(this.extend(request, params));
986
1113
  }
987
1114
  else {
988
- response = await this.publicGetMarketDepth(this.extend(request, params));
1115
+ response = await this.v1PublicGetMarketDepth(this.extend(request, params));
989
1116
  }
990
1117
  //
991
1118
  // Spot
@@ -1186,10 +1313,10 @@ export default class coinex extends Exchange {
1186
1313
  }
1187
1314
  let response = undefined;
1188
1315
  if (market['swap']) {
1189
- response = await this.perpetualPublicGetMarketDeals(this.extend(request, params));
1316
+ response = await this.v1PerpetualPublicGetMarketDeals(this.extend(request, params));
1190
1317
  }
1191
1318
  else {
1192
- response = await this.publicGetMarketDeals(this.extend(request, params));
1319
+ response = await this.v1PublicGetMarketDeals(this.extend(request, params));
1193
1320
  }
1194
1321
  //
1195
1322
  // Spot and Swap
@@ -1216,7 +1343,8 @@ export default class coinex extends Exchange {
1216
1343
  * @method
1217
1344
  * @name coinex#fetchTradingFee
1218
1345
  * @description fetch the trading fees for a market
1219
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot001_market003_single_market_info
1346
+ * @see https://docs.coinex.com/api/v2/spot/market/http/list-market
1347
+ * @see https://docs.coinex.com/api/v2/futures/market/http/list-market
1220
1348
  * @param {string} symbol unified market symbol
1221
1349
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1222
1350
  * @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
@@ -1226,67 +1354,132 @@ export default class coinex extends Exchange {
1226
1354
  const request = {
1227
1355
  'market': market['id'],
1228
1356
  };
1229
- const response = await this.publicGetMarketDetail(this.extend(request, params));
1230
- //
1231
- // {
1232
- // "code": 0,
1233
- // "data": {
1234
- // "name": "BTCUSDC",
1235
- // "min_amount": "0.0005",
1236
- // "maker_fee_rate": "0.002",
1237
- // "taker_fee_rate": "0.002",
1238
- // "pricing_name": "USDC",
1239
- // "pricing_decimal": 2,
1240
- // "trading_name": "BTC",
1241
- // "trading_decimal": 8
1242
- // },
1243
- // "message": "OK"
1244
- // }
1245
- //
1246
- const data = this.safeValue(response, 'data', {});
1247
- return this.parseTradingFee(data, market);
1357
+ let response = undefined;
1358
+ if (market['spot']) {
1359
+ response = await this.v2PublicGetSpotMarket(this.extend(request, params));
1360
+ //
1361
+ // {
1362
+ // "code": 0,
1363
+ // "data": [
1364
+ // {
1365
+ // "base_ccy": "BTC",
1366
+ // "base_ccy_precision": 8,
1367
+ // "is_amm_available": false,
1368
+ // "is_margin_available": true,
1369
+ // "maker_fee_rate": "0.002",
1370
+ // "market": "BTCUSDT",
1371
+ // "min_amount": "0.0001",
1372
+ // "quote_ccy": "USDT",
1373
+ // "quote_ccy_precision": 2,
1374
+ // "taker_fee_rate": "0.002"
1375
+ // }
1376
+ // ],
1377
+ // "message": "OK"
1378
+ // }
1379
+ //
1380
+ }
1381
+ else {
1382
+ response = await this.v2PublicGetFuturesMarket(this.extend(request, params));
1383
+ //
1384
+ // {
1385
+ // "code": 0,
1386
+ // "data": [
1387
+ // {
1388
+ // "base_ccy": "BTC",
1389
+ // "base_ccy_precision": 8,
1390
+ // "contract_type": "linear",
1391
+ // "leverage": ["1","2","3","5","8","10","15","20","30","50","100"],
1392
+ // "maker_fee_rate": "0",
1393
+ // "market": "BTCUSDT",
1394
+ // "min_amount": "0.0001",
1395
+ // "open_interest_volume": "185.7498",
1396
+ // "quote_ccy": "USDT",
1397
+ // "quote_ccy_precision": 2,
1398
+ // "taker_fee_rate": "0"
1399
+ // }
1400
+ // ],
1401
+ // "message": "OK"
1402
+ // }
1403
+ //
1404
+ }
1405
+ const data = this.safeList(response, 'data', []);
1406
+ const result = this.safeDict(data, 0, {});
1407
+ return this.parseTradingFee(result, market);
1248
1408
  }
1249
1409
  async fetchTradingFees(params = {}) {
1250
1410
  /**
1251
1411
  * @method
1252
1412
  * @name coinex#fetchTradingFees
1253
1413
  * @description fetch the trading fees for multiple markets
1254
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot001_market002_all_market_info
1414
+ * @see https://docs.coinex.com/api/v2/spot/market/http/list-market
1415
+ * @see https://docs.coinex.com/api/v2/futures/market/http/list-market
1255
1416
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1256
1417
  * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
1257
1418
  */
1258
1419
  await this.loadMarkets();
1259
- const response = await this.publicGetMarketInfo(params);
1260
- //
1261
- // {
1262
- // "code": 0,
1263
- // "data": {
1264
- // "WAVESBTC": {
1265
- // "name": "WAVESBTC",
1266
- // "min_amount": "1",
1267
- // "maker_fee_rate": "0.001",
1268
- // "taker_fee_rate": "0.001",
1269
- // "pricing_name": "BTC",
1270
- // "pricing_decimal": 8,
1271
- // "trading_name": "WAVES",
1272
- // "trading_decimal": 8
1273
- // }
1274
- // ...
1275
- // }
1276
- // }
1277
- //
1278
- const data = this.safeValue(response, 'data', {});
1420
+ let type = undefined;
1421
+ [type, params] = this.handleMarketTypeAndParams('fetchTradingFees', undefined, params);
1422
+ let response = undefined;
1423
+ if (type === 'swap') {
1424
+ response = await this.v2PublicGetFuturesMarket(params);
1425
+ //
1426
+ // {
1427
+ // "code": 0,
1428
+ // "data": [
1429
+ // {
1430
+ // "base_ccy": "BTC",
1431
+ // "base_ccy_precision": 8,
1432
+ // "contract_type": "linear",
1433
+ // "leverage": ["1","2","3","5","8","10","15","20","30","50","100"],
1434
+ // "maker_fee_rate": "0",
1435
+ // "market": "BTCUSDT",
1436
+ // "min_amount": "0.0001",
1437
+ // "open_interest_volume": "185.7498",
1438
+ // "quote_ccy": "USDT",
1439
+ // "quote_ccy_precision": 2,
1440
+ // "taker_fee_rate": "0"
1441
+ // }
1442
+ // ],
1443
+ // "message": "OK"
1444
+ // }
1445
+ //
1446
+ }
1447
+ else {
1448
+ response = await this.v2PublicGetSpotMarket(params);
1449
+ //
1450
+ // {
1451
+ // "code": 0,
1452
+ // "data": [
1453
+ // {
1454
+ // "base_ccy": "BTC",
1455
+ // "base_ccy_precision": 8,
1456
+ // "is_amm_available": false,
1457
+ // "is_margin_available": true,
1458
+ // "maker_fee_rate": "0.002",
1459
+ // "market": "BTCUSDT",
1460
+ // "min_amount": "0.0001",
1461
+ // "quote_ccy": "USDT",
1462
+ // "quote_ccy_precision": 2,
1463
+ // "taker_fee_rate": "0.002"
1464
+ // },
1465
+ // ],
1466
+ // "message": "OK"
1467
+ // }
1468
+ //
1469
+ }
1470
+ const data = this.safeList(response, 'data', []);
1279
1471
  const result = {};
1280
- for (let i = 0; i < this.symbols.length; i++) {
1281
- const symbol = this.symbols[i];
1282
- const market = this.market(symbol);
1283
- const fee = this.safeValue(data, market['id'], {});
1284
- result[symbol] = this.parseTradingFee(fee, market);
1472
+ for (let i = 0; i < data.length; i++) {
1473
+ const entry = data[i];
1474
+ const marketId = this.safeString(entry, 'market');
1475
+ const market = this.safeMarket(marketId, undefined, undefined, type);
1476
+ const symbol = market['symbol'];
1477
+ result[symbol] = this.parseTradingFee(entry, market);
1285
1478
  }
1286
1479
  return result;
1287
1480
  }
1288
1481
  parseTradingFee(fee, market = undefined) {
1289
- const marketId = this.safeValue(fee, 'name');
1482
+ const marketId = this.safeValue(fee, 'market');
1290
1483
  const symbol = this.safeSymbol(marketId, market);
1291
1484
  return {
1292
1485
  'info': fee,
@@ -1344,10 +1537,10 @@ export default class coinex extends Exchange {
1344
1537
  }
1345
1538
  let response = undefined;
1346
1539
  if (market['swap']) {
1347
- response = await this.perpetualPublicGetMarketKline(this.extend(request, params));
1540
+ response = await this.v1PerpetualPublicGetMarketKline(this.extend(request, params));
1348
1541
  }
1349
1542
  else {
1350
- response = await this.publicGetMarketKline(this.extend(request, params));
1543
+ response = await this.v1PublicGetMarketKline(this.extend(request, params));
1351
1544
  }
1352
1545
  //
1353
1546
  // Spot
@@ -1393,7 +1586,7 @@ export default class coinex extends Exchange {
1393
1586
  const request = {
1394
1587
  'market': marketId,
1395
1588
  };
1396
- const response = await this.privateGetMarginAccount(this.extend(request, params));
1589
+ const response = await this.v1PrivateGetMarginAccount(this.extend(request, params));
1397
1590
  //
1398
1591
  // {
1399
1592
  // "code": 0,
@@ -1460,7 +1653,7 @@ export default class coinex extends Exchange {
1460
1653
  }
1461
1654
  async fetchSpotBalance(params = {}) {
1462
1655
  await this.loadMarkets();
1463
- const response = await this.privateGetBalanceInfo(params);
1656
+ const response = await this.v1PrivateGetBalanceInfo(params);
1464
1657
  //
1465
1658
  // {
1466
1659
  // "code": 0,
@@ -1497,7 +1690,7 @@ export default class coinex extends Exchange {
1497
1690
  }
1498
1691
  async fetchSwapBalance(params = {}) {
1499
1692
  await this.loadMarkets();
1500
- const response = await this.perpetualPrivateGetAssetQuery(params);
1693
+ const response = await this.v1PerpetualPrivateGetAssetQuery(params);
1501
1694
  //
1502
1695
  // {
1503
1696
  // "code": 0,
@@ -1531,7 +1724,7 @@ export default class coinex extends Exchange {
1531
1724
  }
1532
1725
  async fetchFinancialBalance(params = {}) {
1533
1726
  await this.loadMarkets();
1534
- const response = await this.privateGetAccountInvestmentBalance(params);
1727
+ const response = await this.v1PrivateGetAccountInvestmentBalance(params);
1535
1728
  //
1536
1729
  // {
1537
1730
  // "code": 0,
@@ -2171,53 +2364,53 @@ export default class coinex extends Exchange {
2171
2364
  if (market['spot']) {
2172
2365
  if (isTriggerOrder) {
2173
2366
  if (type === 'limit') {
2174
- response = await this.privatePostOrderStopLimit(request);
2367
+ response = await this.v1PrivatePostOrderStopLimit(request);
2175
2368
  }
2176
2369
  else {
2177
- response = await this.privatePostOrderStopMarket(request);
2370
+ response = await this.v1PrivatePostOrderStopMarket(request);
2178
2371
  }
2179
2372
  }
2180
2373
  else {
2181
2374
  if (type === 'limit') {
2182
- response = await this.privatePostOrderLimit(request);
2375
+ response = await this.v1PrivatePostOrderLimit(request);
2183
2376
  }
2184
2377
  else {
2185
- response = await this.privatePostOrderMarket(request);
2378
+ response = await this.v1PrivatePostOrderMarket(request);
2186
2379
  }
2187
2380
  }
2188
2381
  }
2189
2382
  else {
2190
2383
  if (isTriggerOrder) {
2191
2384
  if (type === 'limit') {
2192
- response = await this.perpetualPrivatePostOrderPutStopLimit(request);
2385
+ response = await this.v1PerpetualPrivatePostOrderPutStopLimit(request);
2193
2386
  }
2194
2387
  else {
2195
- response = await this.perpetualPrivatePostOrderPutStopMarket(request);
2388
+ response = await this.v1PerpetualPrivatePostOrderPutStopMarket(request);
2196
2389
  }
2197
2390
  }
2198
2391
  else if (isStopLossOrTakeProfitTrigger) {
2199
2392
  if (isStopLossTriggerOrder) {
2200
- response = await this.perpetualPrivatePostPositionStopLoss(request);
2393
+ response = await this.v1PerpetualPrivatePostPositionStopLoss(request);
2201
2394
  }
2202
2395
  else if (isTakeProfitTriggerOrder) {
2203
- response = await this.perpetualPrivatePostPositionTakeProfit(request);
2396
+ response = await this.v1PerpetualPrivatePostPositionTakeProfit(request);
2204
2397
  }
2205
2398
  }
2206
2399
  else {
2207
2400
  if (reduceOnly) {
2208
2401
  if (type === 'limit') {
2209
- response = await this.perpetualPrivatePostOrderCloseLimit(request);
2402
+ response = await this.v1PerpetualPrivatePostOrderCloseLimit(request);
2210
2403
  }
2211
2404
  else {
2212
- response = await this.perpetualPrivatePostOrderCloseMarket(request);
2405
+ response = await this.v1PerpetualPrivatePostOrderCloseMarket(request);
2213
2406
  }
2214
2407
  }
2215
2408
  else {
2216
2409
  if (type === 'limit') {
2217
- response = await this.perpetualPrivatePostOrderPutLimit(request);
2410
+ response = await this.v1PerpetualPrivatePostOrderPutLimit(request);
2218
2411
  }
2219
2412
  else {
2220
- response = await this.perpetualPrivatePostOrderPutMarket(request);
2413
+ response = await this.v1PerpetualPrivatePostOrderPutMarket(request);
2221
2414
  }
2222
2415
  }
2223
2416
  }
@@ -2345,7 +2538,7 @@ export default class coinex extends Exchange {
2345
2538
  'market': market['id'],
2346
2539
  'batch_orders': this.json(ordersRequests),
2347
2540
  };
2348
- const response = await this.privatePostOrderLimitBatch(request);
2541
+ const response = await this.v1PrivatePostOrderLimitBatch(request);
2349
2542
  //
2350
2543
  // {
2351
2544
  // "code": 0,
@@ -2428,11 +2621,11 @@ export default class coinex extends Exchange {
2428
2621
  let response = undefined;
2429
2622
  if (market['spot']) {
2430
2623
  request['batch_ids'] = idsString;
2431
- response = await this.privateDeleteOrderPendingBatch(this.extend(request, params));
2624
+ response = await this.v1PrivateDeleteOrderPendingBatch(this.extend(request, params));
2432
2625
  }
2433
2626
  else {
2434
2627
  request['order_ids'] = idsString;
2435
- response = await this.perpetualPrivatePostOrderCancelBatch(this.extend(request, params));
2628
+ response = await this.v1PerpetualPrivatePostOrderCancelBatch(this.extend(request, params));
2436
2629
  }
2437
2630
  //
2438
2631
  // spot
@@ -2569,7 +2762,7 @@ export default class coinex extends Exchange {
2569
2762
  if (price !== undefined) {
2570
2763
  request['price'] = this.priceToPrecision(symbol, price);
2571
2764
  }
2572
- const response = await this.privatePostOrderModify(this.extend(request, params));
2765
+ const response = await this.v1PrivatePostOrderModify(this.extend(request, params));
2573
2766
  //
2574
2767
  // {
2575
2768
  // "code": 0,
@@ -2650,18 +2843,18 @@ export default class coinex extends Exchange {
2650
2843
  request['client_id'] = clientOrderId;
2651
2844
  if (stop) {
2652
2845
  if (swap) {
2653
- response = await this.perpetualPrivatePostOrderCancelStopByClientId(this.extend(request, query));
2846
+ response = await this.v1PerpetualPrivatePostOrderCancelStopByClientId(this.extend(request, query));
2654
2847
  }
2655
2848
  else {
2656
- response = await this.privateDeleteOrderStopPendingByClientId(this.extend(request, query));
2849
+ response = await this.v1PrivateDeleteOrderStopPendingByClientId(this.extend(request, query));
2657
2850
  }
2658
2851
  }
2659
2852
  else {
2660
2853
  if (swap) {
2661
- response = await this.perpetualPrivatePostOrderCancelByClientId(this.extend(request, query));
2854
+ response = await this.v1PerpetualPrivatePostOrderCancelByClientId(this.extend(request, query));
2662
2855
  }
2663
2856
  else {
2664
- response = await this.privateDeleteOrderPendingByClientId(this.extend(request, query));
2857
+ response = await this.v1PrivateDeleteOrderPendingByClientId(this.extend(request, query));
2665
2858
  }
2666
2859
  }
2667
2860
  }
@@ -2670,18 +2863,18 @@ export default class coinex extends Exchange {
2670
2863
  request[idRequest] = id;
2671
2864
  if (stop) {
2672
2865
  if (swap) {
2673
- response = await this.perpetualPrivatePostOrderCancelStop(this.extend(request, query));
2866
+ response = await this.v1PerpetualPrivatePostOrderCancelStop(this.extend(request, query));
2674
2867
  }
2675
2868
  else {
2676
- response = await this.privateDeleteOrderStopPendingId(this.extend(request, query));
2869
+ response = await this.v1PrivateDeleteOrderStopPendingId(this.extend(request, query));
2677
2870
  }
2678
2871
  }
2679
2872
  else {
2680
2873
  if (swap) {
2681
- response = await this.perpetualPrivatePostOrderCancel(this.extend(request, query));
2874
+ response = await this.v1PerpetualPrivatePostOrderCancel(this.extend(request, query));
2682
2875
  }
2683
2876
  else {
2684
- response = await this.privateDeleteOrderPending(this.extend(request, query));
2877
+ response = await this.v1PrivateDeleteOrderPending(this.extend(request, query));
2685
2878
  }
2686
2879
  }
2687
2880
  }
@@ -2825,19 +3018,19 @@ export default class coinex extends Exchange {
2825
3018
  let response = undefined;
2826
3019
  if (swap) {
2827
3020
  if (stop) {
2828
- response = await this.perpetualPrivatePostOrderCancelStopAll(this.extend(request, params));
3021
+ response = await this.v1PerpetualPrivatePostOrderCancelStopAll(this.extend(request, params));
2829
3022
  }
2830
3023
  else {
2831
- response = await this.perpetualPrivatePostOrderCancelAll(this.extend(request, params));
3024
+ response = await this.v1PerpetualPrivatePostOrderCancelAll(this.extend(request, params));
2832
3025
  }
2833
3026
  }
2834
3027
  else {
2835
3028
  request['account_id'] = accountId;
2836
3029
  if (stop) {
2837
- response = await this.privateDeleteOrderStopPending(this.extend(request, params));
3030
+ response = await this.v1PrivateDeleteOrderStopPending(this.extend(request, params));
2838
3031
  }
2839
3032
  else {
2840
- response = await this.privateDeleteOrderPending(this.extend(request, params));
3033
+ response = await this.v1PrivateDeleteOrderPending(this.extend(request, params));
2841
3034
  }
2842
3035
  }
2843
3036
  //
@@ -2881,14 +3074,14 @@ export default class coinex extends Exchange {
2881
3074
  let response = undefined;
2882
3075
  if (swap) {
2883
3076
  if (stop) {
2884
- response = await this.perpetualPrivateGetOrderStopStatus(this.extend(request, params));
3077
+ response = await this.v1PerpetualPrivateGetOrderStopStatus(this.extend(request, params));
2885
3078
  }
2886
3079
  else {
2887
- response = await this.perpetualPrivateGetOrderStatus(this.extend(request, params));
3080
+ response = await this.v1PerpetualPrivateGetOrderStatus(this.extend(request, params));
2888
3081
  }
2889
3082
  }
2890
3083
  else {
2891
- response = await this.privateGetOrderStatus(this.extend(request, params));
3084
+ response = await this.v1PrivateGetOrderStatus(this.extend(request, params));
2892
3085
  }
2893
3086
  //
2894
3087
  // Spot
@@ -3032,14 +3225,14 @@ export default class coinex extends Exchange {
3032
3225
  }
3033
3226
  request['offset'] = 0;
3034
3227
  if (stop) {
3035
- response = await this.perpetualPrivateGetOrderStopPending(this.extend(request, params));
3228
+ response = await this.v1PerpetualPrivateGetOrderStopPending(this.extend(request, params));
3036
3229
  }
3037
3230
  else {
3038
3231
  if (status === 'finished') {
3039
- response = await this.perpetualPrivateGetOrderFinished(this.extend(request, params));
3232
+ response = await this.v1PerpetualPrivateGetOrderFinished(this.extend(request, params));
3040
3233
  }
3041
3234
  else if (status === 'pending') {
3042
- response = await this.perpetualPrivateGetOrderPending(this.extend(request, params));
3235
+ response = await this.v1PerpetualPrivateGetOrderPending(this.extend(request, params));
3043
3236
  }
3044
3237
  }
3045
3238
  }
@@ -3047,18 +3240,18 @@ export default class coinex extends Exchange {
3047
3240
  request['page'] = 1;
3048
3241
  if (status === 'finished') {
3049
3242
  if (stop) {
3050
- response = await this.privateGetOrderStopFinished(this.extend(request, params));
3243
+ response = await this.v1PrivateGetOrderStopFinished(this.extend(request, params));
3051
3244
  }
3052
3245
  else {
3053
- response = await this.privateGetOrderFinished(this.extend(request, params));
3246
+ response = await this.v1PrivateGetOrderFinished(this.extend(request, params));
3054
3247
  }
3055
3248
  }
3056
3249
  else if (status === 'pending') {
3057
3250
  if (stop) {
3058
- response = await this.privateGetOrderStopPending(this.extend(request, params));
3251
+ response = await this.v1PrivateGetOrderStopPending(this.extend(request, params));
3059
3252
  }
3060
3253
  else {
3061
- response = await this.privateGetOrderPending(this.extend(request, params));
3254
+ response = await this.v1PrivateGetOrderPending(this.extend(request, params));
3062
3255
  }
3063
3256
  }
3064
3257
  }
@@ -3270,7 +3463,7 @@ export default class coinex extends Exchange {
3270
3463
  params = this.omit(params, 'network');
3271
3464
  request['smart_contract_name'] = network;
3272
3465
  }
3273
- const response = await this.privatePutBalanceDepositAddressCoinType(this.extend(request, params));
3466
+ const response = await this.v1PrivatePutBalanceDepositAddressCoinType(this.extend(request, params));
3274
3467
  //
3275
3468
  // {
3276
3469
  // "code": 0,
@@ -3314,7 +3507,7 @@ export default class coinex extends Exchange {
3314
3507
  if (network !== undefined) {
3315
3508
  request['smart_contract_name'] = network;
3316
3509
  }
3317
- const response = await this.privateGetBalanceDepositAddressCoinType(this.extend(request, params));
3510
+ const response = await this.v1PrivateGetBalanceDepositAddressCoinType(this.extend(request, params));
3318
3511
  //
3319
3512
  // {
3320
3513
  // "code": 0,
@@ -3430,11 +3623,11 @@ export default class coinex extends Exchange {
3430
3623
  request['start_time'] = since;
3431
3624
  }
3432
3625
  request['side'] = 0;
3433
- response = await this.perpetualPrivateGetMarketUserDeals(this.extend(request, params));
3626
+ response = await this.v1PerpetualPrivateGetMarketUserDeals(this.extend(request, params));
3434
3627
  }
3435
3628
  else {
3436
3629
  request['page'] = 1;
3437
- response = await this.privateGetOrderUserDeals(this.extend(request, params));
3630
+ response = await this.v1PrivateGetOrderUserDeals(this.extend(request, params));
3438
3631
  }
3439
3632
  //
3440
3633
  // Spot and Margin
@@ -3528,8 +3721,8 @@ export default class coinex extends Exchange {
3528
3721
  */
3529
3722
  await this.loadMarkets();
3530
3723
  let defaultMethod = undefined;
3531
- [defaultMethod, params] = this.handleOptionAndParams(params, 'fetchPositions', 'method', 'perpetualPrivateGetPositionPending');
3532
- const isHistory = (defaultMethod === 'perpetualPrivateGetPositionFinished');
3724
+ [defaultMethod, params] = this.handleOptionAndParams(params, 'fetchPositions', 'method', 'v1PerpetualPrivateGetPositionPending');
3725
+ const isHistory = (defaultMethod === 'v1PerpetualPrivateGetPositionFinished');
3533
3726
  symbols = this.marketSymbols(symbols);
3534
3727
  const request = {};
3535
3728
  let market = undefined;
@@ -3558,11 +3751,11 @@ export default class coinex extends Exchange {
3558
3751
  request['side'] = this.safeInteger(params, 'side', 0); // 0: All, 1: Sell, 2: Buy
3559
3752
  }
3560
3753
  let response = undefined;
3561
- if (defaultMethod === 'perpetualPrivateGetPositionPending') {
3562
- response = await this.perpetualPrivateGetPositionPending(this.extend(request, params));
3754
+ if (defaultMethod === 'v1PerpetualPrivateGetPositionPending') {
3755
+ response = await this.v1PerpetualPrivateGetPositionPending(this.extend(request, params));
3563
3756
  }
3564
3757
  else {
3565
- response = await this.perpetualPrivateGetPositionFinished(this.extend(request, params));
3758
+ response = await this.v1PerpetualPrivateGetPositionFinished(this.extend(request, params));
3566
3759
  }
3567
3760
  //
3568
3761
  // {
@@ -3645,7 +3838,7 @@ export default class coinex extends Exchange {
3645
3838
  const request = {
3646
3839
  'market': market['id'],
3647
3840
  };
3648
- const response = await this.perpetualPrivateGetPositionPending(this.extend(request, params));
3841
+ const response = await this.v1PerpetualPrivateGetPositionPending(this.extend(request, params));
3649
3842
  //
3650
3843
  // {
3651
3844
  // "code": 0,
@@ -3859,7 +4052,7 @@ export default class coinex extends Exchange {
3859
4052
  'leverage': leverage.toString(),
3860
4053
  'position_type': positionType, // 1: isolated, 2: cross
3861
4054
  };
3862
- return await this.perpetualPrivatePostMarketAdjustLeverage(this.extend(request, params));
4055
+ return await this.v1PerpetualPrivatePostMarketAdjustLeverage(this.extend(request, params));
3863
4056
  }
3864
4057
  async setLeverage(leverage, symbol = undefined, params = {}) {
3865
4058
  /**
@@ -3900,7 +4093,7 @@ export default class coinex extends Exchange {
3900
4093
  'leverage': leverage.toString(),
3901
4094
  'position_type': positionType, // 1: isolated, 2: cross
3902
4095
  };
3903
- return await this.perpetualPrivatePostMarketAdjustLeverage(this.extend(request, params));
4096
+ return await this.v1PerpetualPrivatePostMarketAdjustLeverage(this.extend(request, params));
3904
4097
  }
3905
4098
  async fetchLeverageTiers(symbols = undefined, params = {}) {
3906
4099
  /**
@@ -3913,7 +4106,7 @@ export default class coinex extends Exchange {
3913
4106
  * @returns {object} a dictionary of [leverage tiers structures]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}, indexed by market symbols
3914
4107
  */
3915
4108
  await this.loadMarkets();
3916
- const response = await this.perpetualPublicGetMarketLimitConfig(params);
4109
+ const response = await this.v1PerpetualPublicGetMarketLimitConfig(params);
3917
4110
  //
3918
4111
  // {
3919
4112
  // "code": 0,
@@ -3991,7 +4184,7 @@ export default class coinex extends Exchange {
3991
4184
  'amount': this.amountToPrecision(symbol, amount),
3992
4185
  'type': addOrReduce,
3993
4186
  };
3994
- const response = await this.perpetualPrivatePostPositionAdjustMargin(this.extend(request, params));
4187
+ const response = await this.v1PerpetualPrivatePostPositionAdjustMargin(this.extend(request, params));
3995
4188
  //
3996
4189
  // {
3997
4190
  // "code": 0,
@@ -4058,13 +4251,72 @@ export default class coinex extends Exchange {
4058
4251
  });
4059
4252
  }
4060
4253
  parseMarginModification(data, market = undefined) {
4254
+ //
4255
+ // addMargin/reduceMargin
4256
+ //
4257
+ // {
4258
+ // "adl_sort": 1,
4259
+ // "adl_sort_val": "0.00004320",
4260
+ // "amount": "0.0005",
4261
+ // "amount_max": "0.0005",
4262
+ // "amount_max_margin": "6.57352000000000000000",
4263
+ // "bkr_price": "16294.08000000000000011090",
4264
+ // "bkr_price_imply": "0.00000000000000000000",
4265
+ // "close_left": "0.0005",
4266
+ // "create_time": 1651202571.320778,
4267
+ // "deal_all": "19.72000000000000000000",
4268
+ // "deal_asset_fee": "0.00000000000000000000",
4269
+ // "fee_asset": "",
4270
+ // "finish_type": 1,
4271
+ // "first_price": "39441.12",
4272
+ // "insurance": "0.00000000000000000000",
4273
+ // "latest_price": "39441.12",
4274
+ // "leverage": "3",
4275
+ // "liq_amount": "0.00000000000000000000",
4276
+ // "liq_order_price": "0",
4277
+ // "liq_order_time": 0,
4278
+ // "liq_price": "16491.28560000000000011090",
4279
+ // "liq_price_imply": "0.00000000000000000000",
4280
+ // "liq_profit": "0.00000000000000000000",
4281
+ // "liq_time": 0,
4282
+ // "mainten_margin": "0.005",
4283
+ // "mainten_margin_amount": "0.09860280000000000000",
4284
+ // "maker_fee": "0.00000000000000000000",
4285
+ // "margin_amount": "11.57352000000000000000",
4286
+ // "market": "BTCUSDT",
4287
+ // "open_margin": "0.58687582908396110455",
4288
+ // "open_margin_imply": "0.00000000000000000000",
4289
+ // "open_price": "39441.12000000000000000000",
4290
+ // "open_val": "19.72056000000000000000",
4291
+ // "open_val_max": "19.72056000000000000000",
4292
+ // "position_id": 65171206,
4293
+ // "profit_clearing": "-0.00986028000000000000",
4294
+ // "profit_real": "-0.00986028000000000000",
4295
+ // "profit_unreal": "0.00",
4296
+ // "side": 2,
4297
+ // "stop_loss_price": "0.00000000000000000000",
4298
+ // "stop_loss_type": 0,
4299
+ // "sys": 0,
4300
+ // "take_profit_price": "0.00000000000000000000",
4301
+ // "take_profit_type": 0,
4302
+ // "taker_fee": "0.00000000000000000000",
4303
+ // "total": 3464,
4304
+ // "type": 1,
4305
+ // "update_time": 1651202638.911212,
4306
+ // "user_id": 3620173
4307
+ // }
4308
+ //
4309
+ const timestamp = this.safeIntegerProduct(data, 'update_time', 1000);
4061
4310
  return {
4062
4311
  'info': data,
4312
+ 'symbol': this.safeSymbol(undefined, market),
4063
4313
  'type': undefined,
4064
- 'amount': undefined,
4314
+ 'amount': this.safeNumber(data, 'margin_amount'),
4315
+ 'total': undefined,
4065
4316
  'code': market['quote'],
4066
- 'symbol': this.safeSymbol(undefined, market),
4067
4317
  'status': undefined,
4318
+ 'timestamp': timestamp,
4319
+ 'datetime': this.iso8601(timestamp),
4068
4320
  };
4069
4321
  }
4070
4322
  async addMargin(symbol, amount, params = {}) {
@@ -4121,7 +4373,7 @@ export default class coinex extends Exchange {
4121
4373
  if (since !== undefined) {
4122
4374
  request['start_time'] = since;
4123
4375
  }
4124
- const response = await this.perpetualPrivateGetPositionFunding(this.extend(request, params));
4376
+ const response = await this.v1PerpetualPrivateGetPositionFunding(this.extend(request, params));
4125
4377
  //
4126
4378
  // {
4127
4379
  // "code": 0,
@@ -4187,7 +4439,7 @@ export default class coinex extends Exchange {
4187
4439
  const request = {
4188
4440
  'market': market['id'],
4189
4441
  };
4190
- const response = await this.perpetualPublicGetMarketTicker(this.extend(request, params));
4442
+ const response = await this.v1PerpetualPublicGetMarketTicker(this.extend(request, params));
4191
4443
  //
4192
4444
  // {
4193
4445
  // "code": 0,
@@ -4298,7 +4550,7 @@ export default class coinex extends Exchange {
4298
4550
  throw new BadSymbol(this.id + ' fetchFundingRates() supports swap contracts only');
4299
4551
  }
4300
4552
  }
4301
- const response = await this.perpetualPublicGetMarketTickerAll(params);
4553
+ const response = await this.v1PerpetualPublicGetMarketTickerAll(params);
4302
4554
  //
4303
4555
  // {
4304
4556
  // "code": 0,
@@ -4380,7 +4632,7 @@ export default class coinex extends Exchange {
4380
4632
  if (networkCode !== undefined) {
4381
4633
  request['smart_contract_name'] = this.networkCodeToId(networkCode);
4382
4634
  }
4383
- const response = await this.privatePostBalanceCoinWithdraw(this.extend(request, params));
4635
+ const response = await this.v1PrivatePostBalanceCoinWithdraw(this.extend(request, params));
4384
4636
  //
4385
4637
  // {
4386
4638
  // "code": 0,
@@ -4452,7 +4704,7 @@ export default class coinex extends Exchange {
4452
4704
  request['start_time'] = since;
4453
4705
  }
4454
4706
  [request, params] = this.handleUntilOption('end_time', request, params);
4455
- const response = await this.perpetualPublicGetMarketFundingHistory(this.extend(request, params));
4707
+ const response = await this.v1PerpetualPublicGetMarketFundingHistory(this.extend(request, params));
4456
4708
  //
4457
4709
  // {
4458
4710
  // "code": 0,
@@ -4629,11 +4881,11 @@ export default class coinex extends Exchange {
4629
4881
  let response = undefined;
4630
4882
  if ((fromAccount === 'spot') && (toAccount === 'swap')) {
4631
4883
  request['transfer_side'] = 'in'; // 'in' spot to swap, 'out' swap to spot
4632
- response = await this.privatePostContractBalanceTransfer(this.extend(request, params));
4884
+ response = await this.v1PrivatePostContractBalanceTransfer(this.extend(request, params));
4633
4885
  }
4634
4886
  else if ((fromAccount === 'swap') && (toAccount === 'spot')) {
4635
4887
  request['transfer_side'] = 'out'; // 'in' spot to swap, 'out' swap to spot
4636
- response = await this.privatePostContractBalanceTransfer(this.extend(request, params));
4888
+ response = await this.v1PrivatePostContractBalanceTransfer(this.extend(request, params));
4637
4889
  }
4638
4890
  else {
4639
4891
  const accountsById = this.safeValue(this.options, 'accountsById', {});
@@ -4643,7 +4895,7 @@ export default class coinex extends Exchange {
4643
4895
  // spot is 0, use fetchBalance() to find the margin account id
4644
4896
  request['from_account'] = parseInt(fromId);
4645
4897
  request['to_account'] = parseInt(toId);
4646
- response = await this.privatePostMarginTransfer(this.extend(request, params));
4898
+ response = await this.v1PrivatePostMarginTransfer(this.extend(request, params));
4647
4899
  }
4648
4900
  //
4649
4901
  // {"code": 0, "data": null, "message": "Success"}
@@ -4766,10 +5018,10 @@ export default class coinex extends Exchange {
4766
5018
  [marginMode, params] = this.handleMarginModeAndParams('fetchTransfers', params);
4767
5019
  let response = undefined;
4768
5020
  if (marginMode !== undefined) {
4769
- response = await this.privateGetMarginTransferHistory(this.extend(request, params));
5021
+ response = await this.v1PrivateGetMarginTransferHistory(this.extend(request, params));
4770
5022
  }
4771
5023
  else {
4772
- response = await this.privateGetContractTransferHistory(this.extend(request, params));
5024
+ response = await this.v1PrivateGetContractTransferHistory(this.extend(request, params));
4773
5025
  }
4774
5026
  //
4775
5027
  // Swap
@@ -4841,7 +5093,7 @@ export default class coinex extends Exchange {
4841
5093
  if (limit !== undefined) {
4842
5094
  request['Limit'] = limit;
4843
5095
  }
4844
- const response = await this.privateGetBalanceCoinWithdraw(this.extend(request, params));
5096
+ const response = await this.v1PrivateGetBalanceCoinWithdraw(this.extend(request, params));
4845
5097
  //
4846
5098
  // {
4847
5099
  // "code": 0,
@@ -4908,7 +5160,7 @@ export default class coinex extends Exchange {
4908
5160
  if (limit !== undefined) {
4909
5161
  request['Limit'] = limit;
4910
5162
  }
4911
- const response = await this.privateGetBalanceCoinDeposit(this.extend(request, params));
5163
+ const response = await this.v1PrivateGetBalanceCoinDeposit(this.extend(request, params));
4912
5164
  //
4913
5165
  // {
4914
5166
  // "code": 0,
@@ -5001,7 +5253,7 @@ export default class coinex extends Exchange {
5001
5253
  const request = {
5002
5254
  'market': market['id'],
5003
5255
  };
5004
- const response = await this.privateGetMarginConfig(this.extend(request, params));
5256
+ const response = await this.v1PrivateGetMarginConfig(this.extend(request, params));
5005
5257
  //
5006
5258
  // {
5007
5259
  // "code": 0,
@@ -5035,7 +5287,7 @@ export default class coinex extends Exchange {
5035
5287
  * @returns {object} a list of [isolated borrow rate structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#isolated-borrow-rate-structure}
5036
5288
  */
5037
5289
  await this.loadMarkets();
5038
- const response = await this.privateGetMarginConfig(params);
5290
+ const response = await this.v1PrivateGetMarginConfig(params);
5039
5291
  //
5040
5292
  // {
5041
5293
  // "code": 0,
@@ -5076,7 +5328,7 @@ export default class coinex extends Exchange {
5076
5328
  if (limit !== undefined) {
5077
5329
  request['limit'] = limit;
5078
5330
  }
5079
- const response = await this.privateGetMarginLoanHistory(this.extend(request, params));
5331
+ const response = await this.v1PrivateGetMarginLoanHistory(this.extend(request, params));
5080
5332
  //
5081
5333
  // {
5082
5334
  // "code": 0,
@@ -5172,7 +5424,7 @@ export default class coinex extends Exchange {
5172
5424
  'coin_type': currency['id'],
5173
5425
  'amount': this.currencyToPrecision(code, amount),
5174
5426
  };
5175
- const response = await this.privatePostMarginLoan(this.extend(request, params));
5427
+ const response = await this.v1PrivatePostMarginLoan(this.extend(request, params));
5176
5428
  //
5177
5429
  // {
5178
5430
  // "code": 0,
@@ -5210,7 +5462,7 @@ export default class coinex extends Exchange {
5210
5462
  'coin_type': currency['id'],
5211
5463
  'amount': this.currencyToPrecision(code, amount),
5212
5464
  };
5213
- const response = await this.privatePostMarginFlat(this.extend(request, params));
5465
+ const response = await this.v1PrivatePostMarginFlat(this.extend(request, params));
5214
5466
  //
5215
5467
  // {
5216
5468
  // "code": 0,
@@ -5268,7 +5520,7 @@ export default class coinex extends Exchange {
5268
5520
  request['coin_type'] = this.safeValue(codes, 0);
5269
5521
  }
5270
5522
  }
5271
- const response = await this.publicGetCommonAssetConfig(this.extend(request, params));
5523
+ const response = await this.v1PublicGetCommonAssetConfig(this.extend(request, params));
5272
5524
  //
5273
5525
  // {
5274
5526
  // "code": 0,
@@ -5368,7 +5620,7 @@ export default class coinex extends Exchange {
5368
5620
  if (marketType !== 'spot') {
5369
5621
  throw new NotSupported(this.id + ' fetchLeverages() supports spot margin markets only');
5370
5622
  }
5371
- const response = await this.privateGetMarginConfig(params);
5623
+ const response = await this.v1PrivateGetMarginConfig(params);
5372
5624
  //
5373
5625
  // {
5374
5626
  // "code": 0,
@@ -5427,9 +5679,11 @@ export default class coinex extends Exchange {
5427
5679
  nonce() {
5428
5680
  return this.milliseconds();
5429
5681
  }
5430
- sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
5682
+ sign(path, api = [], method = 'GET', params = {}, headers = undefined, body = undefined) {
5431
5683
  path = this.implodeParams(path, params);
5432
- let url = this.urls['api'][api] + '/' + this.version + '/' + path;
5684
+ const version = api[0];
5685
+ const requestUrl = api[1];
5686
+ let url = this.urls['api'][requestUrl] + '/' + version + '/' + path;
5433
5687
  let query = this.omit(params, this.extractParams(path));
5434
5688
  const nonce = this.nonce().toString();
5435
5689
  if (method === 'POST') {
@@ -5458,7 +5712,7 @@ export default class coinex extends Exchange {
5458
5712
  }
5459
5713
  }
5460
5714
  }
5461
- if (api === 'perpetualPrivate') {
5715
+ if (requestUrl === 'perpetualPrivate') {
5462
5716
  this.checkRequiredCredentials();
5463
5717
  query = this.extend({
5464
5718
  'access_id': this.apiKey,
@@ -5479,29 +5733,49 @@ export default class coinex extends Exchange {
5479
5733
  body = urlencoded;
5480
5734
  }
5481
5735
  }
5482
- else if (api === 'public' || api === 'perpetualPublic') {
5736
+ else if (requestUrl === 'public' || requestUrl === 'perpetualPublic') {
5483
5737
  if (Object.keys(query).length) {
5484
5738
  url += '?' + this.urlencode(query);
5485
5739
  }
5486
5740
  }
5487
5741
  else {
5488
- this.checkRequiredCredentials();
5489
- query = this.extend({
5490
- 'access_id': this.apiKey,
5491
- 'tonce': nonce,
5492
- }, query);
5493
- query = this.keysort(query);
5494
- const urlencoded = this.rawencode(query);
5495
- const signature = this.hash(this.encode(urlencoded + '&secret_key=' + this.secret), md5);
5496
- headers = {
5497
- 'Authorization': signature.toUpperCase(),
5498
- 'Content-Type': 'application/json',
5499
- };
5500
- if ((method === 'GET') || (method === 'DELETE') || (method === 'PUT')) {
5501
- url += '?' + urlencoded;
5742
+ if (version === 'v1') {
5743
+ this.checkRequiredCredentials();
5744
+ query = this.extend({
5745
+ 'access_id': this.apiKey,
5746
+ 'tonce': nonce,
5747
+ }, query);
5748
+ query = this.keysort(query);
5749
+ const urlencoded = this.rawencode(query);
5750
+ const signature = this.hash(this.encode(urlencoded + '&secret_key=' + this.secret), md5);
5751
+ headers = {
5752
+ 'Authorization': signature.toUpperCase(),
5753
+ 'Content-Type': 'application/json',
5754
+ };
5755
+ if ((method === 'GET') || (method === 'DELETE') || (method === 'PUT')) {
5756
+ url += '?' + urlencoded;
5757
+ }
5758
+ else {
5759
+ body = this.json(query);
5760
+ }
5502
5761
  }
5503
- else {
5504
- body = this.json(query);
5762
+ else if (version === 'v2') {
5763
+ this.checkRequiredCredentials();
5764
+ query = this.keysort(query);
5765
+ const urlencoded = this.rawencode(query);
5766
+ const preparedString = method + '/' + version + '/' + path + '?' + urlencoded + nonce + this.secret;
5767
+ const signature = this.hash(this.encode(preparedString), sha256);
5768
+ headers = {
5769
+ 'X-COINEX-KEY': this.apiKey,
5770
+ 'X-COINEX-SIGN': signature,
5771
+ 'X-COINEX-TIMESTAMP': nonce,
5772
+ };
5773
+ if ((method === 'GET') || (method === 'DELETE') || (method === 'PUT')) {
5774
+ url += '?' + urlencoded;
5775
+ }
5776
+ else {
5777
+ body = this.json(query);
5778
+ }
5505
5779
  }
5506
5780
  }
5507
5781
  return { 'url': url, 'method': method, 'body': body, 'headers': headers };