prediction-market-agent-tooling 0.60.0.dev412__py3-none-any.whl → 0.60.1__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.
@@ -91,6 +91,14 @@ class APIKeys(BaseSettings):
91
91
  raise ValueError("Data must be a dictionary.")
92
92
  return data
93
93
 
94
+ def copy_without_safe_address(self) -> "APIKeys":
95
+ """
96
+ This is handy when you operate in environment with SAFE_ADDRESS, but need to execute transaction using EOA.
97
+ """
98
+ data = self.model_copy(deep=True)
99
+ data.SAFE_ADDRESS = None
100
+ return data
101
+
94
102
  @property
95
103
  def manifold_user_id(self) -> str:
96
104
  return get_authenticated_user(
@@ -50,7 +50,7 @@ from prediction_market_agent_tooling.markets.markets import (
50
50
  have_bet_on_market_since,
51
51
  )
52
52
  from prediction_market_agent_tooling.markets.omen.omen import (
53
- withdraw_wxdai_to_xdai_to_keep_balance,
53
+ send_keeping_token_to_eoa_xdai,
54
54
  )
55
55
  from prediction_market_agent_tooling.monitor.monitor_app import (
56
56
  MARKET_TYPE_TO_DEPLOYED_AGENT,
@@ -416,10 +416,10 @@ class DeployablePredictionAgent(DeployableAgent):
416
416
  if market_type.is_blockchain_market:
417
417
  # Exchange wxdai back to xdai if the balance is getting low, so we can keep paying for fees.
418
418
  if self.min_balance_to_keep_in_native_currency is not None:
419
- withdraw_wxdai_to_xdai_to_keep_balance(
419
+ send_keeping_token_to_eoa_xdai(
420
420
  api_keys,
421
421
  min_required_balance=self.min_balance_to_keep_in_native_currency,
422
- withdraw_multiplier=2,
422
+ multiplier=3,
423
423
  )
424
424
 
425
425
  def process_market(
@@ -1315,41 +1315,77 @@ def get_binary_market_p_yes_history(market: OmenAgentMarket) -> list[Probability
1315
1315
  return history
1316
1316
 
1317
1317
 
1318
- def withdraw_wxdai_to_xdai_to_keep_balance(
1318
+ def send_keeping_token_to_eoa_xdai(
1319
1319
  api_keys: APIKeys,
1320
1320
  min_required_balance: xDai,
1321
- withdraw_multiplier: float = 1.0,
1321
+ multiplier: float = 1.0,
1322
1322
  web3: Web3 | None = None,
1323
1323
  ) -> None:
1324
1324
  """
1325
- Keeps xDai balance above the minimum required balance by withdrawing wxDai to xDai.
1326
- Optionally, the amount to withdraw can be multiplied by the `withdraw_multiplier`, which can be useful to keep a buffer.
1325
+ Keeps xDai balance above the minimum required balance by transfering keeping token to xDai.
1326
+ Optionally, the amount to transfer can be multiplied by the `multiplier`, which can be useful to keep a buffer.
1327
1327
  """
1328
- # xDai needs to be in our wallet where we pay transaction fees, so do not check for Safe's balance.
1329
- current_balances = get_balances(api_keys.public_key, web3)
1328
+ # Only wxDai can be withdrawn to xDai. Anything else needs to be swapped to wxDai first.
1329
+ wxdai_contract = WrappedxDaiContract()
1330
+
1331
+ if KEEPING_ERC20_TOKEN.address != wxdai_contract.address:
1332
+ raise RuntimeError(
1333
+ "Only wxDai can be withdrawn to xDai. Rest is not implemented for simplicity for now. It would require trading using CoW, or double withdrawing from sDai"
1334
+ )
1330
1335
 
1331
- if current_balances.xdai >= min_required_balance:
1336
+ current_balances_eoa = get_balances(api_keys.public_key, web3)
1337
+ current_balances_betting = get_balances(api_keys.bet_from_address, web3)
1338
+
1339
+ # xDai needs to be in our wallet where we pay transaction fees, so do not check for Safe's balance here, but for EOA.
1340
+ if current_balances_eoa.xdai >= min_required_balance:
1332
1341
  logger.info(
1333
- f"Current xDai balance {current_balances.xdai} is more or equal than the required minimum balance {min_required_balance}."
1342
+ f"Current xDai balance {current_balances_eoa.xdai} is more or equal than the required minimum balance {min_required_balance}."
1334
1343
  )
1335
1344
  return
1336
1345
 
1337
1346
  need_to_withdraw = xDai(
1338
- (min_required_balance - current_balances.xdai) * withdraw_multiplier
1347
+ (min_required_balance - current_balances_eoa.xdai) * multiplier
1339
1348
  )
1349
+ need_to_withdraw_wei = xdai_to_wei(need_to_withdraw)
1340
1350
 
1341
- if current_balances.wxdai < need_to_withdraw:
1342
- raise OutOfFundsError(
1343
- f"Current wxDai balance {current_balances.wxdai} is less than the required minimum wxDai to withdraw {need_to_withdraw}."
1351
+ if current_balances_eoa.wxdai >= need_to_withdraw:
1352
+ # If EOA has enough of wxDai, simply withdraw it.
1353
+ logger.info(
1354
+ f"Withdrawing {need_to_withdraw} wxDai from EOA to keep the EOA's xDai balance above the minimum required balance {min_required_balance}."
1355
+ )
1356
+ wxdai_contract.withdraw(
1357
+ api_keys=api_keys.copy_without_safe_address(),
1358
+ amount_wei=need_to_withdraw_wei,
1359
+ web3=web3,
1344
1360
  )
1345
1361
 
1346
- wxdai_contract = WrappedxDaiContract()
1347
- wxdai_contract.withdraw(
1348
- api_keys=api_keys, amount_wei=xdai_to_wei(need_to_withdraw), web3=web3
1349
- )
1350
- logger.info(
1351
- f"Withdrew {need_to_withdraw} wxDai to keep the balance above the minimum required balance {min_required_balance}."
1352
- )
1362
+ elif current_balances_betting.wxdai >= need_to_withdraw:
1363
+ # If Safe has enough of wxDai:
1364
+ # First send them to EOA's address.
1365
+ logger.info(
1366
+ f"Transfering {need_to_withdraw} wxDai from betting address to EOA's address."
1367
+ )
1368
+ wxdai_contract.transferFrom(
1369
+ api_keys=api_keys,
1370
+ sender=api_keys.bet_from_address,
1371
+ recipient=api_keys.public_key,
1372
+ amount_wei=need_to_withdraw_wei,
1373
+ web3=web3,
1374
+ )
1375
+ # And then simply withdraw it.
1376
+ logger.info(
1377
+ f"Withdrawing {need_to_withdraw} wxDai from EOA to keep the EOA's xDai balance above the minimum required balance {min_required_balance}."
1378
+ )
1379
+ wxdai_contract.withdraw(
1380
+ api_keys=api_keys.copy_without_safe_address(),
1381
+ amount_wei=need_to_withdraw_wei,
1382
+ web3=web3,
1383
+ )
1384
+
1385
+ else:
1386
+ raise OutOfFundsError(
1387
+ f"Current wxDai balance ({current_balances_eoa=}, {current_balances_betting=}) is less than the required minimum wxDai to withdraw {need_to_withdraw}."
1388
+ )
1353
1389
 
1354
1390
 
1355
1391
  def get_buy_outcome_token_amount(
@@ -26,7 +26,11 @@ from prediction_market_agent_tooling.markets.omen.omen_subgraph_handler import (
26
26
  OmenSubgraphHandler,
27
27
  )
28
28
  from prediction_market_agent_tooling.tools.utils import utcnow
29
- from prediction_market_agent_tooling.tools.web3_utils import ZERO_BYTES, xdai_to_wei
29
+ from prediction_market_agent_tooling.tools.web3_utils import (
30
+ ZERO_BYTES,
31
+ wei_to_xdai,
32
+ xdai_to_wei,
33
+ )
30
34
 
31
35
 
32
36
  def claim_bonds_on_realitio_questions(
@@ -116,7 +120,9 @@ def claim_bonds_on_realitio_question(
116
120
  current_balance = realitio_contract.balanceOf(public_key, web3=web3)
117
121
  # Keeping balance on Realitio is not useful, so it's recommended to just withdraw it.
118
122
  if current_balance > 0 and auto_withdraw:
119
- logger.info(f"Withdrawing remaining balance {current_balance=}")
123
+ logger.info(
124
+ f"Withdrawing remaining balance {wei_to_xdai(current_balance)} xDai from Realitio."
125
+ )
120
126
  realitio_contract.withdraw(api_keys, web3=web3)
121
127
 
122
128
 
@@ -46,10 +46,12 @@ from prediction_market_agent_tooling.tools.web3_utils import (
46
46
  byte32_to_ipfscidv0,
47
47
  )
48
48
 
49
- # TODO: Agents don't know how to convert value between other tokens, we assume 1 unit = 1xDai = $1 (for example if market would be in wETH, betting 1 unit of wETH would be crazy :D)
50
- SAFE_COLLATERAL_TOKEN_MARKETS = (
51
- WrappedxDaiContract().address,
52
- sDaiContract().address,
49
+ SAFE_COLLATERAL_TOKENS = (
50
+ WrappedxDaiContract(),
51
+ sDaiContract(),
52
+ )
53
+ SAFE_COLLATERAL_TOKENS_ADDRESSES = tuple(
54
+ contract.address for contract in SAFE_COLLATERAL_TOKENS
53
55
  )
54
56
 
55
57
 
@@ -326,7 +328,7 @@ class OmenSubgraphHandler(BaseSubgraphHandler):
326
328
  excluded_questions: set[str] | None = None, # question titles
327
329
  collateral_token_address_in: (
328
330
  tuple[ChecksumAddress, ...] | None
329
- ) = SAFE_COLLATERAL_TOKEN_MARKETS,
331
+ ) = SAFE_COLLATERAL_TOKENS_ADDRESSES,
330
332
  category: str | None = None,
331
333
  creator_in: t.Sequence[HexAddress] | None = None,
332
334
  ) -> t.List[OmenMarket]:
@@ -392,7 +394,7 @@ class OmenSubgraphHandler(BaseSubgraphHandler):
392
394
  outcomes: list[str] = OMEN_BINARY_MARKET_OUTCOMES,
393
395
  collateral_token_address_in: (
394
396
  tuple[ChecksumAddress, ...] | None
395
- ) = SAFE_COLLATERAL_TOKEN_MARKETS,
397
+ ) = SAFE_COLLATERAL_TOKENS_ADDRESSES,
396
398
  category: str | None = None,
397
399
  ) -> t.List[OmenMarket]:
398
400
  """
@@ -22,10 +22,7 @@ from prediction_market_agent_tooling.markets.agent_market import (
22
22
  ProcessedTradedMarket,
23
23
  SortBy,
24
24
  )
25
- from prediction_market_agent_tooling.markets.blockchain_utils import (
26
- get_total_balance,
27
- store_trades,
28
- )
25
+ from prediction_market_agent_tooling.markets.blockchain_utils import store_trades
29
26
  from prediction_market_agent_tooling.markets.data_models import (
30
27
  BetAmount,
31
28
  Currency,
@@ -167,11 +164,7 @@ class SeerAgentMarket(AgentMarket):
167
164
 
168
165
  @staticmethod
169
166
  def verify_operational_balance(api_keys: APIKeys) -> bool:
170
- return get_total_balance(
171
- api_keys.public_key,
172
- # Use `public_key`, not `bet_from_address` because transaction costs are paid from the EOA wallet.
173
- sum_wxdai=False,
174
- ) > xdai_type(0.001)
167
+ return OmenAgentMarket.verify_operational_balance(api_keys=api_keys)
175
168
 
176
169
  @staticmethod
177
170
  def from_data_model(model: SeerMarket) -> "SeerAgentMarket":
@@ -14,9 +14,11 @@ from typing import (
14
14
  overload,
15
15
  )
16
16
 
17
+ import psycopg2
17
18
  from pydantic import BaseModel
18
19
  from sqlalchemy import Column
19
20
  from sqlalchemy.dialects.postgresql import JSONB
21
+ from sqlalchemy.exc import DataError
20
22
  from sqlmodel import Field, SQLModel, desc, select
21
23
 
22
24
  from prediction_market_agent_tooling.config import APIKeys
@@ -50,6 +52,7 @@ def db_cache(
50
52
  api_keys: APIKeys | None = None,
51
53
  ignore_args: Sequence[str] | None = None,
52
54
  ignore_arg_types: Sequence[type] | None = None,
55
+ log_error_on_unsavable_data: bool = True,
53
56
  ) -> Callable[[FunctionT], FunctionT]:
54
57
  ...
55
58
 
@@ -63,6 +66,7 @@ def db_cache(
63
66
  api_keys: APIKeys | None = None,
64
67
  ignore_args: Sequence[str] | None = None,
65
68
  ignore_arg_types: Sequence[type] | None = None,
69
+ log_error_on_unsavable_data: bool = True,
66
70
  ) -> FunctionT:
67
71
  ...
68
72
 
@@ -75,6 +79,7 @@ def db_cache(
75
79
  api_keys: APIKeys | None = None,
76
80
  ignore_args: Sequence[str] | None = None,
77
81
  ignore_arg_types: Sequence[type] | None = None,
82
+ log_error_on_unsavable_data: bool = True,
78
83
  ) -> FunctionT | Callable[[FunctionT], FunctionT]:
79
84
  if func is None:
80
85
  # Ugly Pythonic way to support this decorator as `@postgres_cache` but also `@postgres_cache(max_age=timedelta(days=3))`
@@ -200,12 +205,22 @@ def db_cache(
200
205
  result=computed_result,
201
206
  created_at=utcnow(),
202
207
  )
203
- with DBManager(
204
- api_keys.sqlalchemy_db_url.get_secret_value()
205
- ).get_session() as session:
206
- logger.info(f"Saving {cache_entry} into database.")
207
- session.add(cache_entry)
208
- session.commit()
208
+ # Do not raise an exception if saving to the database fails, just log it and let the agent continue the work.
209
+ try:
210
+ with DBManager(
211
+ api_keys.sqlalchemy_db_url.get_secret_value()
212
+ ).get_session() as session:
213
+ logger.info(f"Saving {cache_entry} into database.")
214
+ session.add(cache_entry)
215
+ session.commit()
216
+ except (DataError, psycopg2.errors.UntranslatableCharacter) as e:
217
+ (logger.error if log_error_on_unsavable_data else logger.warning)(
218
+ f"Failed to save {cache_entry} into database, ignoring, because: {e}"
219
+ )
220
+ except Exception:
221
+ logger.exception(
222
+ f"Failed to save {cache_entry} into database, ignoring."
223
+ )
209
224
 
210
225
  return computed_result
211
226
 
@@ -336,6 +336,7 @@ class ContractERC4626BaseClass(ContractERC20BaseClass):
336
336
  tx_params: t.Optional[TxParams] = None,
337
337
  web3: Web3 | None = None,
338
338
  ) -> TxReceipt:
339
+ # assets_wei is the amount of assets (underlying erc20 token amount) we want to withdraw.
339
340
  receiver = receiver or api_keys.bet_from_address
340
341
  owner = owner or api_keys.bet_from_address
341
342
  return self.send(
@@ -346,6 +347,13 @@ class ContractERC4626BaseClass(ContractERC20BaseClass):
346
347
  web3=web3,
347
348
  )
348
349
 
350
+ def withdraw_in_shares(
351
+ self, api_keys: APIKeys, shares_wei: Wei, web3: Web3 | None = None
352
+ ) -> TxReceipt:
353
+ # shares_wei is the amount of shares we want to withdraw.
354
+ assets = self.convertToAssets(shares_wei, web3=web3)
355
+ return self.withdraw(api_keys=api_keys, assets_wei=assets, web3=web3)
356
+
349
357
  def convertToShares(self, assets: Wei, web3: Web3 | None = None) -> Wei:
350
358
  shares: Wei = self.call("convertToShares", [assets], web3=web3)
351
359
  return shares
@@ -14,7 +14,11 @@ from prediction_market_agent_tooling.tools.tavily.tavily_models import (
14
14
  DEFAULT_SCORE_THRESHOLD = 0.75 # Based on some empirical testing, anything lower wasn't very relevant to the question being asked
15
15
 
16
16
 
17
- @db_cache(max_age=timedelta(days=1), ignore_args=["api_keys"])
17
+ @db_cache(
18
+ max_age=timedelta(days=1),
19
+ ignore_args=["api_keys"],
20
+ log_error_on_unsavable_data=False,
21
+ )
18
22
  def tavily_search(
19
23
  query: str,
20
24
  search_depth: t.Literal["basic", "advanced"] = "advanced",
@@ -53,7 +53,7 @@ def auto_withdraw_collateral_token(
53
53
  logger.info(
54
54
  f"Withdrawing {wei_to_xdai(amount_wei)} from {collateral_token_contract.symbol_cached(web3)} into {KEEPING_ERC20_TOKEN.symbol_cached(web3)}"
55
55
  )
56
- collateral_token_contract.withdraw(
56
+ collateral_token_contract.withdraw_in_shares(
57
57
  api_keys,
58
58
  amount_wei,
59
59
  web3=web3,
@@ -9,7 +9,7 @@ from prediction_market_agent_tooling.tools.contract import (
9
9
  # except for a small portion that will be kept in the native token of the network to pay for the fees.
10
10
  # Auto deposit must work from native token into this token.
11
11
  # If changed, then keep in mind that we assume this token is equal to 1 USD.
12
- # Also if changed, `withdraw_wxdai_to_xdai_to_keep_balance` will require update.
12
+ # Also if changed, `send_keeping_token_to_eoa_xdai` will require update.
13
13
  KEEPING_ERC20_TOKEN = ContractDepositableWrapperERC20OnGnosisChain(
14
14
  address=WRAPPED_XDAI_CONTRACT_ADDRESS
15
15
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.60.0.dev412
3
+ Version: 0.60.1
4
4
  Summary: Tools to benchmark, deploy and monitor prediction market agents.
5
5
  Author: Gnosis
6
6
  Requires-Python: >=3.10,<3.13
@@ -20,8 +20,8 @@ prediction_market_agent_tooling/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-
20
20
  prediction_market_agent_tooling/benchmark/agents.py,sha256=B1-uWdyeN4GGKMWGK_-CcAFJg1m9Y_XuaeIHPB29QR8,3971
21
21
  prediction_market_agent_tooling/benchmark/benchmark.py,sha256=MqTiaaJ3cYiOLUVR7OyImLWxcEya3Rl5JyFYW-K0lwM,17097
22
22
  prediction_market_agent_tooling/benchmark/utils.py,sha256=D0MfUkVZllmvcU0VOurk9tcKT7JTtwwOp-63zuCBVuc,2880
23
- prediction_market_agent_tooling/config.py,sha256=owJ3goDbH1aeX8PzeJCeGK5pitYJqqk7yFOkaTbDarY,9209
24
- prediction_market_agent_tooling/deploy/agent.py,sha256=rvBPubAjZu9WACayT4q4ERxINOayBJte9ZPi7yFlnNQ,24872
23
+ prediction_market_agent_tooling/config.py,sha256=hiZc_A6q7-_kHW2OdavHNBjNrCpxIEqaklfIf0TFyy0,9499
24
+ prediction_market_agent_tooling/deploy/agent.py,sha256=TRQ5F-b3NA6zVn6tJBlXl_ZDI73b4q7WPZCMxFxzTtE,24847
25
25
  prediction_market_agent_tooling/deploy/agent_example.py,sha256=dIIdZashExWk9tOdyDjw87AuUcGyM7jYxNChYrVK2dM,1001
26
26
  prediction_market_agent_tooling/deploy/betting_strategy.py,sha256=Y6Pb8OfSb6galRbfdNBvvNTgO-4dR2ybJ4o5GKJcMoM,12894
27
27
  prediction_market_agent_tooling/deploy/constants.py,sha256=M5ty8URipYMGe_G-RzxRydK3AFL6CyvmqCraJUrLBnE,82
@@ -51,18 +51,18 @@ prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=FaBCTPPe
51
51
  prediction_market_agent_tooling/markets/metaculus/metaculus.py,sha256=86TIx6cavEWc8Cv4KpZxSvwiSw9oFybXE3YB49pg-CA,4377
52
52
  prediction_market_agent_tooling/markets/omen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  prediction_market_agent_tooling/markets/omen/data_models.py,sha256=sfaOpNk6oFIzxYQzs9EehqAT_19IxYJy9pns-UTepOc,28934
54
- prediction_market_agent_tooling/markets/omen/omen.py,sha256=nJGjVHKKWvrVtTRwLLdpZoOIpk9vuEtypl238nazO9c,51623
54
+ prediction_market_agent_tooling/markets/omen/omen.py,sha256=ZLKa0X5hSQucqcqIyuwUM_NzHuAlbLZzUPSqSQBUscE,53213
55
55
  prediction_market_agent_tooling/markets/omen/omen_constants.py,sha256=D9oflYKafLQiHYtB5sScMHqmXyzM8JP8J0yATmc4SQQ,233
56
56
  prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=EXqBlVivbmW8aBQ65O09X2xkyesHAop49GUl1tUffWA,28648
57
- prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=E1BVDvQd1qYtCxmfC94kJtGkmQqpGPHL3zTkcs5wW6M,9697
58
- prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=mZ0CgKfHj0gLFq9plNpBhNqMuclb8V3qNagWfLYcpUc,38806
57
+ prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=dMxnPK2DF3aL4oZkBkbxwTcU7EMmi1vnTm0oC5d91yY,9781
58
+ prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=dQyz1RR1MlQncb1Slq7tk1Maql-sbb5YYE_sDe26MYA,38711
59
59
  prediction_market_agent_tooling/markets/polymarket/api.py,sha256=UZ4_TG8ceb9Y-qgsOKs8Qiv8zDt957QkT8IX2c83yqo,4800
60
60
  prediction_market_agent_tooling/markets/polymarket/data_models.py,sha256=Fd5PI5y3mJM8VHExBhWFWEnuuIKxQmIAXgBuoPDvNjw,4341
61
61
  prediction_market_agent_tooling/markets/polymarket/data_models_web.py,sha256=VZhVccTApygSKMmy6Au2G02JCJOKJnR_oVeKlaesuSg,12548
62
62
  prediction_market_agent_tooling/markets/polymarket/polymarket.py,sha256=NRoZK71PtH8kkangMqme7twcAXhRJSSabbmOir-UnAI,3418
63
63
  prediction_market_agent_tooling/markets/polymarket/utils.py,sha256=DImFxeMg8lTfsEDZ8FavndW38TfUsCkawcVGnucsuGo,2029
64
64
  prediction_market_agent_tooling/markets/seer/data_models.py,sha256=HGJv4XSvCxXLLC5VwxZTZ5E4w_bWGKv50fM_6ssloxI,8203
65
- prediction_market_agent_tooling/markets/seer/seer.py,sha256=M3RN3ZlLduFJvhk_0KTZDkX94z_HKhFOIK7BwLSGauM,13145
65
+ prediction_market_agent_tooling/markets/seer/seer.py,sha256=r21sXj_4_oIG2L1N5l56vEYGI_q2RGem_6G-Sixkbck,12954
66
66
  prediction_market_agent_tooling/markets/seer/seer_contracts.py,sha256=E7CYAKZiK6cg3dyj1kJuIPKSYYUft98F64shF5S0g4s,2730
67
67
  prediction_market_agent_tooling/markets/seer/seer_subgraph_handler.py,sha256=aycOvJ1_f5m7xzd_Hlx98_-VeM869IY9mTzJ2zn_VEM,8577
68
68
  prediction_market_agent_tooling/monitor/financial_metrics/financial_metrics.py,sha256=fjIgjDIx5MhH5mwf7S0cspLOOSU3elYLhGYoIiM26mU,2746
@@ -80,10 +80,10 @@ prediction_market_agent_tooling/tools/betting_strategies/market_moving.py,sha256
80
80
  prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py,sha256=-FUSuQQgjcWSSnoFxnlAyTeilY6raJABJVM2QKkFqAY,438
81
81
  prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py,sha256=THMXwFlskvzbjnX_OiYtDSzI8XVFyULWfP2525_9UGc,429
82
82
  prediction_market_agent_tooling/tools/betting_strategies/utils.py,sha256=kpIb-ci67Vc1Yqqaa-_S4OUkbhWSIYog4_Iwp69HU_k,97
83
- prediction_market_agent_tooling/tools/caches/db_cache.py,sha256=aafau_n_AUbLIwkyIRiTPgKB0dmM0767mSqyPDLF2A4,10576
83
+ prediction_market_agent_tooling/tools/caches/db_cache.py,sha256=j8ULI7z0BDaKg16Vua1UbhrIKEjqpa8800haYPQaF9w,11358
84
84
  prediction_market_agent_tooling/tools/caches/inmemory_cache.py,sha256=ZW5iI5rmjqeAebu5T7ftRnlkxiL02IC-MxCfDB80x7w,1506
85
85
  prediction_market_agent_tooling/tools/caches/serializers.py,sha256=vFDx4fsPxclXp2q0sv27j4al_M_Tj9aR2JJP-xNHQXA,2151
86
- prediction_market_agent_tooling/tools/contract.py,sha256=gmSuANqlfwldFG7hc4uom0q1Z-mo40qfYh5TDUKLFTs,20518
86
+ prediction_market_agent_tooling/tools/contract.py,sha256=BCl3R-n5jpp5XPAho9yTuUxRbOoKbZSga1Qaa4RfAp8,20945
87
87
  prediction_market_agent_tooling/tools/costs.py,sha256=EaAJ7v9laD4VEV3d8B44M4u3_oEO_H16jRVCdoZ93Uw,954
88
88
  prediction_market_agent_tooling/tools/cow/cow_manager.py,sha256=WK6Uk722VotjLHtxDPHxvwBrWVb3rvTegg_3w58ehwU,3869
89
89
  prediction_market_agent_tooling/tools/cow/cow_order.py,sha256=M3zQohgAzy_LETnf9rKtS1L9rr7FP92CH6v0G2laZkM,4435
@@ -110,15 +110,15 @@ prediction_market_agent_tooling/tools/safe.py,sha256=9vxGGLvSPnfy-sxUFDpBTe8omqp
110
110
  prediction_market_agent_tooling/tools/singleton.py,sha256=CiIELUiI-OeS7U7eeHEt0rnVhtQGzwoUdAgn_7u_GBM,729
111
111
  prediction_market_agent_tooling/tools/streamlit_user_login.py,sha256=NXEqfjT9Lc9QtliwSGRASIz1opjQ7Btme43H4qJbzgE,3010
112
112
  prediction_market_agent_tooling/tools/tavily/tavily_models.py,sha256=5ldQs1pZe6uJ5eDAuP4OLpzmcqYShlIV67kttNFvGS0,342
113
- prediction_market_agent_tooling/tools/tavily/tavily_search.py,sha256=Kw2mXNkMTYTEe1MBSTqhQmLoeXtgb6CkmHlcAJvhtqE,3809
113
+ prediction_market_agent_tooling/tools/tavily/tavily_search.py,sha256=pPs0qZNfJ7G-1ajfz0iaWOBQyiC0TbcShfrW8T39jtg,3859
114
114
  prediction_market_agent_tooling/tools/tokens/auto_deposit.py,sha256=o8_ERfPL-ps9FLvH5vgdiSRJQ4dZONJw9KK9sHgeP2I,6390
115
- prediction_market_agent_tooling/tools/tokens/auto_withdraw.py,sha256=gOvfZlrw6hdpYquGKLjMw-YpjAvWHnyGa-ke0Z6GIzU,3150
116
- prediction_market_agent_tooling/tools/tokens/main_token.py,sha256=v5PfD2m9m92bJpK-k8ww6yDO7dwpchFtQ1BJRgi8rhs,714
115
+ prediction_market_agent_tooling/tools/tokens/auto_withdraw.py,sha256=25Y0H1p0hSD3gWShKPcJ5BckQc3nr_hOAvImOFODC0w,3160
116
+ prediction_market_agent_tooling/tools/tokens/main_token.py,sha256=SWkoa2VYEoNBWR5Umraa2g-LEAwQB252fQJ28oI49pI,706
117
117
  prediction_market_agent_tooling/tools/transaction_cache.py,sha256=K5YKNL2_tR10Iw2TD9fuP-CTGpBbZtNdgbd0B_R7pjg,1814
118
118
  prediction_market_agent_tooling/tools/utils.py,sha256=jLG4nbEoIzzJiZ4RgMx4Q969Zdl0p0s63p8uET_0Fuw,6440
119
119
  prediction_market_agent_tooling/tools/web3_utils.py,sha256=2PXZfGRrDVZD60agVpBN4JkOF0YsNBXgTEH1y-V71uQ,12723
120
- prediction_market_agent_tooling-0.60.0.dev412.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
121
- prediction_market_agent_tooling-0.60.0.dev412.dist-info/METADATA,sha256=kiOirsx9mYgxdTE6mjOqPK6LgKK6QdkUK6rX8LtTBJM,8636
122
- prediction_market_agent_tooling-0.60.0.dev412.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
123
- prediction_market_agent_tooling-0.60.0.dev412.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
124
- prediction_market_agent_tooling-0.60.0.dev412.dist-info/RECORD,,
120
+ prediction_market_agent_tooling-0.60.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
121
+ prediction_market_agent_tooling-0.60.1.dist-info/METADATA,sha256=UAGTKEHQz1wnZiLPHWxxgHTPoQK75ouA578h__WZ9S0,8629
122
+ prediction_market_agent_tooling-0.60.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
123
+ prediction_market_agent_tooling-0.60.1.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
124
+ prediction_market_agent_tooling-0.60.1.dist-info/RECORD,,