opinion-clob-sdk 0.1.3__py3-none-any.whl → 0.1.4__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 (54) 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 +26 -0
  5. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  6. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  7. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  8. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  9. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  10. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  11. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  12. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  13. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
  14. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  15. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  16. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  17. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  18. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  19. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  20. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  21. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  22. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  23. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  24. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +109 -0
  25. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  26. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  27. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  28. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  29. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  30. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  31. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  32. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  33. 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
  34. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  35. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  36. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  37. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  38. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  39. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  40. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  41. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  42. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  43. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  44. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  45. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +947 -0
  46. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +9 -9
  47. opinion_clob_sdk/opinion_clob_sdk/sdk.py +9 -9
  48. opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  49. opinion_clob_sdk/sdk.py +9 -9
  50. opinion_clob_sdk/verify_api_calls.py +135 -0
  51. {opinion_clob_sdk-0.1.3.dist-info → opinion_clob_sdk-0.1.4.dist-info}/METADATA +1 -1
  52. {opinion_clob_sdk-0.1.3.dist-info → opinion_clob_sdk-0.1.4.dist-info}/RECORD +54 -10
  53. {opinion_clob_sdk-0.1.3.dist-info → opinion_clob_sdk-0.1.4.dist-info}/WHEEL +0 -0
  54. {opinion_clob_sdk-0.1.3.dist-info → opinion_clob_sdk-0.1.4.dist-info}/top_level.txt +0 -0
@@ -159,8 +159,8 @@ class Client:
159
159
 
160
160
  # for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
161
161
  for quote_token in quote_token_list:
162
- quote_token_address = fast_to_checksum_address(quote_token.currency_address)
163
- ctf_exchange_address = fast_to_checksum_address(quote_token.ctfexchange_address)
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
164
  supported_quote_tokens[quote_token_address] = ctf_exchange_address
165
165
 
166
166
  logging.info(f'Supported quote tokens: {supported_quote_tokens}')
@@ -194,7 +194,7 @@ class Client:
194
194
  status = market_data.status
195
195
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
196
196
  raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
197
- collateral = fast_to_checksum_address(market_data.currency_address)
197
+ collateral = fast_to_checksum_address(market_data.quote_token)
198
198
  condition_id = market_data.condition_id
199
199
 
200
200
  return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
@@ -225,7 +225,7 @@ class Client:
225
225
  status = market_data.status
226
226
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
227
227
  raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
228
- collateral = fast_to_checksum_address(market_data.currency_address)
228
+ collateral = fast_to_checksum_address(market_data.quote_token)
229
229
  condition_id = market_data.condition_id
230
230
 
231
231
  return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
@@ -254,7 +254,7 @@ class Client:
254
254
  status = market_data.status
255
255
  if not status == TopicStatus.RESOLVED.value:
256
256
  raise OpenApiError('Cannot redeem on non-resolved market')
257
- collateral = market_data.currency_address
257
+ collateral = market_data.quote_token
258
258
  condition_id = market_data.condition_id
259
259
  logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
260
260
  return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
@@ -541,14 +541,14 @@ class Client:
541
541
  if int(market.chain_id) != self.chain_id:
542
542
  raise OpenApiError('Cannot place order on different chain')
543
543
 
544
- quote_token_addr = market.currency_address
544
+ quote_token_addr = market.quote_token
545
545
 
546
- # find quote token from quote_token_list by currency_address
547
- quote_token = next((item for item in quote_token_list if str.lower(item.currency_address) == str.lower(quote_token_addr)), None)
546
+ # find quote token from quote_token_list by quote_token_address
547
+ quote_token = next((item for item in quote_token_list if str.lower(item.quote_token_address) == str.lower(quote_token_addr)), None)
548
548
  if not quote_token:
549
549
  raise OpenApiError('Quote token not found for this market')
550
550
 
551
- exchange_addr = quote_token.ctfexchange_address
551
+ exchange_addr = quote_token.ctf_exchange_address
552
552
  chain_id = quote_token.chain_id
553
553
 
