ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3205 -937
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1525 -573
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +223 -97
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3205 -937
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1525 -573
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +223 -97
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +143 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/top_level.txt +0 -0
@@ -7,9 +7,10 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.gemini import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
+ from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import PermissionDenied
14
15
  from ccxt.base.errors import ArgumentsRequired
15
16
  from ccxt.base.errors import BadRequest
@@ -21,7 +22,6 @@ from ccxt.base.errors import RateLimitExceeded
21
22
  from ccxt.base.errors import ExchangeNotAvailable
22
23
  from ccxt.base.errors import OnMaintenance
23
24
  from ccxt.base.errors import InvalidNonce
24
- from ccxt.base.errors import AuthenticationError
25
25
  from ccxt.base.decimal_to_precision import TICK_SIZE
26
26
  from ccxt.base.precise import Precise
27
27
 
@@ -62,6 +62,7 @@ class gemini(Exchange, ImplicitAPI):
62
62
  'fetchCrossBorrowRates': False,
63
63
  'fetchCurrencies': True,
64
64
  'fetchDepositAddress': True,
65
+ 'fetchDepositAddresses': False,
65
66
  'fetchDepositAddressesByNetwork': True,
66
67
  'fetchDepositsWithdrawals': True,
67
68
  'fetchFundingHistory': False,
@@ -96,6 +97,7 @@ class gemini(Exchange, ImplicitAPI):
96
97
  'fetchTransactions': 'emulated',
97
98
  'postOnly': True,
98
99
  'reduceMargin': False,
100
+ 'sandbox': True,
99
101
  'setLeverage': False,
100
102
  'setMarginMode': False,
101
103
  'setPositionMode': False,
@@ -122,6 +124,7 @@ class gemini(Exchange, ImplicitAPI):
122
124
  # https://github.com/ccxt/ccxt/issues/7874
123
125
  # https://github.com/ccxt/ccxt/issues/7894
124
126
  'web': 'https://docs.gemini.com',
127
+ 'webExchange': 'https://exchange.gemini.com',
125
128
  },
126
129
  'fees': [
127
130
  'https://gemini.com/api-fee-schedule',
@@ -198,6 +201,7 @@ class gemini(Exchange, ImplicitAPI):
198
201
  'v1/account/create': 1,
199
202
  'v1/account/list': 1,
200
203
  'v1/heartbeat': 1,
204
+ 'v1/roles': 1,
201
205
  },
202
206
  },
203
207
  },
@@ -264,6 +268,7 @@ class gemini(Exchange, ImplicitAPI):
264
268
  'broad': {
265
269
  'The Gemini Exchange is currently undergoing maintenance.': OnMaintenance, # The Gemini Exchange is currently undergoing maintenance. Please check https://status.gemini.com/ for more information.
266
270
  'We are investigating technical issues with the Gemini Exchange.': ExchangeNotAvailable, # We are investigating technical issues with the Gemini Exchange. Please check https://status.gemini.com/ for more information.
271
+ 'Internal Server Error': ExchangeNotAvailable,
267
272
  },
268
273
  },
269
274
  'options': {
@@ -298,11 +303,80 @@ class gemini(Exchange, ImplicitAPI):
298
303
  'ATOM': 'cosmos',
299
304
  'DOT': 'polkadot',
300
305
  },
