coinex-api 0.0.13__py3-none-any.whl → 0.0.14__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 (289) hide show
  1. coinex/__init__.py +7 -0
  2. coinex/ccxt/__init__.py +101 -0
  3. coinex/ccxt/abstract/coinex.py +237 -0
  4. coinex/ccxt/async_support/__init__.py +80 -0
  5. coinex/ccxt/async_support/base/__init__.py +1 -0
  6. coinex/ccxt/async_support/base/exchange.py +2100 -0
  7. coinex/ccxt/async_support/base/throttler.py +50 -0
  8. coinex/ccxt/async_support/base/ws/__init__.py +38 -0
  9. coinex/ccxt/async_support/base/ws/aiohttp_client.py +147 -0
  10. coinex/ccxt/async_support/base/ws/cache.py +213 -0
  11. coinex/ccxt/async_support/base/ws/client.py +214 -0
  12. coinex/ccxt/async_support/base/ws/fast_client.py +97 -0
  13. coinex/ccxt/async_support/base/ws/functions.py +59 -0
  14. coinex/ccxt/async_support/base/ws/future.py +69 -0
  15. coinex/ccxt/async_support/base/ws/order_book.py +78 -0
  16. coinex/ccxt/async_support/base/ws/order_book_side.py +174 -0
  17. coinex/ccxt/async_support/coinex.py +5833 -0
  18. coinex/ccxt/base/__init__.py +27 -0
  19. coinex/ccxt/base/decimal_to_precision.py +174 -0
  20. coinex/ccxt/base/errors.py +267 -0
  21. coinex/ccxt/base/exchange.py +6769 -0
  22. coinex/ccxt/base/precise.py +297 -0
  23. coinex/ccxt/base/types.py +577 -0
  24. coinex/ccxt/coinex.py +5832 -0
  25. coinex/ccxt/pro/__init__.py +21 -0
  26. coinex/ccxt/pro/coinex.py +1366 -0
  27. coinex/ccxt/static_dependencies/README.md +1 -0
  28. coinex/ccxt/static_dependencies/__init__.py +1 -0
  29. coinex/ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  30. coinex/ccxt/static_dependencies/ecdsa/_version.py +520 -0
  31. coinex/ccxt/static_dependencies/ecdsa/curves.py +56 -0
  32. coinex/ccxt/static_dependencies/ecdsa/der.py +221 -0
  33. coinex/ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  34. coinex/ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  35. coinex/ccxt/static_dependencies/ecdsa/keys.py +332 -0
  36. coinex/ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  37. coinex/ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  38. coinex/ccxt/static_dependencies/ecdsa/util.py +266 -0
  39. coinex/ccxt/static_dependencies/ethereum/__init__.py +7 -0
  40. coinex/ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  41. coinex/ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  42. coinex/ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  43. coinex/ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  44. coinex/ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  45. coinex/ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  46. coinex/ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  47. coinex/ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  48. coinex/ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  49. coinex/ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  50. coinex/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  51. coinex/ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  52. coinex/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  53. coinex/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  54. coinex/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  55. coinex/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  56. coinex/ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  57. coinex/ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  58. coinex/ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  59. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  60. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  61. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  62. coinex/ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  63. coinex/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  64. coinex/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  65. coinex/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  66. coinex/ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  67. coinex/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  68. coinex/ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  69. coinex/ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  70. coinex/ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  71. coinex/ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  72. coinex/ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  73. coinex/ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  74. coinex/ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  75. coinex/ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  76. coinex/ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  77. coinex/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  78. coinex/ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  79. coinex/ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  80. coinex/ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  81. coinex/ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  82. coinex/ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  83. coinex/ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  84. coinex/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  85. coinex/ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  86. coinex/ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  87. coinex/ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  88. coinex/ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  89. coinex/ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  90. coinex/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  91. coinex/ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  92. coinex/ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  93. coinex/ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  94. coinex/ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  95. coinex/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  96. coinex/ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  97. coinex/ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  98. coinex/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  99. coinex/ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  100. coinex/ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  101. coinex/ccxt/static_dependencies/keccak/__init__.py +3 -0
  102. coinex/ccxt/static_dependencies/keccak/keccak.py +197 -0
  103. coinex/ccxt/static_dependencies/lark/__init__.py +38 -0
  104. coinex/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  105. coinex/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  106. coinex/ccxt/static_dependencies/lark/ast_utils.py +59 -0
  107. coinex/ccxt/static_dependencies/lark/common.py +86 -0
  108. coinex/ccxt/static_dependencies/lark/exceptions.py +292 -0
  109. coinex/ccxt/static_dependencies/lark/grammar.py +130 -0
  110. coinex/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  111. coinex/ccxt/static_dependencies/lark/grammars/common.lark +59 -0
  112. coinex/ccxt/static_dependencies/lark/grammars/lark.lark +62 -0
  113. coinex/ccxt/static_dependencies/lark/grammars/python.lark +302 -0
  114. coinex/ccxt/static_dependencies/lark/grammars/unicode.lark +7 -0
  115. coinex/ccxt/static_dependencies/lark/indenter.py +143 -0
  116. coinex/ccxt/static_dependencies/lark/lark.py +658 -0
  117. coinex/ccxt/static_dependencies/lark/lexer.py +678 -0
  118. coinex/ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  119. coinex/ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  120. coinex/ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  121. coinex/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  122. coinex/ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  123. coinex/ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  124. coinex/ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  125. coinex/ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  126. coinex/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  127. coinex/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  128. coinex/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  129. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  130. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  131. coinex/ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  132. coinex/ccxt/static_dependencies/lark/py.typed +0 -0
  133. coinex/ccxt/static_dependencies/lark/reconstruct.py +107 -0
  134. coinex/ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  135. coinex/ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  136. coinex/ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  137. coinex/ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  138. coinex/ccxt/static_dependencies/lark/tree.py +267 -0
  139. coinex/ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  140. coinex/ccxt/static_dependencies/lark/tree_templates.py +180 -0
  141. coinex/ccxt/static_dependencies/lark/utils.py +343 -0
  142. coinex/ccxt/static_dependencies/lark/visitors.py +596 -0
  143. coinex/ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  144. coinex/ccxt/static_dependencies/marshmallow/base.py +65 -0
  145. coinex/ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  146. coinex/ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  147. coinex/ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  148. coinex/ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  149. coinex/ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  150. coinex/ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  151. coinex/ccxt/static_dependencies/marshmallow/py.typed +0 -0
  152. coinex/ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  153. coinex/ccxt/static_dependencies/marshmallow/types.py +12 -0
  154. coinex/ccxt/static_dependencies/marshmallow/utils.py +378 -0
  155. coinex/ccxt/static_dependencies/marshmallow/validate.py +678 -0
  156. coinex/ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  157. coinex/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  158. coinex/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  159. coinex/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  160. coinex/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  161. coinex/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  162. coinex/ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  163. coinex/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  164. coinex/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  165. coinex/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  166. coinex/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  167. coinex/ccxt/static_dependencies/msgpack/__init__.py +55 -0
  168. coinex/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +11 -0
  169. coinex/ccxt/static_dependencies/msgpack/_packer.pyx +374 -0
  170. coinex/ccxt/static_dependencies/msgpack/_unpacker.pyx +547 -0
  171. coinex/ccxt/static_dependencies/msgpack/buff_converter.h +8 -0
  172. coinex/ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  173. coinex/ccxt/static_dependencies/msgpack/ext.py +168 -0
  174. coinex/ccxt/static_dependencies/msgpack/fallback.py +951 -0
  175. coinex/ccxt/static_dependencies/msgpack/pack.h +89 -0
  176. coinex/ccxt/static_dependencies/msgpack/pack_template.h +820 -0
  177. coinex/ccxt/static_dependencies/msgpack/sysdep.h +194 -0
  178. coinex/ccxt/static_dependencies/msgpack/unpack.h +391 -0
  179. coinex/ccxt/static_dependencies/msgpack/unpack_define.h +95 -0
  180. coinex/ccxt/static_dependencies/msgpack/unpack_template.h +464 -0
  181. coinex/ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  182. coinex/ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  183. coinex/ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  184. coinex/ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  185. coinex/ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  186. coinex/ccxt/static_dependencies/parsimonious/utils.py +40 -0
  187. coinex/ccxt/static_dependencies/starknet/__init__.py +0 -0
  188. coinex/ccxt/static_dependencies/starknet/abi/v0/__init__.py +2 -0
  189. coinex/ccxt/static_dependencies/starknet/abi/v0/model.py +44 -0
  190. coinex/ccxt/static_dependencies/starknet/abi/v0/parser.py +216 -0
  191. coinex/ccxt/static_dependencies/starknet/abi/v0/schemas.py +72 -0
  192. coinex/ccxt/static_dependencies/starknet/abi/v0/shape.py +63 -0
  193. coinex/ccxt/static_dependencies/starknet/abi/v1/__init__.py +2 -0
  194. coinex/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +14 -0
  195. coinex/ccxt/static_dependencies/starknet/abi/v1/model.py +39 -0
  196. coinex/ccxt/static_dependencies/starknet/abi/v1/parser.py +220 -0
  197. coinex/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +179 -0
  198. coinex/ccxt/static_dependencies/starknet/abi/v1/schemas.py +66 -0
  199. coinex/ccxt/static_dependencies/starknet/abi/v1/shape.py +47 -0
  200. coinex/ccxt/static_dependencies/starknet/abi/v2/__init__.py +2 -0
  201. coinex/ccxt/static_dependencies/starknet/abi/v2/model.py +89 -0
  202. coinex/ccxt/static_dependencies/starknet/abi/v2/parser.py +293 -0
  203. coinex/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +192 -0
  204. coinex/ccxt/static_dependencies/starknet/abi/v2/schemas.py +132 -0
  205. coinex/ccxt/static_dependencies/starknet/abi/v2/shape.py +107 -0
  206. coinex/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  207. coinex/ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  208. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  209. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  210. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  211. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  212. coinex/ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  213. coinex/ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  214. coinex/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  215. coinex/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  216. coinex/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  217. coinex/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  218. coinex/ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  219. coinex/ccxt/static_dependencies/starknet/common.py +15 -0
  220. coinex/ccxt/static_dependencies/starknet/constants.py +39 -0
  221. coinex/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  222. coinex/ccxt/static_dependencies/starknet/hash/address.py +79 -0
  223. coinex/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  224. coinex/ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  225. coinex/ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  226. coinex/ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  227. coinex/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  228. coinex/ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  229. coinex/ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  230. coinex/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  231. coinex/ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  232. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  233. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  234. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  235. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  236. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  237. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  238. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  239. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  240. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  241. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  242. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  243. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  244. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  245. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  246. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  247. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  248. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  249. coinex/ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  250. coinex/ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  251. coinex/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  252. coinex/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  253. coinex/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  254. coinex/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  255. coinex/ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  256. coinex/ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  257. coinex/ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  258. coinex/ccxt/static_dependencies/starkware/__init__.py +0 -0
  259. coinex/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  260. coinex/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  261. coinex/ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  262. coinex/ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  263. coinex/ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  264. coinex/ccxt/static_dependencies/sympy/__init__.py +0 -0
  265. coinex/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  266. coinex/ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  267. coinex/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  268. coinex/ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  269. coinex/ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  270. coinex/ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  271. coinex/ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  272. coinex/ccxt/static_dependencies/toolz/__init__.py +26 -0
  273. coinex/ccxt/static_dependencies/toolz/_signatures.py +784 -0
  274. coinex/ccxt/static_dependencies/toolz/_version.py +520 -0
  275. coinex/ccxt/static_dependencies/toolz/compatibility.py +30 -0
  276. coinex/ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  277. coinex/ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  278. coinex/ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  279. coinex/ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  280. coinex/ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  281. coinex/ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  282. coinex/ccxt/static_dependencies/toolz/recipes.py +46 -0
  283. coinex/ccxt/static_dependencies/toolz/utils.py +9 -0
  284. coinex/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  285. coinex/ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  286. {coinex_api-0.0.13.dist-info → coinex_api-0.0.14.dist-info}/METADATA +1 -1
  287. coinex_api-0.0.14.dist-info/RECORD +288 -0
  288. coinex_api-0.0.13.dist-info/RECORD +0 -3
  289. {coinex_api-0.0.13.dist-info → coinex_api-0.0.14.dist-info}/WHEEL +0 -0
