ccxt-look 1.81.50

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 (264) hide show
  1. package/.cache/eslintcache +1 -0
  2. package/.dockerignore +6 -0
  3. package/.eslintignore +1 -0
  4. package/.gitattributes +5 -0
  5. package/.readthedocs.yaml +16 -0
  6. package/CONTRIBUTING.md +1049 -0
  7. package/LICENSE.txt +21 -0
  8. package/README.md +537 -0
  9. package/SECURITY.md +5 -0
  10. package/build/cleanup-old-tags.js +94 -0
  11. package/build/countries.js +256 -0
  12. package/build/export-exchanges.js +520 -0
  13. package/build/fs.js +51 -0
  14. package/build/transpile.js +1772 -0
  15. package/build/vss.js +78 -0
  16. package/ccxt.browser.js +7 -0
  17. package/ccxt.d.ts +692 -0
  18. package/ccxt.js +171 -0
  19. package/cleanup.sh +2 -0
  20. package/composer-install.sh +20 -0
  21. package/dist/ccxt.browser.js +208383 -0
  22. package/gource.sh +3 -0
  23. package/index.html +7 -0
  24. package/js/.eslintrc +87 -0
  25. package/js/aax.js +2686 -0
  26. package/js/ascendex.js +2584 -0
  27. package/js/base/.eslintrc.js +43 -0
  28. package/js/base/Exchange.js +2371 -0
  29. package/js/base/Precise.js +283 -0
  30. package/js/base/errorHierarchy.js +47 -0
  31. package/js/base/errors.js +55 -0
  32. package/js/base/functions/crypto.js +158 -0
  33. package/js/base/functions/encode.js +118 -0
  34. package/js/base/functions/generic.js +270 -0
  35. package/js/base/functions/misc.js +138 -0
  36. package/js/base/functions/number.js +329 -0
  37. package/js/base/functions/platform.js +38 -0
  38. package/js/base/functions/string.js +21 -0
  39. package/js/base/functions/throttle.js +79 -0
  40. package/js/base/functions/time.js +210 -0
  41. package/js/base/functions/type.js +66 -0
  42. package/js/base/functions.js +28 -0
  43. package/js/bequant.js +32 -0
  44. package/js/bibox.js +1407 -0
  45. package/js/bigone.js +1366 -0
  46. package/js/binance.js +5652 -0
  47. package/js/binancecoinm.js +46 -0
  48. package/js/binanceus.js +46 -0
  49. package/js/binanceusdm.js +49 -0
  50. package/js/bit2c.js +535 -0
  51. package/js/bitbank.js +842 -0
  52. package/js/bitbay.js +16 -0
  53. package/js/bitbns.js +1073 -0
  54. package/js/bitcoincom.js +15 -0
  55. package/js/bitfinex.js +1433 -0
  56. package/js/bitfinex2.js +2025 -0
  57. package/js/bitflyer.js +840 -0
  58. package/js/bitforex.js +614 -0
  59. package/js/bitget.js +2397 -0
  60. package/js/bithumb.js +980 -0
  61. package/js/bitmart.js +2516 -0
  62. package/js/bitmex.js +1809 -0
  63. package/js/bitopro.js +1443 -0
  64. package/js/bitpanda.js +1782 -0
  65. package/js/bitrue.js +1747 -0
  66. package/js/bitso.js +1062 -0
  67. package/js/bitstamp.js +1757 -0
  68. package/js/bitstamp1.js +343 -0
  69. package/js/bittrex.js +1876 -0
  70. package/js/bitvavo.js +1579 -0
  71. package/js/bkex.js +1233 -0
  72. package/js/bl3p.js +346 -0
  73. package/js/blockchaincom.js +969 -0
  74. package/js/btcalpha.js +680 -0
  75. package/js/btcbox.js +477 -0
  76. package/js/btcmarkets.js +1022 -0
  77. package/js/btctradeua.js +466 -0
  78. package/js/btcturk.js +734 -0
  79. package/js/buda.js +946 -0
  80. package/js/bw.js +1265 -0
  81. package/js/bybit.js +3372 -0
  82. package/js/bytetrade.js +1336 -0
  83. package/js/cdax.js +1646 -0
  84. package/js/cex.js +1410 -0
  85. package/js/coinbase.js +1342 -0
  86. package/js/coinbaseprime.js +31 -0
  87. package/js/coinbasepro.js +1466 -0
  88. package/js/coincheck.js +755 -0
  89. package/js/coinex.js +3400 -0
  90. package/js/coinfalcon.js +880 -0
  91. package/js/coinmate.js +794 -0
  92. package/js/coinone.js +816 -0
  93. package/js/coinspot.js +345 -0
  94. package/js/crex24.js +1636 -0
  95. package/js/cryptocom.js +1832 -0
  96. package/js/currencycom.js +1748 -0
  97. package/js/delta.js +1547 -0
  98. package/js/deribit.js +2148 -0
  99. package/js/digifinex.js +1585 -0
  100. package/js/eqonex.js +1660 -0
  101. package/js/exmo.js +1670 -0
  102. package/js/fairdesk.js +1231 -0
  103. package/js/flowbtc.js +35 -0
  104. package/js/fmfwio.js +34 -0
  105. package/js/ftx.js +2751 -0
  106. package/js/ftxus.js +38 -0
  107. package/js/gateio.js +4174 -0
  108. package/js/gemini.js +1397 -0
  109. package/js/hitbtc.js +1343 -0
  110. package/js/hitbtc3.js +2329 -0
  111. package/js/hollaex.js +1486 -0
  112. package/js/huobi.js +5706 -0
  113. package/js/huobijp.js +1710 -0
  114. package/js/huobipro.js +18 -0
  115. package/js/idex.js +1439 -0
  116. package/js/independentreserve.js +649 -0
  117. package/js/indodax.js +742 -0
  118. package/js/itbit.js +722 -0
  119. package/js/kraken.js +2179 -0
  120. package/js/kucoin.js +2571 -0
  121. package/js/kucoinfutures.js +1771 -0
  122. package/js/kuna.js +809 -0
  123. package/js/latoken.js +1445 -0
  124. package/js/lbank.js +760 -0
  125. package/js/liquid.js +1432 -0
  126. package/js/luno.js +873 -0
  127. package/js/lykke.js +1147 -0
  128. package/js/mercado.js +771 -0
  129. package/js/mexc.js +3151 -0
  130. package/js/ndax.js +2233 -0
  131. package/js/novadax.js +1318 -0
  132. package/js/oceanex.js +816 -0
  133. package/js/okcoin.js +3841 -0
  134. package/js/okex.js +16 -0
  135. package/js/okex5.js +16 -0
  136. package/js/okx.js +4795 -0
  137. package/js/paymium.js +498 -0
  138. package/js/phemex.js +2957 -0
  139. package/js/poloniex.js +1674 -0
  140. package/js/probit.js +1346 -0
  141. package/js/qtrade.js +1588 -0
  142. package/js/ripio.js +1061 -0
  143. package/js/static_dependencies/BN/bn.js +3526 -0
  144. package/js/static_dependencies/README.md +1 -0
  145. package/js/static_dependencies/crypto-js/crypto-js.js +5988 -0
  146. package/js/static_dependencies/elliptic/lib/elliptic/curve/base.js +375 -0
  147. package/js/static_dependencies/elliptic/lib/elliptic/curve/edwards.js +433 -0
  148. package/js/static_dependencies/elliptic/lib/elliptic/curve/index.js +8 -0
  149. package/js/static_dependencies/elliptic/lib/elliptic/curve/mont.js +180 -0
  150. package/js/static_dependencies/elliptic/lib/elliptic/curve/short.js +938 -0
  151. package/js/static_dependencies/elliptic/lib/elliptic/curves.js +204 -0
  152. package/js/static_dependencies/elliptic/lib/elliptic/ec/index.js +240 -0
  153. package/js/static_dependencies/elliptic/lib/elliptic/ec/key.js +119 -0
  154. package/js/static_dependencies/elliptic/lib/elliptic/ec/signature.js +24 -0
  155. package/js/static_dependencies/elliptic/lib/elliptic/eddsa/index.js +145 -0
  156. package/js/static_dependencies/elliptic/lib/elliptic/eddsa/key.js +100 -0
  157. package/js/static_dependencies/elliptic/lib/elliptic/eddsa/signature.js +65 -0
  158. package/js/static_dependencies/elliptic/lib/elliptic/precomputed/secp256k1.js +780 -0
  159. package/js/static_dependencies/elliptic/lib/elliptic/utils.js +214 -0
  160. package/js/static_dependencies/elliptic/lib/elliptic.js +22 -0
  161. package/js/static_dependencies/elliptic/lib/hmac-drbg/hmac-drbg.js +114 -0
  162. package/js/static_dependencies/fetch-ponyfill/fetch-node.js +39 -0
  163. package/js/static_dependencies/node-fetch/index.js +1564 -0
  164. package/js/static_dependencies/node-rsa/NodeRSA.js +223 -0
  165. package/js/static_dependencies/node-rsa/asn1/ber/errors.js +13 -0
  166. package/js/static_dependencies/node-rsa/asn1/ber/index.js +21 -0
  167. package/js/static_dependencies/node-rsa/asn1/ber/reader.js +262 -0
  168. package/js/static_dependencies/node-rsa/asn1/ber/types.js +36 -0
  169. package/js/static_dependencies/node-rsa/asn1/index.js +17 -0
  170. package/js/static_dependencies/node-rsa/encryptEngines/js.js +34 -0
  171. package/js/static_dependencies/node-rsa/formats/components.js +71 -0
  172. package/js/static_dependencies/node-rsa/formats/formats.js +31 -0
  173. package/js/static_dependencies/node-rsa/formats/pkcs1.js +148 -0
  174. package/js/static_dependencies/node-rsa/formats/pkcs8.js +187 -0
  175. package/js/static_dependencies/node-rsa/libs/jsbn.js +1252 -0
  176. package/js/static_dependencies/node-rsa/libs/rsa.js +147 -0
  177. package/js/static_dependencies/node-rsa/schemes/pkcs1.js +176 -0
  178. package/js/static_dependencies/node-rsa/schemes/schemes.js +21 -0
  179. package/js/static_dependencies/node-rsa/utils.js +98 -0
  180. package/js/static_dependencies/qs/formats.js +18 -0
  181. package/js/static_dependencies/qs/index.js +11 -0
  182. package/js/static_dependencies/qs/parse.js +242 -0
  183. package/js/static_dependencies/qs/stringify.js +269 -0
  184. package/js/static_dependencies/qs/utils.js +230 -0
  185. package/js/stex.js +1925 -0
  186. package/js/test/.eslintrc.js +42 -0
  187. package/js/test/Exchange/test.balance.js +61 -0
  188. package/js/test/Exchange/test.borrowRate.js +32 -0
  189. package/js/test/Exchange/test.currency.js +52 -0
  190. package/js/test/Exchange/test.fetchBalance.js +23 -0
  191. package/js/test/Exchange/test.fetchBorrowInterest.js +59 -0
  192. package/js/test/Exchange/test.fetchBorrowRate.js +32 -0
  193. package/js/test/Exchange/test.fetchBorrowRates.js +28 -0
  194. package/js/test/Exchange/test.fetchClosedOrders.js +32 -0
  195. package/js/test/Exchange/test.fetchCurrencies.js +35 -0
  196. package/js/test/Exchange/test.fetchDeposits.js +31 -0
  197. package/js/test/Exchange/test.fetchFundingFees.js +19 -0
  198. package/js/test/Exchange/test.fetchFundingRateHistory.js +40 -0
  199. package/js/test/Exchange/test.fetchL2OrderBook.js +23 -0
  200. package/js/test/Exchange/test.fetchLedger.js +42 -0
  201. package/js/test/Exchange/test.fetchLeverageTiers.js +33 -0
  202. package/js/test/Exchange/test.fetchMarketLeverageTiers.js +22 -0
  203. package/js/test/Exchange/test.fetchMarkets.js +33 -0
  204. package/js/test/Exchange/test.fetchMyTrades.js +42 -0
  205. package/js/test/Exchange/test.fetchOHLCV.js +46 -0
  206. package/js/test/Exchange/test.fetchOpenOrders.js +36 -0
  207. package/js/test/Exchange/test.fetchOrderBook.js +25 -0
  208. package/js/test/Exchange/test.fetchOrderBooks.js +35 -0
  209. package/js/test/Exchange/test.fetchOrders.js +41 -0
  210. package/js/test/Exchange/test.fetchPositions.js +47 -0
  211. package/js/test/Exchange/test.fetchStatus.js +35 -0
  212. package/js/test/Exchange/test.fetchTicker.js +38 -0
  213. package/js/test/Exchange/test.fetchTickers.js +49 -0
  214. package/js/test/Exchange/test.fetchTrades.js +39 -0
  215. package/js/test/Exchange/test.fetchTradingFee.js +18 -0
  216. package/js/test/Exchange/test.fetchTradingFees.js +22 -0
  217. package/js/test/Exchange/test.fetchTransactions.js +31 -0
  218. package/js/test/Exchange/test.fetchWithdrawals.js +31 -0
  219. package/js/test/Exchange/test.ledgerItem.js +46 -0
  220. package/js/test/Exchange/test.leverageTier.js +33 -0
  221. package/js/test/Exchange/test.loadMarkets.js +35 -0
  222. package/js/test/Exchange/test.market.js +129 -0
  223. package/js/test/Exchange/test.ohlcv.js +33 -0
  224. package/js/test/Exchange/test.order.js +62 -0
  225. package/js/test/Exchange/test.orderbook.js +61 -0
  226. package/js/test/Exchange/test.position.js +21 -0
  227. package/js/test/Exchange/test.throttle.js +94 -0
  228. package/js/test/Exchange/test.ticker.js +95 -0
  229. package/js/test/Exchange/test.trade.js +68 -0
  230. package/js/test/Exchange/test.tradingFee.js +34 -0
  231. package/js/test/Exchange/test.transaction.js +35 -0
  232. package/js/test/base/.eslintrc +38 -0
  233. package/js/test/base/functions/test.crypto.js +110 -0
  234. package/js/test/base/functions/test.datetime.js +62 -0
  235. package/js/test/base/functions/test.generic.js +152 -0
  236. package/js/test/base/functions/test.number.js +362 -0
  237. package/js/test/base/functions/test.time.js +56 -0
  238. package/js/test/base/functions/test.type.js +53 -0
  239. package/js/test/base/test.base.js +193 -0
  240. package/js/test/errors/test.InsufficientFunds.js +86 -0
  241. package/js/test/errors/test.InvalidNonce.js +64 -0
  242. package/js/test/errors/test.InvalidOrder.js +35 -0
  243. package/js/test/errors/test.OrderNotFound.js +39 -0
  244. package/js/test/test.js +426 -0
  245. package/js/test/test.timeout_hang.js +12 -0
  246. package/js/therock.js +1431 -0
  247. package/js/tidebit.js +632 -0
  248. package/js/tidex.js +939 -0
  249. package/js/timex.js +1283 -0
  250. package/js/upbit.js +1622 -0
  251. package/js/vcc.js +1353 -0
  252. package/js/wavesexchange.js +2185 -0
  253. package/js/wazirx.js +732 -0
  254. package/js/whitebit.js +1352 -0
  255. package/js/woo.js +1577 -0
  256. package/js/xena.js +1948 -0
  257. package/js/yobit.js +1129 -0
  258. package/js/zaif.js +647 -0
  259. package/js/zb.js +4088 -0
  260. package/js/zipmex.js +40 -0
  261. package/js/zonda.js +1497 -0
  262. package/multilang.sh +159 -0
  263. package/package.json +591 -0
  264. package/postinstall.js +103 -0
