opinion-clob-sdk 0.1.8__py3-none-any.whl → 0.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. opinion_clob_sdk/__init__.py +1 -1
  2. opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  3. opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  4. opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  5. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  6. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  7. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  8. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  9. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  10. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  11. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  12. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  13. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  14. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  15. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  16. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +13 -7
  17. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  18. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -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/contract_caller.py +390 -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/contracts/__init__.py +0 -0
  21. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -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/contracts/erc20.py +111 -0
  23. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  24. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  25. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -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/py_order_utils/builders/base_builder.py +41 -0
  27. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  28. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  29. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  30. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  31. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  32. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  33. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  34. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  35. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  36. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -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/py_order_utils/utils.py +115 -0
  38. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  39. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -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/safe/eip712/__init__.py +176 -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/safe/enums.py +6 -0
  42. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  43. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  44. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  45. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  46. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +327 -0
  47. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  48. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  49. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  50. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  51. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  52. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  53. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  54. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  55. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  56. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  57. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  58. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +957 -0
  59. 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
  60. {opinion_clob_sdk-0.1.8.dist-info → opinion_clob_sdk-0.1.9.dist-info}/METADATA +1 -1
  61. {opinion_clob_sdk-0.1.8.dist-info → opinion_clob_sdk-0.1.9.dist-info}/RECORD +63 -20
  62. {opinion_clob_sdk-0.1.8.dist-info → opinion_clob_sdk-0.1.9.dist-info}/WHEEL +0 -0
  63. {opinion_clob_sdk-0.1.8.dist-info → opinion_clob_sdk-0.1.9.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -12,7 +12,7 @@ from opinion_clob_sdk.chain.exception import (
12
12
  InsufficientGasBalance
13
13
  )
14
14
 
15
- __version__ = "0.1.8"
15
+ __version__ = "0.1.9"
16
16
  __all__ = [
17
17
  "Client",
18
18
  "TopicStatus",
@@ -78,19 +78,25 @@ def calculate_order_amounts(price: float, maker_amount: int, side: OrderSide, de
78
78
  if side == OrderSide.BUY:
79
79
  # For BUY: price = maker/taker
80
80
  # Calculate taker amount: taker = maker / price
81
- exact_taker = math.floor(maker_decimal / price_decimal / decimals_decimal * decimals_decimal)
82
- taker_amount = int(exact_taker)
81
+ # We need to ensure that recalculated_maker = taker * price <= original maker_amount
82
+ # To avoid precision loss, we iteratively reduce taker until maker fits
83
+ exact_taker = maker_decimal / price_decimal
84
+ taker_amount = int(math.floor(exact_taker))
83
85
 
84
- # Recalculate maker amount from taker to maintain precision
85
- # maker = taker * price, use Decimal for precision then round down
86
+ # Recalculate maker from taker and ensure it doesn't exceed original maker_amount
86
87
  exact_maker = Decimal(str(taker_amount)) * price_decimal
87
88
  recalculated_maker_amount = int(math.floor(exact_maker))
89
+
90
+ # If recalculated maker exceeds original, reduce taker by 1 and recalculate
91
+ while recalculated_maker_amount > maker_amount and taker_amount > 0:
92
+ taker_amount -= 1
93
+ exact_maker = Decimal(str(taker_amount)) * price_decimal
94
+ recalculated_maker_amount = int(math.floor(exact_maker))
88
95
  else: # SELL
89
96
  # For SELL: price = taker/maker
90
97
  # Calculate taker amount: taker = maker * price
91
- exact_taker = math.floor(maker_decimal * price_decimal / decimals_decimal * decimals_decimal)
92
-
93
- taker_amount = int(exact_taker)
98
+ exact_taker = maker_decimal * price_decimal
99
+ taker_amount = int(math.floor(exact_taker))
94
100
 
95
101
  # For SELL, maker amount doesn't change
96
102
  recalculated_maker_amount = int(maker_amount)
@@ -0,0 +1,26 @@
1
+ """Opinion CLOB SDK - Python SDK for Opinion Prediction Market CLOB API"""
2
+
3
+ from opinion_clob_sdk.sdk import (
4
+ Client,
5
+ CHAIN_ID_BASE_MAINNET,
6
+ SUPPORTED_CHAIN_IDS
7
+ )
8
+ from opinion_clob_sdk.model import TopicStatus, TopicType, TopicStatusFilter
9
+ from opinion_clob_sdk.chain.exception import (
10
+ BalanceNotEnough,
11
+ NoPositionsToRedeem,
12
+ InsufficientGasBalance
13
+ )
14
+
15
+ __version__ = "0.1.9"
16
+ __all__ = [
17
+ "Client",
18
+ "TopicStatus",
19
+ "TopicType",
20
+ "TopicStatusFilter",
21
+ "CHAIN_ID_BASE_MAINNET",
22
+ "SUPPORTED_CHAIN_IDS",
23
+ "BalanceNotEnough",
24
+ "NoPositionsToRedeem",
25
+ "InsufficientGasBalance"
26
+ ]