@@ -0,0 +1,107 @@
1
+ import decimal
2
+ from decimal import (
3
+ localcontext,
4
+ )
5
+ from typing import (
6
+ Union,
7
+ )
8
+
9
+ from .types import (
10
+ is_integer,
11
+ is_string,
12
+ )
13
+ from .units import (
14
+ units,
15
+ )
16
+
17
+
18
+ class denoms:
19
+ wei = int(units["wei"])
20
+ kwei = int(units["kwei"])
21
+ babbage = int(units["babbage"])
22
+ femtoether = int(units["femtoether"])
23
+ mwei = int(units["mwei"])
24
+ lovelace = int(units["lovelace"])
25
+ picoether = int(units["picoether"])
26
+ gwei = int(units["gwei"])
27
+ shannon = int(units["shannon"])
28
+ nanoether = int(units["nanoether"])
29
+ nano = int(units["nano"])
30
+ szabo = int(units["szabo"])
31
+ microether = int(units["microether"])
32
+ micro = int(units["micro"])
33
+ finney = int(units["finney"])
34
+ milliether = int(units["milliether"])
35
+ milli = int(units["milli"])
36
+ ether = int(units["ether"])
37
+ kether = int(units["kether"])
38
+ grand = int(units["grand"])
39
+ mether = int(units["mether"])
40
+ gether = int(units["gether"])
41
+ tether = int(units["tether"])
42
+
43
+
44
+ MIN_WEI = 0
45
+ MAX_WEI = 2**256 - 1
46
+
47
+
48
+ def from_wei(number: int, unit: str) -> Union[int, decimal.Decimal]:
49
+ """
50
+ Takes a number of wei and converts it to any other ether unit.
51
+ """
52
+ if unit.lower() not in units:
53
+ raise ValueError(f"Unknown unit. Must be one of {'/'.join(units.keys())}")
54
+
55
+ if number == 0:
56
+ return 0
57
+
58
+ if number < MIN_WEI or number > MAX_WEI:
59
+ raise ValueError("value must be between 1 and 2**256 - 1")
60
+
61
+ unit_value = units[unit.lower()]
62
+
63
+ with localcontext() as ctx:
64
+ ctx.prec = 999
65
+ d_number = decimal.Decimal(value=number, context=ctx)
66
+ result_value = d_number / unit_value
67
+
68
+ return result_value
69
+
70
+
71
+ def to_wei(number: Union[int, float, str, decimal.Decimal], unit: str) -> int:
72
+ """
73
+ Takes a number of a unit and converts it to wei.
74
+ """
75
+ if unit.lower() not in units:
76
+ raise ValueError(f"Unknown unit. Must be one of {'/'.join(units.keys())}")
77
+
78
+ if is_integer(number) or is_string(number):
79
+ d_number = decimal.Decimal(value=number)
80
+ elif isinstance(number, float):
81
+ d_number = decimal.Decimal(value=str(number))
82
+ elif isinstance(number, decimal.Decimal):
83
+ d_number = number
84
+ else:
85
+ raise TypeError("Unsupported type. Must be one of integer, float, or string")
86
+
87
+ s_number = str(number)
88
+ unit_value = units[unit.lower()]
89
+
90
+ if d_number == decimal.Decimal(0):
91
+ return 0
92
+
93
+ if d_number < 1 and "." in s_number:
94
+ with localcontext() as ctx:
95
+ multiplier = len(s_number) - s_number.index(".") - 1
96
+ ctx.prec = multiplier
97
+ d_number = decimal.Decimal(value=number, context=ctx) * 10**multiplier
98
+ unit_value /= 10**multiplier
99
+
100
+ with localcontext() as ctx:
101
+ ctx.prec = 999
102
+ result_value = decimal.Decimal(value=d_number, context=ctx) * unit_value
103
+
104
+ if result_value < MIN_WEI or result_value > MAX_WEI:
105
+ raise ValueError("Resulting wei value must be between 1 and 2**256 - 1")
106
+
107
+ return int(result_value)
@@ -0,0 +1,269 @@
1
+ from typing import (
2
+ Any,
3
+ Callable,
4
+ Dict,
5
+ Generator,
6
+ Optional,
7
+ Sequence,
8
+ Tuple,
9
+ TypeVar,
10
+ Union,
11
+ overload,
12
+ )
13
+
14
+ from .. import (
15
+ ExtendedDebugLogger,
16
+ HasExtendedDebugLogger,
17
+ HasExtendedDebugLoggerMeta,
18
+ HasLogger,
19
+ HasLoggerMeta,
20
+ ValidationError,
21
+ add_0x_prefix,
22
+ apply_formatter_at_index,
23
+ apply_formatter_if as non_curried_apply_formatter_if,
24
+ apply_formatter_to_array,
25
+ apply_formatters_to_dict as non_curried_apply_formatters_to_dict,
26
+ apply_formatters_to_sequence,
27
+ apply_key_map,
28
+ apply_one_of_formatters as non_curried_apply_one_of_formatters,
29
+ apply_to_return_value,
30
+ big_endian_to_int,
31
+ clamp,
32
+ combine_argument_formatters,
33
+ combomethod,
34
+ decode_hex,
35
+ denoms,
36
+ encode_hex,
37
+ # event_abi_to_log_topic,
38
+ # event_signature_to_log_topic,
39
+ flatten_return,
40
+ from_wei,
41
+ # function_abi_to_4byte_selector,
42
+ # function_signature_to_4byte_selector,
43
+ get_extended_debug_logger,
44
+ get_logger,
45
+ hexstr_if_str as non_curried_hexstr_if_str,
46
+ humanize_bytes,
47
+ humanize_hash,
48
+ humanize_integer_sequence,
49
+ humanize_ipfs_uri,
50
+ humanize_seconds,
51
+ humanize_wei,
52
+ import_string,
53
+ int_to_big_endian,
54
+ is_0x_prefixed,
55
+ is_address,
56
+ is_binary_address,
57
+ is_boolean,
58
+ is_bytes,
59
+ is_canonical_address,
60
+ is_checksum_address,
61
+ is_checksum_formatted_address,
62
+ is_dict,
63
+ is_hex,
64
+ is_hex_address,
65
+ is_hexstr,
66
+ is_integer,
67
+ is_list,
68
+ is_list_like,
69
+ is_normalized_address,
70
+ is_null,
71
+ is_number,
72
+ is_same_address,
73
+ is_string,
74
+ is_text,
75
+ is_tuple,
76
+ # keccak,
77
+ remove_0x_prefix,
78
+ replace_exceptions,
79
+ reversed_return,
80
+ setup_DEBUG2_logging,
81
+ sort_return,
82
+ text_if_str as non_curried_text_if_str,
83
+ to_bytes,
84
+ to_canonical_address,
85
+ to_checksum_address,
86
+ to_dict,
87
+ to_hex,
88
+ to_int,
89
+ to_list,
90
+ to_normalized_address,
91
+ to_ordered_dict,
92
+ to_set,
93
+ to_text,
94
+ to_tuple,
95
+ to_wei,
96
+ )
97
+ from ..toolz import (
98
+ curry,
99
+ )
100
+
101
+ TReturn = TypeVar("TReturn")
102
+ TValue = TypeVar("TValue")
103
+
104
+
105
+ @overload
106
+ def apply_formatter_if(
107
+ condition: Callable[..., bool]
108
+ ) -> Callable[[Callable[..., TReturn]], Callable[[TValue], Union[TReturn, TValue]]]:
109
+ pass
110
+
111
+
112
+ @overload
113
+ def apply_formatter_if(
114
+ condition: Callable[..., bool], formatter: Callable[..., TReturn]
115
+ ) -> Callable[[TValue], Union[TReturn, TValue]]:
116
+ pass
117
+
118
+
119
+ @overload
120
+ def apply_formatter_if(
121
+ condition: Callable[..., bool], formatter: Callable[..., TReturn], value: TValue
122
+ ) -> Union[TReturn, TValue]:
123
+ pass
124
+
125
+
126
+ # This is just a stub to appease mypy, it gets overwritten later
127
+ def apply_formatter_if( # type: ignore
128
+ condition: Callable[..., bool],
129
+ formatter: Optional[Callable[..., TReturn]] = None,
130
+ value: Optional[TValue] = None,
131
+ ) -> Union[
132
+ Callable[[Callable[..., TReturn]], Callable[[TValue], Union[TReturn, TValue]]],
133
+ Callable[[TValue], Union[TReturn, TValue]],
134
+ TReturn,
135
+ TValue,
136
+ ]:
137
+ pass
138
+
139
+
140
+ @overload
141
+ def apply_one_of_formatters(
142
+ formatter_condition_pairs: Sequence[
143
+ Tuple[Callable[..., bool], Callable[..., TReturn]]
144
+ ]
145
+ ) -> Callable[[TValue], TReturn]:
146
+ ...
147
+
148
+
149
+ @overload
150
+ def apply_one_of_formatters(
151
+ formatter_condition_pairs: Sequence[
152
+ Tuple[Callable[..., bool], Callable[..., TReturn]]
153
+ ],
154
+ value: TValue,
155
+ ) -> TReturn:
156
+ ...
157
+
158
+
159
+ # This is just a stub to appease mypy, it gets overwritten later
160
+ def apply_one_of_formatters( # type: ignore
161
+ formatter_condition_pairs: Sequence[
162
+ Tuple[Callable[..., bool], Callable[..., TReturn]]
163
+ ],
164
+ value: Optional[TValue] = None,
165
+ ) -> TReturn:
166
+ ...
167
+
168
+
169
+ @overload
170
+ def hexstr_if_str(
171
+ to_type: Callable[..., TReturn]
172
+ ) -> Callable[[Union[bytes, int, str]], TReturn]:
173
+ ...
174
+
175
+
176
+ @overload
177
+ def hexstr_if_str(
178
+ to_type: Callable[..., TReturn], to_format: Union[bytes, int, str]
179
+ ) -> TReturn:
180
+ ...
181
+
182
+
183
+ # This is just a stub to appease mypy, it gets overwritten later
184
+ def hexstr_if_str( # type: ignore
185
+ to_type: Callable[..., TReturn], to_format: Optional[Union[bytes, int, str]] = None
186
+ ) -> TReturn:
187
+ ...
188
+
189
+
190
+ @overload
191
+ def text_if_str(
192
+ to_type: Callable[..., TReturn]
193
+ ) -> Callable[[Union[bytes, int, str]], TReturn]:
194
+ ...
195
+
196
+
197
+ @overload
198
+ def text_if_str(
199
+ to_type: Callable[..., TReturn], text_or_primitive: Union[bytes, int, str]
200
+ ) -> TReturn:
201
+ ...
202
+
203
+
204
+ # This is just a stub to appease mypy, it gets overwritten later
205
+ def text_if_str( # type: ignore
206
+ to_type: Callable[..., TReturn],
207
+ text_or_primitive: Optional[Union[bytes, int, str]] = None,
208
+ ) -> TReturn:
209
+ ...
210
+
211
+
212
+ @overload
213
+ def apply_formatters_to_dict(
214
+ formatters: Dict[Any, Any]
215
+ ) -> Callable[[Dict[Any, Any]], TReturn]:
216
+ ...
217
+
218
+
219
+ @overload
220
+ def apply_formatters_to_dict(
221
+ formatters: Dict[Any, Any], value: Dict[Any, Any]
222
+ ) -> Dict[Any, Any]:
223
+ ...
224
+
225
+
226
+ # This is just a stub to appease mypy, it gets overwritten later
227
+ def apply_formatters_to_dict( # type: ignore
228
+ formatters: Dict[Any, Any], value: Optional[Dict[Any, Any]] = None
229
+ ) -> Dict[Any, Any]:
230
+ ...
231
+
232
+
233
+ apply_formatter_at_index = curry(apply_formatter_at_index)
234
+ apply_formatter_if = curry(non_curried_apply_formatter_if) # noqa: F811
235
+ apply_formatter_to_array = curry(apply_formatter_to_array)
236
+ apply_formatters_to_dict = curry(non_curried_apply_formatters_to_dict) # noqa: F811
237
+ apply_formatters_to_sequence = curry(apply_formatters_to_sequence)
238
+ apply_key_map = curry(apply_key_map)
239
+ apply_one_of_formatters = curry(non_curried_apply_one_of_formatters) # noqa: F811
240
+ from_wei = curry(from_wei)
241
+ get_logger = curry(get_logger)
242
+ hexstr_if_str = curry(non_curried_hexstr_if_str) # noqa: F811
243
+ is_same_address = curry(is_same_address)
244
+ text_if_str = curry(non_curried_text_if_str) # noqa: F811
245
+ to_wei = curry(to_wei)
246
+ clamp = curry(clamp)
247
+
248
+ # Delete any methods and classes that are not intended to be importable from
249
+ # `eth_utils.curried`. We do this approach instead of __all__ because this approach
250
+ # actually prevents importing the wrong thing, while __all__ only affects
251
+ # `from eth_utils.curried import *`
252
+ del Any
253
+ del Callable
254
+ del Dict
255
+ del Generator
256
+ del Optional
257
+ del Sequence
258
+ del TReturn
259
+ del TValue
260
+ del Tuple
261
+ del TypeVar
262
+ del Union
263
+ del curry
264
+ del non_curried_apply_formatter_if
265
+ del non_curried_apply_one_of_formatters
266
+ del non_curried_apply_formatters_to_dict
267
+ del non_curried_hexstr_if_str
268
+ del non_curried_text_if_str
269
+ del overload
@@ -0,0 +1,20 @@
1
+ import platform
2
+ import subprocess
3
+ import sys
4
+
5
+
6
+ def pip_freeze() -> str:
7
+ result = subprocess.run("python -m pip freeze".split(), stdout=subprocess.PIPE)
8
+ return f"python -m pip freeze result:\n{result.stdout.decode()}"
9
+
10
+
11
+ def python_version() -> str:
12
+ return f"Python version:\n{sys.version}"
13
+
14
+
15
+ def platform_info() -> str:
16
+ return f"Operating System: {platform.platform()}"
17
+
18
+
19
+ def get_environment_summary() -> str:
20
+ return "\n\n".join([python_version(), platform_info(), pip_freeze()])
@@ -0,0 +1,132 @@
1
+ import functools
2
+ import itertools
3
+ from typing import (
4
+ Any,
5
+ Callable,
6
+ Dict,
7
+ Optional,
8
+ Type,
9
+ TypeVar,
10
+ )
11
+
12
+ from .types import (
13
+ is_text,
14
+ )
15
+
16
+ T = TypeVar("T")
17
+
18
+
19
+ class combomethod:
20
+ def __init__(self, method: Callable[..., Any]) -> None:
21
+ self.method = method
22
+
23
+ def __get__(
24
+ self, obj: Optional[T] = None, objtype: Optional[Type[T]] = None
25
+ ) -> Callable[..., Any]:
26
+ @functools.wraps(self.method)
27
+ def _wrapper(*args: Any, **kwargs: Any) -> Any:
28
+ if obj is not None:
29
+ return self.method(obj, *args, **kwargs)
30
+ else:
31
+ return self.method(objtype, *args, **kwargs)
32
+
33
+ return _wrapper
34
+
35
+
36
+ def _has_one_val(*args: T, **kwargs: T) -> bool:
37
+ vals = itertools.chain(args, kwargs.values())
38
+ not_nones = list(filter(lambda val: val is not None, vals))
39
+ return len(not_nones) == 1
40
+
41
+
42
+ def _assert_one_val(*args: T, **kwargs: T) -> None:
43
+ if not _has_one_val(*args, **kwargs):
44
+ raise TypeError(
45
+ "Exactly one of the passed values can be specified. "
46
+ f"Instead, values were: {repr(args)}, {repr(kwargs)}"
47
+ )
48
+
49
+
50
+ def _hexstr_or_text_kwarg_is_text_type(**kwargs: T) -> bool:
51
+ value = kwargs["hexstr"] if "hexstr" in kwargs else kwargs["text"]
52
+ return is_text(value)
53
+
54
+
55
+ def _assert_hexstr_or_text_kwarg_is_text_type(**kwargs: T) -> None:
56
+ if not _hexstr_or_text_kwarg_is_text_type(**kwargs):
57
+ raise TypeError(
58
+ "Arguments passed as hexstr or text must be of text type. "
59
+ f"Instead, value was: {(repr(next(iter(list(kwargs.values())))))}"
60
+ )
61
+
62
+
63
+ def _validate_supported_kwarg(kwargs: Any) -> None:
64
+ if next(iter(kwargs)) not in ["primitive", "hexstr", "text"]:
65
+ raise TypeError(
66
+ "Kwarg must be 'primitive', 'hexstr', or 'text'. "
67
+ f"Instead, kwarg was: {repr((next(iter(kwargs))))}"
68
+ )
69
+
70
+
71
+ def validate_conversion_arguments(to_wrap: Callable[..., T]) -> Callable[..., T]:
72
+ """
73
+ Validates arguments for conversion functions.
74
+ - Only a single argument is present
75
+ - Kwarg must be 'primitive' 'hexstr' or 'text'
76
+ - If it is 'hexstr' or 'text' that it is a text type
77
+ """
78
+
79
+ @functools.wraps(to_wrap)
80
+ def wrapper(*args: Any, **kwargs: Any) -> T:
81
+ _assert_one_val(*args, **kwargs)
82
+ if kwargs:
83
+ _validate_supported_kwarg(kwargs)
84
+
85
+ if len(args) == 0 and "primitive" not in kwargs:
86
+ _assert_hexstr_or_text_kwarg_is_text_type(**kwargs)
87
+ return to_wrap(*args, **kwargs)
88
+
89
+ return wrapper
90
+
91
+
92
+ def return_arg_type(at_position: int) -> Callable[..., Callable[..., T]]:
93
+ """
94
+ Wrap the return value with the result of `type(args[at_position])`.
95
+ """
96
+
97
+ def decorator(to_wrap: Callable[..., Any]) -> Callable[..., T]:
98
+ @functools.wraps(to_wrap)
99
+ def wrapper(*args: Any, **kwargs: Any) -> T: # type: ignore
100
+ result = to_wrap(*args, **kwargs)
101
+ ReturnType = type(args[at_position])
102
+ return ReturnType(result) # type: ignore
103
+
104
+ return wrapper
105
+
106
+ return decorator
107
+
108
+
109
+ def replace_exceptions(
110
+ old_to_new_exceptions: Dict[Type[BaseException], Type[BaseException]]
111
+ ) -> Callable[[Callable[..., T]], Callable[..., T]]:
112
+ """
113
+ Replaces old exceptions with new exceptions to be raised in their place.
114
+ """
115
+ old_exceptions = tuple(old_to_new_exceptions.keys())
116
+
117
+ def decorator(to_wrap: Callable[..., T]) -> Callable[..., T]:
118
+ @functools.wraps(to_wrap)
119
+ def wrapped(*args: Any, **kwargs: Any) -> T:
120
+ try:
121
+ return to_wrap(*args, **kwargs)
122
+ except old_exceptions as err:
123
+ try:
124
+ raise old_to_new_exceptions[type(err)](err) from err
125
+ except KeyError:
126
+ raise TypeError(
127
+ f"could not look up new exception to use for {repr(err)}"
128
+ ) from err
129
+
130
+ return wrapped
131
+
132
+ return decorator
@@ -0,0 +1,6 @@
1
+ def int_to_big_endian(value: int) -> bytes:
2
+ return value.to_bytes((value.bit_length() + 7) // 8 or 1, "big")
3
+
4
+
5
+ def big_endian_to_int(value: bytes) -> int:
6
+ return int.from_bytes(value, "big")
@@ -0,0 +1,4 @@
1
+ class ValidationError(Exception):
2
+ """
3
+ Raised when something does not pass a validation check.
4
+ """
@@ -0,0 +1,75 @@
1
+ import collections
2
+ import functools
3
+ import itertools
4
+ from typing import ( # noqa: F401
5
+ Any,
6
+ Callable,
7
+ Dict,
8
+ Iterable,
9
+ List,
10
+ Mapping,
11
+ Set,
12
+ Tuple,
13
+ TypeVar,
14
+ Union,
15
+ )
16
+
17
+ from .toolz import (
18
+ compose as _compose,
19
+ )
20
+
21
+ T = TypeVar("T")
22
+
23
+
24
+ def identity(value: T) -> T:
25
+ return value
26
+
27
+
28
+ TGIn = TypeVar("TGIn")
29
+ TGOut = TypeVar("TGOut")
30
+ TFOut = TypeVar("TFOut")
31
+
32
+
33
+ def combine(
34
+ f: Callable[[TGOut], TFOut], g: Callable[[TGIn], TGOut]
35
+ ) -> Callable[[TGIn], TFOut]:
36
+ return lambda x: f(g(x))
37
+
38
+
39
+ def apply_to_return_value(
40
+ callback: Callable[..., T]
41
+ ) -> Callable[..., Callable[..., T]]:
42
+ def outer(fn: Callable[..., T]) -> Callable[..., T]:
43
+ # We would need to type annotate *args and **kwargs but doing so segfaults
44
+ # the PyPy builds. We ignore instead.
45
+ @functools.wraps(fn)
46
+ def inner(*args, **kwargs) -> T: # type: ignore
47
+ return callback(fn(*args, **kwargs))
48
+
49
+ return inner
50
+
51
+ return outer
52
+
53
+
54
+ TVal = TypeVar("TVal")
55
+ TKey = TypeVar("TKey")
56
+ to_tuple = apply_to_return_value(
57
+ tuple
58
+ ) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., Tuple[TVal, ...]]] # noqa: E501
59
+ to_list = apply_to_return_value(
60
+ list
61
+ ) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., List[TVal]]] # noqa: E501
62
+ to_set = apply_to_return_value(
63
+ set
64
+ ) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., Set[TVal]]] # noqa: E501
65
+ to_dict = apply_to_return_value(
66
+ dict
67
+ ) # type: Callable[[Callable[..., Iterable[Union[Mapping[TKey, TVal], Tuple[TKey, TVal]]]]], Callable[..., Dict[TKey, TVal]]] # noqa: E501
68
+ to_ordered_dict = apply_to_return_value(
69
+ collections.OrderedDict
70
+ ) # type: Callable[[Callable[..., Iterable[Union[Mapping[TKey, TVal], Tuple[TKey, TVal]]]]], Callable[..., collections.OrderedDict[TKey, TVal]]] # noqa: E501
71
+ sort_return = _compose(to_tuple, apply_to_return_value(sorted))
72
+ flatten_return = _compose(
73
+ to_tuple, apply_to_return_value(itertools.chain.from_iterable)
74
+ )
75
+ reversed_return = _compose(to_tuple, apply_to_return_value(reversed), to_tuple)
@@ -0,0 +1,74 @@
1
+ # String encodings and numeric representations
2
+
3
+ import binascii
4
+ import re
5
+ from typing import (
6
+ Any,
7
+ AnyStr,
8
+ )
9
+
10
+ from ..typing import (
11
+ HexStr,
12
+ )
13
+
14
+ from .types import (
15
+ is_string,
16
+ is_text,
17
+ )
18
+
19
+ _HEX_REGEXP = re.compile("(0[xX])?[0-9a-fA-F]*")
20
+
21
+
22
+ def decode_hex(value: str) -> bytes:
23
+ if not is_text(value):
24
+ raise TypeError("Value must be an instance of str")
25
+ non_prefixed = remove_0x_prefix(HexStr(value))
26
+ # unhexlify will only accept bytes type someday
27
+ ascii_hex = non_prefixed.encode("ascii")
28
+ return binascii.unhexlify(ascii_hex)
29
+
30
+
31
+ def encode_hex(value: AnyStr) -> HexStr:
32
+ if not is_string(value):
33
+ raise TypeError("Value must be an instance of str or unicode")
34
+ elif isinstance(value, (bytes, bytearray)):
35
+ ascii_bytes = value
36
+ else:
37
+ ascii_bytes = value.encode("ascii")
38
+
39
+ binary_hex = binascii.hexlify(ascii_bytes)
40
+ return add_0x_prefix(HexStr(binary_hex.decode("ascii")))
41
+
42
+
43
+ def is_0x_prefixed(value: str) -> bool:
44
+ if not is_text(value):
45
+ raise TypeError(
46
+ f"is_0x_prefixed requires text typed arguments. Got: {repr(value)}"
47
+ )
48
+ return value.startswith(("0x", "0X"))
49
+
50
+
51
+ def remove_0x_prefix(value: HexStr) -> HexStr:
52
+ if is_0x_prefixed(value):
53
+ return HexStr(value[2:])
54
+ return value
55
+
56
+
57
+ def add_0x_prefix(value: HexStr) -> HexStr:
58
+ if is_0x_prefixed(value):
59
+ return value
60
+ return HexStr("0x" + value)
61
+
62
+
63
+ def is_hexstr(value: Any) -> bool:
64
+ if not is_text(value) or not value:
65
+ return False
66
+ return _HEX_REGEXP.fullmatch(value) is not None
67
+
68
+
69
+ def is_hex(value: Any) -> bool:
70
+ if not is_text(value):
71
+ raise TypeError(f"is_hex requires text typed arguments. Got: {repr(value)}")
72
+ if not value:
73
+ return False
74
+ return _HEX_REGEXP.fullmatch(value) is not None