opinion-clob-sdk 0.1.2__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 (95) 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 +26 -0
  4. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  5. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  6. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  7. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  8. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  9. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  10. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  11. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  12. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
  13. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  14. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  15. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  16. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  17. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  18. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  19. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  20. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  21. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  22. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  23. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +109 -0
  24. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  25. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  26. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  27. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  28. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  29. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  30. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  31. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  32. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +327 -0
  33. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  34. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  35. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  36. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  37. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  38. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  39. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  40. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  41. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  42. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  43. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  44. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
  45. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
  46. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
  47. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
  48. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
  49. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
  50. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
  51. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
  52. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
  53. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
  54. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
  55. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
  56. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
  57. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
  58. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
  59. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
  60. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
  61. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
  62. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
  63. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
  64. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +109 -0
  65. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
  66. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
  67. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
  68. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
  69. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
  70. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
  71. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
  72. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
  73. 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
  74. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
  75. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
  76. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
  77. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
  78. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
  79. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
  80. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
  81. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
  82. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
  83. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
  84. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
  85. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +947 -0
  86. opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +947 -0
  87. opinion_clob_sdk/opinion_clob_sdk/sdk.py +10 -9
  88. opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
  89. opinion_clob_sdk/sdk.py +10 -9
  90. opinion_clob_sdk/verify_api_calls.py +135 -0
  91. {opinion_clob_sdk-0.1.2.dist-info → opinion_clob_sdk-0.1.4.dist-info}/METADATA +1 -1
  92. opinion_clob_sdk-0.1.4.dist-info/RECORD +174 -0
  93. opinion_clob_sdk-0.1.2.dist-info/RECORD +0 -88
  94. {opinion_clob_sdk-0.1.2.dist-info → opinion_clob_sdk-0.1.4.dist-info}/WHEEL +0 -0
  95. {opinion_clob_sdk-0.1.2.dist-info → opinion_clob_sdk-0.1.4.dist-info}/top_level.txt +0 -0
@@ -110,6 +110,7 @@ class Client:
110
110
  """
111
111
  self.conf = Configuration(host=host)
112
112
  self.conf.api_key['ApiKeyAuth'] = apikey
113
+ self.api_key = apikey
113
114
  multi_sig_addr = fast_to_checksum_address(multi_sig_addr)
114
115
  self.contract_caller = ContractCaller(rpc_url=rpc_url, private_key=private_key, multi_sig_addr=multi_sig_addr,
115
116
  conditional_tokens_addr=conditional_tokens_addr,
@@ -158,8 +159,8 @@ class Client:
158
159
 
159
160
  # for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
160
161
  for quote_token in quote_token_list:
161
- quote_token_address = fast_to_checksum_address(quote_token.currency_address)
162
- 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)
163
164
  supported_quote_tokens[quote_token_address] = ctf_exchange_address
164
165
 
165
166
  logging.info(f'Supported quote tokens: {supported_quote_tokens}')
@@ -193,7 +194,7 @@ class Client:
193
194
  status = market_data.status
194
195
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
195
196
  raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
196
- collateral = fast_to_checksum_address(market_data.currency_address)
197
+ collateral = fast_to_checksum_address(market_data.quote_token)
197
198
  condition_id = market_data.condition_id
198
199
 
199
200
  return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
@@ -224,7 +225,7 @@ class Client:
224
225
  status = market_data.status
225
226
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
226
227
  raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
227
- collateral = fast_to_checksum_address(market_data.currency_address)
228
+ collateral = fast_to_checksum_address(market_data.quote_token)
228
229
  condition_id = market_data.condition_id
229
230
 
230
231
  return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
@@ -253,7 +254,7 @@ class Client:
253
254
  status = market_data.status
254
255
  if not status == TopicStatus.RESOLVED.value:
255
256
  raise OpenApiError('Cannot redeem on non-resolved market')
256
- collateral = market_data.currency_address
257
+ collateral = market_data.quote_token
257
258
  condition_id = market_data.condition_id
258
259
  logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
259
260
  return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
@@ -540,14 +541,14 @@ class Client:
540
541
  if int(market.chain_id) != self.chain_id:
541
542
  raise OpenApiError('Cannot place order on different chain')
542
543
 
543
- quote_token_addr = market.currency_address
544
+ quote_token_addr = market.quote_token
544
545
 
545
- # find quote token from quote_token_list by currency_address
546
- 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)
547
548
  if not quote_token:
548
549
  raise OpenApiError('Quote token not found for this market')
549
550
 
550
- exchange_addr = quote_token.ctfexchange_address
551
+ exchange_addr = quote_token.ctf_exchange_address
551
552
  chain_id = quote_token.chain_id
552
553
 
553
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
@@ -110,6 +110,7 @@ class Client:
110
110
  """
