opinion-clob-sdk 0.1.4__py3-none-any.whl → 0.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (98) hide show
  1. opinion_clob_sdk/__init__.py +1 -1
  2. opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  3. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  4. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
  5. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  6. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  7. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  8. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  9. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  10. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  11. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  12. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  13. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  14. 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
  15. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  16. 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
  17. 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
  18. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  19. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  20. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  21. 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
  22. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  23. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  24. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  25. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +109 -0
  26. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  27. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  28. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  29. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  30. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  31. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  32. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  33. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  34. 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
  35. 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
  36. 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
  37. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  38. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  39. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  40. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  41. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  42. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  43. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  44. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  45. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  46. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  47. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  48. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  49. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  50. 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
  51. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  52. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +109 -0
  67. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  68. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  69. 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
  70. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  71. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  72. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  73. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  83. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  84. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  85. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  86. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  87. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +950 -0
  88. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +950 -0
  89. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +16 -13
  90. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  91. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +16 -13
  92. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  93. opinion_clob_sdk/opinion_clob_sdk/sdk.py +16 -13
  94. opinion_clob_sdk/sdk.py +16 -13
  95. {opinion_clob_sdk-0.1.4.dist-info → opinion_clob_sdk-0.1.6.dist-info}/METADATA +1 -1
  96. {opinion_clob_sdk-0.1.4.dist-info → opinion_clob_sdk-0.1.6.dist-info}/RECORD +98 -12
  97. {opinion_clob_sdk-0.1.4.dist-info → opinion_clob_sdk-0.1.6.dist-info}/WHEEL +0 -0
  98. {opinion_clob_sdk-0.1.4.dist-info → opinion_clob_sdk-0.1.6.dist-info}/top_level.txt +0 -0
@@ -314,7 +314,7 @@ class Client:
314
314
 
