prediction-market-agent-tooling 0.38.0__tar.gz → 0.39.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/PKG-INFO +2 -2
  2. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/agent_market.py +21 -0
  3. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/omen.py +61 -0
  4. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py +6 -0
  5. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/pyproject.toml +2 -2
  6. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/LICENSE +0 -0
  7. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/README.md +0 -0
  8. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/erc20.abi.json +0 -0
  9. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_dxdao.abi.json +0 -0
  10. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_fpmm.abi.json +0 -0
  11. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_fpmm_conditionaltokens.abi.json +0 -0
  12. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_fpmm_factory.abi.json +0 -0
  13. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_kleros.abi.json +0 -0
  14. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_oracle.abi.json +0 -0
  15. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_realitio.abi.json +0 -0
  16. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/omen_thumbnailmapping.abi.json +0 -0
  17. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/abis/wxdai.abi.json +0 -0
  18. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/benchmark/__init__.py +0 -0
  19. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/benchmark/agents.py +0 -0
  20. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/benchmark/benchmark.py +0 -0
  21. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/benchmark/utils.py +0 -0
  22. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/config.py +0 -0
  23. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/agent.py +0 -0
  24. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/agent_example.py +0 -0
  25. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/constants.py +0 -0
  26. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/gcp/deploy.py +0 -0
  27. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/gcp/kubernetes_models.py +0 -0
  28. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/deploy/gcp/utils.py +0 -0
  29. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/gtypes.py +0 -0
  30. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/loggers.py +0 -0
  31. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/categorize.py +0 -0
  32. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/data_models.py +0 -0
  33. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/manifold/__init__.py +0 -0
  34. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/manifold/api.py +0 -0
  35. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/manifold/data_models.py +0 -0
  36. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/manifold/manifold.py +0 -0
  37. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/manifold/utils.py +0 -0
  38. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/markets.py +0 -0
  39. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/__init__.py +0 -0
  40. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/data_models.py +0 -0
  41. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/omen_contracts.py +0 -0
  42. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/omen/omen_resolving.py +0 -0
  43. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/polymarket/api.py +0 -0
  44. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/polymarket/data_models.py +0 -0
  45. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/polymarket/data_models_web.py +0 -0
  46. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/polymarket/polymarket.py +0 -0
  47. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/markets/polymarket/utils.py +0 -0
  48. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/langfuse/langfuse_wrapper.py +0 -0
  49. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/markets/manifold.py +0 -0
  50. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/markets/omen.py +0 -0
  51. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/markets/polymarket.py +0 -0
  52. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/monitor.py +0 -0
  53. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/monitor_app.py +0 -0
  54. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/monitor/monitor_settings.py +0 -0
  55. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/py.typed +0 -0
  56. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/balances.py +0 -0
  57. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/betting_strategies/kelly_criterion.py +0 -0
  58. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/betting_strategies/market_moving.py +0 -0
  59. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py +0 -0
  60. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py +0 -0
  61. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/cache.py +0 -0
  62. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/contract.py +0 -0
  63. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/costs.py +0 -0
  64. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/gnosis_rpc.py +0 -0
  65. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/google.py +0 -0
  66. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/hexbytes_custom.py +0 -0
  67. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/image_gen/image_gen.py +0 -0
  68. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/image_gen/market_thumbnail_gen.py +0 -0
  69. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/is_predictable.py +0 -0
  70. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/parallelism.py +0 -0
  71. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/safe.py +0 -0
  72. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/singleton.py +0 -0
  73. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/streamlit_user_login.py +0 -0
  74. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/utils.py +0 -0
  75. {prediction_market_agent_tooling-0.38.0 → prediction_market_agent_tooling-0.39.1}/prediction_market_agent_tooling/tools/web3_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.38.0
3
+ Version: 0.39.1
4
4
  Summary: Tools to benchmark, deploy and monitor prediction market agents.
5
5
  Author: Gnosis
6
6
  Requires-Python: >=3.10,<3.12