111
111
  self.conf = Configuration(host=host)
112
112
  self.conf.api_key['ApiKeyAuth'] = apikey
113
+ self.api_key = apikey
113
114
  multi_sig_addr = fast_to_checksum_address(multi_sig_addr)
114
115
  self.contract_caller = ContractCaller(rpc_url=rpc_url, private_key=private_key, multi_sig_addr=multi_sig_addr,
115
116
  conditional_tokens_addr=conditional_tokens_addr,
@@ -158,8 +159,8 @@ class Client:
158
159
 
159
160
  # for each quote token, check if the chain_id is the same as the chain_id in the contract_caller
160
161
  for quote_token in quote_token_list:
161
- quote_token_address = fast_to_checksum_address(quote_token.currency_address)
162
- 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)
163
164
  supported_quote_tokens[quote_token_address] = ctf_exchange_address
164
165
 
165
166
  logging.info(f'Supported quote tokens: {supported_quote_tokens}')
@@ -193,7 +194,7 @@ class Client:
193
194
  status = market_data.status
194
195
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
195
196
  raise OpenApiError('Cannot split on non-activated/resolving/resolved market')
196
- collateral = fast_to_checksum_address(market_data.currency_address)
197
+ collateral = fast_to_checksum_address(market_data.quote_token)
197
198
  condition_id = market_data.condition_id
198
199
 
199
200
  return self.contract_caller.split(collateral_token=collateral, condition_id=bytes.fromhex(condition_id), amount=amount)
@@ -224,7 +225,7 @@ class Client:
224
225
  status = market_data.status
225
226
  if not (status == TopicStatus.ACTIVATED.value or status == TopicStatus.RESOLVED.value or status == TopicStatus.RESOLVING.value):
226
227
  raise OpenApiError('Cannot merge on non-activated/resolving/resolved market')
227
- collateral = fast_to_checksum_address(market_data.currency_address)
228
+ collateral = fast_to_checksum_address(market_data.quote_token)
228
229
  condition_id = market_data.condition_id
229
230
 
230
231
  return self.contract_caller.merge(collateral_token=collateral, condition_id=bytes.fromhex(condition_id),
@@ -253,7 +254,7 @@ class Client:
253
254
  status = market_data.status
254
255
  if not status == TopicStatus.RESOLVED.value:
255
256
  raise OpenApiError('Cannot redeem on non-resolved market')
256
- collateral = market_data.currency_address
257
+ collateral = market_data.quote_token
257
258
  condition_id = market_data.condition_id
258
259
  logging.info(f'Redeem: collateral={collateral}, condition_id={condition_id}')
259
260
  return self.contract_caller.redeem(collateral_token=collateral, condition_id=bytes.fromhex(condition_id))
@@ -540,14 +541,14 @@ class Client:
540
541
  if int(market.chain_id) != self.chain_id:
541
542
  raise OpenApiError('Cannot place order on different chain')
542
543
 
543
- quote_token_addr = market.currency_address
544
+ quote_token_addr = market.quote_token
544
545
 
545
- # find quote token from quote_token_list by currency_address
546
- 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)
547
548
  if not quote_token:
548
549
  raise OpenApiError('Quote token not found for this market')
549
550
 
550
- exchange_addr = quote_token.ctfexchange_address
551
+ exchange_addr = quote_token.ctf_exchange_address
551
552
  chain_id = quote_token.chain_id
552
553
 