301
- 'nonce': 'milliseconds', # if getting a Network 400 error change to seconds
306
+ 'nonce': 'milliseconds', # if getting a Network 400 error change to seconds,
307
+ 'conflictingMarkets': {
308
+ 'paxgusd': {
309
+ 'base': 'PAXG',
310
+ 'quote': 'USD',
311
+ },
312
+ },
313
+ },
314
+ 'features': {
315
+ 'default': {
316
+ 'sandbox': True,
317
+ 'createOrder': {
318
+ 'marginMode': False,
319
+ 'triggerPrice': True,
320
+ 'triggerPriceType': None,
321
+ 'triggerDirection': False,
322
+ 'stopLossPrice': False, # todo
323
+ 'takeProfitPrice': False, # todo
324
+ 'attachedStopLossTakeProfit': None,
325
+ 'timeInForce': {
326
+ 'IOC': True,
327
+ 'FOK': True,
328
+ 'PO': True,
329
+ 'GTD': False,
330
+ },
331
+ 'hedged': False,
332
+ 'trailing': False,
333
+ 'leverage': False,
334
+ 'marketBuyByCost': True,
335
+ 'marketBuyRequiresPrice': False,
336
+ 'selfTradePrevention': False,
337
+ 'iceberg': False,
338
+ },
339
+ 'createOrders': None,
340
+ 'fetchMyTrades': {
341
+ 'marginMode': False,
342
+ 'limit': 500,
343
+ 'daysBack': None,
344
+ 'untilDays': None,
345
+ },
346
+ 'fetchOrder': {
347
+ 'marginMode': False,
348
+ 'trigger': False,
349
+ 'trailing': False,
350
+ },
351
+ 'fetchOpenOrders': {
352
+ 'marginMode': False,
353
+ 'limit': None,
354
+ 'trigger': False,
355
+ 'trailing': False,
356
+ },
357
+ 'fetchOrders': None,
358
+ 'fetchClosedOrders': None, # todo: implement
359
+ 'fetchOHLCV': {
360
+ 'limit': None,
361
+ },
362
+ },
363
+ 'spot': {
364
+ 'extends': 'default',
365
+ },
366
+ 'swap': {
367
+ 'linear': {
368
+ 'extends': 'default',
369
+ },
370
+ 'inverse': None,
371
+ },
372
+ 'future': {
373
+ 'linear': None,
374
+ 'inverse': None,
375
+ },
302
376
  },
303
377
  })
304
378
 
305
- async def fetch_currencies(self, params={}):
379
+ async def fetch_currencies(self, params={}) -> Currencies:
306
380
  """
307
381
  fetches all available currencies on an exchange
308
382
  :param dict [params]: extra parameters specific to the endpoint
@@ -312,7 +386,7 @@ class gemini(Exchange, ImplicitAPI):
312
386
 
313
387
  async def fetch_currencies_from_web(self, params={}):
314
388
  """
315
- * @ignore
389
+ @ignore
316
390
  fetches all available currencies on an exchange
317
391
  :param dict [params]: extra parameters specific to the endpoint
318
392
  :returns dict: an associative dictionary of currencies
@@ -340,7 +414,7 @@ class gemini(Exchange, ImplicitAPI):
340
414
  # ]
341
415
  # }
342
416
  #
343
- result = {}
417
+ result: dict = {}
344
418
  self.options['tradingPairs'] = self.safe_list(data, 'tradingPairs')
345
419
  currenciesArray = self.safe_value(data, 'currencies', [])
346
420
  for i in range(0, len(currenciesArray)):
@@ -349,7 +423,7 @@ class gemini(Exchange, ImplicitAPI):
349
423
  code = self.safe_currency_code(id)
350
424
  type = 'fiat' if self.safe_string(currency, 7) else 'crypto'
351
425
  precision = self.parse_number(self.parse_precision(self.safe_string(currency, 5)))
352
- networks = {}
426
+ networks: dict = {}
353
427
  networkId = self.safe_string(currency, 9)
354
428
  networkCode = None
355
429
  if networkId is not None:
@@ -400,10 +474,12 @@ class gemini(Exchange, ImplicitAPI):
400
474
  }
401
475
  return result
402
476
 
403
- async def fetch_markets(self, params={}):
477
+ async def fetch_markets(self, params={}) -> List[Market]:
404
478
  """
405
479
  retrieves data on all markets for gemini
406
- :see: https://docs.gemini.com/rest-api/#symbols
480
+
481
+ https://docs.gemini.com/rest-api/#symbols
482
+
407
483
  :param dict [params]: extra parameters specific to the exchange API endpoint
408
484
  :returns dict[]: an array of objects representing market data
409
485
  """
@@ -443,6 +519,7 @@ class gemini(Exchange, ImplicitAPI):
443
519
  # '</tr>'
444
520
  # ]
445
521
  marketId = cells[0].replace('<td>', '')
522
+ marketId = marketId.replace('*', '')
446
523
  # base = self.safe_currency_code(baseId)
447
524
  minAmountString = cells[1].replace('<td>', '')
448
525
  minAmountParts = minAmountString.split(' ')
@@ -509,7 +586,7 @@ class gemini(Exchange, ImplicitAPI):
509
586
  return result
510
587
 
511
588
  def parse_market_active(self, status):