554
554
  makerAmount = 0
@@ -159,8 +159,8 @@ class Client:
159
159
 
160
160
  # for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
161
161
  for quote_token in quote_token_list:
162
- quote_token_address = fast_to_checksum_address(quote_token.currency_address)
163
- ctf_exchange_address = fast_to_checksum_address(quote_token.ctfexchange_address)
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
164
  supported_quote_tokens[quote_token_address] = ctf_exchange_address
165
165
 
166
166
  logging.info(f'Supported quote tokens: {supported_quote_tokens}')
@@ -194,7 +194,7 @@ class Client:
194
194
  status = market_data.status
195
195
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
196
196
  raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
197
- collateral = fast_to_checksum_address(market_data.currency_address)
197
+ collateral = fast_to_checksum_address(market_data.quote_token)
198
198
  condition_id = market_data.condition_id
199
199
 
200
200
  return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
@@ -225,7 +225,7 @@ class Client:
225
225
  status = market_data.status
226
226
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
227
227
  raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
228
- collateral = fast_to_checksum_address(market_data.currency_address)
228
+ collateral = fast_to_checksum_address(market_data.quote_token)
229
229
  condition_id = market_data.condition_id
230
230
 
231
231
  return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
@@ -254,7 +254,7 @@ class Client:
254
254
  status = market_data.status
255
255
  if not status == TopicStatus.RESOLVED.value:
256
256
  raise OpenApiError('Cannot redeem on non-resolved market')
257
- collateral = market_data.currency_address
257
+ collateral = market_data.quote_token
258
258
  condition_id = market_data.condition_id
259
259
  logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
260
260
  return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
@@ -541,14 +541,14 @@ class Client:
541
541
  if int(market.chain_id) != self.chain_id:
542
542
  raise OpenApiError('Cannot place order on different chain')
543
543
 
544
- quote_token_addr = market.currency_address
544
+ quote_token_addr = market.quote_token
545
545
 
546
- # find quote token from quote_token_list by currency_address
547
- quote_token = next((item for item in quote_token_list if str.lower(item.currency_address) == str.lower(quote_token_addr)), None)
546
+ # find quote token from quote_token_list by quote_token_address
547
+ quote_token = next((item for item in quote_token_list if str.lower(item.quote_token_address) == str.lower(quote_token_addr)), None)
548
548
  if not quote_token:
549
549
  raise OpenApiError('Quote token not found for this market')
550
550
 
551
- exchange_addr = quote_token.ctfexchange_address
551
+ exchange_addr = quote_token.ctf_exchange_address
552
552
  chain_id = quote_token.chain_id
553
553
 
554
554
  makerAmount = 0
@@ -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)
opinion_clob_sdk/sdk.py CHANGED
@@ -159,8 +159,8 @@ class Client:
159
159
 
160
160
  # for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
161
161
  for quote_token in quote_token_list:
162
- quote_token_address = fast_to_checksum_address(quote_token.currency_address)
163
- ctf_exchange_address = fast_to_checksum_address(quote_token.ctfexchange_address)
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
164
  supported_quote_tokens[quote_token_address] = ctf_exchange_address
165
165
 
166
166
  logging.info(f'Supported quote tokens: {supported_quote_tokens}')
@@ -194,7 +194,7 @@ class Client:
194
194
  status = market_data.status
195
195
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
196
196
  raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
197
- collateral = fast_to_checksum_address(market_data.currency_address)
197
+ collateral = fast_to_checksum_address(market_data.quote_token)
198
198
  condition_id = market_data.condition_id
199
199
 
200
200
  return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
@@ -225,7 +225,7 @@ class Client:
225
225
  status = market_data.status
226
226
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
227
227
  raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
228
- collateral = fast_to_checksum_address(market_data.currency_address)
228
+ collateral = fast_to_checksum_address(market_data.quote_token)
229
229
  condition_id = market_data.condition_id
230
230
 
231
231
  return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
@@ -254,7 +254,7 @@ class Client:
254
254
  status = market_data.status
