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
ccxt/gemini.py CHANGED
@@ -6,9 +6,10 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.gemini import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
12
13
  from ccxt.base.errors import PermissionDenied
13
14
  from ccxt.base.errors import ArgumentsRequired
14
15
  from ccxt.base.errors import BadRequest
@@ -20,7 +21,6 @@ from ccxt.base.errors import RateLimitExceeded
20
21
  from ccxt.base.errors import ExchangeNotAvailable
21
22
  from ccxt.base.errors import OnMaintenance
22
23
  from ccxt.base.errors import InvalidNonce
23
- from ccxt.base.errors import AuthenticationError
24
24
  from ccxt.base.decimal_to_precision import TICK_SIZE
25
25
  from ccxt.base.precise import Precise
26
26
 
@@ -61,6 +61,7 @@ class gemini(Exchange, ImplicitAPI):
61
61
  'fetchCrossBorrowRates': False,
62
62
  'fetchCurrencies': True,
63
63
  'fetchDepositAddress': True,
64
+ 'fetchDepositAddresses': False,
64
65
  'fetchDepositAddressesByNetwork': True,
65
66
  'fetchDepositsWithdrawals': True,
66
67
  'fetchFundingHistory': False,
@@ -95,6 +96,7 @@ class gemini(Exchange, ImplicitAPI):
95
96
  'fetchTransactions': 'emulated',
96
97
  'postOnly': True,
97
98
  'reduceMargin': False,
99
+ 'sandbox': True,
98
100
  'setLeverage': False,
99
101
  'setMarginMode': False,
100
102
  'setPositionMode': False,
@@ -121,6 +123,7 @@ class gemini(Exchange, ImplicitAPI):
121
123
  # https://github.com/ccxt/ccxt/issues/7874
122
124
  # https://github.com/ccxt/ccxt/issues/7894
123
125
  'web': 'https://docs.gemini.com',
126
+ 'webExchange': 'https://exchange.gemini.com',
124
127
  },
125
128
  'fees': [
126
129
  'https://gemini.com/api-fee-schedule',
@@ -197,6 +200,7 @@ class gemini(Exchange, ImplicitAPI):
197
200
  'v1/account/create': 1,
198
201
  'v1/account/list': 1,
199
202
  'v1/heartbeat': 1,
203
+ 'v1/roles': 1,
200
204
  },
201
205
  },
202
206
  },
@@ -263,6 +267,7 @@ class gemini(Exchange, ImplicitAPI):
263
267
  'broad': {
264
268
  'The Gemini Exchange is currently undergoing maintenance.': OnMaintenance, # The Gemini Exchange is currently undergoing maintenance. Please check https://status.gemini.com/ for more information.
265
269
  '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.
270
+ 'Internal Server Error': ExchangeNotAvailable,
266
271
  },
267
272
  },
268
273
  'options': {
@@ -297,11 +302,80 @@ class gemini(Exchange, ImplicitAPI):
297
302
  'ATOM': 'cosmos',
298
303
  'DOT': 'polkadot',
299
304
  },
300
- 'nonce': 'milliseconds', # if getting a Network 400 error change to seconds
305
+ 'nonce': 'milliseconds', # if getting a Network 400 error change to seconds,
306
+ 'conflictingMarkets': {
307
+ 'paxgusd': {
308
+ 'base': 'PAXG',
309
+ 'quote': 'USD',
310
+ },
311
+ },
312
+ },
313
+ 'features': {
314
+ 'default': {
315
+ 'sandbox': True,
316
+ 'createOrder': {
317
+ 'marginMode': False,
318
+ 'triggerPrice': True,
319
+ 'triggerPriceType': None,
320
+ 'triggerDirection': False,
321
+ 'stopLossPrice': False, # todo
322
+ 'takeProfitPrice': False, # todo
323
+ 'attachedStopLossTakeProfit': None,
324
+ 'timeInForce': {
325
+ 'IOC': True,
326
+ 'FOK': True,
327
+ 'PO': True,
328
+ 'GTD': False,
329
+ },
330
+ 'hedged': False,
331
+ 'trailing': False,
332
+ 'leverage': False,
333
+ 'marketBuyByCost': True,
334
+ 'marketBuyRequiresPrice': False,
335
+ 'selfTradePrevention': False,
336
+ 'iceberg': False,
337
+ },
338
+ 'createOrders': None,
339
+ 'fetchMyTrades': {
340
+ 'marginMode': False,
341
+ 'limit': 500,
342
+ 'daysBack': None,
343
+ 'untilDays': None,
344
+ },
345
+ 'fetchOrder': {
346
+ 'marginMode': False,
347
+ 'trigger': False,
348
+ 'trailing': False,
349
+ },
350
+ 'fetchOpenOrders': {
351
+ 'marginMode': False,
352
+ 'limit': None,
353
+ 'trigger': False,
354
+ 'trailing': False,
355
+ },
356
+ 'fetchOrders': None,
357
+ 'fetchClosedOrders': None, # todo: implement
358
+ 'fetchOHLCV': {
359
+ 'limit': None,
360
+ },
361
+ },
362
+ 'spot': {
363
+ 'extends': 'default',
364
+ },
365
+ 'swap': {
366
+ 'linear': {
367
+ 'extends': 'default',
368
+ },
369
+ 'inverse': None,
370
+ },
371
+ 'future': {
372
+ 'linear': None,
373
+ 'inverse': None,
374
+ },
301
375
  },
