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.
- opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
- opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +44 -46
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- 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
- 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
- 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
- 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
- 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
- opinion_clob_sdk/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
- opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/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
- {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/METADATA +1 -1
- {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/RECORD +116 -30
- {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/WHEEL +0 -0
- {opinion_clob_sdk-0.1.13.dist-info → opinion_clob_sdk-0.1.15.dist-info}/top_level.txt +0 -0
opinion_clob_sdk/__init__.py
CHANGED
|
@@ -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
|
|
81
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
121
|
-
# 2.
|
|
122
|
-
#
|
|
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
|
-
#
|
|
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
|
|
134
|
-
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
149
|
+
# Goal: Ensure taker/maker = price_num/price_denom EXACTLY
|
|
150
150
|
#
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
|
|
154
|
-
#
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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))
|
|
@@ -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
|
|
81
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
121
|
-
# 2.
|
|
122
|
-
#
|
|
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
|
-
#
|
|
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
|
|
134
|
-
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
149
|
+
# Goal: Ensure taker/maker = price_num/price_denom EXACTLY
|
|
150
150
|
#
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
|
|
154
|
-
#
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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))
|
|
@@ -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
|
|
81
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
121
|
-
# 2.
|
|
122
|
-
#
|
|
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
|
-
#
|
|
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
|
|
134
|
-
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
149
|
+
# Goal: Ensure taker/maker = price_num/price_denom EXACTLY
|
|
150
150
|
#
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
|
|
154
|
-
#
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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))
|
opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py
CHANGED
|
@@ -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
|
|
81
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
121
|
-
# 2.
|
|
122
|
-
#
|
|
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
|
-
#
|
|
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
|
|
134
|
-
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
149
|
+
# Goal: Ensure taker/maker = price_num/price_denom EXACTLY
|
|
150
150
|
#
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
|
|
154
|
-
#
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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))
|