@@ -35,7 +35,7 @@ Requires-Dist: safe-cli (>=1.0.0,<2.0.0)
35
35
  Requires-Dist: safe-eth-py (>=6.0.0b14,<7.0.0)
36
36
  Requires-Dist: scikit-learn (>=1.3.1,<2.0.0)
37
37
  Requires-Dist: streamlit (>=1.31.0,<2.0.0)
38
- Requires-Dist: subgrounds (>=1.8.1,<2.0.0)
38
+ Requires-Dist: subgrounds (>=1.9.1,<2.0.0)
39
39
  Requires-Dist: tabulate (>=0.9.0,<0.10.0)
40
40
  Requires-Dist: tqdm (>=4.66.2,<5.0.0)
41
41
  Requires-Dist: typer (>=0.9.0,<1.0.0)
@@ -114,6 +114,20 @@ class AgentMarket(BaseModel):
114
114
  """
115
115
  raise NotImplementedError("Subclasses must implement this method")
116
116
 
117
+ def get_last_trade_yes_outcome_price(self) -> float | None:
118
+ # Price on prediction markets are, by definition, equal to the probability of an outcome.
119
+ # Just making it explicit in this function.
120
+ if last_trade_p_yes := self.get_last_trade_p_yes():
121
+ return float(last_trade_p_yes)
122
+ return None
123
+
124
+ def get_last_trade_no_outcome_price(self) -> float | None:
125
+ # Price on prediction markets are, by definition, equal to the probability of an outcome.
126
+ # Just making it explicit in this function.
127
+ if last_trade_p_no := self.get_last_trade_p_no():
128
+ return float(last_trade_p_no)
129
+ return None
130
+
117
131
  def get_bet_amount(self, amount: float) -> BetAmount:
118
132
  return BetAmount(amount=amount, currency=self.currency)
119
133
 
@@ -193,6 +207,13 @@ class AgentMarket(BaseModel):
193
207
  """
194
208
  raise NotImplementedError("Subclasses must implement this method")
195
209
 
210
+ @classmethod
211
+ def get_positions_value(cls, positions: list[Position]) -> BetAmount:
212
+ """
213
+ Get the total value of all positions held by a user.
214
+ """
215
+ raise NotImplementedError("Subclasses must implement this method")
216
+
196
217
  def can_be_traded(self) -> bool:
197
218
  if self.is_closed() or not self.has_liquidity():
198
219
  return False
@@ -421,6 +421,67 @@ class OmenAgentMarket(AgentMarket):
421
421
 
422
422
  return positions
423
423
 
424
+ @classmethod
425
+ def get_positions_value(cls, positions: list[Position]) -> BetAmount:
426
+ # Two dicts to map from market ids to (1) positions and (2) market.
427
+ market_ids_positions = {p.market_id: p for p in positions}
428
+ # Check there is only one position per market.
429
+ if len(set(market_ids_positions.keys())) != len(positions):
430
+ raise ValueError(
431
+ f"Markets for positions ({market_ids_positions.keys()}) are not unique."
432
+ )
433
+ markets: list[OmenAgentMarket] = [
434
+ OmenAgentMarket.from_data_model(m)
435
+ for m in OmenSubgraphHandler().get_omen_binary_markets(
436
+ limit=sys.maxsize, id_in=list(market_ids_positions.keys())
437
+ )
438
+ ]
439
+ market_ids_markets = {m.id: m for m in markets}
440
+
441
+ # Validate that dict keys are the same.
442
+ if set(market_ids_positions.keys()) != set(market_ids_markets.keys()):
443
+ raise ValueError(
444
+ f"Market ids in {market_ids_positions.keys()} are not the same as in {market_ids_markets.keys()}"
445
+ )
446
+
447
+ # Initialise position value.
448
+ total_position_value = 0.0
449
+
450
+ for market_id in market_ids_positions.keys():
451
+ position = market_ids_positions[market_id]
452
+ market = market_ids_markets[market_id]
453
+
454
+ yes_tokens = 0.0
455
+ no_tokens = 0.0
456
+ if OMEN_TRUE_OUTCOME in position.amounts:
457
+ yes_tokens = position.amounts[OutcomeStr(OMEN_TRUE_OUTCOME)].amount
458
+ if OMEN_FALSE_OUTCOME in position.amounts:
459
+ no_tokens = position.amounts[OutcomeStr(OMEN_FALSE_OUTCOME)].amount
460
+
461
+ # Account for the value of positions in resolved markets
462
+ if market.is_resolved() and market.has_successful_resolution():
463
+ valued_tokens = yes_tokens if market.boolean_outcome else no_tokens
464
+ total_position_value += valued_tokens
465
+
466
+ # Or if the market is open and trading, get the value of the position
467
+ elif market.can_be_traded():
468
+ total_position_value += yes_tokens * market.yes_outcome_price
469
+ total_position_value += no_tokens * market.no_outcome_price
470
+
471
+ # Or if the market is still open but not trading, estimate the value
472
+ # of the position
473
+ else:
474
+ if yes_tokens:
475
+ yes_price = check_not_none(
476
+ market.get_last_trade_yes_outcome_price()
477
+ )
478
+ total_position_value += yes_tokens * yes_price
479
+ if no_tokens:
480
+ no_price = check_not_none(market.get_last_trade_no_outcome_price())
481
+ total_position_value += no_tokens * no_price
482
+
483
+ return BetAmount(amount=total_position_value, currency=Currency.xDai)
484
+
424
485
  @classmethod
