opinion-clob-sdk 0.1.9__py3-none-any.whl → 0.4.2__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.
- opinion_clob_sdk/__init__.py +3 -3
- opinion_clob_sdk/chain/contract_caller.py +56 -2
- opinion_clob_sdk/chain/contracts/erc20.py +21 -0
- opinion_clob_sdk/chain/py_order_utils/abi/Exchange.json +1851 -0
- opinion_clob_sdk/chain/py_order_utils/abi/FeeManager.json +4416 -0
- opinion_clob_sdk/chain/py_order_utils/abi/FeeManager.py +9 -0
- opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +1 -1
- opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +1 -1
- opinion_clob_sdk/chain/py_order_utils/utils.py +100 -35
- opinion_clob_sdk/chain/safe/safe_test.py +1 -1
- opinion_clob_sdk/config.py +16 -1
- opinion_clob_sdk/model.py +26 -2
- opinion_clob_sdk/sdk.py +240 -102
- opinion_clob_sdk/verify_checksum_addresses.py +63 -0
- {opinion_clob_sdk-0.1.9.dist-info → opinion_clob_sdk-0.4.2.dist-info}/METADATA +12 -10
- opinion_clob_sdk-0.4.2.dist-info/RECORD +51 -0
- opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +0 -390
- opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +0 -111
- opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +0 -41
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +0 -2
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +0 -90
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +0 -40
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +0 -2
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +0 -254
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +0 -9
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +0 -20
- opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +0 -115
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +0 -6
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +0 -94
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +0 -141
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +0 -22
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +0 -37
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +0 -63
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +0 -17
- opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +0 -218
- opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/model.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +0 -390
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +0 -111
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- 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/chain/py_order_utils/builders/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +0 -41
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +0 -2
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +0 -90
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +0 -40
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +0 -9
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +0 -20
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +0 -115
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +0 -6
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +0 -94
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +0 -22
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +0 -37
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +0 -63
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +0 -17
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +0 -218
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- 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/chain/contract_caller.py +0 -390
- 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/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +0 -111
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- 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/chain/py_order_utils/builders/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +0 -41
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +0 -2
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +0 -90
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +0 -40
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +0 -9
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +0 -20
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +0 -115
- 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/chain/safe/constants.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +0 -6
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +0 -94
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +0 -22
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +0 -37
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +0 -63
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +0 -17
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +0 -218
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- 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/chain/contract_caller.py +0 -390
- 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/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +0 -111
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- 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/chain/py_order_utils/builders/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +0 -41
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +0 -2
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +0 -90
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +0 -40
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +0 -9
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +0 -20
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +0 -115
- 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/chain/safe/constants.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +0 -6
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +0 -94
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +0 -22
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +0 -37
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +0 -63
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +0 -17
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +0 -218
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- 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/chain/contract_caller.py +0 -390
- 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/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +0 -111
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- 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/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/chain/py_order_utils/builders/base_builder.py +0 -41
- 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 +0 -2
- 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 +0 -90
- 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 +0 -40
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- 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 +0 -9
- 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 +0 -8
- 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 +0 -8
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +0 -20
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +0 -115
- 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/chain/safe/constants.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +0 -6
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +0 -94
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- 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 +0 -22
- 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 +0 -1035
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +0 -26
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +0 -37
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +0 -63
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +0 -17
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +0 -218
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +0 -19
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +0 -26
- 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/chain/contract_caller.py +0 -390
- 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/chain/contracts/conditional_tokens.py +0 -707
- 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 +0 -111
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +0 -11
- 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/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/chain/py_order_utils/builders/base_builder.py +0 -41
- 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 +0 -2
- 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 +0 -90
- 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 +0 -40
- 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 +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- 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 +0 -9
- 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 +0 -8
- 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 +0 -8
- 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 +0 -20
- 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 +0 -115
- 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/chain/safe/constants.py +0 -19
- 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 +0 -176
- 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 +0 -6
- 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 +0 -94
- 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 +0 -347
- 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 +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- 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 +0 -22
- 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 +0 -1035
- 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 +0 -26
- 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 +0 -364
- 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 +0 -37
- 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 +0 -437
- 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 +0 -63
- 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 +0 -17
- 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 +0 -218
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +0 -4
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +0 -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/__init__.py +0 -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/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/chain/contract_caller.py +0 -390
- 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/chain/contracts/conditional_tokens.py +0 -707
- 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 +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/chain/exception.py +0 -11
- 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/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/chain/py_order_utils/builders/base_builder.py +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/chain/py_order_utils/builders/exception.py +0 -2
- 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 +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/chain/py_order_utils/builders/order_builder_test.py +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/chain/py_order_utils/constants.py +0 -2
- 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/chain/py_order_utils/model/order.py +0 -254
- 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 +0 -9
- 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 +0 -8
- 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 +0 -8
- 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 +0 -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/chain/py_order_utils/utils.py +0 -115
- 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/chain/safe/constants.py +0 -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/chain/safe/eip712/__init__.py +0 -176
- 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 +0 -6
- 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 +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/chain/safe/multisend.py +0 -347
- 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 +0 -141
- 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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- 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 +0 -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/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- 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 +0 -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/chain/safe/safe_signature.py +0 -364
- 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 +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/chain/safe/safe_tx.py +0 -437
- 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 +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/chain/safe/typing.py +0 -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/chain/safe/utils.py +0 -218
- 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 +0 -4
- 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 +0 -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/__init__.py +0 -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/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/chain/contract_caller.py +0 -390
- opinion_clob_sdk/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/chain/contracts/conditional_tokens.py +0 -707
- opinion_clob_sdk/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 +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/chain/exception.py +0 -11
- opinion_clob_sdk/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/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/chain/py_order_utils/builders/base_builder.py +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/chain/py_order_utils/builders/exception.py +0 -2
- opinion_clob_sdk/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 +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/chain/py_order_utils/builders/order_builder_test.py +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/chain/py_order_utils/constants.py +0 -2
- opinion_clob_sdk/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/chain/py_order_utils/model/order.py +0 -254
- opinion_clob_sdk/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 +0 -9
- opinion_clob_sdk/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 +0 -8
- opinion_clob_sdk/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 +0 -8
- opinion_clob_sdk/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 +0 -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/chain/py_order_utils/utils.py +0 -115
- opinion_clob_sdk/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/chain/safe/constants.py +0 -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/chain/safe/eip712/__init__.py +0 -176
- opinion_clob_sdk/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 +0 -6
- opinion_clob_sdk/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 +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/chain/safe/multisend.py +0 -347
- opinion_clob_sdk/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 +0 -141
- opinion_clob_sdk/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/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +0 -327
- opinion_clob_sdk/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 +0 -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/chain/safe/safe_contracts/safe_v1_3_0.py +0 -1035
- opinion_clob_sdk/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 +0 -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/chain/safe/safe_signature.py +0 -364
- opinion_clob_sdk/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 +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/chain/safe/safe_tx.py +0 -437
- opinion_clob_sdk/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 +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/chain/safe/typing.py +0 -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/chain/safe/utils.py +0 -218
- opinion_clob_sdk/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 +0 -4
- opinion_clob_sdk/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 +0 -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/sdk.py +0 -957
- 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 +0 -957
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- 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 +0 -135
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +0 -135
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +0 -135
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +0 -135
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +0 -135
- opinion_clob_sdk/opinion_clob_sdk/sdk.py +0 -957
- opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +0 -135
- opinion_clob_sdk-0.1.9.dist-info/RECORD +0 -389
- {opinion_clob_sdk-0.1.9.dist-info → opinion_clob_sdk-0.4.2.dist-info}/WHEEL +0 -0
- {opinion_clob_sdk-0.1.9.dist-info → opinion_clob_sdk-0.4.2.dist-info}/top_level.txt +0 -0
|
@@ -1,957 +0,0 @@
|
|
|
1
|
-
from typing import List, Optional, Dict, Any, Tuple
|
|
2
|
-
import logging
|
|
3
|
-
import math
|
|
4
|
-
from time import time
|
|
5
|
-
from decimal import Decimal
|
|
6
|
-
|
|
7
|
-
from eth_typing import ChecksumAddress, HexStr
|
|
8
|
-
from opinion_api.api.prediction_market_api import PredictionMarketApi
|
|
9
|
-
from opinion_api.api.user_api import UserApi
|
|
10
|
-
from opinion_api.api_client import ApiClient
|
|
11
|
-
from opinion_api.configuration import Configuration
|
|
12
|
-
from opinion_clob_sdk.chain.safe.utils import fast_to_checksum_address
|
|
13
|
-
from .chain.contract_caller import ContractCaller
|
|
14
|
-
from .chain.py_order_utils.builders.order_builder import OrderBuilder
|
|
15
|
-
from .chain.py_order_utils.model.order import OrderDataInput, OrderData, PlaceOrderDataInput
|
|
16
|
-
from .chain.py_order_utils.constants import ZERO_ADDRESS, ZX
|
|
17
|
-
from .chain.py_order_utils.model.signatures import POLY_GNOSIS_SAFE
|
|
18
|
-
from .chain.py_order_utils.model.sides import BUY, SELL, OrderSide
|
|
19
|
-
from .chain.py_order_utils.model.order_type import LIMIT_ORDER, MARKET_ORDER
|
|
20
|
-
from .model import TopicStatus, TopicStatusFilter, TopicType
|
|
21
|
-
from .chain.py_order_utils.utils import calculate_order_amounts
|
|
22
|
-
|
|
23
|
-
API_INTERNAL_ERROR_MSG = "Unable to process your request. Please contact technical support."
|
|
24
|
-
MISSING_MARKET_ID_MSG = "market_id is required."
|
|
25
|
-
MISSING_TOKEN_ID_MSG = "token_id is required."
|
|
26
|
-
MAX_DECIMALS = 18 # Standard maximum for ERC20 tokens (ETH, DAI, etc.)
|
|
27
|
-
|
|
28
|
-
# Supported blockchain chain IDs
|
|
29
|
-
CHAIN_ID_BASE_MAINNET = 8453 # Base mainnet
|
|
30
|
-
SUPPORTED_CHAIN_IDS = [CHAIN_ID_BASE_MAINNET]
|
|
31
|
-
|
|
32
|
-
class InvalidParamError(Exception):
|
|
33
|
-
pass
|
|
34
|
-
|
|
35
|
-
class OpenApiError(Exception):
|
|
36
|
-
pass
|
|
37
|
-
|
|
38
|
-
def safe_amount_to_wei(amount: float, decimals: int) -> int:
|
|
39
|
-
"""
|
|
40
|
-
Safely convert human-readable amount to wei units without precision loss.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
amount: Human-readable amount (e.g., 1.5 for 1.5 tokens)
|
|
44
|
-
decimals: Token decimals (e.g., 6 for USDC, 18 for ETH)
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
Integer amount in wei units
|
|
48
|
-
|
|
49
|
-
Raises:
|
|
50
|
-
InvalidParamError: If amount or decimals are invalid
|
|
51
|
-
"""
|
|
52
|
-
if amount <= 0:
|
|
53
|
-
raise InvalidParamError(f"Amount must be positive, got: {amount}")
|
|
54
|
-
|
|
55
|
-
if decimals < 0 or decimals > MAX_DECIMALS:
|
|
56
|
-
raise InvalidParamError(f"Decimals must be between 0 and {MAX_DECIMALS}, got: {decimals}")
|
|
57
|
-
|
|
58
|
-
# Use Decimal for exact calculation
|
|
59
|
-
amount_decimal = Decimal(str(amount))
|
|
60
|
-
multiplier = Decimal(10) ** decimals
|
|
61
|
-
|
|
62
|
-
result_decimal = amount_decimal * multiplier
|
|
63
|
-
|
|
64
|
-
# Convert to int
|
|
65
|
-
result = int(result_decimal)
|
|
66
|
-
|
|
67
|
-
# Validate result fits in uint256
|
|
68
|
-
if result >= 2**256:
|
|
69
|
-
raise InvalidParamError(f"Amount too large for uint256: {result}")
|
|
70
|
-
|
|
71
|
-
if result <= 0:
|
|
72
|
-
raise InvalidParamError(f"Calculated amount is zero or negative: {result}")
|
|
73
|
-
|
|
74
|
-
return result
|
|
75
|
-
|
|
76
|
-
class Client:
|
|
77
|
-
def __init__(
|
|
78
|
-
self,
|
|
79
|
-
host: str = '',
|
|
80
|
-
apikey: str = '',
|
|
81
|
-
chain_id: Optional[int] = None,
|
|
82
|
-
rpc_url: str = '',
|
|
83
|
-
private_key: HexStr = HexStr(''),
|
|
84
|
-
multi_sig_addr: str = '',
|
|
85
|
-
conditional_tokens_addr: ChecksumAddress = ChecksumAddress(''),
|
|
86
|
-
multisend_addr: ChecksumAddress = ChecksumAddress(''),
|
|
87
|
-
enable_trading_check_interval: int = 3600,
|
|
88
|
-
quote_tokens_cache_ttl: int = 3600,
|
|
89
|
-
market_cache_ttl: int = 300
|
|
90
|
-
) -> None:
|
|
91
|
-
"""
|
|
92
|
-
Initialize the Opinion CLOB SDK client.
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
host: API host URL
|
|
96
|
-
apikey: API authentication key
|
|
97
|
-
chain_id: Blockchain chain ID (8453 for Base mainnet)
|
|
98
|
-
rpc_url: RPC endpoint URL
|
|
99
|
-
private_key: Private key for signing transactions
|
|
100
|
-
multi_sig_addr: Multi-signature wallet address
|
|
101
|
-
conditional_tokens_addr: Conditional tokens contract address
|
|
102
|
-
multisend_addr: Multisend contract address
|
|
103
|
-
enable_trading_check_interval: Time interval (in seconds) to cache enable_trading checks.
|
|
104
|
-
Default is 3600 (1 hour). Set to 0 to check every time.
|
|
105
|
-
This significantly improves performance for frequent operations.
|
|
106
|
-
quote_tokens_cache_ttl: Time interval (in seconds) to cache quote tokens data.
|
|
107
|
-
Default is 3600 (1 hour). Set to 0 to disable caching.
|
|
108
|
-
market_cache_ttl: Time interval (in seconds) to cache market data.
|
|
109
|
-
Default is 300 (5 minutes). Set to 0 to disable caching.
|
|
110
|
-
"""
|
|
111
|
-
self.conf = Configuration(host=host)
|
|
112
|
-
self.conf.api_key['ApiKeyAuth'] = apikey
|
|
113
|
-
self.api_key = apikey
|
|
114
|
-
multi_sig_addr = fast_to_checksum_address(multi_sig_addr)
|
|
115
|
-
self.contract_caller = ContractCaller(rpc_url=rpc_url, private_key=private_key, multi_sig_addr=multi_sig_addr,
|
|
116
|
-
conditional_tokens_addr=conditional_tokens_addr,
|
|
117
|
-
multisend_addr=multisend_addr,
|
|
118
|
-
enable_trading_check_interval=enable_trading_check_interval)
|
|
119
|
-
self.api_client = ApiClient(self.conf)
|
|
120
|
-
self.market_api = PredictionMarketApi(self.api_client)
|
|
121
|
-
self.user_api = UserApi(self.api_client)
|
|
122
|
-
# Validate and set chain_id
|
|
123
|
-
if chain_id not in SUPPORTED_CHAIN_IDS:
|
|
124
|
-
raise InvalidParamError(f'chain_id must be one of {SUPPORTED_CHAIN_IDS}')
|
|
125
|
-
self.chain_id = chain_id
|
|
126
|
-
|
|
127
|
-
# Cache configuration
|
|
128
|
-
self.quote_tokens_cache_ttl = quote_tokens_cache_ttl
|
|
129
|
-
self.market_cache_ttl = market_cache_ttl
|
|
130
|
-
self._quote_tokens_cache: Optional[Any] = None
|
|
131
|
-
self._quote_tokens_cache_time: float = 0
|
|
132
|
-
self._market_cache: Dict[int, Tuple[Any, float]] = {} # market_id -> (data, timestamp)
|
|
133
|
-
|
|
134
|
-
def _validate_market_response(self, response: Any, operation_name: str = "operation") -> Any:
|
|
135
|
-
"""Validate and extract market data from API response"""
|
|
136
|
-
if hasattr(response, 'errno') and response.errno != 0:
|
|
137
|
-
raise OpenApiError(f"Failed to {operation_name}: {response}")
|
|
138
|
-
|
|
139
|
-
if not hasattr(response, 'result') or not hasattr(response.result, 'data'):
|
|
140
|
-
raise OpenApiError(f"Invalid response format for {operation_name}")
|
|
141
|
-
|
|
142
|
-
return response.result.data
|
|
143
|
-
|
|
144
|
-
def _parse_list_response(self, response: Any, operation_name: str = "operation") -> List[Any]:
|
|
145
|
-
"""Parse response that contains a list"""
|
|
146
|
-
if hasattr(response, 'errno') and response.errno != 0:
|
|
147
|
-
raise OpenApiError(f"Failed to {operation_name}: {response}")
|
|
148
|
-
|
|
149
|
-
if not hasattr(response, 'result') or not hasattr(response.result, 'list'):
|
|
150
|
-
raise OpenApiError(f"Invalid list response format for {operation_name}")
|
|
151
|
-
|
|
152
|
-
return response.result.list
|
|
153
|
-
|
|
154
|
-
def enable_trading(self) -> Tuple[Any, Any, Any]:
|
|
155
|
-
quote_token_list_response = self.get_quote_tokens()
|
|
156
|
-
quote_token_list = self._parse_list_response(quote_token_list_response, "get quote tokens")
|
|
157
|
-
|
|
158
|
-
supported_quote_tokens: dict = {}
|
|
159
|
-
|
|
160
|
-
# for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
|
|
161
|
-
for quote_token in quote_token_list:
|
|
162
|
-
quote_token_address = fast_to_checksum_address(quote_token.quote_token_address)
|
|
163
|
-
ctf_exchange_address = fast_to_checksum_address(quote_token.ctf_exchange_address)
|
|
164
|
-
supported_quote_tokens[quote_token_address] = ctf_exchange_address
|
|
165
|
-
|
|
166
|
-
logging.info(f'Supported quote tokens: {supported_quote_tokens}')
|
|
167
|
-
if len(supported_quote_tokens) == 0:
|
|
168
|
-
raise OpenApiError('No supported quote tokens found')
|
|
169
|
-
return self.contract_caller.enable_trading(supported_quote_tokens)
|
|
170
|
-
|
|
171
|
-
def split(self, market_id: int, amount: int, check_approval: bool = True) -> Tuple[Any, Any, Any]:
|
|
172
|
-
"""Split collateral into outcome tokens for a market.
|
|
173
|
-
|
|
174
|
-
Args:
|
|
175
|
-
market_id: The market ID to split tokens for (required)
|
|
176
|
-
amount: Amount of collateral to split in wei (required)
|
|
177
|
-
check_approval: Whether to check and enable trading approvals first
|
|
178
|
-
"""
|
|
179
|
-
if not market_id or market_id <= 0:
|
|
180
|
-
raise InvalidParamError("market_id must be a positive integer")
|
|
181
|
-
if not amount or amount <= 0:
|
|
182
|
-
raise InvalidParamError("amount must be a positive integer")
|
|
183
|
-
|
|
184
|
-
# Enable trading first for all trade operations.
|
|
185
|
-
if check_approval:
|
|
186
|
-
self.enable_trading()
|
|
187
|
-
|
|
188
|
-
topic_detail = self.get_market(market_id)
|
|
189
|
-
market_data = self._validate_market_response(topic_detail, "get market for split")
|
|
190
|
-
|
|
191
|
-
if int(market_data.chain_id) != self.chain_id:
|
|
192
|
-
raise OpenApiError('Cannot split on different chain')
|
|
193
|
-
|
|
194
|
-
status = market_data.status
|
|
195
|
-
if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
|
|
196
|
-
raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
|
|
197
|
-
collateral = fast_to_checksum_address(market_data.quote_token)
|
|
198
|
-
condition_id = market_data.condition_id
|
|
199
|
-
|
|
200
|
-
return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
|
|
201
|
-
|
|
202
|
-
def merge(self, market_id: int, amount: int, check_approval: bool = True) -> Tuple[Any, Any, Any]:
|
|
203
|
-
"""Merge outcome tokens back into collateral for a market.
|
|
204
|
-
|
|
205
|
-
Args:
|
|
206
|
-
market_id: The market ID to merge tokens for (required)
|
|
207
|
-
amount: Amount of outcome tokens to merge in wei (required)
|
|
208
|
-
check_approval: Whether to check and enable trading approvals first
|
|
209
|
-
"""
|
|
210
|
-
if not market_id or market_id <= 0:
|
|
211
|
-
raise InvalidParamError("market_id must be a positive integer")
|
|
212
|
-
if not amount or amount <= 0:
|
|
213
|
-
raise InvalidParamError("amount must be a positive integer")
|
|
214
|
-
|
|
215
|
-
# Enable trading first for all trade operations.
|
|
216
|
-
if check_approval:
|
|
217
|
-
self.enable_trading()
|
|
218
|
-
|
|
219
|
-
topic_detail = self.get_market(market_id)
|
|
220
|
-
market_data = self._validate_market_response(topic_detail, "get market for merge")
|
|
221
|
-
|
|
222
|
-
if int(market_data.chain_id) != self.chain_id:
|
|
223
|
-
raise OpenApiError('Cannot merge on different chain')
|
|
224
|
-
|
|
225
|
-
status = market_data.status
|
|
226
|
-
if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
|
|
227
|
-
raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
|
|
228
|
-
collateral = fast_to_checksum_address(market_data.quote_token)
|
|
229
|
-
condition_id = market_data.condition_id
|
|
230
|
-
|
|
231
|
-
return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
|
|
232
|
-
amount=amount)
|
|
233
|
-
|
|
234
|
-
def redeem(self, market_id: int, check_approval: bool = True) -> Tuple[Any, Any, Any]:
|
|
235
|
-
"""Redeem winning outcome tokens for collateral after market resolution.
|
|
236
|
-
|
|
237
|
-
Args:
|
|
238
|
-
market_id: The market ID to redeem tokens for (required)
|
|
239
|
-
check_approval: Whether to check and enable trading approvals first
|
|
240
|
-
"""
|
|
241
|
-
if not market_id or market_id <= 0:
|
|
242
|
-
raise InvalidParamError("market_id must be a positive integer")
|
|
243
|
-
|
|
244
|
-
# Enable trading first for all trade operations.
|
|
245
|
-
if check_approval:
|
|
246
|
-
self.enable_trading()
|
|
247
|
-
|
|
248
|
-
topic_detail = self.get_market(market_id)
|
|
249
|
-
market_data = self._validate_market_response(topic_detail, "get market for redeem")
|
|
250
|
-
|
|
251
|
-
if int(market_data.chain_id) != self.chain_id:
|
|
252
|
-
raise OpenApiError('Cannot redeem on different chain')
|
|
253
|
-
|
|
254
|
-
status = market_data.status
|
|
255
|
-
if not status == TopicStatus.RESOLVED.value:
|
|
256
|
-
raise OpenApiError('Cannot redeem on non-resolved market')
|
|
257
|
-
collateral = market_data.quote_token
|
|
258
|
-
condition_id = market_data.condition_id
|
|
259
|
-
logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
|
|
260
|
-
return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
|
|
261
|
-
|
|
262
|
-
def get_quote_tokens(self, use_cache: bool = True) -> Any:
|
|
263
|
-
"""Get list of supported quote tokens
|
|
264
|
-
|
|
265
|
-
Args:
|
|
266
|
-
use_cache: Whether to use cached data if available (default True).
|
|
267
|
-
Set to False to force a fresh API call.
|
|
268
|
-
"""
|
|
269
|
-
current_time = time()
|
|
270
|
-
|
|
271
|
-
# Check cache if enabled
|
|
272
|
-
if use_cache and self.quote_tokens_cache_ttl > 0:
|
|
273
|
-
if self._quote_tokens_cache is not None:
|
|
274
|
-
cache_age = current_time - self._quote_tokens_cache_time
|
|
275
|
-
if cache_age < self.quote_tokens_cache_ttl:
|
|
276
|
-
logging.debug(f"Using cached quote tokens (age: {cache_age:.1f}s)")
|
|
277
|
-
return self._quote_tokens_cache
|
|
278
|
-
|
|
279
|
-
# Fetch fresh data
|
|
280
|
-
logging.debug("Fetching fresh quote tokens from API")
|
|
281
|
-
result = self.market_api.openapi_quote_token_get(apikey=self.api_key, chain_id=str(self.chain_id))
|
|
282
|
-
|
|
283
|
-
# Update cache
|
|
284
|
-
if self.quote_tokens_cache_ttl > 0:
|
|
285
|
-
self._quote_tokens_cache = result
|
|
286
|
-
self._quote_tokens_cache_time = current_time
|
|
287
|
-
|
|
288
|
-
return result
|
|
289
|
-
|
|
290
|
-
# Deprecated: use get_quote_tokens() instead
|
|
291
|
-
def get_currencies(self) -> Any:
|
|
292
|
-
"""Deprecated: Use get_quote_tokens() instead"""
|
|
293
|
-
return self.get_quote_tokens()
|
|
294
|
-
|
|
295
|
-
def get_markets(
|
|
296
|
-
self,
|
|
297
|
-
topic_type: Optional[TopicType] = None,
|
|
298
|
-
page: int = 1,
|
|
299
|
-
limit: int = 20,
|
|
300
|
-
status: Optional[TopicStatusFilter] = None
|
|
301
|
-
) -> Any:
|
|
302
|
-
"""Get markets with pagination support.
|
|
303
|
-
|
|
304
|
-
Args:
|
|
305
|
-
topic_type: Optional filter by topic type
|
|
306
|
-
page: Page number (>= 1)
|
|
307
|
-
limit: Number of items per page (1-20)
|
|
308
|
-
status: Optional filter by status
|
|
309
|
-
"""
|
|
310
|
-
if page < 1:
|
|
311
|
-
raise InvalidParamError("page must be >= 1")
|
|
312
|
-
if not 1 <= limit <= 20:
|
|
313
|
-
raise InvalidParamError("limit must be between 1 and 20")
|
|
314
|
-
|
|
315
|
-
result = self.market_api.openapi_market_get(
|
|
316
|
-
apikey=self.api_key,
|
|
317
|
-
market_type=topic_type.value if topic_type else None,
|
|
318
|
-
page=page,
|
|
319
|
-
limit=limit,
|
|
320
|
-
chain_id=str(self.chain_id),
|
|
321
|
-
status=status.value if status else None
|
|
322
|
-
)
|
|
323
|
-
return result
|
|
324
|
-
|
|
325
|
-
def get_market(self, market_id, use_cache: bool = True):
|
|
326
|
-
"""Get detailed information about a specific market
|
|
327
|
-
|
|
328
|
-
Args:
|
|
329
|
-
market_id: The market ID to query
|
|
330
|
-
use_cache: Whether to use cached data if available (default True).
|
|
331
|
-
Set to False to force a fresh API call.
|
|
332
|
-
"""
|
|
333
|
-
try:
|
|
334
|
-
if not market_id:
|
|
335
|
-
raise InvalidParamError(MISSING_MARKET_ID_MSG)
|
|
336
|
-
|
|
337
|
-
current_time = time()
|
|
338
|
-
|
|
339
|
-
# Check cache if enabled
|
|
340
|
-
if use_cache and self.market_cache_ttl > 0:
|
|
341
|
-
if market_id in self._market_cache:
|
|
342
|
-
cached_data, cache_time = self._market_cache[market_id]
|
|
343
|
-
cache_age = current_time - cache_time
|
|
344
|
-
if cache_age < self.market_cache_ttl:
|
|
345
|
-
logging.debug(f"Using cached market {market_id} (age: {cache_age:.1f}s)")
|
|
346
|
-
return cached_data
|
|
347
|
-
|
|
348
|
-
# Fetch fresh data
|
|
349
|
-
logging.debug(f"Fetching fresh market {market_id} from API")
|
|
350
|
-
result = self.market_api.openapi_market_market_id_get(apikey=self.api_key, market_id=market_id)
|
|
351
|
-
|
|
352
|
-
# Update cache
|
|
353
|
-
if self.market_cache_ttl > 0:
|
|
354
|
-
self._market_cache[market_id] = (result, current_time)
|
|
355
|
-
|
|
356
|
-
return result
|
|
357
|
-
except InvalidParamError as e:
|
|
358
|
-
logging.error(f"Validation error: {e}")
|
|
359
|
-
raise
|
|
360
|
-
except Exception as e:
|
|
361
|
-
logging.error(f"API error: {e}")
|
|
362
|
-
raise OpenApiError(f"Failed to get market: {e}")
|
|
363
|
-
|
|
364
|
-
def get_categorical_market(self, market_id):
|
|
365
|
-
"""Get detailed information about a categorical market"""
|
|
366
|
-
try:
|
|
367
|
-
if not market_id:
|
|
368
|
-
raise InvalidParamError(MISSING_MARKET_ID_MSG)
|
|
369
|
-
|
|
370
|
-
result = self.market_api.openapi_market_categorical_market_id_get(apikey=self.api_key, market_id=market_id)
|
|
371
|
-
return result
|
|
372
|
-
except InvalidParamError as e:
|
|
373
|
-
logging.error(f"Validation error: {e}")
|
|
374
|
-
raise
|
|
375
|
-
except Exception as e:
|
|
376
|
-
logging.error(f"API error: {e}")
|
|
377
|
-
raise OpenApiError(f"Failed to get categorical market: {e}")
|
|
378
|
-
|
|
379
|
-
def get_price_history(self, token_id, interval="1h", start_at=None, end_at=None):
|
|
380
|
-
"""Get price history/candlestick data for a token
|
|
381
|
-
|
|
382
|
-
Args:
|
|
383
|
-
token_id: Token ID
|
|
384
|
-
interval: Price data interval: 1m, 1h, 1d, 1w, max (default: 1h)
|
|
385
|
-
start_at: Start timestamp in Unix seconds (optional)
|
|
386
|
-
end_at: End timestamp in Unix seconds (optional)
|
|
387
|
-
"""
|
|
388
|
-
try:
|
|
389
|
-
if not token_id:
|
|
390
|
-
raise InvalidParamError(MISSING_TOKEN_ID_MSG)
|
|
391
|
-
|
|
392
|
-
if not interval:
|
|
393
|
-
raise InvalidParamError('interval is required')
|
|
394
|
-
|
|
395
|
-
result = self.market_api.openapi_token_price_history_get(
|
|
396
|
-
apikey=self.api_key,
|
|
397
|
-
token_id=token_id,
|
|
398
|
-
interval=interval,
|
|
399
|
-
start_at=start_at,
|
|
400
|
-
end_at=end_at
|
|
401
|
-
)
|
|
402
|
-
return result
|
|
403
|
-
except InvalidParamError as e:
|
|
404
|
-
logging.error(f"Validation error: {e}")
|
|
405
|
-
raise
|
|
406
|
-
except Exception as e:
|
|
407
|
-
logging.error(f"API error: {e}")
|
|
408
|
-
raise OpenApiError(f"Failed to get price history: {e}")
|
|
409
|
-
|
|
410
|
-
def get_orderbook(self, token_id):
|
|
411
|
-
"""Get orderbook for a specific token"""
|
|
412
|
-
try:
|
|
413
|
-
if not token_id:
|
|
414
|
-
raise InvalidParamError(MISSING_TOKEN_ID_MSG)
|
|
415
|
-
|
|
416
|
-
result = self.market_api.openapi_token_orderbook_get(apikey=self.api_key, token_id=token_id)
|
|
417
|
-
return result
|
|
418
|
-
except InvalidParamError as e:
|
|
419
|
-
logging.error(f"Validation error: {e}")
|
|
420
|
-
raise
|
|
421
|
-
except Exception as e:
|
|
422
|
-
logging.error(f"API error: {e}")
|
|
423
|
-
raise OpenApiError(f"Failed to get orderbook: {e}")
|
|
424
|
-
|
|
425
|
-
def get_latest_price(self, token_id):
|
|
426
|
-
"""Get latest price for a token"""
|
|
427
|
-
try:
|
|
428
|
-
if not token_id:
|
|
429
|
-
raise InvalidParamError(MISSING_TOKEN_ID_MSG)
|
|
430
|
-
|
|
431
|
-
result = self.market_api.openapi_token_latest_price_get(apikey=self.api_key, token_id=token_id)
|
|
432
|
-
return result
|
|
433
|
-
except InvalidParamError as e:
|
|
434
|
-
logging.error(f"Validation error: {e}")
|
|
435
|
-
raise
|
|
436
|
-
except Exception as e:
|
|
437
|
-
logging.error(f"API error: {e}")
|
|
438
|
-
raise OpenApiError(f"Failed to get latest price: {e}")
|
|
439
|
-
|
|
440
|
-
def get_fee_rates(self, token_id):
|
|
441
|
-
"""Get fee rates for a token"""
|
|
442
|
-
try:
|
|
443
|
-
if not token_id:
|
|
444
|
-
raise InvalidParamError(MISSING_TOKEN_ID_MSG)
|
|
445
|
-
|
|
446
|
-
result = self.market_api.openapi_token_fee_rates_get(apikey=self.api_key, token_id=token_id)
|
|
447
|
-
return result
|
|
448
|
-
except InvalidParamError as e:
|
|
449
|
-
logging.error(f"Validation error: {e}")
|
|
450
|
-
raise
|
|
451
|
-
except Exception as e:
|
|
452
|
-
logging.error(f"API error: {e}")
|
|
453
|
-
raise OpenApiError(f"Failed to get fee rates: {e}")
|
|
454
|
-
|
|
455
|
-
def _place_order(self, data: OrderDataInput, exchange_addr='', chain_id=0, currency_addr='', currency_decimal=0, check_approval=False):
|
|
456
|
-
if check_approval:
|
|
457
|
-
self.enable_trading()
|
|
458
|
-
try:
|
|
459
|
-
if not exchange_addr:
|
|
460
|
-
raise InvalidParamError('exchange_addr is required')
|
|
461
|
-
|
|
462
|
-
# Validate currency_decimal to prevent overflow
|
|
463
|
-
if currency_decimal < 0:
|
|
464
|
-
raise InvalidParamError(f'currency_decimal must be non-negative, got: {currency_decimal}')
|
|
465
|
-
if currency_decimal > MAX_DECIMALS:
|
|
466
|
-
raise InvalidParamError(f'currency_decimal too large (max {MAX_DECIMALS}): {currency_decimal}')
|
|
467
|
-
|
|
468
|
-
chain_id = self.chain_id
|
|
469
|
-
|
|
470
|
-
builder = OrderBuilder(exchange_addr, chain_id, self.contract_caller.signer)
|
|
471
|
-
takerAmount = 0
|
|
472
|
-
|
|
473
|
-
if data.orderType == MARKET_ORDER:
|
|
474
|
-
takerAmount = 0
|
|
475
|
-
data.price = "0"
|
|
476
|
-
# Use safe conversion to avoid precision loss
|
|
477
|
-
recalculated_maker_amount = safe_amount_to_wei(data.makerAmount, currency_decimal)
|
|
478
|
-
if data.orderType == LIMIT_ORDER:
|
|
479
|
-
# Use safe conversion to avoid precision loss
|
|
480
|
-
maker_amount_wei = safe_amount_to_wei(data.makerAmount, currency_decimal)
|
|
481
|
-
recalculated_maker_amount, takerAmount = calculate_order_amounts(
|
|
482
|
-
price=float(data.price),
|
|
483
|
-
maker_amount=maker_amount_wei,
|
|
484
|
-
side=data.side,
|
|
485
|
-
decimals=currency_decimal
|
|
486
|
-
)
|
|
487
|
-
|
|
488
|
-
order_data = OrderData(
|
|
489
|
-
maker=self.contract_caller.multi_sig_addr,
|
|
490
|
-
taker=ZERO_ADDRESS,
|
|
491
|
-
tokenId=data.tokenId,
|
|
492
|
-
makerAmount=recalculated_maker_amount,
|
|
493
|
-
takerAmount=takerAmount,
|
|
494
|
-
feeRateBps='0',
|
|
495
|
-
side=data.side,
|
|
496
|
-
signatureType=POLY_GNOSIS_SAFE,
|
|
497
|
-
signer=self.contract_caller.signer.address()
|
|
498
|
-
)
|
|
499
|
-
signerOrder = builder.build_signed_order(order_data)
|
|
500
|
-
|
|
501
|
-
order_dict = signerOrder.order.dict()
|
|
502
|
-
|
|
503
|
-
# Create V2AddOrderReq object for opinion_api
|
|
504
|
-
from opinion_api.models.v2_add_order_req import V2AddOrderReq
|
|
505
|
-
|
|
506
|
-
v2_add_order_req = V2AddOrderReq(
|
|
507
|
-
salt=str(order_dict['salt']),
|
|
508
|
-
topic_id=data.marketId,
|
|
509
|
-
maker=order_dict['maker'],
|
|
510
|
-
signer=order_dict['signer'],
|
|
511
|
-
taker=order_dict['taker'],
|
|
512
|
-
token_id=str(order_dict['tokenId']),
|
|
513
|
-
maker_amount=str(order_dict['makerAmount']),
|
|
514
|
-
taker_amount=str(order_dict['takerAmount']),
|
|
515
|
-
expiration=str(order_dict['expiration']),
|
|
516
|
-
nonce=str(order_dict['nonce']),
|
|
517
|
-
fee_rate_bps=str(order_dict['feeRateBps']),
|
|
518
|
-
side=str(order_dict['side']),
|
|
519
|
-
signature_type=str(order_dict['signatureType']),
|
|
520
|
-
signature=signerOrder.signature,
|
|
521
|
-
sign=signerOrder.signature,
|
|
522
|
-
contract_address="",
|
|
523
|
-
currency_address=currency_addr,
|
|
524
|
-
price=data.price,
|
|
525
|
-
trading_method=int(data.orderType),
|
|
526
|
-
timestamp=int(time()),
|
|
527
|
-
safe_rate='0',
|
|
528
|
-
order_exp_time='0'
|
|
529
|
-
)
|
|
530
|
-
|
|
531
|
-
result = self.market_api.openapi_order_post(apikey=self.api_key, add_order_req=v2_add_order_req)
|
|
532
|
-
return result
|
|
533
|
-
except InvalidParamError as e:
|
|
534
|
-
logging.error(f"Validation error: {e}")
|
|
535
|
-
raise
|
|
536
|
-
except Exception as e:
|
|
537
|
-
logging.error(f"API error: {e}")
|
|
538
|
-
raise OpenApiError(f"Failed to place order: {e}")
|
|
539
|
-
|
|
540
|
-
def place_order(self, data: PlaceOrderDataInput, check_approval=False):
|
|
541
|
-
"""Place an order on the market"""
|
|
542
|
-
quote_token_list_response = self.get_quote_tokens()
|
|
543
|
-
quote_token_list = self._parse_list_response(quote_token_list_response, "get quote tokens")
|
|
544
|
-
|
|
545
|
-
market_response = self.get_market(data.marketId)
|
|
546
|
-
market = self._validate_market_response(market_response, "get market for place order")
|
|
547
|
-
|
|
548
|
-
if int(market.chain_id) != self.chain_id:
|
|
549
|
-
raise OpenApiError('Cannot place order on different chain')
|
|
550
|
-
|
|
551
|
-
quote_token_addr = market.quote_token
|
|
552
|
-
|
|
553
|
-
# find quote token from quote_token_list by quote_token_address
|
|
554
|
-
quote_token = next((item for item in quote_token_list if str.lower(item.quote_token_address) == str.lower(quote_token_addr)), None)
|
|
555
|
-
if not quote_token:
|
|
556
|
-
raise OpenApiError('Quote token not found for this market')
|
|
557
|
-
|
|
558
|
-
exchange_addr = quote_token.ctf_exchange_address
|
|
559
|
-
chain_id = quote_token.chain_id
|
|
560
|
-
|
|
561
|
-
makerAmount = 0
|
|
562
|
-
minimal_maker_amount = 1
|
|
563
|
-
|
|
564
|
-
# reject if market buy and makerAmountInBaseToken is provided
|
|
565
|
-
if(data.side == OrderSide.BUY and data.orderType == MARKET_ORDER and data.makerAmountInBaseToken):
|
|
566
|
-
raise InvalidParamError('makerAmountInBaseToken is not allowed for market buy')
|
|
567
|
-
|
|
568
|
-
# reject if market sell and makerAmountInQuoteToken is provided
|
|
569
|
-
if(data.side == OrderSide.SELL and data.orderType == MARKET_ORDER and data.makerAmountInQuoteToken):
|
|
570
|
-
raise InvalidParamError('makerAmountInQuoteToken is not allowed for market sell')
|
|
571
|
-
|
|
572
|
-
# Validate price for limit orders (prevent division by zero)
|
|
573
|
-
if data.orderType == LIMIT_ORDER:
|
|
574
|
-
try:
|
|
575
|
-
price_decimal = Decimal(str(data.price))
|
|
576
|
-
if price_decimal <= 0:
|
|
577
|
-
raise InvalidParamError(f'Price must be positive for limit orders, got: {data.price}')
|
|
578
|
-
except (ValueError, TypeError, InvalidParamError):
|
|
579
|
-
raise
|
|
580
|
-
except Exception as e:
|
|
581
|
-
raise InvalidParamError(f'Invalid price format: {data.price}') from e
|
|
582
|
-
|
|
583
|
-
# need amount to be in quote token
|
|
584
|
-
if(data.side == OrderSide.BUY):
|
|
585
|
-
# e.g. yes/no
|
|
586
|
-
if(data.makerAmountInBaseToken):
|
|
587
|
-
# Use Decimal for precise calculation to avoid floating point errors
|
|
588
|
-
base_amount = Decimal(str(data.makerAmountInBaseToken))
|
|
589
|
-
price_decimal = Decimal(str(data.price))
|
|
590
|
-
makerAmount = float(base_amount * price_decimal)
|
|
591
|
-
# makerAmountInBaseToken should be at least 1 otherwise throw error
|
|
592
|
-
if(float(data.makerAmountInBaseToken) < minimal_maker_amount):
|
|
593
|
-
raise InvalidParamError("makerAmountInBaseToken must be at least 1")
|
|
594
|
-
# e.g. usdc
|
|
595
|
-
elif(data.makerAmountInQuoteToken):
|
|
596
|
-
makerAmount = float(data.makerAmountInQuoteToken)
|
|
597
|
-
# makerAmountInQuoteToken should be at least 1 otherwise throw error
|
|
598
|
-
if(float(data.makerAmountInQuoteToken) < minimal_maker_amount):
|
|
599
|
-
raise InvalidParamError("makerAmountInQuoteToken must be at least 1")
|
|
600
|
-
else:
|
|
601
|
-
raise InvalidParamError("Either makerAmountInBaseToken or makerAmountInQuoteToken must be provided for BUY orders")
|
|
602
|
-
|
|
603
|
-
elif(data.side == OrderSide.SELL):
|
|
604
|
-
# e.g. yes/no
|
|
605
|
-
if(data.makerAmountInBaseToken):
|
|
606
|
-
makerAmount = float(data.makerAmountInBaseToken)
|
|
607
|
-
# makerAmountInBaseToken should be at least 1 otherwise throw error
|
|
608
|
-
if(float(data.makerAmountInBaseToken) < minimal_maker_amount):
|
|
609
|
-
raise InvalidParamError("makerAmountInBaseToken must be at least 1")
|
|
610
|
-
# e.g. usdc
|
|
611
|
-
elif(data.makerAmountInQuoteToken):
|
|
612
|
-
# Use Decimal for precise division to avoid floating point errors
|
|
613
|
-
quote_amount = Decimal(str(data.makerAmountInQuoteToken))
|
|
614
|
-
price_decimal = Decimal(str(data.price))
|
|
615
|
-
if price_decimal == 0:
|
|
616
|
-
raise InvalidParamError("Price cannot be zero for SELL orders with makerAmountInQuoteToken")
|
|
617
|
-
makerAmount = float(quote_amount / price_decimal)
|
|
618
|
-
# makerAmountInQuoteToken should be at least 1 otherwise throw error
|
|
619
|
-
if(float(data.makerAmountInQuoteToken) < minimal_maker_amount):
|
|
620
|
-
raise InvalidParamError("makerAmountInQuoteToken must be at least 1")
|
|
621
|
-
else:
|
|
622
|
-
raise InvalidParamError("Either makerAmountInBaseToken or makerAmountInQuoteToken must be provided for SELL orders")
|
|
623
|
-
|
|
624
|
-
# Final validation: ensure makerAmount was properly calculated
|
|
625
|
-
if makerAmount <= 0:
|
|
626
|
-
raise InvalidParamError(f"Calculated makerAmount must be positive, got: {makerAmount}")
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
input = OrderDataInput(
|
|
630
|
-
marketId=data.marketId,
|
|
631
|
-
tokenId=data.tokenId,
|
|
632
|
-
makerAmount=makerAmount,
|
|
633
|
-
price=data.price,
|
|
634
|
-
orderType=data.orderType,
|
|
635
|
-
side=data.side
|
|
636
|
-
)
|
|
637
|
-
|
|
638
|
-
return self._place_order(input, exchange_addr, chain_id, quote_token_addr, int(quote_token.decimal), check_approval)
|
|
639
|
-
|
|
640
|
-
def cancel_order(self, order_id):
|
|
641
|
-
"""
|
|
642
|
-
Cancel an existing order.
|
|
643
|
-
|
|
644
|
-
Args:
|
|
645
|
-
order_id: Order ID to cancel (str)
|
|
646
|
-
|
|
647
|
-
Returns:
|
|
648
|
-
API response for order cancellation
|
|
649
|
-
"""
|
|
650
|
-
if not order_id or not isinstance(order_id, str):
|
|
651
|
-
raise InvalidParamError('order_id must be a non-empty string')
|
|
652
|
-
|
|
653
|
-
from opinion_api.models.openapi_cancel_order_request_open_api import OpenapiCancelOrderRequestOpenAPI
|
|
654
|
-
|
|
655
|
-
# Internally use trans_no for API compatibility
|
|
656
|
-
request_body = OpenapiCancelOrderRequestOpenAPI(trans_no=order_id)
|
|
657
|
-
result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, cancel_order_req=request_body)
|
|
658
|
-
return result
|
|
659
|
-
|
|
660
|
-
def place_orders_batch(self, orders: List[PlaceOrderDataInput], check_approval: bool = False) -> List[Any]:
|
|
661
|
-
"""
|
|
662
|
-
Place multiple orders in batch to reduce API calls.
|
|
663
|
-
|
|
664
|
-
Args:
|
|
665
|
-
orders: List of PlaceOrderDataInput objects
|
|
666
|
-
check_approval: Whether to check and enable trading approvals first (done once for all orders)
|
|
667
|
-
|
|
668
|
-
Returns:
|
|
669
|
-
List of order placement results
|
|
670
|
-
|
|
671
|
-
Raises:
|
|
672
|
-
InvalidParamError: If orders list is empty or invalid
|
|
673
|
-
"""
|
|
674
|
-
if not orders or not isinstance(orders, list):
|
|
675
|
-
raise InvalidParamError('orders must be a non-empty list')
|
|
676
|
-
|
|
677
|
-
if len(orders) == 0:
|
|
678
|
-
raise InvalidParamError('orders list cannot be empty')
|
|
679
|
-
|
|
680
|
-
# Enable trading once for all orders if needed
|
|
681
|
-
if check_approval:
|
|
682
|
-
self.enable_trading()
|
|
683
|
-
|
|
684
|
-
results = []
|
|
685
|
-
errors = []
|
|
686
|
-
|
|
687
|
-
for i, order in enumerate(orders):
|
|
688
|
-
try:
|
|
689
|
-
# Place each order without checking approval again
|
|
690
|
-
result = self.place_order(order, check_approval=False)
|
|
691
|
-
results.append({
|
|
692
|
-
'index': i,
|
|
693
|
-
'success': True,
|
|
694
|
-
'result': result,
|
|
695
|
-
'order': order
|
|
696
|
-
})
|
|
697
|
-
except Exception as e:
|
|
698
|
-
logging.error(f"Failed to place order at index {i}: {e}")
|
|
699
|
-
errors.append({
|
|
700
|
-
'index': i,
|
|
701
|
-
'success': False,
|
|
702
|
-
'error': str(e),
|
|
703
|
-
'order': order
|
|
704
|
-
})
|
|
705
|
-
results.append({
|
|
706
|
-
'index': i,
|
|
707
|
-
'success': False,
|
|
708
|
-
'error': str(e),
|
|
709
|
-
'order': order
|
|
710
|
-
})
|
|
711
|
-
|
|
712
|
-
if errors:
|
|
713
|
-
logging.warning(f"Batch order placement completed with {len(errors)} errors out of {len(orders)} orders")
|
|
714
|
-
|
|
715
|
-
return results
|
|
716
|
-
|
|
717
|
-
def cancel_orders_batch(self, order_ids: List[str]) -> List[Any]:
|
|
718
|
-
"""
|
|
719
|
-
Cancel multiple orders in batch.
|
|
720
|
-
|
|
721
|
-
Args:
|
|
722
|
-
order_ids: List of order IDs to cancel
|
|
723
|
-
|
|
724
|
-
Returns:
|
|
725
|
-
List of cancellation results
|
|
726
|
-
|
|
727
|
-
Raises:
|
|
728
|
-
InvalidParamError: If order_ids list is empty or invalid
|
|
729
|
-
"""
|
|
730
|
-
if not order_ids or not isinstance(order_ids, list):
|
|
731
|
-
raise InvalidParamError('order_ids must be a non-empty list')
|
|
732
|
-
|
|
733
|
-
if len(order_ids) == 0:
|
|
734
|
-
raise InvalidParamError('order_ids list cannot be empty')
|
|
735
|
-
|
|
736
|
-
results = []
|
|
737
|
-
errors = []
|
|
738
|
-
|
|
739
|
-
for i, order_id in enumerate(order_ids):
|
|
740
|
-
try:
|
|
741
|
-
result = self.cancel_order(order_id)
|
|
742
|
-
results.append({
|
|
743
|
-
'index': i,
|
|
744
|
-
'success': True,
|
|
745
|
-
'result': result,
|
|
746
|
-
'order_id': order_id
|
|
747
|
-
})
|
|
748
|
-
except Exception as e:
|
|
749
|
-
logging.error(f"Failed to cancel order {order_id}: {e}")
|
|
750
|
-
errors.append({
|
|
751
|
-
'index': i,
|
|
752
|
-
'success': False,
|
|
753
|
-
'error': str(e),
|
|
754
|
-
'order_id': order_id
|
|
755
|
-
})
|
|
756
|
-
results.append({
|
|
757
|
-
'index': i,
|
|
758
|
-
'success': False,
|
|
759
|
-
'error': str(e),
|
|
760
|
-
'order_id': order_id
|
|
761
|
-
})
|
|
762
|
-
|
|
763
|
-
if errors:
|
|
764
|
-
logging.warning(f"Batch order cancellation completed with {len(errors)} errors out of {len(order_ids)} orders")
|
|
765
|
-
|
|
766
|
-
return results
|
|
767
|
-
|
|
768
|
-
def cancel_all_orders(self, market_id: Optional[int] = None, side: Optional[OrderSide] = None) -> dict:
|
|
769
|
-
"""
|
|
770
|
-
Cancel all open orders, optionally filtered by market and/or side.
|
|
771
|
-
|
|
772
|
-
Args:
|
|
773
|
-
market_id: Optional filter - only cancel orders for this market
|
|
774
|
-
side: Optional filter - only cancel BUY or SELL orders
|
|
775
|
-
|
|
776
|
-
Returns:
|
|
777
|
-
Dictionary with cancellation summary: {
|
|
778
|
-
'total_orders': int,
|
|
779
|
-
'cancelled': int,
|
|
780
|
-
'failed': int,
|
|
781
|
-
'results': List[dict]
|
|
782
|
-
}
|
|
783
|
-
"""
|
|
784
|
-
# Get all open orders
|
|
785
|
-
all_orders = self.get_my_orders(
|
|
786
|
-
market_id=market_id if market_id else 0,
|
|
787
|
-
status='open',
|
|
788
|
-
limit=100, # Get up to 100 orders per page
|
|
789
|
-
page=1
|
|
790
|
-
)
|
|
791
|
-
|
|
792
|
-
# Parse response to get order list
|
|
793
|
-
orders_list = self._parse_list_response(all_orders, "get open orders for cancellation")
|
|
794
|
-
|
|
795
|
-
if not orders_list or len(orders_list) == 0:
|
|
796
|
-
logging.info("No open orders to cancel")
|
|
797
|
-
return {
|
|
798
|
-
'total_orders': 0,
|
|
799
|
-
'cancelled': 0,
|
|
800
|
-
'failed': 0,
|
|
801
|
-
'results': []
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
# Filter by side if specified
|
|
805
|
-
if side:
|
|
806
|
-
orders_list = [order for order in orders_list if int(order.side) == int(side.value)]
|
|
807
|
-
|
|
808
|
-
# Extract order IDs (internally stored as trans_no)
|
|
809
|
-
order_ids = [order.trans_no for order in orders_list if hasattr(order, 'trans_no')]
|
|
810
|
-
|
|
811
|
-
if not order_ids:
|
|
812
|
-
logging.info("No orders match the filter criteria")
|
|
813
|
-
return {
|
|
814
|
-
'total_orders': 0,
|
|
815
|
-
'cancelled': 0,
|
|
816
|
-
'failed': 0,
|
|
817
|
-
'results': []
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
# Cancel all orders in batch
|
|
821
|
-
results = self.cancel_orders_batch(order_ids)
|
|
822
|
-
|
|
823
|
-
# Count successes and failures
|
|
824
|
-
cancelled = sum(1 for r in results if r.get('success'))
|
|
825
|
-
failed = sum(1 for r in results if not r.get('success'))
|
|
826
|
-
|
|
827
|
-
logging.info(f"Cancelled {cancelled} orders, {failed} failed out of {len(order_ids)} total")
|
|
828
|
-
|
|
829
|
-
return {
|
|
830
|
-
'total_orders': len(order_ids),
|
|
831
|
-
'cancelled': cancelled,
|
|
832
|
-
'failed': failed,
|
|
833
|
-
'results': results
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
def get_my_orders(self, market_id=0, status="", limit=10, page=1):
|
|
837
|
-
"""Get user's orders with optional filters"""
|
|
838
|
-
try:
|
|
839
|
-
if not isinstance(market_id, int):
|
|
840
|
-
raise InvalidParamError('market_id must be an integer')
|
|
841
|
-
|
|
842
|
-
result = self.market_api.openapi_order_get(
|
|
843
|
-
apikey=self.api_key,
|
|
844
|
-
topic_id=market_id if market_id > 0 else None,
|
|
845
|
-
status=status if status else None,
|
|
846
|
-
limit=limit,
|
|
847
|
-
page=page,
|
|
848
|
-
chain_id=str(self.chain_id)
|
|
849
|
-
)
|
|
850
|
-
return result
|
|
851
|
-
except InvalidParamError as e:
|
|
852
|
-
logging.error(f"Validation error: {e}")
|
|
853
|
-
raise
|
|
854
|
-
except Exception as e:
|
|
855
|
-
logging.error(f"API error: {e}")
|
|
856
|
-
raise OpenApiError(f"Failed to get orders: {e}")
|
|
857
|
-
|
|
858
|
-
def get_order_by_id(self, order_id):
|
|
859
|
-
"""Get detailed information about a specific order"""
|
|
860
|
-
try:
|
|
861
|
-
if not order_id or not isinstance(order_id, str):
|
|
862
|
-
raise InvalidParamError('order_id must be a non-empty string')
|
|
863
|
-
|
|
864
|
-
result = self.market_api.openapi_order_order_id_get(apikey=self.api_key, order_id=order_id)
|
|
865
|
-
return result
|
|
866
|
-
except InvalidParamError as e:
|
|
867
|
-
logging.error(f"Validation error: {e}")
|
|
868
|
-
raise
|
|
869
|
-
except Exception as e:
|
|
870
|
-
logging.error(f"API error: {e}")
|
|
871
|
-
raise OpenApiError(f"Failed to get order by id: {e}")
|
|
872
|
-
|
|
873
|
-
def get_my_positions(
|
|
874
|
-
self,
|
|
875
|
-
market_id: int = 0,
|
|
876
|
-
page: int = 1,
|
|
877
|
-
limit: int = 10
|
|
878
|
-
) -> Any:
|
|
879
|
-
"""Get user's positions with optional filters
|
|
880
|
-
|
|
881
|
-
Args:
|
|
882
|
-
market_id: Optional filter by market ID (0 for all markets)
|
|
883
|
-
page: Page number (default 1)
|
|
884
|
-
limit: Number of items per page (default 10)
|
|
885
|
-
"""
|
|
886
|
-
try:
|
|
887
|
-
if not isinstance(market_id, int):
|
|
888
|
-
raise InvalidParamError('market_id must be an integer')
|
|
889
|
-
|
|
890
|
-
if not isinstance(page, int):
|
|
891
|
-
raise InvalidParamError('page must be an integer')
|
|
892
|
-
|
|
893
|
-
if not isinstance(limit, int):
|
|
894
|
-
raise InvalidParamError('limit must be an integer')
|
|
895
|
-
|
|
896
|
-
result = self.market_api.openapi_positions_get(
|
|
897
|
-
apikey=self.api_key,
|
|
898
|
-
market_id=market_id if market_id > 0 else None,
|
|
899
|
-
page=page,
|
|
900
|
-
limit=limit,
|
|
901
|
-
chain_id=str(self.chain_id)
|
|
902
|
-
)
|
|
903
|
-
return result
|
|
904
|
-
except InvalidParamError as e:
|
|
905
|
-
logging.error(f"Validation error: {e}")
|
|
906
|
-
raise
|
|
907
|
-
except Exception as e:
|
|
908
|
-
logging.error(f"API error: {e}")
|
|
909
|
-
raise OpenApiError(f"Failed to get positions: {e}")
|
|
910
|
-
|
|
911
|
-
def get_my_balances(self):
|
|
912
|
-
"""Get user's balances (uses authenticated user from apikey)"""
|
|
913
|
-
try:
|
|
914
|
-
result = self.market_api.openapi_user_balance_get(
|
|
915
|
-
apikey=self.api_key,
|
|
916
|
-
chain_id=str(self.chain_id)
|
|
917
|
-
)
|
|
918
|
-
return result
|
|
919
|
-
except Exception as e:
|
|
920
|
-
logging.error(f"API error: {e}")
|
|
921
|
-
raise OpenApiError(f"Failed to get balances: {e}")
|
|
922
|
-
|
|
923
|
-
def get_my_trades(self, market_id=None, page=1, limit=10):
|
|
924
|
-
"""Get user's trade history
|
|
925
|
-
|
|
926
|
-
Args:
|
|
927
|
-
market_id: Market ID filter (optional)
|
|
928
|
-
page: Page number (default: 1)
|
|
929
|
-
limit: Number of items per page, max 20 (default: 10)
|
|
930
|
-
"""
|
|
931
|
-
try:
|
|
932
|
-
if market_id is not None and not isinstance(market_id, int):
|
|
933
|
-
raise InvalidParamError('market_id must be an integer')
|
|
934
|
-
|
|
935
|
-
result = self.market_api.openapi_trade_get(
|
|
936
|
-
apikey=self.api_key,
|
|
937
|
-
market_id=market_id,
|
|
938
|
-
page=page,
|
|
939
|
-
limit=limit,
|
|
940
|
-
chain_id=str(self.chain_id)
|
|
941
|
-
)
|
|
942
|
-
return result
|
|
943
|
-
except InvalidParamError as e:
|
|
944
|
-
logging.error(f"Validation error: {e}")
|
|
945
|
-
raise
|
|
946
|
-
except Exception as e:
|
|
947
|
-
logging.error(f"API error: {e}")
|
|
948
|
-
raise OpenApiError(f"Failed to get trades: {e}")
|
|
949
|
-
|
|
950
|
-
def get_user_auth(self):
|
|
951
|
-
"""Get authenticated user information"""
|
|
952
|
-
try:
|
|
953
|
-
result = self.user_api.openapi_user_auth_get(apikey=self.api_key)
|
|
954
|
-
return result
|
|
955
|
-
except Exception as e:
|
|
956
|
-
logging.error(f"API error: {e}")
|
|
957
|
-
raise OpenApiError(f"Failed to get user auth: {e}")
|