package/js/mexc.js ADDED
@@ -0,0 +1,3151 @@
1
+ 'use strict';
2
+
3
+ // ---------------------------------------------------------------------------
4
+
5
+ const Exchange = require ('./base/Exchange');
6
+ const { AccountNotEnabled, InvalidAddress, ExchangeError, BadRequest, AuthenticationError, RateLimitExceeded, BadSymbol, InvalidOrder, InsufficientFunds, ArgumentsRequired, OrderNotFound, PermissionDenied, NotSupported } = require ('./base/errors');
7
+ const { TICK_SIZE } = require ('./base/functions/number');
8
+ const Precise = require ('./base/Precise');
9
+
10
+ // ---------------------------------------------------------------------------
11
+
12
+ module.exports = class mexc extends Exchange {
13
+ describe () {
14
+ return this.deepExtend (super.describe (), {
15
+ 'id': 'mexc',
16
+ 'name': 'MEXC Global',
17
+ 'countries': [ 'SC' ], // Seychelles
18
+ 'rateLimit': 50, // default rate limit is 20 times per second
19
+ 'version': 'v2',
20
+ 'certified': true,
21
+ 'has': {
22
+ 'CORS': undefined,
23
+ 'spot': true,
24
+ 'margin': undefined, // has but unimplemented
25
+ 'swap': true,
26
+ 'future': false,
27
+ 'option': false,
28
+ 'addMargin': true,
29
+ 'cancelAllOrders': true,
30
+ 'cancelOrder': true,
31
+ 'createMarketOrder': false,
32
+ 'createOrder': true,
33
+ 'createReduceOnlyOrder': false,
34
+ 'createStopLimitOrder': true,
35
+ 'createStopMarketOrder': false,
36
+ 'createStopOrder': true,
37
+ 'fetchBalance': true,
38
+ 'fetchCanceledOrders': true,
39
+ 'fetchClosedOrders': true,
40
+ 'fetchCurrencies': true,
41
+ 'fetchDepositAddress': true,
42
+ 'fetchDepositAddressesByNetwork': true,
43
+ 'fetchDeposits': true,
44
+ 'fetchFundingHistory': true,
45
+ 'fetchFundingRate': true,
46
+ 'fetchFundingRateHistory': true,
47
+ 'fetchFundingRates': false,
48
+ 'fetchIndexOHLCV': true,
49
+ 'fetchLeverage': undefined,
50
+ 'fetchLeverageTiers': true,
51
+ 'fetchMarketLeverageTiers': 'emulated',
52
+ 'fetchMarkets': true,
53
+ 'fetchMarkOHLCV': true,
54
+ 'fetchMyTrades': true,
55
+ 'fetchOHLCV': true,
56
+ 'fetchOpenOrders': true,
57
+ 'fetchOrder': true,
58
+ 'fetchOrderBook': true,
59
+ 'fetchOrderTrades': true,
60
+ 'fetchPosition': true,
61
+ 'fetchPositions': true,
62
+ 'fetchPositionsRisk': false,
63
+ 'fetchPremiumIndexOHLCV': true,
64
+ 'fetchStatus': true,
65
+ 'fetchTicker': true,
66
+ 'fetchTickers': true,
67
+ 'fetchTime': true,
68
+ 'fetchTrades': true,
69
+ 'fetchTradingFee': false,
70
+ 'fetchTradingFees': true,
71
+ 'fetchTransfer': true,
72
+ 'fetchTransfers': true,
73
+ 'fetchWithdrawals': true,
74
+ 'reduceMargin': true,
75
+ 'setLeverage': true,
76
+ 'setMarginMode': false,
77
+ 'transfer': true,
78
+ 'withdraw': true,
79
+ },
80
+ 'timeframes': {
81
+ '1m': '1m',
82
+ '5m': '5m',
83
+ '15m': '15m',
84
+ '30m': '30m',
85
+ '1h': '1h',
86
+ '1d': '1d',
87
+ '1w': '1w',
88
+ '1M': '1M',
89
+ },
90
+ 'urls': {
91
+ 'logo': 'https://user-images.githubusercontent.com/1294454/137283979-8b2a818d-8633-461b-bfca-de89e8c446b2.jpg',
92
+ 'api': {
93
+ 'spot': {
94
+ 'public': 'https://www.mexc.com/open/api/v2',
95
+ 'private': 'https://www.mexc.com/open/api/v2',
96
+ },
97
+ 'contract': {
98
+ 'public': 'https://contract.mexc.com/api/v1/contract',
99
+ 'private': 'https://contract.mexc.com/api/v1/private',
100
+ },
101
+ },
102
+ 'www': 'https://www.mexc.com/',
103
+ 'doc': [
104
+ 'https://mxcdevelop.github.io/APIDoc/',
105
+ ],
106
+ 'fees': [
107
+ 'https://www.mexc.com/fee',
108
+ ],
109
+ 'referral': 'https://m.mexc.com/auth/signup?inviteCode=1FQ1G',
110
+ },
111
+ 'api': {
112
+ 'contract': {
113
+ 'public': {
114
+ 'get': {
115
+ 'ping': 2,
116
+ 'detail': 2,
117
+ 'support_currencies': 2,
118
+ 'depth/{symbol}': 2,
119
+ 'depth_commits/{symbol}/{limit}': 2,
120
+ 'index_price/{symbol}': 2,
121
+ 'fair_price/{symbol}': 2,
122
+ 'funding_rate/{symbol}': 2,
123
+ 'kline/{symbol}': 2,
124
+ 'kline/index_price/{symbol}': 2,
125
+ 'kline/fair_price/{symbol}': 2,
126
+ 'deals/{symbol}': 2,
127
+ 'ticker': 2,
128
+ 'risk_reverse': 2,
129
+ 'risk_reverse/history': 2,
130
+ 'funding_rate/history': 2,
131
+ },
132
+ },
133
+ 'private': {
134
+ 'get': {
135
+ 'account/assets': 2,
136
+ 'account/asset/{currency}': 2,
137
+ 'account/transfer_record': 2,
138
+ 'position/list/history_positions': 2,
139
+ 'position/open_positions': 2,
140
+ 'position/funding_records': 2,
141
+ 'order/list/open_orders/{symbol}': 2,
142
+ 'order/list/history_orders': 2,
143
+ 'order/external/{symbol}/{external_oid}': 2,
144
+ 'order/get/{order_id}': 2,
145
+ 'order/batch_query': 8,
146
+ 'order/deal_details/{order_id}': 2,
147
+ 'order/list/order_deals': 2,
148
+ 'planorder/list/orders': 2,
149
+ 'stoporder/list/orders': 2,
150
+ 'stoporder/order_details/{stop_order_id}': 2,
151
+ 'account/risk_limit': 2,
152
+ 'account/tiered_fee_rate': 2,
153
+ },
154
+ 'post': {
155
+ 'position/change_margin': 2,
156
+ 'position/change_leverage': 2,
157
+ 'order/submit': 2,
158
+ 'order/submit_batch': 40,
159
+ 'order/cancel': 2,
160
+ 'order/cancel_with_external': 2,
161
+ 'order/cancel_all': 2,
162
+ 'account/change_risk_level': 2,
163
+ 'planorder/place': 2,
164
+ 'planorder/cancel': 2,
165
+ 'planorder/cancel_all': 2,
166
+ 'stoporder/cancel': 2,
167
+ 'stoporder/cancel_all': 2,
168
+ 'stoporder/change_price': 2,
169
+ 'stoporder/change_plan_price': 2,
170
+ },
171
+ },
172
+ },
173
+ 'spot': {
174
+ 'public': {
175
+ 'get': {
176
+ 'market/symbols': 1,
177
+ 'market/coin/list': 2,
178
+ 'common/timestamp': 1,
179
+ 'common/ping': 1,
180
+ 'market/ticker': 1,
181
+ 'market/depth': 1,
182
+ 'market/deals': 1,
183
+ 'market/kline': 1,
184
+ 'market/api_default_symbols': 2,
185
+ },
186
+ },
187
+ 'private': {
188
+ 'get': {
189
+ 'account/info': 1,
190
+ 'order/open_orders': 1,
191
+ 'order/list': 1,
192
+ 'order/query': 1,
193
+ 'order/deals': 1,
194
+ 'order/deal_detail': 1,
195
+ 'asset/deposit/address/list': 2,
196
+ 'asset/deposit/list': 2,
197
+ 'asset/address/list': 2,
198
+ 'asset/withdraw/list': 2,
199
+ 'asset/internal/transfer/record': 10,
200
+ 'account/balance': 10,
201
+ 'asset/internal/transfer/info': 10,
202
+ 'market/api_symbols': 2,
203
+ },
204
+ 'post': {
205
+ 'order/place': 1,
206
+ 'order/place_batch': 1,
207
+ 'asset/withdraw': 2,
208
+ 'asset/internal/transfer': 10,
209
+ },
210
+ 'delete': {
211
+ 'order/cancel': 1,
212
+ 'order/cancel_by_symbol': 1,
213
+ 'asset/withdraw': 2,
214
+ },
215
+ },
216
+ },
217
+ },
218
+ 'precisionMode': TICK_SIZE,
219
+ 'fees': {
220
+ 'trading': {
221
+ 'tierBased': false,
222
+ 'percentage': true,
223
+ 'maker': 0.2 / 100, // maker / taker
224
+ 'taker': 0.2 / 100,
225
+ },
226
+ },
227
+ 'options': {
228
+ 'timeframes': {
229
+ 'spot': {
230
+ '1m': '1m',
231
+ '5m': '5m',
232
+ '15m': '15m',
233
+ '30m': '30m',
234
+ '1h': '1h',
235
+ '1d': '1d',
236
+ '1M': '1M',
237
+ },
238
+ 'contract': {
239
+ '1m': 'Min1',
240
+ '5m': 'Min5',
241
+ '15m': 'Min15',
242
+ '30m': 'Min30',
243
+ '1h': 'Min60',
244
+ '4h': 'Hour4',
245
+ '8h': 'Hour8',
246
+ '1d': 'Day1',
247
+ '1w': 'Week1',
248
+ '1M': 'Month1',
249
+ },
250
+ },
251
+ 'defaultType': 'spot', // spot, swap
252
+ 'networks': {
253
+ 'TRX': 'TRC-20',
254
+ 'TRC20': 'TRC-20',
255
+ 'ETH': 'ERC-20',
256
+ 'ERC20': 'ERC-20',
257
+ 'BEP20': 'BEP20(BSC)',
258
+ },
259
+ 'accountsByType': {
260
+ 'spot': 'MAIN',
261
+ 'swap': 'CONTRACT',
262
+ },
263
+ 'transfer': {
264
+ 'accountsById': {
265
+ 'MAIN': 'spot',
266
+ 'CONTRACT': 'swap',
267
+ },
268
+ 'status': {
269
+ 'SUCCESS': 'ok',
270
+ 'FAILED': 'failed',
271
+ 'WAIT': 'pending',
272
+ },
273
+ },
274
+ 'fetchOrdersByState': {
275
+ 'method': 'spotPrivateGetOrderList', // contractPrivateGetPlanorderListOrders
276
+ },
277
+ 'cancelOrder': {
278
+ 'method': 'spotPrivateDeleteOrderCancel', // contractPrivatePostOrderCancel contractPrivatePostPlanorderCancel
279
+ },
280
+ },
281
+ 'commonCurrencies': {
282
+ 'BEYONDPROTOCOL': 'BEYOND',
283
+ 'BIFI': 'BIFIF',
284
+ 'BYN': 'BeyondFi',
285
+ 'COFI': 'COFIX', // conflict with CoinFi
286
+ 'DFI': 'DfiStarter',
287
+ 'DFT': 'dFuture',
288
+ 'DRK': 'DRK',
289
+ 'EGC': 'Egoras Credit',
290
+ 'FLUX1': 'FLUX', // switched places
291
+ 'FLUX': 'FLUX1', // switched places
292
+ 'FREE': 'FreeRossDAO', // conflict with FREE Coin
293
+ 'GMT': 'GMT Token',
294
+ 'HERO': 'Step Hero', // conflict with Metahero
295
+ 'MIMO': 'Mimosa',
296
+ 'PROS': 'Pros.Finance', // conflict with Prosper
297
+ 'SIN': 'Sin City Token',
298
+ 'STEPN': 'GMT',
299
+ },
300
+ 'exceptions': {
301
+ 'exact': {
302
+ '400': BadRequest, // Invalid parameter
303
+ '401': AuthenticationError, // Invalid signature, fail to pass the validation
304
+ '402': AuthenticationError, // {"success":false,"code":402,"message":"API key expired!"}
305
+ '403': PermissionDenied, // {"msg":"no permission to access the endpoint","code":403}
306
+ '429': RateLimitExceeded, // too many requests, rate limit rule is violated
307
+ '703': PermissionDenied, // Require trade read permission!
308
+ '1000': AccountNotEnabled, // {"success":false,"code":1000,"message":"Please open contract account first!"}
309
+ '1002': InvalidOrder, // {"success":false,"code":1002,"message":"Contract not allow place order!"}
310
+ '10072': AuthenticationError, // Invalid access key
311
+ '10073': AuthenticationError, // Invalid request time
312
+ '10075': PermissionDenied, // {"msg":"IP [xxx.xxx.xxx.xxx] not in the ip white list","code":10075}
313
+ '10101': InsufficientFunds, // {"code":10101,"msg":"Insufficient balance"}
314
+ '10216': InvalidAddress, // {"code":10216,"msg":"No available deposit address"}
315
+ '10232': BadSymbol, // {"code":10232,"msg":"The currency not exist"}
316
+ '30000': BadSymbol, // Trading is suspended for the requested symbol
317
+ '30001': InvalidOrder, // Current trading type (bid or ask) is not allowed
318
+ '30002': InvalidOrder, // Invalid trading amount, smaller than the symbol minimum trading amount
319
+ '30003': InvalidOrder, // Invalid trading amount, greater than the symbol maximum trading amount
320
+ '30004': InsufficientFunds, // Insufficient balance
321
+ '30005': InvalidOrder, // Oversell error
322
+ '30010': InvalidOrder, // Price out of allowed range
323
+ '30016': BadSymbol, // Market is closed
324
+ '30019': InvalidOrder, // Orders count over limit for batch processing
325
+ '30020': BadSymbol, // Restricted symbol, API access is not allowed for the time being
326
+ '30021': BadSymbol, // Invalid symbol
327
+ '33333': BadSymbol, // {"code":33333,"msg":"currency can not be null"}
328
+ },
329
+ 'broad': {
330
+ 'price and quantity must be positive': InvalidOrder, // {"msg":"price and quantity must be positive","code":400}
331
+ },
332
+ },
333
+ });
334
+ }
335
+
336
+ async fetchTime (params = {}) {
337
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('fetchTime', undefined, params);
338
+ const method = this.getSupportedMapping (marketType, {
339
+ 'spot': 'spotPublicGetCommonTimestamp',
340
+ 'swap': 'contractPublicGetPing',
341
+ });
342
+ const response = await this[method] (this.extend (query));
343
+ //
344
+ // spot
345
+ //
346
+ // {
347
+ // "code":200,
348
+ // "data":1633375641837
349
+ // }
350
+ //
351
+ // contract
352
+ //
353
+ // {
354
+ // "success":true,
355
+ // "code":0,
356
+ // "data":1634095541710
357
+ // }
358
+ //
359
+ return this.safeInteger (response, 'data');
360
+ }
361
+
362
+ async fetchStatus (params = {}) {
363
+ const response = await this.spotPublicGetCommonPing (params);
364
+ //
365
+ // { "code":200 }
366
+ //
367
+ const code = this.safeInteger (response, 'code');
368
+ const status = (code === 200) ? 'ok' : 'maintenance';
369
+ return {
370
+ 'status': status,
371
+ 'updated': this.milliseconds (),
372
+ 'eta': undefined,
373
+ 'url': undefined,
374
+ 'info': response,
375
+ };
376
+ }
377
+
378
+ async fetchCurrencies (params = {}) {
379
+ const response = await this.spotPublicGetMarketCoinList (params);
380
+ //
381
+ // {
382
+ // "code":200,
383
+ // "data":[
384
+ // {
385
+ // "currency":"AGLD",
386
+ // "coins":[
387
+ // {
388
+ // "chain":"ERC20",
389
+ // "precision":18,
390
+ // "fee":8.09,
391
+ // "is_withdraw_enabled":true,
392
+ // "is_deposit_enabled":true,
393
+ // "deposit_min_confirm":16,
394
+ // "withdraw_limit_max":500000.0,
395
+ // "withdraw_limit_min":14.0
396
+ // }
397
+ // ],
398
+ // "full_name":"Adventure Gold"
399
+ // },
400
+ // ]
401
+ // }
402
+ //
403
+ const data = this.safeValue (response, 'data', []);
404
+ const result = {};
405
+ for (let i = 0; i < data.length; i++) {
406
+ const currency = data[i];
407
+ const id = this.safeString (currency, 'currency');
408
+ const code = this.safeCurrencyCode (id);
409
+ const name = this.safeString (currency, 'full_name');
410
+ let currencyActive = false;
411
+ let currencyPrecision = undefined;
412
+ let currencyFee = undefined;
413
+ let currencyWithdrawMin = undefined;
414
+ let currencyWithdrawMax = undefined;
415
+ const networks = {};
416
+ const chains = this.safeValue (currency, 'coins', []);
417
+ let depositEnabled = false;
418
+ let withdrawEnabled = false;
419
+ for (let j = 0; j < chains.length; j++) {
420
+ const chain = chains[j];
421
+ const networkId = this.safeString (chain, 'chain');
422
+ const network = this.safeNetwork (networkId);
423
+ const isDepositEnabled = this.safeValue (chain, 'is_deposit_enabled', false);
424
+ const isWithdrawEnabled = this.safeValue (chain, 'is_withdraw_enabled', false);
425
+ const active = (isDepositEnabled && isWithdrawEnabled);
426
+ currencyActive = active || currencyActive;
427
+ const precisionDigits = this.safeInteger (chain, 'precision');
428
+ const precision = 1 / Math.pow (10, precisionDigits);
429
+ const withdrawMin = this.safeString (chain, 'withdraw_limit_min');
430
+ const withdrawMax = this.safeString (chain, 'withdraw_limit_max');
431
+ currencyWithdrawMin = (currencyWithdrawMin === undefined) ? withdrawMin : currencyWithdrawMin;
432
+ currencyWithdrawMax = (currencyWithdrawMax === undefined) ? withdrawMax : currencyWithdrawMax;
433
+ if (Precise.stringGt (currencyWithdrawMin, withdrawMin)) {
434
+ currencyWithdrawMin = withdrawMin;
435
+ }
436
+ if (Precise.stringLt (currencyWithdrawMax, withdrawMax)) {
437
+ currencyWithdrawMax = withdrawMax;
438
+ }
439
+ if (isDepositEnabled) {
440
+ depositEnabled = true;
441
+ }
442
+ if (isWithdrawEnabled) {
443
+ withdrawEnabled = true;
444
+ }
445
+ networks[network] = {
446
+ 'info': chain,
447
+ 'id': networkId,
448
+ 'network': network,
449
+ 'active': active,
450
+ 'deposit': isDepositEnabled,
451
+ 'withdraw': isWithdrawEnabled,
452
+ 'fee': this.safeNumber (chain, 'fee'),
453
+ 'precision': precision,
454
+ 'limits': {
455
+ 'withdraw': {
456
+ 'min': withdrawMin,
457
+ 'max': withdrawMax,
458
+ },
459
+ },
460
+ };
461
+ }
462
+ const networkKeys = Object.keys (networks);
463
+ const networkKeysLength = networkKeys.length;
464
+ if ((networkKeysLength === 1) || ('NONE' in networks)) {
465
+ const defaultNetwork = this.safeValue2 (networks, 'NONE', networkKeysLength - 1);
466
+ if (defaultNetwork !== undefined) {
467
+ currencyFee = defaultNetwork['fee'];
468
+ currencyPrecision = defaultNetwork['precision'];
469
+ }
470
+ }
471
+ result[code] = {
472
+ 'id': id,
473
+ 'code': code,
474
+ 'info': currency,
475
+ 'name': name,
476
+ 'active': currencyActive,
477
+ 'deposit': depositEnabled,
478
+ 'withdraw': withdrawEnabled,
479
+ 'fee': currencyFee,
480
+ 'precision': currencyPrecision,
481
+ 'limits': {
482
+ 'amount': {
483
+ 'min': undefined,
484
+ 'max': undefined,
485
+ },
486
+ 'withdraw': {
487
+ 'min': currencyWithdrawMin,
488
+ 'max': currencyWithdrawMax,
489
+ },
490
+ },
491
+ 'networks': networks,
492
+ };
493
+ }
494
+ return result;
495
+ }
496
+
497
+ async fetchMarkets (params = {}) {
498
+ const defaultType = this.safeString2 (this.options, 'fetchMarkets', 'defaultType', 'spot');
499
+ const type = this.safeString (params, 'type', defaultType);
500
+ const query = this.omit (params, 'type');
501
+ const spot = (type === 'spot');
502
+ const swap = (type === 'swap');
503
+ if (!spot && !swap) {
504
+ throw new ExchangeError (this.id + " does not support '" + type + "' type, set exchange.options['defaultType'] to 'spot', 'margin', 'delivery' or 'future'"); // eslint-disable-line quotes
505
+ }
506
+ if (spot) {
507
+ return await this.fetchSpotMarkets (query);
508
+ } else if (swap) {
509
+ return await this.fetchContractMarkets (query);
510
+ }
511
+ }
512
+
513
+ async fetchContractMarkets (params = {}) {
514
+ const response = await this.contractPublicGetDetail (params);
515
+ //
516
+ // {
517
+ // "success":true,
518
+ // "code":0,
519
+ // "data":[
520
+ // {
521
+ // "symbol":"BTC_USDT",
522
+ // "displayName":"BTC_USDT永续",
523
+ // "displayNameEn":"BTC_USDT SWAP",
524
+ // "positionOpenType":3,
525
+ // "baseCoin":"BTC",
526
+ // "quoteCoin":"USDT",
527
+ // "settleCoin":"USDT",
528
+ // "contractSize":0.0001,
529
+ // "minLeverage":1,
530
+ // "maxLeverage":125,
531
+ // "priceScale":2,
532
+ // "volScale":0,
533
+ // "amountScale":4,
534
+ // "priceUnit":0.5,
535
+ // "volUnit":1,
536
+ // "minVol":1,
537
+ // "maxVol":1000000,
538
+ // "bidLimitPriceRate":0.1,
539
+ // "askLimitPriceRate":0.1,
540
+ // "takerFeeRate":0.0006,
541
+ // "makerFeeRate":0.0002,
542
+ // "maintenanceMarginRate":0.004,
543
+ // "initialMarginRate":0.008,
544
+ // "riskBaseVol":10000,
545
+ // "riskIncrVol":200000,
546
+ // "riskIncrMmr":0.004,
547
+ // "riskIncrImr":0.004,
548
+ // "riskLevelLimit":5,
549
+ // "priceCoefficientVariation":0.1,
550
+ // "indexOrigin":["BINANCE","GATEIO","HUOBI","MXC"],
551
+ // "state":0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
552
+ // "isNew":false,
553
+ // "isHot":true,
554
+ // "isHidden":false
555
+ // },
556
+ // ]
557
+ // }
558
+ //
559
+ const data = this.safeValue (response, 'data', []);
560
+ const result = [];
561
+ for (let i = 0; i < data.length; i++) {
562
+ const market = data[i];
563
+ const id = this.safeString (market, 'symbol');
564
+ const baseId = this.safeString (market, 'baseCoin');
565
+ const quoteId = this.safeString (market, 'quoteCoin');
566
+ const settleId = this.safeString (market, 'settleCoin');
567
+ const base = this.safeCurrencyCode (baseId);
568
+ const quote = this.safeCurrencyCode (quoteId);
569
+ const settle = this.safeCurrencyCode (settleId);
570
+ const state = this.safeString (market, 'state');
571
+ result.push ({
572
+ 'id': id,
573
+ 'symbol': base + '/' + quote + ':' + settle,
574
+ 'base': base,
575
+ 'quote': quote,
576
+ 'settle': settle,
577
+ 'baseId': baseId,
578
+ 'quoteId': quoteId,
579
+ 'settleId': settleId,
580
+ 'type': 'swap',
581
+ 'spot': false,
582
+ 'margin': false,
583
+ 'swap': true,
584
+ 'future': false,
585
+ 'option': false,
586
+ 'active': (state === '0'),
587
+ 'contract': true,
588
+ 'linear': true,
589
+ 'inverse': false,
590
+ 'taker': this.safeNumber (market, 'takerFeeRate'),
591
+ 'maker': this.safeNumber (market, 'makerFeeRate'),
592
+ 'contractSize': this.safeNumber (market, 'contractSize'),
593
+ 'expiry': undefined,
594
+ 'expiryDatetime': undefined,
595
+ 'strike': undefined,
596
+ 'optionType': undefined,
597
+ 'precision': {
598
+ 'amount': this.safeNumber (market, 'volUnit'),
599
+ 'price': this.safeNumber (market, 'priceUnit'),
600
+ },
601
+ 'limits': {
602
+ 'leverage': {
603
+ 'min': this.safeNumber (market, 'minLeverage'),
604
+ 'max': this.safeNumber (market, 'maxLeverage'),
605
+ },
606
+ 'amount': {
607
+ 'min': this.safeNumber (market, 'minVol'),
608
+ 'max': this.safeNumber (market, 'maxVol'),
609
+ },
610
+ 'price': {
611
+ 'min': undefined,
612
+ 'max': undefined,
613
+ },
614
+ 'cost': {
615
+ 'min': undefined,
616
+ 'max': undefined,
617
+ },
618
+ },
619
+ 'info': market,
620
+ });
621
+ }
622
+ return result;
623
+ }
624
+
625
+ async fetchSpotMarkets (params = {}) {
626
+ const response = await this.spotPublicGetMarketSymbols (params);
627
+ //
628
+ // {
629
+ // "code":200,
630
+ // "data":[
631
+ // {
632
+ // "symbol":"DFD_USDT",
633
+ // "state":"ENABLED",
634
+ // "countDownMark":1,
635
+ // "vcoinName":"DFD",
636
+ // "vcoinStatus":1,
637
+ // "price_scale":4,
638
+ // "quantity_scale":2,
639
+ // "min_amount":"5", // not an amount = cost
640
+ // "max_amount":"5000000",
641
+ // "maker_fee_rate":"0.002",
642
+ // "taker_fee_rate":"0.002",
643
+ // "limited":true,
644
+ // "etf_mark":0,
645
+ // "symbol_partition":"ASSESS"
646
+ // },
647
+ // ]
648
+ // }
649
+ //
650
+ const data = this.safeValue (response, 'data', []);
651
+ const result = [];
652
+ for (let i = 0; i < data.length; i++) {
653
+ const market = data[i];
654
+ const id = this.safeString (market, 'symbol');
655
+ const [ baseId, quoteId ] = id.split ('_');
656
+ const base = this.safeCurrencyCode (baseId);
657
+ const quote = this.safeCurrencyCode (quoteId);
658
+ const priceScale = this.safeString (market, 'price_scale');
659
+ const quantityScale = this.safeString (market, 'quantity_scale');
660
+ const state = this.safeString (market, 'state');
661
+ result.push ({
662
+ 'id': id,
663
+ 'symbol': base + '/' + quote,
664
+ 'base': base,
665
+ 'quote': quote,
666
+ 'settle': undefined,
667
+ 'baseId': baseId,
668
+ 'quoteId': quoteId,
669
+ 'settleId': undefined,
670
+ 'type': 'spot',
671
+ 'spot': true,
672
+ 'margin': false,
673
+ 'swap': false,
674
+ 'future': false,
675
+ 'option': false,
676
+ 'active': (state === 'ENABLED'),
677
+ 'contract': false,
678
+ 'linear': undefined,
679
+ 'inverse': undefined,
680
+ 'taker': this.safeNumber (market, 'taker_fee_rate'),
681
+ 'maker': this.safeNumber (market, 'maker_fee_rate'),
682
+ 'contractSize': undefined,
683
+ 'expiry': undefined,
684
+ 'expiryDatetime': undefined,
685
+ 'strike': undefined,
686
+ 'optionType': undefined,
687
+ 'precision': {
688
+ 'amount': this.parseNumber (this.parsePrecision (quantityScale)),
689
+ 'price': this.parseNumber (this.parsePrecision (priceScale)),
690
+ },
691
+ 'limits': {
692
+ 'leverage': {
693
+ 'min': undefined,
694
+ 'max': undefined,
695
+ },
696
+ 'amount': {
697
+ 'min': undefined,
698
+ 'max': undefined,
699
+ },
700
+ 'price': {
701
+ 'min': undefined,
702
+ 'max': undefined,
703
+ },
704
+ 'cost': {
705
+ 'min': this.safeNumber (market, 'min_amount'),
706
+ 'max': this.safeNumber (market, 'max_amount'),
707
+ },
708
+ },
709
+ 'info': market,
710
+ });
711
+ }
712
+ return result;
713
+ }
714
+
715
+ async fetchTickers (symbols = undefined, params = {}) {
716
+ await this.loadMarkets ();
717
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('fetchTickers', undefined, params);
718
+ const method = this.getSupportedMapping (marketType, {
719
+ 'spot': 'spotPublicGetMarketTicker',
720
+ 'swap': 'contractPublicGetTicker',
721
+ });
722
+ const response = await this[method] (this.extend (query));
723
+ //
724
+ // {
725
+ // "success":true,
726
+ // "code":0,
727
+ // "data":[
728
+ // {
729
+ // "symbol":"NKN_USDT",
730
+ // "lastPrice":0.36199,
731
+ // "bid1":0.35908,
732
+ // "ask1":0.36277,
733
+ // "volume24":657754,
734
+ // "amount24":239024.53998,
735
+ // "holdVol":149969,
736
+ // "lower24Price":0.34957,
737
+ // "high24Price":0.37689,
738
+ // "riseFallRate":0.0117,
739
+ // "riseFallValue":0.00419,
740
+ // "indexPrice":0.36043,
741
+ // "fairPrice":0.36108,
742
+ // "fundingRate":0.000535,
743
+ // "maxBidPrice":0.43251,
744
+ // "minAskPrice":0.28834,
745
+ // "timestamp":1634163352075
746
+ // },
747
+ // ]
748
+ // }
749
+ //
750
+ const data = this.safeValue (response, 'data', []);
751
+ return this.parseTickers (data, symbols);
752
+ }
753
+
754
+ async fetchTicker (symbol, params = {}) {
755
+ await this.loadMarkets ();
756
+ const market = this.market (symbol);
757
+ const request = {
758
+ 'symbol': market['id'],
759
+ };
760
+ let method = undefined;
761
+ if (market['spot']) {
762
+ method = 'spotPublicGetMarketTicker';
763
+ } else if (market['swap']) {
764
+ method = 'contractPublicGetTicker';
765
+ }
766
+ const response = await this[method] (this.extend (request, params));
767
+ //
768
+ // spot
769
+ //
770
+ // {
771
+ // "code":200,
772
+ // "data":[
773
+ // {
774
+ // "symbol":"BTC_USDT",
775
+ // "volume":"880.821523",
776
+ // "high":"49496.95", // highest price over the past 24 hours
777
+ // "low":"46918.4", // lowest
778
+ // "bid":"49297.64", // current buying price == the best price you can sell for
779
+ // "ask":"49297.75", // current selling price == the best price you can buy for
780
+ // "open":"48764.9", // open price 24h ago
781
+ // "last":"49297.73", // last = close
782
+ // "time":1633378200000, // timestamp
783
+ // "change_rate":"0.0109265" // (last / open) - 1
784
+ // }
785
+ // ]
786
+ // }
787
+ //
788
+ // swap / contract
789
+ //
790
+ // {
791
+ // "success":true,
792
+ // "code":0,
793
+ // "data":{
794
+ // "symbol":"ETH_USDT",
795
+ // "lastPrice":3581.3,
796
+ // "bid1":3581.25,
797
+ // "ask1":3581.5,
798
+ // "volume24":4045530,
799
+ // "amount24":141331823.5755,
800
+ // "holdVol":5832946,
801
+ // "lower24Price":3413.4,
802
+ // "high24Price":3588.7,
803
+ // "riseFallRate":0.0275,
804
+ // "riseFallValue":95.95,
805
+ // "indexPrice":3580.7852,
806
+ // "fairPrice":3581.08,
807
+ // "fundingRate":0.000063,
808
+ // "maxBidPrice":3938.85,
809
+ // "minAskPrice":3222.7,
810
+ // "timestamp":1634162885016
811
+ // }
812
+ // }
813
+ //
814
+ if (market['spot']) {
815
+ const data = this.safeValue (response, 'data', []);
816
+ const ticker = this.safeValue (data, 0);
817
+ return this.parseTicker (ticker, market);
818
+ } else if (market['swap']) {
819
+ const data = this.safeValue (response, 'data', {});
820
+ return this.parseTicker (data, market);
821
+ }
822
+ }
823
+
824
+ parseTicker (ticker, market = undefined) {
825
+ //
826
+ // spot
827
+ //
828
+ // {
829
+ // "symbol":"BTC_USDT",
830
+ // "volume":"880.821523",
831
+ // "high":"49496.95",
832
+ // "low":"46918.4",
833
+ // "bid":"49297.64",
834
+ // "ask":"49297.75",
835
+ // "open":"48764.9",
836
+ // "last":"49297.73",
837
+ // "time":1633378200000,
838
+ // "change_rate":"0.0109265"
839
+ // }
840
+ //
841
+ // contract
842
+ //
843
+ // {
844
+ // "symbol":"ETH_USDT",
845
+ // "lastPrice":3581.3,
846
+ // "bid1":3581.25,
847
+ // "ask1":3581.5,
848
+ // "volume24":4045530,
849
+ // "amount24":141331823.5755,
850
+ // "holdVol":5832946,
851
+ // "lower24Price":3413.4,
852
+ // "high24Price":3588.7,
853
+ // "riseFallRate":0.0275,
854
+ // "riseFallValue":95.95,
855
+ // "indexPrice":3580.7852,
856
+ // "fairPrice":3581.08,
857
+ // "fundingRate":0.000063,
858
+ // "maxBidPrice":3938.85,
859
+ // "minAskPrice":3222.7,
860
+ // "timestamp":1634162885016
861
+ // }
862
+ //
863
+ const timestamp = this.safeInteger2 (ticker, 'time', 'timestamp');
864
+ const marketId = this.safeString (ticker, 'symbol');
865
+ const symbol = this.safeSymbol (marketId, market, '_');
866
+ const baseVolume = this.safeString2 (ticker, 'volume', 'volume24');
867
+ const quoteVolume = this.safeString (ticker, 'amount24');
868
+ const open = this.safeString (ticker, 'open');
869
+ const last = this.safeString2 (ticker, 'last', 'lastPrice');
870
+ const change = this.safeString (ticker, 'riseFallValue');
871
+ const riseFallRate = this.safeString (ticker, 'riseFallRate');
872
+ const percentage = Precise.stringAdd (riseFallRate, '1');
873
+ return this.safeTicker ({
874
+ 'symbol': symbol,
875
+ 'timestamp': timestamp,
876
+ 'datetime': this.iso8601 (timestamp),
877
+ 'high': this.safeString2 (ticker, 'high', 'high24Price'),
878
+ 'low': this.safeString2 (ticker, 'low', 'lower24Price'),
879
+ 'bid': this.safeString2 (ticker, 'bid', 'bid1'),
880
+ 'bidVolume': undefined,
881
+ 'ask': this.safeString2 (ticker, 'ask', 'ask1'),
882
+ 'askVolume': undefined,
883
+ 'vwap': undefined,
884
+ 'open': open,
885
+ 'close': last,
886
+ 'last': last,
887
+ 'previousClose': undefined,
888
+ 'change': change,
889
+ 'percentage': percentage,
890
+ 'average': undefined,
891
+ 'baseVolume': baseVolume,
892
+ 'quoteVolume': quoteVolume,
893
+ 'info': ticker,
894
+ }, market, false);
895
+ }
896
+
897
+ async fetchOrderBook (symbol, limit = undefined, params = {}) {
898
+ await this.loadMarkets ();
899
+ const market = this.market (symbol);
900
+ const request = {
901
+ 'symbol': market['id'],
902
+ };
903
+ let method = undefined;
904
+ if (market['spot']) {
905
+ method = 'spotPublicGetMarketDepth';
906
+ if (limit === undefined) {
907
+ limit = 100; // the spot api requires a limit
908
+ }
909
+ request['depth'] = limit;
910
+ } else if (market['swap']) {
911
+ method = 'contractPublicGetDepthSymbol';
912
+ if (limit !== undefined) {
913
+ request['limit'] = limit;
914
+ }
915
+ }
916
+ const response = await this[method] (this.extend (request, params));
917
+ //
918
+ // spot
919
+ //
920
+ // {
921
+ // "code":200,
922
+ // "data":{
923
+ // "asks":[
924
+ // {"price":"49060.56","quantity":"0.099842"},
925
+ // {"price":"49060.58","quantity":"0.016003"},
926
+ // {"price":"49060.6","quantity":"0.023677"}
927
+ // ],
928
+ // "bids":[
929
+ // {"price":"49060.45","quantity":"1.693009"},
930
+ // {"price":"49060.44","quantity":"0.000843"},
931
+ // {"price":"49059.98","quantity":"0.735"},
932
+ // ],
933
+ // "version":"202454074",
934
+ // }
935
+ // }
936
+ //
937
+ // swap / contract
938
+ //
939
+ // {
940
+ // "success":true,
941
+ // "code":0,
942
+ // "data":{
943
+ // "asks":[
944
+ // [3445.7,48379,1],
945
+ // [3445.75,34994,1],
946
+ // [3445.8,68634,2],
947
+ // ],
948
+ // "bids":[
949
+ // [3445.55,44081,1],
950
+ // [3445.5,24857,1],
951
+ // [3445.45,50272,1],
952
+ // ],
953
+ // "version":2827730444,
954
+ // "timestamp":1634117846232
955
+ // }
956
+ // }
957
+ //
958
+ const data = this.safeValue (response, 'data', {});
959
+ const priceKey = market['spot'] ? 'price' : 0;
960
+ const amountKey = market['spot'] ? 'quantity' : 1;
961
+ const timestamp = this.safeInteger (data, 'timestamp');
962
+ const orderbook = this.parseOrderBook (data, symbol, timestamp, 'bids', 'asks', priceKey, amountKey);
963
+ orderbook['nonce'] = this.safeInteger (data, 'version');
964
+ return orderbook;
965
+ }
966
+
967
+ async fetchTrades (symbol, since = undefined, limit = undefined, params = {}) {
968
+ await this.loadMarkets ();
969
+ const market = this.market (symbol);
970
+ const request = {
971
+ 'symbol': market['id'],
972
+ };
973
+ if (limit !== undefined) {
974
+ request['limit'] = limit; // default 100, max 100
975
+ }
976
+ let method = undefined;
977
+ if (market['spot']) {
978
+ method = 'spotPublicGetMarketDeals';
979
+ } else if (market['swap']) {
980
+ method = 'contractPublicGetDealsSymbol';
981
+ }
982
+ const response = await this[method] (this.extend (request, params));
983
+ //
984
+ // spot
985
+ //
986
+ // {
987
+ // "code":200,
988
+ // "data":[
989
+ // {"trade_time":1633381766725,"trade_price":"0.068981","trade_quantity":"0.005","trade_type":"BID"},
990
+ // {"trade_time":1633381732705,"trade_price":"0.068979","trade_quantity":"0.006","trade_type":"BID"},
991
+ // {"trade_time":1633381694604,"trade_price":"0.068975","trade_quantity":"0.011","trade_type":"ASK"},
992
+ // ]
993
+ // }
994
+ //
995
+ // swap / contract
996
+ //
997
+ // {
998
+ // "success":true,
999
+ // "code":0,
1000
+ // "data":[
1001
+ // {"p":3598.85,"v":52,"T":1,"O":2,"M":2,"t":1634169038038},
1002
+ // {"p":3599.2,"v":15,"T":2,"O":3,"M":1,"t":1634169035603},
1003
+ // {"p":3600.15,"v":229,"T":2,"O":1,"M":2,"t":1634169026354},
1004
+ // ]
1005
+ // }
1006
+ //
1007
+ const data = this.safeValue (response, 'data', []);
1008
+ return this.parseTrades (data, market, since, limit);
1009
+ }
1010
+
1011
+ parseTrade (trade, market = undefined) {
1012
+ //
1013
+ // public fetchTrades
1014
+ //
1015
+ // spot
1016
+ //
1017
+ // {
1018
+ // "trade_time":1633381766725,
1019
+ // "trade_price":"0.068981",
1020
+ // "trade_quantity":"0.005",
1021
+ // "trade_type":"BID"
1022
+ // }
1023
+ //
1024
+ // swap / contract
1025
+ //
1026
+ // {
1027
+ // "p":3598.85,
1028
+ // "v":52,
1029
+ // "T":1, // 1 buy, 2 sell
1030
+ // "O":2, // 1 opens a position, 2 does not open a position
1031
+ // "M":2, // self-trading, 1 yes, 2 no
1032
+ // "t":1634169038038
1033
+ // }
1034
+ //
1035
+ // private fetchMyTrades, fetchOrderTrades
1036
+ //
1037
+ // {
1038
+ // "id":"b160b8f072d9403e96289139d5544809",
1039
+ // "symbol":"USDC_USDT",
1040
+ // "quantity":"150",
1041
+ // "price":"0.9997",
1042
+ // "amount":"149.955",
1043
+ // "fee":"0.29991",
1044
+ // "trade_type":"ASK",
1045
+ // "order_id":"d798765285374222990bbd14decb86cd",
1046
+ // "is_taker":true,
1047
+ // "fee_currency":"USDT",
1048
+ // "create_time":1633984904000
1049
+ // }
1050
+ //
1051
+ let timestamp = this.safeInteger2 (trade, 'create_time', 'trade_time');
1052
+ timestamp = this.safeInteger (trade, 't', timestamp);
1053
+ const marketId = this.safeString (trade, 'symbol');
1054
+ market = this.safeMarket (marketId, market, '_');
1055
+ const symbol = market['symbol'];
1056
+ let priceString = this.safeString2 (trade, 'price', 'trade_price');
1057
+ priceString = this.safeString (trade, 'p', priceString);
1058
+ let amountString = this.safeString2 (trade, 'quantity', 'trade_quantity');
1059
+ amountString = this.safeString (trade, 'v', amountString);
1060
+ const costString = this.safeString (trade, 'amount');
1061
+ let side = this.safeString2 (trade, 'trade_type', 'T');
1062
+ if ((side === 'BID') || (side === '1')) {
1063
+ side = 'buy';
1064
+ } else if ((side === 'ASK') || (side === '2')) {
1065
+ side = 'sell';
1066
+ }
1067
+ let id = this.safeString2 (trade, 'id', 'trade_time');
1068
+ if (id === undefined) {
1069
+ id = this.safeString (trade, 't', id);
1070
+ if (id !== undefined) {
1071
+ id += '-' + market['id'] + '-' + amountString;
1072
+ }
1073
+ }
1074
+ const feeCostString = this.safeString (trade, 'fee');
1075
+ let fee = undefined;
1076
+ if (feeCostString !== undefined) {
1077
+ const feeCurrencyId = this.safeString (trade, 'fee_currency');
1078
+ const feeCurrencyCode = this.safeCurrencyCode (feeCurrencyId);
1079
+ fee = {
1080
+ 'cost': feeCostString,
1081
+ 'currency': feeCurrencyCode,
1082
+ };
1083
+ }
1084
+ const orderId = this.safeString (trade, 'order_id');
1085
+ const isTaker = this.safeValue (trade, 'is_taker', true);
1086
+ const takerOrMaker = isTaker ? 'taker' : 'maker';
1087
+ return this.safeTrade ({
1088
+ 'info': trade,
1089
+ 'id': id,
1090
+ 'order': orderId,
1091
+ 'timestamp': timestamp,
1092
+ 'datetime': this.iso8601 (timestamp),
1093
+ 'symbol': symbol,
1094
+ 'type': undefined,
1095
+ 'side': side,
1096
+ 'takerOrMaker': takerOrMaker,
1097
+ 'price': priceString,
1098
+ 'amount': amountString,
1099
+ 'cost': costString,
1100
+ 'fee': fee,
1101
+ }, market);
1102
+ }
1103
+
1104
+ async fetchTradingFees (params = {}) {
1105
+ await this.loadMarkets ();
1106
+ const response = await this.spotPublicGetMarketSymbols (params);
1107
+ //
1108
+ // {
1109
+ // "code":200,
1110
+ // "data":[
1111
+ // {
1112
+ // "symbol":"DFD_USDT",
1113
+ // "state":"ENABLED",
1114
+ // "countDownMark":1,
1115
+ // "vcoinName":"DFD",
1116
+ // "vcoinStatus":1,
1117
+ // "price_scale":4,
1118
+ // "quantity_scale":2,
1119
+ // "min_amount":"5", // not an amount = cost
1120
+ // "max_amount":"5000000",
1121
+ // "maker_fee_rate":"0.002",
1122
+ // "taker_fee_rate":"0.002",
1123
+ // "limited":true,
1124
+ // "etf_mark":0,
1125
+ // "symbol_partition":"ASSESS"
1126
+ // },
1127
+ // ...
1128
+ // ]
1129
+ // }
1130
+ //
1131
+ const data = this.safeValue (response, 'data', []);
1132
+ const result = {};
1133
+ for (let i = 0; i < data.length; i++) {
1134
+ const fee = data[i];
1135
+ const marketId = this.safeString (fee, 'symbol');
1136
+ const market = this.safeMarket (marketId, undefined, '_');
1137
+ const symbol = market['symbol'];
1138
+ result[symbol] = {
1139
+ 'info': fee,
1140
+ 'symbol': symbol,
1141
+ 'maker': this.safeNumber (fee, 'maker_fee_rate'),
1142
+ 'taker': this.safeNumber (fee, 'taker_fee_rate'),
1143
+ 'percentage': true,
1144
+ 'tierBased': false,
1145
+ };
1146
+ }
1147
+ return result;
1148
+ }
1149
+
1150
+ async fetchOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1151
+ await this.loadMarkets ();
1152
+ const market = this.market (symbol);
1153
+ const options = this.safeValue (this.options, 'timeframes', {});
1154
+ const timeframes = this.safeValue (options, market['type'], {});
1155
+ const timeframeValue = this.safeString (timeframes, timeframe);
1156
+ if (timeframeValue === undefined) {
1157
+ throw new NotSupported (this.id + ' fetchOHLCV() does not support ' + timeframe + ' timeframe for ' + market['type'] + ' markets');
1158
+ }
1159
+ const request = {
1160
+ 'symbol': market['id'],
1161
+ 'interval': timeframeValue,
1162
+ };
1163
+ let method = undefined;
1164
+ if (market['spot']) {
1165
+ method = 'spotPublicGetMarketKline';
1166
+ if (since !== undefined) {
1167
+ request['start_time'] = parseInt (since / 1000);
1168
+ }
1169
+ if (limit !== undefined) {
1170
+ request['limit'] = limit; // default 100
1171
+ }
1172
+ } else if (market['swap']) {
1173
+ method = 'contractPublicGetKlineSymbol';
1174
+ if (since !== undefined) {
1175
+ request['start'] = parseInt (since / 1000);
1176
+ }
1177
+ // request['end'] = this.seconds ();
1178
+ }
1179
+ const response = await this[method] (this.extend (request, params));
1180
+ //
1181
+ // spot
1182
+ //
1183
+ // {
1184
+ // "code":200,
1185
+ // "data":[
1186
+ // [1633377000,"49227.47","49186.21","49227.47","49169.48","0.5984809999999999","29434.259665989997"],
1187
+ // [1633377060,"49186.21","49187.03","49206.64","49169.18","0.3658478","17990.651234393"],
1188
+ // [1633377120,"49187.03","49227.2","49227.2","49174.4","0.0687651","3382.353190352"],
1189
+ // ],
1190
+ // }
1191
+ //
1192
+ // swap / contract
1193
+ //
1194
+ // {
1195
+ // "success":true,
1196
+ // "code":0,
1197
+ // "data":{
1198
+ // "time":[1634052300,1634052360,1634052420],
1199
+ // "open":[3492.2,3491.3,3495.65],
1200
+ // "close":[3491.3,3495.65,3495.2],
1201
+ // "high":[3495.85,3496.55,3499.4],
1202
+ // "low":[3491.15,3490.9,3494.2],
1203
+ // "vol":[1740.0,351.0,314.0],
1204
+ // "amount":[60793.623,12260.4885,10983.1375],
1205
+ // }
1206
+ // }
1207
+ //
1208
+ if (market['spot']) {
1209
+ const data = this.safeValue (response, 'data', []);
1210
+ return this.parseOHLCVs (data, market, timeframe, since, limit);
1211
+ } else if (market['swap']) {
1212
+ const data = this.safeValue (response, 'data', {});
1213
+ const result = this.convertTradingViewToOHLCV (data, 'time', 'open', 'high', 'low', 'close', 'vol');
1214
+ return this.parseOHLCVs (result, market, timeframe, since, limit);
1215
+ }
1216
+ }
1217
+
1218
+ parseOHLCV (ohlcv, market = undefined) {
1219
+ //
1220
+ // the ordering in spot candles is OCHLV
1221
+ //
1222
+ // [
1223
+ // 1633377000, // 0 timestamp (unix seconds)
1224
+ // "49227.47", // 1 open price
1225
+ // "49186.21", // 2 closing price
1226
+ // "49227.47", // 3 high
1227
+ // "49169.48", // 4 low
1228
+ // "0.5984809999999999", // 5 base volume
1229
+ // "29434.259665989997", // 6 quote volume
1230
+ // ]
1231
+ //
1232
+ // the ordering in swap / contract candles is OHLCV
1233
+ //
1234
+ return [
1235
+ this.safeTimestamp (ohlcv, 0),
1236
+ this.safeNumber (ohlcv, 1),
1237
+ this.safeNumber (ohlcv, market['spot'] ? 3 : 2),
1238
+ this.safeNumber (ohlcv, market['spot'] ? 4 : 3),
1239
+ this.safeNumber (ohlcv, market['spot'] ? 2 : 4),
1240
+ this.safeNumber (ohlcv, 5),
1241
+ ];
1242
+ }
1243
+
1244
+ async fetchPremiumIndexOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1245
+ const request = {
1246
+ 'price': 'premiumIndex',
1247
+ };
1248
+ return await this.fetchOHLCV (symbol, timeframe, since, limit, this.extend (request, params));
1249
+ }
1250
+
1251
+ async fetchIndexOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1252
+ const request = {
1253
+ 'price': 'index',
1254
+ };
1255
+ return await this.fetchOHLCV (symbol, timeframe, since, limit, this.extend (request, params));
1256
+ }
1257
+
1258
+ async fetchMarkOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1259
+ const request = {
1260
+ 'price': 'mark',
1261
+ };
1262
+ return await this.fetchOHLCV (symbol, timeframe, since, limit, this.extend (request, params));
1263
+ }
1264
+
1265
+ async fetchBalance (params = {}) {
1266
+ await this.loadMarkets ();
1267
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('fetchBalance', undefined, params);
1268
+ const method = this.getSupportedMapping (marketType, {
1269
+ 'spot': 'spotPrivateGetAccountInfo',
1270
+ 'margin': 'spotPrivateGetAccountInfo',
1271
+ 'swap': 'contractPrivateGetAccountAssets',
1272
+ });
1273
+ const spot = (marketType === 'spot');
1274
+ const response = await this[method] (query);
1275
+ //
1276
+ // spot
1277
+ //
1278
+ // {
1279
+ // code: "200",
1280
+ // data: {
1281
+ // USDC: { frozen: "0", available: "150" }
1282
+ // }
1283
+ // }
1284
+ //
1285
+ // swap / contract
1286
+ //
1287
+ // {
1288
+ // "success":true,
1289
+ // "code":0,
1290
+ // "data":[
1291
+ // {"currency":"BSV","positionMargin":0,"availableBalance":0,"cashBalance":0,"frozenBalance":0,"equity":0,"unrealized":0,"bonus":0},
1292
+ // {"currency":"BCH","positionMargin":0,"availableBalance":0,"cashBalance":0,"frozenBalance":0,"equity":0,"unrealized":0,"bonus":0},
1293
+ // {"currency":"CRV","positionMargin":0,"availableBalance":0,"cashBalance":0,"frozenBalance":0,"equity":0,"unrealized":0,"bonus":0},
1294
+ // ]
1295
+ // }
1296
+ //
1297
+ const data = this.safeValue (response, 'data', {});
1298
+ const currentTime = this.milliseconds ();
1299
+ const result = {
1300
+ 'info': response,
1301
+ 'timestamp': currentTime,
1302
+ 'datetime': this.iso8601 (currentTime),
1303
+ };
1304
+ if (spot) {
1305
+ const currencyIds = Object.keys (data);
1306
+ for (let i = 0; i < currencyIds.length; i++) {
1307
+ const currencyId = currencyIds[i];
1308
+ const code = this.safeCurrencyCode (currencyId);
1309
+ const balance = this.safeValue (data, currencyId, {});
1310
+ const account = this.account ();
1311
+ account['free'] = this.safeString (balance, 'available');
1312
+ account['used'] = this.safeString (balance, 'frozen');
1313
+ result[code] = account;
1314
+ }
1315
+ } else {
1316
+ for (let i = 0; i < data.length; i++) {
1317
+ const balance = data[i];
1318
+ const currencyId = this.safeString (balance, 'currency');
1319
+ const code = this.safeCurrencyCode (currencyId);
1320
+ const account = this.account ();
1321
+ account['free'] = this.safeString (balance, 'availableBalance');
1322
+ account['used'] = this.safeString (balance, 'frozenBalance');
1323
+ result[code] = account;
1324
+ }
1325
+ }
1326
+ return this.safeBalance (result);
1327
+ }
1328
+
1329
+ safeNetwork (networkId) {
1330
+ if (networkId.indexOf ('BSC') >= 0) {
1331
+ return 'BEP20';
1332
+ }
1333
+ const parts = networkId.split (' ');
1334
+ networkId = parts.join ('');
1335
+ networkId = networkId.replace ('-20', '20');
1336
+ const networksById = {
1337
+ 'ETH': 'ETH',
1338
+ 'ERC20': 'ERC20',
1339
+ 'BEP20(BSC)': 'BEP20',
1340
+ 'TRX': 'TRC20',
1341
+ };
1342
+ return this.safeString (networksById, networkId, networkId);
1343
+ }
1344
+
1345
+ parseDepositAddress (depositAddress, currency = undefined) {
1346
+ //
1347
+ // {"chain":"ERC-20","address":"0x55cbd73db24eafcca97369e3f2db74b2490586e6"},
1348
+ // {"chain":"MATIC","address":"0x05aa3236f1970eae0f8feb17ec19435b39574d74"},
1349
+ // {"chain":"TRC20","address":"TGaPfhW41EXD3sAfs1grLF6DKfugfqANNw"},
1350
+ // {"chain":"SOL","address":"5FSpUKuh2gjw4mF89T2e7sEjzUA1SkRKjBChFqP43KhV"},
1351
+ // {"chain":"ALGO","address":"B3XTZND2JJTSYR7R2TQVCUDT4QSSYVAIZYDPWVBX34DGAYATBU3AUV43VU"}
1352
+ //
1353
+ //
1354
+ const address = this.safeString (depositAddress, 'address');
1355
+ const code = this.safeCurrencyCode (undefined, currency);
1356
+ const networkId = this.safeString (depositAddress, 'chain');
1357
+ const network = this.safeNetwork (networkId);
1358
+ this.checkAddress (address);
1359
+ return {
1360
+ 'currency': code,
1361
+ 'address': address,
1362
+ 'tag': undefined,
1363
+ 'network': network,
1364
+ 'info': depositAddress,
1365
+ };
1366
+ }
1367
+
1368
+ async fetchDepositAddressesByNetwork (code, params = {}) {
1369
+ await this.loadMarkets ();
1370
+ const currency = this.currency (code);
1371
+ const request = {
1372
+ 'currency': currency['id'],
1373
+ };
1374
+ const response = await this.spotPrivateGetAssetDepositAddressList (this.extend (request, params));
1375
+ //
1376
+ // {
1377
+ // "code":200,
1378
+ // "data":{
1379
+ // "currency":"USDC",
1380
+ // "chains":[
1381
+ // {"chain":"ERC-20","address":"0x55cbd73db24eafcca97369e3f2db74b2490586e6"},
1382
+ // {"chain":"MATIC","address":"0x05aa3236f1970eae0f8feb17ec19435b39574d74"},
1383
+ // {"chain":"TRC20","address":"TGaPfhW41EXD3sAfs1grLF6DKfugfqANNw"},
1384
+ // {"chain":"SOL","address":"5FSpUKuh2gjw4mF89T2e7sEjzUA1SkRKjBChFqP43KhV"},
1385
+ // {"chain":"ALGO","address":"B3XTZND2JJTSYR7R2TQVCUDT4QSSYVAIZYDPWVBX34DGAYATBU3AUV43VU"}
1386
+ // ]
1387
+ // }
1388
+ // }
1389
+ //
1390
+ const data = this.safeValue (response, 'data', {});
1391
+ const chains = this.safeValue (data, 'chains', []);
1392
+ const depositAddresses = [];
1393
+ for (let i = 0; i < chains.length; i++) {
1394
+ const depositAddress = this.parseDepositAddress (chains[i], currency);
1395
+ depositAddresses.push (depositAddress);
1396
+ }
1397
+ return this.indexBy (depositAddresses, 'network');
1398
+ }
1399
+
1400
+ async fetchDepositAddress (code, params = {}) {
1401
+ const rawNetwork = this.safeStringUpper (params, 'network');
1402
+ params = this.omit (params, 'network');
1403
+ const response = await this.fetchDepositAddressesByNetwork (code, params);
1404
+ const networks = this.safeValue (this.options, 'networks', {});
1405
+ const network = this.safeString (networks, rawNetwork, rawNetwork);
1406
+ let result = undefined;
1407
+ if (network === undefined) {
1408
+ result = this.safeValue (response, code);
1409
+ if (result === undefined) {
1410
+ const alias = this.safeString (networks, code, code);
1411
+ result = this.safeValue (response, alias);
1412
+ if (result === undefined) {
1413
+ const defaultNetwork = this.safeString (this.options, 'defaultNetwork', 'ERC20');
1414
+ result = this.safeValue (response, defaultNetwork);
1415
+ if (result === undefined) {
1416
+ const values = Object.values (response);
1417
+ result = this.safeValue (values, 0);
1418
+ if (result === undefined) {
1419
+ throw new InvalidAddress (this.id + ' fetchDepositAddress() cannot find deposit address for ' + code);
1420
+ }
1421
+ }
1422
+ }
1423
+ }
1424
+ return result;
1425
+ }
1426
+ // TODO: add support for all aliases here
1427
+ result = this.safeValue (response, rawNetwork);
1428
+ if (result === undefined) {
1429
+ throw new InvalidAddress (this.id + ' fetchDepositAddress() cannot find ' + network + ' deposit address for ' + code);
1430
+ }
1431
+ return result;
1432
+ }
1433
+
1434
+ async fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {}) {
1435
+ await this.loadMarkets ();
1436
+ const request = {
1437
+ // 'currency': currency['id'],
1438
+ // 'state': 'state',
1439
+ // 'start_time': since, // default 1 day
1440
+ // 'end_time': this.milliseconds (),
1441
+ // 'page_num': 1,
1442
+ // 'page_size': limit, // default 20, maximum 50
1443
+ };
1444
+ let currency = undefined;
1445
+ if (code !== undefined) {
1446
+ currency = this.currency (code);
1447
+ request['currency'] = currency['id'];
1448
+ }
1449
+ if (since !== undefined) {
1450
+ request['start_time'] = since;
1451
+ }
1452
+ if (limit !== undefined) {
1453
+ request['limit'] = limit;
1454
+ }
1455
+ const response = await this.spotPrivateGetAssetDepositList (this.extend (request, params));
1456
+ //
1457
+ // {
1458
+ // "code":200,
1459
+ // "data":{
1460
+ // "page_size":20,
1461
+ // "total_page":1,
1462
+ // "total_size":1,
1463
+ // "page_num":1,
1464
+ // "result_list":[
1465
+ // {
1466
+ // "currency":"USDC",
1467
+ // "amount":150.0,
1468
+ // "fee":0.0,
1469
+ // "confirmations":19,
1470
+ // "address":"0x55cbd73db24eafcca97369e3f2db74b2490586e6",
1471
+ // "state":"SUCCESS",
1472
+ // "tx_id":"0xc65a9b09e1b71def81bf8bb3ec724c0c1b2b4c82200c8c142e4ea4c1469fd789:0",
1473
+ // "require_confirmations":12,
1474
+ // "create_time":"2021-10-11T18:58:25.000+00:00",
1475
+ // "update_time":"2021-10-11T19:01:06.000+00:00"
1476
+ // }
1477
+ // ]
1478
+ // }
1479
+ // }
1480
+ //
1481
+ const data = this.safeValue (response, 'data', {});
1482
+ const resultList = this.safeValue (data, 'result_list', []);
1483
+ return this.parseTransactions (resultList, code, since, limit);
1484
+ }
1485
+
1486
+ async fetchWithdrawals (code = undefined, since = undefined, limit = undefined, params = {}) {
1487
+ await this.loadMarkets ();
1488
+ const request = {
1489
+ // 'withdrawal_id': '4b450616042a48c99dd45cacb4b092a7', // string
1490
+ // 'currency': currency['id'],
1491
+ // 'state': 'state',
1492
+ // 'start_time': since, // default 1 day
1493
+ // 'end_time': this.milliseconds (),
1494
+ // 'page_num': 1,
1495
+ // 'page_size': limit, // default 20, maximum 50
1496
+ };
1497
+ let currency = undefined;
1498
+ if (code !== undefined) {
1499
+ currency = this.currency (code);
1500
+ request['currency'] = currency['id'];
1501
+ }
1502
+ if (since !== undefined) {
1503
+ request['start_time'] = since;
1504
+ }
1505
+ if (limit !== undefined) {
1506
+ request['limit'] = limit;
1507
+ }
1508
+ const response = await this.spotPrivateGetAssetWithdrawList (this.extend (request, params));
1509
+ //
1510
+ // {
1511
+ // "code":200,
1512
+ // "data":{
1513
+ // "page_size":20,
1514
+ // "total_page":1,
1515
+ // "total_size":1,
1516
+ // "page_num":1,
1517
+ // "result_list":[
1518
+ // {
1519
+ // "id":"4b450616042a48c99dd45cacb4b092a7",
1520
+ // "currency":"USDT-TRX",
1521
+ // "address":"TRHKnx74Gb8UVcpDCMwzZVe4NqXfkdtPak",
1522
+ // "amount":30.0,
1523
+ // "fee":1.0,
1524
+ // "remark":"this is my first withdrawal remark",
1525
+ // "state":"WAIT",
1526
+ // "create_time":"2021-10-11T20:45:08.000+00:00"
1527
+ // }
1528
+ // ]
1529
+ // }
1530
+ // }
1531
+ //
1532
+ const data = this.safeValue (response, 'data', {});
1533
+ const resultList = this.safeValue (data, 'result_list', []);
1534
+ return this.parseTransactions (resultList, code, since, limit);
1535
+ }
1536
+
1537
+ parseTransaction (transaction, currency = undefined) {
1538
+ //
1539
+ // fetchDeposits
1540
+ //
1541
+ // {
1542
+ // "currency":"USDC",
1543
+ // "amount":150.0,
1544
+ // "fee":0.0,
1545
+ // "confirmations":19,
1546
+ // "address":"0x55cbd73db24eafcca97369e3f2db74b2490586e6",
1547
+ // "state":"SUCCESS",
1548
+ // "tx_id":"0xc65a9b09e1b71def81bf8bb3ec724c0c1b2b4c82200c8c142e4ea4c1469fd789:0",
1549
+ // "require_confirmations":12,
1550
+ // "create_time":"2021-10-11T18:58:25.000+00:00",
1551
+ // "update_time":"2021-10-11T19:01:06.000+00:00"
1552
+ // }
1553
+ //
1554
+ // fetchWithdrawals
1555
+ //
1556
+ // {
1557
+ // "id":"4b450616042a48c99dd45cacb4b092a7",
1558
+ // "currency":"USDT-TRX",
1559
+ // "address":"TRHKnx74Gb8UVcpDCMwzZVe4NqXfkdtPak",
1560
+ // "amount":30.0,
1561
+ // "fee":1.0,
1562
+ // "remark":"this is my first withdrawal remark",
1563
+ // "state":"WAIT",
1564
+ // "create_time":"2021-10-11T20:45:08.000+00:00"
1565
+ // }
1566
+ //
1567
+ const id = this.safeString (transaction, 'id');
1568
+ const type = (id === undefined) ? 'deposit' : 'withdrawal';
1569
+ const timestamp = this.parse8601 (this.safeString (transaction, 'create_time'));
1570
+ const updated = this.parse8601 (this.safeString (transaction, 'update_time'));
1571
+ let currencyId = this.safeString (transaction, 'currency');
1572
+ let network = undefined;
1573
+ if ((currencyId !== undefined) && (currencyId.indexOf ('-') >= 0)) {
1574
+ const parts = currencyId.split ('-');
1575
+ currencyId = this.safeString (parts, 0);
1576
+ const networkId = this.safeString (parts, 1);
1577
+ network = this.safeNetwork (networkId);
1578
+ }
1579
+ const code = this.safeCurrencyCode (currencyId, currency);
1580
+ const status = this.parseTransactionStatus (this.safeString (transaction, 'state'));
1581
+ let amountString = this.safeString (transaction, 'amount');
1582
+ const address = this.safeString (transaction, 'address');
1583
+ const txid = this.safeString (transaction, 'tx_id');
1584
+ let fee = undefined;
1585
+ const feeCostString = this.safeString (transaction, 'fee');
1586
+ if (feeCostString !== undefined) {
1587
+ fee = {
1588
+ 'cost': this.parseNumber (feeCostString),
1589
+ 'currency': code,
1590
+ };
1591
+ }
1592
+ if (type === 'withdrawal') {
1593
+ // mexc withdrawal amount includes the fee
1594
+ amountString = Precise.stringSub (amountString, feeCostString);
1595
+ }
1596
+ return {
1597
+ 'info': transaction,
1598
+ 'id': id,
1599
+ 'txid': txid,
1600
+ 'timestamp': timestamp,
1601
+ 'datetime': this.iso8601 (timestamp),
1602
+ 'network': network,
1603
+ 'address': address,
1604
+ 'addressTo': undefined,
1605
+ 'addressFrom': undefined,
1606
+ 'tag': undefined,
1607
+ 'tagTo': undefined,
1608
+ 'tagFrom': undefined,
1609
+ 'type': type,
1610
+ 'amount': this.parseNumber (amountString),
1611
+ 'currency': code,
1612
+ 'status': status,
1613
+ 'updated': updated,
1614
+ 'fee': fee,
1615
+ };
1616
+ }
1617
+
1618
+ parseTransactionStatus (status) {
1619
+ const statuses = {
1620
+ 'WAIT': 'pending',
1621
+ 'WAIT_PACKAGING': 'pending',
1622
+ 'SUCCESS': 'ok',
1623
+ };
1624
+ return this.safeString (statuses, status, status);
1625
+ }
1626
+
1627
+ async fetchPosition (symbol, params = {}) {
1628
+ await this.loadMarkets ();
1629
+ const market = this.market (symbol);
1630
+ const request = {
1631
+ 'symbol': market['id'],
1632
+ };
1633
+ const response = await this.fetchPositions (this.extend (request, params));
1634
+ const firstPosition = this.safeValue (response, 0);
1635
+ return this.parsePosition (firstPosition, market);
1636
+ }
1637
+
1638
+ async fetchPositions (symbols = undefined, params = {}) {
1639
+ await this.loadMarkets ();
1640
+ const response = await this.contractPrivateGetPositionOpenPositions (params);
1641
+ //
1642
+ // {
1643
+ // "success": true,
1644
+ // "code": 0,
1645
+ // "data": [
1646
+ // {
1647
+ // "positionId": 1394650,
1648
+ // "symbol": "ETH_USDT",
1649
+ // "positionType": 1,
1650
+ // "openType": 1,
1651
+ // "state": 1,
1652
+ // "holdVol": 1,
1653
+ // "frozenVol": 0,
1654
+ // "closeVol": 0,
1655
+ // "holdAvgPrice": 1217.3,
1656
+ // "openAvgPrice": 1217.3,
1657
+ // "closeAvgPrice": 0,
1658
+ // "liquidatePrice": 1211.2,
1659
+ // "oim": 0.1290338,
1660
+ // "im": 0.1290338,
1661
+ // "holdFee": 0,
1662
+ // "realised": -0.0073,
1663
+ // "leverage": 100,
1664
+ // "createTime": 1609991676000,
1665
+ // "updateTime": 1609991676000,
1666
+ // "autoAddIm": false
1667
+ // }
1668
+ // ]
1669
+ // }
1670
+ //
1671
+ const data = this.safeValue (response, 'data', []);
1672
+ return this.parsePositions (data);
1673
+ }
1674
+
1675
+ parsePosition (position, market = undefined) {
1676
+ //
1677
+ // {
1678
+ // "positionId": 1394650,
1679
+ // "symbol": "ETH_USDT",
1680
+ // "positionType": 1,
1681
+ // "openType": 1,
1682
+ // "state": 1,
1683
+ // "holdVol": 1,
1684
+ // "frozenVol": 0,
1685
+ // "closeVol": 0,
1686
+ // "holdAvgPrice": 1217.3,
1687
+ // "openAvgPrice": 1217.3,
1688
+ // "closeAvgPrice": 0,
1689
+ // "liquidatePrice": 1211.2,
1690
+ // "oim": 0.1290338,
1691
+ // "im": 0.1290338,
1692
+ // "holdFee": 0,
1693
+ // "realised": -0.0073,
1694
+ // "leverage": 100,
1695
+ // "createTime": 1609991676000,
1696
+ // "updateTime": 1609991676000,
1697
+ // "autoAddIm": false
1698
+ // }
1699
+ //
1700
+ market = this.safeMarket (this.safeString (position, 'symbol'), market);
1701
+ const symbol = market['symbol'];
1702
+ const contracts = this.safeString (position, 'holdVol');
1703
+ const entryPrice = this.safeNumber (position, 'openAvgPrice');
1704
+ const initialMargin = this.safeString (position, 'im');
1705
+ const rawSide = this.safeString (position, 'positionType');
1706
+ const side = (rawSide === '1') ? 'long' : 'short';
1707
+ const openType = this.safeString (position, 'margin_mode');
1708
+ const marginType = (openType === '1') ? 'isolated' : 'cross';
1709
+ const leverage = this.safeString (position, 'leverage');
1710
+ const liquidationPrice = this.safeNumber (position, 'liquidatePrice');
1711
+ const timestamp = this.safeNumber (position, 'updateTime');
1712
+ return {
1713
+ 'info': position,
1714
+ 'symbol': symbol,
1715
+ 'contracts': this.parseNumber (contracts),
1716
+ 'contractSize': undefined,
1717
+ 'entryPrice': entryPrice,
1718
+ 'collateral': undefined,
1719
+ 'side': side,
1720
+ 'unrealizedProfit': undefined,
1721
+ 'leverage': this.parseNumber (leverage),
1722
+ 'percentage': undefined,
1723
+ 'marginType': marginType,
1724
+ 'notional': undefined,
1725
+ 'markPrice': undefined,
1726
+ 'liquidationPrice': liquidationPrice,
1727
+ 'initialMargin': this.parseNumber (initialMargin),
1728
+ 'initialMarginPercentage': undefined,
1729
+ 'maintenanceMargin': undefined,
1730
+ 'maintenanceMarginPercentage': undefined,
1731
+ 'marginRatio': undefined,
1732
+ 'timestamp': timestamp,
1733
+ 'datetime': this.iso8601 (timestamp),
1734
+ };
1735
+ }
1736
+
1737
+ parsePositions (positions) {
1738
+ const result = [];
1739
+ for (let i = 0; i < positions.length; i++) {
1740
+ result.push (this.parsePosition (positions[i]));
1741
+ }
1742
+ return result;
1743
+ }
1744
+
1745
+ async createOrder (symbol, type, side, amount, price = undefined, params = {}) {
1746
+ await this.loadMarkets ();
1747
+ const market = this.market (symbol);
1748
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('createOrder', market, params);
1749
+ if (marketType === 'spot') {
1750
+ return await this.createSpotOrder (symbol, type, side, amount, price, query);
1751
+ } else if (marketType === 'swap') {
1752
+ return await this.createSwapOrder (symbol, type, side, amount, price, query);
1753
+ }
1754
+ }
1755
+
1756
+ async createSpotOrder (symbol, type, side, amount, price = undefined, params = {}) {
1757
+ await this.loadMarkets ();
1758
+ const market = this.market (symbol);
1759
+ let orderSide = undefined;
1760
+ if (side === 'buy') {
1761
+ orderSide = 'BID';
1762
+ } else if (side === 'sell') {
1763
+ orderSide = 'ASK';
1764
+ }
1765
+ let orderType = type.toUpperCase ();
1766
+ const postOnly = this.safeValue (params, 'postOnly', false);
1767
+ if (postOnly) {
1768
+ orderType = 'POST_ONLY';
1769
+ } else if (orderType === 'LIMIT') {
1770
+ orderType = 'LIMIT_ORDER';
1771
+ } else if ((orderType !== 'POST_ONLY') && (orderType !== 'IMMEDIATE_OR_CANCEL')) {
1772
+ throw new InvalidOrder (this.id + ' createOrder() does not support ' + type + ' order type, specify one of LIMIT, LIMIT_ORDER, POST_ONLY or IMMEDIATE_OR_CANCEL');
1773
+ }
1774
+ const request = {
1775
+ 'symbol': market['id'],
1776
+ 'price': this.priceToPrecision (symbol, price),
1777
+ 'quantity': this.amountToPrecision (symbol, amount),
1778
+ 'trade_type': orderSide,
1779
+ 'order_type': orderType, // LIMIT_ORDER,POST_ONLY,IMMEDIATE_OR_CANCEL
1780
+ };
1781
+ const clientOrderId = this.safeString2 (params, 'clientOrderId', 'client_order_id');
1782
+ if (clientOrderId !== undefined) {
1783
+ request['client_order_id'] = clientOrderId;
1784
+ }
1785
+ params = this.omit (params, [ 'type', 'clientOrderId', 'client_order_id', 'postOnly' ]);
1786
+ const response = await this.spotPrivatePostOrderPlace (this.extend (request, params));
1787
+ //
1788
+ // {"code":200,"data":"2ff3163e8617443cb9c6fc19d42b1ca4"}
1789
+ //
1790
+ return this.parseOrder (response, market);
1791
+ }
1792
+
1793
+ async createSwapOrder (symbol, type, side, amount, price = undefined, params = {}) {
1794
+ await this.loadMarkets ();
1795
+ const market = this.market (symbol);
1796
+ const openType = this.safeInteger (params, 'openType');
1797
+ if (openType === undefined) {
1798
+ throw new ArgumentsRequired (this.id + ' createSwapOrder() requires an integer openType parameter, 1 for isolated margin, 2 for cross margin');
1799
+ }
1800
+ if ((type !== 'limit') && (type !== 'market') && (type !== 1) && (type !== 2) && (type !== 3) && (type !== 4) && (type !== 5) && (type !== 6)) {
1801
+ throw new InvalidOrder (this.id + ' createSwapOrder() order type must either limit, market, or 1 for limit orders, 2 for post-only orders, 3 for IOC orders, 4 for FOK orders, 5 for market orders or 6 to convert market price to current price');
1802
+ }
1803
+ const postOnly = this.safeValue (params, 'postOnly', false);
1804
+ if (postOnly) {
1805
+ type = 2;
1806
+ } else if (type === 'limit') {
1807
+ type = 1;
1808
+ } else if (type === 'market') {
1809
+ type = 6;
1810
+ }
1811
+ if ((side !== 1) && (side !== 2) && (side !== 3) && (side !== 4)) {
1812
+ throw new InvalidOrder (this.id + ' createSwapOrder() order side must be 1 open long, 2 close short, 3 open short or 4 close long');
1813
+ }
1814
+ const request = {
1815
+ 'symbol': market['id'],
1816
+ // 'price': parseFloat (this.priceToPrecision (symbol, price)),
1817
+ 'vol': parseFloat (this.amountToPrecision (symbol, amount)),
1818
+ // 'leverage': int, // required for isolated margin
1819
+ 'side': side, // 1 open long, 2 close short, 3 open short, 4 close long
1820
+ //
1821
+ // supported order types
1822
+ //
1823
+ // 1 limit
1824
+ // 2 post only maker (PO)
1825
+ // 3 transact or cancel instantly (IOC)
1826
+ // 4 transact completely or cancel completely (FOK)
1827
+ // 5 market orders
1828
+ // 6 convert market price to current price
1829
+ //
1830
+ 'type': type,
1831
+ 'openType': openType, // 1 isolated, 2 cross
1832
+ // 'positionId': 1394650, // long, filling in this parameter when closing a position is recommended
1833
+ // 'externalOid': clientOrderId,
1834
+ // 'triggerPrice': 10.0, // Required for trigger order
1835
+ // 'triggerType': 1, // Required for trigger order 1: more than or equal, 2: less than or equal
1836
+ // 'executeCycle': 1, // Required for trigger order 1: 24 hours,2: 7 days
1837
+ // 'trend': 1, // Required for trigger order 1: latest price, 2: fair price, 3: index price
1838
+ // 'orderType': 1, // Required for trigger order 1: limit order,2:Post Only Maker,3: close or cancel instantly ,4: close or cancel completely,5: Market order
1839
+ };
1840
+ let method = 'contractPrivatePostOrderSubmit';
1841
+ const stopPrice = this.safeNumber2 (params, 'triggerPrice', 'stopPrice');
1842
+ params = this.omit (params, [ 'stopPrice', 'triggerPrice' ]);
1843
+ if (stopPrice !== undefined) {
1844
+ method = 'contractPrivatePostPlanorderPlace';
1845
+ request['triggerPrice'] = this.priceToPrecision (symbol, stopPrice);
1846
+ request['triggerType'] = this.safeInteger (params, 'triggerType', 1);
1847
+ request['executeCycle'] = this.safeInteger (params, 'executeCycle', 1);
1848
+ request['trend'] = this.safeInteger (params, 'trend', 1);
1849
+ request['orderType'] = this.safeInteger (params, 'orderType', 1);
1850
+ }
1851
+ if ((type !== 5) && (type !== 6) && (type !== 'market')) {
1852
+ request['price'] = parseFloat (this.priceToPrecision (symbol, price));
1853
+ }
1854
+ if (openType === 1) {
1855
+ const leverage = this.safeInteger (params, 'leverage');
1856
+ if (leverage === undefined) {
1857
+ throw new ArgumentsRequired (this.id + ' createSwapOrder() requires a leverage parameter for isolated margin orders');
1858
+ }
1859
+ }
1860
+ const clientOrderId = this.safeString2 (params, 'clientOrderId', 'externalOid');
1861
+ if (clientOrderId !== undefined) {
1862
+ request['externalOid'] = clientOrderId;
1863
+ }
1864
+ params = this.omit (params, [ 'clientOrderId', 'externalOid', 'postOnly' ]);
1865
+ const response = await this[method] (this.extend (request, params));
1866
+ //
1867
+ // Swap
1868
+ // {"code":200,"data":"2ff3163e8617443cb9c6fc19d42b1ca4"}
1869
+ //
1870
+ // Trigger
1871
+ // {"success":true,"code":0,"data":259208506303929856}
1872
+ //
1873
+ return this.parseOrder (response, market);
1874
+ }
1875
+
1876
+ async cancelOrder (id, symbol = undefined, params = {}) {
1877
+ if (symbol === undefined) {
1878
+ throw new ArgumentsRequired (this.id + ' cancelOrder() requires a symbol argument');
1879
+ }
1880
+ await this.loadMarkets ();
1881
+ const market = this.market (symbol);
1882
+ const options = this.safeValue (this.options, 'cancelOrder', {});
1883
+ const defaultMethod = this.safeString (options, 'method', 'spotPrivateDeleteOrderCancel');
1884
+ let method = this.safeString (params, 'method', defaultMethod);
1885
+ const stop = this.safeValue (params, 'stop');
1886
+ let request = {};
1887
+ if (market['type'] === 'spot') {
1888
+ method = 'spotPrivateDeleteOrderCancel';
1889
+ const clientOrderId = this.safeString2 (params, 'clientOrderId', 'client_order_ids');
1890
+ if (clientOrderId !== undefined) {
1891
+ params = this.omit (params, [ 'clientOrderId', 'client_order_ids' ]);
1892
+ request['client_order_ids'] = clientOrderId;
1893
+ } else {
1894
+ request['order_ids'] = id;
1895
+ }
1896
+ } else if (stop) {
1897
+ method = 'contractPrivatePostPlanorderCancel';
1898
+ request = [];
1899
+ if (Array.isArray (id)) {
1900
+ for (let i = 0; i < id.length; i++) {
1901
+ request.push ({
1902
+ 'symbol': market['id'],
1903
+ 'orderId': id[i],
1904
+ });
1905
+ }
1906
+ } else if (typeof id === 'string') {
1907
+ request.push ({
1908
+ 'symbol': market['id'],
1909
+ 'orderId': id,
1910
+ });
1911
+ }
1912
+ } else if (market['type'] === 'swap') {
1913
+ method = 'contractPrivatePostOrderCancel';
1914
+ request = [ id ];
1915
+ }
1916
+ const response = await this[method] (request); // dont extend with params, otherwise ARRAY will be turned into OBJECT
1917
+ //
1918
+ // Spot
1919
+ //
1920
+ // {"code":200,"data":{"965245851c444078a11a7d771323613b":"success"}}
1921
+ //
1922
+ // Swap
1923
+ //
1924
+ // {
1925
+ // "success": true,
1926
+ // "code": 0,
1927
+ // "data": [
1928
+ // {
1929
+ // "orderId": 268726891790294528,
1930
+ // "errorCode": 0,
1931
+ // "errorMsg": "success"
1932
+ // }
1933
+ // ]
1934
+ // }
1935
+ //
1936
+ // Trigger
1937
+ //
1938
+ // {
1939
+ // "success": true,
1940
+ // "code": 0
1941
+ // }
1942
+ //
1943
+ let data = this.safeValue (response, 'data', []);
1944
+ if (stop) {
1945
+ data = response;
1946
+ }
1947
+ return this.parseOrder (data, market);
1948
+ }
1949
+
1950
+ parseOrderStatus (status, market = undefined) {
1951
+ let statuses = {};
1952
+ if (market['type'] === 'spot') {
1953
+ statuses = {
1954
+ 'NEW': 'open',
1955
+ 'FILLED': 'closed',
1956
+ 'PARTIALLY_FILLED': 'open',
1957
+ 'CANCELED': 'canceled',
1958
+ 'PARTIALLY_CANCELED': 'canceled',
1959
+ };
1960
+ } else if (market['type'] === 'swap') {
1961
+ statuses = {
1962
+ '2': 'open',
1963
+ '3': 'closed',
1964
+ '4': 'canceled',
1965
+ };
1966
+ } else {
1967
+ statuses = {
1968
+ '1': 'open',
1969
+ '2': 'canceled',
1970
+ '3': 'closed',
1971
+ };
1972
+ }
1973
+ return this.safeString (statuses, status, status);
1974
+ }
1975
+
1976
+ parseOrder (order, market = undefined) {
1977
+ //
1978
+ // createOrder
1979
+ //
1980
+ // spot
1981
+ //
1982
+ // {"code":200,"data":"2ff3163e8617443cb9c6fc19d42b1ca4"}
1983
+ //
1984
+ // swap / contract
1985
+ //
1986
+ // { "success": true, "code": 0, "data": 102057569836905984 }
1987
+ //
1988
+ // spot fetchOpenOrders
1989
+ //
1990
+ // {
1991
+ // "id":"965245851c444078a11a7d771323613b",
1992
+ // "symbol":"ETH_USDT",
1993
+ // "price":"3430",
1994
+ // "quantity":"0.01",
1995
+ // "state":"NEW",
1996
+ // "type":"BID",
1997
+ // "remain_quantity":"0.01",
1998
+ // "remain_amount":"34.3",
1999
+ // "create_time":1633989029039,
2000
+ // "client_order_id":"",
2001
+ // "order_type":"LIMIT_ORDER"
2002
+ // }
2003
+ //
2004
+ // swap fetchOpenOrders, fetchClosedOrders, fetchCanceledOrders
2005
+ //
2006
+ // {
2007
+ // "orderId": "266578267438402048",
2008
+ // "symbol": "BTC_USDT",
2009
+ // "positionId": 0,
2010
+ // "price": 30000,
2011
+ // "vol": 11,
2012
+ // "leverage": 20,
2013
+ // "side": 1,
2014
+ // "category": 1,
2015
+ // "orderType": 1,
2016
+ // "dealAvgPrice": 0,
2017
+ // "dealVol": 0,
2018
+ // "orderMargin": 1.6896,
2019
+ // "takerFee": 0,
2020
+ // "makerFee": 0,
2021
+ // "profit": 0,
2022
+ // "feeCurrency": "USDT",
2023
+ // "openType": 1,
2024
+ // "state": 2,
2025
+ // "externalOid": "_m_8d673a31c47642d9a59993aca61ae394",
2026
+ // "errorCode": 0,
2027
+ // "usedMargin": 0,
2028
+ // "createTime": 1649227612000,
2029
+ // "updateTime": 1649227611000,
2030
+ // "positionMode": 1
2031
+ // }
2032
+ //
2033
+ // spot fetchClosedOrders, fetchCanceledOrders, fetchOrder
2034
+ //
2035
+ // {
2036
+ // "id":"d798765285374222990bbd14decb86cd",
2037
+ // "symbol":"USDC_USDT",
2038
+ // "price":"0.9988",
2039
+ // "quantity":"150",
2040
+ // "state":"FILLED", // CANCELED
2041
+ // "type":"ASK", // BID
2042
+ // "deal_quantity":"150",
2043
+ // "deal_amount":"149.955",
2044
+ // "create_time":1633984904000,
2045
+ // "order_type":"MARKET_ORDER" // LIMIT_ORDER
2046
+ // }
2047
+ //
2048
+ // trigger fetchClosedOrders, fetchCanceledOrders, fetchOpenOrders
2049
+ //
2050
+ // {
2051
+ // "id": "266583973507973632",
2052
+ // "symbol": "BTC_USDT",
2053
+ // "leverage": 20,
2054
+ // "side": 1,
2055
+ // "triggerPrice": 30000,
2056
+ // "price": 31000,
2057
+ // "vol": 11,
2058
+ // "openType": 1,
2059
+ // "triggerType": 2,
2060
+ // "state": 2,
2061
+ // "executeCycle": 87600,
2062
+ // "trend": 1,
2063
+ // "orderType": 1,
2064
+ // "errorCode": 0,
2065
+ // "createTime": 1649228972000,
2066
+ // "updateTime": 1649230287000
2067
+ // }
2068
+ //
2069
+ // spot cancelOrder
2070
+ //
2071
+ // {"965245851c444078a11a7d771323613b":"success"}
2072
+ //
2073
+ // swap cancelOrder
2074
+ //
2075
+ // {
2076
+ // "orderId": 268726891790294528,
2077
+ // "errorCode": 0,
2078
+ // "errorMsg": "success"
2079
+ // }
2080
+ //
2081
+ // trigger cancelOrder
2082
+ //
2083
+ // {
2084
+ // "success": true,
2085
+ // "code": 0
2086
+ // }
2087
+ //
2088
+ let id = this.safeString2 (order, 'data', 'id');
2089
+ let status = undefined;
2090
+ if (id === undefined) {
2091
+ const keys = Object.keys (order);
2092
+ id = this.safeString (keys, 0);
2093
+ const state = this.safeString (order, id);
2094
+ if (state === 'success') {
2095
+ status = 'canceled';
2096
+ }
2097
+ }
2098
+ const state = this.safeString (order, 'state');
2099
+ const timestamp = this.safeInteger2 (order, 'create_time', 'createTime');
2100
+ const price = this.safeString (order, 'price');
2101
+ const amount = this.safeString2 (order, 'quantity', 'vol');
2102
+ const remaining = this.safeString (order, 'remain_quantity');
2103
+ const filled = this.safeString2 (order, 'deal_quantity', 'dealVol');
2104
+ const cost = this.safeString2 (order, 'deal_amount', 'dealAvgPrice');
2105
+ const marketId = this.safeString (order, 'symbol');
2106
+ const symbol = this.safeSymbol (marketId, market, '_');
2107
+ const sideCheck = this.safeInteger (order, 'side');
2108
+ let side = undefined;
2109
+ const bidOrAsk = this.safeString (order, 'type');
2110
+ if (bidOrAsk === 'BID') {
2111
+ side = 'buy';
2112
+ } else if (bidOrAsk === 'ASK') {
2113
+ side = 'sell';
2114
+ }
2115
+ if (sideCheck === 1) {
2116
+ side = 'open long';
2117
+ } else if (side === 2) {
2118
+ side = 'close short';
2119
+ } else if (side === 3) {
2120
+ side = 'open short';
2121
+ } else if (side === 4) {
2122
+ side = 'close long';
2123
+ }
2124
+ status = this.parseOrderStatus (state, market);
2125
+ let clientOrderId = this.safeString2 (order, 'client_order_id', 'orderId');
2126
+ if (clientOrderId === '') {
2127
+ clientOrderId = undefined;
2128
+ }
2129
+ let orderType = this.safeStringLower (order, 'order_type');
2130
+ if (orderType !== undefined) {
2131
+ orderType = orderType.replace ('_order', '');
2132
+ }
2133
+ return this.safeOrder ({
2134
+ 'id': id,
2135
+ 'clientOrderId': clientOrderId,
2136
+ 'timestamp': timestamp,
2137
+ 'datetime': this.iso8601 (timestamp),
2138
+ 'lastTradeTimestamp': this.safeInteger (order, 'updateTime'),
2139
+ 'status': status,
2140
+ 'symbol': symbol,
2141
+ 'type': orderType,
2142
+ 'timeInForce': undefined,
2143
+ 'side': side,
2144
+ 'price': price,
2145
+ 'stopPrice': undefined,
2146
+ 'average': undefined,
2147
+ 'amount': amount,
2148
+ 'cost': cost,
2149
+ 'filled': filled,
2150
+ 'remaining': remaining,
2151
+ 'fee': undefined,
2152
+ 'trades': undefined,
2153
+ 'info': order,
2154
+ }, market);
2155
+ }
2156
+
2157
+ async fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2158
+ if (symbol === undefined) {
2159
+ throw new ArgumentsRequired (this.id + ' fetchOpenOrders() requires a symbol argument');
2160
+ }
2161
+ await this.loadMarkets ();
2162
+ const market = this.market (symbol);
2163
+ const request = {
2164
+ 'symbol': market['id'], // spot, swap
2165
+ // 'start_time': since, // spot
2166
+ // 'limit': limit, // spot default 50, max 1000
2167
+ // 'trade_type': 'BID', // spot BID / ASK
2168
+ // 'page_num': 1, // swap required default 1
2169
+ // 'page_size': limit, // swap required default 20 max 100
2170
+ // 'end_time': 1633988662382, // trigger order
2171
+ };
2172
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('fetchOpenOrders', market, params);
2173
+ const method = this.getSupportedMapping (marketType, {
2174
+ 'spot': 'spotPrivateGetOrderOpenOrders',
2175
+ 'swap': 'contractPrivateGetOrderListOpenOrdersSymbol',
2176
+ });
2177
+ const stop = this.safeValue (params, 'stop');
2178
+ if (stop) {
2179
+ return await this.fetchOrdersByState ('1', symbol, since, limit, params);
2180
+ }
2181
+ const response = await this[method] (this.extend (request, query));
2182
+ //
2183
+ // Spot
2184
+ //
2185
+ // {
2186
+ // "code":200,
2187
+ // "data":[
2188
+ // {
2189
+ // "id":"965245851c444078a11a7d771323613b",
2190
+ // "symbol":"ETH_USDT",
2191
+ // "price":"3430",
2192
+ // "quantity":"0.01",
2193
+ // "state":"NEW",
2194
+ // "type":"BID",
2195
+ // "remain_quantity":"0.01",
2196
+ // "remain_amount":"34.3",
2197
+ // "create_time":1633989029039,
2198
+ // "client_order_id":"",
2199
+ // "order_type":"LIMIT_ORDER"
2200
+ // },
2201
+ // ]
2202
+ // }
2203
+ //
2204
+ // Swap
2205
+ //
2206
+ // {
2207
+ // "success": true,
2208
+ // "code": 0,
2209
+ // "data": [
2210
+ // {
2211
+ // "orderId": "266578267438402048",
2212
+ // "symbol": "BTC_USDT",
2213
+ // "positionId": 0,
2214
+ // "price": 30000,
2215
+ // "vol": 11,
2216
+ // "leverage": 20,
2217
+ // "side": 1,
2218
+ // "category": 1,
2219
+ // "orderType": 1,
2220
+ // "dealAvgPrice": 0,
2221
+ // "dealVol": 0,
2222
+ // "orderMargin": 1.6896,
2223
+ // "takerFee": 0,
2224
+ // "makerFee": 0,
2225
+ // "profit": 0,
2226
+ // "feeCurrency": "USDT",
2227
+ // "openType": 1,
2228
+ // "state": 2,
2229
+ // "externalOid": "_m_8d673a31c47642d9a59993aca61ae394",
2230
+ // "errorCode": 0,
2231
+ // "usedMargin": 0,
2232
+ // "createTime": 1649227612000,
2233
+ // "updateTime": 1649227611000,
2234
+ // "positionMode": 1
2235
+ // }
2236
+ // ]
2237
+ // }
2238
+ //
2239
+ // Trigger
2240
+ //
2241
+ // {
2242
+ // "success": true,
2243
+ // "code": 0,
2244
+ // "data": [
2245
+ // {
2246
+ // "id": "267198217203040768",
2247
+ // "symbol": "BTC_USDT",
2248
+ // "leverage": 20,
2249
+ // "side": 1,
2250
+ // "triggerPrice": 31111,
2251
+ // "price": 31115,
2252
+ // "vol": 2,
2253
+ // "openType": 1,
2254
+ // "triggerType": 2,
2255
+ // "state": 1,
2256
+ // "executeCycle": 87600,
2257
+ // "trend": 1,
2258
+ // "orderType": 1,
2259
+ // "errorCode": 0,
2260
+ // "createTime": 1649375419000,
2261
+ // "updateTime": 1649375419000
2262
+ // }
2263
+ // ]
2264
+ // }
2265
+ //
2266
+ const data = this.safeValue (response, 'data', []);
2267
+ return this.parseOrders (data, market, since, limit);
2268
+ }
2269
+
2270
+ async fetchOrder (id, symbol = undefined, params = {}) {
2271
+ if (symbol === undefined) {
2272
+ throw new ArgumentsRequired (this.id + ' fetchOrder() requires a symbol argument');
2273
+ }
2274
+ await this.loadMarkets ();
2275
+ const market = this.market (symbol);
2276
+ const [ marketType, query ] = this.handleMarketTypeAndParams ('fetchOrder', market, params);
2277
+ const request = {
2278
+ 'order_ids': id,
2279
+ };
2280
+ const method = this.getSupportedMapping (marketType, {
2281
+ 'spot': 'spotPrivateGetOrderQuery',
2282
+ 'swap': 'contractPrivateGetOrderBatchQuery',
2283
+ });
2284
+ const response = await this[method] (this.extend (request, query));
2285
+ //
2286
+ // Spot
2287
+ //
2288
+ // {
2289
+ // "code":200,
2290
+ // "data":[
2291
+ // {
2292
+ // "id":"2ff3163e8617443cb9c6fc19d42b1ca4",
2293
+ // "symbol":"ETH_USDT",
2294
+ // "price":"3420",
2295
+ // "quantity":"0.01",
2296
+ // "state":"CANCELED",
2297
+ // "type":"BID",
2298
+ // "deal_quantity":"0",
2299
+ // "deal_amount":"0",
2300
+ // "create_time":1633988662000,
2301
+ // "order_type":"LIMIT_ORDER"
2302
+ // }
2303
+ // ]
2304
+ // }
2305
+ //
2306
+ // Swap
2307
+ //
2308
+ // {
2309
+ // "success": true,
2310
+ // "code": 0,
2311
+ // "data": [
2312
+ // {
2313
+ // "orderId": "259208506647860224",
2314
+ // "symbol": "BTC_USDT",
2315
+ // "positionId": 0,
2316
+ // "price": 30000,
2317
+ // "vol": 10,
2318
+ // "leverage": 20,
2319
+ // "side": 1,
2320
+ // "category": 1,
2321
+ // "orderType": 1,
2322
+ // "dealAvgPrice": 0,
2323
+ // "dealVol": 0,
2324
+ // "orderMargin": 1.536,
2325
+ // "takerFee": 0,
2326
+ // "makerFee": 0,
2327
+ // "profit": 0,
2328
+ // "feeCurrency": "USDT",
2329
+ // "openType": 1,
2330
+ // "state": 4,
2331
+ // "externalOid": "planorder_279208506303929856_10",
2332
+ // "errorCode": 0,
2333
+ // "usedMargin": 0,
2334
+ // "createTime": 1647470524000,
2335
+ // "updateTime": 1647470540000,
2336
+ // "positionMode": 1
2337
+ // }
2338
+ // ]
2339
+ // }
2340
+ //
2341
+ const data = this.safeValue (response, 'data', []);
2342
+ const firstOrder = this.safeValue (data, 0);
2343
+ if (firstOrder === undefined) {
2344
+ throw new OrderNotFound (this.id + ' fetchOrder() could not find the order id ' + id);
2345
+ }
2346
+ return this.parseOrder (firstOrder, market);
2347
+ }
2348
+
2349
+ async fetchOrdersByState (state, symbol = undefined, since = undefined, limit = undefined, params = {}) {
2350
+ if (symbol === undefined) {
2351
+ throw new ArgumentsRequired (this.id + ' fetchOrdersByState() requires a symbol argument');
2352
+ }
2353
+ await this.loadMarkets ();
2354
+ const market = this.market (symbol);
2355
+ const request = {
2356
+ 'symbol': market['id'],
2357
+ // 'start_time': since, // default 7 days, max 30 days
2358
+ // 'limit': limit, // default 50, max 1000
2359
+ // 'trade_type': 'BID', // BID / ASK
2360
+ 'states': state, // NEW, FILLED, PARTIALLY_FILLED, CANCELED, PARTIALLY_CANCELED, trigger orders: 1 untriggered, 2 cancelled, 3 executed, 4 invalid, 5 execution failed
2361
+ // 'end_time': 1633988662000, // trigger orders
2362
+ // 'page_num': 1, // trigger orders default is 1
2363
+ // 'page_size': limit, // trigger orders default 20 max 100
2364
+ };
2365
+ const stop = this.safeValue (params, 'stop');
2366
+ const limitRequest = stop ? 'page_size' : 'limit';
2367
+ if (limit !== undefined) {
2368
+ request[limitRequest] = limit;
2369
+ }
2370
+ if (since !== undefined) {
2371
+ request['start_time'] = since;
2372
+ }
2373
+ const options = this.safeValue (this.options, 'fetchOrdersByState', {});
2374
+ const defaultMethod = this.safeString (options, 'method', 'spotPrivateGetOrderList');
2375
+ let method = this.safeString (params, 'method', defaultMethod);
2376
+ method = this.getSupportedMapping (market['type'], {
2377
+ 'spot': 'spotPrivateGetOrderList',
2378
+ 'swap': 'contractPrivateGetOrderListHistoryOrders',
2379
+ });
2380
+ if (stop) {
2381
+ method = 'contractPrivateGetPlanorderListOrders';
2382
+ }
2383
+ const query = this.omit (params, [ 'method', 'stop' ]);
2384
+ const response = await this[method] (this.extend (request, query));
2385
+ const data = this.safeValue (response, 'data', []);
2386
+ return this.parseOrders (data, market, since, limit);
2387
+ }
2388
+
2389
+ async fetchCanceledOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2390
+ if (symbol === undefined) {
2391
+ throw new ArgumentsRequired (this.id + ' fetchCanceledOrders() requires a symbol argument');
2392
+ }
2393
+ await this.loadMarkets ();
2394
+ const market = this.market (symbol);
2395
+ const stop = this.safeValue (params, 'stop');
2396
+ let state = 'CANCELED';
2397
+ if (market['type'] === 'swap') {
2398
+ state = '4';
2399
+ } else if (stop) {
2400
+ state = '2';
2401
+ }
2402
+ return await this.fetchOrdersByState (state, symbol, since, limit, params);
2403
+ }
2404
+
2405
+ async fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2406
+ if (symbol === undefined) {
2407
+ throw new ArgumentsRequired (this.id + ' fetchClosedOrders() requires a symbol argument');
2408
+ }
2409
+ await this.loadMarkets ();
2410
+ const market = this.market (symbol);
2411
+ const stop = this.safeValue (params, 'stop');
2412
+ let state = 'FILLED';
2413
+ if (stop || market['type'] === 'swap') {
2414
+ state = '3';
2415
+ }
2416
+ return await this.fetchOrdersByState (state, symbol, since, limit, params);
2417
+ }
2418
+
2419
+ async cancelAllOrders (symbol = undefined, params = {}) {
2420
+ await this.loadMarkets ();
2421
+ const market = this.market (symbol);
2422
+ const request = {
2423
+ 'symbol': market['id'],
2424
+ };
2425
+ let method = this.getSupportedMapping (market['type'], {
2426
+ 'spot': 'spotPrivateDeleteOrderCancelBySymbol',
2427
+ 'swap': 'contractPrivatePostOrderCancelAll',
2428
+ });
2429
+ const stop = this.safeValue (params, 'stop');
2430
+ if (stop) {
2431
+ method = 'contractPrivatePostPlanorderCancelAll';
2432
+ }
2433
+ const query = this.omit (params, [ 'method', 'stop' ]);
2434
+ const response = await this[method] (this.extend (request, query));
2435
+ //
2436
+ // Spot
2437
+ //
2438
+ // {
2439
+ // "code": 200,
2440
+ // "data": [
2441
+ // {
2442
+ // "msg": "success",
2443
+ // "order_id": "75ecf99feef04538b78e4622beaba6eb",
2444
+ // "client_order_id": "a9329e86f2094b0d8b58e92c25029554"
2445
+ // },
2446
+ // {
2447
+ // "msg": "success",
2448
+ // "order_id": "139413c48f8b4c018f452ce796586bcf"
2449
+ // },
2450
+ // {
2451
+ // "msg": "success",
2452
+ // "order_id": "b58ef34c570e4917981f276d44091484"
2453
+ // }
2454
+ // ]
2455
+ // }
2456
+ //
2457
+ // Swap and Trigger
2458
+ //
2459
+ // {
2460
+ // "success": true,
2461
+ // "code": 0
2462
+ // }
2463
+ //
2464
+ return response;
2465
+ }
2466
+
2467
+ async fetchMyTrades (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2468
+ if (symbol === undefined) {
2469
+ throw new ArgumentsRequired (this.id + ' fetchMyTrades() requires a symbol argument');
2470
+ }
2471
+ await this.loadMarkets ();
2472
+ const market = this.market (symbol);
2473
+ const request = {
2474
+ 'symbol': market['id'],
2475
+ // 'start_time': since, // default 7 days, max 30 days
2476
+ // 'limit': limit, // default 50, max 1000
2477
+ };
2478
+ if (since !== undefined) {
2479
+ request['start_time'] = since;
2480
+ }
2481
+ if (limit !== undefined) {
2482
+ request['limit'] = limit;
2483
+ }
2484
+ const response = await this.spotPrivateGetOrderDeals (this.extend (request, params));
2485
+ //
2486
+ // {
2487
+ // "code":200,
2488
+ // "data":[
2489
+ // {
2490
+ // "id":"b160b8f072d9403e96289139d5544809",
2491
+ // "symbol":"USDC_USDT",
2492
+ // "quantity":"150",
2493
+ // "price":"0.9997",
2494
+ // "amount":"149.955",
2495
+ // "fee":"0.29991",
2496
+ // "trade_type":"ASK",
2497
+ // "order_id":"d798765285374222990bbd14decb86cd",
2498
+ // "is_taker":true,
2499
+ // "fee_currency":"USDT",
2500
+ // "create_time":1633984904000
2501
+ // }
2502
+ // ]
2503
+ // }
2504
+ //
2505
+ const data = this.safeValue (response, 'data', []);
2506
+ return this.parseTrades (data, market, since, limit);
2507
+ }
2508
+
2509
+ async fetchOrderTrades (id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
2510
+ await this.loadMarkets ();
2511
+ let market = undefined;
2512
+ if (symbol !== undefined) {
2513
+ market = this.market (symbol);
2514
+ }
2515
+ const request = {
2516
+ 'order_id': id,
2517
+ };
2518
+ const response = await this.spotPrivateGetOrderDealDetail (this.extend (request, params));
2519
+ //
2520
+ // {
2521
+ // "code":200,
2522
+ // "data":[
2523
+ // {
2524
+ // "id":"b160b8f072d9403e96289139d5544809",
2525
+ // "symbol":"USDC_USDT",
2526
+ // "quantity":"150",
2527
+ // "price":"0.9997",
2528
+ // "amount":"149.955",
2529
+ // "fee":"0.29991",
2530
+ // "trade_type":"ASK",
2531
+ // "order_id":"d798765285374222990bbd14decb86cd",
2532
+ // "is_taker":true,
2533
+ // "fee_currency":"USDT",
2534
+ // "create_time":1633984904000
2535
+ // }
2536
+ // ]
2537
+ // }
2538
+ //
2539
+ const data = this.safeValue (response, 'data', []);
2540
+ return this.parseTrades (data, market, since, limit);
2541
+ }
2542
+
2543
+ async modifyMarginHelper (symbol, amount, addOrReduce, params = {}) {
2544
+ const positionId = this.safeInteger (params, 'positionId');
2545
+ if (positionId === undefined) {
2546
+ throw new ArgumentsRequired (this.id + ' modifyMarginHelper() requires a positionId parameter');
2547
+ }
2548
+ await this.loadMarkets ();
2549
+ const market = this.market (symbol);
2550
+ amount = this.amountToPrecision (symbol, amount);
2551
+ const request = {
2552
+ 'positionId': positionId,
2553
+ 'amount': amount,
2554
+ 'type': addOrReduce,
2555
+ };
2556
+ const response = await this.contractPrivatePostPositionChangeMargin (this.extend (request, params));
2557
+ //
2558
+ // {
2559
+ // "success": true,
2560
+ // "code": 0
2561
+ // }
2562
+ //
2563
+ const type = (addOrReduce === 'ADD') ? 'add' : 'reduce';
2564
+ return this.extend (this.parseModifyMargin (response, market), {
2565
+ 'amount': this.safeNumber (amount),
2566
+ 'type': type,
2567
+ });
2568
+ }
2569
+
2570
+ parseModifyMargin (data, market = undefined) {
2571
+ const statusRaw = this.safeString (data, 'success');
2572
+ const status = (statusRaw === true) ? 'ok' : 'failed';
2573
+ return {
2574
+ 'info': data,
2575
+ 'type': undefined,
2576
+ 'amount': undefined,
2577
+ 'code': undefined,
2578
+ 'symbol': this.safeSymbol (undefined, market),
2579
+ 'status': status,
2580
+ };
2581
+ }
2582
+
2583
+ async reduceMargin (symbol, amount, params = {}) {
2584
+ return await this.modifyMarginHelper (symbol, amount, 'SUB', params);
2585
+ }
2586
+
2587
+ async addMargin (symbol, amount, params = {}) {
2588
+ return await this.modifyMarginHelper (symbol, amount, 'ADD', params);
2589
+ }
2590
+
2591
+ async setLeverage (leverage, symbol = undefined, params = {}) {
2592
+ const positionId = this.safeInteger (params, 'positionId');
2593
+ if (positionId === undefined) {
2594
+ throw new ArgumentsRequired (this.id + ' setLeverage() requires a positionId parameter');
2595
+ }
2596
+ await this.loadMarkets ();
2597
+ const request = {
2598
+ 'positionId': positionId,
2599
+ 'leverage': leverage,
2600
+ };
2601
+ return await this.contractPrivatePostPositionChangeLeverage (this.extend (request, params));
2602
+ }
2603
+
2604
+ async fetchTransfer (id, code = undefined, params = {}) {
2605
+ const request = {
2606
+ 'transact_id': id,
2607
+ };
2608
+ const response = await this.spotPrivateGetAssetInternalTransferInfo (this.extend (request, params));
2609
+ //
2610
+ // {
2611
+ // code: '200',
2612
+ // data: {
2613
+ // currency: 'USDT',
2614
+ // amount: '1',
2615
+ // transact_id: '954877a2ef54499db9b28a7cf9ebcf41',
2616
+ // from: 'MAIN',
2617
+ // to: 'CONTRACT',
2618
+ // transact_state: 'SUCCESS'
2619
+ // }
2620
+ // }
2621
+ //
2622
+ const data = this.safeValue (response, 'data', {});
2623
+ return this.parseTransfer (data);
2624
+ }
2625
+
2626
+ async fetchTransfers (code = undefined, since = undefined, limit = undefined, params = {}) {
2627
+ await this.loadMarkets ();
2628
+ const request = {};
2629
+ let currency = undefined;
2630
+ if (code !== undefined) {
2631
+ currency = this.currency (code);
2632
+ request['currency'] = currency['id'];
2633
+ }
2634
+ if (since !== undefined) {
2635
+ request['start_time'] = since;
2636
+ }
2637
+ if (limit !== undefined) {
2638
+ if (limit > 50) {
2639
+ throw new ExchangeError ('This exchange supports a maximum limit of 50');
2640
+ }
2641
+ request['page-size'] = limit;
2642
+ }
2643
+ const response = await this.spotPrivateGetAssetInternalTransferRecord (this.extend (request, params));
2644
+ //
2645
+ // {
2646
+ // code: '200',
2647
+ // data: {
2648
+ // total_page: '1',
2649
+ // total_size: '5',
2650
+ // result_list: [{
2651
+ // currency: 'USDT',
2652
+ // amount: '1',
2653
+ // transact_id: '954877a2ef54499db9b28a7cf9ebcf41',
2654
+ // from: 'MAIN',
2655
+ // to: 'CONTRACT',
2656
+ // transact_state: 'SUCCESS'
2657
+ // },
2658
+ // ...
2659
+ // ]
2660
+ // }
2661
+ // }
2662
+ //
2663
+ const data = this.safeValue (response, 'data', {});
2664
+ const resultList = this.safeValue (data, 'result_list', []);
2665
+ return this.parseTransfers (resultList, currency, since, limit);
2666
+ }
2667
+
2668
+ async transfer (code, amount, fromAccount, toAccount, params = {}) {
2669
+ await this.loadMarkets ();
2670
+ const currency = this.currency (code);
2671
+ const accountsByType = this.safeValue (this.options, 'accountsByType', {});
2672
+ const fromId = this.safeString (accountsByType, fromAccount, fromAccount);
2673
+ const toId = this.safeString (accountsByType, toAccount, toAccount);
2674
+ const request = {
2675
+ 'currency': currency['id'],
2676
+ 'amount': amount,
2677
+ 'from': fromId,
2678
+ 'to': toId,
2679
+ };
2680
+ const response = await this.spotPrivatePostAssetInternalTransfer (this.extend (request, params));
2681
+ //
2682
+ // {
2683
+ // code: '200',
2684
+ // data: {
2685
+ // currency: 'USDT',
2686
+ // amount: '1',
2687
+ // transact_id: 'b60c1df8e7b24b268858003f374ecb75',
2688
+ // from: 'MAIN',
2689
+ // to: 'CONTRACT',
2690
+ // transact_state: 'WAIT'
2691
+ // }
2692
+ // }
2693
+ //
2694
+ const data = this.safeValue (response, 'data', {});
2695
+ return this.parseTransfer (data, currency);
2696
+ }
2697
+
2698
+ parseTransfer (transfer, currency = undefined) {
2699
+ //
2700
+ // {
2701
+ // currency: 'USDT',
2702
+ // amount: '1',
2703
+ // transact_id: 'b60c1df8e7b24b268858003f374ecb75',
2704
+ // from: 'MAIN',
2705
+ // to: 'CONTRACT',
2706
+ // transact_state: 'WAIT'
2707
+ // }
2708
+ //
2709
+ const transferOptions = this.safeValue (this.options, 'transfer', {});
2710
+ const transferStatusById = this.safeValue (transferOptions, 'status', {});
2711
+ const currencyId = this.safeString (transfer, 'currency');
2712
+ const id = this.safeString (transfer, 'transact_id');
2713
+ const fromId = this.safeString (transfer, 'from');
2714
+ const toId = this.safeString (transfer, 'to');
2715
+ const accountsById = this.safeValue (transferOptions, 'accountsById', {});
2716
+ const fromAccount = this.safeString (accountsById, fromId);
2717
+ const toAccount = this.safeString (accountsById, toId);
2718
+ const statusId = this.safeString (transfer, 'transact_state');
2719
+ return {
2720
+ 'info': transfer,
2721
+ 'id': id,
2722
+ 'timestamp': undefined,
2723
+ 'datetime': undefined,
2724
+ 'currency': this.safeCurrencyCode (currencyId, currency),
2725
+ 'amount': this.safeNumber (transfer, 'amount'),
2726
+ 'fromAccount': fromAccount,
2727
+ 'toAccount': toAccount,
2728
+ 'status': this.safeString (transferStatusById, statusId),
2729
+ };
2730
+ }
2731
+
2732
+ async withdraw (code, amount, address, tag = undefined, params = {}) {
2733
+ [ tag, params ] = this.handleWithdrawTagAndParams (tag, params);
2734
+ const networks = this.safeValue (this.options, 'networks', {});
2735
+ let network = this.safeString2 (params, 'network', 'chain'); // this line allows the user to specify either ERC20 or ETH
2736
+ network = this.safeString (networks, network, network); // handle ETH > ERC-20 alias
2737
+ this.checkAddress (address);
2738
+ await this.loadMarkets ();
2739
+ const currency = this.currency (code);
2740
+ if (tag !== undefined) {
2741
+ address += ':' + tag;
2742
+ }
2743
+ const request = {
2744
+ 'currency': currency['id'],
2745
+ 'address': address,
2746
+ 'amount': amount,
2747
+ };
2748
+ if (network !== undefined) {
2749
+ request['chain'] = network;
2750
+ params = this.omit (params, [ 'network', 'chain' ]);
2751
+ }
2752
+ const response = await this.spotPrivatePostAssetWithdraw (this.extend (request, params));
2753
+ //
2754
+ // {
2755
+ // "code":200,
2756
+ // "data": {
2757
+ // "withdrawId":"25fb2831fb6d4fc7aa4094612a26c81d"
2758
+ // }
2759
+ // }
2760
+ //
2761
+ const data = this.safeValue (response, 'data', {});
2762
+ return {
2763
+ 'info': data,
2764
+ 'id': this.safeString (data, 'withdrawId'),
2765
+ };
2766
+ }
2767
+
2768
+ sign (path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
2769
+ const [ section, access ] = api;
2770
+ let url = this.urls['api'][section][access] + '/' + this.implodeParams (path, params);
2771
+ params = this.omit (params, this.extractParams (path));
2772
+ if (access === 'public') {
2773
+ if (Object.keys (params).length) {
2774
+ url += '?' + this.urlencode (params);
2775
+ }
2776
+ } else {
2777
+ this.checkRequiredCredentials ();
2778
+ const timestamp = this.milliseconds ().toString ();
2779
+ let auth = '';
2780
+ headers = {
2781
+ 'ApiKey': this.apiKey,
2782
+ 'Request-Time': timestamp,
2783
+ 'Content-Type': 'application/json',
2784
+ };
2785
+ if (method === 'POST') {
2786
+ auth = this.json (params);
2787
+ body = auth;
2788
+ } else {
2789
+ params = this.keysort (params);
2790
+ if (Object.keys (params).length) {
2791
+ auth += this.urlencode (params);
2792
+ url += '?' + auth;
2793
+ }
2794
+ }
2795
+ auth = this.apiKey + timestamp + auth;
2796
+ const signature = this.hmac (this.encode (auth), this.encode (this.secret), 'sha256');
2797
+ headers['Signature'] = signature;
2798
+ }
2799
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
2800
+ }
2801
+
2802
+ handleErrors (code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2803
+ if (response === undefined) {
2804
+ return;
2805
+ }
2806
+ // {"code":10232,"msg":"The currency not exist"}
2807
+ // {"code":10216,"msg":"No available deposit address"}
2808
+ //
2809
+ // {
2810
+ // "success":true,
2811
+ // "code":0,
2812
+ // "data":1634095541710
2813
+ // }
2814
+ //
2815
+ const success = this.safeValue (response, 'success', false);
2816
+ if (success === true) {
2817
+ return;
2818
+ }
2819
+ const responseCode = this.safeString (response, 'code');
2820
+ if ((responseCode !== '200') && (responseCode !== '0')) {
2821
+ const feedback = this.id + ' ' + body;
2822
+ this.throwBroadlyMatchedException (this.exceptions['broad'], body, feedback);
2823
+ this.throwExactlyMatchedException (this.exceptions['exact'], responseCode, feedback);
2824
+ throw new ExchangeError (feedback);
2825
+ }
2826
+ }
2827
+
2828
+ async fetchFundingHistory (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2829
+ await this.loadMarkets ();
2830
+ let market = undefined;
2831
+ const request = {
2832
+ // 'symbol': market['id'],
2833
+ // 'position_id': positionId,
2834
+ // 'page_num': 1,
2835
+ // 'page_size': limit, // default 20, max 100
2836
+ };
2837
+ if (symbol !== undefined) {
2838
+ market = this.market (symbol);
2839
+ request['symbol'] = market['id'];
2840
+ }
2841
+ if (limit !== undefined) {
2842
+ request['page_size'] = limit;
2843
+ }
2844
+ const response = await this.contractPrivateGetPositionFundingRecords (this.extend (request, params));
2845
+ //
2846
+ // {
2847
+ // "success": true,
2848
+ // "code": 0,
2849
+ // "data": {
2850
+ // "pageSize": 20,
2851
+ // "totalCount": 2,
2852
+ // "totalPage": 1,
2853
+ // "currentPage": 1,
2854
+ // "resultList": [
2855
+ // {
2856
+ // "id": 7423910,
2857
+ // "symbol": "BTC_USDT",
2858
+ // "positionType": 1,
2859
+ // "positionValue": 29.30024,
2860
+ // "funding": 0.00076180624,
2861
+ // "rate": -0.000026,
2862
+ // "settleTime": 1643299200000
2863
+ // },
2864
+ // {
2865
+ // "id": 7416473,
2866
+ // "symbol": "BTC_USDT",
2867
+ // "positionType": 1,
2868
+ // "positionValue": 28.9188,
2869
+ // "funding": 0.0014748588,
2870
+ // "rate": -0.000051,
2871
+ // "settleTime": 1643270400000
2872
+ // }
2873
+ // ]
2874
+ // }
2875
+ // }
2876
+ //
2877
+ const data = this.safeValue (response, 'data', {});
2878
+ const resultList = this.safeValue (data, 'resultList', []);
2879
+ const result = [];
2880
+ for (let i = 0; i < resultList.length; i++) {
2881
+ const entry = resultList[i];
2882
+ const timestamp = this.safeString (entry, 'settleTime');
2883
+ result.push ({
2884
+ 'info': entry,
2885
+ 'symbol': symbol,
2886
+ 'code': undefined,
2887
+ 'timestamp': timestamp,
2888
+ 'datetime': this.iso8601 (timestamp),
2889
+ 'id': this.safeNumber (entry, 'id'),
2890
+ 'amount': this.safeNumber (entry, 'funding'),
2891
+ });
2892
+ }
2893
+ return result;
2894
+ }
2895
+
2896
+ parseFundingRate (fundingRate, market = undefined) {
2897
+ //
2898
+ // {
2899
+ // "symbol": "BTC_USDT",
2900
+ // "fundingRate": 0.000014,
2901
+ // "maxFundingRate": 0.003,
2902
+ // "minFundingRate": -0.003,
2903
+ // "collectCycle": 8,
2904
+ // "nextSettleTime": 1643241600000,
2905
+ // "timestamp": 1643240373359
2906
+ // }
2907
+ //
2908
+ const nextFundingRate = this.safeNumber (fundingRate, 'fundingRate');
2909
+ const nextFundingTimestamp = this.safeInteger (fundingRate, 'nextSettleTime');
2910
+ const marketId = this.safeString (fundingRate, 'symbol');
2911
+ const symbol = this.safeSymbol (marketId, market);
2912
+ const timestamp = this.safeInteger (fundingRate, 'timestamp');
2913
+ const datetime = this.iso8601 (timestamp);
2914
+ return {
2915
+ 'info': fundingRate,
2916
+ 'symbol': symbol,
2917
+ 'markPrice': undefined,
2918
+ 'indexPrice': undefined,
2919
+ 'interestRate': undefined,
2920
+ 'estimatedSettlePrice': undefined,
2921
+ 'timestamp': timestamp,
2922
+ 'datetime': datetime,
2923
+ 'fundingRate': undefined,
2924
+ 'fundingTimestamp': undefined,
2925
+ 'fundingDatetime': undefined,
2926
+ 'nextFundingRate': nextFundingRate,
2927
+ 'nextFundingTimestamp': nextFundingTimestamp,
2928
+ 'nextFundingDatetime': this.iso8601 (nextFundingTimestamp),
2929
+ 'previousFundingRate': undefined,
2930
+ 'previousFundingTimestamp': undefined,
2931
+ 'previousFundingDatetime': undefined,
2932
+ };
2933
+ }
2934
+
2935
+ async fetchFundingRate (symbol, params = {}) {
2936
+ await this.loadMarkets ();
2937
+ const market = this.market (symbol);
2938
+ const request = {
2939
+ 'symbol': market['id'],
2940
+ };
2941
+ const response = await this.contractPublicGetFundingRateSymbol (this.extend (request, params));
2942
+ //
2943
+ // {
2944
+ // "success": true,
2945
+ // "code": 0,
2946
+ // "data": {
2947
+ // "symbol": "BTC_USDT",
2948
+ // "fundingRate": 0.000014,
2949
+ // "maxFundingRate": 0.003,
2950
+ // "minFundingRate": -0.003,
2951
+ // "collectCycle": 8,
2952
+ // "nextSettleTime": 1643241600000,
2953
+ // "timestamp": 1643240373359
2954
+ // }
2955
+ // }
2956
+ //
2957
+ const result = this.safeValue (response, 'data', {});
2958
+ return this.parseFundingRate (result, market);
2959
+ }
2960
+
2961
+ async fetchFundingRateHistory (symbol = undefined, since = undefined, limit = undefined, params = {}) {
2962
+ //
2963
+ // Gets a history of funding rates with their timestamps
2964
+ // (param) symbol: Future currency pair
2965
+ // (param) limit: mexc limit is page_size default 20, maximum is 100
2966
+ // (param) since: not used by mexc
2967
+ // (param) params: Object containing more params for the request
2968
+ // return: [{symbol, fundingRate, timestamp, dateTime}]
2969
+ //
2970
+ if (symbol === undefined) {
2971
+ throw new ArgumentsRequired (this.id + ' fetchFundingRateHistory() requires a symbol argument');
2972
+ }
2973
+ await this.loadMarkets ();
2974
+ const market = this.market (symbol);
2975
+ const request = {
2976
+ 'symbol': market['id'],
2977
+ // 'page_size': limit, // optional
2978
+ // 'page_num': 1, // optional, current page number, default is 1
2979
+ };
2980
+ if (limit !== undefined) {
2981
+ request['page_size'] = limit;
2982
+ }
2983
+ const response = await this.contractPublicGetFundingRateHistory (this.extend (request, params));
2984
+ //
2985
+ // {
2986
+ // "success": true,
2987
+ // "code": 0,
2988
+ // "data": {
2989
+ // "pageSize": 2,
2990
+ // "totalCount": 21,
2991
+ // "totalPage": 11,
2992
+ // "currentPage": 1,
2993
+ // "resultList": [
2994
+ // {
2995
+ // "symbol": "BTC_USDT",
2996
+ // "fundingRate": 0.000266,
2997
+ // "settleTime": 1609804800000
2998
+ // },
2999
+ // {
3000
+ // "symbol": "BTC_USDT",
3001
+ // "fundingRate": 0.00029,
3002
+ // "settleTime": 1609776000000
3003
+ // }
3004
+ // ]
3005
+ // }
3006
+ // }
3007
+ //
3008
+ const data = this.safeValue (response, 'data');
3009
+ const result = this.safeValue (data, 'resultList');
3010
+ const rates = [];
3011
+ for (let i = 0; i < result.length; i++) {
3012
+ const entry = result[i];
3013
+ const marketId = this.safeString (entry, 'symbol');
3014
+ const symbol = this.safeSymbol (marketId);
3015
+ const timestamp = this.safeString (entry, 'settleTime');
3016
+ rates.push ({
3017
+ 'info': entry,
3018
+ 'symbol': symbol,
3019
+ 'fundingRate': this.safeNumber (entry, 'fundingRate'),
3020
+ 'timestamp': timestamp,
3021
+ 'datetime': this.iso8601 (timestamp),
3022
+ });
3023
+ }
3024
+ const sorted = this.sortBy (rates, 'timestamp');
3025
+ return this.filterBySymbolSinceLimit (sorted, market['symbol'], since, limit);
3026
+ }
3027
+
3028
+ async fetchLeverageTiers (symbols = undefined, params = {}) {
3029
+ await this.loadMarkets ();
3030
+ const response = await this.contractPublicGetDetail (params);
3031
+ //
3032
+ // {
3033
+ // "success":true,
3034
+ // "code":0,
3035
+ // "data":[
3036
+ // {
3037
+ // "symbol": "BTC_USDT",
3038
+ // "displayName": "BTC_USDT永续",
3039
+ // "displayNameEn": "BTC_USDT SWAP",
3040
+ // "positionOpenType": 3,
3041
+ // "baseCoin": "BTC",
3042
+ // "quoteCoin": "USDT",
3043
+ // "settleCoin": "USDT",
3044
+ // "contractSize": 0.0001,
3045
+ // "minLeverage": 1,
3046
+ // "maxLeverage": 125,
3047
+ // "priceScale": 2,
3048
+ // "volScale": 0,
3049
+ // "amountScale": 4,
3050
+ // "priceUnit": 0.5,
3051
+ // "volUnit": 1,
3052
+ // "minVol": 1,
3053
+ // "maxVol": 1000000,
3054
+ // "bidLimitPriceRate": 0.1,
3055
+ // "askLimitPriceRate": 0.1,
3056
+ // "takerFeeRate": 0.0006,
3057
+ // "makerFeeRate": 0.0002,
3058
+ // "maintenanceMarginRate": 0.004,
3059
+ // "initialMarginRate": 0.008,
3060
+ // "riskBaseVol": 10000,
3061
+ // "riskIncrVol": 200000,
3062
+ // "riskIncrMmr": 0.004,
3063
+ // "riskIncrImr": 0.004,
3064
+ // "riskLevelLimit": 5,
3065
+ // "priceCoefficientVariation": 0.1,
3066
+ // "indexOrigin": ["BINANCE","GATEIO","HUOBI","MXC"],
3067
+ // "state": 0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
3068
+ // "isNew": false,
3069
+ // "isHot": true,
3070
+ // "isHidden": false
3071
+ // },
3072
+ // ...
3073
+ // ]
3074
+ // }
3075
+ //
3076
+ const data = this.safeValue (response, 'data');
3077
+ return this.parseLeverageTiers (data, symbols, 'symbol');
3078
+ }
3079
+
3080
+ parseMarketLeverageTiers (info, market) {
3081
+ /**
3082
+ * @ignore
3083
+ * @method
3084
+ * @param {dict} info Exchange response for 1 market
3085
+ * @param {dict} market CCXT market
3086
+ */
3087
+ //
3088
+ // {
3089
+ // "symbol": "BTC_USDT",
3090
+ // "displayName": "BTC_USDT永续",
3091
+ // "displayNameEn": "BTC_USDT SWAP",
3092
+ // "positionOpenType": 3,
3093
+ // "baseCoin": "BTC",
3094
+ // "quoteCoin": "USDT",
3095
+ // "settleCoin": "USDT",
3096
+ // "contractSize": 0.0001,
3097
+ // "minLeverage": 1,
3098
+ // "maxLeverage": 125,
3099
+ // "priceScale": 2,
3100
+ // "volScale": 0,
3101
+ // "amountScale": 4,
3102
+ // "priceUnit": 0.5,
3103
+ // "volUnit": 1,
3104
+ // "minVol": 1,
3105
+ // "maxVol": 1000000,
3106
+ // "bidLimitPriceRate": 0.1,
3107
+ // "askLimitPriceRate": 0.1,
3108
+ // "takerFeeRate": 0.0006,
3109
+ // "makerFeeRate": 0.0002,
3110
+ // "maintenanceMarginRate": 0.004,
3111
+ // "initialMarginRate": 0.008,
3112
+ // "riskBaseVol": 10000,
3113
+ // "riskIncrVol": 200000,
3114
+ // "riskIncrMmr": 0.004,
3115
+ // "riskIncrImr": 0.004,
3116
+ // "riskLevelLimit": 5,
3117
+ // "priceCoefficientVariation": 0.1,
3118
+ // "indexOrigin": ["BINANCE","GATEIO","HUOBI","MXC"],
3119
+ // "state": 0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
3120
+ // "isNew": false,
3121
+ // "isHot": true,
3122
+ // "isHidden": false
3123
+ // }
3124
+ //
3125
+ let maintenanceMarginRate = this.safeString (info, 'maintenanceMarginRate');
3126
+ let initialMarginRate = this.safeString (info, 'initialMarginRate');
3127
+ const maxVol = this.safeString (info, 'maxVol');
3128
+ const riskIncrVol = this.safeString (info, 'riskIncrVol');
3129
+ const riskIncrMmr = this.safeString (info, 'riskIncrMmr');
3130
+ const riskIncrImr = this.safeString (info, 'riskIncrImr');
3131
+ let floor = '0';
3132
+ const tiers = [];
3133
+ const quoteId = this.safeString (info, 'quoteCoin');
3134
+ while (Precise.stringLt (floor, maxVol)) {
3135
+ const cap = Precise.stringAdd (floor, riskIncrVol);
3136
+ tiers.push ({
3137
+ 'tier': this.parseNumber (Precise.stringDiv (cap, riskIncrVol)),
3138
+ 'currency': this.safeCurrencyCode (quoteId),
3139
+ 'minNotional': this.parseNumber (floor),
3140
+ 'maxNotional': this.parseNumber (cap),
3141
+ 'maintenanceMarginRate': this.parseNumber (maintenanceMarginRate),
3142
+ 'maxLeverage': this.parseNumber (Precise.stringDiv ('1', initialMarginRate)),
3143
+ 'info': info,
3144
+ });
3145
+ initialMarginRate = Precise.stringAdd (initialMarginRate, riskIncrImr);
3146
+ maintenanceMarginRate = Precise.stringAdd (maintenanceMarginRate, riskIncrMmr);
3147
+ floor = cap;
3148
+ }
3149
+ return tiers;
3150
+ }
3151
+ };