255
255
  if not status == TopicStatus.RESOLVED.value:
256
256
  raise OpenApiError('Cannot redeem on non-resolved market')
257
- collateral = market_data.currency_address
257
+ collateral = market_data.quote_token
258
258
  condition_id = market_data.condition_id
259
259
  logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
260
260
  return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
@@ -541,14 +541,14 @@ class Client:
541
541
  if int(market.chain_id) != self.chain_id:
542
542
  raise OpenApiError('Cannot place order on different chain')
543
543
 
544
- quote_token_addr = market.currency_address
544
+ quote_token_addr = market.quote_token
545
545
 
546
- # find quote token from quote_token_list by currency_address
547
- quote_token = next((item for item in quote_token_list if str.lower(item.currency_address) == str.lower(quote_token_addr)), None)
546
+ # find quote token from quote_token_list by quote_token_address
547
+ quote_token = next((item for item in quote_token_list if str.lower(item.quote_token_address) == str.lower(quote_token_addr)), None)
548
548
  if not quote_token:
549
549
  raise OpenApiError('Quote token not found for this market')
550
550
 
551
- exchange_addr = quote_token.ctfexchange_address
551
+ exchange_addr = quote_token.ctf_exchange_address
552
552
  chain_id = quote_token.chain_id
553
553
 
554
554
  makerAmount = 0
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opinion_clob_sdk
3
- Version: 0.1.3
3
+ Version: 0.1.4
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
@@ -1,7 +1,8 @@
1
- opinion_clob_sdk/__init__.py,sha256=Pss1gs-NXNr8wWjinAdBw2lYNeon-axyW7z9l1cLCCU,624
1
+ opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
2
2
  opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
3
3
  opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
4
- opinion_clob_sdk/sdk.py,sha256=jUCb9MoXlwGJ9ZZuepb-MtMNLJKIHjaGSslMKpBDqnA,39195
4
+ opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
5
+ opinion_clob_sdk/verify_api_calls.py,sha256=MU4NEyfQ5hDmFJ0lT8g7KXVdlZ0cBtFyBTCbhhfI6a4,5031
5
6
  opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
7
  opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
7
8
  opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
@@ -40,10 +41,11 @@ opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0
40
41
  opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
41
42
  opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
42
43
  opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
43
- opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=Pss1gs-NXNr8wWjinAdBw2lYNeon-axyW7z9l1cLCCU,624
44
+ opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
44
45
  opinion_clob_sdk/opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
45
46
  opinion_clob_sdk/opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
46
- opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=jUCb9MoXlwGJ9ZZuepb-MtMNLJKIHjaGSslMKpBDqnA,39195
47
+ opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
48
+ opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py,sha256=MU4NEyfQ5hDmFJ0lT8g7KXVdlZ0cBtFyBTCbhhfI6a4,5031
47
49
  opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
50
  opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
49
51
  opinion_clob_sdk/opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
@@ -82,10 +84,10 @@ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallba
82
84
  opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
83
85
  opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
84
86
  opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
85
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=Pss1gs-NXNr8wWjinAdBw2lYNeon-axyW7z9l1cLCCU,624
87
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
86
88
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
87
89
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
88
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=jUCb9MoXlwGJ9ZZuepb-MtMNLJKIHjaGSslMKpBDqnA,39195
90
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
89
91
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
92
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
91
93
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
@@ -124,7 +126,49 @@ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/com
124
126
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
125
127
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
126
128
  opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
