ccxt 4.2.77__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 +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 +3104 -880
  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 +1513 -563
  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 +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 +404 -109
  125. ccxt/async_support/deribit.py +557 -323
  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 +1472 -463
  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 +1633 -268
  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 +917 -357
  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 +1776 -454
  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 +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 +3104 -880
  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 +1513 -563
  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 +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 +404 -109
  233. ccxt/deribit.py +557 -323
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1472 -463
  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 +1632 -268
  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 +917 -357
  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 +1776 -454
  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 +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 +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 +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.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.77.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.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.48.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,66 @@
1
+ from dataclasses import dataclass
2
+ from typing import Generator
3
+
4
+ from ...cairo.felt import decode_shortstring, encode_shortstring
5
+ from .._context import (
6
+ DeserializationContext,
7
+ SerializationContext,
8
+ )
9
+ from ._common import (
10
+ deserialize_to_list,
11
+ serialize_from_list,
12
+ )
13
+ from .cairo_data_serializer import (
14
+ CairoDataSerializer,
15
+ )
16
+ from .felt_serializer import FeltSerializer
17
+
18
+ BYTES_31_SIZE = 31
19
+
20
+
21
+ @dataclass
22
+ class ByteArraySerializer(CairoDataSerializer[str, str]):
23
+ """
24
+ Serializer for ByteArrays. Serializes to and deserializes from str values.
25
+
26
+ Examples:
27
+ "" => [0,0,0]
28
+ "hello" => [0,448378203247,5]
29
+ """
30
+
31
+ def deserialize_with_context(self, context: DeserializationContext) -> str:
32
+ with context.push_entity("data_array_len"):
33
+ [size] = context.reader.read(1)
34
+
35
+ data = deserialize_to_list([FeltSerializer()] * size, context)
36
+
37
+ with context.push_entity("pending_word"):
38
+ [pending_word] = context.reader.read(1)
39
+
40
+ with context.push_entity("pending_word_len"):
41
+ [pending_word_len] = context.reader.read(1)
42
+
43
+ pending_word = decode_shortstring(pending_word)
44
+ context.ensure_valid_value(
45
+ len(pending_word) == pending_word_len,
46
+ f"Invalid length {pending_word_len} for pending word {pending_word}",
47
+ )
48
+
49
+ data_joined = "".join(map(decode_shortstring, data))
50
+ return data_joined + pending_word
51
+
52
+ def serialize_with_context(
53
+ self, context: SerializationContext, value: str
54
+ ) -> Generator[int, None, None]:
55
+ context.ensure_valid_type(value, isinstance(value, str), "str")
56
+ data = [
57
+ value[i : i + BYTES_31_SIZE] for i in range(0, len(value), BYTES_31_SIZE)
58
+ ]
59
+ pending_word = (
60
+ "" if len(data) == 0 or len(data[-1]) == BYTES_31_SIZE else data.pop(-1)
61
+ )
62
+
63
+ yield len(data)
64
+ yield from serialize_from_list([FeltSerializer()] * len(data), context, data)
65
+ yield encode_shortstring(pending_word)
66
+ yield len(pending_word)
@@ -0,0 +1,71 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Generator, Generic, List, TypeVar
3
+
4
+ from .._calldata_reader import CairoData
5
+ from .._context import (
6
+ DeserializationContext,
7
+ SerializationContext,
8
+ )
9
+
10
+ # Python type that is accepted by a serializer
11
+ # pylint: disable=invalid-name
12
+ SerializationType = TypeVar("SerializationType")
13
+
14
+ # Python type that will be returned from a serializer. Often same as SerializationType.
15
+ # pylint: disable=invalid-name
16
+ DeserializationType = TypeVar("DeserializationType")
17
+
18
+
19
+ class CairoDataSerializer(ABC, Generic[SerializationType, DeserializationType]):
20
+ """
21
+ Base class for serializing/deserializing data to/from calldata.
22
+ """
23
+
24
+ def deserialize(self, data: List[int]) -> DeserializationType:
25
+ """
26
+ Transform calldata into python value.
27
+
28
+ :param data: calldata to deserialize.
29
+ :return: defined DeserializationType.
30
+ """
31
+ with DeserializationContext.create(data) as context:
32
+ return self.deserialize_with_context(context)
33
+
34
+ def serialize(self, data: SerializationType) -> CairoData:
35
+ """
36
+ Transform python data into calldata.
37
+
38
+ :param data: data to serialize.
39
+ :return: calldata.
40
+ """
41
+ with SerializationContext.create() as context:
42
+ serialized_data = list(self.serialize_with_context(context, data))
43
+
44
+ return self.remove_units_from_serialized_data(serialized_data)
45
+
46
+ @abstractmethod
47
+ def deserialize_with_context(
48
+ self, context: DeserializationContext
49
+ ) -> DeserializationType:
50
+ """
51
+ Transform calldata into python value.
52
+
53
+ :param context: context of this deserialization.
54
+ :return: defined DeserializationType.
55
+ """
56
+
57
+ @abstractmethod
58
+ def serialize_with_context(
59
+ self, context: SerializationContext, value: SerializationType
60
+ ) -> Generator[int, None, None]:
61
+ """
62
+ Transform python value into calldata.
63
+
64
+ :param context: context of this serialization.
65
+ :param value: python value to serialize.
66
+ :return: defined SerializationType.
67
+ """
68
+
69
+ @staticmethod
70
+ def remove_units_from_serialized_data(serialized_data: List) -> List:
71
+ return [x for x in serialized_data if x is not None]
@@ -0,0 +1,71 @@
1
+ from dataclasses import dataclass
2
+ from typing import Dict, Generator, OrderedDict, Tuple, Union
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from .cairo_data_serializer import (
9
+ CairoDataSerializer,
10
+ )
11
+ from ..tuple_dataclass import TupleDataclass
12
+
13
+
14
+ @dataclass
15
+ class EnumSerializer(CairoDataSerializer[Union[Dict, TupleDataclass], TupleDataclass]):
16
+ """
17
+ Serializer of enums.
18
+ Can serialize a dictionary and TupleDataclass.
19
+ Deserializes data to a TupleDataclass.
20
+
21
+ Example:
22
+ enum MyEnum {
23
+ a: u128,
24
+ b: u128
25
+ }
26
+
27
+ {"a": 1} => [0, 1]
28
+ {"b": 100} => [1, 100]
29
+ TupleDataclass(variant='a', value=100) => [0, 100]
30
+ """
31
+
32
+ serializers: OrderedDict[str, CairoDataSerializer]
33
+
34
+ def deserialize_with_context(
35
+ self, context: DeserializationContext
36
+ ) -> TupleDataclass:
37
+ [variant_index] = context.reader.read(1)
38
+ variant_name, serializer = self._get_variant(variant_index)
39
+
40
+ with context.push_entity("enum.variant: " + variant_name):
41
+ result_dict = {
42
+ "variant": variant_name,
43
+ "value": serializer.deserialize_with_context(context),
44
+ }
45
+
46
+ return TupleDataclass.from_dict(result_dict)
47
+
48
+ def serialize_with_context(
49
+ self, context: SerializationContext, value: Union[Dict, TupleDataclass]
50
+ ) -> Generator[int, None, None]:
51
+ if isinstance(value, Dict):
52
+ items = list(value.items())
53
+ if len(items) != 1:
54
+ raise ValueError(
55
+ "Can serialize only one enum variant, got: " + str(len(items))
56
+ )
57
+
58
+ variant_name, variant_value = items[0]
59
+ else:
60
+ variant_name, variant_value = value
61
+
62
+ yield self._get_variant_index(variant_name)
63
+ yield from self.serializers[variant_name].serialize_with_context(
64
+ context, variant_value
65
+ )
66
+
67
+ def _get_variant(self, variant_index: int) -> Tuple[str, CairoDataSerializer]:
68
+ return list(self.serializers.items())[variant_index]
69
+
70
+ def _get_variant_index(self, variant_name: str) -> int:
71
+ return list(self.serializers.keys()).index(variant_name)
@@ -0,0 +1,50 @@
1
+ import warnings
2
+ from dataclasses import dataclass
3
+ from typing import Generator
4
+
5
+ from ...cairo.felt import encode_shortstring, is_in_felt_range
6
+ from ...constants import FIELD_PRIME
7
+ from .._context import (
8
+ Context,
9
+ DeserializationContext,
10
+ SerializationContext,
11
+ )
12
+ from .cairo_data_serializer import (
13
+ CairoDataSerializer,
14
+ )
15
+
16
+
17
+ @dataclass
18
+ class FeltSerializer(CairoDataSerializer[int, int]):
19
+ """
20
+ Serializer for field element. At the time of writing it is the only existing numeric type.
21
+ """
22
+
23
+ def deserialize_with_context(self, context: DeserializationContext) -> int:
24
+ [val] = context.reader.read(1)
25
+ self._ensure_felt(context, val)
26
+ return val
27
+
28
+ def serialize_with_context(
29
+ self, context: SerializationContext, value: int
30
+ ) -> Generator[int, None, None]:
31
+ if isinstance(value, str):
32
+ warnings.warn(
33
+ "Serializing shortstrings in FeltSerializer is deprecated. "
34
+ "Use starknet_py.cairo.felt.encode_shortstring instead.",
35
+ category=DeprecationWarning,
36
+ )
37
+ value = encode_shortstring(value)
38
+ yield value
39
+ return
40
+
41
+ context.ensure_valid_type(value, isinstance(value, int), "int")
42
+ self._ensure_felt(context, value)
43
+ yield value
44
+
45
+ @staticmethod
46
+ def _ensure_felt(context: Context, value: int):
47
+ context.ensure_valid_value(
48
+ is_in_felt_range(value),
49
+ f"invalid value '{value}' - must be in [0, {FIELD_PRIME}) range",
50
+ )
@@ -0,0 +1,58 @@
1
+ from dataclasses import dataclass
2
+ from typing import Dict, Generator, NamedTuple, OrderedDict, Union
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from ._common import (
9
+ deserialize_to_dict,
10
+ serialize_from_dict,
11
+ )
12
+ from .cairo_data_serializer import (
13
+ CairoDataSerializer,
14
+ )
15
+ from ..tuple_dataclass import TupleDataclass
16
+
17
+
18
+ @dataclass
19
+ class NamedTupleSerializer(
20
+ CairoDataSerializer[Union[Dict, NamedTuple, TupleDataclass], TupleDataclass]
21
+ ):
22
+ """
23
+ Serializer for tuples with named fields.
24
+ Can serialize a dictionary, a named tuple and TupleDataclass.
25
+ Deserializes data to a TupleDataclass.
26
+
27
+ Example:
28
+ {"a": 1, "b": 2} => [1,2]
29
+ """
30
+
31
+ serializers: OrderedDict[str, CairoDataSerializer]
32
+
33
+ def deserialize_with_context(
34
+ self, context: DeserializationContext
35
+ ) -> TupleDataclass:
36
+ as_dictionary = deserialize_to_dict(self.serializers, context)
37
+ return TupleDataclass.from_dict(as_dictionary)
38
+
39
+ def serialize_with_context(
40
+ self,
41
+ context: SerializationContext,
42
+ value: Union[Dict, NamedTuple, TupleDataclass],
43
+ ) -> Generator[int, None, None]:
44
+ # We can't use isinstance(value, NamedTuple), because there is no NamedTuple type.
45
+ context.ensure_valid_type(
46
+ value,
47
+ isinstance(value, (dict, TupleDataclass)) or self._is_namedtuple(value),
48
+ "dict, NamedTuple or TupleDataclass",
49
+ )
50
+
51
+ # noinspection PyUnresolvedReferences, PyProtectedMember
52
+ values: Dict = value if isinstance(value, dict) else value._asdict()
53
+
54
+ yield from serialize_from_dict(self.serializers, context, values)
55
+
56
+ @staticmethod
57
+ def _is_namedtuple(value) -> bool:
58
+ return isinstance(value, tuple) and hasattr(value, "_fields")
@@ -0,0 +1,43 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any, Generator, Optional
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from .cairo_data_serializer import (
9
+ CairoDataSerializer,
10
+ )
11
+
12
+
13
+ @dataclass
14
+ class OptionSerializer(CairoDataSerializer[Optional[Any], Optional[Any]]):
15
+ """
16
+ Serializer for Option type.
17
+ Can serialize None and common CairoTypes.
18
+ Deserializes data to None or CairoType.
19
+
20
+ Example:
21
+ None => [1]
22
+ {"option1": 123, "option2": None} => [0, 123, 1]
23
+ """
24
+
25
+ serializer: CairoDataSerializer
26
+
27
+ def deserialize_with_context(
28
+ self, context: DeserializationContext
29
+ ) -> Optional[Any]:
30
+ (is_none,) = context.reader.read(1)
31
+ if is_none == 1:
32
+ return None
33
+
34
+ return self.serializer.deserialize_with_context(context)
35
+
36
+ def serialize_with_context(
37
+ self, context: SerializationContext, value: Optional[Any]
38
+ ) -> Generator[int, None, None]:
39
+ if value is None:
40
+ yield 1
41
+ else:
42
+ yield 0
43
+ yield from self.serializer.serialize_with_context(context, value)
@@ -0,0 +1,40 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Dict, Generator, List, Tuple
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from .cairo_data_serializer import (
9
+ CairoDataSerializer,
10
+ )
11
+
12
+
13
+ @dataclass
14
+ class OutputSerializer(CairoDataSerializer[List, Tuple]):
15
+ """
16
+ Serializer for function output.
17
+ Can't serialize anything.
18
+ Deserializes data to a Tuple.
19
+
20
+ Example:
21
+ [1, 1, 1] => (340282366920938463463374607431768211457)
22
+ """
23
+
24
+ serializers: List[CairoDataSerializer] = field(init=True)
25
+
26
+ def deserialize_with_context(self, context: DeserializationContext) -> Tuple:
27
+ result = []
28
+
29
+ for index, serializer in enumerate(self.serializers):
30
+ with context.push_entity("output[" + str(index) + "]"):
31
+ result.append(serializer.deserialize_with_context(context))
32
+
33
+ return tuple(result)
34
+
35
+ def serialize_with_context(
36
+ self, context: SerializationContext, value: Dict
37
+ ) -> Generator[int, None, None]:
38
+ raise ValueError(
39
+ "Output serializer can't be used to transform python data into calldata."
40
+ )
@@ -0,0 +1,72 @@
1
+ from collections import OrderedDict as _OrderedDict
2
+ from dataclasses import InitVar, dataclass, field
3
+ from typing import Dict, Generator, OrderedDict
4
+
5
+ from .._context import (
6
+ DeserializationContext,
7
+ SerializationContext,
8
+ )
9
+ from ._common import (
10
+ deserialize_to_dict,
11
+ serialize_from_dict,
12
+ )
13
+ from .array_serializer import ArraySerializer
14
+ from .cairo_data_serializer import (
15
+ CairoDataSerializer,
16
+ )
17
+ from .felt_serializer import FeltSerializer
18
+ from ..tuple_dataclass import TupleDataclass
19
+
20
+ SIZE_SUFFIX = "_len"
21
+ SIZE_SUFFIX_LEN = len(SIZE_SUFFIX)
22
+
23
+
24
+ @dataclass
25
+ class PayloadSerializer(CairoDataSerializer[Dict, TupleDataclass]):
26
+ """
27
+ Serializer for payloads like function arguments/function outputs/events.
28
+ Can serialize a dictionary.
29
+ Deserializes data to a TupleDataclass.
30
+
31
+ Example:
32
+ {"a": 1, "b": 2} => [1,2]
33
+ """
34
+
35
+ # Value present only in constructor.
36
+ # We don't want to mutate the serializers received in constructor.
37
+ input_serializers: InitVar[OrderedDict[str, CairoDataSerializer]]
38
+
39
+ serializers: OrderedDict[str, CairoDataSerializer] = field(init=False)
40
+
41
+ def __post_init__(self, input_serializers):
42
+ """
43
+ ABI adds ARG_len for every argument ARG that is an array. We parse length as a part of ArraySerializer, so we
44
+ need to remove those lengths from args.
45
+ """
46
+ self.serializers = _OrderedDict(
47
+ (key, serializer)
48
+ for key, serializer in input_serializers.items()
49
+ if not self._is_len_arg(key, input_serializers)
50
+ )
51
+
52
+ def deserialize_with_context(
53
+ self, context: DeserializationContext
54
+ ) -> TupleDataclass:
55
+ as_dictionary = deserialize_to_dict(self.serializers, context)
56
+ return TupleDataclass.from_dict(as_dictionary)
57
+
58
+ def serialize_with_context(
59
+ self, context: SerializationContext, value: Dict
60
+ ) -> Generator[int, None, None]:
61
+ yield from serialize_from_dict(self.serializers, context, value)
62
+
63
+ @staticmethod
64
+ def _is_len_arg(arg_name: str, serializers: Dict[str, CairoDataSerializer]) -> bool:
65
+ return (
66
+ arg_name.endswith(SIZE_SUFFIX)
67
+ and isinstance(serializers[arg_name], FeltSerializer)
68
+ # There is an ArraySerializer under key that is arg_name without the size suffix
69
+ and isinstance(
70
+ serializers.get(arg_name[:-SIZE_SUFFIX_LEN]), ArraySerializer
71
+ )
72
+ )
@@ -0,0 +1,36 @@
1
+ from dataclasses import dataclass
2
+ from typing import Dict, Generator, OrderedDict
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from ._common import (
9
+ deserialize_to_dict,
10
+ serialize_from_dict,
11
+ )
12
+ from .cairo_data_serializer import (
13
+ CairoDataSerializer,
14
+ )
15
+
16
+
17
+ @dataclass
18
+ class StructSerializer(CairoDataSerializer[Dict, Dict]):
19
+ """
20
+ Serializer of custom structures.
21
+ Can serialize a dictionary.
22
+ Deserializes data to a dictionary.
23
+
24
+ Example:
25
+ {"a": 1, "b": 2} => [1,2]
26
+ """
27
+
28
+ serializers: OrderedDict[str, CairoDataSerializer]
29
+
30
+ def deserialize_with_context(self, context: DeserializationContext) -> Dict:
31
+ return deserialize_to_dict(self.serializers, context)
32
+
33
+ def serialize_with_context(
34
+ self, context: SerializationContext, value: Dict
35
+ ) -> Generator[int, None, None]:
36
+ yield from serialize_from_dict(self.serializers, context, value)
@@ -0,0 +1,36 @@
1
+ from dataclasses import dataclass
2
+ from typing import Generator, Iterable, List, Tuple
3
+
4
+ from .._context import (
5
+ DeserializationContext,
6
+ SerializationContext,
7
+ )
8
+ from ._common import (
9
+ deserialize_to_list,
10
+ serialize_from_list,
11
+ )
12
+ from .cairo_data_serializer import (
13
+ CairoDataSerializer,
14
+ )
15
+
16
+
17
+ @dataclass
18
+ class TupleSerializer(CairoDataSerializer[Iterable, Tuple]):
19
+ """
20
+ Serializer for tuples without named fields.
21
+ Can serialize any iterable.
22
+ Deserializes data to a python tuple.
23
+
24
+ Example:
25
+ (1,2,(3,4)) => [1,2,3,4]
26
+ """
27
+
28
+ serializers: List[CairoDataSerializer]
29
+
30
+ def deserialize_with_context(self, context: DeserializationContext) -> Tuple:
31
+ return tuple(deserialize_to_list(self.serializers, context))
32
+
33
+ def serialize_with_context(
34
+ self, context: SerializationContext, value: Iterable
35
+ ) -> Generator[int, None, None]:
36
+ yield from serialize_from_list(self.serializers, context, [*value])
@@ -0,0 +1,76 @@
1
+ from dataclasses import dataclass
2
+ from typing import Generator, TypedDict, Union
3
+
4
+ from ...cairo.felt import uint256_range_check
5
+ from .._context import (
6
+ Context,
7
+ DeserializationContext,
8
+ SerializationContext,
9
+ )
10
+ from .cairo_data_serializer import (
11
+ CairoDataSerializer,
12
+ )
13
+
14
+ U128_UPPER_BOUND = 2**128
15
+
16
+
17
+ class Uint256Dict(TypedDict):
18
+ low: int
19
+ high: int
20
+
21
+
22
+ @dataclass
23
+ class Uint256Serializer(CairoDataSerializer[Union[int, Uint256Dict], int]):
24
+ """
25
+ Serializer of Uint256. In Cairo it is represented by structure {low: Uint128, high: Uint128}.
26
+ Can serialize an int.
27
+ Deserializes data to an int.
28
+
29
+ Examples:
30
+ 0 => [0,0]
31
+ 1 => [1,0]
32
+ 2**128 => [0,1]
33
+ 3 + 2**128 => [3,1]
34
+ """
35
+
36
+ def deserialize_with_context(self, context: DeserializationContext) -> int:
37
+ [low, high] = context.reader.read(2)
38
+
39
+ # Checking if resulting value is in [0, 2**256) range is not enough. Uint256 should be made of two uint128.
40
+ with context.push_entity("low"):
41
+ self._ensure_valid_uint128(low, context)
42
+ with context.push_entity("high"):
43
+ self._ensure_valid_uint128(high, context)
44
+
45
+ return (high << 128) + low
46
+
47
+ def serialize_with_context(
48
+ self, context: SerializationContext, value: Union[int, Uint256Dict]
49
+ ) -> Generator[int, None, None]:
50
+ context.ensure_valid_type(value, isinstance(value, (int, dict)), "int or dict")
51
+ if isinstance(value, int):
52
+ yield from self._serialize_from_int(value)
53
+ else:
54
+ yield from self._serialize_from_dict(context, value)
55
+
56
+ @staticmethod
57
+ def _serialize_from_int(value: int) -> Generator[int, None, None]:
58
+ uint256_range_check(value)
59
+ result = (value % 2**128, value // 2**128)
60
+ yield from result
61
+
62
+ def _serialize_from_dict(
63
+ self, context: SerializationContext, value: Uint256Dict
64
+ ) -> Generator[int, None, None]:
65
+ with context.push_entity("low"):
66
+ self._ensure_valid_uint128(value["low"], context)
67
+ yield value["low"]
68
+ with context.push_entity("high"):
69
+ self._ensure_valid_uint128(value["high"], context)
70
+ yield value["high"]
71
+
72
+ @staticmethod
73
+ def _ensure_valid_uint128(value: int, context: Context):
74
+ context.ensure_valid_value(
75
+ 0 <= value < U128_UPPER_BOUND, "expected value in range [0;2**128)"
76
+ )