prediction-market-agent-tooling 0.66.0.dev789__py3-none-any.whl → 0.66.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.
- prediction_market_agent_tooling/deploy/agent.py +2 -1
- prediction_market_agent_tooling/markets/data_models.py +15 -4
- prediction_market_agent_tooling/markets/metaculus/data_models.py +3 -3
- prediction_market_agent_tooling/markets/omen/cow_contracts.py +5 -1
- prediction_market_agent_tooling/markets/omen/data_models.py +4 -2
- prediction_market_agent_tooling/markets/omen/omen_constants.py +5 -0
- prediction_market_agent_tooling/markets/seer/seer.py +19 -13
- prediction_market_agent_tooling/tools/cow/cow_order.py +14 -6
- prediction_market_agent_tooling/tools/cow/models.py +8 -0
- prediction_market_agent_tooling/tools/cow/semaphore.py +101 -0
- {prediction_market_agent_tooling-0.66.0.dev789.dist-info → prediction_market_agent_tooling-0.66.1.dist-info}/METADATA +2 -2
- {prediction_market_agent_tooling-0.66.0.dev789.dist-info → prediction_market_agent_tooling-0.66.1.dist-info}/RECORD +15 -14
- {prediction_market_agent_tooling-0.66.0.dev789.dist-info → prediction_market_agent_tooling-0.66.1.dist-info}/LICENSE +0 -0
- {prediction_market_agent_tooling-0.66.0.dev789.dist-info → prediction_market_agent_tooling-0.66.1.dist-info}/WHEEL +0 -0
- {prediction_market_agent_tooling-0.66.0.dev789.dist-info → prediction_market_agent_tooling-0.66.1.dist-info}/entry_points.txt +0 -0
@@ -373,7 +373,8 @@ class DeployablePredictionAgent(DeployableAgent):
|
|
373
373
|
binary_answer = self.answer_binary_market(market)
|
374
374
|
return (
|
375
375
|
CategoricalProbabilisticAnswer.from_probabilistic_answer(
|
376
|
-
binary_answer
|
376
|
+
binary_answer,
|
377
|
+
market.outcomes,
|
377
378
|
)
|
378
379
|
if binary_answer is not None
|
379
380
|
else None
|
@@ -15,6 +15,10 @@ from prediction_market_agent_tooling.gtypes import (
|
|
15
15
|
Probability,
|
16
16
|
)
|
17
17
|
from prediction_market_agent_tooling.logprobs_parser import FieldLogprobs
|
18
|
+
from prediction_market_agent_tooling.markets.omen.omen_constants import (
|
19
|
+
OMEN_FALSE_OUTCOME,
|
20
|
+
OMEN_TRUE_OUTCOME,
|
21
|
+
)
|
18
22
|
from prediction_market_agent_tooling.tools.utils import DatetimeUTC, check_not_none
|
19
23
|
|
20
24
|
|
@@ -142,13 +146,20 @@ class CategoricalProbabilisticAnswer(BaseModel):
|
|
142
146
|
@staticmethod
|
143
147
|
def from_probabilistic_answer(
|
144
148
|
answer: ProbabilisticAnswer,
|
149
|
+
market_outcomes: Sequence[OutcomeStr] | None = None,
|
145
150
|
) -> "CategoricalProbabilisticAnswer":
|
146
151
|
return CategoricalProbabilisticAnswer(
|
147
152
|
probabilities={
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
153
|
+
(
|
154
|
+
OMEN_TRUE_OUTCOME
|
155
|
+
if market_outcomes and OMEN_TRUE_OUTCOME in market_outcomes
|
156
|
+
else OutcomeStr(YES_OUTCOME_LOWERCASE_IDENTIFIER)
|
157
|
+
): answer.p_yes,
|
158
|
+
(
|
159
|
+
OMEN_FALSE_OUTCOME
|
160
|
+
if market_outcomes and OMEN_FALSE_OUTCOME in market_outcomes
|
161
|
+
else OutcomeStr(NO_OUTCOME_LOWERCASE_IDENTIFIER)
|
162
|
+
): Probability(1 - answer.p_yes),
|
152
163
|
},
|
153
164
|
confidence=answer.confidence,
|
154
165
|
reasoning=answer.reasoning,
|
@@ -14,13 +14,13 @@ class QuestionType(str, Enum):
|
|
14
14
|
class AggregationItem(BaseModel):
|
15
15
|
start_time: DatetimeUTC
|
16
16
|
end_time: DatetimeUTC | None
|
17
|
-
forecast_values: list[float] | None
|
17
|
+
forecast_values: list[float] | None = None
|
18
18
|
forecaster_count: int
|
19
19
|
interval_lower_bounds: list[float] | None
|
20
20
|
centers: list[float] | None
|
21
21
|
interval_upper_bounds: list[float] | None
|
22
|
-
means: list[float] | None
|
23
|
-
histogram: list[list[float]] | None
|
22
|
+
means: list[float] | None = None
|
23
|
+
histogram: list[list[float]] | None = None
|
24
24
|
|
25
25
|
|
26
26
|
class Aggregation(BaseModel):
|
@@ -3,7 +3,7 @@ import os
|
|
3
3
|
from web3 import Web3
|
4
4
|
|
5
5
|
from prediction_market_agent_tooling.config import APIKeys
|
6
|
-
from prediction_market_agent_tooling.gtypes import ABI, HexBytes
|
6
|
+
from prediction_market_agent_tooling.gtypes import ABI, ChecksumAddress, HexBytes
|
7
7
|
from prediction_market_agent_tooling.tools.contract import (
|
8
8
|
ContractOnGnosisChain,
|
9
9
|
abi_field_validator,
|
@@ -19,6 +19,10 @@ class CowGPv2SettlementContract(ContractOnGnosisChain):
|
|
19
19
|
)
|
20
20
|
)
|
21
21
|
|
22
|
+
address: ChecksumAddress = Web3.to_checksum_address(
|
23
|
+
"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"
|
24
|
+
)
|
25
|
+
|
22
26
|
def setPreSignature(
|
23
27
|
self,
|
24
28
|
api_keys: APIKeys,
|
@@ -23,6 +23,10 @@ from prediction_market_agent_tooling.markets.data_models import (
|
|
23
23
|
Resolution,
|
24
24
|
ResolvedBet,
|
25
25
|
)
|
26
|
+
from prediction_market_agent_tooling.markets.omen.omen_constants import (
|
27
|
+
OMEN_FALSE_OUTCOME,
|
28
|
+
OMEN_TRUE_OUTCOME,
|
29
|
+
)
|
26
30
|
from prediction_market_agent_tooling.tools.contract import (
|
27
31
|
ContractERC20OnGnosisChain,
|
28
32
|
init_collateral_token_contract,
|
@@ -37,8 +41,6 @@ from prediction_market_agent_tooling.tools.utils import (
|
|
37
41
|
utcnow,
|
38
42
|
)
|
39
43
|
|
40
|
-
OMEN_TRUE_OUTCOME = OutcomeStr("Yes")
|
41
|
-
OMEN_FALSE_OUTCOME = OutcomeStr("No")
|
42
44
|
OMEN_BINARY_MARKET_OUTCOMES: t.Sequence[OutcomeStr] = [
|
43
45
|
OMEN_TRUE_OUTCOME,
|
44
46
|
OMEN_FALSE_OUTCOME,
|
@@ -1,5 +1,10 @@
|
|
1
1
|
from web3 import Web3
|
2
2
|
|
3
|
+
from prediction_market_agent_tooling.gtypes import OutcomeStr
|
4
|
+
|
5
|
+
OMEN_TRUE_OUTCOME = OutcomeStr("Yes")
|
6
|
+
OMEN_FALSE_OUTCOME = OutcomeStr("No")
|
7
|
+
|
3
8
|
WRAPPED_XDAI_CONTRACT_ADDRESS = Web3.to_checksum_address(
|
4
9
|
"0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"
|
5
10
|
)
|
@@ -2,6 +2,7 @@ import asyncio
|
|
2
2
|
import typing as t
|
3
3
|
from datetime import timedelta
|
4
4
|
|
5
|
+
from cowdao_cowpy.common.api.errors import UnexpectedResponseError
|
5
6
|
from eth_typing import ChecksumAddress
|
6
7
|
from web3 import Web3
|
7
8
|
from web3.types import TxReceipt
|
@@ -61,7 +62,6 @@ from prediction_market_agent_tooling.tools.contract import (
|
|
61
62
|
to_gnosis_chain_contract,
|
62
63
|
)
|
63
64
|
from prediction_market_agent_tooling.tools.cow.cow_order import (
|
64
|
-
cancel_order,
|
65
65
|
get_buy_token_amount_else_raise,
|
66
66
|
get_orders_by_owner,
|
67
67
|
get_trades_by_owner,
|
@@ -481,26 +481,32 @@ class SeerAgentMarket(AgentMarket):
|
|
481
481
|
Returns:
|
482
482
|
Transaction hash of the successful swap
|
483
483
|
"""
|
484
|
-
_, order = swap_tokens_waiting(
|
485
|
-
amount_wei=amount_wei,
|
486
|
-
sell_token=sell_token,
|
487
|
-
buy_token=buy_token,
|
488
|
-
api_keys=api_keys,
|
489
|
-
web3=web3,
|
490
|
-
wait_order_complete=False,
|
491
|
-
)
|
492
484
|
|
493
485
|
try:
|
486
|
+
_, order = swap_tokens_waiting(
|
487
|
+
amount_wei=amount_wei,
|
488
|
+
sell_token=sell_token,
|
489
|
+
buy_token=buy_token,
|
490
|
+
api_keys=api_keys,
|
491
|
+
web3=web3,
|
492
|
+
wait_order_complete=False,
|
493
|
+
timeout=timedelta(minutes=2),
|
494
|
+
)
|
494
495
|
order_metadata = asyncio.run(wait_for_order_completion(order=order))
|
495
496
|
logger.debug(
|
496
497
|
f"Swapped {sell_token} for {buy_token}. Order details {order_metadata}"
|
497
498
|
)
|
498
499
|
return order_metadata.uid.root
|
499
500
|
|
500
|
-
except TimeoutError:
|
501
|
-
#
|
502
|
-
|
503
|
-
|
501
|
+
except (UnexpectedResponseError, TimeoutError) as e:
|
502
|
+
# We don't retry if not enough balance.
|
503
|
+
if "InsufficientBalance" in str(e):
|
504
|
+
raise e
|
505
|
+
# Note that we don't need to cancel the order because we are setting
|
506
|
+
# timeout and valid_to in the order, thus the order simply expires.
|
507
|
+
logger.info(
|
508
|
+
f"Exception occured when swapping tokens via Cowswap, doing swap via pools. {e}"
|
509
|
+
)
|
504
510
|
|
505
511
|
tx_receipt = SwapPoolHandler(
|
506
512
|
api_keys=api_keys,
|
@@ -55,7 +55,8 @@ from prediction_market_agent_tooling.markets.omen.cow_contracts import (
|
|
55
55
|
)
|
56
56
|
from prediction_market_agent_tooling.tools.contract import ContractERC20OnGnosisChain
|
57
57
|
from prediction_market_agent_tooling.tools.cow.models import MinimalisticToken, Order
|
58
|
-
from prediction_market_agent_tooling.tools.
|
58
|
+
from prediction_market_agent_tooling.tools.cow.semaphore import postgres_rate_limited
|
59
|
+
from prediction_market_agent_tooling.tools.utils import utcnow
|
59
60
|
|
60
61
|
|
61
62
|
class OrderStatusError(Exception):
|
@@ -190,7 +191,11 @@ def handle_allowance(
|
|
190
191
|
)
|
191
192
|
|
192
193
|
|
194
|
+
@postgres_rate_limited(
|
195
|
+
api_keys=APIKeys(), rate_id="swap_tokens_waiting", interval_seconds=60.0
|
196
|
+
)
|
193
197
|
@tenacity.retry(
|
198
|
+
reraise=True,
|
194
199
|
stop=stop_after_attempt(3),
|
195
200
|
wait=wait_fixed(1),
|
196
201
|
retry=tenacity.retry_if_not_exception_type((TimeoutError, OrderStatusError)),
|
@@ -205,6 +210,7 @@ def swap_tokens_waiting(
|
|
205
210
|
env: Envs = "prod",
|
206
211
|
web3: Web3 | None = None,
|
207
212
|
wait_order_complete: bool = True,
|
213
|
+
timeout: timedelta = timedelta(seconds=120),
|
208
214
|
) -> tuple[OrderMetaData | None, CompletedOrder]:
|
209
215
|
# CoW library uses async, so we need to wrap the call in asyncio.run for us to use it.
|
210
216
|
return asyncio.run(
|
@@ -215,6 +221,7 @@ def swap_tokens_waiting(
|
|
215
221
|
api_keys,
|
216
222
|
chain,
|
217
223
|
env,
|
224
|
+
timeout=timeout,
|
218
225
|
web3=web3,
|
219
226
|
wait_order_complete=wait_order_complete,
|
220
227
|
)
|
@@ -229,6 +236,7 @@ async def place_swap_order(
|
|
229
236
|
chain: Chain,
|
230
237
|
env: Envs,
|
231
238
|
slippage_tolerance: float = 0.01,
|
239
|
+
valid_to: int | None = None,
|
232
240
|
) -> CompletedOrder:
|
233
241
|
account = api_keys.get_account()
|
234
242
|
safe_address = api_keys.safe_address_checksum
|
@@ -242,6 +250,7 @@ async def place_swap_order(
|
|
242
250
|
chain=chain,
|
243
251
|
env=env,
|
244
252
|
slippage_tolerance=slippage_tolerance,
|
253
|
+
valid_to=valid_to,
|
245
254
|
)
|
246
255
|
logger.info(f"Order created: {order}")
|
247
256
|
|
@@ -299,6 +308,7 @@ async def swap_tokens_waiting_async(
|
|
299
308
|
handle_allowance(
|
300
309
|
api_keys=api_keys, sell_token=sell_token, amount_wei=amount_wei, web3=web3
|
301
310
|
)
|
311
|
+
valid_to = (utcnow() + timeout).timestamp()
|
302
312
|
order = await place_swap_order(
|
303
313
|
api_keys=api_keys,
|
304
314
|
amount_wei=amount_wei,
|
@@ -307,6 +317,7 @@ async def swap_tokens_waiting_async(
|
|
307
317
|
chain=chain,
|
308
318
|
env=env,
|
309
319
|
slippage_tolerance=slippage_tolerance,
|
320
|
+
valid_to=int(valid_to),
|
310
321
|
)
|
311
322
|
if wait_order_complete:
|
312
323
|
order_metadata = await wait_for_order_completion(order=order, timeout=timeout)
|
@@ -327,11 +338,8 @@ async def sign_safe_cow_swap(
|
|
327
338
|
) -> None:
|
328
339
|
order_book_api = get_order_book_api(env, chain)
|
329
340
|
posted_order = await order_book_api.get_order_by_uid(order.uid)
|
330
|
-
|
331
|
-
|
332
|
-
check_not_none(posted_order.settlementContract).root
|
333
|
-
)
|
334
|
-
).setPreSignature(
|
341
|
+
|
342
|
+
CowGPv2SettlementContract().setPreSignature(
|
335
343
|
api_keys,
|
336
344
|
HexBytes(posted_order.uid.root),
|
337
345
|
True,
|
@@ -1,7 +1,9 @@
|
|
1
1
|
from pydantic import BaseModel
|
2
|
+
from sqlmodel import Field, SQLModel
|
2
3
|
|
3
4
|
from prediction_market_agent_tooling.gtypes import ChecksumAddress
|
4
5
|
from prediction_market_agent_tooling.tools.datetime_utc import DatetimeUTC
|
6
|
+
from prediction_market_agent_tooling.tools.utils import utcnow
|
5
7
|
|
6
8
|
|
7
9
|
class MinimalisticToken(BaseModel):
|
@@ -14,3 +16,9 @@ class Order(BaseModel):
|
|
14
16
|
sellToken: str
|
15
17
|
buyToken: str
|
16
18
|
creationDate: DatetimeUTC
|
19
|
+
|
20
|
+
|
21
|
+
class RateLimit(SQLModel, table=True):
|
22
|
+
__tablename__ = "rate_limit"
|
23
|
+
id: str = Field(primary_key=True)
|
24
|
+
last_called_at: DatetimeUTC = Field(default_factory=utcnow)
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import time
|
2
|
+
from datetime import timedelta
|
3
|
+
from functools import wraps
|
4
|
+
from typing import Any, Callable, Optional, TypeVar, cast
|
5
|
+
|
6
|
+
from sqlalchemy.exc import OperationalError
|
7
|
+
from sqlmodel import Session, select
|
8
|
+
|
9
|
+
from prediction_market_agent_tooling.config import APIKeys
|
10
|
+
from prediction_market_agent_tooling.tools.cow.models import RateLimit
|
11
|
+
from prediction_market_agent_tooling.tools.datetime_utc import DatetimeUTC
|
12
|
+
from prediction_market_agent_tooling.tools.db.db_manager import DBManager
|
13
|
+
from prediction_market_agent_tooling.tools.utils import utcnow
|
14
|
+
|
15
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
16
|
+
|
17
|
+
FALLBACK_SQL_ENGINE = "sqlite:///rate_limit.db"
|
18
|
+
|
19
|
+
|
20
|
+
def postgres_rate_limited(
|
21
|
+
api_keys: APIKeys, rate_id: str = "default", interval_seconds: float = 1.0
|
22
|
+
) -> Callable[[F], F]:
|
23
|
+
"""rate_id is used to distinguish between different rate limits for different functions"""
|
24
|
+
limiter = RateLimiter(id=rate_id, interval_seconds=interval_seconds)
|
25
|
+
|
26
|
+
def decorator(func: F) -> F:
|
27
|
+
@wraps(func)
|
28
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
29
|
+
sqlalchemy_db_url = (
|
30
|
+
api_keys.sqlalchemy_db_url.get_secret_value()
|
31
|
+
if api_keys.SQLALCHEMY_DB_URL
|
32
|
+
else FALLBACK_SQL_ENGINE
|
33
|
+
)
|
34
|
+
|
35
|
+
db_manager = DBManager(sqlalchemy_db_url)
|
36
|
+
db_manager.create_tables([RateLimit])
|
37
|
+
|
38
|
+
with db_manager.get_session() as session:
|
39
|
+
limiter.enforce(session)
|
40
|
+
return func(*args, **kwargs)
|
41
|
+
|
42
|
+
return cast(F, wrapper)
|
43
|
+
|
44
|
+
return decorator
|
45
|
+
|
46
|
+
|
47
|
+
class RateLimiter:
|
48
|
+
def __init__(self, id: str, interval_seconds: float = 1.0) -> None:
|
49
|
+
self.id = id
|
50
|
+
self.interval = timedelta(seconds=interval_seconds)
|
51
|
+
|
52
|
+
def enforce(self, session: Session, timeout_seconds: float = 30.0) -> None:
|
53
|
+
"""
|
54
|
+
Enforces the rate limit inside a transaction.
|
55
|
+
Blocks until allowed or timeout is reached.
|
56
|
+
|
57
|
+
Args:
|
58
|
+
session: The database session to use
|
59
|
+
timeout_seconds: Maximum time in seconds to wait before giving up
|
60
|
+
|
61
|
+
Raises:
|
62
|
+
TimeoutError: If the rate limit cannot be acquired within the timeout period
|
63
|
+
"""
|
64
|
+
start_time = time.monotonic()
|
65
|
+
|
66
|
+
while True:
|
67
|
+
try:
|
68
|
+
with session.begin():
|
69
|
+
stmt = (
|
70
|
+
select(RateLimit)
|
71
|
+
.where(RateLimit.id == self.id)
|
72
|
+
.with_for_update()
|
73
|
+
)
|
74
|
+
result: Optional[RateLimit] = session.exec(stmt).first()
|
75
|
+
|
76
|
+
now = utcnow()
|
77
|
+
|
78
|
+
if result is None:
|
79
|
+
# First time this limiter is used
|
80
|
+
session.add(RateLimit(id=self.id))
|
81
|
+
return
|
82
|
+
|
83
|
+
last_called_aware = DatetimeUTC.from_datetime(result.last_called_at)
|
84
|
+
elapsed = now - last_called_aware
|
85
|
+
if elapsed >= self.interval:
|
86
|
+
result.last_called_at = now
|
87
|
+
session.add(result)
|
88
|
+
return
|
89
|
+
|
90
|
+
# Not enough time passed, sleep and retry
|
91
|
+
to_sleep = (self.interval - elapsed).total_seconds()
|
92
|
+
time.sleep(to_sleep)
|
93
|
+
except OperationalError:
|
94
|
+
# Backoff if DB is under contention
|
95
|
+
elapsed_time = time.monotonic() - start_time
|
96
|
+
if elapsed_time > timeout_seconds:
|
97
|
+
raise TimeoutError(
|
98
|
+
f"Could not acquire rate limit '{self.id}' "
|
99
|
+
f"after {elapsed_time:.1f} seconds due to database contention"
|
100
|
+
)
|
101
|
+
time.sleep(0.5)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: prediction-market-agent-tooling
|
3
|
-
Version: 0.66.
|
3
|
+
Version: 0.66.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
|
@@ -14,7 +14,7 @@ Provides-Extra: openai
|
|
14
14
|
Provides-Extra: optuna
|
15
15
|
Requires-Dist: autoflake (>=2.2.1,<3.0.0)
|
16
16
|
Requires-Dist: base58 (>=1.0.2,<2.0)
|
17
|
-
Requires-Dist: cowdao-cowpy
|
17
|
+
Requires-Dist: cowdao-cowpy (==1.0.0rc5)
|
18
18
|
Requires-Dist: cron-validator (>=1.0.8,<2.0.0)
|
19
19
|
Requires-Dist: eth-account (>=0.8.0,<0.12.0)
|
20
20
|
Requires-Dist: eth-keys (>=0.6.1,<0.7.0)
|
@@ -26,7 +26,7 @@ prediction_market_agent_tooling/benchmark/utils.py,sha256=xQd7p9H08-OtN3iC4QT2i9
|
|
26
26
|
prediction_market_agent_tooling/chains.py,sha256=1qQstoqXMwqwM7k-KH7MjMz8Ei-D83KZByvDbCZpAxs,116
|
27
27
|
prediction_market_agent_tooling/config.py,sha256=-kJfdDr-m0R-tGZ1KRI-hJJk0mXDt142CAlvwaJ2N2I,11778
|
28
28
|
prediction_market_agent_tooling/data_download/langfuse_data_downloader.py,sha256=VY23h324VKIVkevj1B1O-zL1eEp9AElmcfn6SwYDUSc,14246
|
29
|
-
prediction_market_agent_tooling/deploy/agent.py,sha256=
|
29
|
+
prediction_market_agent_tooling/deploy/agent.py,sha256=HLK5rf38PWgKydc_aIUck-wYzWQUnPdhto3Evoq82Lg,26282
|
30
30
|
prediction_market_agent_tooling/deploy/agent_example.py,sha256=yS1fWkHynr9MYGNOM2WsCnRWLPaffY4bOc6bIudrdd4,1377
|
31
31
|
prediction_market_agent_tooling/deploy/betting_strategy.py,sha256=YYayGjTKW02d3BUavJ8M3NmFk41oldEM3FHbwppZGRM,17184
|
32
32
|
prediction_market_agent_tooling/deploy/constants.py,sha256=Qe9cllgsGMkecfmbhXoFkPxuJyG6ATsrT87RF9SmPWM,249
|
@@ -44,7 +44,7 @@ prediction_market_agent_tooling/markets/agent_market.py,sha256=nMIa6BkoUWdiz12kF
|
|
44
44
|
prediction_market_agent_tooling/markets/base_subgraph_handler.py,sha256=7RaYO_4qAmQ6ZGM8oPK2-CkiJfKmV9MxM-rJlduaecU,1971
|
45
45
|
prediction_market_agent_tooling/markets/blockchain_utils.py,sha256=6REOt70v3vnzmtCbuRcUTdwt6htXy9nAfNkLOH3Bv1U,2987
|
46
46
|
prediction_market_agent_tooling/markets/categorize.py,sha256=orLZlPaHgeREU66m1amxfWikeV77idV4sZDPB8NgSD0,1300
|
47
|
-
prediction_market_agent_tooling/markets/data_models.py,sha256=
|
47
|
+
prediction_market_agent_tooling/markets/data_models.py,sha256=H3G-2I9QFhWrBY_KI-4BO2jMtb_f9yauzHz-zA4NI5Q,8016
|
48
48
|
prediction_market_agent_tooling/markets/manifold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
49
|
prediction_market_agent_tooling/markets/manifold/api.py,sha256=tWnjuqvU8pcCuja2B_ynHeds1iiEFc6QWHjeSO_GSxY,7676
|
50
50
|
prediction_market_agent_tooling/markets/manifold/data_models.py,sha256=3z1gFbPMEgCDGqeH-IK8wcvqmIHgLdZX8C2M1UQ7iDw,6740
|
@@ -53,13 +53,13 @@ prediction_market_agent_tooling/markets/manifold/utils.py,sha256=DCigEbpGWkXR-RZ
|
|
53
53
|
prediction_market_agent_tooling/markets/market_fees.py,sha256=YeK3ynjYIguB0xf6sO5iyg9lOdW_HD4C6nbJfiGyRCU,1351
|
54
54
|
prediction_market_agent_tooling/markets/markets.py,sha256=lIEPfPJD1Gz90pTvN2pZi51rpb969STPgQtNFCqHUJg,2667
|
55
55
|
prediction_market_agent_tooling/markets/metaculus/api.py,sha256=4TRPGytQQbSdf42DCg2M_JWYPAuNjqZ3eBqaQBLkNks,2736
|
56
|
-
prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=
|
56
|
+
prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=WjPt0MKeJNtoY-8oLQTLC8vQYYQ-dBj8UZoPq-UBYsQ,3288
|
57
57
|
prediction_market_agent_tooling/markets/metaculus/metaculus.py,sha256=S1Kkf_F3KuqFO938d5bun60wd8lsGvnGqxsW-tgEBgw,5110
|
58
58
|
prediction_market_agent_tooling/markets/omen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
-
prediction_market_agent_tooling/markets/omen/cow_contracts.py,sha256=
|
60
|
-
prediction_market_agent_tooling/markets/omen/data_models.py,sha256
|
59
|
+
prediction_market_agent_tooling/markets/omen/cow_contracts.py,sha256=sFaW82u_haL4nze8fjTmnQsOuV0OecunQlAhh1OAw0w,1091
|
60
|
+
prediction_market_agent_tooling/markets/omen/data_models.py,sha256=RsBYSbM4deA6Os4kQ3egH3HvwT80tQho6T1yyoATCMs,31103
|
61
61
|
prediction_market_agent_tooling/markets/omen/omen.py,sha256=hTHqS_-Z7jocrwuisqymYWLUUn8bK_WSRwaKPgXz1es,50477
|
62
|
-
prediction_market_agent_tooling/markets/omen/omen_constants.py,sha256=
|
62
|
+
prediction_market_agent_tooling/markets/omen/omen_constants.py,sha256=XtRk4vpxwUYkTndfjlcmghA-NOIneV8zdHFdyI7tHhM,487
|
63
63
|
prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=27-HRngTqfk_wgvttB3GeVHhy_O2YZcz9izo9OufOI0,29991
|
64
64
|
prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=D-ubf_LumHs_c5rBAAntQ8wGKprtO2V1JZeedmChNIE,11035
|
65
65
|
prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=h-YFRLY5rlhM9RqqceyfbHlno3elltN8Nr_Mnu1kJ90,40006
|
@@ -71,7 +71,7 @@ prediction_market_agent_tooling/markets/polymarket/utils.py,sha256=8kTeVjXPcXC6D
|
|
71
71
|
prediction_market_agent_tooling/markets/seer/data_models.py,sha256=osM9WaLsxQf-pfVGq0O-IkM93ehP9a7fVUf-hi2VlMs,5523
|
72
72
|
prediction_market_agent_tooling/markets/seer/exceptions.py,sha256=cEObdjluivD94tgOLzmimR7wgQEOt6SRakrYdhsRQtk,112
|
73
73
|
prediction_market_agent_tooling/markets/seer/price_manager.py,sha256=MClY2NGwOV70nZYIcmzXFy6Ogd8NBIq7telQcQ3VcU4,6243
|
74
|
-
prediction_market_agent_tooling/markets/seer/seer.py,sha256=
|
74
|
+
prediction_market_agent_tooling/markets/seer/seer.py,sha256=h1ntSoljQ3nKQj-orxVcR5YE8ijJU4D_iRNzwg8zp2k,24672
|
75
75
|
prediction_market_agent_tooling/markets/seer/seer_contracts.py,sha256=uMzpHpI6_tgfhWxPzupLdUJlZ1P2wr0rRiYjAGClKgU,4984
|
76
76
|
prediction_market_agent_tooling/markets/seer/seer_subgraph_handler.py,sha256=pJxch9_u0EdiIatQP1-UFClt8UEfMZAXBlk5wDO_ovk,9940
|
77
77
|
prediction_market_agent_tooling/markets/seer/subgraph_data_models.py,sha256=0izxS8Mtzonfdl9UqvFVXrdj0hVzieroekXhogfZKCw,1817
|
@@ -87,8 +87,9 @@ prediction_market_agent_tooling/tools/caches/inmemory_cache.py,sha256=ZW5iI5rmjq
|
|
87
87
|
prediction_market_agent_tooling/tools/caches/serializers.py,sha256=vFDx4fsPxclXp2q0sv27j4al_M_Tj9aR2JJP-xNHQXA,2151
|
88
88
|
prediction_market_agent_tooling/tools/contract.py,sha256=pdr9ZYmj4QVUfgVKdvOU6ucYdBpJGdha_FMR_LgtcEs,22912
|
89
89
|
prediction_market_agent_tooling/tools/costs.py,sha256=EaAJ7v9laD4VEV3d8B44M4u3_oEO_H16jRVCdoZ93Uw,954
|
90
|
-
prediction_market_agent_tooling/tools/cow/cow_order.py,sha256=
|
91
|
-
prediction_market_agent_tooling/tools/cow/models.py,sha256=
|
90
|
+
prediction_market_agent_tooling/tools/cow/cow_order.py,sha256=cKjyVbBblOkVjBbLyJ8w7qnzkxRhawtQYeNb4rymZwc,13272
|
91
|
+
prediction_market_agent_tooling/tools/cow/models.py,sha256=jAITIcg8GXEGtRQpezVvlqaQ5M8OEiiHqLwoyUeX3JM,655
|
92
|
+
prediction_market_agent_tooling/tools/cow/semaphore.py,sha256=IJGKRgvXnRSkEt_z1i5-eFIoVMcyhr7HK0JfIz1MXdQ,3738
|
92
93
|
prediction_market_agent_tooling/tools/custom_exceptions.py,sha256=Fh8z1fbwONvP4-j7AmV_PuEcoqb6-QXa9PJ9m7guMcM,93
|
93
94
|
prediction_market_agent_tooling/tools/datetime_utc.py,sha256=8_WackjtjC8zHXrhQFTGQ6e6Fz_6llWoKR4CSFvIv9I,2766
|
94
95
|
prediction_market_agent_tooling/tools/db/db_manager.py,sha256=GtzHH1NLl8HwqC8Z7s6eTlIQXuV0blxfaV2PeQrBnfQ,3013
|
@@ -124,8 +125,8 @@ prediction_market_agent_tooling/tools/tokens/usd.py,sha256=yuW8iPPtcpP4eLH2nORMD
|
|
124
125
|
prediction_market_agent_tooling/tools/transaction_cache.py,sha256=K5YKNL2_tR10Iw2TD9fuP-CTGpBbZtNdgbd0B_R7pjg,1814
|
125
126
|
prediction_market_agent_tooling/tools/utils.py,sha256=RlWSlzS2LavMIWrpwn1fevbzgPZruD4VcXTa-XxjWnE,7343
|
126
127
|
prediction_market_agent_tooling/tools/web3_utils.py,sha256=0r26snqCXGdLKCWA8jpe7DV8x2NPYWZwOy4oyKyDCYk,12615
|
127
|
-
prediction_market_agent_tooling-0.66.
|
128
|
-
prediction_market_agent_tooling-0.66.
|
129
|
-
prediction_market_agent_tooling-0.66.
|
130
|
-
prediction_market_agent_tooling-0.66.
|
131
|
-
prediction_market_agent_tooling-0.66.
|
128
|
+
prediction_market_agent_tooling-0.66.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
|
129
|
+
prediction_market_agent_tooling-0.66.1.dist-info/METADATA,sha256=N_rlOf-Rwg-XY743zHGYmSOUJIxMNUeg2_1Jga3hsSY,8726
|
130
|
+
prediction_market_agent_tooling-0.66.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
131
|
+
prediction_market_agent_tooling-0.66.1.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
|
132
|
+
prediction_market_agent_tooling-0.66.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|