302
376
  })
303
377
 
304
- def fetch_currencies(self, params={}):
378
+ def fetch_currencies(self, params={}) -> Currencies:
305
379
  """
306
380
  fetches all available currencies on an exchange
307
381
  :param dict [params]: extra parameters specific to the endpoint
@@ -311,7 +385,7 @@ class gemini(Exchange, ImplicitAPI):
311
385
 
312
386
  def fetch_currencies_from_web(self, params={}):
313
387
  """
314
- * @ignore
388
+ @ignore
315
389
  fetches all available currencies on an exchange
316
390
  :param dict [params]: extra parameters specific to the endpoint
317
391
  :returns dict: an associative dictionary of currencies
@@ -339,7 +413,7 @@ class gemini(Exchange, ImplicitAPI):
339
413
  # ]
340
414
  # }
341
415
  #
342
- result = {}
416
+ result: dict = {}
343
417
  self.options['tradingPairs'] = self.safe_list(data, 'tradingPairs')
344
418
  currenciesArray = self.safe_value(data, 'currencies', [])
345
419
  for i in range(0, len(currenciesArray)):
@@ -348,7 +422,7 @@ class gemini(Exchange, ImplicitAPI):
348
422
  code = self.safe_currency_code(id)
349
423
  type = 'fiat' if self.safe_string(currency, 7) else 'crypto'
350
424
  precision = self.parse_number(self.parse_precision(self.safe_string(currency, 5)))
351
- networks = {}
425
+ networks: dict = {}
352
426
  networkId = self.safe_string(currency, 9)
353
427
  networkCode = None
354
428
  if networkId is not None:
@@ -399,10 +473,12 @@ class gemini(Exchange, ImplicitAPI):
399
473
  }
400
474
  return result
401
475
 
402
- def fetch_markets(self, params={}):
476
+ def fetch_markets(self, params={}) -> List[Market]:
403
477
  """
404
478
  retrieves data on all markets for gemini
405
- :see: https://docs.gemini.com/rest-api/#symbols
479
+
480
+ https://docs.gemini.com/rest-api/#symbols
481
+
406
482
  :param dict [params]: extra parameters specific to the exchange API endpoint
407
483
  :returns dict[]: an array of objects representing market data
408
484
  """
@@ -442,6 +518,7 @@ class gemini(Exchange, ImplicitAPI):
442
518
  # '</tr>'
443
519
  # ]
444
520
  marketId = cells[0].replace('<td>', '')
521
+ marketId = marketId.replace('*', '')
445
522
  # base = self.safe_currency_code(baseId)
446
523
  minAmountString = cells[1].replace('<td>', '')
447
524
  minAmountParts = minAmountString.split(' ')
@@ -508,7 +585,7 @@ class gemini(Exchange, ImplicitAPI):
508
585
  return result
509
586
 
510
587
  def parse_market_active(self, status):