512
- statuses = {
589
+ statuses: dict = {
513
590
  'open': True,
514
591
  'closed': False,
515
592
  'cancel_only': True,
@@ -529,7 +606,7 @@ class gemini(Exchange, ImplicitAPI):
529
606
  result = []
530
607
  for i in range(0, len(fetchUsdtMarkets)):
531
608
  marketId = fetchUsdtMarkets[i]
532
- request = {
609
+ request: dict = {
533
610
  'symbol': marketId,
534
611
  }
535
612
  # don't use Promise.all here, for some reason the exchange can't handle it and crashes
@@ -557,7 +634,7 @@ class gemini(Exchange, ImplicitAPI):
557
634
  promises = []
558
635
  for i in range(0, len(marketIds)):
559
636
  marketId = marketIds[i]
560
- request = {
637
+ request: dict = {
561
638
  'symbol': marketId,
562
639
  }
563
640
  promises.append(self.publicGetV1SymbolsDetailsSymbol(self.extend(request, params)))
@@ -629,7 +706,7 @@ class gemini(Exchange, ImplicitAPI):
629
706
  quoteId = None
630
707
  settleId = None
631
708
  tickSize = None
632
- increment = None
709
+ amountPrecision = None
633
710
  minSize = None
634
711
  status = None
635
712
  swap = False
@@ -640,9 +717,9 @@ class gemini(Exchange, ImplicitAPI):
640
717
  isArray = (isinstance(response, list))
641
718
  if not isString and not isArray:
642
719
  marketId = self.safe_string_lower(response, 'symbol')
720
+ amountPrecision = self.safe_number(response, 'tick_size') # right, exchange has an imperfect naming and self turns out to be an amount-precision
721
+ tickSize = self.safe_number(response, 'quote_increment') # self is tick-size actually
643
722
  minSize = self.safe_number(response, 'min_order_size')
644
- tickSize = self.safe_number(response, 'tick_size')
645
- increment = self.safe_number(response, 'quote_increment')
646
723
  status = self.parse_market_active(self.safe_string(response, 'status'))
647
724
  baseId = self.safe_string(response, 'base_currency')
648
725
  quoteId = self.safe_string(response, 'quote_currency')
@@ -653,21 +730,31 @@ class gemini(Exchange, ImplicitAPI):
653
730
  marketId = response
654
731
  else:
655
732
  marketId = self.safe_string_lower(response, 0)
656
- minSize = self.safe_number(response, 3)
657
- tickSize = self.parse_number(self.parse_precision(self.safe_string(response, 1)))
658
- increment = self.parse_number(self.parse_precision(self.safe_string(response, 2)))
733
+ tickSize = self.parse_number(self.parse_precision(self.safe_string(response, 1))) # priceTickDecimalPlaces
734
+ amountPrecision = self.parse_number(self.parse_precision(self.safe_string(response, 2))) # quantityTickDecimalPlaces
735
+ minSize = self.safe_number(response, 3) # quantityMinimum
659
736
  marketIdUpper = marketId.upper()
660
737
  isPerp = (marketIdUpper.find('PERP') >= 0)
661
738
  marketIdWithoutPerp = marketIdUpper.replace('PERP', '')
662
- quoteQurrencies = self.handle_option('fetchMarketsFromAPI', 'quoteCurrencies', [])
663
- for i in range(0, len(quoteQurrencies)):
664
- quoteCurrency = quoteQurrencies[i]
665
- if marketIdWithoutPerp.endswith(quoteCurrency):
666
- baseId = marketIdWithoutPerp.replace(quoteCurrency, '')
667
- quoteId = quoteCurrency
668
- if isPerp:
669
- settleId = quoteCurrency # always same
670
- break
739
+ conflictingMarkets = self.safe_dict(self.options, 'conflictingMarkets', {})
740
+ lowerCaseId = marketIdWithoutPerp.lower()
741
+ if lowerCaseId in conflictingMarkets:
742
+ conflictingMarket = conflictingMarkets[lowerCaseId]
743
+ baseId = conflictingMarket['base']
744
+ quoteId = conflictingMarket['quote']
745
+ if isPerp:
746
+ settleId = conflictingMarket['quote']
747
+ else:
748
+ quoteCurrencies = self.handle_option('fetchMarketsFromAPI', 'quoteCurrencies', [])
749
+ for i in range(0, len(quoteCurrencies)):
750
+ quoteCurrency = quoteCurrencies[i]
751
+ if marketIdWithoutPerp.endswith(quoteCurrency):
752
+ quoteLength = self.parse_to_int(-1 * len(quoteCurrency))
753
+ baseId = marketIdWithoutPerp[0:quoteLength]
754
+ quoteId = quoteCurrency
755
+ if isPerp:
756
+ settleId = quoteCurrency # always same
757
+ break
671
758
  base = self.safe_currency_code(baseId)
672
759
  quote = self.safe_currency_code(quoteId)
673
760
  settle = self.safe_currency_code(settleId)
@@ -704,8 +791,8 @@ class gemini(Exchange, ImplicitAPI):
704
791
  'strike': None,
705
792
  'optionType': None,
706
793
  'precision': {
707
- 'price': increment,
708
- 'amount': tickSize,
794
+ 'price': tickSize,
795
+ 'amount': amountPrecision,
709
796
  },
710
797
  'limits': {
711
798
  'leverage': {
@@ -732,7 +819,9 @@ class gemini(Exchange, ImplicitAPI):
732
819
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
733
820
  """
734
821
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
735
- :see: https://docs.gemini.com/rest-api/#current-order-book
822
+
823
+ https://docs.gemini.com/rest-api/#current-order-book
824
+
736
825
  :param str symbol: unified symbol of the market to fetch the order book for
737
826
  :param int [limit]: the maximum amount of order book entries to return
738
827
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -740,7 +829,7 @@ class gemini(Exchange, ImplicitAPI):
740
829
  """
741
830
  await self.load_markets()
742
831
  market = self.market(symbol)
743
- request = {
832
+ request: dict = {
744
833
  'symbol': market['id'],
745
834
  }
746
835
  if limit is not None:
@@ -752,7 +841,7 @@ class gemini(Exchange, ImplicitAPI):
752
841
  async def fetch_ticker_v1(self, symbol: str, params={}):
753
842
  await self.load_markets()
754
843
  market = self.market(symbol)
755
- request = {
844
+ request: dict = {
756
845
  'symbol': market['id'],
757
846
  }
758
847
  response = await self.publicGetV1PubtickerSymbol(self.extend(request, params))
@@ -773,7 +862,7 @@ class gemini(Exchange, ImplicitAPI):
773
862
  async def fetch_ticker_v2(self, symbol: str, params={}):
774
863
  await self.load_markets()
775
864
  market = self.market(symbol)
776
- request = {
865
+ request: dict = {
777
866
  'symbol': market['id'],
778
867
  }
779
868
  response = await self.publicGetV2TickerSymbol(self.extend(request, params))
@@ -793,8 +882,9 @@ class gemini(Exchange, ImplicitAPI):
793
882
  return self.parse_ticker(response, market)
794
883
 
795
884
  async def fetch_ticker_v1_and_v2(self, symbol: str, params={}):
796
- tickerA = await self.fetch_ticker_v1(symbol, params)
797
- tickerB = await self.fetch_ticker_v2(symbol, params)
885
+ tickerPromiseA = self.fetch_ticker_v1(symbol, params)
886
+ tickerPromiseB = self.fetch_ticker_v2(symbol, params)
887
+ tickerA, tickerB = await asyncio.gather(*[tickerPromiseA, tickerPromiseB])
798
888
  return self.deep_extend(tickerA, {
799
889
  'open': tickerB['open'],
800
890
  'high': tickerB['high'],
@@ -808,11 +898,13 @@ class gemini(Exchange, ImplicitAPI):
808
898
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
809
899
  """
810
900
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
811
- :see: https://docs.gemini.com/rest-api/#ticker
812
- :see: https://docs.gemini.com/rest-api/#ticker-v2
901
+
902
+ https://docs.gemini.com/rest-api/#ticker
903
+ https://docs.gemini.com/rest-api/#ticker-v2
904
+
813
905
  :param str symbol: unified symbol of the market to fetch the ticker for
814
906
  :param dict [params]: extra parameters specific to the exchange API endpoint
815
- :param dict [params.fetchTickerMethod]: 'fetchTickerV2', 'fetchTickerV1' or 'fetchTickerV1AndV2' - 'fetchTickerV1' for original ccxt.gemini.fetch_ticker- 'fetchTickerV1AndV2' for 2 api calls to get the result of both fetchTicker methods - default = 'fetchTickerV1'
907
+ :param dict [params.fetchTickerMethod]: 'fetchTickerV2', 'fetchTickerV1' or 'fetchTickerV1AndV2' - 'fetchTickerV1' for original ccxt.gemini.fetchTicker - 'fetchTickerV1AndV2' for 2 api calls to get the result of both fetchTicker methods - default = 'fetchTickerV1'
816
908
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
817
909
  """
818
910
  method = self.safe_value(self.options, 'fetchTickerMethod', 'fetchTickerV1')
@@ -822,7 +914,7 @@ class gemini(Exchange, ImplicitAPI):
822
914
  return await self.fetch_ticker_v2(symbol, params)
823
915
  return await self.fetch_ticker_v1_and_v2(symbol, params)
824
916
 
825
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
917
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
826
918
  #
827
919
  # fetchTickers
828
920
  #
@@ -915,7 +1007,9 @@ class gemini(Exchange, ImplicitAPI):
915
1007
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
916
1008
  """
917
1009
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
918
- :see: https://docs.gemini.com/rest-api/#price-feed
1010
+
1011
+ https://docs.gemini.com/rest-api/#price-feed
1012
+
919
1013
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
920
1014
  :param dict [params]: extra parameters specific to the exchange API endpoint
921
1015
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -938,7 +1032,7 @@ class gemini(Exchange, ImplicitAPI):
938
1032
  #
939
1033
  return self.parse_tickers(response, symbols)
940
1034
 
941
- def parse_trade(self, trade, market: Market = None) -> Trade:
1035
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
942
1036
  #
943
1037
  # public fetchTrades
944
1038
  #
@@ -1004,7 +1098,9 @@ class gemini(Exchange, ImplicitAPI):
1004
1098
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1005
1099
  """
1006
1100
  get the list of most recent trades for a particular symbol
1007
- :see: https://docs.gemini.com/rest-api/#trade-history
1101
+
1102
+ https://docs.gemini.com/rest-api/#trade-history
1103
+
1008
1104
  :param str symbol: unified symbol of the market to fetch trades for
1009
1105
  :param int [since]: timestamp in ms of the earliest trade to fetch
1010
1106
  :param int [limit]: the maximum amount of trades to fetch
@@ -1013,7 +1109,7 @@ class gemini(Exchange, ImplicitAPI):
1013
1109
  """
1014
1110
  await self.load_markets()
1015
1111
  market = self.market(symbol)
1016
- request = {
1112
+ request: dict = {
1017
1113
  'symbol': market['id'],
1018
1114
  }
1019
1115
  if limit is not None:
@@ -1037,7 +1133,7 @@ class gemini(Exchange, ImplicitAPI):
1037
1133
  return self.parse_trades(response, market, since, limit)
1038
1134
 
1039
1135
  def parse_balance(self, response) -> Balances:
1040
- result = {'info': response}
1136
+ result: dict = {'info': response}
1041
1137
  for i in range(0, len(response)):
1042
1138
  balance = response[i]
1043
1139
  currencyId = self.safe_string(balance, 'currency')
@@ -1048,10 +1144,12 @@ class gemini(Exchange, ImplicitAPI):
1048
1144
  result[code] = account
1049
1145
  return self.safe_balance(result)
1050
1146
 
1051
- async def fetch_trading_fees(self, params={}):
1147
+ async def fetch_trading_fees(self, params={}) -> TradingFees:
1052
1148
  """
1053
1149
  fetch the trading fees for multiple markets
1054
- :see: https://docs.gemini.com/rest-api/#get-notional-volume
1150
+
1151
+ https://docs.gemini.com/rest-api/#get-notional-volume
1152
+
1055
1153
  :param dict [params]: extra parameters specific to the exchange API endpoint
1056
1154
  :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
1057
1155
  """
@@ -1091,7 +1189,7 @@ class gemini(Exchange, ImplicitAPI):
1091
1189
  takerString = Precise.string_div(takerBps, '10000')
1092
1190
  maker = self.parse_number(makerString)
1093
1191
  taker = self.parse_number(takerString)
1094
- result = {}
1192
+ result: dict = {}
1095
1193
  for i in range(0, len(self.symbols)):
1096
1194
  symbol = self.symbols[i]
1097
1195
  result[symbol] = {
@@ -1107,7 +1205,9 @@ class gemini(Exchange, ImplicitAPI):
1107
1205
  async def fetch_balance(self, params={}) -> Balances:
1108
1206
  """
1109
1207
  query for balance and get the amount of funds available for trading or funds locked in orders
1110
- :see: https://docs.gemini.com/rest-api/#get-available-balances
1208
+
1209
+ https://docs.gemini.com/rest-api/#get-available-balances
1210
+
1111
1211
  :param dict [params]: extra parameters specific to the exchange API endpoint
1112
1212
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1113
1213
  """
@@ -1115,7 +1215,7 @@ class gemini(Exchange, ImplicitAPI):
1115
1215
  response = await self.privatePostV1Balances(params)
1116
1216
  return self.parse_balance(response)
1117
1217
 
1118
- def parse_order(self, order, market: Market = None) -> Order:
1218
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1119
1219
  #
1120
1220
  # createOrder(private)
1121
1221
  #
@@ -1264,7 +1364,6 @@ class gemini(Exchange, ImplicitAPI):
1264
1364
  'postOnly': postOnly,
1265
1365
  'side': side,
1266
1366
  'price': price,
1267
- 'stopPrice': None,
1268
1367
  'triggerPrice': None,
1269
1368
  'average': average,
1270
1369
  'cost': None,
@@ -1278,13 +1377,16 @@ class gemini(Exchange, ImplicitAPI):
1278
1377
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1279
1378
  """
1280
1379
  fetches information on an order made by the user
1281
- :see: https://docs.gemini.com/rest-api/#order-status
1380
+
1381
+ https://docs.gemini.com/rest-api/#order-status
1382
+
1383
+ :param str id: order id
1282
1384
  :param str symbol: unified symbol of the market the order was made in
1283
1385
  :param dict [params]: extra parameters specific to the exchange API endpoint
1284
1386
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1285
1387
  """
1286
1388
  await self.load_markets()
1287
- request = {
1389
+ request: dict = {
1288
1390
  'order_id': id,
1289
1391
  }
1290
1392
  response = await self.privatePostV1OrderStatus(self.extend(request, params))
@@ -1316,7 +1418,9 @@ class gemini(Exchange, ImplicitAPI):
1316
1418
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1317
1419
  """
1318
1420
  fetch all unfilled currently open orders
1319
- :see: https://docs.gemini.com/rest-api/#get-active-orders
1421
+
1422
+ https://docs.gemini.com/rest-api/#get-active-orders
1423
+
1320
1424
  :param str symbol: unified market symbol
1321
1425
  :param int [since]: the earliest time in ms to fetch open orders for
1322
1426
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -1358,12 +1462,14 @@ class gemini(Exchange, ImplicitAPI):
1358
1462
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1359
1463
  """
1360
1464
  create a trade order
1361
- :see: https://docs.gemini.com/rest-api/#new-order
1465
+
1466
+ https://docs.gemini.com/rest-api/#new-order
1467
+
1362
1468
  :param str symbol: unified symbol of the market to create an order in
1363
1469
  :param str type: must be 'limit'
1364
1470
  :param str side: 'buy' or 'sell'
1365
1471
  :param float amount: how much of currency you want to trade in units of base currency
1366
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1472
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1367
1473
  :param dict [params]: extra parameters specific to the exchange API endpoint
1368
1474
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1369
1475
  """
@@ -1377,7 +1483,7 @@ class gemini(Exchange, ImplicitAPI):
1377
1483
  market = self.market(symbol)
1378
1484
  amountString = self.amount_to_precision(symbol, amount)
1379
1485
  priceString = self.price_to_precision(symbol, price)
1380
- request = {
1486
+ request: dict = {
1381
1487
  'client_order_id': clientOrderId,
1382
1488
  'symbol': market['id'],
1383
1489
  'amount': amountString,
@@ -1388,12 +1494,12 @@ class gemini(Exchange, ImplicitAPI):
1388
1494
  }
1389
1495
  type = self.safe_string(params, 'type', type)
1390
1496
  params = self.omit(params, 'type')
1391
- rawStopPrice = self.safe_string_2(params, 'stop_price', 'stopPrice')
1392
- params = self.omit(params, ['stop_price', 'stopPrice', 'type'])
1497
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price', 'stopPrice'])
1498
+ params = self.omit(params, ['triggerPrice', 'stop_price', 'stopPrice', 'type'])
1393
1499
  if type == 'stopLimit':
1394
- raise ArgumentsRequired(self.id + ' createOrder() requires a stopPrice parameter or a stop_price parameter for ' + type + ' orders')
1395
- if rawStopPrice is not None:
1396
- request['stop_price'] = self.price_to_precision(symbol, rawStopPrice)
1500
+ raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter or a stop_price parameter for ' + type + ' orders')
1501
+ if triggerPrice is not None:
1502
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1397
1503
  request['type'] = 'exchange stop limit'
1398
1504
  else:
1399
1505
  # No options can be applied to stop-limit orders at self time.
@@ -1443,14 +1549,16 @@ class gemini(Exchange, ImplicitAPI):
1443
1549
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1444
1550
  """
1445
1551
  cancels an open order
1446
- :see: https://docs.gemini.com/rest-api/#cancel-order
1552
+
1553
+ https://docs.gemini.com/rest-api/#cancel-order
1554
+
1447
1555
  :param str id: order id
1448
1556
  :param str symbol: unified symbol of the market the order was made in
1449
1557
  :param dict [params]: extra parameters specific to the exchange API endpoint
1450
1558
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1451
1559
  """
1452
1560
  await self.load_markets()
1453
- request = {
1561
+ request: dict = {
1454
1562
  'order_id': id,
1455
1563
  }
1456
1564
  response = await self.privatePostV1OrderCancel(self.extend(request, params))
@@ -1483,7 +1591,9 @@ class gemini(Exchange, ImplicitAPI):
1483
1591
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1484
1592
  """
1485
1593
  fetch all trades made by the user
1486
- :see: https://docs.gemini.com/rest-api/#get-past-trades
1594
+
1595
+ https://docs.gemini.com/rest-api/#get-past-trades
1596
+
1487
1597
  :param str symbol: unified market symbol
1488
1598
  :param int [since]: the earliest time in ms to fetch trades for
1489
1599
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1494,7 +1604,7 @@ class gemini(Exchange, ImplicitAPI):
1494
1604
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
1495
1605
  await self.load_markets()
1496
1606
  market = self.market(symbol)
1497
- request = {
1607
+ request: dict = {
1498
1608
  'symbol': market['id'],
1499
1609
  }
1500
1610
  if limit is not None:
@@ -1504,10 +1614,12 @@ class gemini(Exchange, ImplicitAPI):
1504
1614
  response = await self.privatePostV1Mytrades(self.extend(request, params))
1505
1615
  return self.parse_trades(response, market, since, limit)
1506
1616
 
1507
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1617
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
1508
1618
  """
1509
1619
  make a withdrawal
1510
- :see: https://docs.gemini.com/rest-api/#withdraw-crypto-funds
1620
+
1621
+ https://docs.gemini.com/rest-api/#withdraw-crypto-funds
1622
+
1511
1623
  :param str code: unified currency code
1512
1624
  :param float amount: the amount to withdraw
1513
1625
  :param str address: the address to withdraw to
@@ -1519,7 +1631,7 @@ class gemini(Exchange, ImplicitAPI):
1519
1631
  self.check_address(address)
1520
1632
  await self.load_markets()
1521
1633
  currency = self.currency(code)
1522
- request = {
1634
+ request: dict = {
1523
1635
  'currency': currency['id'],
1524
1636
  'amount': amount,
1525
1637
  'address': address,
@@ -1562,7 +1674,9 @@ class gemini(Exchange, ImplicitAPI):
1562
1674
  async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1563
1675
  """
1564
1676
  fetch history of deposits and withdrawals
1565
- :see: https://docs.gemini.com/rest-api/#transfers
1677
+
1678
+ https://docs.gemini.com/rest-api/#transfers
1679
+
1566
1680
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1567
1681
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1568
1682
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -1570,7 +1684,7 @@ class gemini(Exchange, ImplicitAPI):
1570
1684
  :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1571
1685
  """
1572
1686
  await self.load_markets()
1573
- request = {}
1687
+ request: dict = {}
1574
1688
  if limit is not None:
1575
1689
  request['limit_transfers'] = limit
1576
1690
  if since is not None:
@@ -1578,7 +1692,7 @@ class gemini(Exchange, ImplicitAPI):
1578
1692
  response = await self.privatePostV1Transfers(self.extend(request, params))
1579
1693
  return self.parse_transactions(response)
1580
1694
 
1581
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1695
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1582
1696
  #
1583
1697
  # withdraw
1584
1698
  #
@@ -1634,8 +1748,8 @@ class gemini(Exchange, ImplicitAPI):
1634
1748
  'fee': fee,
1635
1749
  }
1636
1750
 
1637
- def parse_transaction_status(self, status):
1638
- statuses = {
1751
+ def parse_transaction_status(self, status: Str):
1752
+ statuses: dict = {
1639
1753
  'Advanced': 'ok',
1640
1754
  'Complete': 'ok',
1641
1755
  }
@@ -1659,9 +1773,11 @@ class gemini(Exchange, ImplicitAPI):
1659
1773
  'info': depositAddress,
1660
1774
  }
1661
1775
 
1662
- async def fetch_deposit_address(self, code: str, params={}):
1776
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1663
1777
  """
1664
- :see: https://docs.gemini.com/rest-api/#get-deposit-addresses
1778
+
1779
+ https://docs.gemini.com/rest-api/#get-deposit-addresses
1780
+
1665
1781
  fetch the deposit address for a currency associated with self account
1666
1782
  :param str code: unified currency code
1667
1783
  :param dict [params]: extra parameters specific to the endpoint
@@ -1675,10 +1791,12 @@ class gemini(Exchange, ImplicitAPI):
1675
1791
  networkGroup = self.index_by(self.safe_value(groupedByNetwork, networkCode), 'currency')
1676
1792
  return self.safe_value(networkGroup, code)
1677
1793
 
1678
- async def fetch_deposit_addresses_by_network(self, code: str, params={}):
1794
+ async def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
1679
1795
  """
1680
1796
  fetch a dictionary of addresses for a currency, indexed by network
1681
- :see: https://docs.gemini.com/rest-api/#get-deposit-addresses
1797
+
1798
+ https://docs.gemini.com/rest-api/#get-deposit-addresses
1799
+
1682
1800
  :param str code: unified currency code of the currency for the deposit address
1683
1801
  :param dict [params]: extra parameters specific to the exchange API endpoint
1684
1802
  :param str [params.network]: *required* The chain of currency
@@ -1692,7 +1810,7 @@ class gemini(Exchange, ImplicitAPI):
1692
1810
  if networkCode is None:
1693
1811
  raise ArgumentsRequired(self.id + ' fetchDepositAddresses() requires a network parameter')
1694
1812
  networkId = self.network_code_to_id(networkCode)
1695
- request = {
1813
+ request: dict = {
1696
1814
  'network': networkId,
1697
1815
  }
1698
1816
  response = await self.privatePostV1AddressesNetwork(self.extend(request, params))
@@ -1707,7 +1825,7 @@ class gemini(Exchange, ImplicitAPI):
1707
1825
  apiKey = self.apiKey
1708
1826
  if apiKey.find('account') < 0:
1709
1827
  raise AuthenticationError(self.id + ' sign() requires an account-key, master-keys are not-supported')
1710
- nonce = self.nonce()
1828
+ nonce = str(self.nonce())
1711
1829
  request = self.extend({
1712
1830
  'request': url,
1713
1831
  'nonce': nonce,
@@ -1729,7 +1847,7 @@ class gemini(Exchange, ImplicitAPI):
1729
1847
  body = self.json(query)
1730
1848
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1731
1849
 
1732
- def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
1850
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1733
1851
  if response is None:
1734
1852
  if isinstance(body, str):
1735
1853
  feedback = self.id + ' ' + body
@@ -1756,14 +1874,16 @@ class gemini(Exchange, ImplicitAPI):
1756
1874
  async def create_deposit_address(self, code: str, params={}):
1757
1875
  """
1758
1876
  create a currency deposit address
1759
- :see: https://docs.gemini.com/rest-api/#new-deposit-address
1877
+
1878
+ https://docs.gemini.com/rest-api/#new-deposit-address
1879
+
1760
1880
  :param str code: unified currency code of the currency for the deposit address
1761
1881
  :param dict [params]: extra parameters specific to the exchange API endpoint
1762
1882
  :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1763
1883
  """
1764
1884
  await self.load_markets()
1765
1885
  currency = self.currency(code)
1766
- request = {
1886
+ request: dict = {
1767
1887
  'currency': currency['id'],
1768
1888
  }
1769
1889
  response = await self.privatePostV1DepositCurrencyNewAddress(self.extend(request, params))
@@ -1779,7 +1899,9 @@ class gemini(Exchange, ImplicitAPI):
1779
1899
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1780
1900
  """
1781
1901
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1782
- :see: https://docs.gemini.com/rest-api/#candles
1902
+
1903
+ https://docs.gemini.com/rest-api/#candles
1904
+
1783
1905
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1784
1906
  :param str timeframe: the length of time each candle represents
1785
1907
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1790,7 +1912,7 @@ class gemini(Exchange, ImplicitAPI):
1790
1912
  await self.load_markets()
1791
1913
  market = self.market(symbol)
1792
1914
  timeframeId = self.safe_string(self.timeframes, timeframe, timeframe)
1793
- request = {
1915
+ request: dict = {
1794
1916
  'timeframe': timeframeId,
1795
1917
  'symbol': market['id'],
1796
1918
  }