ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__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 +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -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 +3513 -1511
  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 +3105 -881
  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 +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  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 +403 -150
  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 +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  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 +206 -89
  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 +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -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 +1155 -295
  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 +1729 -482
  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 +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  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 +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  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 +403 -150
  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 +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  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 +206 -89
  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 +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -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 +63 -15
  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 +138 -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 +204 -82
  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 +967 -661
  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 +168 -32
  309. ccxt/pro/exmo.py +253 -21
  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 +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  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 +486 -70
  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} +465 -407
  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} +465 -409
  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 +1155 -295
  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.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.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.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,46 @@
1
+ from ....lark import Lark
2
+
3
+ from .cairo_types import CairoType
4
+ from .parser_transformer import ParserTransformer
5
+
6
+ CAIRO_EBNF = """
7
+ %import common.WS_INLINE
8
+ %ignore WS_INLINE
9
+
10
+ IDENTIFIER: /[a-zA-Z_][a-zA-Z_0-9]*/
11
+ _DBL_STAR: "**"
12
+ COMMA: ","
13
+
14
+ ?type: non_identifier_type
15
+ | identifier -> type_struct
16
+
17
+ comma_separated{item}: item? (COMMA item)* COMMA?
18
+
19
+ named_type: identifier (":" type)? | non_identifier_type
20
+ non_identifier_type: "felt" -> type_felt
21
+ | "codeoffset" -> type_codeoffset
22
+ | type "*" -> type_pointer
23
+ | type _DBL_STAR -> type_pointer2
24
+ | "(" comma_separated{named_type} ")" -> type_tuple
25
+
26
+ identifier: IDENTIFIER ("." IDENTIFIER)*
27
+ """
28
+
29
+
30
+ def parse(code: str) -> CairoType:
31
+ """
32
+ Parses the given string and returns a CairoType.
33
+ """
34
+
35
+ grammar = CAIRO_EBNF
36
+
37
+ grammar_parser = Lark(
38
+ grammar=grammar,
39
+ start=["type"],
40
+ parser="lalr",
41
+ )
42
+
43
+ parsed = grammar_parser.parse(code)
44
+ transformed = ParserTransformer().transform(parsed)
45
+
46
+ return transformed
@@ -0,0 +1,138 @@
1
+ import dataclasses
2
+ from typing import Optional, Tuple
3
+
4
+ from ....lark import Token, Transformer, v_args
5
+
6
+ from .cairo_types import (
7
+ CairoType,
8
+ ExprIdentifier,
9
+ TypeCodeoffset,
10
+ TypeFelt,
11
+ TypeIdentifier,
12
+ TypePointer,
13
+ TypeStruct,
14
+ TypeTuple,
15
+ )
16
+
17
+
18
+ @dataclasses.dataclass
19
+ class ParserContext:
20
+ """
21
+ Represents information that affects the parsing process.
22
+ """
23
+
24
+ # If True, treat type identifiers as resolved.
25
+ resolved_types: bool = False
26
+
27
+
28
+ class ParserError(Exception):
29
+ """
30
+ Base exception for parsing process.
31
+ """
32
+
33
+
34
+ @dataclasses.dataclass
35
+ class CommaSeparated:
36
+ """
37
+ Represents a list of comma separated values, such as expressions or types.
38
+ """
39
+
40
+ args: list
41
+ has_trailing_comma: bool
42
+
43
+
44
+ class ParserTransformer(Transformer):
45
+ """
46
+ Transforms the lark tree into an AST based on the classes defined in cairo_types.py.
47
+ """
48
+
49
+ # pylint: disable=unused-argument, no-self-use
50
+
51
+ def __init__(self):
52
+ super().__init__()
53
+ self.parser_context = ParserContext()
54
+
55
+ def __default__(self, data: str, children, meta):
56
+ raise TypeError(f"Unable to parse tree node of type {data}")
57
+
58
+ def comma_separated(self, value) -> CommaSeparated:
59
+ saw_comma = None
60
+ args: list = []
61
+ for v in value:
62
+ if isinstance(v, Token) and v.type == "COMMA":
63
+ if saw_comma is not False:
64
+ raise ParserError("Unexpected comma.")
65
+ saw_comma = True
66
+ else:
67
+ if saw_comma is False:
68
+ raise ParserError("Expected a comma before this expression.")
69
+ args.append(v)
70
+
71
+ # Reset state.
72
+ saw_comma = False
73
+
74
+ if saw_comma is None:
75
+ saw_comma = False
76
+
77
+ return CommaSeparated(args=args, has_trailing_comma=saw_comma)
78
+
79
+ # Types.
80
+
81
+ @v_args(meta=True)
82
+ def named_type(self, meta, value) -> TypeTuple.Item:
83
+ name: Optional[str]
84
+ if len(value) == 1:
85
+ # Unnamed type.
86
+ (typ,) = value
87
+ name = None
88
+ if isinstance(typ, ExprIdentifier):
89
+ typ = self.type_struct([typ])
90
+ elif len(value) == 2:
91
+ # Named type.
92
+ identifier, typ = value
93
+ assert isinstance(identifier, ExprIdentifier)
94
+ assert isinstance(typ, CairoType)
95
+ if "." in identifier.name:
96
+ raise ParserError("Unexpected . in name.")
97
+ name = identifier.name
98
+ else:
99
+ raise NotImplementedError(f"Unexpected number of values. {value}")
100
+
101
+ return TypeTuple.Item(name=name, typ=typ)
102
+
103
+ @v_args(meta=True)
104
+ def type_felt(self, meta, value):
105
+ return TypeFelt()
106
+
107
+ @v_args(meta=True)
108
+ def type_codeoffset(self, meta, value):
109
+ return TypeCodeoffset()
110
+
111
+ def type_struct(self, value):
112
+ assert len(value) == 1 and isinstance(value[0], ExprIdentifier)
113
+ if self.parser_context.resolved_types:
114
+ # If parser_context.resolved_types is True, assume that the type is a struct.
115
+ return TypeStruct(scope=value[0].name)
116
+
117
+ return TypeIdentifier(name=value[0].name)
118
+
119
+ @v_args(meta=True)
120
+ def type_pointer(self, meta, value):
121
+ return TypePointer(pointee=value[0])
122
+
123
+ @v_args(meta=True)
124
+ def type_pointer2(self, meta, value):
125
+ return TypePointer(pointee=TypePointer(pointee=value[0]))
126
+
127
+ @v_args(meta=True)
128
+ def type_tuple(self, meta, value: Tuple[CommaSeparated]):
129
+ (lst,) = value
130
+ return TypeTuple(members=lst.args, has_trailing_comma=lst.has_trailing_comma)
131
+
132
+ @v_args(meta=True)
133
+ def identifier(self, meta, value):
134
+ return ExprIdentifier(name=".".join(x.value for x in value))
135
+
136
+ @v_args(meta=True)
137
+ def identifier_def(self, meta, value):
138
+ return ExprIdentifier(name=value[0].value)
@@ -0,0 +1,64 @@
1
+ from typing import List
2
+
3
+ from ..constants import FIELD_PRIME
4
+
5
+ CairoData = List[int]
6
+
7
+
8
+ MAX_UINT256 = (1 << 256) - 1
9
+ MIN_UINT256 = 0
10
+
11
+
12
+ def uint256_range_check(value: int):
13
+ if not MIN_UINT256 <= value <= MAX_UINT256:
14
+ raise ValueError(
15
+ f"Uint256 is expected to be in range [0;2**256), got: {value}."
16
+ )
17
+
18
+
19
+ MIN_FELT = -FIELD_PRIME // 2
20
+ MAX_FELT = FIELD_PRIME // 2
21
+
22
+
23
+ def is_in_felt_range(value: int) -> bool:
24
+ return 0 <= value < FIELD_PRIME
25
+
26
+
27
+ def cairo_vm_range_check(value: int):
28
+ if not is_in_felt_range(value):
29
+ raise ValueError(
30
+ f"Felt is expected to be in range [0; {FIELD_PRIME}), got: {value}."
31
+ )
32
+
33
+
34
+ def encode_shortstring(text: str) -> int:
35
+ """
36
+ A function which encodes short string value (at most 31 characters) into cairo felt (MSB as first character)
37
+
38
+ :param text: A short string value in python
39
+ :return: Short string value encoded into felt
40
+ """
41
+ if len(text) > 31:
42
+ raise ValueError(
43
+ f"Shortstring cannot be longer than 31 characters, got: {len(text)}."
44
+ )
45
+
46
+ try:
47
+ text_bytes = text.encode("ascii")
48
+ except UnicodeEncodeError as u_err:
49
+ raise ValueError(f"Expected an ascii string. Found: {repr(text)}.") from u_err
50
+ value = int.from_bytes(text_bytes, "big")
51
+
52
+ cairo_vm_range_check(value)
53
+ return value
54
+
55
+
56
+ def decode_shortstring(value: int) -> str:
57
+ """
58
+ A function which decodes a felt value to short string (at most 31 characters)
59
+
60
+ :param value: A felt value
61
+ :return: Decoded string which is corresponds to that felt
62
+ """
63
+ cairo_vm_range_check(value)
64
+ return "".join([chr(i) for i in value.to_bytes(31, byteorder="big")]).lstrip("\x00")
@@ -0,0 +1,121 @@
1
+ from __future__ import annotations
2
+
3
+ from collections import OrderedDict
4
+ from typing import Dict, cast
5
+
6
+ from .deprecated_parse import cairo_types as cairo_lang_types
7
+ from .data_types import (
8
+ ArrayType,
9
+ CairoType,
10
+ FeltType,
11
+ NamedTupleType,
12
+ StructType,
13
+ TupleType,
14
+ )
15
+ from .deprecated_parse.parser import parse
16
+
17
+
18
+ class UnknownCairoTypeError(ValueError):
19
+ """
20
+ Error thrown when TypeParser finds type that was not declared prior to parsing.
21
+ """
22
+
23
+ type_name: str
24
+
25
+ def __init__(self, type_name: str):
26
+ super().__init__(f"Type '{type_name}' is not defined")
27
+ self.type_name = type_name
28
+
29
+
30
+ class TypeParser:
31
+ """
32
+ Low level utility class for parsing Cairo types that can be used in external methods.
33
+ """
34
+
35
+ defined_types: Dict[str, StructType]
36
+
37
+ def __init__(self, defined_types: Dict[str, StructType]):
38
+ """
39
+ TypeParser constructor.
40
+
41
+ :param defined_types: dictionary containing all defined types. For now, they can only be structures.
42
+ """
43
+ self.defined_types = defined_types
44
+ for name, struct in defined_types.items():
45
+ if name != struct.name:
46
+ raise ValueError(
47
+ f"Keys must match name of type, '{name}' != '{struct.name}'."
48
+ )
49
+
50
+ def parse_inline_type(self, type_string: str) -> CairoType:
51
+ """
52
+ Inline type is one that can be used inline, for instance as return type. For instance
53
+ (a: Uint256, b: felt*, c: (felt, felt)). Structure can only be referenced in inline type, can't be defined
54
+ this way.
55
+
56
+ :param type_string: type to parse.
57
+ """
58
+ parsed = parse(type_string)
59
+ return self._transform_cairo_lang_type(parsed)
60
+
61
+ def _transform_cairo_lang_type(
62
+ self, cairo_type: cairo_lang_types.CairoType
63
+ ) -> CairoType:
64
+ """
65
+ For now, we use parse function from cairo-lang package. It will be replaced in the future, but we need to hide
66
+ it from the users.
67
+ This function takes types returned by cairo-lang package and maps them to our type classes.
68
+
69
+ :param cairo_type: type returned from parse_type function.
70
+ :return: CairoType defined by our package.
71
+ """
72
+ if isinstance(cairo_type, cairo_lang_types.TypeFelt):
73
+ return FeltType()
74
+
75
+ if isinstance(cairo_type, cairo_lang_types.TypePointer):
76
+ return ArrayType(self._transform_cairo_lang_type(cairo_type.pointee))
77
+
78
+ if isinstance(cairo_type, cairo_lang_types.TypeIdentifier):
79
+ return self._get_struct(str(cairo_type.name))
80
+
81
+ if isinstance(cairo_type, cairo_lang_types.TypeTuple):
82
+ # Cairo returns is_named when there are no members
83
+ if cairo_type.is_named and len(cairo_type.members) != 0:
84
+ assert all(member.name is not None for member in cairo_type.members)
85
+
86
+ return NamedTupleType(
87
+ OrderedDict(
88
+ (
89
+ cast(
90
+ str, member.name
91
+ ), # without that pyright is complaining
92
+ self._transform_cairo_lang_type(member.typ),
93
+ )
94
+ for member in cairo_type.members
95
+ )
96
+ )
97
+
98
+ return TupleType(
99
+ [
100
+ self._transform_cairo_lang_type(member.typ)
101
+ for member in cairo_type.members
102
+ ]
103
+ )
104
+
105
+ # Contracts don't support codeoffset as input/output type, user can only use it if it was defined in types
106
+ if isinstance(cairo_type, cairo_lang_types.TypeCodeoffset):
107
+ return self._get_struct("codeoffset")
108
+
109
+ # Other options are: TypeFunction, TypeStruct
110
+ # Neither of them are possible. In particular TypeStruct is not possible because we parse structs without
111
+ # info about other structs, so they will be just TypeIdentifier (structure that was not parsed).
112
+
113
+ # This is an error of our logic, so we throw a RuntimeError.
114
+ raise RuntimeError(
115
+ f"Received unknown type '{cairo_type}' from parser."
116
+ ) # pragma: no cover
117
+
118
+ def _get_struct(self, name: str):
119
+ if name not in self.defined_types:
120
+ raise UnknownCairoTypeError(name)
121
+ return self.defined_types[name]
File without changes
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Dict, Union
4
+
5
+ from ...abi.v1.parser_transformer import parse
6
+ from ..data_types import CairoType, EnumType, StructType, TypeIdentifier
7
+
8
+
9
+ class UnknownCairoTypeError(ValueError):
10
+ """
11
+ Error thrown when TypeParser finds type that was not declared prior to parsing.
12
+ """
13
+
14
+ type_name: str
15
+
16
+ def __init__(self, type_name: str):
17
+ super().__init__(
18
+ # pylint: disable=line-too-long
19
+ f"Type '{type_name}' is not defined. Please report this issue at https://github.com/software-mansion/starknet.py/issues"
20
+ )
21
+ self.type_name = type_name
22
+
23
+
24
+ class TypeParser:
25
+ """
26
+ Low level utility class for parsing Cairo types that can be used in external methods.
27
+ """
28
+
29
+ defined_types: Dict[str, Union[StructType, EnumType]]
30
+
31
+ def __init__(self, defined_types: Dict[str, Union[StructType, EnumType]]):
32
+ """
33
+ TypeParser constructor.
34
+
35
+ :param defined_types: dictionary containing all defined types. For now, they can only be structures.
36
+ """
37
+ self.defined_types = defined_types
38
+ for name, defined_type in defined_types.items():
39
+ if name != defined_type.name:
40
+ raise ValueError(
41
+ f"Keys must match name of type, '{name}' != '{defined_type.name}'."
42
+ )
43
+
44
+ def parse_inline_type(self, type_string: str) -> CairoType:
45
+ """
46
+ Inline type is one that can be used inline, for instance as return type. For instance
47
+ (core::felt252, (), (core::felt252,)). Structure can only be referenced in inline type, can't be defined
48
+ this way.
49
+
50
+ :param type_string: type to parse.
51
+ """
52
+ parsed = parse(type_string, self.defined_types)
53
+ if isinstance(parsed, TypeIdentifier):
54
+ for defined_name in self.defined_types.keys():
55
+ if parsed.name == defined_name.split("<")[0].strip(":"):
56
+ return self.defined_types[defined_name]
57
+ raise UnknownCairoTypeError(parsed.name)
58
+
59
+ return parsed
File without changes
@@ -0,0 +1,77 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Dict, Union
4
+
5
+ from ...abi.v2.parser_transformer import parse
6
+ from ..data_types import (
7
+ CairoType,
8
+ EnumType,
9
+ EventType,
10
+ StructType,
11
+ TypeIdentifier,
12
+ )
13
+
14
+
15
+ class UnknownCairoTypeError(ValueError):
16
+ """
17
+ Error thrown when TypeParser finds type that was not declared prior to parsing.
18
+ """
19
+
20
+ type_name: str
21
+
22
+ def __init__(self, type_name: str):
23
+ super().__init__(
24
+ # pylint: disable=line-too-long
25
+ f"Type '{type_name}' is not defined. Please report this issue at https://github.com/software-mansion/starknet.py/issues"
26
+ )
27
+ self.type_name = type_name
28
+
29
+
30
+ class TypeParser:
31
+ """
32
+ Low level utility class for parsing Cairo types that can be used in external methods.
33
+ """
34
+
35
+ defined_types: Dict[str, Union[StructType, EnumType, EventType]]
36
+
37
+ def __init__(
38
+ self, defined_types: Dict[str, Union[StructType, EnumType, EventType]]
39
+ ):
40
+ """
41
+ TypeParser constructor.
42
+
43
+ :param defined_types: dictionary containing all defined types. For now, they can only be structures.
44
+ """
45
+ self.defined_types = defined_types
46
+ for name, defined_type in defined_types.items():
47
+ if name != defined_type.name:
48
+ raise ValueError(
49
+ f"Keys must match name of type, '{name}' != '{defined_type.name}'."
50
+ )
51
+
52
+ def update_defined_types(
53
+ self, defined_types: Dict[str, Union[StructType, EnumType, EventType]]
54
+ ) -> None:
55
+ self.defined_types.update(defined_types)
56
+
57
+ def add_defined_type(
58
+ self, defined_type: Union[StructType, EnumType, EventType]
59
+ ) -> None:
60
+ self.defined_types.update({defined_type.name: defined_type})
61
+
62
+ def parse_inline_type(self, type_string: str) -> CairoType:
63
+ """
64
+ Inline type is one that can be used inline, for instance as return type. For instance
65
+ (core::felt252, (), (core::felt252,)). Structure can only be referenced in inline type, can't be defined
66
+ this way.
67
+
68
+ :param type_string: type to parse.
69
+ """
70
+ parsed = parse(type_string, self.defined_types)
71
+ if isinstance(parsed, TypeIdentifier):
72
+ for defined_name in self.defined_types.keys():
73
+ if parsed.name == defined_name.split("<")[0].strip(":"):
74
+ return self.defined_types[defined_name]
75
+ raise UnknownCairoTypeError(parsed.name)
76
+
77
+ return parsed
@@ -0,0 +1,7 @@
1
+ # utils to use starknet library in ccxt
2
+ from .constants import EC_ORDER
3
+ from ..starkware.crypto.signature import grind_key
4
+
5
+ def get_private_key_from_eth_signature(eth_signature_hex: str) -> int:
6
+ r = eth_signature_hex[2 : 64 + 2] if eth_signature_hex[0:2] == '0x' else eth_signature_hex[0 : 64]
7
+ return grind_key(int(r, 16), EC_ORDER)
@@ -0,0 +1,15 @@
1
+ from typing import Literal, Union
2
+
3
+ def int_from_hex(number: Union[str, int]) -> int:
4
+ return number if isinstance(number, int) else int(number, 16)
5
+
6
+
7
+ def int_from_bytes(
8
+ value: bytes,
9
+ byte_order: Literal["big", "little"] = "big",
10
+ signed: bool = False,
11
+ ) -> int:
12
+ """
13
+ Converts the given bytes object (parsed according to the given byte order) to an integer.
14
+ """
15
+ return int.from_bytes(value, byteorder=byte_order, signed=signed)
@@ -0,0 +1,39 @@
1
+ from pathlib import Path
2
+
3
+ # Address came from starkware-libs/starknet-addresses repository: https://github.com/starkware-libs/starknet-addresses
4
+ FEE_CONTRACT_ADDRESS = (
5
+ "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"
6
+ )
7
+
8
+ DEFAULT_DEPLOYER_ADDRESS = (
9
+ "0x041a78e741e5aF2fEc34B695679bC6891742439f7AFB8484Ecd7766661aD02BF"
10
+ )
11
+
12
+ API_VERSION = 0
13
+
14
+ RPC_CONTRACT_NOT_FOUND_ERROR = 20
15
+ RPC_INVALID_MESSAGE_SELECTOR_ERROR = 21
16
+ RPC_CLASS_HASH_NOT_FOUND_ERROR = 28
17
+ RPC_CONTRACT_ERROR = 40
18
+
19
+ DEFAULT_ENTRY_POINT_NAME = "__default__"
20
+ DEFAULT_L1_ENTRY_POINT_NAME = "__l1_default__"
21
+ DEFAULT_ENTRY_POINT_SELECTOR = 0
22
+ DEFAULT_DECLARE_SENDER_ADDRESS = 1
23
+
24
+ # MAX_STORAGE_ITEM_SIZE and ADDR_BOUND must be consistent with the corresponding constant in
25
+ # starkware/starknet/common/storage.cairo.
26
+ MAX_STORAGE_ITEM_SIZE = 256
27
+ ADDR_BOUND = 2**251 - MAX_STORAGE_ITEM_SIZE
28
+
29
+ FIELD_PRIME = 0x800000000000011000000000000000000000000000000000000000000000001
30
+ EC_ORDER = 0x800000000000010FFFFFFFFFFFFFFFFB781126DCAE7B2321E66A241ADC64D2F
31
+
32
+ # From cairo-lang
33
+ # int_from_bytes(b"STARKNET_CONTRACT_ADDRESS")
34
+ CONTRACT_ADDRESS_PREFIX = 523065374597054866729014270389667305596563390979550329787219
35
+ L2_ADDRESS_UPPER_BOUND = 2**251 - 256
36
+
37
+ QUERY_VERSION_BASE = 2**128
38
+
39
+ ROOT_PATH = Path(__file__).parent
File without changes
@@ -0,0 +1,79 @@
1
+ from typing import Sequence
2
+
3
+ from ..constants import CONTRACT_ADDRESS_PREFIX, L2_ADDRESS_UPPER_BOUND
4
+ from .utils import (
5
+ HEX_PREFIX,
6
+ _starknet_keccak,
7
+ compute_hash_on_elements,
8
+ encode_uint,
9
+ get_bytes_length,
10
+ )
11
+
12
+
13
+ def compute_address(
14
+ *,
15
+ class_hash: int,
16
+ constructor_calldata: Sequence[int],
17
+ salt: int,
18
+ deployer_address: int = 0,
19
+ ) -> int:
20
+ """
21
+ Computes the contract address in the Starknet network - a unique identifier of the contract.
22
+
23
+ :param class_hash: class hash of the contract
24
+ :param constructor_calldata: calldata for the contract constructor
25
+ :param salt: salt used to calculate contract address
26
+ :param deployer_address: address of the deployer (if not provided default 0 is used)
27
+ :return: Contract's address
28
+ """
29
+
30
+ constructor_calldata_hash = compute_hash_on_elements(data=constructor_calldata)
31
+ raw_address = compute_hash_on_elements(
32
+ data=[
33
+ CONTRACT_ADDRESS_PREFIX,
34
+ deployer_address,
35
+ salt,
36
+ class_hash,
37
+ constructor_calldata_hash,
38
+ ],
39
+ )
40
+
41
+ return raw_address % L2_ADDRESS_UPPER_BOUND
42
+
43
+
44
+ def get_checksum_address(address: str) -> str:
45
+ """
46
+ Outputs formatted checksum address.
47
+
48
+ Follows implementation of starknet.js. It is not compatible with EIP55 as it treats hex string as encoded number,
49
+ instead of encoding it as ASCII string.
50
+
51
+ :param address: Address to encode
52
+ :return: Checksum address
53
+ """
54
+ if not address.lower().startswith(HEX_PREFIX):
55
+ raise ValueError(f"{address} is not a valid hexadecimal address.")
56
+
57
+ int_address = int(address, 16)
58
+ string_address = address[2:].zfill(64)
59
+
60
+ address_in_bytes = encode_uint(int_address, get_bytes_length(int_address))
61
+ address_hash = _starknet_keccak(address_in_bytes)
62
+
63
+ result = "".join(
64
+ (
65
+ char.upper()
66
+ if char.isalpha() and (address_hash >> 256 - 4 * i - 1) & 1
67
+ else char
68
+ )
69
+ for i, char in enumerate(string_address)
70
+ )
71
+
72
+ return f"{HEX_PREFIX}{result}"
73
+
74
+
75
+ def is_checksum_address(address: str) -> bool:
76
+ """
77
+ Checks if provided string is in a checksum address format.
78
+ """
79
+ return get_checksum_address(address) == address