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/okcoin.py CHANGED
@@ -6,9 +6,10 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.okcoin 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, TransferEntry
9
+ from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
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 AccountNotEnabled
14
15
  from ccxt.base.errors import AccountSuspended
@@ -19,7 +20,6 @@ from ccxt.base.errors import InsufficientFunds
19
20
  from ccxt.base.errors import InvalidAddress
20
21
  from ccxt.base.errors import InvalidOrder
21
22
  from ccxt.base.errors import OrderNotFound
22
- from ccxt.base.errors import CancelPending
23
23
  from ccxt.base.errors import NotSupported
24
24
  from ccxt.base.errors import NetworkError
25
25
  from ccxt.base.errors import RateLimitExceeded
@@ -27,7 +27,7 @@ from ccxt.base.errors import ExchangeNotAvailable
27
27
  from ccxt.base.errors import OnMaintenance
28
28
  from ccxt.base.errors import InvalidNonce
29
29
  from ccxt.base.errors import RequestTimeout
30
- from ccxt.base.errors import AuthenticationError
30
+ from ccxt.base.errors import CancelPending
31
31
  from ccxt.base.decimal_to_precision import TICK_SIZE
32
32
  from ccxt.base.precise import Precise
33
33
 
@@ -56,6 +56,8 @@ class okcoin(Exchange, ImplicitAPI):
56
56
  'createMarketOrderWithCost': False,
57
57
  'createMarketSellOrderWithCost': False,
58
58
  'createOrder': True,
59
+ 'createStopOrder': True,
60
+ 'createTriggerOrder': True,
59
61
  'fetchBalance': True,
60
62
  'fetchBorrowInterest': False,
61
63
  'fetchBorrowRate': False,
@@ -66,10 +68,13 @@ class okcoin(Exchange, ImplicitAPI):
66
68
  'fetchClosedOrders': True,
67
69
  'fetchCurrencies': True, # see below
68
70
  'fetchDepositAddress': True,
71
+ 'fetchDepositAddresses': False,
72
+ 'fetchDepositAddressesByNetwork': False,
69
73
  'fetchDeposits': True,
70
74
  'fetchFundingHistory': False,
71
75
  'fetchFundingRate': False,
72
76
  'fetchFundingRateHistory': False,
77
+ 'fetchFundingRates': False,
73
78
  'fetchLedger': True,
74
79
  'fetchMarkets': True,
75
80
  'fetchMyTrades': True,
@@ -217,6 +222,83 @@ class okcoin(Exchange, ImplicitAPI):
217
222
  },
218
223
  },
219
224
  },