315
315
  result = self.market_api.openapi_market_get(
316
316
  apikey=self.api_key,
317
- topic_type=topic_type.value if topic_type else None,
317
+ market_type=topic_type.value if topic_type else None,
318
318
  page=page,
319
319
  limit=limit,
320
320
  chain_id=str(self.chain_id),
@@ -376,8 +376,15 @@ class Client:
376
376
  logging.error(f"API error: {e}")
377
377
  raise OpenApiError(f"Failed to get categorical market: {e}")
378
378
 
379
- def get_price_history(self, token_id, interval="1hour", start_time=int(time()), bars=60):
380
- """Get price history/candlestick data for a token"""
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
+ """
381
388
  try:
382
389
  if not token_id:
383
390
  raise InvalidParamError(MISSING_TOKEN_ID_MSG)
@@ -389,8 +396,8 @@ class Client:
389
396
  apikey=self.api_key,
390
397
  token_id=token_id,
391
398
  interval=interval,
392
- start_time=start_time,
393
- bars=bars
399
+ start_at=start_at,
400
+ end_at=end_at
394
401
  )
395
402
  return result
396
403
  except InvalidParamError as e:
@@ -521,7 +528,7 @@ class Client:
521
528
  order_exp_time='0'
522
529
  )
523
530
 
524
- result = self.market_api.openapi_order_post(apikey=self.api_key, v2_add_order_req=v2_add_order_req)
531
+ result = self.market_api.openapi_order_post(apikey=self.api_key, add_order_req=v2_add_order_req)
525
532
  return result
526
533
  except InvalidParamError as e:
527
534
  logging.error(f"Validation error: {e}")
@@ -647,7 +654,7 @@ class Client:
647
654
 
648
655
  # Internally use trans_no for API compatibility
649
656
  request_body = OpenapiCancelOrderRequestOpenAPI(trans_no=order_id)
650
- result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, openapi_cancel_order_request_open_api=request_body)
657
+ result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, cancel_order_req=request_body)
651
658
  return result
652
659
 
653
660
  def place_orders_batch(self, orders: List[PlaceOrderDataInput], check_approval: bool = False) -> List[Any]:
@@ -901,15 +908,11 @@ class Client:
901
908
  logging.error(f"API error: {e}")
902
909
  raise OpenApiError(f"Failed to get positions: {e}")
903
910
 
904
- def get_my_balances(self, wallet_address=None):
905
- """Get user's balances"""
911
+ def get_my_balances(self):
912
+ """Get user's balances (uses authenticated user from apikey)"""
906
913
  try:
907
- if not wallet_address:
908
- wallet_address = self.contract_caller.signer.address()
909
-
910
914
  result = self.market_api.openapi_user_balance_get(
911
915
  apikey=self.api_key,
912
- wallet_address=wallet_address,
913
916
  chain_id=str(self.chain_id)
914
917
  )
915
918
  return result
@@ -0,0 +1,135 @@
1
+ """
2
+ Verification script to check all API method signatures in opinion_clob_sdk
3
+ This script validates that all API calls pass the correct parameters to opinion_api
4
+ """
5
+
6
+ import inspect
7
+ from opinion_api.api.prediction_market_api import PredictionMarketApi
8
+ from opinion_api.api.user_api import UserApi
9
+
10
+ # Expected API calls with required parameters
11
+ EXPECTED_API_CALLS = {
12
+ # Market API calls
13
+ 'openapi_quote_token_get': ['apikey', 'chain_id'], # chain_id should be str
14
+ 'openapi_market_get': ['apikey', 'chain_id'], # chain_id should be str
15
+ 'openapi_market_market_id_get': ['apikey', 'market_id'],
16
+ 'openapi_market_categorical_market_id_get': ['apikey', 'market_id'],
17
+ 'openapi_token_price_history_get': ['apikey', 'token_id', 'interval', 'start_time', 'bars'],
18
+ 'openapi_token_orderbook_get': ['apikey', 'token_id'],
19
+ 'openapi_token_latest_price_get': ['apikey', 'token_id'],
20
+ 'openapi_token_fee_rates_get': ['apikey', 'token_id'],
21
+ 'openapi_order_post': ['apikey', 'v2_add_order_req'],
22
+ 'openapi_order_cancel_post': ['apikey', 'openapi_cancel_order_request_open_api'],
23
+ 'openapi_order_get': ['apikey', 'chain_id'], # chain_id should be str
24
+ 'openapi_order_order_id_get': ['apikey', 'order_id'],
25
+ 'openapi_positions_get': ['apikey', 'chain_id'], # chain_id should be str
26
+ 'openapi_user_balance_get': ['apikey', 'wallet_address', 'chain_id'], # chain_id should be str
27
+ 'openapi_trade_get': ['apikey', 'chain_id'], # chain_id should be str
28
+
29
+ # User API calls
30
+ 'openapi_user_auth_get': ['apikey'],
31
+ }
32
+
33
+ def verify_api_signatures():
34
+ """Verify that all API methods have the expected signatures"""
35
+ errors = []
36
+
37
+ # Check PredictionMarketApi methods
38
+ for method_name, expected_params in EXPECTED_API_CALLS.items():
39
+ if method_name == 'openapi_user_auth_get':
40
+ continue # This is in UserApi
41
+
42
+ if not hasattr(PredictionMarketApi, method_name):
43
+ errors.append(f"❌ Method {method_name} not found in PredictionMarketApi")
44
+ continue
45
+
46
+ method = getattr(PredictionMarketApi, method_name)
47
+ sig = inspect.signature(method)
48
+ params = list(sig.parameters.keys())
49
+
50
+ # Remove 'self' from params
51
+ if 'self' in params:
52
+ params.remove('self')
53
+
54
+ # Check if all expected params are in the signature
55
+ for expected_param in expected_params:
56
+ if expected_param not in params:
57
+ errors.append(f"❌ {method_name}: missing parameter '{expected_param}'")
58
+
59
+ # Check UserApi methods
60
+ if hasattr(UserApi, 'openapi_user_auth_get'):
61
+ method = getattr(UserApi, 'openapi_user_auth_get')
62
+ sig = inspect.signature(method)
63
+ params = list(sig.parameters.keys())
64
+
65
+ if 'self' in params:
66
+ params.remove('self')
67
+
68
+ if 'apikey' not in params:
69
+ errors.append("❌ openapi_user_auth_get: missing parameter 'apikey'")
70
+ else:
71
+ errors.append("❌ Method openapi_user_auth_get not found in UserApi")
72
+
73
+ return errors
74
+
75
+ def check_sdk_calls():
76
+ """Check that SDK methods call the API with correct parameters"""
77
+ import re
78
+
79
+ # Read sdk.py
80
+ with open('/Users/nikli/Work/openapi/openapi/python_sdk/opinion_clob_sdk/sdk.py', 'r') as f:
81
+ sdk_content = f.read()
82
+
83
+ issues = []
84
+
85
+ # Find all API calls in SDK
86
+ api_call_pattern = r'self\.(market_api|user_api)\.(\w+)\((.*?)\)'
87
+ matches = re.finditer(api_call_pattern, sdk_content, re.MULTILINE | re.DOTALL)
88
+
89
+ for match in matches:
90
+ api_type = match.group(1)
91
+ method_name = match.group(2)
92
+ params_str = match.group(3)
93
+
94
+ # Check for apikey parameter
95
+ if 'apikey=' not in params_str:
96
+ issues.append(f"⚠️ {method_name}: missing apikey parameter")
97
+ elif 'apikey=self.api_key' not in params_str:
98
+ issues.append(f"⚠️ {method_name}: apikey should be self.api_key")
99
+
100
+ # Check for chain_id parameter (should be str)
101
+ if 'chain_id=' in params_str:
102
+ if 'chain_id=str(self.chain_id)' not in params_str:
103
+ issues.append(f"⚠️ {method_name}: chain_id should be str(self.chain_id)")
104
+
105
+ return issues
106
+
107
+ if __name__ == '__main__':
108
+ print("=" * 70)
109
+ print("Verifying API Signatures in opinion_api")
110
+ print("=" * 70)
111
+
112
+ errors = verify_api_signatures()
113
+ if errors:
114
+ for error in errors:
115
+ print(error)
116
+ print(f"\n❌ Found {len(errors)} signature issues")
117
+ else:
118
+ print("✅ All API signatures verified successfully")
119
+
120
+ print("\n" + "=" * 70)
121
+ print("Checking SDK API Calls")
122
+ print("=" * 70)
123
+
124
+ issues = check_sdk_calls()
125
+ if issues:
126
+ for issue in issues:
127
+ print(issue)
128
+ print(f"\n⚠️ Found {len(issues)} potential issues in SDK calls")
129
+ else:
130
+ print("✅ All SDK API calls verified successfully")
131
+
132
+ if not errors and not issues:
133
+ print("\n" + "=" * 70)
134
+ print("🎉 All verifications passed!")
135
+ print("=" * 70)
@@ -314,7 +314,7 @@ class Client:
314
314
 
315
315
  result = self.market_api.openapi_market_get(
316
316
  apikey=self.api_key,
317
- topic_type=topic_type.value if topic_type else None,
317
+ market_type=topic_type.value if topic_type else None,
318
318
  page=page,
319
319
  limit=limit,
320
320
  chain_id=str(self.chain_id),
@@ -376,8 +376,15 @@ class Client:
376
376
  logging.error(f"API error: {e}")
377
377
  raise OpenApiError(f"Failed to get categorical market: {e}")
378
378
 
379
- def get_price_history(self, token_id, interval="1hour", start_time=int(time()), bars=60):
380
- """Get price history/candlestick data for a token"""
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
+ """
381
388
  try:
382
389
  if not token_id:
383
390
  raise InvalidParamError(MISSING_TOKEN_ID_MSG)
@@ -389,8 +396,8 @@ class Client:
389
396
  apikey=self.api_key,
390
397
  token_id=token_id,
391
398
  interval=interval,
392
- start_time=start_time,
393
- bars=bars
399
+ start_at=start_at,
400
+ end_at=end_at
394
401
  )
395
402
  return result
396
403
  except InvalidParamError as e:
@@ -521,7 +528,7 @@ class Client:
521
528
  order_exp_time='0'
522
529
  )
523
530
 
524
- result = self.market_api.openapi_order_post(apikey=self.api_key, v2_add_order_req=v2_add_order_req)
531
+ result = self.market_api.openapi_order_post(apikey=self.api_key, add_order_req=v2_add_order_req)
525
532
  return result
526
533
  except InvalidParamError as e:
527
534
  logging.error(f"Validation error: {e}")
@@ -647,7 +654,7 @@ class Client:
647
654
 
648
655
  # Internally use trans_no for API compatibility
649
656
  request_body = OpenapiCancelOrderRequestOpenAPI(trans_no=order_id)
650
- result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, openapi_cancel_order_request_open_api=request_body)
657
+ result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, cancel_order_req=request_body)
651
658
  return result
652
659
 
653
660
  def place_orders_batch(self, orders: List[PlaceOrderDataInput], check_approval: bool = False) -> List[Any]:
@@ -901,15 +908,11 @@ class Client:
901
908
  logging.error(f"API error: {e}")
902
909
  raise OpenApiError(f"Failed to get positions: {e}")
903
910
 
904
- def get_my_balances(self, wallet_address=None):
905
- """Get user's balances"""
911
+ def get_my_balances(self):
912
+ """Get user's balances (uses authenticated user from apikey)"""
906
913
  try:
907
- if not wallet_address:
908
- wallet_address = self.contract_caller.signer.address()
909
-
910
914
  result = self.market_api.openapi_user_balance_get(
911
915
  apikey=self.api_key,
912
- wallet_address=wallet_address,
913
916
  chain_id=str(self.chain_id)
914
917
  )
915
918
  return result
@@ -0,0 +1,135 @@
1
+ """
2
+ Verification script to check all API method signatures in opinion_clob_sdk
3
+ This script validates that all API calls pass the correct parameters to opinion_api
4
+ """
5
+
6
+ import inspect
7
+ from opinion_api.api.prediction_market_api import PredictionMarketApi
8
+ from opinion_api.api.user_api import UserApi
9
+
10
+ # Expected API calls with required parameters
11
+ EXPECTED_API_CALLS = {
12
+ # Market API calls
13
+ 'openapi_quote_token_get': ['apikey', 'chain_id'], # chain_id should be str
14
+ 'openapi_market_get': ['apikey', 'chain_id'], # chain_id should be str
15
+ 'openapi_market_market_id_get': ['apikey', 'market_id'],
16
+ 'openapi_market_categorical_market_id_get': ['apikey', 'market_id'],
17
+ 'openapi_token_price_history_get': ['apikey', 'token_id', 'interval', 'start_time', 'bars'],
18
+ 'openapi_token_orderbook_get': ['apikey', 'token_id'],
19
+ 'openapi_token_latest_price_get': ['apikey', 'token_id'],
20
+ 'openapi_token_fee_rates_get': ['apikey', 'token_id'],
21
+ 'openapi_order_post': ['apikey', 'v2_add_order_req'],
22
+ 'openapi_order_cancel_post': ['apikey', 'openapi_cancel_order_request_open_api'],
23
+ 'openapi_order_get': ['apikey', 'chain_id'], # chain_id should be str
24
+ 'openapi_order_order_id_get': ['apikey', 'order_id'],
25
+ 'openapi_positions_get': ['apikey', 'chain_id'], # chain_id should be str
26
+ 'openapi_user_balance_get': ['apikey', 'wallet_address', 'chain_id'], # chain_id should be str
27
+ 'openapi_trade_get': ['apikey', 'chain_id'], # chain_id should be str
28
+
29
+ # User API calls
30
+ 'openapi_user_auth_get': ['apikey'],
31
+ }
32
+
33
+ def verify_api_signatures():
34
+ """Verify that all API methods have the expected signatures"""
35
+ errors = []
36
+
37
+ # Check PredictionMarketApi methods
38
+ for method_name, expected_params in EXPECTED_API_CALLS.items():
39
+ if method_name == 'openapi_user_auth_get':
40
+ continue # This is in UserApi
41
+
42
+ if not hasattr(PredictionMarketApi, method_name):
43
+ errors.append(f"❌ Method {method_name} not found in PredictionMarketApi")
44
+ continue
45
+
46
+ method = getattr(PredictionMarketApi, method_name)
47
+ sig = inspect.signature(method)
48
+ params = list(sig.parameters.keys())
49
+
50
+ # Remove 'self' from params
51
+ if 'self' in params:
52
+ params.remove('self')
53
+
54
+ # Check if all expected params are in the signature
55
+ for expected_param in expected_params:
56
+ if expected_param not in params:
57
+ errors.append(f"❌ {method_name}: missing parameter '{expected_param}'")
58
+
59
+ # Check UserApi methods
60
+ if hasattr(UserApi, 'openapi_user_auth_get'):
61
+ method = getattr(UserApi, 'openapi_user_auth_get')
62
+ sig = inspect.signature(method)
63
+ params = list(sig.parameters.keys())
64
+
65
+ if 'self' in params:
66
+ params.remove('self')
67
+
68
+ if 'apikey' not in params:
69
+ errors.append("❌ openapi_user_auth_get: missing parameter 'apikey'")
70
+ else:
71
+ errors.append("❌ Method openapi_user_auth_get not found in UserApi")
72
+
73
+ return errors
74
+
75
+ def check_sdk_calls():
76
+ """Check that SDK methods call the API with correct parameters"""
77
+ import re
78
+
79
+ # Read sdk.py
80
+ with open('/Users/nikli/Work/openapi/openapi/python_sdk/opinion_clob_sdk/sdk.py', 'r') as f:
81
+ sdk_content = f.read()
82
+
83
+ issues = []
84
+
85
+ # Find all API calls in SDK
86
+ api_call_pattern = r'self\.(market_api|user_api)\.(\w+)\((.*?)\)'
87
+ matches = re.finditer(api_call_pattern, sdk_content, re.MULTILINE | re.DOTALL)
88
+
89
+ for match in matches:
90
+ api_type = match.group(1)
91
+ method_name = match.group(2)
92
+ params_str = match.group(3)
93
+
94
+ # Check for apikey parameter
95
+ if 'apikey=' not in params_str:
96
+ issues.append(f"⚠️ {method_name}: missing apikey parameter")
97
+ elif 'apikey=self.api_key' not in params_str:
98
+ issues.append(f"⚠️ {method_name}: apikey should be self.api_key")
99
+
100
+ # Check for chain_id parameter (should be str)
101
+ if 'chain_id=' in params_str:
102
+ if 'chain_id=str(self.chain_id)' not in params_str:
103
+ issues.append(f"⚠️ {method_name}: chain_id should be str(self.chain_id)")
104
+
105
+ return issues
106
+
107
+ if __name__ == '__main__':
108
+ print("=" * 70)
109
+ print("Verifying API Signatures in opinion_api")
110
+ print("=" * 70)
111
+
112
+ errors = verify_api_signatures()
113
+ if errors:
114
+ for error in errors:
115
+ print(error)
116
+ print(f"\n❌ Found {len(errors)} signature issues")
117
+ else:
118
+ print("✅ All API signatures verified successfully")
119
+
120
+ print("\n" + "=" * 70)
121
+ print("Checking SDK API Calls")
122
+ print("=" * 70)
123
+
124
+ issues = check_sdk_calls()
125
+ if issues:
126
+ for issue in issues:
127
+ print(issue)
128
+ print(f"\n⚠️ Found {len(issues)} potential issues in SDK calls")
129
+ else:
130
+ print("✅ All SDK API calls verified successfully")
131
+
132
+ if not errors and not issues:
133
+ print("\n" + "=" * 70)
134
+ print("🎉 All verifications passed!")
135
+ print("=" * 70)
@@ -314,7 +314,7 @@ class Client:
314
314
 
315
315
  result = self.market_api.openapi_market_get(
316
316
  apikey=self.api_key,
317
- topic_type=topic_type.value if topic_type else None,
317
+ market_type=topic_type.value if topic_type else None,
318
318
  page=page,
319
319
  limit=limit,
320
320
  chain_id=str(self.chain_id),
@@ -376,8 +376,15 @@ class Client:
376
376
  logging.error(f"API error: {e}")
377
377
  raise OpenApiError(f"Failed to get categorical market: {e}")
378
378
 
379
- def get_price_history(self, token_id, interval="1hour", start_time=int(time()), bars=60):
380
- """Get price history/candlestick data for a token"""
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
+ """
381
388
  try:
382
389
  if not token_id:
383
390
  raise InvalidParamError(MISSING_TOKEN_ID_MSG)
@@ -389,8 +396,8 @@ class Client:
389
396
  apikey=self.api_key,
390
397
  token_id=token_id,
391
398
  interval=interval,
392
- start_time=start_time,
393
- bars=bars
399
+ start_at=start_at,
400
+ end_at=end_at
394
401
  )
395
402
  return result
396
403
  except InvalidParamError as e:
@@ -521,7 +528,7 @@ class Client:
521
528
  order_exp_time='0'
522
529
  )
523
530
 
524
- result = self.market_api.openapi_order_post(apikey=self.api_key, v2_add_order_req=v2_add_order_req)
531
+ result = self.market_api.openapi_order_post(apikey=self.api_key, add_order_req=v2_add_order_req)
525
532
  return result
526
533
  except InvalidParamError as e:
527
534
  logging.error(f"Validation error: {e}")
@@ -647,7 +654,7 @@ class Client:
647
654
 
648
655
  # Internally use trans_no for API compatibility
649
656
  request_body = OpenapiCancelOrderRequestOpenAPI(trans_no=order_id)
650
- result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, openapi_cancel_order_request_open_api=request_body)
657
+ result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, cancel_order_req=request_body)
651
658
  return result
652
659
 
653
660
  def place_orders_batch(self, orders: List[PlaceOrderDataInput], check_approval: bool = False) -> List[Any]:
@@ -901,15 +908,11 @@ class Client:
901
908
  logging.error(f"API error: {e}")
902
909
  raise OpenApiError(f"Failed to get positions: {e}")
903
910
 
904
- def get_my_balances(self, wallet_address=None):
905
- """Get user's balances"""
911
+ def get_my_balances(self):
912
+ """Get user's balances (uses authenticated user from apikey)"""
906
913
  try:
907
- if not wallet_address:
908
- wallet_address = self.contract_caller.signer.address()
909
-
910
914
  result = self.market_api.openapi_user_balance_get(
911
915
  apikey=self.api_key,
912
- wallet_address=wallet_address,
913
916
  chain_id=str(self.chain_id)
914
917
  )
915
918
  return result
opinion_clob_sdk/sdk.py CHANGED
@@ -314,7 +314,7 @@ class Client:
314
314
 
315
315
  result = self.market_api.openapi_market_get(
316
316
  apikey=self.api_key,
317
- topic_type=topic_type.value if topic_type else None,
317
+ market_type=topic_type.value if topic_type else None,
318
318
  page=page,
319
319
  limit=limit,
320
320
  chain_id=str(self.chain_id),
@@ -376,8 +376,15 @@ class Client:
376
376
  logging.error(f"API error: {e}")
377
377
  raise OpenApiError(f"Failed to get categorical market: {e}")
378
378
 
379
- def get_price_history(self, token_id, interval="1hour", start_time=int(time()), bars=60):
380
- """Get price history/candlestick data for a token"""
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
+ """
381
388
  try:
382
389
  if not token_id:
383
390
  raise InvalidParamError(MISSING_TOKEN_ID_MSG)
@@ -389,8 +396,8 @@ class Client:
389
396
  apikey=self.api_key,
390
397
  token_id=token_id,
391
398
  interval=interval,
392
- start_time=start_time,
393
- bars=bars
399
+ start_at=start_at,
400
+ end_at=end_at
394
401
  )
395
402
  return result
396
403
  except InvalidParamError as e:
@@ -521,7 +528,7 @@ class Client:
521
528
  order_exp_time='0'
522
529
  )
523
530
 
524
- result = self.market_api.openapi_order_post(apikey=self.api_key, v2_add_order_req=v2_add_order_req)
531
+ result = self.market_api.openapi_order_post(apikey=self.api_key, add_order_req=v2_add_order_req)
525
532
  return result
526
533
  except InvalidParamError as e:
527
534
  logging.error(f"Validation error: {e}")
@@ -647,7 +654,7 @@ class Client:
647
654
 
648
655
  # Internally use trans_no for API compatibility
649
656
  request_body = OpenapiCancelOrderRequestOpenAPI(trans_no=order_id)
650
- result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, openapi_cancel_order_request_open_api=request_body)
657
+ result = self.market_api.openapi_order_cancel_post(apikey=self.api_key, cancel_order_req=request_body)
651
658
  return result
652
659
 
653
660
  def place_orders_batch(self, orders: List[PlaceOrderDataInput], check_approval: bool = False) -> List[Any]:
@@ -901,15 +908,11 @@ class Client:
901
908
  logging.error(f"API error: {e}")
902
909
  raise OpenApiError(f"Failed to get positions: {e}")
903
910
 
904
- def get_my_balances(self, wallet_address=None):
905
- """Get user's balances"""
911
+ def get_my_balances(self):
912
+ """Get user's balances (uses authenticated user from apikey)"""
906
913
  try:
907
- if not wallet_address:
908
- wallet_address = self.contract_caller.signer.address()
909
-
910
914
  result = self.market_api.openapi_user_balance_get(
911
915
  apikey=self.api_key,
912
- wallet_address=wallet_address,
913
916
  chain_id=str(self.chain_id)
914
917
  )
915
918
  return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opinion_clob_sdk
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: Opinion CLOB SDK - Python SDK for Opinion Prediction Market Central Limit Order Book API
5
5
  Home-page: https://opinion.trade
6
6
  Author: Opinion Labs