opinion-clob-sdk 0.1.13__py3-none-any.whl → 0.1.15__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.

Potentially problematic release.


This version of opinion-clob-sdk might be problematic. Click here for more details.

Files changed (116) hide show
  1. opinion_clob_sdk/__init__.py +1 -1
  2. opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  3. opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  4. opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  5. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  6. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  7. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  8. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  9. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  10. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  11. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  12. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  13. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  14. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  15. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  16. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  17. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  18. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  19. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  20. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  21. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  22. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  23. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  24. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  25. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  26. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
  27. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  28. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  29. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  30. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  31. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  32. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  33. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  34. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  35. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  36. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
  37. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  38. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  39. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  40. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  41. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  42. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  43. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  44. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  45. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  46. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  47. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +180 -0
  48. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  49. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  50. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  51. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  52. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  53. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  54. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  55. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  56. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +327 -0
  57. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  58. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  59. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  60. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  61. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  62. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  63. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  64. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  65. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  66. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  67. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  68. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  69. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  70. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  71. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  72. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  73. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  74. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  75. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  76. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  77. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
  78. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  79. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  80. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  81. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  82. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  83. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  84. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  85. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  86. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  87. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  88. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +180 -0
  89. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  90. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  91. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  92. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  93. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  94. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  95. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  96. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  97. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +327 -0
  98. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  99. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  100. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  101. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  102. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  103. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  104. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  105. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  106. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  107. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  108. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  109. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +957 -0
  110. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +957 -0
  111. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  112. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  113. {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/METADATA +1 -1
  114. {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/RECORD +116 -30
  115. {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/WHEEL +0 -0
  116. {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.13"
15
+ __version__ = "0.1.15"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -77,8 +77,8 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
77
77
  """
78
78
  Calculate the maker and taker amounts based on the price and side.
79
79
 
80
- Uses precise Decimal arithmetic to ensure precision within 6 significant digits
81
- (matching the matching engine's precision limit).
80
+ Uses precise Decimal arithmetic and ensures the calculated price from amounts
81
+ exactly matches the input price by using fractional representation.
82
82
 
83
83
  Args:
84
84
  price: The price of the order (between 0.001 and 0.999)
@@ -109,63 +109,61 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
109
109
  if price_decimal.as_tuple().exponent < -6:
110
110
  raise ValueError(f"Price precision cannot exceed 6 decimal places, got {price}")
111
111
 
112
- maker_decimal = Decimal(str(maker_amount))
112
+ # Convert price to fraction for exact representation
113
+ # E.g., 0.111 = 111/1000, 0.222 = 222/1000 = 111/500 (simplified)
114
+ from fractions import Fraction
115
+ import math
116
+
117
+ price_fraction = Fraction(str(price)).limit_denominator(1000000) # Limit denominator to avoid huge numbers
113
118
 
114
119
  if side == OrderSide.BUY:
115
120
  # For BUY: price = maker/taker
116
- # Goal: Calculate taker and maker with only 6 significant digits each
117
- # to match the matching engine's precision requirement
121
+ # Goal: Ensure maker/taker = price_num/price_denom EXACTLY
118
122
  #
119
123
  # Strategy:
120
- # 1. Round maker_amount to 6 significant digits
121
- # 2. Calculate taker = round(maker_6digit / price) to 6 significant digits
122
- # 3. Recalculate maker = round(taker_6digit * price) to verify precision
124
+ # 1. Round maker to 4 significant digits
125
+ # 2. Find the closest (maker', taker') pair where:
126
+ # maker'/taker' = price_num/price_denom exactly
127
+ # maker' is close to maker_4digit
123
128
  #
124
- # This ensures: maker_6digit / taker_6digit = price (exact match within 6 digits)
125
-
126
- # Step 1: Round maker to 6 significant digits
127
- maker_6digit = round_to_significant_digits(maker_amount, 6)
128
-
129
- # Step 2: Calculate taker = maker / price
130
- exact_taker = Decimal(str(maker_6digit)) / price_decimal
131
- taker_amount = int(exact_taker)
129
+ # Method: maker' = k * price_num, taker' = k * price_denom
130
+ # Choose k such that maker' ≈ maker_4digit
132
131
 
133
- # Step 3: Round taker to 6 significant digits
134
- taker_6digit = round_to_significant_digits(taker_amount, 6)
132
+ # Step 1: Round maker to 4 significant digits as target
133
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
135
134
 
136
- # Step 4: Recalculate maker using 6-digit taker to ensure precision
137
- recalculated_maker_decimal = Decimal(str(taker_6digit)) * price_decimal
138
- recalculated_maker_amount = int(recalculated_maker_decimal)
135
+ # Step 2: Find the scaling factor k
136
+ # We want: k * price_num ≈ maker_4digit
137
+ # So: k ≈ maker_4digit / price_num
138
+ k = maker_4digit // price_fraction.numerator
139
+ if k == 0:
140
+ k = 1 # Ensure at least k=1
139
141
 
140
- # Step 5: Round recalculated maker to 6 significant digits
141
- recalculated_maker_6digit = round_to_significant_digits(recalculated_maker_amount, 6)
142
-
143
- # Use the 6-digit values
144
- taker_amount = taker_6digit
145
- recalculated_maker_amount = recalculated_maker_6digit
142
+ # Step 3: Calculate exact maker and taker using k
143
+ # This guarantees: recalculated_maker_amount / taker_amount = price_num / price_denom
144
+ recalculated_maker_amount = k * price_fraction.numerator
145
+ taker_amount = k * price_fraction.denominator
146
146
 
147
147
  else: # SELL
148
148
  # For SELL: price = taker/maker
149
- # Goal: Calculate taker and maker with only 6 significant digits each
149
+ # Goal: Ensure taker/maker = price_num/price_denom EXACTLY
150
150
  #
151
- # Strategy:
152
- # 1. Round maker_amount to 6 significant digits
153
- # 2. Calculate taker = round(maker_6digit * price) to 6 significant digits
154
- # 3. This ensures: taker_6digit / maker_6digit = price (exact match within 6 digits)
155
-
156
- # Step 1: Round maker to 6 significant digits
157
- maker_6digit = round_to_significant_digits(maker_amount, 6)
158
-
159
- # Step 2: Calculate taker = maker * price
160
- exact_taker = Decimal(str(maker_6digit)) * price_decimal
161
- taker_amount = int(exact_taker)
162
-
163
- # Step 3: Round taker to 6 significant digits
164
- taker_6digit = round_to_significant_digits(taker_amount, 6)
165
-
166
- # Use the 6-digit values
167
- taker_amount = taker_6digit
168
- recalculated_maker_amount = maker_6digit
151
+ # Method: taker = k * price_num, maker = k * price_denom
152
+ # Choose k such that maker maker_4digit
153
+
154
+ # Step 1: Round maker to 4 significant digits
155
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
156
+
157
+ # Step 2: Find the scaling factor k
158
+ # We want: k * price_denom ≈ maker_4digit
159
+ # So: k maker_4digit / price_denom
160
+ k = maker_4digit // price_fraction.denominator
161
+ if k == 0:
162
+ k = 1
163
+
164
+ # Step 3: Calculate exact maker and taker using k
165
+ recalculated_maker_amount = k * price_fraction.denominator
166
+ taker_amount = k * price_fraction.numerator
169
167
 
170
168
  # Ensure amounts are at least 1
171
169
  taker_amount = int(max(1, taker_amount))
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.13"
15
+ __version__ = "0.1.15"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -77,8 +77,8 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
77
77
  """
78
78
  Calculate the maker and taker amounts based on the price and side.
79
79
 
80
- Uses precise Decimal arithmetic to ensure precision within 6 significant digits
81
- (matching the matching engine's precision limit).
80
+ Uses precise Decimal arithmetic and ensures the calculated price from amounts
81
+ exactly matches the input price by using fractional representation.
82
82
 
83
83
  Args:
84
84
  price: The price of the order (between 0.001 and 0.999)
@@ -109,63 +109,61 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
109
109
  if price_decimal.as_tuple().exponent < -6:
110
110
  raise ValueError(f"Price precision cannot exceed 6 decimal places, got {price}")
111
111
 
112
- maker_decimal = Decimal(str(maker_amount))
112
+ # Convert price to fraction for exact representation
113
+ # E.g., 0.111 = 111/1000, 0.222 = 222/1000 = 111/500 (simplified)
114
+ from fractions import Fraction
115
+ import math
116
+
117
+ price_fraction = Fraction(str(price)).limit_denominator(1000000) # Limit denominator to avoid huge numbers
113
118
 
114
119
  if side == OrderSide.BUY:
115
120
  # For BUY: price = maker/taker
116
- # Goal: Calculate taker and maker with only 6 significant digits each
117
- # to match the matching engine's precision requirement
121
+ # Goal: Ensure maker/taker = price_num/price_denom EXACTLY
118
122
  #
119
123
  # Strategy:
120
- # 1. Round maker_amount to 6 significant digits
121
- # 2. Calculate taker = round(maker_6digit / price) to 6 significant digits
122
- # 3. Recalculate maker = round(taker_6digit * price) to verify precision
124
+ # 1. Round maker to 4 significant digits
125
+ # 2. Find the closest (maker', taker') pair where:
126
+ # maker'/taker' = price_num/price_denom exactly
127
+ # maker' is close to maker_4digit
123
128
  #
124
- # This ensures: maker_6digit / taker_6digit = price (exact match within 6 digits)
125
-
126
- # Step 1: Round maker to 6 significant digits
127
- maker_6digit = round_to_significant_digits(maker_amount, 6)
128
-
129
- # Step 2: Calculate taker = maker / price
130
- exact_taker = Decimal(str(maker_6digit)) / price_decimal
131
- taker_amount = int(exact_taker)
129
+ # Method: maker' = k * price_num, taker' = k * price_denom
130
+ # Choose k such that maker' ≈ maker_4digit
132
131
 
133
- # Step 3: Round taker to 6 significant digits
134
- taker_6digit = round_to_significant_digits(taker_amount, 6)
132
+ # Step 1: Round maker to 4 significant digits as target
133
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
135
134
 
136
- # Step 4: Recalculate maker using 6-digit taker to ensure precision
137
- recalculated_maker_decimal = Decimal(str(taker_6digit)) * price_decimal
138
- recalculated_maker_amount = int(recalculated_maker_decimal)
135
+ # Step 2: Find the scaling factor k
136
+ # We want: k * price_num ≈ maker_4digit
137
+ # So: k ≈ maker_4digit / price_num
138
+ k = maker_4digit // price_fraction.numerator
139
+ if k == 0:
140
+ k = 1 # Ensure at least k=1
139
141
 
140
- # Step 5: Round recalculated maker to 6 significant digits
141
- recalculated_maker_6digit = round_to_significant_digits(recalculated_maker_amount, 6)
142
-
143
- # Use the 6-digit values
144
- taker_amount = taker_6digit
145
- recalculated_maker_amount = recalculated_maker_6digit
142
+ # Step 3: Calculate exact maker and taker using k
143
+ # This guarantees: recalculated_maker_amount / taker_amount = price_num / price_denom
144
+ recalculated_maker_amount = k * price_fraction.numerator
145
+ taker_amount = k * price_fraction.denominator
146
146
 
147
147
  else: # SELL
148
148
  # For SELL: price = taker/maker
149
- # Goal: Calculate taker and maker with only 6 significant digits each
149
+ # Goal: Ensure taker/maker = price_num/price_denom EXACTLY
150
150
  #
151
- # Strategy:
152
- # 1. Round maker_amount to 6 significant digits
153
- # 2. Calculate taker = round(maker_6digit * price) to 6 significant digits
154
- # 3. This ensures: taker_6digit / maker_6digit = price (exact match within 6 digits)
155
-
156
- # Step 1: Round maker to 6 significant digits
157
- maker_6digit = round_to_significant_digits(maker_amount, 6)
158
-
159
- # Step 2: Calculate taker = maker * price
160
- exact_taker = Decimal(str(maker_6digit)) * price_decimal
161
- taker_amount = int(exact_taker)
162
-
163
- # Step 3: Round taker to 6 significant digits
164
- taker_6digit = round_to_significant_digits(taker_amount, 6)
165
-
166
- # Use the 6-digit values
167
- taker_amount = taker_6digit
168
- recalculated_maker_amount = maker_6digit
151
+ # Method: taker = k * price_num, maker = k * price_denom
152
+ # Choose k such that maker maker_4digit
153
+
154
+ # Step 1: Round maker to 4 significant digits
155
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
156
+
157
+ # Step 2: Find the scaling factor k
158
+ # We want: k * price_denom ≈ maker_4digit
159
+ # So: k maker_4digit / price_denom
160
+ k = maker_4digit // price_fraction.denominator
161
+ if k == 0:
162
+ k = 1
163
+
164
+ # Step 3: Calculate exact maker and taker using k
165
+ recalculated_maker_amount = k * price_fraction.denominator
166
+ taker_amount = k * price_fraction.numerator
169
167
 
170
168
  # Ensure amounts are at least 1
171
169
  taker_amount = int(max(1, taker_amount))
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.13"
15
+ __version__ = "0.1.15"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -77,8 +77,8 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
77
77
  """
78
78
  Calculate the maker and taker amounts based on the price and side.
79
79
 
80
- Uses precise Decimal arithmetic to ensure precision within 6 significant digits
81
- (matching the matching engine's precision limit).
80
+ Uses precise Decimal arithmetic and ensures the calculated price from amounts
81
+ exactly matches the input price by using fractional representation.
82
82
 
83
83
  Args:
84
84
  price: The price of the order (between 0.001 and 0.999)
@@ -109,63 +109,61 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
109
109
  if price_decimal.as_tuple().exponent < -6:
110
110
  raise ValueError(f"Price precision cannot exceed 6 decimal places, got {price}")
111
111
 
112
- maker_decimal = Decimal(str(maker_amount))
112
+ # Convert price to fraction for exact representation
113
+ # E.g., 0.111 = 111/1000, 0.222 = 222/1000 = 111/500 (simplified)
114
+ from fractions import Fraction
115
+ import math
116
+
117
+ price_fraction = Fraction(str(price)).limit_denominator(1000000) # Limit denominator to avoid huge numbers
113
118
 
114
119
  if side == OrderSide.BUY:
115
120
  # For BUY: price = maker/taker
116
- # Goal: Calculate taker and maker with only 6 significant digits each
117
- # to match the matching engine's precision requirement
121
+ # Goal: Ensure maker/taker = price_num/price_denom EXACTLY
118
122
  #
119
123
  # Strategy:
120
- # 1. Round maker_amount to 6 significant digits
121
- # 2. Calculate taker = round(maker_6digit / price) to 6 significant digits
122
- # 3. Recalculate maker = round(taker_6digit * price) to verify precision
124
+ # 1. Round maker to 4 significant digits
125
+ # 2. Find the closest (maker', taker') pair where:
126
+ # maker'/taker' = price_num/price_denom exactly
127
+ # maker' is close to maker_4digit
123
128
  #
124
- # This ensures: maker_6digit / taker_6digit = price (exact match within 6 digits)
125
-
126
- # Step 1: Round maker to 6 significant digits
127
- maker_6digit = round_to_significant_digits(maker_amount, 6)
128
-
129
- # Step 2: Calculate taker = maker / price
130
- exact_taker = Decimal(str(maker_6digit)) / price_decimal
131
- taker_amount = int(exact_taker)
129
+ # Method: maker' = k * price_num, taker' = k * price_denom
130
+ # Choose k such that maker' ≈ maker_4digit
132
131
 
133
- # Step 3: Round taker to 6 significant digits
134
- taker_6digit = round_to_significant_digits(taker_amount, 6)
132
+ # Step 1: Round maker to 4 significant digits as target
133
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
135
134
 
136
- # Step 4: Recalculate maker using 6-digit taker to ensure precision
137
- recalculated_maker_decimal = Decimal(str(taker_6digit)) * price_decimal
138
- recalculated_maker_amount = int(recalculated_maker_decimal)
135
+ # Step 2: Find the scaling factor k
136
+ # We want: k * price_num ≈ maker_4digit
137
+ # So: k ≈ maker_4digit / price_num
138
+ k = maker_4digit // price_fraction.numerator
139
+ if k == 0:
140
+ k = 1 # Ensure at least k=1
139
141
 
140
- # Step 5: Round recalculated maker to 6 significant digits
141
- recalculated_maker_6digit = round_to_significant_digits(recalculated_maker_amount, 6)
142
-
143
- # Use the 6-digit values
144
- taker_amount = taker_6digit
145
- recalculated_maker_amount = recalculated_maker_6digit
142
+ # Step 3: Calculate exact maker and taker using k
143
+ # This guarantees: recalculated_maker_amount / taker_amount = price_num / price_denom
144
+ recalculated_maker_amount = k * price_fraction.numerator
145
+ taker_amount = k * price_fraction.denominator
146
146
 
147
147
  else: # SELL
148
148
  # For SELL: price = taker/maker
149
- # Goal: Calculate taker and maker with only 6 significant digits each
149
+ # Goal: Ensure taker/maker = price_num/price_denom EXACTLY
150
150
  #
151
- # Strategy:
152
- # 1. Round maker_amount to 6 significant digits
153
- # 2. Calculate taker = round(maker_6digit * price) to 6 significant digits
154
- # 3. This ensures: taker_6digit / maker_6digit = price (exact match within 6 digits)
155
-
156
- # Step 1: Round maker to 6 significant digits
157
- maker_6digit = round_to_significant_digits(maker_amount, 6)
158
-
159
- # Step 2: Calculate taker = maker * price
160
- exact_taker = Decimal(str(maker_6digit)) * price_decimal
161
- taker_amount = int(exact_taker)
162
-
163
- # Step 3: Round taker to 6 significant digits
164
- taker_6digit = round_to_significant_digits(taker_amount, 6)
165
-
166
- # Use the 6-digit values
167
- taker_amount = taker_6digit
168
- recalculated_maker_amount = maker_6digit
151
+ # Method: taker = k * price_num, maker = k * price_denom
152
+ # Choose k such that maker maker_4digit
153
+
154
+ # Step 1: Round maker to 4 significant digits
155
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
156
+
157
+ # Step 2: Find the scaling factor k
158
+ # We want: k * price_denom ≈ maker_4digit
159
+ # So: k maker_4digit / price_denom
160
+ k = maker_4digit // price_fraction.denominator
161
+ if k == 0:
162
+ k = 1
163
+
164
+ # Step 3: Calculate exact maker and taker using k
165
+ recalculated_maker_amount = k * price_fraction.denominator
166
+ taker_amount = k * price_fraction.numerator
169
167
 
170
168
  # Ensure amounts are at least 1
171
169
  taker_amount = int(max(1, taker_amount))
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.13"
15
+ __version__ = "0.1.15"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -77,8 +77,8 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
77
77
  """
78
78
  Calculate the maker and taker amounts based on the price and side.
79
79
 
80
- Uses precise Decimal arithmetic to ensure precision within 6 significant digits
81
- (matching the matching engine's precision limit).
80
+ Uses precise Decimal arithmetic and ensures the calculated price from amounts
81
+ exactly matches the input price by using fractional representation.
82
82
 
83
83
  Args:
84
84
  price: The price of the order (between 0.001 and 0.999)
@@ -109,63 +109,61 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
109
109
  if price_decimal.as_tuple().exponent < -6:
110
110
  raise ValueError(f"Price precision cannot exceed 6 decimal places, got {price}")
111
111
 
112
- maker_decimal = Decimal(str(maker_amount))
112
+ # Convert price to fraction for exact representation
113
+ # E.g., 0.111 = 111/1000, 0.222 = 222/1000 = 111/500 (simplified)
114
+ from fractions import Fraction
115
+ import math
116
+
117
+ price_fraction = Fraction(str(price)).limit_denominator(1000000) # Limit denominator to avoid huge numbers
113
118
 
114
119
  if side == OrderSide.BUY:
115
120
  # For BUY: price = maker/taker
116
- # Goal: Calculate taker and maker with only 6 significant digits each
117
- # to match the matching engine's precision requirement
121
+ # Goal: Ensure maker/taker = price_num/price_denom EXACTLY
118
122
  #
119
123
  # Strategy:
120
- # 1. Round maker_amount to 6 significant digits
121
- # 2. Calculate taker = round(maker_6digit / price) to 6 significant digits
122
- # 3. Recalculate maker = round(taker_6digit * price) to verify precision
124
+ # 1. Round maker to 4 significant digits
125
+ # 2. Find the closest (maker', taker') pair where:
126
+ # maker'/taker' = price_num/price_denom exactly
127
+ # maker' is close to maker_4digit
123
128
  #
124
- # This ensures: maker_6digit / taker_6digit = price (exact match within 6 digits)
125
-
126
- # Step 1: Round maker to 6 significant digits
127
- maker_6digit = round_to_significant_digits(maker_amount, 6)
128
-
129
- # Step 2: Calculate taker = maker / price
130
- exact_taker = Decimal(str(maker_6digit)) / price_decimal
131
- taker_amount = int(exact_taker)
129
+ # Method: maker' = k * price_num, taker' = k * price_denom
130
+ # Choose k such that maker' ≈ maker_4digit
132
131
 
133
- # Step 3: Round taker to 6 significant digits
134
- taker_6digit = round_to_significant_digits(taker_amount, 6)
132
+ # Step 1: Round maker to 4 significant digits as target
133
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
135
134
 
136
- # Step 4: Recalculate maker using 6-digit taker to ensure precision
137
- recalculated_maker_decimal = Decimal(str(taker_6digit)) * price_decimal
138
- recalculated_maker_amount = int(recalculated_maker_decimal)
135
+ # Step 2: Find the scaling factor k
136
+ # We want: k * price_num ≈ maker_4digit
137
+ # So: k ≈ maker_4digit / price_num
138
+ k = maker_4digit // price_fraction.numerator
139
+ if k == 0:
140
+ k = 1 # Ensure at least k=1
139
141
 
140
- # Step 5: Round recalculated maker to 6 significant digits
141
- recalculated_maker_6digit = round_to_significant_digits(recalculated_maker_amount, 6)
142
-
143
- # Use the 6-digit values
144
- taker_amount = taker_6digit
145
- recalculated_maker_amount = recalculated_maker_6digit
142
+ # Step 3: Calculate exact maker and taker using k
143
+ # This guarantees: recalculated_maker_amount / taker_amount = price_num / price_denom
144
+ recalculated_maker_amount = k * price_fraction.numerator
145
+ taker_amount = k * price_fraction.denominator
146
146
 
147
147
  else: # SELL
148
148
  # For SELL: price = taker/maker
149
- # Goal: Calculate taker and maker with only 6 significant digits each
149
+ # Goal: Ensure taker/maker = price_num/price_denom EXACTLY
150
150
  #
151
- # Strategy:
152
- # 1. Round maker_amount to 6 significant digits
153
- # 2. Calculate taker = round(maker_6digit * price) to 6 significant digits
154
- # 3. This ensures: taker_6digit / maker_6digit = price (exact match within 6 digits)
155
-
156
- # Step 1: Round maker to 6 significant digits
157
- maker_6digit = round_to_significant_digits(maker_amount, 6)
158
-
159
- # Step 2: Calculate taker = maker * price
160
- exact_taker = Decimal(str(maker_6digit)) * price_decimal
161
- taker_amount = int(exact_taker)
162
-
163
- # Step 3: Round taker to 6 significant digits
164
- taker_6digit = round_to_significant_digits(taker_amount, 6)
165
-
166
- # Use the 6-digit values
167
- taker_amount = taker_6digit
168
- recalculated_maker_amount = maker_6digit
151
+ # Method: taker = k * price_num, maker = k * price_denom
152
+ # Choose k such that maker maker_4digit
153
+
154
+ # Step 1: Round maker to 4 significant digits
155
+ maker_4digit = round_to_significant_digits(maker_amount, 4)
156
+
157
+ # Step 2: Find the scaling factor k
158
+ # We want: k * price_denom ≈ maker_4digit
159
+ # So: k maker_4digit / price_denom
160
+ k = maker_4digit // price_fraction.denominator
161
+ if k == 0:
162
+ k = 1
163
+
164
+ # Step 3: Calculate exact maker and taker using k
165
+ recalculated_maker_amount = k * price_fraction.denominator
166
+ taker_amount = k * price_fraction.numerator
169
167
 
170
168
  # Ensure amounts are at least 1
171
169
  taker_amount = int(max(1, taker_amount))
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.13"
15
+ __version__ = "0.1.15"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",