127
- opinion_clob_sdk-0.1.3.dist-info/METADATA,sha256=dNx3FTl68vDFIZc0So5z4R_XO6ZgLCsizUKLVC5_XiY,2776
128
- opinion_clob_sdk-0.1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
129
- opinion_clob_sdk-0.1.3.dist-info/top_level.txt,sha256=4gH76GRX1WZSc3b146FfxE6BAxggJD8y3NMEHUOSPA0,17
130
- opinion_clob_sdk-0.1.3.dist-info/RECORD,,
129
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
130
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
131
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
132
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
133
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
135
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
136
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py,sha256=P_MpetUKMNnT_hchZ0A9q7-g_ZKjkOr-BLldPXB4J7o,13998
138
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py,sha256=C56GdZeMxcgdJTmMQKSfA8xHzDdNT71SaNf6xhJIVMY,2843
139
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py,sha256=afsZ0OahGbCzNPE2rXKU1k8gQymkh4ODLKh4KPklvnA,70
141
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py,sha256=NAMHcMREbRUgrz1-28sqpPoMD8LkRJSyUn7-FLUkYsM,447
142
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py,sha256=-sf0Vq16bJ8eAc-p63r0TLqtbQkKWEQ6ccSAoQy1r7M,3837
143
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py,sha256=lw925Mz6MerqCyXNgonhNP-495gZPm_me4HtlhyhVHM,1272
145
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py,sha256=525fSH8Q241VjxdllBkWi3DiW_-6I1AmG-iHwZBTp4E,47
146
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py,sha256=NybKbNhRd1jceSjtp6lL9x1DjDzJ4ClhsAK2zS58P4c,2968
147
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py,sha256=0xPLO9rEDsw_s3UQiooquEarvFe8KneafiaY6PgkLIo,1773
148
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py,sha256=fI2NhqX_cdUmZivliki4rHXJCxQQY5ykjh8a58FFfPE,5852
150
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py,sha256=kYXJ0Ikk3Qnr00yCIfrtJibFve8DUjNSJ_xiLw7IphY,185
151
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py,sha256=FZVZnutyLmgiNCVoz-1fjxxFzhH3z24xy5BY6pkIfs8,177
152
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py,sha256=lKoqi7gVay9NjCv_2QTdelP4EFy61Ez0UeY1ytOmooM,224
153
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py,sha256=H4UKUXJxR9pvwRHU4WM1p6wZ6yGjApOpWfEMYj-W_iE,572
155
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py,sha256=aP9-PfC97ZYtX0dKOYKAyxITVrCDMIAY2_mHMdU8IJM,90
156
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py,sha256=kp0jfnP93JyEkEgwPERL6MZ9D8ozbioURcKjMwSLjgE,1498
157
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py,sha256=l-lWlb7jSzmNCyFbpAr-d8SYEKM4QRm_h0tF53T3CzE,12659
158
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py,sha256=OO-010or-qCCwCSTSh4qKGmoSwEsL2IYECW8IYmSmKQ,5216
159
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py,sha256=W1Xn73DSzE3PZ6ITyikhdWhosY3wdey-scX0Jci037I,12559
160
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py,sha256=pbCYOLa_6cQbC0KOA7t41ItunauhHfgN7uneENfMXPk,1384
161
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py,sha256=QxKzv0EA7uwjakFMDVoDLrzYlZANpEhblPBQ7ZcF9zE,17211
162
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py,sha256=8l6t6R21E9Mj4_USagIp1GiUlJmAp0Cqq9VpB7Zk960,1978
163
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py,sha256=wytgXXRbpyccM_HxpQLeDzfo40Ch_K-Z_ivORb-eNZo,419
164
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py,sha256=1u4yKwMCvfOlg9NsWbsM2WszQoO1wd6D2Z2aGAb1jjo,6469
165
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py,sha256=ge0S6t2RtFc_mLFr4D93l6WLS2EONKgkuPGkcP_nDJ4,5915
166
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py,sha256=_aENMzhiQgKSzXxn-TnVFWE84lIgDv1Iiw-VdIC1IMw,5968
168
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
169
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
170
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
171
+ opinion_clob_sdk-0.1.4.dist-info/METADATA,sha256=IL5HW4tWOsi8t5zGYkPUhNlOeh7z0C6iIQIFU9EB3xc,2776
172
+ opinion_clob_sdk-0.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
173
+ opinion_clob_sdk-0.1.4.dist-info/top_level.txt,sha256=4gH76GRX1WZSc3b146FfxE6BAxggJD8y3NMEHUOSPA0,17
174
+ opinion_clob_sdk-0.1.4.dist-info/RECORD,,