225
+ 'features': {
226
+ 'spot': {
227
+ 'sandbox': False,
228
+ 'createOrder': {
229
+ 'marginMode': True,
230
+ 'triggerPrice': True,
231
+ 'triggerDirection': True, # todo
232
+ 'triggerPriceType': {
233
+ 'last': True,
234
+ 'mark': False,
235
+ 'index': False,
236
+ },
237
+ 'stopLossPrice': True, # todo revise trigger
238
+ 'takeProfitPrice': True, # todo revise trigger
239
+ 'attachedStopLossTakeProfit': {
240
+ 'triggerPriceType': {
241
+ 'last': True,
242
+ 'mark': False,
243
+ 'index': False,
244
+ },
245
+ 'price': True,
246
+ },
247
+ 'timeInForce': {
248
+ 'IOC': True,
249
+ 'FOK': True,
250
+ 'PO': True,
251
+ 'GTD': False,
252
+ },
253
+ 'hedged': False,
254
+ 'trailing': True, # todo
255
+ 'leverage': False,
256
+ 'marketBuyByCost': True,
257
+ 'marketBuyRequiresPrice': True,
258
+ 'selfTradePrevention': False,
259
+ 'iceberg': True, # todo
260
+ },
261
+ 'createOrders': None, # todo
262
+ 'fetchMyTrades': {
263
+ 'marginMode': False,
264
+ 'limit': 100,
265
+ 'daysBack': 90,
266
+ 'untilDays': 90, # todo
267
+ },
268
+ 'fetchOrder': {
269
+ 'marginMode': False,
270
+ 'trigger': True,
271
+ 'trailing': True, # todo
272
+ },
273
+ 'fetchOpenOrders': {
274
+ 'marginMode': False,
275
+ 'limit': 100,
276
+ 'trigger': True,
277
+ 'trailing': True,
278
+ },
279
+ 'fetchOrders': None,
280
+ 'fetchClosedOrders': {
281
+ 'marginMode': False,
282
+ 'limit': 100,
283
+ 'daysBack': 90, # todo
284
+ 'daysBackCanceled': 1 / 12, # todo: possible more with history endpoint
285
+ 'untilDays': 90, # todo
286
+ 'trigger': True,
287
+ 'trailing': True,
288
+ },
289
+ 'fetchOHLCV': {
290
+ 'limit': 100, # 300 is only possible for 'recent' 1440 candles, which does not make much sense
291
+ },
292
+ },
293
+ 'swap': {
294
+ 'linear': None,
295
+ 'inverse': None,
296
+ },
297
+ 'future': {
298
+ 'linear': None,
299
+ 'inverse': None,
300
+ },
301
+ },
220
302
  'fees': {
221
303
  'trading': {
222
304
  'taker': 0.002,
@@ -266,6 +348,16 @@ class okcoin(Exchange, ImplicitAPI):
266
348
  '50026': ExchangeNotAvailable, # System error, please try again later.
267
349
  '50027': PermissionDenied, # The account is restricted from trading
268
350
  '50028': ExchangeError, # Unable to take the order, please reach out to support center for details
351
+ '50029': ExchangeError, # This instrument({0}) is unavailable at present due to risk management. Please contact customer service for help.
352
+ '50030': PermissionDenied, # No permission to use self API
353
+ '50032': AccountSuspended, # This asset is blocked, allow its trading and try again
354
+ '50033': AccountSuspended, # This instrument is blocked, allow its trading and try again
355
+ '50035': BadRequest, # This endpoint requires that APIKey must be bound to IP
356
+ '50036': BadRequest, # Invalid expTime
357
+ '50037': BadRequest, # Order expired
358
+ '50038': ExchangeError, # This feature is temporarily unavailable in demo trading
359
+ '50039': ExchangeError, # The before parameter is not available for implementing timestamp pagination
360
+ '50041': ExchangeError, # You are not currently on the whitelist, please contact customer service
269
361
  '50044': BadRequest, # Must select one broker type
270
362
  # API Class
271
363
  '50100': ExchangeError, # API frozen, please contact customer service
@@ -309,9 +401,25 @@ class okcoin(Exchange, ImplicitAPI):
309
401
  '51024': AccountSuspended, # Unified accountblocked
310
402
  '51025': ExchangeError, # Order count exceeds the limit
311
403
  '51026': BadSymbol, # Instrument type does not match underlying index
404
+ '51030': InvalidOrder, # Funding fee is being settled.
405
+ '51031': InvalidOrder, # This order price is not within the closing price range
406
+ '51032': InvalidOrder, # Closing all positions at market price.
407
+ '51033': InvalidOrder, # The total amount per order for self pair has reached the upper limit.
408
+ '51037': InvalidOrder, # The current account risk status only supports you to place IOC orders that can reduce the risk of your account.
409
+ '51038': InvalidOrder, # There is already an IOC order under the current risk module that reduces the risk of the account.
410
+ '51044': InvalidOrder, # The order type {0}, {1} is not allowed to set stop loss and take profit
312
411
  '51046': InvalidOrder, # The take profit trigger price must be higher than the order price
313
412
  '51047': InvalidOrder, # The stop loss trigger price must be lower than the order price
314
- '51031': InvalidOrder, # This order price is not within the closing price range
413
+ '51048': InvalidOrder, # The take profit trigger price should be lower than the order price
414
+ '51049': InvalidOrder, # The stop loss trigger price should be higher than the order price
415
+ '51050': InvalidOrder, # The take profit trigger price should be higher than the best ask price
416
+ '51051': InvalidOrder, # The stop loss trigger price should be lower than the best ask price
417
+ '51052': InvalidOrder, # The take profit trigger price should be lower than the best bid price
418
+ '51053': InvalidOrder, # The stop loss trigger price should be higher than the best bid price
419
+ '51054': BadRequest, # Getting information timed out, please try again later
420
+ '51056': InvalidOrder, # Action not allowed
421
+ '51058': InvalidOrder, # No available position for self algo order
422
+ '51059': InvalidOrder, # Strategy for the current state does not support self operation
315
423
  '51100': InvalidOrder, # Trading amount does not meet the min tradable amount
316
424
  '51102': InvalidOrder, # Entered amount exceeds the max pending count
317
425
  '51103': InvalidOrder, # Entered amount exceeds the max pending order count of the underlying asset
@@ -572,6 +680,9 @@ class okcoin(Exchange, ImplicitAPI):
572
680
  'defaultNetwork': 'ERC20',
573
681
  'networks': {
574
682
  'ERC20': 'Ethereum',
683
+ 'BTC': 'Bitcoin',
684
+ 'OMNI': 'Omni',
685
+ 'TRC20': 'TRON',
575
686
  },
576
687
  },
577
688
  'commonCurrencies': {
@@ -603,21 +714,23 @@ class okcoin(Exchange, ImplicitAPI):
603
714
  #
604
715
  return self.parse8601(self.safe_string(response, 'iso'))
605
716
 
606
- def fetch_markets(self, params={}):
717
+ def fetch_markets(self, params={}) -> List[Market]:
607
718
  """
608
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-public-data-get-instruments
719
+
720
+ https://www.okcoin.com/docs-v5/en/#rest-api-public-data-get-instruments
721
+
609
722
  retrieves data on all markets for okcoin
610
723
  :param dict [params]: extra parameters specific to the exchange API endpoint
611
724
  :returns dict[]: an array of objects representing market data
612
725
  """
613
- request = {
726
+ request: dict = {
614
727
  'instType': 'SPOT',
615
728
  }
616
729
  response = self.publicGetPublicInstruments(self.extend(request, params))
617
730
  markets = self.safe_value(response, 'data', [])
618
731
  return self.parse_markets(markets)
619
732
 
620
- def parse_market(self, market) -> Market:
733
+ def parse_market(self, market: dict) -> Market:
621
734
  #
622
735
  # spot markets
623
736
  #
@@ -699,15 +812,7 @@ class okcoin(Exchange, ImplicitAPI):
699
812
  'info': market,
700
813
  })
701
814
 
702
- def safe_network(self, networkId):
703
- networksById = {
704
- 'Bitcoin': 'BTC',
705
- 'Omni': 'OMNI',
706
- 'TRON': 'TRC20',
707
- }
708
- return self.safe_string(networksById, networkId, networkId)
709
-
710
- def fetch_currencies(self, params={}):
815
+ def fetch_currencies(self, params={}) -> Currencies:
711
816
  """
712
817
  fetches all available currencies on an exchange
713
818
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -720,7 +825,7 @@ class okcoin(Exchange, ImplicitAPI):
720
825
  else:
721
826
  response = self.privateGetAssetCurrencies(params)
722
827
  data = self.safe_value(response, 'data', [])
723
- result = {}
828
+ result: dict = {}
724
829
  dataByCurrencyId = self.group_by(data, 'ccy')
725
830
  currencyIds = list(dataByCurrencyId.keys())
726
831
  for i in range(0, len(currencyIds)):
@@ -728,7 +833,7 @@ class okcoin(Exchange, ImplicitAPI):
728
833
  currency = self.safe_currency(currencyId)
729
834
  code = currency['code']
730
835
  chains = dataByCurrencyId[currencyId]
731
- networks = {}
836
+ networks: dict = {}
732
837
  currencyActive = False
733
838
  depositEnabled = False
734
839
  withdrawEnabled = False
@@ -746,7 +851,7 @@ class okcoin(Exchange, ImplicitAPI):
746
851
  if (networkId is not None) and (networkId.find('-') >= 0):
747
852
  parts = networkId.split('-')
748
853
  chainPart = self.safe_string(parts, 1, networkId)
749
- networkCode = self.safe_network(chainPart)
854
+ networkCode = self.network_id_to_code(chainPart)
750
855
  precision = self.parse_precision(self.safe_string(chain, 'wdTickSz'))
751
856
  if maxPrecision is None:
752
857
  maxPrecision = precision
@@ -791,7 +896,9 @@ class okcoin(Exchange, ImplicitAPI):
791
896
 
792
897
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
793
898
  """
794
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-order-book
899
+
900
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-order-book
901
+
795
902
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
796
903
  :param str symbol: unified symbol of the market to fetch the order book for
797
904
  :param int [limit]: the maximum amount of order book entries to return
@@ -800,7 +907,7 @@ class okcoin(Exchange, ImplicitAPI):
800
907
  """
801
908
  self.load_markets()
802
909
  market = self.market(symbol)
803
- request = {
910
+ request: dict = {
804
911
  'instId': market['id'],
805
912
  }
806
913
  limit = 20 if (limit is None) else limit
@@ -833,7 +940,7 @@ class okcoin(Exchange, ImplicitAPI):
833
940
  timestamp = self.safe_integer(first, 'ts')
834
941
  return self.parse_order_book(first, symbol, timestamp)
835
942
 
836
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
943
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
837
944
  #
838
945
  # {
839
946
  # "instType": "SPOT",
@@ -890,7 +997,9 @@ class okcoin(Exchange, ImplicitAPI):
890
997
 
891
998
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
892
999
  """
893
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-ticker
1000
+
1001
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-ticker
1002
+
894
1003
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
895
1004
  :param str symbol: unified symbol of the market to fetch the ticker for
896
1005
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -898,7 +1007,7 @@ class okcoin(Exchange, ImplicitAPI):
898
1007
  """
899
1008
  self.load_markets()
900
1009
  market = self.market(symbol)
901
- request = {
1010
+ request: dict = {
902
1011
  'instId': market['id'],
903
1012
  }
904
1013
  response = self.publicGetMarketTicker(self.extend(request, params))
@@ -934,21 +1043,23 @@ class okcoin(Exchange, ImplicitAPI):
934
1043
 
935
1044
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
936
1045
  """
937
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-tickers
1046
+
1047
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-tickers
1048
+
938
1049
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
939
1050
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
940
1051
  :param dict [params]: extra parameters specific to the exchange API endpoint
941
1052
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
942
1053
  """
943
1054
  symbols = self.market_symbols(symbols)
944
- request = {
1055
+ request: dict = {
945
1056
  'instType': 'SPOT',
946
1057
  }
947
1058
  response = self.publicGetMarketTickers(self.extend(request, params))
948
- data = self.safe_value(response, 'data', [])
1059
+ data = self.safe_list(response, 'data', [])
949
1060
  return self.parse_tickers(data, symbols, params)
950
1061
 
951
- def parse_trade(self, trade, market: Market = None) -> Trade:
1062
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
952
1063
  #
953
1064
  # public fetchTrades
954
1065
  #
@@ -1023,8 +1134,10 @@ class okcoin(Exchange, ImplicitAPI):
1023
1134
 
1024
1135
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1025
1136
  """
1026
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-trades
1027
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-trades-history
1137
+
1138
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-trades
1139
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-trades-history
1140
+
1028
1141
  get the list of most recent trades for a particular symbol
1029
1142
  :param str symbol: unified symbol of the market to fetch trades for
1030
1143
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -1036,7 +1149,7 @@ class okcoin(Exchange, ImplicitAPI):
1036
1149
  market = self.market(symbol)
1037
1150
  if (limit is None) or (limit > 100):
1038
1151
  limit = 100 # maximum = default = 100
1039
- request = {
1152
+ request: dict = {
1040
1153
  'instId': market['id'],
1041
1154
  }
1042
1155
  method = None
@@ -1046,7 +1159,7 @@ class okcoin(Exchange, ImplicitAPI):
1046
1159
  response = self.publicGetMarketTrades(self.extend(request, params))
1047
1160
  else:
1048
1161
  response = self.publicGetMarketHistoryTrades(self.extend(request, params))
1049
- data = self.safe_value(response, 'data', [])
1162
+ data = self.safe_list(response, 'data', [])
1050
1163
  return self.parse_trades(data, market, since, limit)
1051
1164
 
1052
1165
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
@@ -1074,8 +1187,10 @@ class okcoin(Exchange, ImplicitAPI):
1074
1187
 
1075
1188
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1076
1189
  """
1077
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-candlesticks
1078
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-candlesticks-history
1190
+
1191
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-candlesticks
1192
+ https://www.okcoin.com/docs-v5/en/#rest-api-market-data-get-candlesticks-history
1193
+
1079
1194
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1080
1195
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1081
1196
  :param str timeframe: the length of time each candle represents
@@ -1092,11 +1207,12 @@ class okcoin(Exchange, ImplicitAPI):
1092
1207
  timezone = self.safe_string(options, 'timezone', 'UTC')
1093
1208
  if (timezone == 'UTC') and (duration >= 21600): # if utc and timeframe >= 6h
1094
1209
  bar += timezone.lower()
1095
- request = {
1210
+ request: dict = {
1096
1211
  'instId': market['id'],
1097
1212
  'bar': bar,
1098
- 'limit': limit,
1099
1213
  }
1214
+ if limit is not None:
1215
+ request['limit'] = limit # default 100, max 100
1100
1216
  method = None
1101
1217
  method, params = self.handle_option_and_params(params, 'fetchOHLCV', 'method', 'publicGetMarketCandles')
1102
1218
  response = None
@@ -1104,7 +1220,7 @@ class okcoin(Exchange, ImplicitAPI):
1104
1220
  response = self.publicGetMarketCandles(self.extend(request, params))
1105
1221
  else:
1106
1222
  response = self.publicGetMarketHistoryCandles(self.extend(request, params))
1107
- data = self.safe_value(response, 'data', [])
1223
+ data = self.safe_list(response, 'data', [])
1108
1224
  return self.parse_ohlcvs(data, market, timeframe, since, limit)
1109
1225
 
1110
1226
  def parse_account_balance(self, response):
@@ -1149,7 +1265,7 @@ class okcoin(Exchange, ImplicitAPI):
1149
1265
  # }
1150
1266
  # ]
1151
1267
  #
1152
- result = {
1268
+ result: dict = {
1153
1269
  'info': response,
1154
1270
  'timestamp': None,
1155
1271
  'datetime': None,
@@ -1173,7 +1289,7 @@ class okcoin(Exchange, ImplicitAPI):
1173
1289
  """
1174
1290
  self.load_markets()
1175
1291
  marketType, query = self.handle_market_type_and_params('fetchBalance', None, params)
1176
- request = {
1292
+ request: dict = {
1177
1293
  # 'ccy': 'BTC,ETH', # comma-separated list of currency ids
1178
1294
  }
1179
1295
  response = None
@@ -1205,7 +1321,7 @@ class okcoin(Exchange, ImplicitAPI):
1205
1321
  return self.parse_trading_balance(response)
1206
1322
 
1207
1323
  def parse_trading_balance(self, response):
1208
- result = {'info': response}
1324
+ result: dict = {'info': response}
1209
1325
  data = self.safe_value(response, 'data', [])
1210
1326
  first = self.safe_value(data, 0, {})
1211
1327
  timestamp = self.safe_integer(first, 'uTime')
@@ -1230,7 +1346,7 @@ class okcoin(Exchange, ImplicitAPI):
1230
1346
  return self.safe_balance(result)
1231
1347
 
1232
1348
  def parse_funding_balance(self, response):
1233
- result = {'info': response}
1349
+ result: dict = {'info': response}
1234
1350
  data = self.safe_value(response, 'data', [])
1235
1351
  for i in range(0, len(data)):
1236
1352
  balance = data[i]
@@ -1247,7 +1363,9 @@ class okcoin(Exchange, ImplicitAPI):
1247
1363
  def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1248
1364
  """
1249
1365
  create a market buy order by providing the symbol and cost
1250
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-order
1366
+
1367
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-order
1368
+
1251
1369
  :param str symbol: unified symbol of the market to create an order in
1252
1370
  :param float cost: how much you want to trade in units of the quote currency
1253
1371
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1263,16 +1381,18 @@ class okcoin(Exchange, ImplicitAPI):
1263
1381
 
1264
1382
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1265
1383
  """
1266
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-order
1267
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-algo-order
1268
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-multiple-orders
1269
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1384
+
1385
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-order
1386
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-algo-order
1387
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-multiple-orders
1388
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1389
+
1270
1390
  create a trade order
1271
1391
  :param str symbol: unified symbol of the market to create an order in
1272
1392
  :param str type: 'market' or 'limit'
1273
1393
  :param str side: 'buy' or 'sell'
1274
1394
  :param float amount: how much of currency you want to trade in units of base currency
1275
- :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1395
+ :param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1276
1396
  :param dict [params]: extra parameters specific to the exchange API endpoint
1277
1397
  :param bool [params.reduceOnly]: MARGIN orders only, or swap/future orders in net mode
1278
1398
  :param bool [params.postOnly]: True to place a post only order
@@ -1318,7 +1438,7 @@ class okcoin(Exchange, ImplicitAPI):
1318
1438
 
1319
1439
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1320
1440
  market = self.market(symbol)
1321
- request = {
1441
+ request: dict = {
1322
1442
  'instId': market['id'],
1323
1443
  # 'ccy': currency['id'], # only applicable to cross MARGIN orders in single-currency margin
1324
1444
  # 'clOrdId': clientOrderId, # up to 32 characters, must be unique
@@ -1427,7 +1547,7 @@ class okcoin(Exchange, ImplicitAPI):
1427
1547
  if stopLossDefined:
1428
1548
  stopLossTriggerPrice = self.safe_value_n(stopLoss, ['triggerPrice', 'stopPrice', 'slTriggerPx'])
1429
1549
  if stopLossTriggerPrice is None:
1430
- raise InvalidOrder(self.id + ' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"], or params["stopLoss"]["stopPrice"], or params["stopLoss"]["slTriggerPx"] for a stop loss order')
1550
+ raise InvalidOrder(self.id + ' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"] for a stop loss order')
1431
1551
  request['slTriggerPx'] = self.price_to_precision(symbol, stopLossTriggerPrice)
1432
1552
  stopLossLimitPrice = self.safe_value_n(stopLoss, ['price', 'stopLossPrice', 'slOrdPx'])
1433
1553
  stopLossOrderType = self.safe_string(stopLoss, 'type')
@@ -1438,7 +1558,7 @@ class okcoin(Exchange, ImplicitAPI):
1438
1558
  raise InvalidOrder(self.id + ' createOrder() params["stopLoss"]["type"] must be either "limit" or "market"')
1439
1559
  elif stopLossLimitOrderType:
1440
1560
  if stopLossLimitPrice is None:
1441
- raise InvalidOrder(self.id + ' createOrder() requires a limit price in params["stopLoss"]["price"] or params["stopLoss"]["slOrdPx"] for a stop loss limit order')
1561
+ raise InvalidOrder(self.id + ' createOrder() requires a limit price in params["stopLoss"]["price"] for a stop loss limit order')
1442
1562
  else:
1443
1563
  request['slOrdPx'] = self.price_to_precision(symbol, stopLossLimitPrice)
1444
1564
  elif stopLossOrderType == 'market':
@@ -1511,27 +1631,29 @@ class okcoin(Exchange, ImplicitAPI):
1511
1631
 
1512
1632
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1513
1633
  """
1514
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-order
1515
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-algo-order
1516
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1634
+
1635
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-order
1636
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-algo-order
1637
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1638
+
1517
1639
  cancels an open order
1518
1640
  :param str id: order id
1519
1641
  :param str symbol: unified symbol of the market the order was made in
1520
1642
  :param dict [params]: extra parameters specific to the exchange API endpoint
1521
- :param bool [params.stop]: True if cancel trigger or conditional orders
1643
+ :param bool [params.trigger]: True if cancel trigger or conditional orders
1522
1644
  :param bool [params.advanced]: True if canceling advanced orders only
1523
1645
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1524
1646
  """
1525
1647
  if symbol is None:
1526
1648
  raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
1527
1649
  self.load_markets()
1528
- stop = self.safe_value_2(params, 'stop', 'trigger')
1650
+ trigger = self.safe_value_2(params, 'stop', 'trigger')
1529
1651
  advanced = self.safe_value(params, 'advanced')
1530
- if stop or advanced:
1652
+ if trigger or advanced:
1531
1653
  orderInner = self.cancel_orders([id], symbol, params)
1532
1654
  return self.safe_value(orderInner, 0)
1533
1655
  market = self.market(symbol)
1534
- request = {
1656
+ request: dict = {
1535
1657
  'instId': market['id'],
1536
1658
  # 'ordId': id, # either ordId or clOrdId is required
1537
1659
  # 'clOrdId': clientOrderId,
@@ -1545,12 +1667,12 @@ class okcoin(Exchange, ImplicitAPI):
1545
1667
  response = self.privatePostTradeCancelOrder(self.extend(request, query))
1546
1668
  # {"code":"0","data":[{"clOrdId":"","ordId":"317251910906576896","sCode":"0","sMsg":""}],"msg":""}
1547
1669
  data = self.safe_value(response, 'data', [])
1548
- order = self.safe_value(data, 0)
1670
+ order = self.safe_dict(data, 0)
1549
1671
  return self.parse_order(order, market)
1550
1672
 
1551
1673
  def parse_ids(self, ids):
1552
1674
  """
1553
- * @ignore
1675
+ @ignore
1554
1676
  :param string[]|str ids: order ids
1555
1677
  :returns str[]: list of order ids
1556
1678
  """
@@ -1562,9 +1684,11 @@ class okcoin(Exchange, ImplicitAPI):
1562
1684
  def cancel_orders(self, ids, symbol: Str = None, params={}):
1563
1685
  """
1564
1686
  cancel multiple orders
1565
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-multiple-orders
1566
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-algo-order
1567
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1687
+
1688
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-multiple-orders
1689
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-algo-order
1690
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-cancel-advance-algo-order
1691
+
1568
1692
  :param str[] ids: order ids
1569
1693
  :param str symbol: unified market symbol
1570
1694
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1573,7 +1697,7 @@ class okcoin(Exchange, ImplicitAPI):
1573
1697
  if symbol is None:
1574
1698
  raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument')
1575
1699
  self.load_markets()
1576
- stop = self.safe_value_2(params, 'stop', 'trigger')
1700
+ trigger = self.safe_value_2(params, 'stop', 'trigger')
1577
1701
  advanced = self.safe_value(params, 'advanced')
1578
1702
  params = self.omit(params, ['stop', 'trigger', 'advanced'])
1579
1703
  market = self.market(symbol)
@@ -1589,7 +1713,7 @@ class okcoin(Exchange, ImplicitAPI):
1589
1713
  'instId': market['id'],
1590
1714
  })
1591
1715
  for i in range(0, len(ids)):
1592
- if stop or advanced:
1716
+ if trigger or advanced:
1593
1717
  request.append({
1594
1718
  'algoId': ids[i],
1595
1719
  'instId': market['id'],
@@ -1606,7 +1730,7 @@ class okcoin(Exchange, ImplicitAPI):
1606
1730
  'clOrdId': clientOrderIds[i],
1607
1731
  })
1608
1732
  response = None
1609
- if stop:
1733
+ if trigger:
1610
1734
  response = self.privatePostTradeCancelAlgos(request)
1611
1735
  elif advanced:
1612
1736
  response = self.privatePostTradeCancelAdvanceAlgos(request)
@@ -1628,11 +1752,11 @@ class okcoin(Exchange, ImplicitAPI):
1628
1752
  # }
1629
1753
  #
1630
1754
  #
1631
- ordersData = self.safe_value(response, 'data', [])
1755
+ ordersData = self.safe_list(response, 'data', [])
1632
1756
  return self.parse_orders(ordersData, market, None, None, params)
1633
1757
 
1634
- def parse_order_status(self, status):
1635
- statuses = {
1758
+ def parse_order_status(self, status: Str):
1759
+ statuses: dict = {
1636
1760
  'canceled': 'canceled',
1637
1761
  'live': 'open',
1638
1762
  'partially_filled': 'open',
@@ -1641,7 +1765,7 @@ class okcoin(Exchange, ImplicitAPI):
1641
1765
  }
1642
1766
  return self.safe_string(statuses, status, status)
1643
1767
 
1644
- def parse_order(self, order, market: Market = None) -> Order:
1768
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1645
1769
  #
1646
1770
  # createOrder
1647
1771
  #
@@ -1798,7 +1922,6 @@ class okcoin(Exchange, ImplicitAPI):
1798
1922
  clientOrderId = None # fix empty clientOrderId string
1799
1923
  stopLossPrice = self.safe_number_2(order, 'slTriggerPx', 'slOrdPx')
1800
1924
  takeProfitPrice = self.safe_number_2(order, 'tpTriggerPx', 'tpOrdPx')
1801
- stopPrice = self.safe_number_n(order, ['triggerPx', 'moveTriggerPx'])
1802
1925
  reduceOnlyRaw = self.safe_string(order, 'reduceOnly')
1803
1926
  reduceOnly = False
1804
1927
  if reduceOnly is not None:
@@ -1819,8 +1942,7 @@ class okcoin(Exchange, ImplicitAPI):
1819
1942
  'price': price,
1820
1943
  'stopLossPrice': stopLossPrice,
1821
1944
  'takeProfitPrice': takeProfitPrice,
1822
- 'stopPrice': stopPrice,
1823
- 'triggerPrice': stopPrice,
1945
+ 'triggerPrice': self.safe_number_n(order, ['triggerPx', 'moveTriggerPx']),
1824
1946
  'average': average,
1825
1947
  'cost': cost,
1826
1948
  'amount': amount,
@@ -1834,9 +1956,12 @@ class okcoin(Exchange, ImplicitAPI):
1834
1956
 
1835
1957
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1836
1958
  """
1837
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-details
1838
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-list
1959
+
1960
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-details
1961
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-list
1962
+
1839
1963
  fetches information on an order made by the user
1964
+ :param str id: order id
1840
1965
  :param str symbol: unified symbol of the market the order was made in
1841
1966
  :param dict [params]: extra parameters specific to the exchange API endpoint
1842
1967
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1845,14 +1970,14 @@ class okcoin(Exchange, ImplicitAPI):
1845
1970
  raise ArgumentsRequired(self.id + ' fetchOrder() requires a symbol argument')
1846
1971
  self.load_markets()
1847
1972
  market = self.market(symbol)
1848
- request = {
1973
+ request: dict = {
1849
1974
  'instId': market['id'],
1850
1975
  # 'clOrdId': 'abcdef12345', # optional, [a-z0-9]{1,32}
1851
1976
  # 'ordId': id,
1852
1977
  }
1853
1978
  clientOrderId = self.safe_string_2(params, 'clOrdId', 'clientOrderId')
1854
- stop = self.safe_value_2(params, 'stop', 'trigger')
1855
- if stop:
1979
+ trigger = self.safe_value_2(params, 'stop', 'trigger')
1980
+ if trigger:
1856
1981
  if clientOrderId is not None:
1857
1982
  request['algoClOrdId'] = clientOrderId
1858
1983
  else:
@@ -1864,29 +1989,31 @@ class okcoin(Exchange, ImplicitAPI):
1864
1989
  request['ordId'] = id
1865
1990
  query = self.omit(params, ['clientOrderId', 'stop', 'trigger'])
1866
1991
  response = None
1867
- if stop:
1992
+ if trigger:
1868
1993
  response = self.privateGetTradeOrderAlgo(self.extend(request, query))
1869
1994
  else:
1870
1995
  response = self.privateGetTradeOrder(self.extend(request, query))
1871
1996
  data = self.safe_value(response, 'data', [])
1872
- order = self.safe_value(data, 0)
1997
+ order = self.safe_dict(data, 0)
1873
1998
  return self.parse_order(order)
1874
1999
 
1875
2000
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1876
2001
  """
1877
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-list
1878
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-list
2002
+
2003
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-list
2004
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-list
2005
+
1879
2006
  fetch all unfilled currently open orders
1880
2007
  :param str symbol: unified market symbol
1881
2008
  :param int [since]: the earliest time in ms to fetch open orders for
1882
2009
  :param int [limit]: the maximum number of open orders structures to retrieve
1883
2010
  :param dict [params]: extra parameters specific to the exchange API endpoint
1884
- :param bool [params.stop]: True if fetching trigger or conditional orders
2011
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1885
2012
  :param str [params.ordType]: "conditional", "oco", "trigger", "move_order_stop", "iceberg", or "twap"
1886
2013
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1887
2014
  """
1888
2015
  self.load_markets()
1889
- request = {
2016
+ request: dict = {
1890
2017
  # 'instId': market['id'],
1891
2018
  # 'ordType': 'limit', # market, limit, post_only, fok, ioc, comma-separated, stop orders: conditional, oco, trigger, move_order_stop, iceberg, or twap
1892
2019
  # 'state': 'live', # live, partially_filled
@@ -1901,34 +2028,36 @@ class okcoin(Exchange, ImplicitAPI):
1901
2028
  if limit is not None:
1902
2029
  request['limit'] = limit # default 100, max 100
1903
2030
  ordType = self.safe_string(params, 'ordType')
1904
- stop = self.safe_value(params, 'stop') or (self.safe_string(params, 'ordType') is not None)
1905
- if stop and (ordType is None):
2031
+ trigger = self.safe_value(params, 'stop') or (self.safe_string(params, 'ordType') is not None)
2032
+ if trigger and (ordType is None):
1906
2033
  request['ordType'] = 'trigger' # default to trigger
1907
2034
  params = self.omit(params, ['stop'])
1908
2035
  response = None
1909
- if stop:
2036
+ if trigger:
1910
2037
  response = self.privateGetTradeOrdersAlgoPending(self.extend(request, params))
1911
2038
  else:
1912
2039
  response = self.privateGetTradeOrdersPending(self.extend(request, params))
1913
- data = self.safe_value(response, 'data', [])
2040
+ data = self.safe_list(response, 'data', [])
1914
2041
  return self.parse_orders(data, market, since, limit)
1915
2042
 
1916
2043
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1917
2044
  """
1918
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-history
1919
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-history-last-3-months
1920
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-history-last-7-days
2045
+
2046
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-algo-order-history
2047
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-history-last-3-months
2048
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-order-history-last-7-days
2049
+
1921
2050
  fetches information on multiple closed orders made by the user
1922
2051
  :param str symbol: unified market symbol of the market orders were made in
1923
2052
  :param int [since]: the earliest time in ms to fetch orders for
1924
2053
  :param int [limit]: the maximum number of order structures to retrieve
1925
2054
  :param dict [params]: extra parameters specific to the exchange API endpoint
1926
- :param bool [params.stop]: True if fetching trigger or conditional orders
2055
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1927
2056
  :param str [params.ordType]: "conditional", "oco", "trigger", "move_order_stop", "iceberg", or "twap"
1928
2057
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1929
2058
  """
1930
2059
  self.load_markets()
1931
- request = {
2060
+ request: dict = {
1932
2061
  'instType': 'SPOT',
1933
2062
  }
1934
2063
  market = None
@@ -1936,12 +2065,12 @@ class okcoin(Exchange, ImplicitAPI):
1936
2065
  market = self.market(symbol)
1937
2066
  request['instId'] = market['id']
1938
2067
  ordType = self.safe_string(params, 'ordType')
1939
- stop = self.safe_value(params, 'stop') or (self.safe_string(params, 'ordType') is not None)
1940
- if stop and (ordType is None):
2068
+ trigger = self.safe_value(params, 'stop') or (self.safe_string(params, 'ordType') is not None)
2069
+ if trigger and (ordType is None):
1941
2070
  request['ordType'] = 'trigger' # default to trigger
1942
2071
  params = self.omit(params, ['stop'])
1943
2072
  response = None
1944
- if stop:
2073
+ if trigger:
1945
2074
  response = self.privateGetTradeOrdersAlgoHistory(self.extend(request, params))
1946
2075
  else:
1947
2076
  method = None
@@ -1991,10 +2120,10 @@ class okcoin(Exchange, ImplicitAPI):
1991
2120
  # "msg":""
1992
2121
  # }
1993
2122
  #
1994
- data = self.safe_value(response, 'data', [])
2123
+ data = self.safe_list(response, 'data', [])
1995
2124
  return self.parse_orders(data, market, since, limit)
1996
2125
 
1997
- def parse_deposit_address(self, depositAddress, currency: Currency = None):
2126
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
1998
2127
  #
1999
2128
  # {
2000
2129
  # "addr": "okbtothemoon",
@@ -2077,17 +2206,19 @@ class okcoin(Exchange, ImplicitAPI):
2077
2206
  #
2078
2207
  self.check_address(address)
2079
2208
  return {
2209
+ 'info': depositAddress,
2080
2210
  'currency': code,
2211
+ 'network': network,
2081
2212
  'address': address,
2082
2213
  'tag': tag,
2083
- 'network': network,
2084
- 'info': depositAddress,
2085
2214
  }
2086
2215
 
2087
- def fetch_deposit_address(self, code: str, params={}):
2216
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
2088
2217
  """
2089
2218
  fetch the deposit address for a currency associated with self account
2090
- :see: https://www.okx.com/docs-v5/en/#funding-account-rest-api-get-deposit-address
2219
+
2220
+ https://www.okx.com/docs-v5/en/#funding-account-rest-api-get-deposit-address
2221
+
2091
2222
  :param str code: unified currency code
2092
2223
  :param dict [params]: extra parameters specific to the exchange API endpoint
2093
2224
  :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
@@ -2103,17 +2234,19 @@ class okcoin(Exchange, ImplicitAPI):
2103
2234
  raise InvalidAddress(self.id + ' fetchDepositAddress() cannot find ' + networkCode + ' deposit address for ' + code)
2104
2235
  return result
2105
2236
 
2106
- def fetch_deposit_addresses_by_network(self, code: str, params={}):
2237
+ def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
2107
2238
  """
2108
2239
  fetch a dictionary of addresses for a currency, indexed by network
2109
- :see: https://www.okx.com/docs-v5/en/#funding-account-rest-api-get-deposit-address
2240
+
2241
+ https://www.okx.com/docs-v5/en/#funding-account-rest-api-get-deposit-address
2242
+
2110
2243
  :param str code: unified currency code of the currency for the deposit address
2111
2244
  :param dict [params]: extra parameters specific to the exchange API endpoint
2112
2245
  :returns dict: a dictionary of `address structures <https://docs.ccxt.com/#/?id=address-structure>` indexed by the network
2113
2246
  """
2114
2247
  self.load_markets()
2115
2248
  currency = self.currency(code)
2116
- request = {
2249
+ request: dict = {
2117
2250
  'ccy': currency['id'],
2118
2251
  }
2119
2252
  response = self.privateGetAssetDepositAddress(self.extend(request, params))
@@ -2145,7 +2278,9 @@ class okcoin(Exchange, ImplicitAPI):
2145
2278
 
2146
2279
  def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2147
2280
  """
2148
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-funding-funds-transfer
2281
+
2282
+ https://www.okcoin.com/docs-v5/en/#rest-api-funding-funds-transfer
2283
+
2149
2284
  transfer currency internally between wallets on the same account
2150
2285
  :param str code: unified currency code
2151
2286
  :param float amount: amount to transfer
@@ -2159,7 +2294,7 @@ class okcoin(Exchange, ImplicitAPI):
2159
2294
  accountsByType = self.safe_value(self.options, 'accountsByType', {})
2160
2295
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
2161
2296
  toId = self.safe_string(accountsByType, toAccount, toAccount)
2162
- request = {
2297
+ request: dict = {
2163
2298
  'ccy': currency['id'],
2164
2299
  'amt': self.currency_to_precision(code, amount),
2165
2300
  'type': '0', # 0 = transfer within account by default, 1 = master account to sub-account, 2 = sub-account to master account, 3 = sub-account to master account(Only applicable to APIKey from sub-account), 4 = sub-account to sub-account
@@ -2197,10 +2332,10 @@ class okcoin(Exchange, ImplicitAPI):
2197
2332
  # }
2198
2333
  #
2199
2334
  data = self.safe_value(response, 'data', [])
2200
- rawTransfer = self.safe_value(data, 0, {})
2335
+ rawTransfer = self.safe_dict(data, 0, {})
2201
2336
  return self.parse_transfer(rawTransfer, currency)
2202
2337
 
2203
- def parse_transfer(self, transfer, currency: Currency = None):
2338
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
2204
2339
  #
2205
2340
  # transfer
2206
2341
  #
@@ -2276,15 +2411,17 @@ class okcoin(Exchange, ImplicitAPI):
2276
2411
  'status': self.parse_transfer_status(self.safe_string(transfer, 'state')),
2277
2412
  }
2278
2413
 
2279
- def parse_transfer_status(self, status):
2280
- statuses = {
2414
+ def parse_transfer_status(self, status: Str) -> Str:
2415
+ statuses: dict = {
2281
2416
  'success': 'ok',
2282
2417
  }
2283
2418
  return self.safe_string(statuses, status, status)
2284
2419
 
2285
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2420
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2286
2421
  """
2287
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-funding-withdrawal
2422
+
2423
+ https://www.okcoin.com/docs-v5/en/#rest-api-funding-withdrawal
2424
+
2288
2425
  make a withdrawal
2289
2426
  :param str code: unified currency code
2290
2427
  :param float amount: the amount to withdraw
@@ -2299,7 +2436,7 @@ class okcoin(Exchange, ImplicitAPI):
2299
2436
  currency = self.currency(code)
2300
2437
  if (tag is not None) and (len(tag) > 0):
2301
2438
  address = address + ':' + tag
2302
- request = {
2439
+ request: dict = {
2303
2440
  'ccy': currency['id'],
2304
2441
  'toAddr': address,
2305
2442
  'dest': '4',
@@ -2333,12 +2470,14 @@ class okcoin(Exchange, ImplicitAPI):
2333
2470
  # }
2334
2471
  #
2335
2472
  data = self.safe_value(response, 'data', [])
2336
- transaction = self.safe_value(data, 0)
2473
+ transaction = self.safe_dict(data, 0)
2337
2474
  return self.parse_transaction(transaction, currency)
2338
2475
 
2339
2476
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2340
2477
  """
2341
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-funding-get-deposit-history
2478
+
2479
+ https://www.okcoin.com/docs-v5/en/#rest-api-funding-get-deposit-history
2480
+
2342
2481
  fetch all deposits made to an account
2343
2482
  :param str code: unified currency code
2344
2483
  :param int [since]: the earliest time in ms to fetch deposits for
@@ -2347,7 +2486,7 @@ class okcoin(Exchange, ImplicitAPI):
2347
2486
  :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
2348
2487
  """
2349
2488
  self.load_markets()
2350
- request = {
2489
+ request: dict = {
2351
2490
  # 'ccy': currency['id'],
2352
2491
  # 'state': 2, # 0 waiting for confirmation, 1 deposit credited, 2 deposit successful
2353
2492
  # 'after': since,
@@ -2402,12 +2541,14 @@ class okcoin(Exchange, ImplicitAPI):
2402
2541
  # ]
2403
2542
  # }
2404
2543
  #
2405
- data = self.safe_value(response, 'data', [])
2544
+ data = self.safe_list(response, 'data', [])
2406
2545
  return self.parse_transactions(data, currency, since, limit, params)
2407
2546
 
2408
2547
  def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2409
2548
  """
2410
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-funding-get-withdrawal-history
2549
+
2550
+ https://www.okcoin.com/docs-v5/en/#rest-api-funding-get-withdrawal-history
2551
+
2411
2552
  fetch all withdrawals made from an account
2412
2553
  :param str code: unified currency code
2413
2554
  :param int [since]: the earliest time in ms to fetch withdrawals for
@@ -2416,7 +2557,7 @@ class okcoin(Exchange, ImplicitAPI):
2416
2557
  :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
2417
2558
  """
2418
2559
  self.load_markets()
2419
- request = {
2560
+ request: dict = {
2420
2561
  # 'ccy': currency['id'],
2421
2562
  # 'state': 2, # -3: pending cancel, -2 canceled, -1 failed, 0, pending, 1 sending, 2 sent, 3 awaiting email verification, 4 awaiting manual verification, 5 awaiting identity verification
2422
2563
  # 'after': since,
@@ -2463,10 +2604,10 @@ class okcoin(Exchange, ImplicitAPI):
2463
2604
  # ]
2464
2605
  # }
2465
2606
  #
2466
- data = self.safe_value(response, 'data', [])
2607
+ data = self.safe_list(response, 'data', [])
2467
2608
  return self.parse_transactions(data, currency, since, limit, params)
2468
2609
 
2469
- def parse_transaction_status(self, status):
2610
+ def parse_transaction_status(self, status: Str):
2470
2611
  #
2471
2612
  # deposit statuses
2472
2613
  #
@@ -2490,7 +2631,7 @@ class okcoin(Exchange, ImplicitAPI):
2490
2631
  # "5": "awaiting identity confirmation"
2491
2632
  # }
2492
2633
  #
2493
- statuses = {
2634
+ statuses: dict = {
2494
2635
  '-3': 'pending',
2495
2636
  '-2': 'canceled',
2496
2637
  '-1': 'failed',
@@ -2503,7 +2644,7 @@ class okcoin(Exchange, ImplicitAPI):
2503
2644
  }
2504
2645
  return self.safe_string(statuses, status, status)
2505
2646
 
2506
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2647
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2507
2648
  #
2508
2649
  # withdraw
2509
2650
  #
@@ -2598,8 +2739,10 @@ class okcoin(Exchange, ImplicitAPI):
2598
2739
 
2599
2740
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2600
2741
  """
2601
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-transaction-details-last-3-days
2602
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-transaction-details-last-3-months
2742
+
2743
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-transaction-details-last-3-days
2744
+ https://www.okcoin.com/docs-v5/en/#rest-api-trade-get-transaction-details-last-3-months
2745
+
2603
2746
  fetch all trades made by the user
2604
2747
  :param str symbol: unified market symbol
2605
2748
  :param int [since]: the earliest time in ms to fetch trades for
@@ -2608,7 +2751,7 @@ class okcoin(Exchange, ImplicitAPI):
2608
2751
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
2609
2752
  """
2610
2753
  self.load_markets()
2611
- request = {
2754
+ request: dict = {
2612
2755
  'instType': 'SPOT',
2613
2756
  }
2614
2757
  if (limit is not None) and (limit > 100):
@@ -2624,7 +2767,7 @@ class okcoin(Exchange, ImplicitAPI):
2624
2767
  response = self.privateGetTradeFillsHistory(self.extend(request, params))
2625
2768
  else:
2626
2769
  response = self.privateGetTradeFills(self.extend(request, params))
2627
- data = self.safe_value(response, 'data', [])
2770
+ data = self.safe_list(response, 'data', [])
2628
2771
  return self.parse_trades(data, market, since, limit)
2629
2772
 
2630
2773
  def fetch_order_trades(self, id: str, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
@@ -2637,7 +2780,7 @@ class okcoin(Exchange, ImplicitAPI):
2637
2780
  :param dict [params]: extra parameters specific to the exchange API endpoint
2638
2781
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
2639
2782
  """
2640
- request = {
2783
+ request: dict = {
2641
2784
  # 'instrument_id': market['id'],
2642
2785
  'order_id': id,
2643
2786
  # 'after': '1', # return the page after the specified page number
@@ -2646,22 +2789,24 @@ class okcoin(Exchange, ImplicitAPI):
2646
2789
  }
2647
2790
  return self.fetch_my_trades(symbol, since, limit, self.extend(request, params))
2648
2791
 
2649
- def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2792
+ def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2650
2793
  """
2651
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-funding-asset-bills-details
2652
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-account-get-bills-details-last-7-days
2653
- :see: https://www.okcoin.com/docs-v5/en/#rest-api-account-get-bills-details-last-3-months
2654
- fetch the history of changes, actions done by the user or operations that altered balance of the user
2655
- :param str code: unified currency code, default is None
2794
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
2795
+
2796
+ https://www.okcoin.com/docs-v5/en/#rest-api-funding-asset-bills-details
2797
+ https://www.okcoin.com/docs-v5/en/#rest-api-account-get-bills-details-last-7-days
2798
+ https://www.okcoin.com/docs-v5/en/#rest-api-account-get-bills-details-last-3-months
2799
+
2800
+ :param str [code]: unified currency code, default is None
2656
2801
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
2657
- :param int [limit]: max number of ledger entrys to return, default is None
2802
+ :param int [limit]: max number of ledger entries to return, default is None
2658
2803
  :param dict [params]: extra parameters specific to the exchange API endpoint
2659
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2804
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
2660
2805
  """
2661
2806
  self.load_markets()
2662
2807
  method = None
2663
2808
  method, params = self.handle_option_and_params(params, 'fetchLedger', 'method', 'privateGetAccountBills')
2664
- request = {
2809
+ request: dict = {
2665
2810
  # 'instType': None, # 'SPOT', 'MARGIN', 'SWAP', 'FUTURES", 'OPTION'
2666
2811
  # 'ccy': None, # currency['id'],
2667
2812
  # 'ctType': None, # 'linear', 'inverse', only applicable to FUTURES/SWAP
@@ -2739,7 +2884,7 @@ class okcoin(Exchange, ImplicitAPI):
2739
2884
  return self.parse_ledger(data, currency, since, limit)
2740
2885
 
2741
2886
  def parse_ledger_entry_type(self, type):
2742
- types = {
2887
+ types: dict = {
2743
2888
  '1': 'transfer', # transfer
2744
2889
  '2': 'trade', # trade
2745
2890
  '3': 'trade', # delivery
@@ -2754,7 +2899,7 @@ class okcoin(Exchange, ImplicitAPI):
2754
2899
  }
2755
2900
  return self.safe_string(types, type, type)
2756
2901
 
2757
- def parse_ledger_entry(self, item, currency: Currency = None):
2902
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2758
2903
  #
2759
2904
  # privateGetAccountBills, privateGetAccountBillsArchive
2760
2905
  #
@@ -2791,45 +2936,36 @@ class okcoin(Exchange, ImplicitAPI):
2791
2936
  # "ts": "1597026383085"
2792
2937
  # }
2793
2938
  #
2794
- id = self.safe_string(item, 'billId')
2795
- account = None
2796
- referenceId = self.safe_string(item, 'ordId')
2797
- referenceAccount = None
2798
- type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
2799
- code = self.safe_currency_code(self.safe_string(item, 'ccy'), currency)
2800
- amountString = self.safe_string(item, 'balChg')
2801
- amount = self.parse_number(amountString)
2939
+ currencyId = self.safe_string(item, 'ccy')
2940
+ code = self.safe_currency_code(currencyId, currency)
2941
+ currency = self.safe_currency(currencyId, currency)
2802
2942
  timestamp = self.safe_integer(item, 'ts')
2803
2943
  feeCostString = self.safe_string(item, 'fee')
2804
2944
  fee = None
2805
2945
  if feeCostString is not None:
2806
2946
  fee = {
2807
- 'cost': self.parse_number(Precise.string_neg(feeCostString)),
2947
+ 'cost': self.parse_to_numeric(Precise.string_neg(feeCostString)),
2808
2948
  'currency': code,
2809
2949
  }
2810
- before = None
2811
- afterString = self.safe_string(item, 'bal')
2812
- after = self.parse_number(afterString)
2813
- status = 'ok'
2814
2950
  marketId = self.safe_string(item, 'instId')
2815
2951
  symbol = self.safe_symbol(marketId, None, '-')
2816
- return {
2817
- 'id': id,
2952
+ return self.safe_ledger_entry({
2818
2953
  'info': item,
2954
+ 'id': self.safe_string(item, 'billId'),
2819
2955
  'timestamp': timestamp,
2820
2956
  'datetime': self.iso8601(timestamp),
2821
- 'account': account,
2822
- 'referenceId': referenceId,
2823
- 'referenceAccount': referenceAccount,
2824
- 'type': type,
2957
+ 'account': None,
2958
+ 'referenceId': self.safe_string(item, 'ordId'),
2959
+ 'referenceAccount': None,
2960
+ 'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
2825
2961
  'currency': code,
2826
2962
  'symbol': symbol,
2827
- 'amount': amount,
2828
- 'before': before, # balance before
2829
- 'after': after, # balance after
2830
- 'status': status,
2963
+ 'amount': self.safe_number(item, 'balChg'),
2964
+ 'before': None, # balance before
2965
+ 'after': self.safe_number(item, 'bal'), # balance after
2966
+ 'status': 'ok',
2831
2967
  'fee': fee,
2832
- }
2968
+ }, currency)
2833
2969
 
2834
2970
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
2835
2971
  isArray = isinstance(params, list)
@@ -2871,7 +3007,7 @@ class okcoin(Exchange, ImplicitAPI):
2871
3007
  else:
2872
3008
  return self.parse_trading_balance(response)
2873
3009
 
2874
- def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
3010
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2875
3011
  if not response:
2876
3012
  return None # fallback to default error handler
2877
3013
  #