553
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.2
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
@@ -0,0 +1,174 @@
1
+ opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
2
+ opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
3
+ opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
4
+ opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
5
+ opinion_clob_sdk/verify_api_calls.py,sha256=MU4NEyfQ5hDmFJ0lT8g7KXVdlZ0cBtFyBTCbhhfI6a4,5031
6
+ opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
8
+ opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
9
+ opinion_clob_sdk/chain/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ opinion_clob_sdk/chain/contracts/conditional_tokens.py,sha256=P_MpetUKMNnT_hchZ0A9q7-g_ZKjkOr-BLldPXB4J7o,13998
11
+ opinion_clob_sdk/chain/contracts/erc20.py,sha256=C56GdZeMxcgdJTmMQKSfA8xHzDdNT71SaNf6xhJIVMY,2843
12
+ opinion_clob_sdk/chain/py_order_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ opinion_clob_sdk/chain/py_order_utils/constants.py,sha256=afsZ0OahGbCzNPE2rXKU1k8gQymkh4ODLKh4KPklvnA,70
14
+ opinion_clob_sdk/chain/py_order_utils/signer.py,sha256=NAMHcMREbRUgrz1-28sqpPoMD8LkRJSyUn7-FLUkYsM,447
15
+ opinion_clob_sdk/chain/py_order_utils/utils.py,sha256=-sf0Vq16bJ8eAc-p63r0TLqtbQkKWEQ6ccSAoQy1r7M,3837
16
+ opinion_clob_sdk/chain/py_order_utils/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py,sha256=lw925Mz6MerqCyXNgonhNP-495gZPm_me4HtlhyhVHM,1272
18
+ opinion_clob_sdk/chain/py_order_utils/builders/exception.py,sha256=525fSH8Q241VjxdllBkWi3DiW_-6I1AmG-iHwZBTp4E,47
19
+ opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py,sha256=NybKbNhRd1jceSjtp6lL9x1DjDzJ4ClhsAK2zS58P4c,2968
20
+ opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py,sha256=0xPLO9rEDsw_s3UQiooquEarvFe8KneafiaY6PgkLIo,1773
21
+ opinion_clob_sdk/chain/py_order_utils/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ opinion_clob_sdk/chain/py_order_utils/model/order.py,sha256=fI2NhqX_cdUmZivliki4rHXJCxQQY5ykjh8a58FFfPE,5852
23
+ opinion_clob_sdk/chain/py_order_utils/model/order_type.py,sha256=kYXJ0Ikk3Qnr00yCIfrtJibFve8DUjNSJ_xiLw7IphY,185
24
+ opinion_clob_sdk/chain/py_order_utils/model/sides.py,sha256=FZVZnutyLmgiNCVoz-1fjxxFzhH3z24xy5BY6pkIfs8,177
25
+ opinion_clob_sdk/chain/py_order_utils/model/signatures.py,sha256=lKoqi7gVay9NjCv_2QTdelP4EFy61Ez0UeY1ytOmooM,224
26
+ opinion_clob_sdk/chain/safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ opinion_clob_sdk/chain/safe/constants.py,sha256=H4UKUXJxR9pvwRHU4WM1p6wZ6yGjApOpWfEMYj-W_iE,572
28
+ opinion_clob_sdk/chain/safe/enums.py,sha256=aP9-PfC97ZYtX0dKOYKAyxITVrCDMIAY2_mHMdU8IJM,90
29
+ opinion_clob_sdk/chain/safe/exceptions.py,sha256=kp0jfnP93JyEkEgwPERL6MZ9D8ozbioURcKjMwSLjgE,1498
30
+ opinion_clob_sdk/chain/safe/multisend.py,sha256=l-lWlb7jSzmNCyFbpAr-d8SYEKM4QRm_h0tF53T3CzE,12659
31
+ opinion_clob_sdk/chain/safe/safe.py,sha256=OO-010or-qCCwCSTSh4qKGmoSwEsL2IYECW8IYmSmKQ,5216
32
+ opinion_clob_sdk/chain/safe/safe_signature.py,sha256=W1Xn73DSzE3PZ6ITyikhdWhosY3wdey-scX0Jci037I,12559
33
+ opinion_clob_sdk/chain/safe/safe_test.py,sha256=pbCYOLa_6cQbC0KOA7t41ItunauhHfgN7uneENfMXPk,1384
34
+ opinion_clob_sdk/chain/safe/safe_tx.py,sha256=QxKzv0EA7uwjakFMDVoDLrzYlZANpEhblPBQ7ZcF9zE,17211
35
+ opinion_clob_sdk/chain/safe/signatures.py,sha256=8l6t6R21E9Mj4_USagIp1GiUlJmAp0Cqq9VpB7Zk960,1978
36
+ opinion_clob_sdk/chain/safe/typing.py,sha256=wytgXXRbpyccM_HxpQLeDzfo40Ch_K-Z_ivORb-eNZo,419
37
+ opinion_clob_sdk/chain/safe/utils.py,sha256=1u4yKwMCvfOlg9NsWbsM2WszQoO1wd6D2Z2aGAb1jjo,6469
38
+ opinion_clob_sdk/chain/safe/eip712/__init__.py,sha256=ge0S6t2RtFc_mLFr4D93l6WLS2EONKgkuPGkcP_nDJ4,5915
39
+ opinion_clob_sdk/chain/safe/safe_contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py,sha256=_aENMzhiQgKSzXxn-TnVFWE84lIgDv1Iiw-VdIC1IMw,5968
41
+ opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
42
+ opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
43
+ opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
44
+ opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
45
+ opinion_clob_sdk/opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
46
+ opinion_clob_sdk/opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
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
49
+ opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
51
+ opinion_clob_sdk/opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
52
+ opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py,sha256=P_MpetUKMNnT_hchZ0A9q7-g_ZKjkOr-BLldPXB4J7o,13998
54
+ opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py,sha256=C56GdZeMxcgdJTmMQKSfA8xHzDdNT71SaNf6xhJIVMY,2843
55
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py,sha256=afsZ0OahGbCzNPE2rXKU1k8gQymkh4ODLKh4KPklvnA,70
57
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py,sha256=NAMHcMREbRUgrz1-28sqpPoMD8LkRJSyUn7-FLUkYsM,447
58
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py,sha256=-sf0Vq16bJ8eAc-p63r0TLqtbQkKWEQ6ccSAoQy1r7M,3837
59
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py,sha256=lw925Mz6MerqCyXNgonhNP-495gZPm_me4HtlhyhVHM,1272
61
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py,sha256=525fSH8Q241VjxdllBkWi3DiW_-6I1AmG-iHwZBTp4E,47
62
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py,sha256=NybKbNhRd1jceSjtp6lL9x1DjDzJ4ClhsAK2zS58P4c,2968
63
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py,sha256=0xPLO9rEDsw_s3UQiooquEarvFe8KneafiaY6PgkLIo,1773
64
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py,sha256=fI2NhqX_cdUmZivliki4rHXJCxQQY5ykjh8a58FFfPE,5852
66
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py,sha256=kYXJ0Ikk3Qnr00yCIfrtJibFve8DUjNSJ_xiLw7IphY,185
67
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py,sha256=FZVZnutyLmgiNCVoz-1fjxxFzhH3z24xy5BY6pkIfs8,177
68
+ opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py,sha256=lKoqi7gVay9NjCv_2QTdelP4EFy61Ez0UeY1ytOmooM,224
69
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py,sha256=H4UKUXJxR9pvwRHU4WM1p6wZ6yGjApOpWfEMYj-W_iE,572
71
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py,sha256=aP9-PfC97ZYtX0dKOYKAyxITVrCDMIAY2_mHMdU8IJM,90
72
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py,sha256=kp0jfnP93JyEkEgwPERL6MZ9D8ozbioURcKjMwSLjgE,1498
73
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py,sha256=l-lWlb7jSzmNCyFbpAr-d8SYEKM4QRm_h0tF53T3CzE,12659
74
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py,sha256=OO-010or-qCCwCSTSh4qKGmoSwEsL2IYECW8IYmSmKQ,5216
75
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py,sha256=W1Xn73DSzE3PZ6ITyikhdWhosY3wdey-scX0Jci037I,12559
76
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py,sha256=pbCYOLa_6cQbC0KOA7t41ItunauhHfgN7uneENfMXPk,1384
77
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py,sha256=QxKzv0EA7uwjakFMDVoDLrzYlZANpEhblPBQ7ZcF9zE,17211
78
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py,sha256=8l6t6R21E9Mj4_USagIp1GiUlJmAp0Cqq9VpB7Zk960,1978
79
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py,sha256=wytgXXRbpyccM_HxpQLeDzfo40Ch_K-Z_ivORb-eNZo,419
80
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py,sha256=1u4yKwMCvfOlg9NsWbsM2WszQoO1wd6D2Z2aGAb1jjo,6469
81
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py,sha256=ge0S6t2RtFc_mLFr4D93l6WLS2EONKgkuPGkcP_nDJ4,5915
82
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py,sha256=_aENMzhiQgKSzXxn-TnVFWE84lIgDv1Iiw-VdIC1IMw,5968
84
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
85
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
86
+ opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
87
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py,sha256=gxP6T5-kqElgabAcSXBmxM4dmJVDuOAyrXar2LQpt90,624
88
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py,sha256=JoQvyK5IAnPiwwB8YZsmUtdEr-5hW2YG6iz1pOnLvDk,139
89
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py,sha256=UBrdsg3FtSV1xl3pihkXwv_frI2w2z68VI0cpv2LQh0,287
90
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py,sha256=3jn6RmuM55fTfpoqquu8jBBxAys12ZWHZ0nGUdqaDHc,39186
91
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py,sha256=AKCD1ZvLTbJX_YWFJecRtZ4Pi7L3_20Q7YOSGfAolEY,17148
93
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py,sha256=6SSx4T_WZL8BxzRbfGSDp6eGD4zJ5ACeBB58DlrpmoA,234
94
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py,sha256=P_MpetUKMNnT_hchZ0A9q7-g_ZKjkOr-BLldPXB4J7o,13998
96
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py,sha256=C56GdZeMxcgdJTmMQKSfA8xHzDdNT71SaNf6xhJIVMY,2843
97
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py,sha256=afsZ0OahGbCzNPE2rXKU1k8gQymkh4ODLKh4KPklvnA,70
99
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py,sha256=NAMHcMREbRUgrz1-28sqpPoMD8LkRJSyUn7-FLUkYsM,447
100
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py,sha256=-sf0Vq16bJ8eAc-p63r0TLqtbQkKWEQ6ccSAoQy1r7M,3837
101
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py,sha256=lw925Mz6MerqCyXNgonhNP-495gZPm_me4HtlhyhVHM,1272
103
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py,sha256=525fSH8Q241VjxdllBkWi3DiW_-6I1AmG-iHwZBTp4E,47
104
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py,sha256=NybKbNhRd1jceSjtp6lL9x1DjDzJ4ClhsAK2zS58P4c,2968
105
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py,sha256=0xPLO9rEDsw_s3UQiooquEarvFe8KneafiaY6PgkLIo,1773
106
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py,sha256=fI2NhqX_cdUmZivliki4rHXJCxQQY5ykjh8a58FFfPE,5852
108
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py,sha256=kYXJ0Ikk3Qnr00yCIfrtJibFve8DUjNSJ_xiLw7IphY,185
109
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py,sha256=FZVZnutyLmgiNCVoz-1fjxxFzhH3z24xy5BY6pkIfs8,177
110
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py,sha256=lKoqi7gVay9NjCv_2QTdelP4EFy61Ez0UeY1ytOmooM,224
111
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py,sha256=H4UKUXJxR9pvwRHU4WM1p6wZ6yGjApOpWfEMYj-W_iE,572
113
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py,sha256=aP9-PfC97ZYtX0dKOYKAyxITVrCDMIAY2_mHMdU8IJM,90
114
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py,sha256=kp0jfnP93JyEkEgwPERL6MZ9D8ozbioURcKjMwSLjgE,1498
115
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py,sha256=l-lWlb7jSzmNCyFbpAr-d8SYEKM4QRm_h0tF53T3CzE,12659
116
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py,sha256=OO-010or-qCCwCSTSh4qKGmoSwEsL2IYECW8IYmSmKQ,5216
117
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py,sha256=W1Xn73DSzE3PZ6ITyikhdWhosY3wdey-scX0Jci037I,12559
118
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py,sha256=pbCYOLa_6cQbC0KOA7t41ItunauhHfgN7uneENfMXPk,1384
119
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py,sha256=QxKzv0EA7uwjakFMDVoDLrzYlZANpEhblPBQ7ZcF9zE,17211
120
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py,sha256=8l6t6R21E9Mj4_USagIp1GiUlJmAp0Cqq9VpB7Zk960,1978
121
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py,sha256=wytgXXRbpyccM_HxpQLeDzfo40Ch_K-Z_ivORb-eNZo,419
122
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py,sha256=1u4yKwMCvfOlg9NsWbsM2WszQoO1wd6D2Z2aGAb1jjo,6469
123
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py,sha256=ge0S6t2RtFc_mLFr4D93l6WLS2EONKgkuPGkcP_nDJ4,5915
124
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
+ 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
126
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py,sha256=8oGhNkS2k2Cy5pG6YNt_BKytS3AEtPeXv4rkyXv_p0M,380
127
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py,sha256=YCUWTpf_pR44iUUkDl42f3n2YXSVGlTBcvMtReN7rlM,21922
128
+ opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py,sha256=xnW8JSq8tVMfvZ4lhT-L96P3Usjs2zrZ5jzrNZvFHjc,631
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,,