425
486
  def get_user_url(cls, keys: APIKeys) -> str:
426
487
  return f"https://gnosisscan.io/address/{keys.bet_from_address}"
@@ -166,6 +166,7 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
166
166
  resolved: bool | None = None,
167
167
  liquidity_bigger_than: Wei | None = None,
168
168
  condition_id_in: list[HexBytes] | None = None,
169
+ id_in: list[str] | None = None,
169
170
  excluded_questions: set[str] | None = None,
170
171
  ) -> dict[str, t.Any]:
171
172
  where_stms: dict[str, t.Any] = {
@@ -193,6 +194,9 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
193
194
  if condition_id_in is not None:
194
195
  where_stms["condition_"]["id_in"] = [x.hex() for x in condition_id_in]
195
196
 
197
+ if id_in is not None:
198
+ where_stms["id_in"] = id_in
199
+
196
200
  if resolved is not None:
197
201
  if resolved:
198
202
  where_stms["resolutionTimestamp_not"] = None
@@ -308,6 +312,7 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
308
312
  creator: t.Optional[HexAddress] = None,
309
313
  liquidity_bigger_than: Wei | None = None,
310
314
  condition_id_in: list[HexBytes] | None = None,
315
+ id_in: list[str] | None = None,
311
316
  excluded_questions: set[str] | None = None, # question titles
312
317
  sort_by_field: FieldPath | None = None,
313
318
  sort_direction: str | None = None,
@@ -326,6 +331,7 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
326
331
  finalized=finalized,
327
332
  resolved=resolved,
328
333
  condition_id_in=condition_id_in,
334
+ id_in=id_in,
329
335
  excluded_questions=excluded_questions,
330
336
  liquidity_bigger_than=liquidity_bigger_than,
331
337
  )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "prediction-market-agent-tooling"
3
- version = "0.38.0"
3
+ version = "0.39.1"
4
4
  description = "Tools to benchmark, deploy and monitor prediction market agents."
5
5
  authors = ["Gnosis"]
6
6
  readme = "README.md"
@@ -34,7 +34,7 @@ google-cloud-secret-manager = "^2.18.2"
34
34
  langchain = { version = "^0.1.9", optional = true}
35
35
  langchain-openai = { version = "^0.0.5", optional = true}
36
36
  google-api-python-client = { version = "2.95.0", optional = true}
37
- subgrounds = "^1.8.1"
37
+ subgrounds = "^1.9.1"
38
38
  loguru = "^0.7.2"
39
39
  safe-eth-py = "^6.0.0b14"
40
40
  eth-account = "^0.8.0"