511
- statuses = {
588
+ statuses: dict = {
512
589
  'open': True,
513
590
  'closed': False,
514
591
  'cancel_only': True,
@@ -528,7 +605,7 @@ class gemini(Exchange, ImplicitAPI):
528
605
  result = []
529
606
  for i in range(0, len(fetchUsdtMarkets)):
530
607
  marketId = fetchUsdtMarkets[i]
531
- request = {
608
+ request: dict = {
532
609
  'symbol': marketId,
533
610
  }
534
611
  # don't use Promise.all here, for some reason the exchange can't handle it and crashes
@@ -556,7 +633,7 @@ class gemini(Exchange, ImplicitAPI):
556
633
  promises = []
557
634
  for i in range(0, len(marketIds)):
558
635
  marketId = marketIds[i]
559
- request = {
636
+ request: dict = {
560
637
  'symbol': marketId,
561
638
  }
562
639
  promises.append(self.publicGetV1SymbolsDetailsSymbol(self.extend(request, params)))
@@ -628,7 +705,7 @@ class gemini(Exchange, ImplicitAPI):
628
705
  quoteId = None
629
706
  settleId = None
630
707
  tickSize = None
631
- increment = None
708
+ amountPrecision = None
632
709
  minSize = None
633
710
  status = None
634
711
  swap = False
@@ -639,9 +716,9 @@ class gemini(Exchange, ImplicitAPI):
639
716
  isArray = (isinstance(response, list))
640
717
  if not isString and not isArray:
641
718
  marketId = self.safe_string_lower(response, 'symbol')
719
+ amountPrecision = self.safe_number(response, 'tick_size') # right, exchange has an imperfect naming and self turns out to be an amount-precision
720
+ tickSize = self.safe_number(response, 'quote_increment') # self is tick-size actually
642
721
  minSize = self.safe_number(response, 'min_order_size')
643
- tickSize = self.safe_number(response, 'tick_size')
644
- increment = self.safe_number(response, 'quote_increment')
645
722
  status = self.parse_market_active(self.safe_string(response, 'status'))
646
723
  baseId = self.safe_string(response, 'base_currency')
647
724
  quoteId = self.safe_string(response, 'quote_currency')
@@ -652,21 +729,31 @@ class gemini(Exchange, ImplicitAPI):
652
729
  marketId = response
653
730
  else:
654
731
  marketId = self.safe_string_lower(response, 0)
655
- minSize = self.safe_number(response, 3)
656
- tickSize = self.parse_number(self.parse_precision(self.safe_string(response, 1)))
657
- increment = self.parse_number(self.parse_precision(self.safe_string(response, 2)))
732
+ tickSize = self.parse_number(self.parse_precision(self.safe_string(response, 1))) # priceTickDecimalPlaces
733
+ amountPrecision = self.parse_number(self.parse_precision(self.safe_string(response, 2))) # quantityTickDecimalPlaces
734
+ minSize = self.safe_number(response, 3) # quantityMinimum
658
735
  marketIdUpper = marketId.upper()
659
736
  isPerp = (marketIdUpper.find('PERP') >= 0)
660
737
  marketIdWithoutPerp = marketIdUpper.replace('PERP', '')
661
- quoteQurrencies = self.handle_option('fetchMarketsFromAPI', 'quoteCurrencies', [])
662
- for i in range(0, len(quoteQurrencies)):
663
- quoteCurrency = quoteQurrencies[i]
664
- if marketIdWithoutPerp.endswith(quoteCurrency):
665
- baseId = marketIdWithoutPerp.replace(quoteCurrency, '')
666
- quoteId = quoteCurrency
667
- if isPerp:
668
- settleId = quoteCurrency # always same
669
- break
738
+ conflictingMarkets = self.safe_dict(self.options, 'conflictingMarkets', {})
739
+ lowerCaseId = marketIdWithoutPerp.lower()
740
+ if lowerCaseId in conflictingMarkets:
741
+ conflictingMarket = conflictingMarkets[lowerCaseId]
742
+ baseId = conflictingMarket['base']
743
+ quoteId = conflictingMarket['quote']
744
+ if isPerp:
745
+ settleId = conflictingMarket['quote']
746
+ else:
747
+ quoteCurrencies = self.handle_option('fetchMarketsFromAPI', 'quoteCurrencies', [])
748
+ for i in range(0, len(quoteCurrencies)):
749
+ quoteCurrency = quoteCurrencies[i]
750
+ if marketIdWithoutPerp.endswith(quoteCurrency):
751
+ quoteLength = self.parse_to_int(-1 * len(quoteCurrency))
752
+ baseId = marketIdWithoutPerp[0:quoteLength]
753
+ quoteId = quoteCurrency
754
+ if isPerp:
755
+ settleId = quoteCurrency # always same
756
+ break
670
757
  base = self.safe_currency_code(baseId)
671
758
  quote = self.safe_currency_code(quoteId)
672
759
  settle = self.safe_currency_code(settleId)
@@ -703,8 +790,8 @@ class gemini(Exchange, ImplicitAPI):
703
790
  'strike': None,
704
791
  'optionType': None,
705
792
  'precision': {
706
- 'price': increment,
707
- 'amount': tickSize,
793
+ 'price': tickSize,
794
+ 'amount': amountPrecision,
708
795
  },
709
796
  'limits': {
710
797
  'leverage': {
@@ -731,7 +818,9 @@ class gemini(Exchange, ImplicitAPI):
731
818
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
732
819
  """
733
820
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
734
- :see: https://docs.gemini.com/rest-api/#current-order-book
821
+
822
+ https://docs.gemini.com/rest-api/#current-order-book
823
+
735
824
  :param str symbol: unified symbol of the market to fetch the order book for
736
825
  :param int [limit]: the maximum amount of order book entries to return
737
826
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -739,7 +828,7 @@ class gemini(Exchange, ImplicitAPI):
739
828
  """
740
829
  self.load_markets()
741
830
  market = self.market(symbol)
742
- request = {
831
+ request: dict = {
743
832
  'symbol': market['id'],
744
833
  }
745
834
  if limit is not None:
@@ -751,7 +840,7 @@ class gemini(Exchange, ImplicitAPI):
751
840
  def fetch_ticker_v1(self, symbol: str, params={}):
752
841
  self.load_markets()
753
842
  market = self.market(symbol)
754
- request = {
843
+ request: dict = {
755
844
  'symbol': market['id'],
756
845
  }
757
846
  response = self.publicGetV1PubtickerSymbol(self.extend(request, params))
@@ -772,7 +861,7 @@ class gemini(Exchange, ImplicitAPI):
772
861
  def fetch_ticker_v2(self, symbol: str, params={}):
773
862
  self.load_markets()
774
863
  market = self.market(symbol)
775
- request = {
864
+ request: dict = {
776
865
  'symbol': market['id'],
777
866
  }
778
867
  response = self.publicGetV2TickerSymbol(self.extend(request, params))
@@ -792,8 +881,9 @@ class gemini(Exchange, ImplicitAPI):
792
881
  return self.parse_ticker(response, market)
793
882
 
794
883
  def fetch_ticker_v1_and_v2(self, symbol: str, params={}):
795
- tickerA = self.fetch_ticker_v1(symbol, params)
796
- tickerB = self.fetch_ticker_v2(symbol, params)
884
+ tickerPromiseA = self.fetch_ticker_v1(symbol, params)
885
+ tickerPromiseB = self.fetch_ticker_v2(symbol, params)
886
+ tickerA, tickerB = [tickerPromiseA, tickerPromiseB]
797
887
  return self.deep_extend(tickerA, {
798
888
  'open': tickerB['open'],
799
889
  'high': tickerB['high'],
@@ -807,11 +897,13 @@ class gemini(Exchange, ImplicitAPI):
807
897
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
808
898
  """
809
899
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
810
- :see: https://docs.gemini.com/rest-api/#ticker
811
- :see: https://docs.gemini.com/rest-api/#ticker-v2
900
+
901
+ https://docs.gemini.com/rest-api/#ticker
902
+ https://docs.gemini.com/rest-api/#ticker-v2
903
+
812
904
  :param str symbol: unified symbol of the market to fetch the ticker for
813
905
  :param dict [params]: extra parameters specific to the exchange API endpoint
814
- :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'
906
+ :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'
815
907
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
816
908
  """
817
909
  method = self.safe_value(self.options, 'fetchTickerMethod', 'fetchTickerV1')
@@ -821,7 +913,7 @@ class gemini(Exchange, ImplicitAPI):
821
913
  return self.fetch_ticker_v2(symbol, params)
822
914
  return self.fetch_ticker_v1_and_v2(symbol, params)
823
915
 
824
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
916
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
825
917
  #
826
918
  # fetchTickers
827
919
  #
@@ -914,7 +1006,9 @@ class gemini(Exchange, ImplicitAPI):
914
1006
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
915
1007
  """
916
1008
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
917
- :see: https://docs.gemini.com/rest-api/#price-feed
1009
+
1010
+ https://docs.gemini.com/rest-api/#price-feed
1011
+
918
1012
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
919
1013
  :param dict [params]: extra parameters specific to the exchange API endpoint
920
1014
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -937,7 +1031,7 @@ class gemini(Exchange, ImplicitAPI):
937
1031
  #
938
1032
  return self.parse_tickers(response, symbols)
939
1033
 
940
- def parse_trade(self, trade, market: Market = None) -> Trade:
1034
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
941
1035
  #
942
1036
  # public fetchTrades
943
1037
  #
@@ -1003,7 +1097,9 @@ class gemini(Exchange, ImplicitAPI):
1003
1097
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1004
1098
  """
1005
1099
  get the list of most recent trades for a particular symbol
1006
- :see: https://docs.gemini.com/rest-api/#trade-history
1100
+
1101
+ https://docs.gemini.com/rest-api/#trade-history
1102
+
1007
1103
  :param str symbol: unified symbol of the market to fetch trades for
1008
1104
  :param int [since]: timestamp in ms of the earliest trade to fetch
1009
1105
  :param int [limit]: the maximum amount of trades to fetch
@@ -1012,7 +1108,7 @@ class gemini(Exchange, ImplicitAPI):
1012
1108
  """
1013
1109
  self.load_markets()
1014
1110
  market = self.market(symbol)
1015
- request = {
1111
+ request: dict = {
1016
1112
  'symbol': market['id'],
1017
1113
  }
1018
1114
  if limit is not None:
@@ -1036,7 +1132,7 @@ class gemini(Exchange, ImplicitAPI):
1036
1132
  return self.parse_trades(response, market, since, limit)
1037
1133
 
1038
1134
  def parse_balance(self, response) -> Balances:
1039
- result = {'info': response}
1135
+ result: dict = {'info': response}
1040
1136
  for i in range(0, len(response)):
1041
1137
  balance = response[i]
1042
1138
  currencyId = self.safe_string(balance, 'currency')
@@ -1047,10 +1143,12 @@ class gemini(Exchange, ImplicitAPI):
1047
1143
  result[code] = account
1048
1144
  return self.safe_balance(result)
1049
1145
 
1050
- def fetch_trading_fees(self, params={}):
1146
+ def fetch_trading_fees(self, params={}) -> TradingFees:
1051
1147
  """
1052
1148
  fetch the trading fees for multiple markets
1053
- :see: https://docs.gemini.com/rest-api/#get-notional-volume
1149
+
1150
+ https://docs.gemini.com/rest-api/#get-notional-volume
1151
+
1054
1152
  :param dict [params]: extra parameters specific to the exchange API endpoint
1055
1153
  :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
1056
1154
  """
@@ -1090,7 +1188,7 @@ class gemini(Exchange, ImplicitAPI):
1090
1188
  takerString = Precise.string_div(takerBps, '10000')
1091
1189
  maker = self.parse_number(makerString)
1092
1190
  taker = self.parse_number(takerString)
1093
- result = {}
1191
+ result: dict = {}
1094
1192
  for i in range(0, len(self.symbols)):
1095
1193
  symbol = self.symbols[i]
1096
1194
  result[symbol] = {
@@ -1106,7 +1204,9 @@ class gemini(Exchange, ImplicitAPI):
1106
1204
  def fetch_balance(self, params={}) -> Balances:
1107
1205
  """
1108
1206
  query for balance and get the amount of funds available for trading or funds locked in orders
1109
- :see: https://docs.gemini.com/rest-api/#get-available-balances
1207
+
1208
+ https://docs.gemini.com/rest-api/#get-available-balances
1209
+
1110
1210
  :param dict [params]: extra parameters specific to the exchange API endpoint
1111
1211
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1112
1212
  """
@@ -1114,7 +1214,7 @@ class gemini(Exchange, ImplicitAPI):
1114
1214
  response = self.privatePostV1Balances(params)
1115
1215
  return self.parse_balance(response)
1116
1216
 
1117
- def parse_order(self, order, market: Market = None) -> Order:
1217
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1118
1218
  #
1119
1219
  # createOrder(private)
1120
1220
  #
@@ -1263,7 +1363,6 @@ class gemini(Exchange, ImplicitAPI):
1263
1363
  'postOnly': postOnly,
1264
1364
  'side': side,
1265
1365
  'price': price,
1266
- 'stopPrice': None,
1267
1366
  'triggerPrice': None,
1268
1367
  'average': average,
1269
1368
  'cost': None,
@@ -1277,13 +1376,16 @@ class gemini(Exchange, ImplicitAPI):
1277
1376
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1278
1377
  """
1279
1378
  fetches information on an order made by the user
1280
- :see: https://docs.gemini.com/rest-api/#order-status
1379
+
1380
+ https://docs.gemini.com/rest-api/#order-status
1381
+
1382
+ :param str id: order id
1281
1383
  :param str symbol: unified symbol of the market the order was made in
1282
1384
  :param dict [params]: extra parameters specific to the exchange API endpoint
1283
1385
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1284
1386
  """
1285
1387
  self.load_markets()
1286
- request = {
1388
+ request: dict = {
1287
1389
  'order_id': id,
1288
1390
  }
1289
1391
  response = self.privatePostV1OrderStatus(self.extend(request, params))
@@ -1315,7 +1417,9 @@ class gemini(Exchange, ImplicitAPI):
1315
1417
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1316
1418
  """
1317
1419
  fetch all unfilled currently open orders
1318
- :see: https://docs.gemini.com/rest-api/#get-active-orders
1420
+
1421
+ https://docs.gemini.com/rest-api/#get-active-orders
1422
+
1319
1423
  :param str symbol: unified market symbol
1320
1424
  :param int [since]: the earliest time in ms to fetch open orders for
1321
1425
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -1357,12 +1461,14 @@ class gemini(Exchange, ImplicitAPI):
1357
1461
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1358
1462
  """
1359
1463
  create a trade order
1360
- :see: https://docs.gemini.com/rest-api/#new-order
1464
+
1465
+ https://docs.gemini.com/rest-api/#new-order
1466
+
1361
1467
  :param str symbol: unified symbol of the market to create an order in
1362
1468
  :param str type: must be 'limit'
1363
1469
  :param str side: 'buy' or 'sell'
1364
1470
  :param float amount: how much of currency you want to trade in units of base currency
1365
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1471
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1366
1472
  :param dict [params]: extra parameters specific to the exchange API endpoint
1367
1473
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1368
1474
  """
@@ -1376,7 +1482,7 @@ class gemini(Exchange, ImplicitAPI):
1376
1482
  market = self.market(symbol)
1377
1483
  amountString = self.amount_to_precision(symbol, amount)
1378
1484
  priceString = self.price_to_precision(symbol, price)
1379
- request = {
1485
+ request: dict = {
1380
1486
  'client_order_id': clientOrderId,
1381
1487
  'symbol': market['id'],
1382
1488
  'amount': amountString,
@@ -1387,12 +1493,12 @@ class gemini(Exchange, ImplicitAPI):
1387
1493
  }
1388
1494
  type = self.safe_string(params, 'type', type)
1389
1495
  params = self.omit(params, 'type')
1390
- rawStopPrice = self.safe_string_2(params, 'stop_price', 'stopPrice')
1391
- params = self.omit(params, ['stop_price', 'stopPrice', 'type'])
1496
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stop_price', 'stopPrice'])
1497
+ params = self.omit(params, ['triggerPrice', 'stop_price', 'stopPrice', 'type'])
1392
1498
  if type == 'stopLimit':
1393
- raise ArgumentsRequired(self.id + ' createOrder() requires a stopPrice parameter or a stop_price parameter for ' + type + ' orders')
1394
- if rawStopPrice is not None:
1395
- request['stop_price'] = self.price_to_precision(symbol, rawStopPrice)
1499
+ raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter or a stop_price parameter for ' + type + ' orders')
1500
+ if triggerPrice is not None:
1501
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1396
1502
  request['type'] = 'exchange stop limit'
1397
1503
  else:
1398
1504
  # No options can be applied to stop-limit orders at self time.
@@ -1442,14 +1548,16 @@ class gemini(Exchange, ImplicitAPI):
1442
1548
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1443
1549
  """
1444
1550
  cancels an open order
1445
- :see: https://docs.gemini.com/rest-api/#cancel-order
1551
+
1552
+ https://docs.gemini.com/rest-api/#cancel-order
1553
+
1446
1554
  :param str id: order id
1447
1555
  :param str symbol: unified symbol of the market the order was made in
1448
1556
  :param dict [params]: extra parameters specific to the exchange API endpoint
1449
1557
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1450
1558
  """
1451
1559
  self.load_markets()
1452
- request = {
1560
+ request: dict = {
1453
1561
  'order_id': id,
1454
1562
  }
1455
1563
  response = self.privatePostV1OrderCancel(self.extend(request, params))
@@ -1482,7 +1590,9 @@ class gemini(Exchange, ImplicitAPI):
1482
1590
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1483
1591
  """
1484
1592
  fetch all trades made by the user
1485
- :see: https://docs.gemini.com/rest-api/#get-past-trades
1593
+
1594
+ https://docs.gemini.com/rest-api/#get-past-trades
1595
+
1486
1596
  :param str symbol: unified market symbol
1487
1597
  :param int [since]: the earliest time in ms to fetch trades for
1488
1598
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1493,7 +1603,7 @@ class gemini(Exchange, ImplicitAPI):
1493
1603
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
1494
1604
  self.load_markets()
1495
1605
  market = self.market(symbol)
1496
- request = {
1606
+ request: dict = {
1497
1607
  'symbol': market['id'],
1498
1608
  }
1499
1609
  if limit is not None:
@@ -1503,10 +1613,12 @@ class gemini(Exchange, ImplicitAPI):
1503
1613
  response = self.privatePostV1Mytrades(self.extend(request, params))
1504
1614
  return self.parse_trades(response, market, since, limit)
1505
1615
 
1506
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1616
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
1507
1617
  """
1508
1618
  make a withdrawal
1509
- :see: https://docs.gemini.com/rest-api/#withdraw-crypto-funds
1619
+
1620
+ https://docs.gemini.com/rest-api/#withdraw-crypto-funds
1621
+
1510
1622
  :param str code: unified currency code
1511
1623
  :param float amount: the amount to withdraw
1512
1624
  :param str address: the address to withdraw to
@@ -1518,7 +1630,7 @@ class gemini(Exchange, ImplicitAPI):
1518
1630
  self.check_address(address)
1519
1631
  self.load_markets()
1520
1632
  currency = self.currency(code)
1521
- request = {
1633
+ request: dict = {
1522
1634
  'currency': currency['id'],
1523
1635
  'amount': amount,
1524
1636
  'address': address,
@@ -1561,7 +1673,9 @@ class gemini(Exchange, ImplicitAPI):
1561
1673
  def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1562
1674
  """
1563
1675
  fetch history of deposits and withdrawals
1564
- :see: https://docs.gemini.com/rest-api/#transfers
1676
+
1677
+ https://docs.gemini.com/rest-api/#transfers
1678
+
1565
1679
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1566
1680
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1567
1681
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -1569,7 +1683,7 @@ class gemini(Exchange, ImplicitAPI):
1569
1683
  :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1570
1684
  """
1571
1685
  self.load_markets()
1572
- request = {}
1686
+ request: dict = {}
1573
1687
  if limit is not None:
1574
1688
  request['limit_transfers'] = limit
1575
1689
  if since is not None:
@@ -1577,7 +1691,7 @@ class gemini(Exchange, ImplicitAPI):
1577
1691
  response = self.privatePostV1Transfers(self.extend(request, params))
1578
1692
  return self.parse_transactions(response)
1579
1693
 
1580
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1694
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1581
1695
  #
1582
1696
  # withdraw
1583
1697
  #
@@ -1633,8 +1747,8 @@ class gemini(Exchange, ImplicitAPI):
1633
1747
  'fee': fee,
1634
1748
  }
1635
1749
 
1636
- def parse_transaction_status(self, status):
1637
- statuses = {
1750
+ def parse_transaction_status(self, status: Str):
1751
+ statuses: dict = {
1638
1752
  'Advanced': 'ok',
1639
1753
  'Complete': 'ok',
1640
1754
  }
@@ -1658,9 +1772,11 @@ class gemini(Exchange, ImplicitAPI):
1658
1772
  'info': depositAddress,
1659
1773
  }
1660
1774
 
1661
- def fetch_deposit_address(self, code: str, params={}):
1775
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1662
1776
  """
1663
- :see: https://docs.gemini.com/rest-api/#get-deposit-addresses
1777
+
1778
+ https://docs.gemini.com/rest-api/#get-deposit-addresses
1779
+
1664
1780
  fetch the deposit address for a currency associated with self account
1665
1781
  :param str code: unified currency code
1666
1782
  :param dict [params]: extra parameters specific to the endpoint
@@ -1674,10 +1790,12 @@ class gemini(Exchange, ImplicitAPI):
1674
1790
  networkGroup = self.index_by(self.safe_value(groupedByNetwork, networkCode), 'currency')
1675
1791
  return self.safe_value(networkGroup, code)
1676
1792
 
1677
- def fetch_deposit_addresses_by_network(self, code: str, params={}):
1793
+ def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
1678
1794
  """
1679
1795
  fetch a dictionary of addresses for a currency, indexed by network
1680
- :see: https://docs.gemini.com/rest-api/#get-deposit-addresses
1796
+
1797
+ https://docs.gemini.com/rest-api/#get-deposit-addresses
1798
+
1681
1799
  :param str code: unified currency code of the currency for the deposit address
1682
1800
  :param dict [params]: extra parameters specific to the exchange API endpoint
1683
1801
  :param str [params.network]: *required* The chain of currency
@@ -1691,7 +1809,7 @@ class gemini(Exchange, ImplicitAPI):
1691
1809
  if networkCode is None:
1692
1810
  raise ArgumentsRequired(self.id + ' fetchDepositAddresses() requires a network parameter')
1693
1811
  networkId = self.network_code_to_id(networkCode)
1694
- request = {
1812
+ request: dict = {
1695
1813
  'network': networkId,
1696
1814
  }
1697
1815
  response = self.privatePostV1AddressesNetwork(self.extend(request, params))
@@ -1706,7 +1824,7 @@ class gemini(Exchange, ImplicitAPI):
1706
1824
  apiKey = self.apiKey
1707
1825
  if apiKey.find('account') < 0:
1708
1826
  raise AuthenticationError(self.id + ' sign() requires an account-key, master-keys are not-supported')
1709
- nonce = self.nonce()
1827
+ nonce = str(self.nonce())
1710
1828
  request = self.extend({
1711
1829
  'request': url,
1712
1830
  'nonce': nonce,
@@ -1728,7 +1846,7 @@ class gemini(Exchange, ImplicitAPI):
1728
1846
  body = self.json(query)
1729
1847
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1730
1848
 
1731
- def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
1849
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1732
1850
  if response is None:
1733
1851
  if isinstance(body, str):
1734
1852
  feedback = self.id + ' ' + body
@@ -1755,14 +1873,16 @@ class gemini(Exchange, ImplicitAPI):
1755
1873
  def create_deposit_address(self, code: str, params={}):
1756
1874
  """
1757
1875
  create a currency deposit address
1758
- :see: https://docs.gemini.com/rest-api/#new-deposit-address
1876
+
1877
+ https://docs.gemini.com/rest-api/#new-deposit-address
1878
+
1759
1879
  :param str code: unified currency code of the currency for the deposit address
1760
1880
  :param dict [params]: extra parameters specific to the exchange API endpoint
1761
1881
  :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1762
1882
  """
1763
1883
  self.load_markets()
1764
1884
  currency = self.currency(code)
1765
- request = {
1885
+ request: dict = {
1766
1886
  'currency': currency['id'],
1767
1887
  }
1768
1888
  response = self.privatePostV1DepositCurrencyNewAddress(self.extend(request, params))
@@ -1778,7 +1898,9 @@ class gemini(Exchange, ImplicitAPI):
1778
1898
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1779
1899
  """
1780
1900
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1781
- :see: https://docs.gemini.com/rest-api/#candles
1901
+
1902
+ https://docs.gemini.com/rest-api/#candles
1903
+
1782
1904
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1783
1905
  :param str timeframe: the length of time each candle represents
1784
1906
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1789,7 +1911,7 @@ class gemini(Exchange, ImplicitAPI):
1789
1911
  self.load_markets()
1790
1912
  market = self.market(symbol)
1791
1913
  timeframeId = self.safe_string(self.timeframes, timeframe, timeframe)
1792
- request = {
1914
+ request: dict = {
1793
1915
  'timeframe': timeframeId,
1794
1916
  'symbol': market['id'],
1795
1917
  }